Merge "Fix documentation lies about debug toolbar / cache interaction"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 17 Mar 2016 10:04:59 +0000 (10:04 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 17 Mar 2016 10:04:59 +0000 (10:04 +0000)
433 files changed:
RELEASE-NOTES-1.27
composer.json
includes/Block.php
includes/DefaultSettings.php
includes/GitInfo.php
includes/HttpFunctions.php
includes/OutputPage.php
includes/Status.php
includes/StubObject.php
includes/WatchedItem.php
includes/WatchedItemStore.php
includes/actions/Action.php
includes/actions/InfoAction.php
includes/api/ApiBase.php
includes/api/ApiPurge.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryUserInfo.php
includes/api/i18n/ar.json
includes/api/i18n/ba.json
includes/api/i18n/bn.json
includes/api/i18n/cs.json
includes/api/i18n/el.json
includes/api/i18n/fa.json
includes/api/i18n/ja.json
includes/api/i18n/ksh.json
includes/api/i18n/nap.json
includes/api/i18n/vi.json
includes/cache/MessageCache.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/OldChangesList.php
includes/changetags/ChangeTagsLogItem.php
includes/content/ContentHandler.php
includes/content/TextContentHandler.php
includes/diff/DairikiDiff.php
includes/diff/DifferenceEngine.php
includes/filerepo/FileRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/htmlform/HTMLAutoCompleteSelectField.php
includes/htmlform/HTMLButtonField.php
includes/htmlform/HTMLCheckField.php
includes/htmlform/HTMLCheckMatrix.php
includes/htmlform/HTMLComboboxField.php
includes/htmlform/HTMLFormField.php
includes/htmlform/HTMLFormFieldWithButton.php
includes/htmlform/HTMLMultiSelectField.php
includes/htmlform/HTMLRadioField.php
includes/htmlform/HTMLSelectField.php
includes/htmlform/HTMLTextAreaField.php
includes/htmlform/HTMLTextField.php
includes/installer/DatabaseUpdater.php
includes/installer/MssqlUpdater.php
includes/installer/MysqlUpdater.php
includes/installer/OracleUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/i18n/ar.json
includes/installer/i18n/ba.json
includes/installer/i18n/bn.json
includes/installer/i18n/cs.json
includes/installer/i18n/de.json
includes/installer/i18n/fi.json
includes/installer/i18n/fr.json
includes/installer/i18n/gl.json
includes/installer/i18n/ia.json
includes/installer/i18n/is.json
includes/installer/i18n/it.json
includes/installer/i18n/jbo.json [new file with mode: 0644]
includes/installer/i18n/ka.json
includes/installer/i18n/ksh.json
includes/installer/i18n/mg.json
includes/installer/i18n/pl.json
includes/installer/i18n/pt.json
includes/installer/i18n/ru.json
includes/installer/i18n/sl.json
includes/installer/i18n/tt-cyrl.json
includes/installer/i18n/uk.json
includes/installer/i18n/yi.json
includes/installer/i18n/zh-hans.json
includes/jobqueue/Job.php
includes/jobqueue/utils/BacklinkJobUtils.php
includes/media/XCF.php
includes/registration/ExtensionProcessor.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/revisiondelete/RevDelLogItem.php
includes/search/SearchEngine.php
includes/session/SessionManager.php
includes/skins/SkinTemplate.php
includes/specials/SpecialBotPasswords.php
includes/specials/SpecialChangeContentModel.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWatchlist.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
includes/upload/UploadBase.php
includes/upload/UploadFromChunks.php
includes/user/User.php
languages/Language.php
languages/LanguageConverter.php
languages/data/ZhConversion.php
languages/i18n/ace.json
languages/i18n/ady-cyrl.json
languages/i18n/af.json
languages/i18n/anp.json
languages/i18n/ar.json
languages/i18n/arc.json
languages/i18n/arq.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/awa.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/bcc.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bho.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/cdo.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/dty.json
languages/i18n/egl.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/frc.json
languages/i18n/frp.json
languages/i18n/frr.json
languages/i18n/fur.json
languages/i18n/fy.json
languages/i18n/ga.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/gom-deva.json
languages/i18n/gom-latn.json
languages/i18n/grc.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hsb.json
languages/i18n/ht.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/ilo.json
languages/i18n/inh.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/jam.json
languages/i18n/jut.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kab.json
languages/i18n/khw.json
languages/i18n/kk-cyrl.json
languages/i18n/km.json
languages/i18n/kn.json
languages/i18n/ko.json
languages/i18n/krc.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/kw.json
languages/i18n/la.json
languages/i18n/lb.json
languages/i18n/lij.json
languages/i18n/lki.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/luz.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/mai.json
languages/i18n/mg.json
languages/i18n/mhr.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mn.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/my.json
languages/i18n/mzn.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/oc.json
languages/i18n/olo.json
languages/i18n/or.json
languages/i18n/os.json
languages/i18n/pa.json
languages/i18n/pfl.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/rm.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/sc.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sd.json
languages/i18n/ses.json
languages/i18n/sgs.json
languages/i18n/sh.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/so.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/sw.json
languages/i18n/szl.json
languages/i18n/ta.json
languages/i18n/tcy.json
languages/i18n/te.json
languages/i18n/th.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/tt-latn.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/uz.json
languages/i18n/vec.json
languages/i18n/vi.json
languages/i18n/vro.json
languages/i18n/war.json
languages/i18n/wo.json
languages/i18n/wuu.json
languages/i18n/xal.json
languages/i18n/xmf.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesBs.php
load.php
maintenance/Maintenance.php
maintenance/archives/patch-watchlist-wl_id.sql [new file with mode: 0644]
maintenance/benchmarks/bench_utf8_title_check.php
maintenance/dumpBackup.php
maintenance/language/zhtable/Makefile.py
maintenance/language/zhtable/toCN.manual
maintenance/language/zhtable/toHK.manual
maintenance/language/zhtable/toTW.manual
maintenance/language/zhtable/toTrad.manual
maintenance/language/zhtable/trad2simp.manual
maintenance/language/zhtable/tradphrases.manual
maintenance/language/zhtable/tradphrases_exclude.manual
maintenance/mergeMessageFileList.php
maintenance/mssql/archives/patch-watchlist-wl_id.sql [new file with mode: 0644]
maintenance/mssql/tables.sql
maintenance/oracle/archives/patch-watchlist-wl_id.sql [new file with mode: 0644]
maintenance/oracle/tables.sql
maintenance/postgres/tables.sql
maintenance/sqlite/archives/patch-watchlist-wl_id.sql [new file with mode: 0644]
maintenance/tables.sql
package.json
phpcs.xml
resources/Resources.php
resources/lib/oojs-ui/i18n/mn.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/sah.json
resources/lib/oojs-ui/i18n/ug-arab.json
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-core-apex.css
resources/lib/oojs-ui/oojs-ui-core-mediawiki.css
resources/lib/oojs-ui/oojs-ui-core.js
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-toolbars-apex.css
resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css
resources/lib/oojs-ui/oojs-ui-toolbars.js
resources/lib/oojs-ui/oojs-ui-widgets-apex.css
resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css
resources/lib/oojs-ui/oojs-ui-widgets.js
resources/lib/oojs-ui/oojs-ui-windows-apex.css
resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css
resources/lib/oojs-ui/oojs-ui-windows.js
resources/lib/oojs-ui/themes/apex/icons-editing-advanced.json
resources/lib/oojs-ui/themes/apex/icons-editing-core.json
resources/lib/oojs-ui/themes/apex/icons-editing-styling.json
resources/lib/oojs-ui/themes/apex/images/icons/markup.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/markup.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/icons-editing-advanced.json
resources/lib/oojs-ui/themes/mediawiki/icons-editing-core.json
resources/lib/oojs-ui/themes/mediawiki/icons-editing-styling.json
resources/lib/oojs-ui/themes/mediawiki/icons-layout.json
resources/lib/oojs-ui/themes/mediawiki/icons-moderation.json
resources/lib/oojs-ui/themes/mediawiki/icons.json
resources/lib/oojs-ui/themes/mediawiki/images/icons/add-constructive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/add-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/add-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/add-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive-deprecated.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive-deprecated.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive-deprecated.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive-deprecated.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/markup-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/markup-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/markup.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/markup.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/star-constructive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/star-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/star-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/star-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-constructive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unStar-constructive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/unStar-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/unStar-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unStar-progressive.svg [new file with mode: 0644]
resources/lib/qunitjs/qunit.css
resources/lib/qunitjs/qunit.js
resources/lib/sinonjs/sinon-1.15.4.js [deleted file]
resources/lib/sinonjs/sinon-1.17.3.js [new file with mode: 0644]
resources/lib/sinonjs/sinon-ie-1.15.4.js [deleted file]
resources/src/jquery/jquery.tablesorter.js
resources/src/mediawiki.action/mediawiki.action.view.postEdit.js
resources/src/mediawiki.less/mediawiki.ui/mixins.less
resources/src/mediawiki.special/mediawiki.special.userlogin.common.css
resources/src/mediawiki.special/mediawiki.special.userlogin.login.css
resources/src/mediawiki.ui/components/buttons.less
resources/src/mediawiki/api/parse.js
resources/src/mediawiki/mediawiki.inspect.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.viewport.js
tests/phpunit/MediaWikiLangTestCase.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/ExportTest.php
tests/phpunit/includes/ExtraParserTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/MWTimestampTest.php
tests/phpunit/includes/MergeHistoryTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/PrefixSearchTest.php
tests/phpunit/includes/RevisionStorageTest.php
tests/phpunit/includes/StatusTest.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/WatchedItemStoreIntegrationTest.php
tests/phpunit/includes/WatchedItemStoreUnitTest.php
tests/phpunit/includes/WatchedItemUnitTest.php
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/query/ApiQueryBasicTest.php
tests/phpunit/includes/api/query/ApiQueryContinue2Test.php
tests/phpunit/includes/api/query/ApiQueryContinueTest.php
tests/phpunit/includes/cache/GenderCacheTest.php
tests/phpunit/includes/cache/LocalisationCacheTest.php
tests/phpunit/includes/cache/MessageCacheTest.php
tests/phpunit/includes/changes/CategoryMembershipChangeTest.php
tests/phpunit/includes/changes/OldChangesListTest.php
tests/phpunit/includes/changes/TestRecentChangesHelper.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/deferred/LinksUpdateTest.php
tests/phpunit/includes/exception/MWExceptionTest.php
tests/phpunit/includes/jobqueue/JobTest.php
tests/phpunit/includes/jobqueue/jobs/CategoryMembershipChangeJobTest.php
tests/phpunit/includes/page/ArticleTablesTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/search/SearchEnginePrefixTest.php
tests/phpunit/includes/search/SearchEngineTest.php
tests/phpunit/includes/session/BotPasswordSessionProviderTest.php
tests/phpunit/includes/specials/SpecialMyLanguageTest.php
tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
tests/phpunit/phpunit.php
tests/phpunit/structure/ExtensionJsonValidationTest.php [new file with mode: 0644]
tests/phpunit/suites/ExtensionsTestSuite.php
tests/qunit/QUnitTestResources.php
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/mediawiki.viewport.test.js

index df695bd..45b06e9 100644 (file)
@@ -98,6 +98,9 @@ HHVM 3.1.
 * $wgEnotifUseJobQ was removed and the job queue is always used.
 * The functionality of the ApiSandbox extension has been merged into core. The
   extension should no longer be used.
+* $wgPreloadJavaScriptMwUtil was removed (deprecated in 1.26).
+  Extensions, skins, gadgets and scripts that use the mediawiki.util module must
+  express a dependency on it.
 
 === New features in 1.27 ===
 * $wgDataCenterUpdateStickTTL was also added. This decides how long a user
@@ -172,7 +175,8 @@ HHVM 3.1.
 ==== Upgraded external libraries ====
 * Updated oojs/oojs-ui from v0.12.12 to v0.13.3.
 * Updated composer/semver from v1.0.0 to v1.2.0.
-* Update liuggio/statsd-php-client to 1.0.18.
+* Updated liuggio/statsd-php-client to 1.0.18.
+* Updated QUnit from v1.18.0 to v1.22.0.
 
 ==== New external libraries ====
 * Added wikimedia/base-convert v1.0.1.
@@ -213,6 +217,16 @@ HHVM 3.1.
 ** ApiFormatDbg
 ** ApiFormatTxt
 ** ApiFormatYaml
+* ApiBase::addTokenProperties() was removed (deprecated since 1.24).
+* ApiBase::getFinalPossibleErrors() was removed (deprecated since 1.24).
+* ApiBase::getFinalResultProperties() was removed (deprecated since 1.24).
+* ApiBase::getRequireAtLeastOneParameterErrorMessages() was removed (deprecated since 1.24).
+* ApiBase::getPossibleErrors() was removed (deprecated since 1.24).
+* ApiBase::getRequireMaxOneParameterErrorMessages() was removed (deprecated since 1.24).
+* ApiBase::getRequireOnlyOneParameterErrorMessages() was removed (deprecated since 1.24).
+* ApiBase::getResultProperties() was removed (deprecated since 1.24).
+* ApiBase::getTitleOrPageIdErrorMessage() was removed (deprecated since 1.24).
+* ApiBase::parseErrors() was removed (deprecated since 1.24).
 * ApiQueryBase::titleToKey(), ApiQueryBase::keyToTitle() and
   ApiQueryBase::keyPartToTitle() all removed (deprecated since 1.24).
 * ApiQueryBase::checkRowCount() was removed (deprecated since 1.24).
@@ -223,7 +237,15 @@ HHVM 3.1.
 * ApiQuery::setGeneratorContinue() was removed (deprecated since 1.24).
 * ApiMain::getModules() was removed (deprecated since 1.21).
 * ApiBase::getVersion() was removed (deprecated since 1.21).
+* Language::getLangObj() was removed (deprecated since 1.24).
+* Language::getLanguageName() was removed (deprecated since 1.20).
 * Language::getLanguageNames() was removed (deprecated since 1.20).
+* Language::getTranslatedLanguageNames() was removed (deprecated since 1.20).
+* Language::specialPage() was removed (deprecated since 1.24).
+* OutputPage::getHeadItems() was removed (deprecated since 1.24).
+* OutputPage::getScript() was removed (deprecated since 1.24).
+* OutputPage::out() was removed (deprecated since 1.22).
+* OutputPage::setAllowedModules() was removed (deprecated since 1.24).
 
 === Languages updated in 1.27 ===
 
@@ -340,6 +362,9 @@ changes to languages because of Phabricator reports.
 ** WatchedItem::duplicateEntries was deprecated.
 ** EmailNotification::updateWatchlistTimestamp was deprecated.
 ** User::getWatchedItem was removed.
+* Unit tests don't work with external PHPUnit anymore, Composer is now the only supported
+  way. Run `composer install` to install it and other dev dependencies to run unit tests.
+* wl_id field added to the watchlist table.
 
 == Compatibility ==
 
index a545bb1..0dc1511 100644 (file)
@@ -21,7 +21,7 @@
                "ext-iconv": "*",
                "liuggio/statsd-php-client": "1.0.18",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.16.1",
+               "oojs/oojs-ui": "0.16.3",
                "oyejorge/less.php": "1.7.0.10",
                "php": ">=5.5.9",
                "psr/log": "1.0.0",
@@ -29,7 +29,7 @@
                "wikimedia/base-convert": "1.0.1",
                "wikimedia/cdb": "1.3.0",
                "wikimedia/cldr-plural-rule-parser": "1.0.0",
-               "wikimedia/composer-merge-plugin": "1.3.0",
+               "wikimedia/composer-merge-plugin": "1.3.1",
                "wikimedia/ip-set": "1.0.1",
                "wikimedia/php-session-serializer": "1.0.3",
                "wikimedia/relpath": "1.0.3",
index 764592d..b8e900d 100644 (file)
@@ -844,7 +844,7 @@ class Block {
                                        'ipb_expiry' => $dbw->timestamp( $this->mExpiry ),
                                ],
                                [ /* WHERE */
-                                       'ipb_address' => (string)$this->getTarget()
+                                       'ipb_id' => $this->getId(),
                                ],
                                __METHOD__
                        );
index c208f08..c09f2af 100644 (file)
@@ -3574,24 +3574,6 @@ $wgResourceLoaderMinifierMaxLineLength = 1000;
  */
 $wgIncludeLegacyJavaScript = true;
 
-/**
- * Whether to ensure the mediawiki.util is loaded before other modules.
- *
- * Before MediaWiki 1.19, modules used to load less asynchronous which allowed
- * modules to lack dependencies on 'popular' modules that were likely loaded already.
- *
- * This setting is to aid scripts during migration by providing mediawiki.util
- * unconditionally (which was the most commonly missed dependency). It doesn't
- * cover all missing dependencies obviously but should fix most of them.
- *
- * This should be removed at some point after site/user scripts have been fixed.
- * Enable this if your wiki has a large amount of user/site scripts that are
- * lacking dependencies.
- *
- * @deprecated since 1.26: Always declare dependencies.
- */
-$wgPreloadJavaScriptMwUtil = false;
-
 /**
  * Whether or not to assign configuration variables to the global window object.
  *
index 14f3cc1..29516ab 100644 (file)
@@ -43,7 +43,7 @@ class GitInfo {
        /**
         * Cached git information.
         */
-       protected $cache = array();
+       protected $cache = [];
 
        /**
         * Map of repo URLs to viewer URLs. Access via static method getViewers().
@@ -215,7 +215,7 @@ class GitInfo {
                                is_executable( $wgGitBin ) &&
                                $this->getHead() !== false
                        ) {
-                               $environment = array( "GIT_DIR" => $this->basedir );
+                               $environment = [ "GIT_DIR" => $this->basedir ];
                                $cmd = wfEscapeShellArg( $wgGitBin ) .
                                        " show -s --format=format:%ct HEAD";
                                $retc = false;
@@ -265,11 +265,11 @@ class GitInfo {
                        if ( preg_match( $pattern, $url, $matches ) ) {
                                $viewerUrl = preg_replace( $pattern, $viewer, $url );
                                $headSHA1 = $this->getHeadSHA1();
-                               $replacements = array(
+                               $replacements = [
                                        '%h' => substr( $headSHA1, 0, 7 ),
                                        '%H' => $headSHA1,
                                        '%r' => urlencode( $matches[1] ),
-                               );
+                               ];
                                return strtr( $viewerUrl, $replacements );
                        }
                }
@@ -396,7 +396,7 @@ class GitInfo {
 
                if ( self::$viewers === false ) {
                        self::$viewers = $wgGitRepositoryViewers;
-                       Hooks::run( 'GitViewers', array( &self::$viewers ) );
+                       Hooks::run( 'GitViewers', [ &self::$viewers ] );
                }
 
                return self::$viewers;
index 600bd79..f980a93 100644 (file)
@@ -80,7 +80,7 @@ class Http {
                } else {
                        $errors = $status->getErrorsByType( 'error' );
                        $logger = LoggerFactory::getInstance( 'http' );
-                       $logger->warning( $status->getWikiText(),
+                       $logger->warning( $status->getWikiText( null, null, 'en' ),
                                [ 'error' => $errors, 'caller' => $caller, 'content' => $req->getContent() ] );
                        return false;
                }
index 11c23f0..6774072 100644 (file)
@@ -519,17 +519,6 @@ class OutputPage extends ContextSource {
                $this->mScripts .= Html::inlineScript( "\n$script\n" ) . "\n";
        }
 
-       /**
-        * Get all registered JS and CSS tags for the header.
-        *
-        * @return string
-        * @deprecated since 1.24 Use OutputPage::headElement to build the full header.
-        */
-       function getScript() {
-               wfDeprecated( __METHOD__, '1.24' );
-               return $this->mScripts . $this->getHeadItems();
-       }
-
        /**
         * Filter an array of modules to remove insufficiently trustworthy members, and modules
         * which are no longer registered (eg a page is cached before an extension is disabled)
@@ -678,22 +667,6 @@ class OutputPage extends ContextSource {
                return $this->mHeadItems;
        }
 
-       /**
-        * Get all header items in a string
-        *
-        * @return string
-        * @deprecated since 1.24 Use OutputPage::headElement or
-        *   if absolutely necessary use OutputPage::getHeadItemsArray
-        */
-       function getHeadItems() {
-               wfDeprecated( __METHOD__, '1.24' );
-               $s = '';
-               foreach ( $this->mHeadItems as $item ) {
-                       $s .= $item;
-               }
-               return $s;
-       }
-
        /**
         * Add or replace an header item to the output
         *
@@ -1495,19 +1468,6 @@ class OutputPage extends ContextSource {
                }
        }
 
-       /**
-        * Set the highest level of CSS/JS untrustworthiness allowed
-        *
-        * @deprecated since 1.24 Raising level of allowed untrusted content is no longer supported.
-        *  Use reduceAllowedModules() instead
-        * @param string $type ResourceLoaderModule TYPE_ constant
-        * @param int $level ResourceLoaderModule class constant
-        */
-       public function setAllowedModules( $type, $level ) {
-               wfDeprecated( __METHOD__, '1.24' );
-               $this->reduceAllowedModules( $type, $level );
-       }
-
        /**
         * Limit the highest level of CSS/JS untrustworthiness allowed.
         *
@@ -2367,17 +2327,6 @@ class OutputPage extends ContextSource {
 
        }
 
-       /**
-        * Actually output something with print.
-        *
-        * @param string $ins The string to output
-        * @deprecated since 1.22 Use echo yourself.
-        */
-       public function out( $ins ) {
-               wfDeprecated( __METHOD__, '1.22' );
-               print $ins;
-       }
-
        /**
         * Prepare this object to display an error page; disable caching and
         * indexing, clear the current text and redirect, set the page's title
@@ -3218,7 +3167,7 @@ class OutputPage extends ContextSource {
                        $articleId = $wikiPage->getId();
                }
 
-               $lang = $title->getPageLanguage();
+               $lang = $title->getPageViewLanguage();
 
                // Pre-process information
                $separatorTransTable = $lang->separatorTransformTable();
index 75fe190..cc7abc8 100644 (file)
@@ -178,15 +178,36 @@ class Status {
                return $cleanParams;
        }
 
+       /**
+        * @param string|Language|null $lang Language to use for processing
+        *  messages, or null to default to the user language.
+        * @return Language
+        */
+       protected function languageFromParam( $lang ) {
+               global $wgLang;
+
+               if ( $lang === null ) {
+                       // @todo: Use RequestContext::getMain()->getLanguage() instead
+                       return $wgLang;
+               } elseif ( $lang instanceof Language || $lang instanceof StubUserLang ) {
+                       return $lang;
+               } else {
+                       return Language::factory( $lang );
+               }
+       }
+
        /**
         * Get the error list as a wikitext formatted list
         *
         * @param string|bool $shortContext A short enclosing context message name, to
         *        be used when there is a single error
         * @param string|bool $longContext A long enclosing context message name, for a list
+        * @param string|Language $lang Language to use for processing messages
         * @return string
         */
-       public function getWikiText( $shortContext = false, $longContext = false ) {
+       public function getWikiText( $shortContext = false, $longContext = false, $lang = null ) {
+               $lang = $this->languageFromParam( $lang );
+
                $rawErrors = $this->sv->getErrors();
                if ( count( $rawErrors ) == 0 ) {
                        if ( $this->sv->isOK() ) {
@@ -199,22 +220,22 @@ class Status {
                        $rawErrors = $this->sv->getErrors(); // just added a fatal
                }
                if ( count( $rawErrors ) == 1 ) {
-                       $s = $this->getErrorMessage( $rawErrors[0] )->plain();
+                       $s = $this->getErrorMessage( $rawErrors[0], $lang )->plain();
                        if ( $shortContext ) {
-                               $s = wfMessage( $shortContext, $s )->plain();
+                               $s = wfMessage( $shortContext, $s )->inLanguage( $lang )->plain();
                        } elseif ( $longContext ) {
-                               $s = wfMessage( $longContext, "* $s\n" )->plain();
+                               $s = wfMessage( $longContext, "* $s\n" )->inLanguage( $lang )->plain();
                        }
                } else {
-                       $errors = $this->getErrorMessageArray( $rawErrors );
+                       $errors = $this->getErrorMessageArray( $rawErrors, $lang );
                        foreach ( $errors as &$error ) {
                                $error = $error->plain();
                        }
                        $s = '* ' . implode( "\n* ", $errors ) . "\n";
                        if ( $longContext ) {
-                               $s = wfMessage( $longContext, $s )->plain();
+                               $s = wfMessage( $longContext, $s )->inLanguage( $lang )->plain();
                        } elseif ( $shortContext ) {
-                               $s = wfMessage( $shortContext, "\n$s\n" )->plain();
+                               $s = wfMessage( $shortContext, "\n$s\n" )->inLanguage( $lang )->plain();
                        }
                }
                return $s;
@@ -227,10 +248,12 @@ class Status {
         * message names), to be used when there is a single error.
         * @param string|string[] $longContext A long enclosing context message name (or an array of
         * message names), for a list.
-        *
+        * @param string|Language $lang Language to use for processing messages
         * @return Message
         */
-       public function getMessage( $shortContext = false, $longContext = false ) {
+       public function getMessage( $shortContext = false, $longContext = false, $lang = null ) {
+               $lang = $this->languageFromParam( $lang );
+
                $rawErrors = $this->sv->getErrors();
                if ( count( $rawErrors ) == 0 ) {
                        if ( $this->sv->isOK() ) {
@@ -243,16 +266,16 @@ class Status {
                        $rawErrors = $this->sv->getErrors(); // just added a fatal
                }
                if ( count( $rawErrors ) == 1 ) {
-                       $s = $this->getErrorMessage( $rawErrors[0] );
+                       $s = $this->getErrorMessage( $rawErrors[0], $lang );
                        if ( $shortContext ) {
-                               $s = wfMessage( $shortContext, $s );
+                               $s = wfMessage( $shortContext, $s )->inLanguage( $lang );
                        } elseif ( $longContext ) {
                                $wrapper = new RawMessage( "* \$1\n" );
                                $wrapper->params( $s )->parse();
-                               $s = wfMessage( $longContext, $wrapper );
+                               $s = wfMessage( $longContext, $wrapper )->inLanguage( $lang );
                        }
                } else {
-                       $msgs = $this->getErrorMessageArray( $rawErrors );
+                       $msgs = $this->getErrorMessageArray( $rawErrors, $lang );
                        $msgCount = count( $msgs );
 
                        if ( $shortContext ) {
@@ -263,11 +286,11 @@ class Status {
                        $s->params( $msgs )->parse();
 
                        if ( $longContext ) {
-                               $s = wfMessage( $longContext, $s );
+                               $s = wfMessage( $longContext, $s )->inLanguage( $lang );
                        } elseif ( $shortContext ) {
                                $wrapper = new RawMessage( "\n\$1\n", [ $s ] );
                                $wrapper->parse();
-                               $s = wfMessage( $shortContext, $wrapper );
+                               $s = wfMessage( $shortContext, $wrapper )->inLanguage( $lang );
                        }
                }
 
@@ -280,10 +303,10 @@ class Status {
         * 'message' and 'params', use those keys-value pairs.
         * Otherwise, if its an array, just use the first value as the
         * message and the remaining items as the params.
-        *
+        * @param string|Language $lang Language to use for processing messages
         * @return Message
         */
-       protected function getErrorMessage( $error ) {
+       protected function getErrorMessage( $error, $lang = null ) {
                if ( is_array( $error ) ) {
                        if ( isset( $error['message'] ) && $error['message'] instanceof Message ) {
                                $msg = $error['message'];
@@ -298,6 +321,8 @@ class Status {
                } else {
                        $msg = wfMessage( $error );
                }
+
+               $msg->inLanguage( $this->languageFromParam( $lang ) );
                return $msg;
        }
 
@@ -307,21 +332,27 @@ class Status {
         * @param string $shortContext A short enclosing context message name, to
         *        be used when there is a single error
         * @param string $longContext A long enclosing context message name, for a list
+        * @param string|Language $lang Language to use for processing messages
         * @return string
         */
-       public function getHTML( $shortContext = false, $longContext = false ) {
-               $text = $this->getWikiText( $shortContext, $longContext );
-               $out = MessageCache::singleton()->parse( $text, null, true, true );
+       public function getHTML( $shortContext = false, $longContext = false, $lang = null ) {
+               $lang = $this->languageFromParam( $lang );
+               $text = $this->getWikiText( $shortContext, $longContext, $lang );
+               $out = MessageCache::singleton()->parse( $text, null, true, true, $lang );
                return $out instanceof ParserOutput ? $out->getText() : $out;
        }
 
        /**
         * Return an array with a Message object for each error.
         * @param array $errors
+        * @param string|Language $lang Language to use for processing messages
         * @return Message[]
         */
-       protected function getErrorMessageArray( $errors ) {
-               return array_map( [ $this, 'getErrorMessage' ], $errors );
+       protected function getErrorMessageArray( $errors, $lang = null ) {
+               $lang = $this->languageFromParam( $lang );
+               return array_map( function ( $e ) use ( $lang ) {
+                       return $this->getErrorMessage( $e, $lang );
+               }, $errors );
        }
 
        /**
index 4abc283..211afda 100644 (file)
@@ -165,9 +165,7 @@ class StubObject {
 }
 
 /**
- * Stub object for the user language. It depends of the user preferences and
- * "uselang" parameter that can be passed to index.php. This object have to be
- * in $wgLang global.
+ * Stub object for the user language. Assigned to the $wgLang global.
  */
 class StubUserLang extends StubObject {
 
@@ -175,10 +173,6 @@ class StubUserLang extends StubObject {
                parent::__construct( 'wgLang' );
        }
 
-       public function __call( $name, $args ) {
-               return $this->_call( $name, $args );
-       }
-
        /**
         * Call Language::findVariantLink after unstubbing $wgLang.
         *
index f2633d9..5b4a4fc 100644 (file)
@@ -18,7 +18,6 @@
  * @file
  * @ingroup Watchlist
  */
-use Wikimedia\Assert\Assert;
 
 /**
  * Representation of a pair of user and title for watchlist entries.
index 1aed8e0..b3a06e2 100644 (file)
@@ -18,10 +18,18 @@ class WatchedItemStore {
        private $loadBalancer;
 
        /**
-        * @var BagOStuff
+        * @var HashBagOStuff
         */
        private $cache;
 
+       /**
+        * @var array[] Looks like $cacheIndex[Namespace ID][Target DB Key][User Id] => 'key'
+        * The index is needed so that on mass changes all relevant items can be un-cached.
+        * For example: Clearing a users watchlist of all items or updating notification timestamps
+        *              for all users watching a single target.
+        */
+       private $cacheIndex = [];
+
        /**
         * @var callable|null
         */
@@ -37,7 +45,14 @@ class WatchedItemStore {
         */
        private static $instance;
 
-       public function __construct( LoadBalancer $loadBalancer, BagOStuff $cache ) {
+       /**
+        * @param LoadBalancer $loadBalancer
+        * @param HashBagOStuff $cache
+        */
+       public function __construct(
+               LoadBalancer $loadBalancer,
+               HashBagOStuff $cache
+       ) {
                $this->loadBalancer = $loadBalancer;
                $this->cache = $cache;
                $this->deferredUpdatesAddCallableUpdateCallback = [ 'DeferredUpdates', 'addCallableUpdate' ];
@@ -49,8 +64,10 @@ class WatchedItemStore {
         * This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
         *
         * @param callable $callback
+        *
         * @see DeferredUpdates::addCallableUpdate for callback signiture
         *
+        * @return ScopedCallback to reset the overridden value
         * @throws MWException
         */
        public function overrideDeferredUpdatesAddCallableUpdateCallback( $callback ) {
@@ -60,7 +77,12 @@ class WatchedItemStore {
                        );
                }
                Assert::parameterType( 'callable', $callback, '$callback' );
+
+               $previousValue = $this->deferredUpdatesAddCallableUpdateCallback;
                $this->deferredUpdatesAddCallableUpdateCallback = $callback;
+               return new ScopedCallback( function() use ( $previousValue ) {
+                       $this->deferredUpdatesAddCallableUpdateCallback = $previousValue;
+               } );
        }
 
        /**
@@ -70,6 +92,7 @@ class WatchedItemStore {
         * @param callable $callback
         * @see Revision::getTimestampFromId for callback signiture
         *
+        * @return ScopedCallback to reset the overridden value
         * @throws MWException
         */
        public function overrideRevisionGetTimestampFromIdCallback( $callback ) {
@@ -79,24 +102,38 @@ class WatchedItemStore {
                        );
                }
                Assert::parameterType( 'callable', $callback, '$callback' );
+
+               $previousValue = $this->revisionGetTimestampFromIdCallback;
                $this->revisionGetTimestampFromIdCallback = $callback;
+               return new ScopedCallback( function() use ( $previousValue ) {
+                       $this->revisionGetTimestampFromIdCallback = $previousValue;
+               } );
        }
 
        /**
         * Overrides the default instance of this class
         * This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
         *
-        * @param WatchedItemStore $store
+        * If this method is used it MUST also be called with null after a test to ensure a new
+        * default instance is created next time getDefaultInstance is called.
         *
+        * @param WatchedItemStore|null $store
+        *
+        * @return ScopedCallback to reset the overridden value
         * @throws MWException
         */
-       public static function overrideDefaultInstance( WatchedItemStore $store ) {
+       public static function overrideDefaultInstance( WatchedItemStore $store = null ) {
                if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
                        throw new MWException(
                                'Cannot override ' . __CLASS__ . 'default instance in operation.'
                        );
                }
+
+               $previousValue = self::$instance;
                self::$instance = $store;
+               return new ScopedCallback( function() use ( $previousValue ) {
+                       self::$instance = $previousValue;
+               } );
        }
 
        /**
@@ -121,14 +158,25 @@ class WatchedItemStore {
        }
 
        private function cache( WatchedItem $item ) {
-               $this->cache->set(
-                       $this->getCacheKey( $item->getUser(), $item->getLinkTarget() ),
-                       $item
-               );
+               $user = $item->getUser();
+               $target = $item->getLinkTarget();
+               $key = $this->getCacheKey( $user, $target );
+               $this->cache->set( $key, $item );
+               $this->cacheIndex[$target->getNamespace()][$target->getDBkey()][$user->getId()] = $key;
        }
 
        private function uncache( User $user, LinkTarget $target ) {
                $this->cache->delete( $this->getCacheKey( $user, $target ) );
+               unset( $this->cacheIndex[$target->getNamespace()][$target->getDBkey()][$user->getId()] );
+       }
+
+       private function uncacheLinkTarget( LinkTarget $target ) {
+               if ( !isset( $this->cacheIndex[$target->getNamespace()][$target->getDBkey()] ) ) {
+                       return;
+               }
+               foreach ( $this->cacheIndex[$target->getNamespace()][$target->getDBkey()] as $key ) {
+                       $this->cache->delete( $key );
+               }
        }
 
        /**
@@ -158,6 +206,139 @@ class WatchedItemStore {
                ];
        }
 
+       /**
+        * @param int $slaveOrMaster DB_MASTER or DB_SLAVE
+        *
+        * @return DatabaseBase
+        * @throws MWException
+        */
+       private function getConnection( $slaveOrMaster ) {
+               return $this->loadBalancer->getConnection( $slaveOrMaster, [ 'watchlist' ] );
+       }
+
+       /**
+        * @param DatabaseBase $connection
+        *
+        * @throws MWException
+        */
+       private function reuseConnection( $connection ) {
+               $this->loadBalancer->reuseConnection( $connection );
+       }
+
+       /**
+        * Count the number of individual items that are watched by the user.
+        * If a subject and corresponding talk page are watched this will return 2.
+        *
+        * @param User $user
+        *
+        * @return int
+        */
+       public function countWatchedItems( User $user ) {
+               $dbr = $this->getConnection( DB_SLAVE );
+               $return = (int)$dbr->selectField(
+                       'watchlist',
+                       'COUNT(*)',
+                       [
+                               'wl_user' => $user->getId()
+                       ],
+                       __METHOD__
+               );
+               $this->reuseConnection( $dbr );
+
+               return $return;
+       }
+
+       /**
+        * @param LinkTarget $target
+        *
+        * @return int
+        */
+       public function countWatchers( LinkTarget $target ) {
+               $dbr = $this->getConnection( DB_SLAVE );
+               $return = (int)$dbr->selectField(
+                       'watchlist',
+                       'COUNT(*)',
+                       [
+                               'wl_namespace' => $target->getNamespace(),
+                               'wl_title' => $target->getDBkey(),
+                       ],
+                       __METHOD__
+               );
+               $this->reuseConnection( $dbr );
+
+               return $return;
+       }
+
+       /**
+        * Number of page watchers who also visited a "recent" edit
+        *
+        * @param LinkTarget $target
+        * @param mixed $threshold timestamp accepted by wfTimestamp
+        *
+        * @return int
+        * @throws DBUnexpectedError
+        * @throws MWException
+        */
+       public function countVisitingWatchers( LinkTarget $target, $threshold ) {
+               $dbr = $this->getConnection( DB_SLAVE );
+               $visitingWatchers = (int)$dbr->selectField(
+                       'watchlist',
+                       'COUNT(*)',
+                       [
+                               'wl_namespace' => $target->getNamespace(),
+                               'wl_title' => $target->getDBkey(),
+                               'wl_notificationtimestamp >= ' .
+                               $dbr->addQuotes( $dbr->timestamp( $threshold ) ) .
+                               ' OR wl_notificationtimestamp IS NULL'
+                       ],
+                       __METHOD__
+               );
+               $this->reuseConnection( $dbr );
+
+               return $visitingWatchers;
+       }
+
+       /**
+        * @param LinkTarget[] $targets
+        * @param array $options Allowed keys:
+        *        'minimumWatchers' => int
+        *
+        * @return array multi dimensional like $return[$namespaceId][$titleString] = int $watchers
+        *         All targets will be present in the result. 0 either means no watchers or the number
+        *         of watchers was below the minimumWatchers option if passed.
+        */
+       public function countWatchersMultiple( array $targets, array $options = [] ) {
+               $dbOptions = [ 'GROUP BY' => [ 'wl_namespace', 'wl_title' ] ];
+
+               $dbr = $this->getConnection( DB_SLAVE );
+
+               if ( array_key_exists( 'minimumWatchers', $options ) ) {
+                       $dbOptions['HAVING'] = 'COUNT(*) >= ' . (int)$options['minimumWatchers'];
+               }
+
+               $lb = new LinkBatch( $targets );
+               $res = $dbr->select(
+                       'watchlist',
+                       [ 'wl_title', 'wl_namespace', 'watchers' => 'COUNT(*)' ],
+                       [ $lb->constructSet( 'wl', $dbr ) ],
+                       __METHOD__,
+                       $dbOptions
+               );
+
+               $this->reuseConnection( $dbr );
+
+               $watchCounts = [];
+               foreach ( $targets as $linkTarget ) {
+                       $watchCounts[$linkTarget->getNamespace()][$linkTarget->getDBkey()] = 0;
+               }
+
+               foreach ( $res as $row ) {
+                       $watchCounts[$row->wl_namespace][$row->wl_title] = (int)$row->watchers;
+               }
+
+               return $watchCounts;
+       }
+
        /**
         * Get an item (may be cached)
         *
@@ -167,6 +348,10 @@ class WatchedItemStore {
         * @return WatchedItem|false
         */
        public function getWatchedItem( User $user, LinkTarget $target ) {
+               if ( $user->isAnon() ) {
+                       return false;
+               }
+
                $cached = $this->getCached( $user, $target );
                if ( $cached ) {
                        return $cached;
@@ -188,14 +373,14 @@ class WatchedItemStore {
                        return false;
                }
 
-               $dbr = $this->loadBalancer->getConnection( DB_SLAVE, [ 'watchlist' ] );
+               $dbr = $this->getConnection( DB_SLAVE );
                $row = $dbr->selectRow(
                        'watchlist',
                        'wl_notificationtimestamp',
                        $this->dbCond( $user, $target ),
                        __METHOD__
                );
-               $this->loadBalancer->reuseConnection( $dbr );
+               $this->reuseConnection( $dbr );
 
                if ( !$row ) {
                        return false;
@@ -267,13 +452,13 @@ class WatchedItemStore {
                        return false;
                }
 
-               $dbw = $this->loadBalancer->getConnection( DB_MASTER, [ 'watchlist' ] );
+               $dbw = $this->getConnection( DB_MASTER );
                foreach ( array_chunk( $rows, 100 ) as $toInsert ) {
                        // Use INSERT IGNORE to avoid overwriting the notification timestamp
                        // if there's already an entry for this page
                        $dbw->insert( 'watchlist', $toInsert, __METHOD__, 'IGNORE' );
                }
-               $this->loadBalancer->reuseConnection( $dbw );
+               $this->reuseConnection( $dbw );
 
                return true;
        }
@@ -297,7 +482,7 @@ class WatchedItemStore {
 
                $this->uncache( $user, $target );
 
-               $dbw = $this->loadBalancer->getConnection( DB_MASTER, [ 'watchlist' ] );
+               $dbw = $this->getConnection( DB_MASTER );
                $dbw->delete( 'watchlist',
                        [
                                'wl_user' => $user->getId(),
@@ -306,7 +491,7 @@ class WatchedItemStore {
                        ], __METHOD__
                );
                $success = (bool)$dbw->affectedRows();
-               $this->loadBalancer->reuseConnection( $dbw );
+               $this->reuseConnection( $dbw );
 
                return $success;
        }
@@ -320,7 +505,7 @@ class WatchedItemStore {
         * @return int[] Array of user IDs the timestamp has been updated for
         */
        public function updateNotificationTimestamp( User $editor, LinkTarget $target, $timestamp ) {
-               $dbw = $this->loadBalancer->getConnection( DB_MASTER, [ 'watchlist' ] );
+               $dbw = $this->getConnection( DB_MASTER );
                $res = $dbw->select( [ 'watchlist' ],
                        [ 'wl_user' ],
                        [
@@ -350,11 +535,12 @@ class WatchedItemStore {
                                                        'wl_title' => $target->getDBkey(),
                                                ], $fname
                                        );
+                                       $this->uncacheLinkTarget( $target );
                                }
                        );
                }
 
-               $this->loadBalancer->reuseConnection( $dbw );
+               $this->reuseConnection( $dbw );
 
                return $watchers;
        }
@@ -457,6 +643,44 @@ class WatchedItemStore {
                return $notificationTimestamp;
        }
 
+       /**
+        * @param User $user
+        * @param int $unreadLimit
+        *
+        * @return int|bool The number of unread notifications
+        *                  true if greater than or equal to $unreadLimit
+        */
+       public function countUnreadNotifications( User $user, $unreadLimit = null ) {
+               $queryOptions = [];
+               if ( $unreadLimit !== null ) {
+                       $unreadLimit = (int)$unreadLimit;
+                       $queryOptions['LIMIT'] = $unreadLimit;
+               }
+
+               $dbr = $this->getConnection( DB_SLAVE );
+               $rowCount = $dbr->selectRowCount(
+                       'watchlist',
+                       '1',
+                       [
+                               'wl_user' => $user->getId(),
+                               'wl_notificationtimestamp IS NOT NULL',
+                       ],
+                       __METHOD__,
+                       $queryOptions
+               );
+               $this->reuseConnection( $dbr );
+
+               if ( !isset( $unreadLimit ) ) {
+                       return $rowCount;
+               }
+
+               if ( $rowCount >= $unreadLimit ) {
+                       return true;
+               }
+
+               return $rowCount;
+       }
+
        /**
         * Check if the given title already is watched by the user, and if so
         * add a watch for the new title.
@@ -489,7 +713,7 @@ class WatchedItemStore {
         * @param LinkTarget $newTarget
         */
        public function duplicateEntry( LinkTarget $oldTarget, LinkTarget $newTarget ) {
-               $dbw = $this->loadBalancer->getConnection( DB_MASTER, [ 'watchlist' ] );
+               $dbw = $this->getConnection( DB_MASTER );
 
                $result = $dbw->select(
                        'watchlist',
@@ -528,7 +752,7 @@ class WatchedItemStore {
                        );
                }
 
-               $this->loadBalancer->reuseConnection( $dbw );
+               $this->reuseConnection( $dbw );
        }
 
 }
index ead8efa..839d7b2 100644 (file)
@@ -96,6 +96,9 @@ abstract class Action {
                $classOrCallable = self::getClass( $action, $page->getActionOverrides() );
 
                if ( is_string( $classOrCallable ) ) {
+                       if ( !class_exists( $classOrCallable ) ) {
+                               return false;
+                       }
                        $obj = new $classOrCallable( $page, $context );
                        return $obj;
                }
index 87d269a..4596e41 100644 (file)
@@ -677,39 +677,17 @@ class InfoAction extends FormlessAction {
 
                                $setOpts += Database::getCacheSetOptions( $dbr, $dbrWatchlist );
 
-                               $result = [];
+                               $watchedItemStore = WatchedItemStore::getDefaultInstance();
 
-                               // Number of page watchers
-                               $watchers = (int)$dbrWatchlist->selectField(
-                                       'watchlist',
-                                       'COUNT(*)',
-                                       [
-                                               'wl_namespace' => $title->getNamespace(),
-                                               'wl_title' => $title->getDBkey(),
-                                       ],
-                                       $fname
-                               );
-                               $result['watchers'] = $watchers;
+                               $result = [];
+                               $result['watchers'] = $watchedItemStore->countWatchers( $title );
 
                                if ( $config->get( 'ShowUpdatedMarker' ) ) {
-                                       // Threshold: last visited about 26 weeks before latest edit
                                        $updated = wfTimestamp( TS_UNIX, $page->getTimestamp() );
-                                       $age = $config->get( 'WatchersMaxAge' );
-                                       $threshold = $dbrWatchlist->timestamp( $updated - $age );
-                                       // Number of page watchers who also visited a "recent" edit
-                                       $visitingWatchers = (int)$dbrWatchlist->selectField(
-                                               'watchlist',
-                                               'COUNT(*)',
-                                               [
-                                                       'wl_namespace' => $title->getNamespace(),
-                                                       'wl_title' => $title->getDBkey(),
-                                                       'wl_notificationtimestamp >= ' .
-                                                               $dbrWatchlist->addQuotes( $threshold ) .
-                                                               ' OR wl_notificationtimestamp IS NULL'
-                                               ],
-                                               $fname
+                                       $result['visitingWatchers'] = $watchedItemStore->countVisitingWatchers(
+                                               $title,
+                                               $updated - $config->get( 'WatchersMaxAge' )
                                        );
-                                       $result['visitingWatchers'] = $visitingWatchers;
                                }
 
                                // Total number of edits
index 85dee2b..7944167 100644 (file)
@@ -2524,123 +2524,6 @@ abstract class ApiBase extends ContextSource {
         * @{
         */
 
-       /// @deprecated since 1.24
-       const PROP_ROOT = 'ROOT';
-       /// @deprecated since 1.24
-       const PROP_LIST = 'LIST';
-       /// @deprecated since 1.24
-       const PROP_TYPE = 0;
-       /// @deprecated since 1.24
-       const PROP_NULLABLE = 1;
-
-       /**
-        * Formerly used to fetch a list of possible properites in the result,
-        * somehow organized with respect to the prop parameter that causes them to
-        * be returned. The specific semantics of the return value was never
-        * specified. Since this was never possible to be accurately updated, it
-        * has been removed.
-        *
-        * @deprecated since 1.24
-        * @return array|bool
-        */
-       protected function getResultProperties() {
-               wfDeprecated( __METHOD__, '1.24' );
-               return false;
-       }
-
-       /**
-        * @see self::getResultProperties()
-        * @deprecated since 1.24
-        * @return array|bool
-        */
-       public function getFinalResultProperties() {
-               wfDeprecated( __METHOD__, '1.24' );
-               return [];
-       }
-
-       /**
-        * @see self::getResultProperties()
-        * @deprecated since 1.24
-        */
-       protected static function addTokenProperties( &$props, $tokenFunctions ) {
-               wfDeprecated( __METHOD__, '1.24' );
-       }
-
-       /**
-        * @see self::getPossibleErrors()
-        * @deprecated since 1.24
-        * @return array
-        */
-       public function getRequireOnlyOneParameterErrorMessages( $params ) {
-               wfDeprecated( __METHOD__, '1.24' );
-               return [];
-       }
-
-       /**
-        * @see self::getPossibleErrors()
-        * @deprecated since 1.24
-        * @return array
-        */
-       public function getRequireMaxOneParameterErrorMessages( $params ) {
-               wfDeprecated( __METHOD__, '1.24' );
-               return [];
-       }
-
-       /**
-        * @see self::getPossibleErrors()
-        * @deprecated since 1.24
-        * @return array
-        */
-       public function getRequireAtLeastOneParameterErrorMessages( $params ) {
-               wfDeprecated( __METHOD__, '1.24' );
-               return [];
-       }
-
-       /**
-        * @see self::getPossibleErrors()
-        * @deprecated since 1.24
-        * @return array
-        */
-       public function getTitleOrPageIdErrorMessage() {
-               wfDeprecated( __METHOD__, '1.24' );
-               return [];
-       }
-
-       /**
-        * This formerly attempted to return a list of all possible errors returned
-        * by the module. However, this was impossible to maintain in many cases
-        * since errors could come from other areas of MediaWiki and in some cases
-        * from arbitrary extension hooks. Since a partial list claiming to be
-        * comprehensive is unlikely to be useful, it was removed.
-        *
-        * @deprecated since 1.24
-        * @return array
-        */
-       public function getPossibleErrors() {
-               wfDeprecated( __METHOD__, '1.24' );
-               return [];
-       }
-
-       /**
-        * @see self::getPossibleErrors()
-        * @deprecated since 1.24
-        * @return array
-        */
-       public function getFinalPossibleErrors() {
-               wfDeprecated( __METHOD__, '1.24' );
-               return [];
-       }
-
-       /**
-        * @see self::getPossibleErrors()
-        * @deprecated since 1.24
-        * @return array
-        */
-       public function parseErrors( $errors ) {
-               wfDeprecated( __METHOD__, '1.24' );
-               return [];
-       }
-
        /**
         * Returns the description string for this module
         *
index 36b62f5..64bb9ba 100644 (file)
@@ -24,6 +24,7 @@
  *
  * @file
  */
+use MediaWiki\Logger\LoggerFactory;
 
 /**
  * API interface for page purging
@@ -75,6 +76,17 @@ class ApiPurge extends ApiBase {
                                                $enableParserCache
                                        );
 
+                                       # Logging to better see expensive usage patterns
+                                       if ( $forceRecursiveLinkUpdate ) {
+                                               LoggerFactory::getInstance( 'RecursiveLinkPurge' )->info(
+                                                       "Recursive link purge enqueued for {title}",
+                                                       [
+                                                               'user' => $this->getUser()->getName(),
+                                                               'title' => $title->getPrefixedText()
+                                                       ]
+                                               );
+                                       }
+
                                        # Update the links tables
                                        $updates = $content->getSecondaryDataUpdates(
                                                $title, null, $forceRecursiveLinkUpdate, $p_result );
index ea7818c..3aa0122 100644 (file)
@@ -453,10 +453,8 @@ class ApiQueryInfo extends ApiQueryBase {
                }
 
                if ( $this->fld_watchers ) {
-                       if ( isset( $this->watchers[$ns][$dbkey] ) ) {
+                       if ( $this->watchers[$ns][$dbkey] !== 0 || $this->showZeroWatchers ) {
                                $pageInfo['watchers'] = $this->watchers[$ns][$dbkey];
-                       } elseif ( $this->showZeroWatchers ) {
-                               $pageInfo['watchers'] = 0;
                        }
                }
 
@@ -799,28 +797,17 @@ class ApiQueryInfo extends ApiQueryBase {
                        return;
                }
 
-               $this->watchers = [];
                $this->showZeroWatchers = $canUnwatchedpages;
-               $db = $this->getDB();
-
-               $lb = new LinkBatch( $this->everything );
 
-               $this->resetQueryParams();
-               $this->addTables( [ 'watchlist' ] );
-               $this->addFields( [ 'wl_title', 'wl_namespace', 'count' => 'COUNT(*)' ] );
-               $this->addWhere( [
-                       $lb->constructSet( 'wl', $db )
-               ] );
-               $this->addOption( 'GROUP BY', [ 'wl_namespace', 'wl_title' ] );
+               $countOptions = [];
                if ( !$canUnwatchedpages ) {
-                       $this->addOption( 'HAVING', "COUNT(*) >= $unwatchedPageThreshold" );
+                       $countOptions['minimumWatchers'] = $unwatchedPageThreshold;
                }
 
-               $res = $this->select( __METHOD__ );
-
-               foreach ( $res as $row ) {
-                       $this->watchers[$row->wl_namespace][$row->wl_title] = (int)$row->count;
-               }
+               $this->watchers = WatchedItemStore::getDefaultInstance()->countWatchersMultiple(
+                       $this->everything,
+                       $countOptions
+               );
        }
 
        /**
index 9e7e62e..0fc443a 100644 (file)
@@ -225,23 +225,15 @@ class ApiQueryUserInfo extends ApiQueryBase {
                }
 
                if ( isset( $this->prop['unreadcount'] ) ) {
-                       $dbr = $this->getQuery()->getNamedDB( 'watchlist', DB_SLAVE, 'watchlist' );
-
-                       $count = $dbr->selectRowCount(
-                               'watchlist',
-                               '1',
-                               [
-                                       'wl_user' => $user->getId(),
-                                       'wl_notificationtimestamp IS NOT NULL',
-                               ],
-                               __METHOD__,
-                               [ 'LIMIT' => self::WL_UNREAD_LIMIT ]
+                       $unreadNotifications = WatchedItemStore::getDefaultInstance()->countUnreadNotifications(
+                               $user,
+                               self::WL_UNREAD_LIMIT
                        );
 
-                       if ( $count >= self::WL_UNREAD_LIMIT ) {
+                       if ( $unreadNotifications === true ) {
                                $vals['unreadcount'] = self::WL_UNREAD_LIMIT . '+';
                        } else {
-                               $vals['unreadcount'] = $count;
+                               $vals['unreadcount'] = $unreadNotifications;
                        }
                }
 
index 79fe9cf..5072c66 100644 (file)
@@ -45,6 +45,7 @@
        "apihelp-emailuser-description": "مراسلة المستخدم",
        "apihelp-expandtemplates-param-title": "عنوان الصفحة.",
        "apihelp-feedrecentchanges-param-tagfilter": "فلتر بالوسم.",
+       "apihelp-feedrecentchanges-example-simple": " اظهر التغييرات الحديثة",
        "apihelp-feedrecentchanges-example-30days": "أظهر التغييرات الأخيرة في 30 يوم.",
        "apihelp-feedwatchlist-example-all6hrs": "اظهر كل التغييرات في اخر 6 ساعات",
        "apihelp-filerevert-param-comment": "تعليق الرفع.",
index bda2291..094127b 100644 (file)
@@ -1,9 +1,12 @@
 {
        "@metadata": {
                "authors": [
-                       "Рустам Нурыев"
+                       "Рустам Нурыев",
+                       "Азат Хәлилов"
                ]
        },
+       "apihelp-main-param-action": "Хәрәкәтте нисек үтәргә?",
+       "apihelp-main-param-format": "Мәғлүмәттәр сығарыу форматы.",
        "apihelp-feedcontributions-param-toponly": "Һуңғы өлгө булған төҙәтеүҙәрҙе генә күрһәтергә",
        "apihelp-feedcontributions-param-showsizediff": "Өлгәоәр араһыдағы күләм айырмаһын күрһәтергә",
        "apihelp-feedrecentchanges-param-from": "Теге ваҡыттын булған үҙгәрештәрҙе күрһәтергә",
index b8be085..c93d8ba 100644 (file)
@@ -1,10 +1,14 @@
 {
        "@metadata": {
                "authors": [
-                       "Aftabuzzaman"
+                       "Aftabuzzaman",
+                       "Bodhisattwa"
                ]
        },
+       "apihelp-block-description": "ব্যবহারকারীকে বাধা দিন।",
        "apihelp-createaccount-param-name": "ব্যবহারকারী নাম।",
+       "apihelp-delete-description": "একটি পাতা মুছে ফেলুন।",
+       "apihelp-delete-example-simple": "<kbd>প্রধান পাতা</kbd> মুছে ফেলুন।",
        "apihelp-edit-param-minor": "অনুল্লেখ্য সম্পাদনা।",
        "apihelp-login-example-login": "প্রবেশ"
 }
index b6ddc88..259fe65 100644 (file)
@@ -8,10 +8,11 @@
                        "Cvanca",
                        "Utar",
                        "Macofe",
-                       "Danny B."
+                       "Danny B.",
+                       "LordMsz"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Dokumentace]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete [[mw:API:Errors_and_warnings|v dokumentaci]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Dokumentace]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete [[mw:API:Errors_and_warnings|v dokumentaci]].\n\n<strong>Testování:</strong> Pro jednoduché testování požadavků na API zkuste [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Která akce se má provést.",
        "apihelp-main-param-format": "Formát výstupu.",
        "apihelp-main-param-maxlag": "Maximální zpoždění lze použít, když je MediaWiki nainstalováno na cluster s replikovanou databází. Abyste se vyhnuli zhoršování už tak špatného replikačního zpoždění, můžete tímto parametrem nechat klienta čekat, dokud replikační zpoždění neklesne pod uvedenou hodnotu. V případě příliš vysokého zpoždění se vrátí chybový kód „<samp>maxlag</samp>“ s hlášením typu „<samp>Waiting for $host: $lag seconds lagged</samp>“.<br />Více informací najdete v [[mw:Manual:Maxlag_parameter|příručce]].",
index 44d750a..2c5c0db 100644 (file)
@@ -99,7 +99,7 @@
        "apihelp-opensearch-param-format": "Η μορφή των δεδομένων εξόδου.",
        "apihelp-options-example-reset": "Επαναφορά όλων των προτιμήσεων.",
        "apihelp-paraminfo-param-helpformat": "Μορφή των συμβολοσειρών βοήθειας.",
-       "apihelp-patrol-example-revid": "ΠεÏ\81ιÏ\80ολία αναθεώρησης.",
+       "apihelp-patrol-example-revid": "Î\88λεγÏ\87οÏ\82 αναθεώρησης.",
        "apihelp-protect-example-protect": "Προστασία σελίδας.",
        "apihelp-query+users-paramvalue-prop-gender": "Επισημαίνει το φύλο του χρήστη. Επιστρέφει «αρσενικό», «θηλυκό» ή «άγνωστο»",
        "api-help-param-type-limit": "Τύπος: ακέραιος ή <kbd>max</kbd>",
index f870887..a429583 100644 (file)
@@ -12,7 +12,8 @@
                        "Ebraminio",
                        "Macofe",
                        "Huji",
-                       "Ladsgroup"
+                       "Ladsgroup",
+                       "Freshman404"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|مستندات]]\n* [[mw:API:FAQ|پرسش‌های متداول]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api فهرست پست الکترونیکی]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce اعلانات رابط برنامه‌نویسی کاربردی]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R ایرادها و درخواست‌ها]\n</div>\n\n<strong>وضعیت:</strong> تمام ویژگی‌هایی که در این صفحه نمایش یافته‌اند باید کار بکنند، ولی رابط برنامه‌نویسی کاربردی کماکان در حال توسعه است، و ممکن است در هر زمان تغییر بکند. به عضویت [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ فهرست پست الکترونیکی mediawiki-api-announce] در بیایید تا از تغییرات باخبر شوید.\n\n<strong>درخواست‌های معیوب:</strong> وقتی درخواست‌های معیوب به رابط برنامه‌نویسی کاربردی فرستاده شوند، یک سرایند اچ‌تی‌تی‌پی با کلید «MediaWiki-API-Erorr» فرستاده می‌شود و بعد هم مقدار سرایند و هم کد خطای بازگردانده شده  هر دو به یک مقدار نسبت داده می‌شوند. برای اطلاعات بیشتر [[mw:API:Errors_and_warnings|API: Errors and warnings]] را ببینید.\n\n<strong>آزمایش:</strong> برای انجام درخواست‌های API آزمایشی [[Special:ApiSandbox]] را ببینید.",
        "apihelp-opensearch-param-suggest": "کاری نکنید اگر <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> false است.",
        "apihelp-opensearch-param-format": "فرمت خروجی.",
        "apihelp-opensearch-example-te": "یافتن صفحه‌هایی که با <kbd>Te</kbd> آغاز می‌شوند",
+       "apihelp-options-param-reset": "ترجیحات را به مقادیر پیش فرض سایت بازمی گرداند.",
        "apihelp-options-example-reset": "بازنشانی همه تنظیمات.",
        "apihelp-paraminfo-param-helpformat": "ساختار راهنمای رشته‌ها",
        "apihelp-parse-example-page": "تجزیه یک صفحه.",
index 04a7554..979f023 100644 (file)
        "apihelp-query+allrevisions-param-generatetitles": "ジェネレーターとして使用する場合、版IDではなくページ名を生成します。",
        "apihelp-query+allrevisions-example-user": "利用者 <kbd>Example</kbd> による直近の50版を一覧表示する。",
        "apihelp-query+allrevisions-example-ns-main": "標準名前空間にある最初の50版を一覧表示する。",
+       "apihelp-query+mystashedfiles-param-prop": "ファイルのどのプロパティを取得するか。",
+       "apihelp-query+mystashedfiles-paramvalue-prop-size": "ファイルサイズと画像の大きさを取得します。",
+       "apihelp-query+mystashedfiles-paramvalue-prop-type": "ファイルの MIME タイプとメディアタイプを取得します。",
        "apihelp-query+mystashedfiles-param-limit": "取得するファイルの数。",
        "apihelp-query+alltransclusions-param-prefix": "この値で始まるすべてのトランスクルードされているページを検索する。",
        "apihelp-query+alltransclusions-param-prop": "どの情報を結果に含めるか:",
index 7b5361d..28cef6b 100644 (file)
        "apihelp-feedrecentchanges-param-hideliu": "Änderonge ußschlehße, di vun aanjemälldete Metmaacher jemaht wohde.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Nohjelohrte Änderonge övverjonn.",
        "apihelp-feedrecentchanges-param-hidemyself": "Änderonge vun heh dämm Metmaacher övverjonn.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Donn Änderonge aan de Zohjehüreshkeit zoh Saachjroppe veschteijsche.",
        "apihelp-feedrecentchanges-param-tagfilter": "Noh Makkehronge beschängke.",
        "apihelp-feedrecentchanges-param-target": "Zeijsch Änderonge aan Sigge, op di vun heh dä Sigg ene Lengk jeihd.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Zeijsch Änderonge aan Sigge, op di vun dä ußjesöhk Sigg ene Lengk jeihd.",
+       "apihelp-feedrecentchanges-param-categories": "Donn blohß de Änderonge aan de Zohjehüreshkeit för all heh di Saachjroppe zeije.",
+       "apihelp-feedrecentchanges-param-categories_any": "Donn deföhr blohß de Änderonge aan de Zohjehüreshkeit för öhndseijn fun heh dä Saachjroppe zeije.",
        "apihelp-feedrecentchanges-example-simple": "Zeijsch de {{LCFIRST:{{int:recentchanges}}}}",
        "apihelp-feedrecentchanges-example-30days": "Zeijsch de {{LCFIRST:{{int:recentchanges}}}} vun de läzde 30 Dähsch.",
        "apihelp-feedwatchlist-description": "Donn ene Kannahl met dä Oppaßleß zerökjävve.",
        "apihelp-query+allrevisions-param-generatetitles": "Wann als ene  Jenerahtor enjesaz, brängk dat Övverschreffte un kein Kännonge vun Väsjohne.",
        "apihelp-query+allrevisions-example-user": "Donn de läzde fuffzisch Beijdrähsch vum Metmaacher „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Example</kbd>“ opleßte.",
        "apihelp-query+allrevisions-example-ns-main": "Donn de eezde fuffzisch Väsjohne em Houp-Appachemang opleßte.",
+       "apihelp-query+mystashedfiles-param-prop": "Wat för en Aanjahbe holle för di Datteije.",
        "apihelp-query+mystashedfiles-param-limit": "Wi vill Datteije holle?",
        "apihelp-query+alltransclusions-param-from": "De Övverschreff vun dä ennjeföhschte Sigg, woh de Leß medd aanfange sull.",
        "apihelp-query+alltransclusions-param-to": "De Övverschreff vun dä ennjeföhschte Sigg, woh et Zälle ophühre sull.",
        "apihelp-query+random-param-namespace": "Jiff blohß sigge en heh dä Appachtemangs uß.",
        "apihelp-query+random-param-limit": "Wi vill zohfälleje Sigge sulle ußjejovve wähde?",
        "apihelp-query+random-param-redirect": "Nemm <kbd>$1filterredir=redirects</kbd> schtatt dämm.",
+       "apihelp-query+random-param-filterredir": "Wi de Ömleijdonge ußzottehre?",
        "apihelp-query+random-example-simple": "Donn zwai zohfälleje Sigge vum Houb_Appachtemang ußjävve.",
        "apihelp-query+random-example-generator": "Donn Ennfommazjuhne övver zwai zohfälleje Sigge vum Houb_Appachtemang ußjävve.",
        "apihelp-query+recentchanges-description": "Donn de  neußte Änderonge opleßte.",
index a43d840..7e9e0af 100644 (file)
        "apihelp-expandtemplates-param-generatexml": "Generà ll'albero XML (scagnato 'a $1prop=parsetree).",
        "apihelp-expandtemplates-example-simple": "Spanne 'o wikitesto <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>.",
        "apihelp-feedcontributions-description": "Tuorna nu feed 'e cuntribbute 'utente.",
-       "apihelp-feedcontributions-param-feedformat": "'O furmatto d' 'o feed.",
+       "apihelp-feedcontributions-param-feedformat": "'O furmato d' 'o feed.",
        "apihelp-feedcontributions-param-user": "'A quale 'utente nc'avimm'a piglià cuntribbute.",
        "apihelp-feedcontributions-param-namespace": "'A qualu namespace s'avesser'a filtrà 'e cuntribbute.",
        "apihelp-feedcontributions-param-year": "'E ll'anno (e primma).",
        "apihelp-feedcontributions-param-month": "D' 'o mese (e pure cchiù primma).",
+       "apihelp-feedcontributions-param-tagfilter": "Filtrà cuntribbute ca teneno sti ttag.",
+       "apihelp-feedcontributions-param-deletedonly": "Mmusta surtant' 'e cuntribbute scancellate.",
+       "apihelp-feedcontributions-param-toponly": "Fà vedé sulamente 'e contribbute 'e l'urdeme verziune.",
+       "apihelp-feedcontributions-param-newonly": "Fà vedé sulamente 'e contribbute ca songo criazione 'e paggene.",
+       "apihelp-feedcontributions-param-showsizediff": "Fà vedé 'a differenza nfra verziune.",
+       "apihelp-feedcontributions-example-simple": "Tuòrna cuntribbute 'a ll'utente <kbd>Esempio</kbd>.",
+       "apihelp-feedrecentchanges-description": "Tuorna 'o blocco 'e nutizie 'e ll'urdeme cagnamiente.",
+       "apihelp-feedrecentchanges-param-feedformat": "'O furmato d' 'o feed.",
        "apihelp-feedwatchlist-param-feedformat": "'O furmato d' 'o feed.",
+       "apihelp-filerevert-param-comment": "Carreca commento.",
+       "apihelp-help-description": "Fà veré l'aiuto p' 'e module specificate",
+       "apihelp-help-param-submodules": "Azzecca n'aiuto p' 'e submodule 'e nu modulo ca téne nome.",
        "apihelp-login-example-login": "Tràse.",
        "apihelp-move-description": "Mòve paggena.",
        "apihelp-opensearch-param-search": "Ascìa stringa.",
index 0bb5f63..6e2ff5a 100644 (file)
@@ -61,6 +61,7 @@
        "apihelp-edit-param-unwatch": "Bỏ trang này khỏi danh sách theo dõi của người dùng hiện tại.",
        "apihelp-edit-param-undo": "Hoàn tác sửa đổi này. Ghi đè $1text, $1prependtext và $ 1appendtext.",
        "apihelp-edit-param-undoafter": "Hoàn tác tất cả các sửa đổi từ $1undo cho tới sửa đổi này. Nếu không được thiết lập, chỉ cần lùi lại một sửa đổi.",
+       "apihelp-edit-param-redirect": "Tự động giải quyết các chuyển hướng.",
        "apihelp-edit-example-edit": "Sửa đổi trang",
        "apihelp-edit-example-prepend": "Đưa <kbd>_&#95;NOTOC_&#95;</kbd> vào đầu trang",
        "apihelp-edit-example-undo": "Lùi sửa các thay đổi 13579–13585 và tự động tóm lược",
        "apihelp-expandtemplates-description": "Bung tất cả bản mẫu trong văn bản wiki.",
        "apihelp-expandtemplates-param-title": "Tên trang.",
        "apihelp-expandtemplates-param-text": "Văn bản wiki để bung.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "Wikitext mở rộng.",
        "apihelp-expandtemplates-paramvalue-prop-parsetree": "Cây phân tích XML của đầu vào.",
        "apihelp-feedcontributions-description": "Trả về nguồn cấp đóng góp người dùng.",
        "apihelp-feedcontributions-param-feedformat": "Định dạng nguồn cấp.",
        "apihelp-feedcontributions-param-user": "Người dùng nhận được những đóng góp gì.",
+       "apihelp-feedcontributions-param-namespace": "Không gian tên để lọc các khoản đóng góp của.",
        "apihelp-feedcontributions-param-year": "Từ năm (trở về trước).",
        "apihelp-feedcontributions-param-month": "Từ tháng (trở về trước).",
+       "apihelp-feedcontributions-param-tagfilter": "Lọc đóng góp có những thẻ này.",
        "apihelp-feedcontributions-param-deletedonly": "Chỉ hiện các đóng góp đã xóa.",
        "apihelp-feedcontributions-param-toponly": "Chỉ hiện các phiên bản mới nhất.",
        "apihelp-feedcontributions-param-newonly": "Chỉ hiện các sửa đổi tạo trang.",
        "apihelp-imagerotate-param-rotation": "Độ xoay hình ảnh theo chiều kim đồng hồ.",
        "apihelp-imagerotate-example-simple": "Xoay <kbd>Tập tin:Ví dụ.jpg</kbd> <kbd>90</kbd> độ.",
        "apihelp-imagerotate-example-generator": "Xoay tất cả các hình ảnh trong <kbd>Thể loại:Búng</kbd> <kbd>180</kbd> độ.",
+       "apihelp-import-param-summary": "Nhập tóm lược.",
+       "apihelp-import-param-xml": "Tập tin XML đã được tải lên.",
        "apihelp-import-param-interwikisource": "Dành cho các nhập khẩu interwiki: wiki để nhập từ.",
        "apihelp-login-param-name": "Tên người dùng.",
        "apihelp-login-param-password": "Mật khẩu.",
        "apihelp-login-example-gettoken": "Lấy dấu hiệu đăng nhập",
        "apihelp-login-example-login": "Đăng nhập",
        "apihelp-logout-example-logout": "Đăng xuất người dùng hiện tại",
+       "apihelp-mergehistory-description": "Hợp nhất lịch sử trang.",
+       "apihelp-mergehistory-param-reason": "Lý do hợp nhất lịch sử.",
        "apihelp-move-description": "Di chuyển trang.",
        "apihelp-move-param-reason": "Lý do đổi tên.",
+       "apihelp-move-param-movesubpages": "Đổi tên trang con, nếu có thể áp dụng.",
        "apihelp-move-param-noredirect": "Không tạo trang đổi hướng.",
        "apihelp-move-param-ignorewarnings": "Bỏ qua tất cả các cảnh báo.",
        "apihelp-opensearch-description": "Tìm kiếm trong wiki qua giao thức OpenSearch.",
        "apihelp-opensearch-param-format": "Định dạng kết quả được cho ra.",
        "apihelp-opensearch-example-te": "Tìm trang bắt đầu với <kbd>Te</kbd>.",
        "apihelp-options-example-reset": "Mặc định lại các tùy chọn",
+       "apihelp-paraminfo-description": "Lấy thông tin về các module API.",
        "apihelp-paraminfo-param-helpformat": "Định dạng chuỗi trợ giúp.",
        "apihelp-parse-param-summary": "Lời tóm lược để phân tích.",
        "apihelp-parse-param-section": "Chỉ phân tích nội dung của số phần này.\n\nNếu có <kbd>new</kbd> thì phân tích <var>$1text</var> và <var>$1sectiontitle</var> như thể thêm phần mới vào trang.\n\nPhần <kbd>new</kbd> chỉ được chấp nhận khi định rõ <var>text</var>.",
index b058d1f..b26dc8d 100644 (file)
@@ -1054,7 +1054,7 @@ class MessageCache {
         * @param Title $title
         * @param bool $linestart Whether or not this is at the start of a line
         * @param bool $interface Whether this is an interface message
-        * @param string $language Language code
+        * @param Language|string $language Language code
         * @return ParserOutput|string
         */
        public function parse( $text, $title = null, $linestart = true,
@@ -1067,6 +1067,10 @@ class MessageCache {
                $parser = $this->getParser();
                $popts = $this->getParserOptions();
                $popts->setInterfaceMessage( $interface );
+
+               if ( is_string( $language ) ) {
+                       $language = Language::factory( $language );
+               }
                $popts->setTargetLanguage( $language );
 
                if ( !$title || !$title instanceof Title ) {
index 637eb88..cf97afb 100644 (file)
@@ -344,9 +344,9 @@ class ChangesList extends ContextSource {
        /**
         * @param string $s HTML to update
         * @param RecentChange $rc
-        * @param bool $unpatrolled
+        * @param bool|null $unpatrolled Unused variable, since 1.27.
         */
-       public function insertDiffHist( &$s, &$rc, $unpatrolled ) {
+       public function insertDiffHist( &$s, &$rc, $unpatrolled = null ) {
                # Diff link
                if (
                        $rc->mAttribs['rc_type'] == RC_NEW ||
index 4a028bb..946c6d1 100644 (file)
@@ -503,10 +503,11 @@ class EnhancedChangesList extends ChangesList {
                /** @var $block0 RecentChange */
                $block0 = $block[0];
                $last = $block[count( $block ) - 1];
-               if ( !$allLogs && $rcObj->mAttribs['rc_type'] != RC_CATEGORIZE ) {
-                       if ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
-                               $links['total-changes'] = $nchanges[$n];
-                       } elseif ( $isnew ) {
+               if ( !$allLogs ) {
+                       if ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ||
+                               $isnew ||
+                               $rcObj->mAttribs['rc_type'] == RC_CATEGORIZE
+                       ) {
                                $links['total-changes'] = $nchanges[$n];
                        } else {
                                $links['total-changes'] = Linker::link(
index 576718a..8eb06ce 100644 (file)
@@ -87,7 +87,7 @@ class OldChangesList extends ChangesList {
                        }
                // Regular entries
                } else {
-                       $this->insertDiffHist( $html, $rc, $unpatrolled );
+                       $this->insertDiffHist( $html, $rc );
                        # M, N, b and ! (minor, new, bot and unpatrolled)
                        $html .= $this->recentChangesFlags(
                                [
index 24bded7..2dc953c 100644 (file)
@@ -73,8 +73,8 @@ class ChangeTagsLogItem extends RevisionItemBase {
                $loglink = Linker::link(
                        SpecialPage::getTitleFor( 'Log' ),
                        $this->list->msg( 'log' )->escaped(),
-                       array(),
-                       array( 'page' => $title->getPrefixedText() )
+                       [],
+                       [ 'page' => $title->getPrefixedText() ]
                );
                $loglink = $this->list->msg( 'parentheses' )->rawParams( $loglink )->escaped();
                // User links and action text
@@ -88,7 +88,7 @@ class ChangeTagsLogItem extends RevisionItemBase {
                }
 
                $content = "$loglink $date $action $comment";
-               $attribs = array();
+               $attribs = [];
                $tags = $this->getTags();
                if ( $tags ) {
                        list( $tagSummary, $classes ) = ChangeTags::formatSummaryRow(
index 9ab11f3..7430caf 100644 (file)
@@ -55,7 +55,7 @@ class MWUnknownContentModelException extends MWException {
 
        /** @return string */
        public function getModelId() {
-               return $modelId;
+               return $this->modelId;
        }
 }
 
@@ -777,7 +777,7 @@ abstract class ContentHandler {
         * @return string
         */
        protected function getDiffEngineClass() {
-               return 'DifferenceEngine';
+               return DifferenceEngine::class;
        }
 
        /**
index f5e8783..ad40cd9 100644 (file)
@@ -32,7 +32,7 @@ class TextContentHandler extends ContentHandler {
 
        // @codingStandardsIgnoreStart bug 57585
        public function __construct( $modelId = CONTENT_MODEL_TEXT,
-               $formats = array( CONTENT_FORMAT_TEXT ) ) {
+               $formats = [ CONTENT_FORMAT_TEXT ] ) {
                parent::__construct( $modelId, $formats );
        }
        // @codingStandardsIgnoreEnd
index bc57c93..6272e7e 100644 (file)
@@ -249,8 +249,8 @@ class DiffEngine {
                $edits = [];
                $xi = $yi = 0;
                while ( $xi < $n_from || $yi < $n_to ) {
-                       assert( '$yi < $n_to || $this->xchanged[$xi]' );
-                       assert( '$xi < $n_from || $this->ychanged[$yi]' );
+                       assert( $yi < $n_to || $this->xchanged[$xi] );
+                       assert( $xi < $n_from || $this->ychanged[$yi] );
 
                        // Skip matching "snake".
                        $copy = [];
@@ -448,7 +448,7 @@ class DiffEngine {
                                while ( list( , $y ) = each( $matches ) ) {
                                        if ( empty( $this->in_seq[$y] ) ) {
                                                $k = $this->lcsPos( $y );
-                                               assert( '$k > 0' );
+                                               assert( $k > 0 );
                                                $ymids[$k] = $ymids[$k - 1];
                                                break;
                                        }
@@ -456,7 +456,7 @@ class DiffEngine {
 
                                while ( list( , $y ) = each( $matches ) ) {
                                        if ( $y > $this->seq[$k - 1] ) {
-                                               assert( '$y < $this->seq[$k]' );
+                                               assert( $y < $this->seq[$k] );
                                                // Optimization: this is a common case:
                                                // next match is just replacing previous match.
                                                $this->in_seq[$this->seq[$k]] = false;
@@ -464,7 +464,7 @@ class DiffEngine {
                                                $this->in_seq[$y] = 1;
                                        } elseif ( empty( $this->in_seq[$y] ) ) {
                                                $k = $this->lcsPos( $y );
-                                               assert( '$k > 0' );
+                                               assert( $k > 0 );
                                                $ymids[$k] = $ymids[$k - 1];
                                        }
                                }
@@ -507,7 +507,7 @@ class DiffEngine {
                        }
                }
 
-               assert( '$ypos != $this->seq[$end]' );
+               assert( $ypos != $this->seq[$end] );
 
                $this->in_seq[$this->seq[$end]] = false;
                $this->seq[$end] = $ypos;
@@ -595,7 +595,7 @@ class DiffEngine {
                $i = 0;
                $j = 0;
 
-               assert( 'count($lines) == count($changed)' );
+               assert( count( $lines ) == count( $changed ) );
                $len = count( $lines );
                $other_len = count( $other_changed );
 
@@ -616,7 +616,7 @@ class DiffEngine {
                        }
 
                        while ( $i < $len && !$changed[$i] ) {
-                               assert( '$j < $other_len && ! $other_changed[$j]' );
+                               assert( $j < $other_len && ! $other_changed[$j] );
                                $i++;
                                $j++;
                                while ( $j < $other_len && $other_changed[$j] ) {
@@ -653,11 +653,11 @@ class DiffEngine {
                                        while ( $start > 0 && $changed[$start - 1] ) {
                                                $start--;
                                        }
-                                       assert( '$j > 0' );
+                                       assert( $j > 0 );
                                        while ( $other_changed[--$j] ) {
                                                continue;
                                        }
-                                       assert( '$j >= 0 && !$other_changed[$j]' );
+                                       assert( $j >= 0 && !$other_changed[$j] );
                                }
 
                                /*
@@ -681,7 +681,7 @@ class DiffEngine {
                                                $i++;
                                        }
 
-                                       assert( '$j < $other_len && ! $other_changed[$j]' );
+                                       assert( $j < $other_len && ! $other_changed[$j] );
                                        $j++;
                                        if ( $j < $other_len && $other_changed[$j] ) {
                                                $corresponding = $i;
@@ -699,11 +699,11 @@ class DiffEngine {
                        while ( $corresponding < $i ) {
                                $changed[--$start] = 1;
                                $changed[--$i] = 0;
-                               assert( '$j > 0' );
+                               assert( $j > 0 );
                                while ( $other_changed[--$j] ) {
                                        continue;
                                }
-                               assert( '$j >= 0 && !$other_changed[$j]' );
+                               assert( $j >= 0 && !$other_changed[$j] );
                        }
                }
        }
@@ -867,8 +867,8 @@ class MappedDiff extends Diff {
        public function __construct( $from_lines, $to_lines,
                $mapped_from_lines, $mapped_to_lines ) {
 
-               assert( 'count( $from_lines ) == count( $mapped_from_lines )' );
-               assert( 'count( $to_lines ) == count( $mapped_to_lines )' );
+               assert( count( $from_lines ) == count( $mapped_from_lines ) );
+               assert( count( $to_lines ) == count( $mapped_to_lines ) );
 
                parent::__construct( $mapped_from_lines, $mapped_to_lines );
 
@@ -959,7 +959,7 @@ class HWLDFWordAccumulator {
                                $this->flushLine( $tag );
                                $word = substr( $word, 1 );
                        }
-                       assert( '!strstr( $word, "\n" )' );
+                       assert( !strstr( $word, "\n" ) );
                        $this->group .= $word;
                }
        }
index 1cf3918..44e6a24 100644 (file)
@@ -573,7 +573,7 @@ class DifferenceEngine extends ContextSource {
                <h2 class='diff-currentversion-title'>{$revHeader}</h2>\n" );
                # Page content may be handled by a hooked call instead...
                # @codingStandardsIgnoreStart Ignoring long lines.
-               if ( Hooks::run( 'ArticleContentOnDiff', array( $this, $out ) ) ) {
+               if ( Hooks::run( 'ArticleContentOnDiff', [ $this, $out ] ) ) {
                        $this->loadNewText();
                        $out->setRevisionId( $this->mNewid );
                        $out->setRevisionTimestamp( $this->mNewRev->getTimestamp() );
@@ -584,7 +584,7 @@ class DifferenceEngine extends ContextSource {
                                // This needs to be synchronised with Article::showCssOrJsPage(), which sucks
                                // Give hooks a chance to customise the output
                                // @todo standardize this crap into one function
-                               if ( ContentHandler::runLegacyHooks( 'ShowRawCssJs', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
+                               if ( ContentHandler::runLegacyHooks( 'ShowRawCssJs', [ $this->mNewContent, $this->mNewPage, $out ] ) ) {
                                        // NOTE: deprecated hook, B/C only
                                        // use the content object's own rendering
                                        $cnt = $this->mNewRev->getContent();
@@ -593,9 +593,9 @@ class DifferenceEngine extends ContextSource {
                                                $out->addParserOutputContent( $po );
                                        }
                                }
-                       } elseif ( !Hooks::run( 'ArticleContentViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
+                       } elseif ( !Hooks::run( 'ArticleContentViewCustom', [ $this->mNewContent, $this->mNewPage, $out ] ) ) {
                                // Handled by extension
-                       } elseif ( !ContentHandler::runLegacyHooks( 'ArticleViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
+                       } elseif ( !ContentHandler::runLegacyHooks( 'ArticleViewCustom', [ $this->mNewContent, $this->mNewPage, $out ] ) ) {
                                // NOTE: deprecated hook, B/C only
                                // Handled by extension
                        } else {
@@ -847,7 +847,7 @@ class DifferenceEngine extends ContextSource {
                $result = $this->textDiff( $otext, $ntext );
 
                $time = microtime( true ) - $time;
-               $this->getStats()->timing( 'diff_time', $time );
+               $this->getStats()->timing( 'diff_time', $time * 1000 );
 
                return $result;
        }
index f3c2abf..1565b49 100644 (file)
@@ -1158,7 +1158,7 @@ class FileRepo {
         * Options to $options include:
         *   - headers : name/value map of HTTP headers to use in response to GET/HEAD requests
         *
-        * @param string $srcPath The source file system path, storage path, or URL
+        * @param string|FSFile $src The source file system path, storage path, or URL
         * @param string $dstRel The destination relative path
         * @param string $archiveRel The relative path where the existing file is to
         *   be archived, if there is one. Relative to the public zone root.
@@ -1168,12 +1168,12 @@ class FileRepo {
         * @return FileRepoStatus
         */
        public function publish(
-               $srcPath, $dstRel, $archiveRel, $flags = 0, array $options = []
+               $src, $dstRel, $archiveRel, $flags = 0, array $options = []
        ) {
                $this->assertWritableRepo(); // fail out if read-only
 
                $status = $this->publishBatch(
-                       [ [ $srcPath, $dstRel, $archiveRel, $options ] ], $flags );
+                       [ [ $src, $dstRel, $archiveRel, $options ] ], $flags );
                if ( $status->successCount == 0 ) {
                        $status->ok = false;
                }
@@ -1212,7 +1212,9 @@ class FileRepo {
                $sourceFSFilesToDelete = []; // cleanup for disk source files
                // Validate each triplet and get the store operation...
                foreach ( $ntuples as $ntuple ) {
-                       list( $srcPath, $dstRel, $archiveRel ) = $ntuple;
+                       list( $src, $dstRel, $archiveRel ) = $ntuple;
+                       $srcPath = ( $src instanceof FSFile ) ? $src->getPath() : $src;
+
                        $options = isset( $ntuple[3] ) ? $ntuple[3] : [];
                        // Resolve source to a storage path if virtual
                        $srcPath = $this->resolveToStoragePath( $srcPath );
@@ -1275,7 +1277,7 @@ class FileRepo {
                        } else { // FS source path
                                $operations[] = [
                                        'op' => 'store',
-                                       'src' => $srcPath,
+                                       'src' => $src, // prefer FSFile objects
                                        'dst' => $dstPath,
                                        'overwrite' => true, // replace current
                                        'headers' => $headers
index 5e9a4a9..d24aa24 100644 (file)
@@ -532,7 +532,7 @@ class LocalRepo extends FileRepo {
        }
 
        public function publish(
-               $srcPath,
+               $src,
                $dstRel,
                $archiveRel,
                $flags = 0,
index 6a1bb92..433e395 100644 (file)
@@ -1802,7 +1802,7 @@ abstract class File implements IDBAccessObject {
         * Options to $options include:
         *   - headers : name/value map of HTTP headers to use in response to GET/HEAD requests
         *
-        * @param string $srcPath Local filesystem path to the source image
+        * @param string|FSFile $src Local filesystem path to the source image
         * @param int $flags A bitwise combination of:
         *   File::DELETE_SOURCE    Delete the source file, i.e. move rather than copy
         * @param array $options Optional additional parameters
@@ -1812,7 +1812,7 @@ abstract class File implements IDBAccessObject {
         * STUB
         * Overridden by LocalFile
         */
-       function publish( $srcPath, $flags = 0, array $options = [] ) {
+       function publish( $src, $flags = 0, array $options = [] ) {
                $this->readOnlyError();
        }
 
index c97f38f..29b5891 100644 (file)
@@ -915,6 +915,7 @@ class LocalFile extends File {
                // Purge any custom thumbnail caches
                Hooks::run( 'LocalFilePurgeThumbnails', [ $this, $archiveName ] );
 
+               // Delete thumbnails
                $dir = array_shift( $files );
                $this->purgeThumbList( $dir, $files );
 
@@ -931,7 +932,6 @@ class LocalFile extends File {
         * @param array $options
         */
        public function purgeThumbnails( $options = [] ) {
-               // Delete thumbnails
                $files = $this->getThumbnails();
                // Always purge all files from CDN regardless of handler filters
                $urls = [];
@@ -951,6 +951,7 @@ class LocalFile extends File {
                // Purge any custom thumbnail caches
                Hooks::run( 'LocalFilePurgeThumbnails', [ $this, false ] );
 
+               // Delete thumbnails
                $dir = array_shift( $files );
                $this->purgeThumbList( $dir, $files );
 
@@ -1108,7 +1109,7 @@ class LocalFile extends File {
 
        /**
         * Upload a file and record it in the DB
-        * @param string $srcPath Source storage path, virtual URL, or filesystem path
+        * @param string|FSFile $src Source storage path, virtual URL, or filesystem path
         * @param string $comment Upload description
         * @param string $pageText Text to use for the new description page,
         *   if a new description page is created
@@ -1124,7 +1125,7 @@ class LocalFile extends File {
         * @return FileRepoStatus On success, the value member contains the
         *     archive name, or an empty string if it was a new file.
         */
-       function upload( $srcPath, $comment, $pageText, $flags = 0, $props = false,
+       function upload( $src, $comment, $pageText, $flags = 0, $props = false,
                $timestamp = false, $user = null, $tags = []
        ) {
                global $wgContLang;
@@ -1133,6 +1134,7 @@ class LocalFile extends File {
                        return $this->readOnlyFatalStatus();
                }
 
+               $srcPath = ( $src instanceof FSFile ) ? $src->getPath() : $src;
                if ( !$props ) {
                        if ( $this->repo->isVirtualUrl( $srcPath )
                                || FileBackend::isStoragePath( $srcPath )
@@ -1158,7 +1160,7 @@ class LocalFile extends File {
                // non-nicely (dangling multi-byte chars, non-truncated version in cache).
                $comment = $wgContLang->truncate( $comment, 255 );
                $this->lock(); // begin
-               $status = $this->publish( $srcPath, $flags, $options );
+               $status = $this->publish( $src, $flags, $options );
 
                if ( $status->successCount >= 2 ) {
                        // There will be a copy+(one of move,copy,store).
@@ -1523,15 +1525,15 @@ class LocalFile extends File {
         * The archive name should be passed through to recordUpload for database
         * registration.
         *
-        * @param string $srcPath Local filesystem path or virtual URL to the source image
+        * @param string|FSFile $src Local filesystem path or virtual URL to the source image
         * @param int $flags A bitwise combination of:
         *     File::DELETE_SOURCE    Delete the source file, i.e. move rather than copy
         * @param array $options Optional additional parameters
         * @return FileRepoStatus On success, the value member contains the
         *     archive name, or an empty string if it was a new file.
         */
-       function publish( $srcPath, $flags = 0, array $options = [] ) {
-               return $this->publishTo( $srcPath, $this->getRel(), $flags, $options );
+       function publish( $src, $flags = 0, array $options = [] ) {
+               return $this->publishTo( $src, $this->getRel(), $flags, $options );
        }
 
        /**
@@ -1541,7 +1543,7 @@ class LocalFile extends File {
         * The archive name should be passed through to recordUpload for database
         * registration.
         *
-        * @param string $srcPath Local filesystem path or virtual URL to the source image
+        * @param string|FSFile $src Local filesystem path or virtual URL to the source image
         * @param string $dstRel Target relative path
         * @param int $flags A bitwise combination of:
         *     File::DELETE_SOURCE    Delete the source file, i.e. move rather than copy
@@ -1549,7 +1551,9 @@ class LocalFile extends File {
         * @return FileRepoStatus On success, the value member contains the
         *     archive name, or an empty string if it was a new file.
         */
-       function publishTo( $srcPath, $dstRel, $flags = 0, array $options = [] ) {
+       function publishTo( $src, $dstRel, $flags = 0, array $options = [] ) {
+               $srcPath = ( $src instanceof FSFile ) ? $src->getPath() : $src;
+
                $repo = $this->getRepo();
                if ( $repo->getReadOnlyReason() !== false ) {
                        return $this->readOnlyFatalStatus();
@@ -1563,9 +1567,9 @@ class LocalFile extends File {
                if ( $repo->hasSha1Storage() ) {
                        $sha1 = $repo->isVirtualUrl( $srcPath )
                                ? $repo->getFileSha1( $srcPath )
-                               : File::sha1Base36( $srcPath );
+                               : FSFile::getSha1Base36FromPath( $srcPath );
                        $dst = $repo->getBackend()->getPathForSHA1( $sha1 );
-                       $status = $repo->quickImport( $srcPath, $dst );
+                       $status = $repo->quickImport( $src, $dst );
                        if ( $flags & File::DELETE_SOURCE ) {
                                unlink( $srcPath );
                        }
index 1f077a4..6606ca3 100644 (file)
@@ -101,11 +101,11 @@ class HTMLAutoCompleteSelectField extends HTMLTextField {
        }
 
        // FIXME Ewww, this shouldn't be adding any attributes not requested in $list :(
-       public function getAttributes( array $list, array $mappings = null ) {
+       public function getAttributes( array $list ) {
                $attribs = [
                        'type' => 'text',
                        'data-autocomplete' => FormatJson::encode( array_keys( $this->autocomplete ) ),
-               ] + parent::getAttributes( $list, $mappings );
+               ] + parent::getAttributes( $list );
 
                if ( $this->getOptions() ) {
                        $attribs['data-hide-if'] = FormatJson::encode(
index 211089f..16417fc 100644 (file)
@@ -56,6 +56,8 @@ class HTMLButtonField extends HTMLFormField {
                        $this->buttonLabel = $info['buttonlabel-raw'];
                }
 
+               $this->setShowEmptyLabel( false );
+
                parent::__construct( $info );
        }
 
@@ -104,7 +106,9 @@ class HTMLButtonField extends HTMLFormField {
                        'id' => $this->mID,
                        'flags' => $this->mFlags,
                        'useInputTag' => $this->isBadIE(),
-               ] + $this->getAttributes( [ 'disabled', 'tabindex' ], [ 'tabindex' => 'tabIndex' ] ) );
+               ] + OOUI\Element::configFromHtmlAttributes(
+                       $this->getAttributes( [ 'disabled', 'tabindex' ] )
+               ) );
        }
 
        protected function needsLabel() {
index 13f30c2..a59b15e 100644 (file)
@@ -56,9 +56,8 @@ class HTMLCheckField extends HTMLFormField {
                $attr['id'] = $this->mID;
                $attr['name'] = $this->mName;
 
-               $attr += $this->getAttributes(
-                       [ 'disabled', 'tabindex' ],
-                       [ 'tabindex' => 'tabIndex' ]
+               $attr += OOUI\Element::configFromHtmlAttributes(
+                       $this->getAttributes( [ 'disabled', 'tabindex' ] )
                );
 
                if ( $this->mClass !== '' ) {
index 6a4bec8..9f67233 100644 (file)
@@ -85,13 +85,7 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
                $rows = $this->mParams['rows'];
                $columns = $this->mParams['columns'];
 
-               $mappings = [];
-
-               if ( $this->mParent instanceof OOUIHTMLForm ) {
-                       $mappings['tabindex'] = 'tabIndex';
-               }
-
-               $attribs = $this->getAttributes( [ 'disabled', 'tabindex' ], $mappings );
+               $attribs = $this->getAttributes( [ 'disabled', 'tabindex' ] );
 
                // Build the column headers
                $headerContents = Html::rawElement( 'td', [], '&#160;' );
@@ -156,8 +150,9 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
                        return new OOUI\CheckboxInputWidget( [
                                'name' => "{$this->mName}[]",
                                'selected' => $checked,
-                               'value' => $attribs['value'],
-                       ] + $attribs );
+                       ] + OOUI\Element::configFromHtmlAttributes(
+                               $attribs
+                       ) );
                } else {
                        $checkbox = Xml::check( "{$this->mName}[]", $checked, $attribs );
                        if ( $this->mParent->getConfig()->get( 'UseMediaWikiUIEverywhere' ) ) {
index a0f248f..778aedb 100644 (file)
  */
 class HTMLComboboxField extends HTMLTextField {
        // FIXME Ewww, this shouldn't be adding any attributes not requested in $list :(
-       public function getAttributes( array $list, array $mappings = null ) {
+       public function getAttributes( array $list ) {
                $attribs = [
                        'type' => 'text',
                        'list' => $this->mName . '-datalist',
-               ] + parent::getAttributes( $list, $mappings );
+               ] + parent::getAttributes( $list );
 
                return $attribs;
        }
@@ -36,7 +36,9 @@ class HTMLComboboxField extends HTMLTextField {
        function getInputOOUI( $value ) {
                $disabled = false;
                $allowedParams = [ 'tabindex' ];
-               $attribs = $this->getAttributes( $allowedParams, [ 'tabindex' => 'tabIndex' ] );
+               $attribs = OOUI\Element::configFromHtmlAttributes(
+                       $this->getAttributes( $allowedParams )
+               );
 
                if ( $this->mClass !== '' ) {
                        $attribs['classes'] = [ $this->mClass ];
index ebbe323..a9c7632 100644 (file)
@@ -610,12 +610,17 @@ abstract class HTMLFormField {
                $config = [
                        'classes' => [ "mw-htmlform-field-$fieldType", $this->mClass ],
                        'align' => $this->getLabelAlignOOUI(),
-                       'label' => new OOUI\HtmlSnippet( $this->getLabel() ),
                        'help' => $helpText !== null ? new OOUI\HtmlSnippet( $helpText ) : null,
                        'errors' => $errors,
                        'infusable' => $infusable,
                ];
 
+               // the element could specify, that the label doesn't need to be added
+               $label = $this->getLabel();
+               if ( $label ) {
+                       $config['label'] = new OOUI\HtmlSnippet( $label );
+               }
+
                return $this->getFieldLayoutOOUI( $inputField, $config );
        }
 
@@ -912,45 +917,23 @@ abstract class HTMLFormField {
                return Linker::tooltipAndAccesskeyAttribs( $this->mParams['tooltip'] );
        }
 
-       /**
-        * Get a translated key if necessary.
-        * @param array|null $mappings Array of mappings, 'original' => 'translated'
-        * @param string $key
-        * @return string
-        */
-       protected function getMappedKey( $mappings, $key ) {
-               if ( !is_array( $mappings ) ) {
-                       return $key;
-               }
-
-               if ( !empty( $mappings[$key] ) ) {
-                       return $mappings[$key];
-               }
-
-               return $key;
-       }
-
        /**
         * Returns the given attributes from the parameters
         *
         * @param array $list List of attributes to get
-        * @param array $mappings Optional - Key/value map of attribute names to use
-        *   instead of the ones passed in.
         * @return array Attributes
         */
-       public function getAttributes( array $list, array $mappings = null ) {
+       public function getAttributes( array $list ) {
                static $boolAttribs = [ 'disabled', 'required', 'autofocus', 'multiple', 'readonly' ];
 
                $ret = [];
                foreach ( $list as $key ) {
-                       $mappedKey = $this->getMappedKey( $mappings, $key );
-
                        if ( in_array( $key, $boolAttribs ) ) {
                                if ( !empty( $this->mParams[$key] ) ) {
-                                       $ret[$mappedKey] = $mappedKey;
+                                       $ret[$key] = '';
                                }
                        } elseif ( isset( $this->mParams[$key] ) ) {
-                               $ret[$mappedKey] = $this->mParams[$key];
+                               $ret[$key] = $this->mParams[$key];
                        }
                }
 
index 272af15..bcb07bd 100644 (file)
@@ -19,7 +19,7 @@ class HTMLFormFieldWithButton extends HTMLFormField {
        protected $mButtonValue;
 
        /** @var string $mButtonType Value for the button in this field */
-       protected $mButtonFlags = [ 'primary', 'progressive' ];
+       protected $mButtonFlags = [ 'progressive' ];
 
        public function __construct( $info ) {
                if ( isset( $info['buttonclass'] ) ) {
@@ -59,7 +59,9 @@ class HTMLFormFieldWithButton extends HTMLFormField {
                        'type' => $this->mButtonType,
                        'label' => $this->mButtonValue,
                        'flags' => $this->mButtonFlags,
-               ] );
+               ] + OOUI\Element::configFromHtmlAttributes(
+                       $this->getAttributes( [ 'disabled', 'tabindex' ] )
+               ) );
        }
 
        /**
index 251bb05..1aaa3e8 100644 (file)
@@ -72,8 +72,9 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                                new OOUI\CheckboxInputWidget( [
                                        'name' => "{$this->mName}[]",
                                        'selected' => $checked,
-                                       'value' => $attribs['value'],
-                               ] + $attribs ),
+                               ] + OOUI\Element::configFromHtmlAttributes(
+                                       $attribs
+                               ) ),
                                [
                                        'label' => $label,
                                        'align' => 'inline',
index ecca6ff..12a8a1f 100644 (file)
@@ -53,7 +53,9 @@ class HTMLRadioField extends HTMLFormField {
                        'value' => $value,
                        'options' => $options,
                        'classes' => 'mw-htmlform-flatlist-item',
-               ] + $this->getAttributes( [ 'disabled', 'tabindex' ], [ 'tabindex' => 'tabIndex' ] ) );
+               ] + OOUI\Element::configFromHtmlAttributes(
+                       $this->getAttributes( [ 'disabled', 'tabindex' ] )
+               ) );
        }
 
        function formatOptions( $options, $value ) {
index 6191665..b6ad46c 100644 (file)
@@ -45,7 +45,9 @@ class HTMLSelectField extends HTMLFormField {
        function getInputOOUI( $value ) {
                $disabled = false;
                $allowedParams = [ 'tabindex' ];
-               $attribs = $this->getAttributes( $allowedParams, [ 'tabindex' => 'tabIndex' ] );
+               $attribs = OOUI\Element::configFromHtmlAttributes(
+                       $this->getAttributes( $allowedParams )
+               );
 
                if ( $this->mClass !== '' ) {
                        $attribs['classes'] = [ $this->mClass ];
index b05fd7c..973f1cb 100644 (file)
@@ -66,10 +66,9 @@ class HTMLTextAreaField extends HTMLFormField {
                        'autofocus',
                ];
 
-               $attribs += $this->getAttributes( $allowedParams, [
-                       'tabindex' => 'tabIndex',
-                       'readonly' => 'readOnly',
-               ] );
+               $attribs += OOUI\Element::configFromHtmlAttributes(
+                       $this->getAttributes( $allowedParams )
+               );
 
                return new OOUI\TextInputWidget( [
                        'id' => $this->mID,
index fb7584b..4d5bcab 100644 (file)
@@ -107,11 +107,9 @@ class HTMLTextField extends HTMLFormField {
                        'type',
                ];
 
-               $attribs += $this->getAttributes( $allowedParams, [
-                       'maxlength' => 'maxLength',
-                       'readonly' => 'readOnly',
-                       'tabindex' => 'tabIndex',
-               ] );
+               $attribs += OOUI\Element::configFromHtmlAttributes(
+                       $this->getAttributes( $allowedParams )
+               );
 
                $type = $this->getType( $attribs );
 
index 03f091b..6a20abc 100644 (file)
@@ -63,18 +63,18 @@ abstract class DatabaseUpdater {
        protected $shared = false;
 
        /**
-        * Scripts to run after database update
+        * @var string[] Scripts to run after database update
         * Should be a subclass of LoggedUpdateMaintenance
         */
        protected $postDatabaseUpdateMaintenance = [
-               'DeleteDefaultMessages',
-               'PopulateRevisionLength',
-               'PopulateRevisionSha1',
-               'PopulateImageSha1',
-               'FixExtLinksProtocolRelative',
-               'PopulateFilearchiveSha1',
-               'PopulateBacklinkNamespace',
-               'FixDefaultJsonContentPages'
+               DeleteDefaultMessages::class,
+               PopulateRevisionLength::class,
+               PopulateRevisionSha1::class,
+               PopulateImageSha1::class,
+               FixExtLinksProtocolRelative::class,
+               PopulateFilearchiveSha1::class,
+               PopulateBacklinkNamespace::class,
+               FixDefaultJsonContentPages::class,
        ];
 
        /**
@@ -375,7 +375,7 @@ abstract class DatabaseUpdater {
        /**
         * @since 1.17
         *
-        * @return array
+        * @return string[]
         */
        public function getPostDatabaseUpdateMaintenance() {
                return $this->postDatabaseUpdateMaintenance;
index b3675f8..bdaf4c8 100644 (file)
@@ -68,6 +68,7 @@ class MssqlUpdater extends DatabaseUpdater {
                        // 1.27
                        [ 'dropTable', 'msg_resource_links' ],
                        [ 'dropTable', 'msg_resource' ],
+                       [ 'addField', 'watchlist', 'wl_id', 'patch-watchlist-wl_id.sql' ],
                ];
        }
 
index 154f7c3..9a39b77 100644 (file)
@@ -279,6 +279,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        [ 'dropTable', 'msg_resource_links' ],
                        [ 'dropTable', 'msg_resource' ],
                        [ 'addTable', 'bot_passwords', 'patch-bot_passwords.sql' ],
+                       [ 'addField', 'watchlist', 'wl_id', 'patch-watchlist-wl_id.sql' ],
                ];
        }
 
index 02e59f5..334256b 100644 (file)
@@ -111,6 +111,7 @@ class OracleUpdater extends DatabaseUpdater {
                        // 1.27
                        [ 'dropTable', 'msg_resource_links' ],
                        [ 'dropTable', 'msg_resource' ],
+                       [ 'addField', 'watchlist', 'wl_id', 'patch-watchlist-wl_id.sql' ],
 
                        // KEEP THIS AT THE BOTTOM!!
                        [ 'doRebuildDuplicateFunction' ],
index 038c953..a3b50ac 100644 (file)
@@ -67,6 +67,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        [ 'addSequence', 'filearchive', 'fa_id', 'filearchive_fa_id_seq' ],
                        [ 'addSequence', 'archive', false, 'archive_ar_id_seq' ],
                        [ 'addSequence', 'externallinks', false, 'externallinks_el_id_seq' ],
+                       [ 'addSequence', 'watchlist', false, 'watchlist_wl_id_seq' ],
 
                        # new tables
                        [ 'addTable', 'category', 'patch-category.sql' ],
@@ -428,6 +429,10 @@ class PostgresUpdater extends DatabaseUpdater {
                        // 1.27
                        [ 'dropTable', 'msg_resource_links' ],
                        [ 'dropTable', 'msg_resource' ],
+                       [
+                               'addPgField', 'watchlist', 'wl_id',
+                               "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('watchlist_wl_id_seq')"
+                       ],
                ];
        }
 
index 7db4f1a..99ab4e5 100644 (file)
@@ -148,6 +148,7 @@ class SqliteUpdater extends DatabaseUpdater {
                        [ 'dropTable', 'msg_resource_links' ],
                        [ 'dropTable', 'msg_resource' ],
                        [ 'addTable', 'bot_passwords', 'patch-bot_passwords.sql' ],
+                       [ 'addField', 'watchlist', 'wl_id', 'patch-watchlist-wl_id.sql' ],
                ];
        }
 
index b6bc521..4d16d45 100644 (file)
        "config-help": "مساعدة",
        "config-help-tooltip": "اضغط للتوسيع",
        "config-nofile": "لا يمكن العثور على الملف \"$1\". هل حُذف؟",
-       "mainpagetext": "'''تم تثبيت ميدياويكي بنجاح.'''",
+       "mainpagetext": "<strong>تم تثبيت ميدياويكي بنجاح.</strong>",
        "mainpagedocfooter": "استشر [//meta.wikimedia.org/wiki/Help:Contents دليل المستخدم] لمعلومات حول استخدام برنامج الويكي.\n\n== البداية ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings قائمة إعدادات الضبط]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ أسئلة متكررة حول ميدياويكي]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce القائمة البريدية الخاصة بإصدار ميدياويكي]"
 }
index 8165da2..efaf3cf 100644 (file)
@@ -3,7 +3,9 @@
                "authors": [
                        "Haqmar",
                        "Seb35",
-                       "Рустам Нурыев"
+                       "Рустам Нурыев",
+                       "Sagan",
+                       "Азат Хәлилов"
                ]
        },
        "config-desc": "MediaWiki йөкләүсе",
        "config-localsettings-cli-upgrade": "<code>LocalSettings.php</code> файлы бар. \nБыл күрһәтмәне яңыртыу өсөн <code>update.php</code> эшләтеп ебәрегеҙ.",
        "config-localsettings-key": "Яңыртыу асҡысы:",
        "config-localsettings-badkey": "Дөрөҫ булмаған асҡыс күрһәттегеҙ",
+       "config-upgrade-key-missing": "Ҡуйылған MediaWiki копияһы булыуы асыҡланды. Яңыртыу өсөн файл аҙағында ҡуйығыҙ: <code>LocalSettings.php</code>:\n\n$1",
+       "config-localsettings-incomplete": "Ғәмәлдәге <code>LocalSettings.php</code> файла тулған. $1 билдәләнмәгән. Зинһар өсөн <code>LocalSettings.php</code> кодын үҙгәртегеҙ. Һуңынан ошонда сиртегеҙ «{{int:Config-continue}}».",
+       "config-localsettings-connection-error": "<code>LocalSettings.php</code> көйләүҙәрендә хата китте йәки <code>AdminSettings.php</code> көйләүҙәрендә хата. Зинһар өсөн, көйләүҙәрҙе тәҙәтегеҙ, яңынан эшләп ҡарағыҙ\n$1",
        "config-session-error": "Эш башлағанда сыҡҡан хата: $1",
+       "config-session-expired": "Һеҙҙең ваҡыт үтте. Сессия $1 оҙонлоғона көйләнгән. Уны оҙайтыу өсөн php.ini. эсендә <code>session.gc_maxlifetime</code> кодын үҙгәртегеҙ.\nУрынлаштырыу процессын яңынан башлағыҙ.",
+       "config-no-session": "Был сессия юғалған!\nҮҙегеҙҙең php.ini тикшерегеҙ, \n<code>session.save_path</code> коды тейешле каталогҡа урынлаштырылған икәненә ышынғыҙ.",
        "config-your-language": "Һеҙҙең тел:",
+       "config-your-language-help": "Урынлаштырыу процессы ҡулланған телде һайлағыҙ.",
        "config-wiki-language": "Вики телдәре:",
+       "config-wiki-language-help": "Викила ҡулланылған телде һайлағыҙ.",
        "config-back": "← Кире",
        "config-continue": "Дауам итергә →",
        "config-page-language": "Тел",
        "config-page-welcome": "MediaWiki-ға рәхим итегеҙ!",
        "config-page-dbconnect": "Мәғлүмәт болона тоташыу",
+       "config-page-upgrade": "Ғәмәлдәге урынлаштырғанды яңыртыу.",
        "config-page-dbsettings": "Мәғлүмәт болон көйләү",
        "config-page-name": "Исем",
        "config-page-options": "Көйләүҙәр",
+       "config-page-install": "Урынлаштырыу",
        "config-page-complete": "Тамам!",
+       "config-page-restart": "Урынлаштырыуҙы яңынан башларға",
        "config-page-readme": "Мине уҡы",
        "config-page-releasenotes": "Өлгө тураһында мәғлүмәт",
        "config-page-copying": "Рөхсәтнәмә",
        "config-page-upgradedoc": "Яңыртыу",
+       "config-page-existingwiki": "Ғәмәлдәге вики",
+       "config-help-restart": "Һеҙ үҙегеҙ индергән һәм  һаҡланған әлеге мәғлүмәттәрҙе юйып, урынлаштырыуҙың яңы процессын ебәрергә теләйһегеҙме?",
        "config-restart": "Эйе, яңынан башларға",
+       "config-welcome": "=== Даирәне тикшереү ===",
        "config-help": "белешмә",
        "mainpagetext": "«MediaWiki» уңышлы рәүештә ҡоролдо.",
        "mainpagedocfooter": "Был вики менән эшләү тураһында мәғлүмәтте [//meta.wikimedia.org/wiki/Help:Contents ошонда] табып була.\n\n== Файҙалы сығанаҡтар ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Көйләүҙәр исемлеге (инг.)];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki тураһында йыш бирелгән һорауҙар һәм яуаптар (инг.)];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-ның яңы версиялары тураһында хәбәрҙәр алып тороу].\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
index b3ab3bf..c9e96ed 100644 (file)
        "config-install-tables": "টেবিল তৈরি",
        "config-install-keys": "গোপন কি তৈরি",
        "config-help": "সাহায্য",
-       "mainpagetext": "'''মিডিয়াউইকি সফলভাবে ইন্সটল করা হয়েছে।'''",
+       "mainpagetext": "<strong>মিডিয়াউইকি ইনস্টল করা হয়েছে।</strong>",
        "mainpagedocfooter": "কীভাবে উইকি সফটওয়্যারটি ব্যবহারকার করবেন, তা জানতে [//meta.wikimedia.org/wiki/Help:Contents ব্যবহারকারী সহায়িকা] দেখুন।\n\n== কোথা থেকে শুরু করবেন ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings কনফিগারেশন সেটিংস তালিকা]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ প্রশ্নোত্তরে মিডিয়াউইকি]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়াউইকি মুক্তির মেইলিং লিস্ট]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources আপনার ভাষার জন্য মিডিয়াউইকি স্থানীয়করণ করুন]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam আপনার উইকিতে স্প্যামের সাথে লড়াই করার উপায় সম্পর্কে জানুন]"
 }
index de1f03f..ddbaa19 100644 (file)
@@ -7,7 +7,8 @@
                        "아라",
                        "Matěj Grabovský",
                        "Paxt",
-                       "Matěj Suchánek"
+                       "Matěj Suchánek",
+                       "LordMsz"
                ]
        },
        "config-desc": "Instalační program pro MediaWiki",
        "config-install-mainpage": "Vytváří se počáteční obsah hlavní strany",
        "config-install-extension-tables": "Vytvářejí se tabulky pro zapnutá rozšíření",
        "config-install-mainpage-failed": "Nepodařilo se vložit hlavní stranu: $1",
-       "config-install-done": "'''Gratulujeme!'''\nÚspěšně jste nainstalovali MediaWiki.\n\nInstalátor vytvořil soubor <code>LocalSettings.php</code>.\nTen obsahuje veškerou vaši konfiguraci.\n\nBudete si ho muset stáhnout a uložit do základního adresáře vaší instalace wiki (do stejného adresáře jako soubor index.php). Stažení souboru se mělo spustit automaticky.\n\nPokud se vám stažení nenabídlo nebo jste ho zrušili, můžete ho spustit znovu kliknutím na následující odkaz:\n\n$3\n\n'''Poznámka''': Pokud to neuděláte hned, tento vygenerovaný konfigurační soubor nebude později dostupný, pokud instalaci opustíte, aniž byste si ho stáhli.\n\nAž to dokončíte, můžete '''[$2 vstoupit do své wiki]'''.",
+       "config-install-done": "<strong>Gratulujeme!</strong>\nNainstalovali jste MediaWiki.\n\nInstalátor vytvořil soubor <code>LocalSettings.php</code>.\nTen obsahuje veškerou vaši konfiguraci.\n\nBudete si ho muset stáhnout a uložit do základního adresáře vaší instalace wiki (do stejného adresáře jako soubor index.php). Stažení souboru se mělo spustit automaticky.\n\nPokud se vám stažení nenabídlo nebo jste ho zrušili, můžete ho spustit znovu kliknutím na následující odkaz:\n\n$3\n\n<strong>Poznámka</strong>: Pokud to neuděláte hned, tento vygenerovaný konfigurační soubor nebude později dostupný, pokud instalaci opustíte, aniž byste si ho stáhli.\n\nAž to dokončíte, můžete <strong>[$2 vstoupit do své wiki]</strong>.",
        "config-download-localsettings": "Stáhnout <code>LocalSettings.php</code>",
        "config-help": "nápověda",
        "config-help-tooltip": "rozbalíte kliknutím",
        "config-nofile": "Soubor „$1“ nelze nalézt. Byl smazán?",
        "config-extension-link": "Věděli jste, že vaše wiki podporuje [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions rozšíření]?\n\nMůžete si prohlédnout [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category seznam rozšíření po kategoriích].",
-       "mainpagetext": "'''MediaWiki byla úspěšně nainstalována.'''",
+       "mainpagetext": "<strong>MediaWiki byla úspěšně nainstalována.</strong>",
        "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents Uživatelská příručka] vám napoví, jak používat MediaWiki.\n\n== Začínáme ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Nastavení konfigurace]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Často kladené otázky o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-mailová konference oznámení MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Překlad MediaWiki do vašeho jazyka]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Naučte se bojovat se spamem na vaší wiki]"
 }
index 419b986..2516a16 100644 (file)
        "config-help-tooltip": "Zum Expandieren klicken",
        "config-nofile": "Die Datei „$1“ konnte nicht gefunden werden. Wurde sie gelöscht?",
        "config-extension-link": "Wusstest du, dass dein Wiki die Nutzung von [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions Erweiterungen] unterstützt?\n\nDu kannst [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Erweiterungen nach Kategorie] durchsuchen.",
-       "mainpagetext": "'''MediaWiki wurde erfolgreich installiert.'''",
+       "mainpagetext": "<strong>MediaWiki wurde installiert.</strong>",
        "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalisiere MediaWiki für deine Sprache]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Erfahre, wie du Spam auf deinem Wiki bekämpfen kannst]"
 }
index 223955d..a083210 100644 (file)
@@ -17,7 +17,8 @@
                        "SMAUG",
                        "SuperPete",
                        "McSalama",
-                       "Jaakkoh"
+                       "Jaakkoh",
+                       "Mikahama"
                ]
        },
        "config-desc": "MediaWiki-asennin",
        "config-type-sqlite": "SQLite",
        "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
+       "config-support-info": "MediaWiki tukee seuraavia tietokantajärjestelmiä:\n\n$1\n\nJos et näe tietokantajärjestelmää, jota yrität käyttää, listattuna alhaalla, seuraa yläpuolella olevia ohjeita tuen aktivoimiseksi.",
+       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] on MediaWikin ensisijainen kohde ja se on myös parhaiten tuettu. MediaWiki voi myös käyttää [{{int:version-db-mariadb-url}} MariaDB]- sekä [{{int:version-db-percona-url}} Percona Server]-järjestelmiä, jotka ovat MySQL-yhteensopivia. ([http://www.php.net/manual/en/mysqli.installation.php Miten käännetään PHP MySQL-tuella])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] on suosittu avoimen lähdekoodin tietokantajärjestelmä vaihtoehtona MySQL:lle. Tuessa saattaa olla pieniä puutteita, eikä sitä suositella käytettäväksi tuotantoympäristössä. ([http://www.php.net/manual/en/pgsql.installation.php Kuinka käännetään PHP PostgreSQL-tuella])",
+       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] on kevyt tietokantajärjestelmä, jota tuetaan hyvin. ([http://www.php.net/manual/en/pdo.installation.php Miten käännetään PHP SQLite-tuella], käyttää PDO:ta)",
+       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] on kaupallinen yritystietokanta. ([http://www.php.net/manual/en/oci8.installation.php Kuinka käännetään PHP OCI8-tuella])",
+       "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] on kaupallinen yritystietokanta Windowsille. ([http://www.php.net/manual/en/sqlsrv.installation.php Miten käännetään PHP SQLSRV-tuella])",
        "config-header-mysql": "MySQL-asetukset",
        "config-header-postgres": "PostgreSQL-asetukset",
        "config-header-sqlite": "SQLite-asetukset",
        "config-missing-db-name": "\"{{int:config-db-name}}\" on pakollinen.",
        "config-missing-db-host": "\"{{int:config-db-host}}\" on pakollinen.",
        "config-missing-db-server-oracle": "\"{{int:config-db-host-oracle}}\" on pakollinen.",
+       "config-invalid-db-server-oracle": "Virheellinen tietokanta TNS \"$1\".\nKäytä joko \"TNS Name\"- tai \"Easy Connect\" -tekstiä\n([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle metodien nimeäminen]).",
        "config-invalid-db-name": "”$1” ei kelpaa tietokannan nimeksi.\nKäytä ainoastaan kirjaimia (a-z, A-Z), numeroita (0-9), alaviivoja (_) ja tavuviivoja (-).",
        "config-invalid-db-prefix": "”$1” ei kelpaa tietokannan etuliitteeksi.\nKäytä ainoastaan kirjaimia (a-z, A-Z), numeroita (0-9), alaviivoja (_) ja tavuviivoja (-).",
        "config-connection-error": "$1.\n\nTarkista isäntä, käyttäjänimi, salasana ja yritä uudestaan.",
+       "config-invalid-schema": "Virheellinen skeema MediaWikille \"$1\".\nKäytä pelkkiä ASCII-kirjaimia (a-z, A-Z), numeroita (0-9) ja alaviivoja (_).",
+       "config-db-sys-create-oracle": "Asennusohjelma tukee ainoastaan SYSDBA-tunnuksen käyttämistä uuden tunnuksen luonnissa.",
        "config-postgres-old": "MediaWiki tarvitsee PostgreSQL:n version $1 tai uudemman. Nykyinen versio on $2.",
        "config-mssql-old": "Vaaditaan Microsoft SQL Server $1 tai uudempi. Sinulla on käytössä $2.",
        "config-sqlite-name-help": "Valitse nimi, joka yksilöi tämän wikin.\nÄlä käytä välilyöntejä tai viivoja.\nNimeä käytetään SQLite-tietokannan tiedostonimessä.",
index 5455cb7..d7b279f 100644 (file)
                        "Wladek92",
                        "Scoopfinder",
                        "Seb35",
-                       "Linedwell"
+                       "Linedwell",
+                       "Orlodrim",
+                       "Cl3m3n7",
+                       "C13m3n7"
                ]
        },
        "config-desc": "Le programme d’installation de MediaWiki",
        "config-install-mainpage": "Création de la page principale avec un contenu par défaut",
        "config-install-extension-tables": "Création de tables pour les extensions activées",
        "config-install-mainpage-failed": "Impossible d’insérer la page principale : $1",
-       "config-install-done": "'''Félicitations!'''\nVous avez réussi à installer MediaWiki.\n\nLe programme d'installation a généré un fichier <code>LocalSettings.php</code>. Il contient tous les paramètres de votre configuration.\n\nVous devrez le télécharger et le mettre à la racine de votre installation wiki (dans le même répertoire que index.php). Le téléchargement démarre automatiquement.\n\nSi le téléchargement n'a pas été offert, ou que vous l'avez annulé, vous pouvez démarrer à nouveau le téléchargement en cliquant ce lien :\n\n$3\n\n'''Note''': Si vous ne le faites pas maintenant, ce fichier de configuration généré ne sera pas disponible plus tard si vous quittez l'installation sans le télécharger.\n\nLorsque c'est fait, vous pouvez '''[$2 accéder à votre wiki]'''.",
+       "config-install-done": "<strong>Félicitations!</strong>\nVous avez installé MediaWiki.\n\nLe programme d'installation a généré un fichier <code>LocalSettings.php</code>. Il contient tous les paramètres de votre configuration.\n\nVous devrez le télécharger et le mettre à la racine de votre installation wiki (dans le même répertoire que index.php). Le téléchargement devrait démarrer automatiquement.\n\nSi le téléchargement n'a pas été proposé, ou que vous l'avez annulé, vous pouvez redémarrer le téléchargement en cliquant ce lien :\n\n$3\n\n<strong>Note :</strong> Si vous ne le faites pas maintenant, ce fichier de configuration généré ne sera pas disponible plus tard si vous quittez l'installation sans le télécharger.\n\nLorsque c'est fait, vous pouvez <strong>[$2 accéder à votre wiki]</strong> .",
        "config-download-localsettings": "Télécharger <code>LocalSettings.php</code>",
        "config-help": "aide",
        "config-help-tooltip": "cliquer pour agrandir",
        "config-nofile": "Le fichier « $1 » est introuvable. A-t-il été supprimé ?",
        "config-extension-link": "Saviez-vous que votre wiki supporte [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions des extensions] ?\n\nVous pouvez consulter les [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions par catégorie].",
-       "mainpagetext": "<strong>MediaWiki a été installé avec succès.</strong>",
+       "mainpagetext": "<strong>MediaWiki a été installé.</strong>",
        "mainpagedocfooter": "Consultez le [//meta.wikimedia.org/wiki/Help:Contents/fr Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki.\n\n== Pour démarrer ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste des paramètres de configuration]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/fr Questions courantes sur MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Apprendre comment lutter contre le pourriel dans votre wiki]"
 }
index 37b1b0a..7b9abdb 100644 (file)
        "config-install-mainpage": "Creando a páxina principal co contido por defecto",
        "config-install-extension-tables": "Creando as táboas para as extensións activadas",
        "config-install-mainpage-failed": "Non se puido inserir a páxina principal: $1",
-       "config-install-done": "<strong>Parabéns!</strong>\nInstalou correctamente MediaWiki.\n\nO programa de instalación xerou un ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contén toda a súa configuración.\n\nTerá que descargalo e poñelo na base da instalación do seu wiki (no mesmo directorio ca index.php). A descarga debería comezar automaticamente.\n\nSe non comezou a descarga ou se a cancelou, pode facer que comece de novo premendo na ligazón que aparece a continuación:\n\n$3\n\n<strong>Nota:</strong> Se non fai iso agora, este ficheiro de configuración xerado non estará dispoñible máis adiante se sae da instalación sen descargalo.\n\nCando faga todo isto, xa poderá <strong>[$2 entrar no seu wiki]</strong>.",
+       "config-install-done": "<strong>Parabéns!</strong>\nInstalou MediaWiki.\n\nO programa de instalación xerou un ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contén toda a súa configuración.\n\nTerá que descargalo e poñelo na base da instalación do seu wiki (no mesmo directorio ca index.php). A descarga debería comezar automaticamente.\n\nSe non comezou a descarga ou se a cancelou, pode facer que comece de novo premendo na ligazón que aparece a continuación:\n\n$3\n\n<strong>Nota:</strong> Se non fai iso agora, este ficheiro de configuración xerado non estará dispoñible máis adiante se sae da instalación sen descargalo.\n\nCando faga todo isto, xa poderá <strong>[$2 entrar no seu wiki]</strong>.",
        "config-download-localsettings": "Descargar o <code>LocalSettings.php</code>",
        "config-help": "axuda",
        "config-help-tooltip": "prema para expandir",
        "config-nofile": "Non se puido atopar o ficheiro \"$1\". Se cadra, foi borrado.",
        "config-extension-link": "Sabía que o seu wiki soporta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensións]?\n\nPode explorar as [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensións por categoría] ou a [//www.mediawiki.org/wiki/Extension_Matrix matriz de extensións] para ollar a lista completa de extensións.",
-       "mainpagetext": "<strong>MediaWiki instalouse correctamente.</strong>",
+       "mainpagetext": "<strong>Instalouse MediaWiki.</strong>",
        "mainpagedocfooter": "Consulte a [//meta.wikimedia.org/wiki/Help:Contents guía de usuario] para obter máis información sobre como usar o software wiki.\n\n== Primeiros pasos ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista das opcións de configuración]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas máis frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo dos lanzamentos de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localice MediaWiki á súa lingua]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprenda como combater a publicidade na súa wiki]"
 }
index 0ff33c1..5e15c8d 100644 (file)
        "config-no-db": "Non poteva trovar un driver appropriate pro le base de datos! Es necessari installar un driver de base de datos pro PHP.\nLe sequente {{PLURAL:$2|typo|typos}} de base de datos es supportate: $1.\n\nSi tu compilava PHP tu mesme, reconfigura lo con un cliente de base de datos activate, per exemplo, usante <code>./configure --with-mysqli</code>.\nSi tu installava PHP ex un pacchetto Debian o Ubuntu, tu debe etiam installar, per exemplo, le modulo <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Attention''': tu ha SQLite $1, que es inferior al version minimal requirite, $2. SQLite essera indisponibile.",
        "config-no-fts3": "'''Attention''': SQLite es compilate sin [//sqlite.org/fts3.html modulo FTS3]; functionalitate de recerca non essera disponibile in iste back-end.",
-       "config-register-globals-error": "<strong>Error: Le option <code>[http://php.net/register_globals register_globals]</code> de PHP es active.\nIllo debe esser disactivate pro continuar le installation.</strong>\nVide [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] pro obtener adjuta sur como facer lo.",
-       "config-magic-quotes-gpc": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] es active!</strong>\nIste option corrumpe le datos entrate de maniera imprevisibile.\nTu non pote installar o usar MediaWiki si iste option non es disactivate.",
-       "config-magic-quotes-runtime": "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] es active!'''\nIste option corrumpe le entrata de datos imprevisibilemente.\nTu non pote installar o usar MediaWiki si iste option non es disactivate.",
-       "config-magic-quotes-sybase": "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] es active!'''\nIste option corrumpe le entrata de datos imprevisibilemente.\nTu non pote installar o usar MediaWiki si iste option non es disactivate.",
        "config-mbstring": "'''Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] es active!'''\nIste option causa errores e pote corrumper datos imprevisibilemente.\nTu non pote installar o usar MediaWiki si iste option non es disactivate.",
-       "config-safe-mode": "'''Aviso:''' Le [http://www.php.net/features.safe-mode modo secur] de PHP es active.\nIsto pote causar problemas, particularmente si es usate le incargamento de files e le supporto de <code>math</code>.",
        "config-xml-bad": "Le modulo XML de PHP es mancante.\nMediaWiki require functiones de iste modulo e non functionara in iste configuration.\nEs possibile que tu debe installar le pacchetto RPM php-xml.",
        "config-pcre-old": "<strong>Fatal:</strong> PCRE $1 o plus tarde es necessari.\nTu binario de PHP binary es ligate con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Plus information].",
        "config-pcre-no-utf8": "'''Fatal''': Le modulo PCRE de PHP pare haber essite compilate sin supporto de PCRE_UTF8.\nMediaWiki require supporto de UTF-8 pro functionar correctemente.",
@@ -72,7 +67,6 @@
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] es installate",
        "config-apc": "[http://www.php.net/apc APC] es installate",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] es installate",
-       "config-no-cache": "'''Aviso:''' Non poteva trovar [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].\nLe cache de objectos non es activate.",
        "config-mod-security": "'''Attention''': [http://modsecurity.org/ mod_security] es active in tu servitor web. Si mal configurate, isto pote causar problemas pro MediaWiki o altere software que permitte al usatores de publicar contento arbitrari.\nConsulta le [http://modsecurity.org/documentation/ documentation de mod_security] o contacta le servicio de adjuta de tu host si tu incontra estranie errores.",
        "config-diff3-bad": "GNU diff3 non trovate.",
        "config-git": "Systema de controlo de version Git trovate: <code>$1</code>",
        "config-help-tooltip": "clicca pro displicar",
        "config-nofile": "Le file \"$1\" non poteva esser trovate. Ha illo essite delite?",
        "config-extension-link": "Sapeva tu que tu wiki supporta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nTu pote explorar le [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensiones per category] o le [//www.mediawiki.org/wiki/Extension_Matrix matrice de extensiones] pro vider le lista complete de extensiones.",
-       "mainpagetext": "'''MediaWiki ha essite installate con successo.'''",
+       "mainpagetext": "<strong>MediaWiki ha essite installate.</strong>",
        "mainpagedocfooter": "Consulta le [//meta.wikimedia.org/wiki/Help:Contents Guida del usator] pro informationes super le uso del software wiki.\n\n== Pro initiar ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de configurationes]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ a proposito de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de diffusion pro annuncios de nove versiones de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducer MediaWiki in tu lingua]"
 }
index f524b32..e0a7975 100644 (file)
@@ -5,14 +5,20 @@
                        "Sveinn í Felli"
                ]
        },
+       "config-desc": "Uppsetningarforrit fyrir MediaWiki",
+       "config-title": "MediaWiki $1 uppsetning",
        "config-information": "Upplýsingar",
+       "config-localsettings-key": "Uppfærslulykill:",
        "config-your-language": "Tungumálið þitt:",
        "config-your-language-help": "Veldu tungumál að nota við uppsetninguna.",
+       "config-wiki-language": "Tungumál á wiki:",
        "config-back": "← Til baka",
        "config-continue": "Halda áfram →",
        "config-page-language": "Tungumál",
        "config-page-welcome": "Velkomin í MediaWiki!",
        "config-page-dbconnect": "Tengjast gagnagrunni",
+       "config-page-upgrade": "Uppfæra núverandi kerfi",
+       "config-page-dbsettings": "Gagnagrunnsstillingar",
        "config-page-name": "Heiti",
        "config-page-options": "Valkostir",
        "config-page-install": "Setja upp",
        "config-page-releasenotes": "Athugasemdir með útgáfu",
        "config-page-copying": "Afritun",
        "config-page-upgradedoc": "Uppfærsla",
+       "config-page-existingwiki": "Fyrirliggjandi wiki",
+       "config-restart": "Já, endurræsa",
        "config-env-php": "PHP $1 er uppsett.",
        "config-env-hhvm": "HHVM $1 er uppsett.",
+       "config-diff3-bad": "GNU diff3 fannst ekki.",
+       "config-db-type": "Tegund gagnagrunns:",
+       "config-db-host": "Netþjónn gagnagrunns:",
+       "config-db-name": "Heiti gagnagrunns:",
+       "config-db-name-oracle": "Gagnagrunnsskema:",
+       "config-db-username": "Notandanafn á gagnagrunni:",
+       "config-db-password": "Lykilorð gagnagrunns:",
+       "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+       "config-type-mysql": "MySQL (eða samhæft)",
+       "config-type-postgres": "PostgreSQL",
+       "config-type-sqlite": "SQLite",
+       "config-type-oracle": "Oracle",
+       "config-type-mssql": "Microsoft SQL Server",
+       "config-regenerate": "Endurgera LocalSettings.php →",
+       "config-show-table-status": "<code>SHOW TABLE STATUS</code> beiðni mistókst!",
+       "config-db-web-account": "Gagnagrunnsreikningur fyrir vefaðgang",
+       "config-mysql-engine": "Gagnagrunnshýsing:",
+       "config-mysql-innodb": "InnoDB",
+       "config-mysql-myisam": "MyISAM",
+       "config-mysql-charset": "Stafatafla gagnagrunns:",
+       "config-mysql-binary": "Tvíundakerfis",
        "config-mysql-utf8": "UTF-8",
+       "config-mssql-auth": "Tegund auðkenningar:",
+       "config-mssql-sqlauth": "SQL Server auðkenning",
+       "config-mssql-windowsauth": "Windows auðkenning",
        "config-ns-generic": "Verkefni",
        "config-admin-name": "Notandanafnið þitt:",
        "config-admin-password": "Lykilorð:",
        "config-admin-password-confirm": "Lykilorðið aftur:",
        "config-admin-email": "Tölvupóstfang:",
-       "config-license-pd": "Almenningseign",
+       "config-profile": "Snið notandaréttinda:",
+       "config-profile-wiki": "Opið wiki",
+       "config-profile-no-anon": "Stofnun aðgangs krafist",
+       "config-profile-fishbowl": "Aðeins auðkenndir ritstjórar",
+       "config-profile-private": "Einkawiki",
+       "config-license": "Höfundaréttur og notkunarleyfi:",
+       "config-license-none": "Ekki síðufótur með notkunarleyfi",
+       "config-license-cc-by-sa": "Creative Commons: Höfundar getið - Deilist áfram",
+       "config-license-cc-by": "Creative Commons: Höfundar getið",
+       "config-license-cc-by-nc-sa": "Creative Commons: Höfundar getið - Ekki í ágóðaskyni - Deilist áfram",
+       "config-license-cc-0": "Creative Commons Zero leyfi (almenningseign)",
+       "config-license-gfdl": "Frjálsa GNU-handbókarleyfið, útgáfa 1.3 eða nýrri",
+       "config-license-pd": "Almenningseign (Public Domain)",
+       "config-license-cc-choose": "Veldu sérsniðið Creative Commons notkunarleyfi",
+       "config-extensions": "Viðbætur",
+       "config-skins": "Skinn",
        "config-install-step-done": "lokið",
        "config-install-step-failed": "mistókst",
+       "config-install-pg-commit": "Virkja breytingar",
+       "config-install-tables": "Töflur búnar til",
+       "config-download-localsettings": "Ná í <code>LocalSettings.php</code>",
+       "config-help": "hjálp",
+       "config-help-tooltip": "Smella til að þenja út",
        "mainpagetext": "'''Uppsetning á MediaWiki heppnaðist.'''",
        "mainpagedocfooter": "Ráðfærðu þig við [//meta.wikimedia.org/wiki/Help:Contents Notandahandbókina] fyrir frekari upplýsingar um notkun wiki-hugbúnaðarins.\n\n== Fyrir byrjendur ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Listi yfir uppsetningarstillingar]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki Algengar spurningar MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Póstlisti MediaWiki-útgáfa]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Læra hvernig á að berjast við amapóst á þínum wiki]"
 }
index bc707db..79a1f56 100644 (file)
        "config-install-mainpage": "Creazione della pagina principale con contenuto predefinito",
        "config-install-extension-tables": "Creazione delle tabelle per le estensioni attivate",
        "config-install-mainpage-failed": "Impossibile inserire la pagina principale: $1",
-       "config-install-done": "<strong>Complimenti!</strong>\nHai installato correttamente MediaWiki.\n\nIl programma di installazione ha generato un file <code>LocalSettings.php</code> che contiene tutte le impostazioni.\n\nDevi scaricarlo ed inserirlo nella directory base del tuo wiki (la stessa dove è presente index.php). Il download dovrebbe partire automaticamente.\n\nSe il download non si avvia, o se è stato annullato, puoi riavviarlo cliccando sul collegamento di seguito:\n\n$3\n\n<strong>Nota:</strong> se esci ora dall'installazione senza scaricare il file di configurazione che è stato generato, questo poi non sarà più disponibile in seguito.\n\nQuando hai fatto, puoi <strong>[$2 entrare nel tuo wiki]</strong>.",
+       "config-install-done": "<strong>Complimenti!</strong>\nHai installato MediaWiki.\n\nIl programma di installazione ha generato un file <code>LocalSettings.php</code> che contiene tutte le impostazioni.\n\nDevi scaricarlo ed inserirlo nella directory base del tuo wiki (la stessa dove è presente index.php). Il download dovrebbe partire automaticamente.\n\nSe il download non si avvia, o se è stato annullato, puoi riavviarlo cliccando sul collegamento di seguito:\n\n$3\n\n<strong>Nota:</strong> se esci ora dall'installazione senza scaricare il file di configurazione che è stato generato, questo poi non sarà più disponibile in seguito.\n\nQuando hai fatto, puoi <strong>[$2 entrare nel tuo wiki]</strong>.",
        "config-download-localsettings": "Scarica <code>LocalSettings.php</code>",
        "config-help": "aiuto",
        "config-help-tooltip": "fai clic per espandere",
        "config-nofile": "Il file \"$1\" non può essere trovato. È stato eliminato?",
        "config-extension-link": "Sapevi che il tuo wiki supporta le  [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions estensioni]?\n\nPuoi navigare tra le [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category estensioni per categoria].",
-       "mainpagetext": "'''Installazione di MediaWiki completata correttamente.'''",
+       "mainpagetext": "<strong>MediaWiki è stato installato.</strong>",
        "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Special:MyLanguage/Help:Contents Guida utente] per maggiori informazioni sull'uso di questo software wiki.\n\n== Per iniziare ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Impostazioni di configurazione]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Domande frequenti su MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annunci MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizza MediaWiki nella tua lingua]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Imparare a combattere lo spam sul tuo wiki]"
 }
diff --git a/includes/installer/i18n/jbo.json b/includes/installer/i18n/jbo.json
new file mode 100644 (file)
index 0000000..e52919f
--- /dev/null
@@ -0,0 +1,12 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Xbony2"
+               ]
+       },
+       "config-information": "lo datni",
+       "config-page-name": "lo cmene",
+       "config-page-options": "lo cuxna",
+       "config-page-install": "lo instale",
+       "config-page-copying": "nu lo fukpi"
+}
index 13750e8..2163c6f 100644 (file)
@@ -41,6 +41,7 @@
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-db-port": "მონაცემთა ბაზის პორტი:",
        "config-db-schema": "მედიავიკის სქემა:",
+       "config-type-mssql": "Microsoft SQL Server",
        "config-header-mysql": "MySQL-ის პარამეტრები",
        "config-header-postgres": "PostgreSQL-ის პარამეტრები",
        "config-header-sqlite": "SQLite-ის პარამეტრები",
index 721e81e..b16addd 100644 (file)
        "config-install-mainpage": "Ben de Houpsigg med enem shtandatmääßeje Enhald aam aanlääje",
        "config-install-extension-tables": "Ben Datebangk-Tabälle för de Zohsazprojramme aam ennreschte",
        "config-install-mainpage-failed": "Kunnt de Houpsigg nit afshpeishere: $1",
-       "config-install-done": "'''Jlöckwonsch!'''\nMediaWiki es jetz enstalleet.\n\nEt Projramm zom Enreeschte hät en Dattei <code lang=\"en\">LocalSettings.php</code> aanjelaat.\nDoh sin de Enstellunge vum Wiki dren.\n\nDo weeß se eronge laade möße un dann en dem Wiki sing Aanfangsverzeishnes donn möße, et sellve Verzeisneß, woh di Dattei <code lang=\"en\">index.php</code> dren litt. Dat Erongerlaade sullt automattesch aanjefange han.\n\nWann domet jet nit jeflupp hät, udder De di Dattei norr_ens han wells, donn op dä Lengk heh dronger klecke:\n\n$3\n\n'''Opjepaß''': Wann De dat jez nit deihß, es alles verschött, wat De bes jöz enjejovve häs, weil di Dattei fott es en däm Momang, woh heh dat Projamm aam Engk es.\n\nWann De mem Ronger- un widder Huhlaade fäädesh bes, kanns De '''[$2 en Ding Wiki jonn]'''.",
+       "config-install-done": "<strong>Jlöckwonsch!</strong>\nMediaWiki es jetz enstalleet.\n\nEt Projramm zom Enreeschte hät en Dattei <code lang=\"en\">LocalSettings.php</code> aanjelaat.\nDoh sin de Enstellunge vum Wiki dren.\n\nDo weeß se eronge laade möße un dann en dem Wiki sing Aanfangsverzeishnes donn möße, et sellve Verzeisneß, woh di Dattei <code lang=\"en\">index.php</code> dren litt. Dat Erongerlaade sullt automattesch aanjefange han.\n\nWann domet jet nit jeflupp hät, udder De di Dattei norr_ens han wells, donn op dä Lengk heh dronger klecke:\n\n$3\n\n<strong>Opjepaß:</strong> Wann De dat jez nit deihß, es alles verschött, wat De bes jöz enjejovve häs, weil di Dattei fott es en däm Momang, woh heh dat Projamm aam Engk es.\n\nWann De mem Ronger- un widder Huhlaade fäädesh bes, kanns De <strong>[$2 en Ding Wiki jonn]</strong>.",
        "config-download-localsettings": "Donn di Dattei <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">LocalSettings.php</code> eronger lahde",
        "config-help": "Hölp",
        "config-help-tooltip": "Donn Hölp heh aan däm Plaaz enblände.",
        "config-nofile": "De Dattei „$1“ ham_mer nit jefonge. Es di fottjeschmeße?",
        "config-extension-link": "Häs De jewoß, dat et Wiki [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions Zohsazprojramme] hann kann?\n\nDo kanns [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Zohsazprojramme noh Saachjroppe] söhke udder en de [//www.mediawiki.org/wiki/Extension_Matrix Tabäll met de Zohsazprojramme] kike, öm de kumplätte Leß met de Zohsazprojramme ze krijje.",
-       "mainpagetext": "'''MehdijaWikki es jäz enschtalleht.'''",
+       "mainpagetext": "<strong>MehdijaWikki es jäz enschtalleht.</strong>",
        "mainpagedocfooter": "Luur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handbohch] wann De weße wells wi de Wikki-ẞoffwähr jebruch un bedehnt wähde moß.\n\n== För der Aanfang ==\nDat es och all op Änglesch:\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings En leß met müjjelesche Enschtällonge för et MehdijaWikki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Öff jefrooch övver et Mehdijawikki&nbsp;&hellip;]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce De Meilengleß met Annköndijonge övver neuje Ußjahbe vum MehdijaWikki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Donn MediaWiki op Ding Schprohch aanpaße]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Loor, wi der der <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„för jewöhnlesch angmaß övverdrahre Nohreeschte udder Meddeijlonge, di wä se kritt jaa nit han well,“\">SPAM</i> em Wikki klein hälls]\n\n=== Jrammatek ===\nJeh nohdämm, ovv_et „di {{SITENAME}}“, „dä {{SITENAME}}“ udder „dat {{SITENAME}}“ heiß, moß mer velleijsch en Datteij änndere. Wann „{{SITENAME}}“ med „wikki“ ov „wiki“ ophürt, moß mer nix donn. Bei „dä {{SITENAME}}“ och nit. Söns kütt en di Datteij <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">languages/classes/LanguageKsh.php</code> vör udder henger dä Reihj met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">No need add neuter wikis having names ending in -wiki.</code>“ en neuje Reihj eren:\n* för „di {{SITENAME}}“ heijß di:\n*: <code>'{{SITENAME}}' => 'f',</code>\n* för „dat {{SITENAME}}“ heijs et:\n*: <code>'{{SITENAME}}' => 'n',</code>\n\n== Un dann ==\nDonn heh di Sigg ömbenänne un/udder jähje en ääschte Aanfangssigg för heh dat Wikki ußtuusche!\n\nAlles Johde!"
 }
index 3916233..e576e2f 100644 (file)
        "config-localsettings-badkey": "Diso ilay lakile fanavaozana natsofokao.",
        "config-session-error": "Hadisoana teo am-panombohana ny fidirana : $1",
        "config-your-language": "Ny fiteninao :",
+       "config-your-language-help": "Hifidy ny teny ilaina amin'ny piraosesy fametrahana.",
        "config-wiki-language": "Fiteny ho ampiasain'ny wiki :",
+       "config-wiki-language-help": "Hifidy ny teny hanoratana ny votoatin'ny wiki.",
        "config-back": "← Miverina",
        "config-continue": "Manohy →",
        "config-page-language": "Fiteny",
        "config-page-welcome": "Tonga soa eto amin'i MediaWiki !",
        "config-page-dbconnect": "Hiditra eo amin'i banky angona",
+       "config-page-upgrade": "Hanavao ny fametrahana efa misy",
        "config-page-dbsettings": "Parametatry ny banky angona",
        "config-page-name": "Anarana",
        "config-page-options": "Safidy",
@@ -33,6 +36,8 @@
        "config-help-restart": "Tianao hofafana avokoa ve ny data voaangona natsofokao ary hamerina ny fizotran'ny fametrahana ?",
        "config-restart": "Eny, avereno atao",
        "config-welcome": "=== Fanamarinana mikasika ny tontolo ===\nNy fanamarihana tsotsotra dia atao hijerena raha mety ho ana rindrankajy Mediawiki ny tontolo.\nTadidio ny mametraka ireto torohay ireo raha mitady fanohanana mikasika ny fomba famaranana ny fametrahana ianao.",
+       "config-copyright": "== Zom-pamorona ary fepetra ==\n\n$1\n\n\nIo fandaharana dia rindrambaiko maimaim-poana; dia afaka zarazarain ary ovaina araka ny fepetra ao amin'ny GNU General Public License navoakan'ny Free Software Foundation; na versiona 2 ao amin'ny lisansa, na (araka ny safidinao) versiona tatỳ aoriana.\n\nIo fandaharaa io dia zaraina amin'ny fanantenana fa ho ilaina, anefa kosa dia <strong>tsy misy fiantohana</strong>; tsy misy fiantohana mikasika ny <strong>fivarotana azy</strong> na <strong>famendrehana ho azo ampiasaina amin'ny tranga iray manokana</strong>.\nJereo ny GNU General Public License hahazoana zavatra amin'ny antsipiriany.\n\nIanao dia tokony nandray <doclink href=Copying> kôpian'nyGNU General Public License </doclink> miaraka amin'ny fandaharana ity; raha tsy izany, manorata any amin'ny Free Software Foundation, Inc., 51 Franklin Street, Fahadimy Floor, Boston, MA 02110-1301, USA, na [http://www.gnu.org/copyleft/gpl.html vakio ao amin'ny Internet izany].",
+       "config-sidebar": "* [//www.mediawiki.org MediaWiki fandraisana]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Torolalan'ny mampiasa]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Torolalan'ny mpandrindra]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Fanontaniana mipetraka matetika]\n----\n* <doclink href=Readme>Vakio aho</doclink>\n* <doclink href=ReleaseNotes>Naoty famoahana</doclink>\n* <doclink href=Copying>Fandikàna</doclink>\n* <doclink href=UpgradeDoc>Fampihatsaràna</doclink>",
        "config-env-good": "Voamarina ny tontolo.\nAfaka apetrakao i MediaWiki.",
        "config-env-bad": "Voamarina ny tontolo.\nTsy afaka mametraka an'i MediaWiki ianao.",
        "config-env-php": "Misy ato PHP $1.",
        "config-unicode-pure-php-warning": "<strong>Fampitandremana: </strong>  Ny [http://pecl.php.net/intl itatra PECL intl] dia tsy misy mba hahazakana ny fampifenerana Unicode, ka mitontona amin'ny implementasiona PHP ranoray noho ny tsifisiany.\nRaha hametraka tranonkala be mpamangy ianao dia tokony mamaky ny [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations ''Unicode normalization''] (amin'ny teny anglisy)",
        "config-db-username": "Anaram-pikamban'ny banky angona :",
        "config-db-password": "Tenimiafin'ny banky angona :",
+       "config-db-prefix": "Tovom-banky angona:",
        "config-charset-mysql5-binary": "roafototra MySQL 4.1/5.0",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-charset-mysql4": "MySQL 4.0 miverinjaka UTF-8",
        "config-db-port": "Seranam-banky angona:",
        "config-header-mysql": "Parametatr'i MySQL",
+       "config-header-postgres": "Parametatra PostgreSQL",
        "config-header-sqlite": "Parametatr'i SQLite",
        "config-header-oracle": "Parametatr'i Oracle",
+       "config-header-mssql": "Parametatry ny lohamilina Microsoft SQL Server",
+       "config-invalid-db-type": "Karazana banky angona tsy ekena.",
        "config-mysql-innodb": "innoDB",
        "config-mysql-myisam": "MyISAM",
        "config-ns-generic": "Tetikasa",
index cd75013..6251c03 100644 (file)
@@ -84,7 +84,6 @@
        "config-xcache": "[Http://trac.lighttpd.net/xcache/ XCache] jest zainstalowany",
        "config-apc": "[Http://www.php.net/apc APC] jest zainstalowany",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] jest zainstalowany",
-       "config-no-cache": "'''Uwaga:''' Pamięć podręczna dla kodu MediaWiki nie będzie uruchomiona., gdyż nie ma żadnego z następujących narzędzi: [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] lub [http://www.iis.net/download/WinCacheForPhp WinCache].",
        "config-mod-security": "''' Ostrzeżenie ''': Serwer sieci web ma włączone [http://modsecurity.org/ mod_security]. Jeśli jest niepoprawnie skonfigurowane, może być przyczyną problemów MediaWiki lub innego oprogramowania, które pozwala użytkownikom na wysyłanie dowolnej zawartości.\nSprawdź w [http://modsecurity.org/documentation/ dokumentacji mod_security] lub skontaktuj się z obsługa hosta, jeśli wystąpią losowe błędy.",
        "config-diff3-bad": "Nie znaleziono GNU diff3.",
        "config-git": "Znaleziono oprogramowanie kontroli wersji Git: <code>$1</code>.",
        "config-help-tooltip": "kliknij, aby rozwinąć",
        "config-nofile": "Nie udało się odnaleźć pliku \"$1\". Czy nie został usunięty?",
        "config-extension-link": "Czy wiesz, że twoja wiki obsługuje [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions/pl rozszerzenia]?\n\nMożesz przejrzeć [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category rozszerzenia według kategorii] lub [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] aby zobaczyć pełną listę rozszerzeń.",
-       "mainpagetext": "'''Instalacja MediaWiki powiodła się.'''",
+       "mainpagetext": "<strong>Instalacja MediaWiki powiodła się.</strong>",
        "mainpagedocfooter": "Zobacz [//meta.wikimedia.org/wiki/Help:Contents przewodnik użytkownika], aby uzyskać informacje o działaniu oprogramowania wiki.\n\n== Na początek ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/pl Lista ustawień konfiguracyjnych]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/pl MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam \nDowiedz się, jak walczyć ze spamem na swojej wiki]"
 }
index 896b94b..39ce4b1 100644 (file)
        "config-install-mainpage": "A criar a página principal com o conteúdo padrão.",
        "config-install-extension-tables": "A criar as tabelas das extensões ativadas",
        "config-install-mainpage-failed": "Não foi possível inserir a página principal: $1",
-       "config-install-done": "'''Parabéns!'''\nTerminou a instalação do MediaWiki.\n\nO instalador gerou um ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contém todas as configurações.\n\nPrecisa de fazer o download do ficheiro e colocá-lo no diretório de raiz da sua instalação (o mesmo diretório onde está o ficheiro index.php). Este download deverá ter sido iniciado automaticamente.\n\nSe o download não foi iniciado, ou se o cancelou, pode recomeçá-lo clicando o link abaixo:\n\n$3\n\n'''Nota''': Se não fizer isto agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.\n\nDepois de terminar o passo anterior, pode '''[$2 entrar na wiki]'''.",
+       "config-install-done": "<strong>Parabéns!</strong>\nTerminou a instalação do MediaWiki.\n\nO instalador gerou um ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contém todas as configurações.\n\nPrecisa de fazer a descarga do ficheiro e colocá-lo no diretório de raiz da sua instalação (o mesmo diretório onde está o ficheiro index.php). Esta descarga deverá ter sido iniciada automaticamente.\n\nSe a descarga não foi iniciada, ou se o cancelou, pode recomeçá-la ao clicar na ligação abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não fizer isto agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.\n\nDepois de terminar o passo anterior, pode <strong>[$2 entrar na wiki]</strong>.",
        "config-download-localsettings": "Descarga do <code>LocalSettings.php</code>",
        "config-help": "ajuda",
        "config-help-tooltip": "clique para expandir",
        "config-nofile": "Não foi possível encontrar o ficheiro \"$1\". Terá sido apagado?",
        "config-extension-link": "Sabia que a sua wiki suporta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensões]?\n\nPode procurar [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensões por categoria].",
-       "mainpagetext": "'''MediaWiki instalado com sucesso.'''",
+       "mainpagetext": "<strong>MediaWiki instalado.</strong>",
        "mainpagedocfooter": "Consulte o [//meta.wikimedia.org/wiki/Help:Contents Guia de Utilizadores] para informações sobre o uso do software wiki.\n\n== Onde começar ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de opções de configuração]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Perguntas e respostas frequentes sobre o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Subscreva a lista de divulgação de novas versões do MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Regionalize MediaWiki para seu idioma]"
 }
index f589678..f966b44 100644 (file)
        "config-no-db": "Не удалось найти подходящие драйвера баз данных! Вам необходимо установить драйвера базы данных для PHP.\n{{PLURAL:$2|Поддерживается следующий тип|Поддерживаются следующие типы}} баз данных: $1.\n\nЕсли вы скомпилировали PHP сами, перенастройте его с включением клиента баз данных, например, с помощью <code>./configure --with-mysqli</code>.\nЕсли вы установили PHP из пакетов Debian или Ubuntu, то вам также необходимо установить, например, пакет <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Предупреждение''': у Вас установлен SQLite  $1, версия которого ниже требуемой $2 . SQLite будет недоступен.",
        "config-no-fts3": "'''Внимание''': SQLite собран без модуля [//sqlite.org/fts3.html FTS3] — поиск не будет работать для этой базы данных.",
-       "config-register-globals-error": "<strong>Ошибка: Параметр PHP <code>[http://php.net/register_globals register_globals]</code> включен.\nОн должен быть отключен для того, чтобы можно было продолжить установку.</strong>\nПолучить справку о том, как это сделать, можно по адресу [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals].",
-       "config-magic-quotes-gpc": "'''Проблема: включена опция PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc]!'''\nЭто приводит к непредсказуемой порче вводимых данных.\nУстановка и использование MediaWiki без выключения этой опции невозможно.",
-       "config-magic-quotes-runtime": "'''Проблема: включена опция PHP [http://www.php.net/manual/ru/function.magic-quotes-runtime.php magic_quotes_runtime]!'''\nЭто приводит к непредсказуемой порче вводимых данных.\nУстановка и использование MediaWiki без выключения этой опции невозможно.",
-       "config-magic-quotes-sybase": "'''Проблема: включена опция PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]!'''\nЭто приводит к непредсказуемой порче вводимых данных.\nУстановка и использование MediaWiki без выключения этой опции невозможно.",
        "config-mbstring": "'''Проблема: включена опция PHP [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''\nЭто приводит к ошибкам и непредсказуемой порче вводимых данных.\nУстановка и использование MediaWiki без выключения этой опции невозможно.",
-       "config-safe-mode": "'''Предупреждение:''' PHP работает в [http://www.php.net/features.safe-mode «безопасном режиме»].\nЭто может привести к проблемам, особенно с загрузкой файлов и вставкой математических формул.",
        "config-xml-bad": "Для РНР отсутствует XML-модуль.\nMediaWiki не будет работать в этой конфигурации, так как требуется функционал этого модуля.\nВозможно, вам понадобится установить RPM-пакет php-xml.",
        "config-pcre-old": "'''Фатальная ошибка:''' требуется PCRE версии $1 или более поздняя.\nВаш исполняемый файл PHP связан с PCRE версии $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Подробнее].",
        "config-pcre-no-utf8": "'''Фатальная ошибка'''. Модуль PCRE для PHP, похоже, собран без поддержки PCRE_UTF8.\nMediaWiki требует поддержки UTF-8 для корректной работы.",
@@ -89,7 +84,6 @@
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] установлен",
        "config-apc": "[http://www.php.net/apc APC] установлен",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] установлен",
-       "config-no-cache": "'''Внимание:''' Не найдены [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] или [http://www.iis.net/download/WinCacheForPhp WinCache].\nКэширование объектов будет отключено.",
        "config-no-cache-apcu": "'''Внимание:''' Не найдены [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] или [http://www.iis.net/download/WinCacheForPhp WinCache].\nКэширование объектов будет отключено.",
        "config-mod-security": "<strong>Внимание</strong>: На вашем веб-сервере включен [http://modsecurity.org/ mod_security]/mod_security2. Многие его стандартные настройки могут вызывать проблемы для MediaWiki или другого ПО, позволяющего пользователям отправлять на сервер произвольный контент.\nОбратитесь к [http://modsecurity.org/documentation/ документации mod_security] или в службу поддержки вашего хостинг-провайдера, если вы сталкиваетесь со случайными ошибками.",
        "config-diff3-bad": "GNU diff3 не найден.",
        "config-install-mainpage": "Создание главной страницы с содержимым по умолчанию",
        "config-install-extension-tables": "Создание таблиц для включённых расширений",
        "config-install-mainpage-failed": "Не удаётся вставить главную страницу: $1",
-       "config-install-done": "'''Поздравляем!'''\nВы успешно установили MediaWiki.\n\nВо время установки был создан файл <code>LocalSettings.php</code>.\nОн содержит всю конфигурации вики.\n\nВам необходимо скачать его и положить в корневую директорию вашей вики (ту же директорию, где находится файл index.php). Его загрузка должна начаться автоматически.\n\nЕсли автоматическая загрузка не началась или вы её отменили, вы можете скачать по ссылке ниже:\n\n$3\n\n'''Примечание''': Если вы не сделаете этого сейчас, то сгенерированный файл конфигурации не будет доступен вам в дальнейшем, если вы выйдете из установки, не скачивая его.\n\nПо окончании действий, описанных выше, вы сможете '''[$2 войти в вашу вики]'''.",
+       "config-install-done": "<strong>Поздравляем!</strong>\nВы установили MediaWiki.\n\nВо время установки был создан файл <code>LocalSettings.php</code>.\nОн содержит все ваши настройки.\n\nВам необходимо скачать его и положить в корневую директорию вашей вики (ту же директорию, где находится файл index.php). Его загрузка должна начаться автоматически.\n\nЕсли автоматическая загрузка не началась или вы её отменили, вы можете скачать по ссылке ниже:\n\n$3\n\n<strong>Примечание</strong>: Если вы не сделаете этого сейчас, то сгенерированный файл конфигурации не будет доступен вам в дальнейшем, если вы выйдете из установки, не скачивая его.\n\nПо окончании действий, описанных выше, вы сможете <strong>[$2 войти в вашу вики]</strong>.",
        "config-download-localsettings": "Загрузить <code>LocalSettings.php</code>",
        "config-help": "справка",
        "config-help-tooltip": "нажмите, чтобы развернуть",
        "config-nofile": "Файл \"$1\" не удается найти. Он был удален?",
        "config-extension-link": "Знаете ли вы, что ваш вики-проект поддерживает [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions расширения]?\n\nВы можете просмотреть [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category расширения по категориям] или [//www.mediawiki.org/wiki/Extension_Matrix матрицу расширений], чтобы увидеть их полный список.",
-       "mainpagetext": "'''Вики-движок «MediaWiki» успешно установлен.'''",
+       "mainpagetext": "<strong>MediaWiki успешно установлена.</strong>",
        "mainpagedocfooter": "Информацию по работе с этой вики можно найти в [//meta.wikimedia.org/wiki/Help:Contents/ru справочном руководстве].\n\n== Некоторые полезные ресурсы ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Список возможных настроек];\n* [//www.mediawiki.org/wiki/Manual:FAQ/ru Часто задаваемые вопросы и ответы по MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка уведомлений о выходе новых версий MediaWiki].\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Перевод MediaWiki на свой язык]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Узнайте, как бороться со спамом в вашей вики]"
 }
index 542a38d..25febaf 100644 (file)
        "config-install-tables": "Ustvarjanje tabel",
        "config-download-localsettings": "Prenesi <code>LocalSettings.php</code>",
        "config-help": "pomoč",
-       "mainpagetext": "'''Programje MediaWiki je bilo uspešno nameščeno.'''",
+       "mainpagetext": "<strong>Programje MediaWiki je bilo nameščeno.</strong>",
        "mainpagedocfooter": "Oglejte si [//meta.wikimedia.org/wiki/Help:Contents Uporabniški priročnik] za informacije o uporabi programja wiki.\n\n== Kako začeti ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Seznam konfiguracijskih nastavitev]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Poogsto zastavljena vprašanja MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Poštni seznam izdaj MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Prevedite MediaWiki v svoj jezik]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Izvedite, kako se boriti proti smetju na svojem wikiju]"
 }
index aba3d34..785c90b 100644 (file)
@@ -69,6 +69,6 @@
        "config-install-step-done": "әзер",
        "config-install-step-failed": "булмады",
        "config-help": "ярдәм",
-       "mainpagetext": "<strong>«MediaWiki» уңышлы куелды.</strong>",
+       "mainpagetext": "<strong>«MediaWiki» куелды.</strong>",
        "mainpagedocfooter": "Бу вики турында мәгълүматны [//meta.wikimedia.org/wiki/Help:Contents биредә] табып була.\n\n== Кайбер файдалы ресурслар ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Көйләнмәләр исемлеге (инг.)];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki турында еш бирелгән сораулар һәм җаваплар (инг.)];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'ның яңа версияләре турында хәбәрләр яздырып алу];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language].\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]"
 }
index edb061b..0793918 100644 (file)
        "config-install-mainpage": "Створення головної сторінки із вмістом за замовчуванням",
        "config-install-extension-tables": "Створення таблиць для увімкнених розширень",
        "config-install-mainpage-failed": "Не вдається вставити головну сторінку: $1",
-       "config-install-done": "'''Вітаємо!'''\nВи успішно встановили MediaWiki.\n\nІнсталятор згенерував файл <code>LocalSettings.php</code>, який містить усі Ваші налаштування.\n\nВам необхідно завантажити його і помістити у кореневу папку Вашої вікі (туди ж, де index.php). Завантаження мало початись автоматично.\n\nЯкщо завантаження не почалось або Ви його скасували, можете заново його почати, натиснувши на посилання внизу:\n\n$3\n\n'''Примітка''': Якщо Ви не зробите цього зараз, цей файл не буде доступним пізніше, коли Ви вийдете з встановлення, не скачавши його.\n\nПісля виконання дій, описаних вище, Ви зможете '''[$2 увійти у свою вікі]'''.",
+       "config-install-done": "<strong>Вітаємо!</strong>\nВи успішно встановили MediaWiki.\n\nІнсталятор згенерував файл <code>LocalSettings.php</code>, який містить усі Ваші налаштування.\n\nВам необхідно завантажити його і помістити у кореневу папку Вашої вікі (туди ж, де index.php). Завантаження мало початись автоматично.\n\nЯкщо завантаження не почалось або Ви його скасували, можете заново його почати, натиснувши на посилання внизу:\n\n$3\n\n<strong>Примітка</strong>: Якщо Ви не зробите цього зараз, цей файл не буде доступним пізніше, коли Ви вийдете з встановлення, не скачавши його.\n\nПісля виконання дій, описаних вище, Ви зможете <strong>[$2 увійти у свою вікі]</strong>.",
        "config-download-localsettings": "Завантажити <code>LocalSettings.php</code>",
        "config-help": "допомога",
        "config-help-tooltip": "натисніть, щоб розгорнути",
        "config-nofile": "Файл \"$1\" не знайдено. Його видалено?",
        "config-extension-link": "Чи знаєте ви, що ваше вікі підтримує [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions розширення]?\n\nВи можете переглядати [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category розширення по категорії] або в [//www.mediawiki.org/wiki/Extension_Matrix матрицю розширень] щоб побачити повний список розширень.",
-       "mainpagetext": "Програмне забезпечення «MediaWiki» успішно встановлене.",
+       "mainpagetext": "<strong>Програмне забезпечення «MediaWiki» встановлено.</strong>",
        "mainpagedocfooter": "Інформацію про роботу з цією вікі можна знайти в [//meta.wikimedia.org/wiki/Help:Contents посібнику користувача].\n\n== Деякі корисні ресурси ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Список налаштувань];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Часті питання з приводу MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Розсилка повідомлень про появу нових версій MediaWiki];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локалізуйте MediaWiki своєю мовою]"
 }
index 4906b04..60133f7 100644 (file)
@@ -69,6 +69,6 @@
        "config-download-localsettings": "אראפלאדן <code>LocalSettings.php</code>",
        "config-help": "הילף",
        "config-nofile": "מ'האט נישט געקענט טרעפן די טעקע \"$1\". צי האט מען זי אויסגעמעקט?",
-       "mainpagetext": "'''מעדיעוויקי אינסטאלירט מיט דערפאלג.'''",
+       "mainpagetext": "<strong> מעדיעוויקי אינסטאלירט.</strong>",
        "mainpagedocfooter": "גיט זיך אן עצה מיט [//meta.wikimedia.org/wiki/Help:Contents באניצער'ס וועגווײַזער] פֿאר אינפֿארמאציע וויאזוי זיך באנוצן מיט וויקי ווייכוואַרג.\n\n== נוצליכע וועבלינקען פֿאַר אנהייבערס ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימה פון קאנפֿיגוראציעס]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ אפֿט געפֿרעגטע שאלות]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce מעדיעוויקי באפֿרײַאונג פאסטליסטע]* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources איבערזעצן מעדיעוויקי אין אײַער שפראך]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam לערנט וויאזוי צו באקעמפן בפעם אויף אייער וויקי]"
 }
index adaae35..8c6988b 100644 (file)
        "config-install-mainpage": "正在创建显示默认内容的首页",
        "config-install-extension-tables": "正在创建已启用扩展程序表",
        "config-install-mainpage-failed": "无法插入首页:$1",
-       "config-install-done": "'''恭喜!'''\n您已经成功地安装了MediaWiki。\n\n安装程序已经生成了<code>LocalSettings.php</code>文件,其中包含了您所有的配置。\n\n您需要下载该文件,并将其放在您wiki的根目录(index.php的同级目录)中。稍后下载将自动开始。\n\n如果浏览器没有提示您下载,或者您取消了下载,您可以点击下面的链接重新开始下载:\n\n$3\n\n'''注意''':如果您现在不完成本步骤,而是没有下载便退出了安装过程,此后您将无法获得自动生成的配置文件。\n\n当本步骤完成后,您可以 '''[$2 进入您的wiki]'''。",
+       "config-install-done": "<strong>恭喜!</strong>\n您已经安装了MediaWiki。\n\n安装程序已经生成了<code>LocalSettings.php</code>文件,其中包含了您所有的配置。\n\n您需要下载该文件,并将其放在您wiki的根目录(index.php的同级目录)中。稍后下载将自动开始。\n\n如果浏览器没有提示您下载,或者您取消了下载,您可以点击下面的链接重新开始下载:\n\n$3\n\n<strong>注意:</strong>如果您现在不完成本步骤,而是没有下载便退出了安装过程,此后您将无法获得自动生成的配置文件。\n\n当本步骤完成后,您可以<strong>[$2 进入您的wiki]</strong>。",
        "config-download-localsettings": "下载<code>LocalSettings.php</code>",
        "config-help": "帮助",
        "config-help-tooltip": "单击展开",
        "config-nofile": "找不到文件“$1”。它是否已被删除?",
        "config-extension-link": "您是否知道您的wiki支持[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 拓展]?\n您可浏览[//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category 拓展分类]。",
-       "mainpagetext": "'''已成功安装MediaWiki。'''",
+       "mainpagetext": "<strong>已安装MediaWiki。</strong>",
        "mainpagedocfooter": "请查阅[//meta.wikimedia.org/wiki/Help:Contents 用户指南]以获取使用本wiki软件的信息!\n\n== 入门 ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki配置设置列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hans MediaWiki常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources 本地化MediaWiki到您的语言]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam 了解如何在您的wiki上打击破坏]"
 }
index 48d38d9..9ccf6f8 100644 (file)
@@ -315,14 +315,6 @@ abstract class Job implements IJobSpecification {
         * @return string
         */
        public function toString() {
-               $truncFunc = function ( $value ) {
-                       $value = (string)$value;
-                       if ( mb_strlen( $value ) > 1024 ) {
-                               $value = "string(" . mb_strlen( $value ) . ")";
-                       }
-                       return $value;
-               };
-
                $paramString = '';
                if ( $this->params ) {
                        foreach ( $this->params as $key => $value ) {
@@ -332,14 +324,14 @@ abstract class Job implements IJobSpecification {
                                if ( is_array( $value ) ) {
                                        $filteredValue = [];
                                        foreach ( $value as $k => $v ) {
-                                               if ( is_scalar( $v ) ) {
-                                                       $filteredValue[$k] = $truncFunc( $v );
+                                               $json = FormatJson::encode( $v );
+                                               if ( $json === false || mb_strlen( $json ) > 512 ) {
+                                                       $filteredValue[$k] = gettype( $v ) . '(...)';
                                                } else {
-                                                       $filteredValue = null;
-                                                       break;
+                                                       $filteredValue[$k] = $v;
                                                }
                                        }
-                                       if ( $filteredValue && count( $filteredValue ) < 10 ) {
+                                       if ( count( $filteredValue ) <= 10 ) {
                                                $value = FormatJson::encode( $filteredValue );
                                        } else {
                                                $value = "array(" . count( $value ) . ")";
@@ -348,7 +340,12 @@ abstract class Job implements IJobSpecification {
                                        $value = "object(" . get_class( $value ) . ")";
                                }
 
-                               $paramString .= "$key={$truncFunc( $value )}";
+                               $flatValue = (string)$value;
+                               if ( mb_strlen( $value ) > 1024 ) {
+                                       $flatValue = "string(" . mb_strlen( $value ) . ")";
+                               }
+
+                               $paramString .= "$key={$flatValue}";
                        }
                }
 
index 7fb020b..a81cade 100644 (file)
@@ -137,6 +137,10 @@ class BacklinkJobUtils {
                                                'batchSize' => $realBSize,
                                                'subranges' => array_slice( $ranges, 1 )
                                        ],
+                                       // Track how many times the base job divided for debugging
+                                       'division'      => isset( $params['division'] )
+                                               ? ( $params['division'] + 1 )
+                                               : 1
                                ] + $extraParams
                        );
                }
index f8fa252..526b45e 100644 (file)
@@ -68,21 +68,15 @@ class XCFHandler extends BitmapHandler {
 
                # Forge a return array containing metadata information just like getimagesize()
                # See PHP documentation at: http://www.php.net/getimagesize
-               $metadata = [];
-               $metadata[0] = $header['width'];
-               $metadata[1] = $header['height'];
-               $metadata[2] = null; # IMAGETYPE constant, none exist for XCF.
-               $metadata[3] = sprintf(
-                       'height="%s" width="%s"', $header['height'], $header['width']
-               );
-               $metadata['mime'] = 'image/x-xcf';
-               $metadata['channels'] = null;
-               $metadata['bits'] = 8; # Always 8-bits per color
-
-               assert( '7 == count($metadata); ' .
-                       '# return array must contains 7 elements just like getimagesize() return' );
-
-               return $metadata;
+               return [
+                       0 => $header['width'],
+                       1 => $header['height'],
+                       2 => null, # IMAGETYPE constant, none exist for XCF.
+                       3 => "height=\"{$header['height']}\" width=\"{$header['width']}\"",
+                       'mime' => 'image/x-xcf',
+                       'channels' => null,
+                       'bits' => 8, # Always 8-bits per color
+               ];
        }
 
        /**
index fe9304f..7c60aa5 100644 (file)
@@ -168,12 +168,12 @@ class ExtensionProcessor implements Processor {
                $this->extractCredits( $path, $info );
                foreach ( $info as $key => $val ) {
                        if ( in_array( $key, self::$globalSettings ) ) {
-                               $this->storeToArray( "wg$key", $val, $this->globals );
+                               $this->storeToArray( $path, "wg$key", $val, $this->globals );
                        // Ignore anything that starts with a @
                        } elseif ( $key[0] !== '@' && !in_array( $key, self::$notAttributes )
                                && !in_array( $key, self::$creditsAttributes )
                        ) {
-                               $this->storeToArray( $key, $val, $this->attributes );
+                               $this->storeToArray( $path, $key, $val, $this->attributes );
                        }
                }
        }
@@ -367,14 +367,15 @@ class ExtensionProcessor implements Processor {
        }
 
        /**
+        * @param string $path
         * @param string $name
         * @param array $value
         * @param array &$array
         * @throws InvalidArgumentException
         */
-       protected function storeToArray( $name, $value, &$array ) {
+       protected function storeToArray( $path, $name, $value, &$array ) {
                if ( !is_array( $value ) ) {
-                       throw new InvalidArgumentException( "The value for '$name' should be an array" );
+                       throw new InvalidArgumentException( "The value for '$name' should be an array (from $path)" );
                }
                if ( isset( $array[$name] ) ) {
                        $array[$name] = array_merge_recursive( $array[$name], $value );
index 6458e71..8e0239a 100644 (file)
@@ -211,6 +211,18 @@ class ResourceLoaderContext {
                return $this->user;
        }
 
+       /**
+        * Get a Message object with context set.  See wfMessage for parameters.
+        *
+        * @since 1.27
+        * @param mixed ...
+        * @return Message
+        */
+       public function msg() {
+               return call_user_func_array( 'wfMessage', func_get_args() )
+                       ->inLanguage( $this->getLanguage() );
+       }
+
        /**
         * Get the possibly-cached User object for the specified username
         *
index 6a40e27..d765137 100644 (file)
@@ -279,15 +279,12 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
        }
 
        public static function getLegacyModules() {
-               global $wgIncludeLegacyJavaScript, $wgPreloadJavaScriptMwUtil;
+               global $wgIncludeLegacyJavaScript;
 
                $legacyModules = [];
                if ( $wgIncludeLegacyJavaScript ) {
                        $legacyModules[] = 'mediawiki.legacy.wikibits';
                }
-               if ( $wgPreloadJavaScriptMwUtil ) {
-                       $legacyModules[] = 'mediawiki.util';
-               }
 
                return $legacyModules;
        }
index 65b0309..1ea7271 100644 (file)
@@ -55,11 +55,11 @@ class RevDelLogItem extends RevDelItem {
                $dbw = wfGetDB( DB_MASTER );
 
                $dbw->update( 'logging',
-                       array( 'log_deleted' => $bits ),
-                       array(
+                       [ 'log_deleted' => $bits ],
+                       [
                                'log_id' => $this->row->log_id,
                                'log_deleted' => $this->getBits() // cas
-                       ),
+                       ],
                        __METHOD__
                );
 
@@ -69,14 +69,14 @@ class RevDelLogItem extends RevDelItem {
                }
 
                $dbw->update( 'recentchanges',
-                       array(
+                       [
                                'rc_deleted' => $bits,
                                'rc_patrolled' => 1
-                       ),
-                       array(
+                       ],
+                       [
                                'rc_logid' => $this->row->log_id,
                                'rc_timestamp' => $this->row->log_timestamp // index
-                       ),
+                       ],
                        __METHOD__
                );
 
@@ -95,8 +95,8 @@ class RevDelLogItem extends RevDelItem {
                $loglink = Linker::link(
                        SpecialPage::getTitleFor( 'Log' ),
                        $this->list->msg( 'log' )->escaped(),
-                       array(),
-                       array( 'page' => $title->getPrefixedText() )
+                       [],
+                       [ 'page' => $title->getPrefixedText() ]
                );
                $loglink = $this->list->msg( 'parentheses' )->rawParams( $loglink )->escaped();
                // User links and action text
@@ -115,34 +115,34 @@ class RevDelLogItem extends RevDelItem {
        public function getApiData( ApiResult $result ) {
                $logEntry = DatabaseLogEntry::newFromRow( $this->row );
                $user = $this->list->getUser();
-               $ret = array(
+               $ret = [
                        'id' => $logEntry->getId(),
                        'type' => $logEntry->getType(),
                        'action' => $logEntry->getSubtype(),
-               );
+               ];
                $ret += $logEntry->isDeleted( LogPage::DELETED_USER )
-                       ? array( 'userhidden' => '' )
-                       : array();
+                       ? [ 'userhidden' => '' ]
+                       : [];
                $ret += $logEntry->isDeleted( LogPage::DELETED_COMMENT )
-                       ? array( 'commenthidden' => '' )
-                       : array();
+                       ? [ 'commenthidden' => '' ]
+                       : [];
                $ret += $logEntry->isDeleted( LogPage::DELETED_ACTION )
-                       ? array( 'actionhidden' => '' )
-                       : array();
+                       ? [ 'actionhidden' => '' ]
+                       : [];
 
                if ( LogEventsList::userCan( $this->row, LogPage::DELETED_ACTION, $user ) ) {
                        $ret['params'] = LogFormatter::newFromEntry( $logEntry )->formatParametersForApi();
                }
                if ( LogEventsList::userCan( $this->row, LogPage::DELETED_USER, $user ) ) {
-                       $ret += array(
+                       $ret += [
                                'userid' => $this->row->log_user,
                                'user' => $this->row->log_user_text,
-                       );
+                       ];
                }
                if ( LogEventsList::userCan( $this->row, LogPage::DELETED_COMMENT, $user ) ) {
-                       $ret += array(
+                       $ret += [
                                'comment' => $this->row->log_comment,
-                       );
+                       ];
                }
 
                return $ret;
index 1344f4c..b263fb3 100644 (file)
@@ -708,10 +708,6 @@ class SearchEngine {
         * @return SearchSuggestionSet
         */
        protected function processCompletionResults( $search, SearchSuggestionSet $suggestions ) {
-               if ( $suggestions->getSize() == 0 ) {
-                       // If we don't have anything, don't bother
-                       return $suggestions;
-               }
                $search = trim( $search );
                // preload the titles with LinkBatch
                $titles = $suggestions->map( function( SearchSuggestion $sugg ) {
@@ -726,6 +722,10 @@ class SearchEngine {
                } );
 
                // Rescore results with an exact title match
+               // NOTE: in some cases like cross-namespace redirects
+               // (frequently used as shortcuts e.g. WP:WP on huwiki) some
+               // backends like Cirrus will return no results. We should still
+               // try an exact title match to workaround this limitation
                $rescorer = new SearchExactMatchRescorer();
                $rescoredResults = $rescorer->rescore( $search, $this->namespaces, $results, $this->limit );
 
index efa3445..0a304a9 100644 (file)
@@ -974,7 +974,9 @@ final class SessionManager implements SessionManagerInterface {
                if ( defined( 'MW_NO_SESSION' ) ) {
                        if ( MW_NO_SESSION === 'warn' ) {
                                // Undocumented safety case for converting existing entry points
-                               $this->logger->error( 'Sessions are supposed to be disabled for this entry point' );
+                               $this->logger->error( 'Sessions are supposed to be disabled for this entry point', [
+                                       'exception' => new \BadMethodCallException( 'Sessions are disabled for this entry point' ),
+                               ] );
                        } else {
                                throw new \BadMethodCallException( 'Sessions are disabled for this entry point' );
                        }
index 92311b5..419c4b4 100644 (file)
@@ -650,42 +650,33 @@ class SkinTemplate extends Skin {
                                'active' => false
                        ];
                } else {
-                       $useCombinedLoginLink = $this->useCombinedLoginLink();
-                       $loginlink = $this->getUser()->isAllowed( 'createaccount' ) && $useCombinedLoginLink
-                               ? 'nav-login-createaccount'
-                               : 'pt-login';
-                       $is_signup = $request->getText( 'type' ) == 'signup';
-
-                       $login_url = [
-                               'text' => $this->msg( $loginlink )->text(),
-                               'href' => self::makeSpecialUrl( 'Userlogin', $returnto ),
-                               'active' => $title->isSpecial( 'Userlogin' )
-                                       && ( $loginlink == 'nav-login-createaccount' || !$is_signup ),
-                       ];
-                       $createaccount_url = [
-                               'text' => $this->msg( 'pt-createaccount' )->text(),
-                               'href' => self::makeSpecialUrl( 'Userlogin', "$returnto&type=signup" ),
-                               'active' => $title->isSpecial( 'Userlogin' ) && $is_signup,
-                       ];
-
                        // No need to show Talk and Contributions to anons if they can't contribute!
                        if ( User::groupHasPermission( '*', 'edit' ) ) {
-                               // Show the text "Not logged in"
-                               $personal_urls['anonuserpage'] = [
-                                       'text' => $this->msg( 'notloggedin' )->text()
-                               ];
 
-                               // Because of caching, we can't link directly to the IP talk and
-                               // contributions pages. Instead we use the special page shortcuts
-                               // (which work correctly regardless of caching). This means we can't
-                               // determine whether these links are active or not, but since major
-                               // skins (MonoBook, Vector) don't use this information, it's not a
-                               // huge loss.
+                               // Because of caching, we can't link directly to the anonymous
+                               // user page (for example [[User:127.0.0.1]]), talk page, and
+                               // contributions pages. Instead we use the special page
+                               // shortcuts (which work correctly regardless of caching). This
+                               // means we can't determine whether these links are active or
+                               // not, but since major skins (MonoBook, Vector) don't use this
+                               // information, it's not a huge loss.
+
+                               // Only show (red) link to anon user page if anon users are
+                               // allowed to create that page
+                               if ( User::groupHasPermission( '*', 'createpage' ) ) {
+                                       $personal_urls[ 'anonuserpage' ] = [
+                                               'text'   => $this->msg( 'anonuserpage' )->text(),
+                                               'href'   => self::makeSpecialUrlSubpage( 'Mypage', false ),
+                                               'active' => false
+                                       ];
+                               }
+
                                $personal_urls['anontalk'] = [
                                        'text' => $this->msg( 'anontalk' )->text(),
                                        'href' => self::makeSpecialUrlSubpage( 'Mytalk', false ),
                                        'active' => false
                                ];
+
                                $personal_urls['anoncontribs'] = [
                                        'text' => $this->msg( 'anoncontribs' )->text(),
                                        'href' => self::makeSpecialUrlSubpage( 'Mycontributions', false ),
@@ -693,11 +684,21 @@ class SkinTemplate extends Skin {
                                ];
                        }
 
-                       if ( $this->getUser()->isAllowed( 'createaccount' ) && !$useCombinedLoginLink ) {
-                               $personal_urls['createaccount'] = $createaccount_url;
+                       $is_signup = $request->getText( 'type' ) === 'signup';
+
+                       if ( $this->getUser()->isAllowed( 'createaccount' ) && !( $this->useCombinedLoginLink() ) ) {
+                               $personal_urls[ 'createaccount' ] = [
+                                       'text' => $this->msg( 'pt-createaccount' )->text(),
+                                       'href' => self::makeSpecialUrl( 'Userlogin', "$returnto&type=signup" ),
+                                       'active' => $title->isSpecial( 'Userlogin' ) && $is_signup,
+                               ];
                        }
 
-                       $personal_urls['login'] = $login_url;
+                       $personal_urls['login'] = [
+                               'text' => $this->msg( 'pt-login' )->text(),
+                               'href' => self::makeSpecialUrl( 'Userlogin', $returnto ),
+                               'active' => $title->isSpecial( 'Userlogin' ) && !$is_signup,
+                       ];
                }
 
                Hooks::run( 'PersonalUrls', [ &$personal_urls, &$title, $this ] );
index 11357fb..bcba190 100644 (file)
@@ -192,6 +192,7 @@ class SpecialBotPasswords extends FormSpecialPage {
                                'type' => 'textwithbutton',
                                'label-message' => 'botpasswords-label-appid',
                                'buttondefault' => $this->msg( 'botpasswords-label-create' )->text(),
+                               'buttonflags' => [ 'progressive', 'primary' ],
                                'required' => true,
                                'size' => BotPassword::APPID_MAXLENGTH,
                                'maxlength' => BotPassword::APPID_MAXLENGTH,
@@ -315,20 +316,21 @@ class SpecialBotPasswords extends FormSpecialPage {
        public function onSuccess() {
                $out = $this->getOutput();
 
+               $username = $this->getUser()->getName();
                switch ( $this->operation ) {
                        case 'insert':
                                $out->setPageTitle( $this->msg( 'botpasswords-created-title' )->text() );
-                               $out->addWikiMsg( 'botpasswords-created-body', $this->par );
+                               $out->addWikiMsg( 'botpasswords-created-body', $this->par, $username );
                                break;
 
                        case 'update':
                                $out->setPageTitle( $this->msg( 'botpasswords-updated-title' )->text() );
-                               $out->addWikiMsg( 'botpasswords-updated-body', $this->par );
+                               $out->addWikiMsg( 'botpasswords-updated-body', $this->par, $username );
                                break;
 
                        case 'delete':
                                $out->setPageTitle( $this->msg( 'botpasswords-deleted-title' )->text() );
-                               $out->addWikiMsg( 'botpasswords-deleted-body', $this->par );
+                               $out->addWikiMsg( 'botpasswords-deleted-body', $this->par, $username );
                                $this->password = null;
                                break;
                }
@@ -337,7 +339,7 @@ class SpecialBotPasswords extends FormSpecialPage {
                        $sep = BotPassword::getSeparator();
                        $out->addWikiMsg(
                                'botpasswords-newpassword',
-                               htmlspecialchars( $this->getUser()->getName() . $sep . $this->par ),
+                               htmlspecialchars( $username . $sep . $this->par ),
                                htmlspecialchars( $this->password )
                        );
                        $this->password = null;
index 57c6fec..ee9f665 100644 (file)
@@ -43,6 +43,9 @@ class SpecialChangeContentModel extends FormSpecialPage {
                }
 
                $this->addHelpLink( 'Help:ChangeContentModel' );
+
+               // T120576
+               $form->setSubmitTextMsg( 'changecontentmodel-submit' );
        }
 
        public function validateTitle( $title ) {
index 1a9d096..e76988d 100644 (file)
@@ -413,22 +413,15 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        return; // nothing to do
                }
 
-               $dbw = wfGetDB( DB_MASTER );
                $user = $this->getUser();
+               $store = WatchedItemStore::getDefaultInstance();
 
                foreach ( $this->badItems as $row ) {
                        list( $title, $namespace, $dbKey ) = $row;
                        $action = $title ? 'cleaning up' : 'deleting';
                        wfDebug( "User {$user->getName()} has broken watchlist item ns($namespace):$dbKey, $action.\n" );
 
-                       $dbw->delete( 'watchlist',
-                               [
-                                       'wl_user' => $user->getId(),
-                                       'wl_namespace' => $namespace,
-                                       'wl_title' => $dbKey,
-                               ],
-                               __METHOD__
-                       );
+                       $store->removeWatch( $user, new TitleValue( $namespace, $dbKey ) );
 
                        // Can't just do an UPDATE instead of DELETE/INSERT due to unique index
                        if ( $title ) {
@@ -494,7 +487,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         * @param array $titles Array of strings, or Title objects
         */
        private function unwatchTitles( $titles ) {
-               $dbw = wfGetDB( DB_MASTER );
+               $store = WatchedItemStore::getDefaultInstance();
 
                foreach ( $titles as $title ) {
                        if ( !$title instanceof Title ) {
@@ -502,25 +495,8 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        }
 
                        if ( $title instanceof Title ) {
-                               $dbw->delete(
-                                       'watchlist',
-                                       [
-                                               'wl_user' => $this->getUser()->getId(),
-                                               'wl_namespace' => MWNamespace::getSubject( $title->getNamespace() ),
-                                               'wl_title' => $title->getDBkey(),
-                                       ],
-                                       __METHOD__
-                               );
-
-                               $dbw->delete(
-                                       'watchlist',
-                                       [
-                                               'wl_user' => $this->getUser()->getId(),
-                                               'wl_namespace' => MWNamespace::getTalk( $title->getNamespace() ),
-                                               'wl_title' => $title->getDBkey(),
-                                       ],
-                                       __METHOD__
-                               );
+                               $store->removeWatch( $this->getUser(), $title->getSubjectPage() );
+                               $store->removeWatch( $this->getUser(), $title->getTalkPage() );
 
                                $page = WikiPage::factory( $title );
                                Hooks::run( 'UnwatchArticleComplete', [ $this->getUser(), &$page ] );
index bc33b8e..2a7046e 100644 (file)
@@ -158,7 +158,7 @@ class LinkSearchPage extends QueryPage {
 
                if ( $target != '' ) {
                        $this->setParams( [
-                               'query' => $target2,
+                               'query' => Parser::normalizeLinkUrl( $target2 ),
                                'namespace' => $namespace,
                                'protocol' => $protocol ] );
                        parent::execute( $par );
index c0f9590..5b452a6 100644 (file)
@@ -177,7 +177,7 @@ class SpecialVersion extends SpecialPage {
                global $wgLang;
 
                if ( defined( 'MEDIAWIKI_INSTALL' ) ) {
-                       $othersLink = '[//www.mediawiki.org/wiki/Special:Version/Credits ' .
+                       $othersLink = '[https://www.mediawiki.org/wiki/Special:Version/Credits ' .
                                wfMessage( 'version-poweredby-others' )->text() . ']';
                } else {
                        $othersLink = '[[Special:Version/Credits|' .
@@ -555,7 +555,7 @@ class SpecialVersion extends SpecialPage {
                                        'id' => 'mw-version-parser-extensiontags',
                                ],
                                Linker::makeExternalLink(
-                                       '//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Tag_extensions',
+                                       'https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Tag_extensions',
                                        $this->msg( 'version-parser-extensiontags' )->parse(),
                                        false /* msg()->parse() already escapes */
                                )
@@ -598,7 +598,7 @@ class SpecialVersion extends SpecialPage {
                                        'id' => 'mw-version-parser-function-hooks',
                                ],
                                Linker::makeExternalLink(
-                                       '//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Parser_functions',
+                                       'https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Parser_functions',
                                        $this->msg( 'version-parser-function-hooks' )->parse(),
                                        false /* msg()->parse() already escapes */
                                )
index dffc9d9..2dda093 100644 (file)
@@ -362,6 +362,12 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $list->initChangesListRows( $rows );
                $dbr->dataSeek( $rows, 0 );
 
+               if ( $this->getConfig()->get( 'RCShowWatchingUsers' )
+                       && $user->getOption( 'shownumberswatching' )
+               ) {
+                       $watchedItemStore = WatchedItemStore::getDefaultInstance();
+               }
+
                $s = $list->beginRecentChangesList();
                $counter = 1;
                foreach ( $rows as $obj ) {
@@ -375,16 +381,9 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                                $updated = false;
                        }
 
-                       if ( $this->getConfig()->get( 'RCShowWatchingUsers' )
-                               && $user->getOption( 'shownumberswatching' )
-                       ) {
-                               $rc->numberofWatchingusers = $dbr->selectField( 'watchlist',
-                                       'COUNT(*)',
-                                       [
-                                               'wl_namespace' => $obj->rc_namespace,
-                                               'wl_title' => $obj->rc_title,
-                                       ],
-                                       __METHOD__ );
+                       if ( isset( $watchedItemStore ) ) {
+                               $rcTitleValue = new TitleValue( $obj->rc_namespace, $obj->rc_title );
+                               $rc->numberofWatchingusers = $watchedItemStore->countWatchers( $rcTitleValue );
                        } else {
                                $rc->numberofWatchingusers = 0;
                        }
@@ -569,8 +568,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $form = "";
                $user = $this->getUser();
 
-               $dbr = $this->getDB();
-               $numItems = $this->countItems( $dbr );
+               $numItems = $this->countItems();
                $showUpdatedMarker = $this->getConfig()->get( 'ShowUpdatedMarker' );
 
                // Show watchlist header
@@ -630,18 +628,14 @@ class SpecialWatchlist extends ChangesListSpecialPage {
        }
 
        /**
-        * Count the number of items on a user's watchlist
+        * Count the number of paired items on a user's watchlist.
+        * The assumption made here is that when a subject page is watched a talk page is also watched.
+        * Hence the number of individual items is halved.
         *
-        * @param IDatabase $dbr A database connection
         * @return int
         */
-       protected function countItems( $dbr ) {
-               # Fetch the raw count
-               $rows = $dbr->select( 'watchlist', [ 'count' => 'COUNT(*)' ],
-                       [ 'wl_user' => $this->getUser()->getId() ], __METHOD__ );
-               $row = $dbr->fetchObject( $rows );
-               $count = $row->count;
-
+       protected function countItems() {
+               $count = WatchedItemStore::getDefaultInstance()->countWatchedItems( $this->getUser() );
                return floor( $count / 2 );
        }
 }
index a39690a..3824be1 100644 (file)
@@ -28,13 +28,13 @@ class UsercreateTemplate extends BaseTemplate {
         * UserCreateForm hook to add checkboxes to the create account form.
         */
        function addInputItem( $name, $value, $type, $msg, $helptext = false ) {
-               $this->data['extraInput'][] = array(
+               $this->data['extraInput'][] = [
                        'name' => $name,
                        'value' => $value,
                        'type' => $type,
                        'msg' => $msg,
                        'helptext' => $helptext,
-               );
+               ];
        }
 
        function execute() {
@@ -84,7 +84,7 @@ class UsercreateTemplate extends BaseTemplate {
                                        <span class="mw-ui-flush-right"><?php echo $this->getMsg( 'createacct-helpusername' )->parse(); ?></span>
                                </label>
                                <?php
-                               echo Html::input( 'wpName', $this->data['name'], 'text', array(
+                               echo Html::input( 'wpName', $this->data['name'], 'text', [
                                        'class' => 'mw-ui-input loginText',
                                        'id' => 'wpName2',
                                        'tabindex' => '1',
@@ -92,7 +92,7 @@ class UsercreateTemplate extends BaseTemplate {
                                        'required',
                                        'placeholder' => $this->getMsg( $this->data['loggedin'] ?
                                                'createacct-another-username-ph' : 'userlogin-yourname-ph' )->text(),
-                               ) );
+                               ] );
                                ?>
                        </div>
 
@@ -113,14 +113,14 @@ class UsercreateTemplate extends BaseTemplate {
                        <div class="mw-ui-vform-field mw-row-password">
                                <label for='wpPassword2'><?php $this->msg( 'userlogin-yourpassword' ); ?></label>
                                <?php
-                               echo Html::input( 'wpPassword', null, 'password', array(
+                               echo Html::input( 'wpPassword', null, 'password', [
                                        'class' => 'mw-ui-input loginPassword',
                                        'id' => 'wpPassword2',
                                        'tabindex' => '3',
                                        'size' => '20',
                                        'required',
                                        'placeholder' => $this->getMsg( 'createacct-yourpassword-ph' )->text()
-                               ) + User::passwordChangeInputAttribs() );
+                               ] + User::passwordChangeInputAttribs() );
                                ?>
                        </div>
 
@@ -143,14 +143,14 @@ class UsercreateTemplate extends BaseTemplate {
                        <div class="mw-ui-vform-field mw-row-password">
                                <label for='wpRetype'><?php $this->msg( 'createacct-yourpasswordagain' ); ?></label>
                                <?php
-                               echo Html::input( 'wpRetype', null, 'password', array(
+                               echo Html::input( 'wpRetype', null, 'password', [
                                        'class' => 'mw-ui-input loginPassword',
                                        'id' => 'wpRetype',
                                        'tabindex' => '5',
                                        'size' => '20',
                                        'required',
                                        'placeholder' => $this->getMsg( 'createacct-yourpasswordagain-ph' )->text()
-                                       ) + User::passwordChangeInputAttribs() );
+                               ] + User::passwordChangeInputAttribs() );
                                ?>
                        </div>
 
@@ -165,7 +165,7 @@ class UsercreateTemplate extends BaseTemplate {
                                                ?>
                                        </label>
                                        <?php
-                                               echo Html::input( 'wpEmail', $this->data['email'], 'email', array(
+                                               echo Html::input( 'wpEmail', $this->data['email'], 'email', [
                                                        'class' => 'mw-ui-input loginText',
                                                        'id' => 'wpEmail',
                                                        'tabindex' => '6',
@@ -173,7 +173,7 @@ class UsercreateTemplate extends BaseTemplate {
                                                        'required' => $this->data['emailrequired'],
                                                        'placeholder' => $this->getMsg( $this->data['loggedin'] ?
                                                                'createacct-another-email-ph' : 'createacct-email-ph' )->text()
-                                               ) );
+                                               ] );
                                        ?>
                                <?php } ?>
                        </div>
@@ -193,13 +193,13 @@ class UsercreateTemplate extends BaseTemplate {
                        <?php if ( $this->data['usereason'] ) { ?>
                                <div class="mw-ui-vform-field">
                                        <label for='wpReason'><?php $this->msg( 'createacct-reason' ); ?></label>
-                                       <?php echo Html::input( 'wpReason', $this->data['reason'], 'text', array(
+                                       <?php echo Html::input( 'wpReason', $this->data['reason'], 'text', [
                                                'class' => 'mw-ui-input loginText',
                                                'id' => 'wpReason',
                                                'tabindex' => '8',
                                                'size' => '20',
                                                'placeholder' => $this->getMsg( 'createacct-reason-ph' )->text()
-                                       ) ); ?>
+                                       ] ); ?>
                                </div>
                        <?php } ?>
 
@@ -265,15 +265,15 @@ class UsercreateTemplate extends BaseTemplate {
                                <?php
                                echo Html::submitButton(
                                        $this->getMsg( $this->data['loggedin'] ? 'createacct-another-submit' : 'createacct-submit' ),
-                                       array(
+                                       [
                                                'id' => 'wpCreateaccount',
                                                'name' => 'wpCreateaccount',
                                                'tabindex' => $tabIndex++
-                                       ),
-                                       array(
+                                       ],
+                                       [
                                                'mw-ui-block',
                                                'mw-ui-constructive',
-                                       )
+                                       ]
                                );
                                ?>
                        </div>
index 4a0b413..c2b2df6 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 // @codingStandardsIgnoreFile
 /**
- * Html form for user login (since 1.22 with VForm appearance).
+ * HTML form for user login (since 1.22 with VForm appearance).
  *
  * 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
@@ -58,24 +58,24 @@ class UserloginTemplate extends BaseTemplate {
 
                        <?php if ( $this->data['formheader'] ) { ?>
                                <div class="mw-form-formheader">
-                                       <?php $this->html( 'formheader' ); /* extensions such as MobileFrontend add html here */ ?>
+                                       <?php $this->html( 'formheader' ); /* extensions such as MobileFrontend add HTML here */ ?>
                                </div>
                        <?php } ?>
                        <div class="mw-ui-vform-field">
-                               <label for='wpName1'>
+                               <label for="wpName1">
                                        <?php
                                        $this->msg( 'userlogin-yourname' );
 
                                        if ( $this->data['secureLoginUrl'] ) {
-                                               echo Html::element( 'a', array(
+                                               echo Html::element( 'a', [
                                                        'href' => $this->data['secureLoginUrl'],
                                                        'class' => 'mw-ui-flush-right mw-secure',
-                                               ), $this->getMsg( 'userlogin-signwithsecure' )->text() );
+                                               ], $this->getMsg( 'userlogin-signwithsecure' )->text() );
                                        }
                                        ?>
                                </label>
                                <?php
-                               echo Html::input( 'wpName', $this->data['name'], 'text', array(
+                               echo Html::input( 'wpName', $this->data['name'], 'text', [
                                        'class' => 'loginText mw-ui-input',
                                        'id' => 'wpName1',
                                        'tabindex' => '1',
@@ -85,25 +85,25 @@ class UserloginTemplate extends BaseTemplate {
                                        // Set focus to this field if it's blank.
                                        'autofocus' => !$this->data['name'],
                                        'placeholder' => $this->getMsg( 'userlogin-yourname-ph' )->text()
-                               ) );
+                               ] );
                                ?>
                        </div>
 
                        <div class="mw-ui-vform-field">
-                               <label for='wpPassword1'>
+                               <label for="wpPassword1">
                                        <?php
                                        $this->msg( 'userlogin-yourpassword' );
                                        ?>
                                </label>
                                <?php
-                               echo Html::input( 'wpPassword', null, 'password', array(
+                               echo Html::input( 'wpPassword', null, 'password', [
                                        'class' => 'loginPassword mw-ui-input',
                                        'id' => 'wpPassword1',
                                        'tabindex' => '2',
                                        // Set focus to this field if username is filled in.
                                        'autofocus' => (bool)$this->data['name'],
                                        'placeholder' => $this->getMsg( 'userlogin-yourpassword-ph' )->text()
-                               ) );
+                               ] );
                                ?>
                        </div>
 
@@ -116,7 +116,7 @@ class UserloginTemplate extends BaseTemplate {
                                }
                        ?>
                                <div class="mw-ui-vform-field" id="mw-user-domain-section">
-                                       <label for='wpDomain'><?php $this->msg( 'yourdomainname' ); ?></label>
+                                       <label for="wpDomain"><?php $this->msg( 'yourdomainname' ); ?></label>
                                        <?php echo $select->getHTML(); ?>
                                </div>
                        <?php } ?>
@@ -142,14 +142,14 @@ class UserloginTemplate extends BaseTemplate {
 
                        <div class="mw-ui-vform-field">
                                <?php
-                               $attrs = array(
+                               $attrs = [
                                        'id' => 'wpLoginAttempt',
                                        'name' => 'wpLoginAttempt',
                                        'tabindex' => '6',
-                               );
-                               $modifiers = array(
-                                       'mw-ui-constructive',
-                               );
+                               ];
+                               $modifiers = [
+                                       'mw-ui-progressive',
+                               ];
                                echo Html::submitButton( $this->getMsg( 'pt-login-button' )->text(), $attrs, $modifiers );
                                ?>
                        </div>
@@ -158,11 +158,11 @@ class UserloginTemplate extends BaseTemplate {
                                <?php
                                echo Html::element(
                                        'a',
-                                       array(
+                                       [
                                                'href' => Skin::makeInternalOrExternalUrl(
                                                        wfMessage( 'helplogin-url' )->inContentLanguage()->text()
                                                ),
-                                       ),
+                                       ],
                                        $this->getMsg( 'userlogin-helplink2' )->text()
                                );
                                ?>
@@ -172,9 +172,9 @@ class UserloginTemplate extends BaseTemplate {
                        if ( $this->data['useemail'] && $this->data['canreset'] && $this->data['resetlink'] === true ) {
                                echo Html::rawElement(
                                        'div',
-                                       array(
+                                       [
                                                'class' => 'mw-ui-vform-field mw-form-related-link-container',
-                                       ),
+                                       ],
                                        Linker::link(
                                                SpecialPage::getTitleFor( 'PasswordReset' ),
                                                $this->getMsg( 'userlogin-resetpassword-link' )->escaped()
@@ -188,8 +188,8 @@ class UserloginTemplate extends BaseTemplate {
                                                <a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7"><?php $this->msg( 'userlogin-createanother' ); ?></a>
                                        </div>
                                <?php } else { ?>
-                                       <div id="mw-createaccount-cta" class="mw-form-related-link-container mw-ui-vform-field">
-                                               <?php $this->msg( 'userlogin-noaccount' ); ?><a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7" class="mw-ui-button mw-ui-progressive"><?php $this->msg( 'userlogin-joinproject' ); ?></a>
+                                       <div id="mw-createaccount-cta" class="mw-ui-vform-field">
+                                               <?php $this->msg( 'userlogin-noaccount' ); ?><a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7" class="mw-ui-button"><?php $this->msg( 'userlogin-joinproject' ); ?></a>
                                        </div>
                                <?php
                                }
index a874038..fb25249 100644 (file)
  * @author Michael Dale
  */
 abstract class UploadBase {
+       /** @var string Local file system path to the file to upload (or a local copy) */
        protected $mTempPath;
+       /** @var TempFSFile|null Wrapper to handle deleting the temp file */
+       protected $tempFileObj;
+
        protected $mDesiredDestName, $mDestName, $mRemoveTempFile, $mSourceType;
        protected $mTitle = false, $mTitleError = 0;
        protected $mFilteredName, $mFinalExtension;
@@ -219,8 +223,8 @@ abstract class UploadBase {
                if ( FileBackend::isStoragePath( $tempPath ) ) {
                        throw new MWException( __METHOD__ . " given storage path `$tempPath`." );
                }
-               $this->mTempPath = $tempPath;
-               $this->mFileSize = $fileSize;
+
+               $this->setTempFile( $tempPath, $fileSize );
                $this->mRemoveTempFile = $removeTempFile;
        }
 
@@ -231,6 +235,21 @@ abstract class UploadBase {
         */
        abstract public function initializeFromRequest( &$request );
 
+       /**
+        * @param string $tempPath File system path to temporary file containing the upload
+        * @param integer $fileSize
+        */
+       protected function setTempFile( $tempPath, $fileSize = null ) {
+               $this->mTempPath = $tempPath;
+               if ( strlen( $this->mTempPath ) && file_exists( $this->mTempPath ) ) {
+                       $this->tempFileObj = new TempFSFile( $this->mTempPath );
+                       $this->mFileSize = $fileSize ?: filesize( $this->mTempPath );
+               } else {
+                       $this->tempFileObj = null;
+                       $this->mFileSize = null;
+               }
+       }
+
        /**
         * Fetch the file. Usually a no-op
         * @return Status
@@ -952,9 +971,10 @@ abstract class UploadBase {
         * on exit to clean up.
         */
        public function cleanupTempFile() {
-               if ( $this->mRemoveTempFile && $this->mTempPath && file_exists( $this->mTempPath ) ) {
-                       wfDebug( __METHOD__ . ": Removing temporary file {$this->mTempPath}\n" );
-                       unlink( $this->mTempPath );
+               if ( $this->mRemoveTempFile && $this->tempFileObj ) {
+                       // Delete when all relevant TempFSFile handles go out of scope
+                       wfDebug( __METHOD__ . ": Marked temporary file '{$this->mTempPath}' for removal\n" );
+                       $this->tempFileObj->autocollect();
                }
        }
 
index 8ee0845..ebb4ebb 100644 (file)
@@ -148,10 +148,9 @@ class UploadFromChunks extends UploadFromFile {
 
                wfDebugLog( 'fileconcatenate', "Combined $i chunks in $tAmount seconds." );
 
-               // File system path
-               $this->mTempPath = $tmpPath;
-               // Since this was set for the last chunk previously
-               $this->mFileSize = filesize( $this->mTempPath );
+               // File system path of the actual full temp file
+               $this->setTempFile( $tmpPath );
+
                $ret = $this->verifyUpload();
                if ( $ret['status'] !== UploadBase::OK ) {
                        wfDebugLog( 'fileconcatenate', "Verification failed for chunked upload" );
index 68a169a..09124bf 100644 (file)
@@ -858,8 +858,6 @@ class User implements IDBAccessObject {
                        || strlen( $name ) > $wgMaxNameChars
                        || $name != $wgContLang->ucfirst( $name )
                ) {
-                       wfDebugLog( 'username', __METHOD__ .
-                               ": '$name' invalid due to empty, IP, slash, length, or lowercase" );
                        return false;
                }
 
@@ -869,8 +867,6 @@ class User implements IDBAccessObject {
                if ( is_null( $parsed )
                        || $parsed->getNamespace()
                        || strcmp( $name, $parsed->getPrefixedText() ) ) {
-                       wfDebugLog( 'username', __METHOD__ .
-                               ": '$name' invalid due to ambiguous prefixes" );
                        return false;
                }
 
@@ -885,8 +881,6 @@ class User implements IDBAccessObject {
                        '\x{e000}-\x{f8ff}' . # private use
                        ']/u';
                if ( preg_match( $unicodeBlacklist, $name ) ) {
-                       wfDebugLog( 'username', __METHOD__ .
-                               ": '$name' invalid due to blacklisted characters" );
                        return false;
                }
 
index e325e69..a14a376 100644 (file)
@@ -723,20 +723,6 @@ class Language {
                }
        }
 
-       /**
-        * @deprecated since 1.24, doesn't handle conflicting aliases. Use
-        *   SpecialPageFactory::getLocalNameFor instead.
-        * @param string $name
-        * @return string
-        */
-       function specialPage( $name ) {
-               $aliases = $this->getSpecialPageAliases();
-               if ( isset( $aliases[$name][0] ) ) {
-                       $name = $aliases[$name][0];
-               }
-               return $this->getNsText( NS_SPECIAL ) . ':' . $name;
-       }
-
        /**
         * @return array
         */
@@ -802,19 +788,6 @@ class Language {
                return $this->getMessageFromDB( "tog-$tog" );
        }
 
-       /**
-        * Get translated language names. This is done on best effort and
-        * by default this is exactly the same as Language::getLanguageNames.
-        * The CLDR extension provides translated names.
-        * @param string $code Language code.
-        * @return array Language code => language name
-        * @since 1.18.0
-        * @deprecated since 1.20, use fetchLanguageNames()
-        */
-       public static function getTranslatedLanguageNames( $code ) {
-               return self::fetchLanguageNames( $code, 'all' );
-       }
-
        /**
         * Get an array of language names, indexed by code.
         * @param null|string $inLanguage Code of language in which to return the names
@@ -940,17 +913,6 @@ class Language {
                return wfMessage( $msg )->inLanguage( $this );
        }
 
-       /**
-        * Get the native language name of $code.
-        * Only if defined in MediaWiki, no other data like CLDR.
-        * @param string $code
-        * @return string
-        * @deprecated since 1.20, use fetchLanguageName()
-        */
-       function getLanguageName( $code ) {
-               return self::fetchLanguageName( $code );
-       }
-
        /**
         * @param string $key
         * @return string
@@ -2882,6 +2844,7 @@ class Language {
        /**
         * @param string $s
         * @return string
+        * @throws MWException
         */
        function checkTitleEncoding( $s ) {
                if ( is_array( $s ) ) {
@@ -3336,7 +3299,7 @@ class Language {
         * Normally we output all numbers in plain en_US style, that is
         * 293,291.235 for twohundredninetythreethousand-twohundredninetyone
         * point twohundredthirtyfive. However this is not suitable for all
-        * languages, some such as Punjabi want à©¨à©¯à©©,੨੯੫.੨੩੫ and others such as
+        * languages, some such as Bengali (bn) want à§¨,৯৩,২৯১.২৩৫ and others such as
         * Icelandic just want to use commas instead of dots, and dots instead
         * of commas like "293.291,235".
         *
@@ -4221,7 +4184,7 @@ class Language {
         * Refresh the cache of conversion tables when
         * MediaWiki:Conversiontable* is updated.
         *
-        * @param Title $titleobj The Title of the page being updated
+        * @param Title $title The Title of the page being updated
         */
        public function updateConversionTable( Title $title ) {
                $this->mConverter->updateConversionTable( $title );
@@ -4268,15 +4231,6 @@ class Language {
                return self::$dataCache->getItem( $this->mCode, 'linkPrefixCharset' );
        }
 
-       /**
-        * @deprecated since 1.24, will be removed in 1.25
-        * @return Language
-        */
-       function getLangObj() {
-               wfDeprecated( __METHOD__, '1.24' );
-               return $this;
-       }
-
        /**
         * Get the "parent" language which has a converter to convert a "compatible" language
         * (in another variant) to this language (eg. zh for zh-cn, but not en for en-gb).
@@ -4402,6 +4356,7 @@ class Language {
        /**
         * @param string $code
         * @return string
+        * @throws MWException
         * @since 1.23
         */
        public static function getJsonMessagesFileName( $code ) {
@@ -4567,7 +4522,7 @@ class Language {
         * @param string $expiry Database expiry String
         * @param bool|int $format True to process using language functions, or TS_ constant
         *     to return the expiry in a given timestamp
-        * @param string $inifinity If $format is not true, use this string for infinite expiry
+        * @param string $infinity If $format is not true, use this string for infinite expiry
         * @return string
         * @since 1.18
         */
index 81e78b5..b31b10f 100644 (file)
@@ -160,7 +160,7 @@ class LanguageConverter {
 
                $req = $this->getURLVariant();
 
-               if ( $wgUser->isLoggedIn() && !$req ) {
+               if ( $wgUser->isSafeToLoad() && $wgUser->isLoggedIn() && !$req ) {
                        $req = $this->getUserVariant();
                } elseif ( !$req ) {
                        $req = $this->getHeaderVariant();
@@ -257,6 +257,9 @@ class LanguageConverter {
                // Get language variant preference from logged in users
                // Don't call this on stub objects because that causes infinite
                // recursion during initialisation
+               if ( !$wgUser->isSafeToLoad() ) {
+                       return false;
+               }
                if ( $wgUser->isLoggedIn() ) {
                        if ( $this->mMainLanguageCode == $wgContLang->getCode() ) {
                                $ret = $wgUser->getOption( 'variant' );
index d273085..08a40b8 100644 (file)
@@ -3237,6 +3237,7 @@ public static $zh2Hant = [
 '世纪钟' => '世紀鐘',
 '世纪钟表' => '世紀鐘錶',
 '丢丑' => '丟醜',
+'并吞下' => '並吞下',
 '并曰入淀' => '並曰入澱',
 '并发动' => '並發動',
 '并发展' => '並發展',
@@ -3709,7 +3710,6 @@ public static $zh2Hant = [
 '井干' => '井幹',
 '井里' => '井裡',
 '亚于' => '亞於',
-'亚美尼亚历' => '亞美尼亞曆',
 '交托' => '交託',
 '交游' => '交遊',
 '交哄' => '交鬨',
@@ -3730,7 +3730,6 @@ public static $zh2Hant = [
 '仁贵' => '仁貴',
 '介胄' => '介冑',
 '他干的' => '他幹的',
-'他钟' => '他鐘',
 '付托' => '付託',
 '仙后' => '仙后',
 '仙后座' => '仙后座',
@@ -3802,7 +3801,7 @@ public static $zh2Hant = [
 '并到' => '併到',
 '并合' => '併合',
 '并名' => '併名',
-'并吞下' => '併吞下',
+'并吞' => '併吞',
 '并拢' => '併攏',
 '并案' => '併案',
 '并流' => '併流',
@@ -3823,7 +3822,6 @@ public static $zh2Hant = [
 '使其斗' => '使其鬥',
 '来于' => '來於',
 '侍仆' => '侍僕',
-'供制' => '供製',
 '依依不舍' => '依依不捨',
 '依托' => '依託',
 '侵并' => '侵併',
@@ -4374,6 +4372,8 @@ public static $zh2Hant = [
 '后稷' => '后稷',
 '后綜' => '后綜',
 '后羿' => '后羿',
+'后苍' => '后蒼',
+'后蒼' => '后蒼',
 '后街' => '后街',
 '后角' => '后角',
 '后丰' => '后豐',
@@ -4404,6 +4404,7 @@ public static $zh2Hant = [
 '呆致致' => '呆緻緻',
 '呆里呆气' => '呆裡呆氣',
 '告札' => '告劄',
+'告里' => '告裡',
 '呦喂' => '呦喂',
 '周后' => '周后',
 '周惠后' => '周惠后',
@@ -4662,12 +4663,10 @@ public static $zh2Hant = [
 '大明历史' => '大明歷史',
 '大历' => '大曆',
 '大本钟' => '大本鐘',
-'大本钟敲' => '大本鐘敲',
 '大历史' => '大歷史',
 '大病初愈' => '大病初癒',
 '大目干连' => '大目乾連',
 '大笨钟' => '大笨鐘',
-'大笨钟敲' => '大笨鐘敲',
 '大蜡' => '大蜡',
 '大衍历' => '大衍曆',
 '大衍历史' => '大衍歷史',
@@ -4973,7 +4972,6 @@ public static $zh2Hant = [
 '年里' => '年裡',
 '年鉴' => '年鑑',
 '并力' => '并力',
-'并吞' => '并吞',
 '并州' => '并州',
 '并日而食' => '并日而食',
 '并迭' => '并迭',
@@ -5090,7 +5088,6 @@ public static $zh2Hant = [
 '吊慰' => '弔慰',
 '吊扣' => '弔扣',
 '吊拷' => '弔拷',
-'吊挂' => '弔掛',
 '吊撒' => '弔撒',
 '吊文' => '弔文',
 '吊旗' => '弔旗',
@@ -5118,7 +5115,9 @@ public static $zh2Hant = [
 '张勋' => '張勳',
 '张杰' => '張杰',
 '張杰' => '張杰',
+'张柏芝' => '張栢芝',
 '张乐于张徐' => '張樂于張徐',
+'强制' => '強制',
 '强制作用' => '強制作用',
 '强奸' => '強姦',
 '强干' => '強幹',
@@ -5171,7 +5170,6 @@ public static $zh2Hant = [
 '复始' => '復始',
 '复活节历表' => '復活節曆表',
 '复苏' => '復甦',
-'征人' => '徵人',
 '征令' => '徵令',
 '征信' => '徵信',
 '征候' => '徵候',
@@ -5399,6 +5397,8 @@ public static $zh2Hant = [
 '恶斗' => '惡鬥',
 '惴栗' => '惴慄',
 '意大利面' => '意大利麵',
+'愛河里花子' => '愛河里花子',
+'爱河里花子' => '愛河里花子',
 '爱困' => '愛睏',
 '感于' => '感於',
 '愿朴' => '愿樸',
@@ -5513,7 +5513,7 @@ public static $zh2Hant = [
 '扛大梁' => '扛大樑',
 '扯面' => '扯麵',
 '扶余' => '扶餘',
-'批准的' => '批准的',
+'批准' => '批准',
 '批准确定' => '批准確定',
 '批复' => '批覆',
 '批注' => '批註',
@@ -5577,16 +5577,8 @@ public static $zh2Hant = [
 '拳局' => '拳跼',
 '拼死拼活' => '拼死拼活',
 '拾沈' => '拾瀋',
-'拿下表' => '拿下錶',
-'拿下钟' => '拿下鐘',
 '拿准' => '拿準',
 '拿破仑' => '拿破崙',
-'挂图' => '挂圖',
-'挂帅' => '挂帥',
-'挂彩' => '挂彩',
-'挂念' => '挂念',
-'挂号' => '挂號',
-'挂车' => '挂車',
 '挌斗' => '挌鬥',
 '挑大梁' => '挑大樑',
 '挑斗' => '挑鬥',
@@ -5663,10 +5655,8 @@ public static $zh2Hant = [
 '掌柜' => '掌柜',
 '排骨面' => '排骨麵',
 '挂名' => '掛名',
-'挂帘' => '掛帘',
 '挂历' => '掛曆',
 '挂钩' => '掛鈎',
-'挂钟' => '掛鐘',
 '挂面' => '掛麵',
 '采下' => '採下',
 '采伐' => '採伐',
@@ -6086,7 +6076,7 @@ public static $zh2Hant = [
 '栗栖溪' => '栗栖溪',
 '校准' => '校準',
 '校舍' => '校舍',
-'核准的' => '核准的',
+'核准' => '核准',
 '格于' => '格於',
 '格范' => '格範',
 '格里历' => '格里曆',
@@ -6599,7 +6589,7 @@ public static $zh2Hant = [
 '争斗' => '爭鬥',
 '爰定祥历' => '爰定祥厤',
 '爽荡' => '爽蕩',
-'尔冬' => '爾冬陞',
+'尔冬' => '爾冬陞',
 '墙里' => '牆裡',
 '片里' => '片裡',
 '片言只语' => '片言隻語',
@@ -6665,7 +6655,9 @@ public static $zh2Hant = [
 '甄后' => '甄后',
 '瓮安' => '甕安',
 '甚于' => '甚於',
+'甜、咸' => '甜、鹹',
 '甜水面' => '甜水麵',
+'甜咸' => '甜鹹',
 '甜面酱' => '甜麵醬',
 '生力面' => '生力麵',
 '生于' => '生於',
@@ -6692,6 +6684,9 @@ public static $zh2Hant = [
 '男仆' => '男僕',
 '界里' => '界裡',
 '畏于' => '畏於',
+'留发展' => '留發展',
+'留发生' => '留發生',
+'留发行' => '留發行',
 '留长发' => '留長髮',
 '留发' => '留髮',
 '毕于' => '畢於',
@@ -6805,8 +6800,6 @@ public static $zh2Hant = [
 '相于' => '相於',
 '相冲' => '相衝',
 '相斗' => '相鬥',
-'看下表' => '看下錶',
-'看下钟' => '看下鐘',
 '看法里' => '看法裡',
 '看准' => '看準',
 '看表面' => '看表面',
@@ -6827,8 +6820,6 @@ public static $zh2Hant = [
 '困觉' => '睏覺',
 '睡游病' => '睡遊病',
 '瞄准' => '瞄準',
-'瞅下表' => '瞅下錶',
-'瞅下钟' => '瞅下鐘',
 '瞎蒙' => '瞎矇',
 '了望' => '瞭望',
 '了然' => '瞭然',
@@ -6864,6 +6855,7 @@ public static $zh2Hant = [
 '确瘠' => '确瘠',
 '碑志' => '碑誌',
 '碗里' => '碗裡',
+'碧河里' => '碧河里',
 '碰钟' => '碰鐘',
 '确系' => '確係',
 '码表' => '碼錶',
@@ -6921,6 +6913,7 @@ public static $zh2Hant = [
 '秦沈客运' => '秦瀋客運',
 '移祸于' => '移禍於',
 '稀松' => '稀鬆',
+'程十发' => '程十髮',
 '棱台' => '稜台',
 '棱子' => '稜子',
 '棱层' => '稜層',
@@ -6998,24 +6991,6 @@ public static $zh2Hant = [
 '竹制' => '竹製',
 '竹溪县' => '竹谿縣',
 '笑里藏刀' => '笑裡藏刀',
-'第一出现' => '第一出現',
-'第一出現' => '第一出現',
-'第一出線' => '第一出線',
-'第一出线' => '第一出線',
-'第一出' => '第一齣',
-'第七出' => '第七齣',
-'第三出局' => '第三出局',
-'第三出' => '第三齣',
-'第九出' => '第九齣',
-'第二出線' => '第二出線',
-'第二出线' => '第二出線',
-'第二出' => '第二齣',
-'第五出局' => '第五出局',
-'第五出' => '第五齣',
-'第八出' => '第八齣',
-'第六出' => '第六齣',
-'第四出局' => '第四出局',
-'第四出' => '第四齣',
 '笔杆' => '筆桿',
 '笔秃墨干' => '筆禿墨乾',
 '等于' => '等於',
@@ -7596,6 +7571,7 @@ public static $zh2Hant = [
 '虫部' => '虫部',
 '蚊动牛斗' => '蚊動牛鬥',
 '蛇发女妖' => '蛇髮女妖',
+'蛋白发' => '蛋白發',
 '蜂后' => '蜂后',
 '蜂涌' => '蜂湧',
 '蜂准' => '蜂準',
@@ -7769,6 +7745,7 @@ public static $zh2Hant = [
 '复目' => '複目',
 '复眼' => '複眼',
 '复种' => '複種',
+'复穗' => '複穗',
 '复线' => '複線',
 '复习' => '複習',
 '复色' => '複色',
@@ -8215,6 +8192,7 @@ public static $zh2Hant = [
 '游客' => '遊客',
 '游宦' => '遊宦',
 '游山玩水' => '遊山玩水',
+'游廊' => '遊廊',
 '游必有方' => '遊必有方',
 '游憩' => '遊憩',
 '游戏' => '遊戲',
@@ -8222,6 +8200,7 @@ public static $zh2Hant = [
 '游手好闲' => '遊手好閒',
 '游方' => '遊方',
 '游星' => '遊星',
+'游春' => '遊春',
 '游乐' => '遊樂',
 '游标卡尺' => '遊標卡尺',
 '游历' => '遊歷',
@@ -8629,7 +8608,6 @@ public static $zh2Hant = [
 '陈杰' => '陳杰',
 '陳杰' => '陳杰',
 '陈炼' => '陳鍊',
-'陆游' => '陸遊',
 '阳春面' => '陽春麵',
 '阳历' => '陽曆',
 '阳历史' => '陽歷史',
@@ -8648,6 +8626,7 @@ public static $zh2Hant = [
 '只身' => '隻身',
 '雄斗斗' => '雄斗斗',
 '雅范' => '雅範',
+'集团' => '集團',
 '集数里' => '集數裡',
 '集于' => '集於',
 '集里' => '集裡',
@@ -8764,6 +8743,7 @@ public static $zh2Hant = [
 '预报不准' => '預報不準',
 '预制' => '預製',
 '领袖欲' => '領袖慾',
+'头发现' => '頭發現',
 '头里' => '頭裡',
 '头长发' => '頭長髮',
 '头发' => '頭髮',
@@ -9016,10 +8996,11 @@ public static $zh2Hant = [
 '发短心长' => '髮短心長',
 '发禁' => '髮禁',
 '发笺' => '髮箋',
+'发簪' => '髮簪',
 '发纱' => '髮紗',
 '发结' => '髮結',
 '发丝' => '髮絲',
-'发网' => '髮網',
+'发网菌' => '髮網菌',
 '发脚' => '髮腳',
 '发肤' => '髮膚',
 '发胶' => '髮膠',
@@ -9027,7 +9008,6 @@ public static $zh2Hant = [
 '发蜡' => '髮蠟',
 '发踊冲冠' => '髮踴沖冠',
 '发辫' => '髮辮',
-'发针' => '髮針',
 '发钗' => '髮釵',
 '发长' => '髮長',
 '发际' => '髮際',
@@ -9241,6 +9221,7 @@ public static $zh2Hant = [
 '鹤发' => '鶴髮',
 '鸾鉴' => '鸞鑑',
 '鹰雕' => '鹰鵰',
+'咸、甜' => '鹹、甜',
 '咸味' => '鹹味',
 '咸嘴淡舌' => '鹹嘴淡舌',
 '咸土' => '鹹土',
@@ -9255,6 +9236,7 @@ public static $zh2Hant = [
 '咸汤' => '鹹湯',
 '咸潟' => '鹹潟',
 '咸湿' => '鹹濕',
+'咸甜' => '鹹甜',
 '咸的' => '鹹的',
 '咸粥' => '鹹粥',
 '咸肉' => '鹹肉',
@@ -10521,6 +10503,7 @@ public static $zh2Hans = [
 '潄' => '漱',
 '潑' => '泼',
 '潔' => '洁',
+'潕' => '𣲘',
 '潙' => '沩',
 '潛' => '潜',
 '潤' => '润',
@@ -11842,6 +11825,7 @@ public static $zh2Hans = [
 '躒' => '跞',
 '躓' => '踬',
 '躕' => '蹰',
+'躘' => '𨀁',
 '躚' => '跹',
 '躝' => '𨅬',
 '躡' => '蹑',
@@ -13874,7 +13858,6 @@ public static $zh2TW = [
 '行人路' => '人行道',
 '石勒苏益格' => '什勒斯維希',
 '石勒蘇益格' => '什勒斯維希',
-'界面' => '介面',
 '伊利诺伊州' => '伊利諾州',
 '伊斯坦布尔' => '伊斯坦堡',
 '伊斯坦布爾' => '伊斯坦堡',
@@ -14010,6 +13993,8 @@ public static $zh2TW = [
 '航天器' => '太空飛行器',
 '尼日利亚' => '奈及利亞',
 '尼日利亞' => '奈及利亞',
+'內羅畢' => '奈洛比',
+'内罗毕' => '奈洛比',
 '忌廉' => '奶油',
 '荷里活' => '好萊塢',
 '威廉姆斯' => '威廉士',
@@ -14028,7 +14013,6 @@ public static $zh2TW = [
 '安提瓜和巴布達' => '安地卡及巴布達',
 '洪都拉斯' => '宏都拉斯',
 '密歇根' => '密西根',
-'宽带' => '寬頻',
 '老挝人民民主共和国' => '寮人民民主共和國',
 '老撾人民民主共和國' => '寮人民民主共和國',
 '老挝' => '寮國',
@@ -14422,7 +14406,6 @@ public static $zh2TW = [
 '格莱美奖' => '葛萊美獎',
 '黑山共和国' => '蒙特內哥羅共和國',
 '黑山共和國' => '蒙特內哥羅共和國',
-'滿地可' => '蒙特婁',
 '蒙特利尔' => '蒙特婁',
 '蒙特利爾' => '蒙特婁',
 '普密蓬' => '蒲美蓬',
@@ -14704,7 +14687,6 @@ public static $zh2HK = [
 '布控' => '佈控',
 '布于' => '佈於',
 '布於' => '佈於',
-'布施' => '佈施',
 '布景' => '佈景',
 '布满' => '佈滿',
 '布滿' => '佈滿',
@@ -15032,6 +15014,7 @@ public static $zh2HK = [
 '光著錄' => '光著錄',
 '柯林頓' => '克林頓',
 '克羅埃西亞' => '克羅地亞',
+'奈洛比' => '內羅畢',
 '公布' => '公佈',
 '冒著' => '冒着',
 '冒著作' => '冒著作',
@@ -15194,6 +15177,7 @@ public static $zh2HK = [
 '吹著錄' => '吹著錄',
 '呆著' => '呆着',
 '呆里呆气' => '呆裏呆氣',
+'告里' => '告裏',
 '味著' => '味着',
 '味著作' => '味著作',
 '味著名' => '味著名',
@@ -15869,6 +15853,8 @@ public static $zh2HK = [
 '撼著者' => '撼著者',
 '撼著述' => '撼著述',
 '撼著錄' => '撼著錄',
+'择日占星' => '擇日占星',
+'擇日占星' => '擇日占星',
 '擋著' => '擋着',
 '擋著作' => '擋著作',
 '擋著名' => '擋著名',
@@ -15895,6 +15881,7 @@ public static $zh2HK = [
 '擺著者' => '擺著者',
 '擺著述' => '擺著述',
 '擺著錄' => '擺著錄',
+'收錄著' => '收錄着',
 '攻占' => '攻佔',
 '放著' => '放着',
 '放著作' => '放著作',
@@ -16637,6 +16624,7 @@ public static $zh2HK = [
 '系列里' => '系列裏',
 '係數' => '系數',
 '系里' => '系裏',
+'紀錄著' => '紀錄着',
 '約占' => '約佔',
 '约占' => '約佔',
 '紐賓士域' => '紐賓士域',
@@ -16859,7 +16847,6 @@ public static $zh2HK = [
 '葉爾欽' => '葉利欽',
 '葡占' => '葡佔',
 '葫芦里卖甚么药' => '葫蘆裏賣甚麼藥',
-'滿地可' => '蒙特利爾',
 '蒙特婁' => '蒙特利爾',
 '蒙著' => '蒙着',
 '蒙著作' => '蒙著作',
@@ -16992,6 +16979,7 @@ public static $zh2HK = [
 '記著者' => '記著者',
 '記著述' => '記著述',
 '記著錄' => '記著錄',
+'記錄著' => '記錄着',
 '試著' => '試着',
 '試著作' => '試著作',
 '試著名' => '試著名',
@@ -17925,6 +17913,7 @@ public static $zh2CN = [
 '關著述' => '关著述',
 '關帳' => '关账',
 '記憶體' => '内存',
+'奈洛比' => '内罗毕',
 '甘比亞' => '冈比亚',
 '冒著' => '冒着',
 '冒著書' => '冒著书',
@@ -18253,6 +18242,8 @@ public static $zh2CN = [
 '坐著稱' => '坐著称',
 '坐著者' => '坐著者',
 '坐著述' => '坐著述',
+'坚杜拜' => '坚杜拜',
+'堅杜拜' => '坚杜拜',
 '堅貞著' => '坚贞着',
 '坦尚尼亞' => '坦桑尼亚',
 '伊波拉' => '埃博拉',
@@ -18346,7 +18337,6 @@ public static $zh2CN = [
 '定著者' => '定著者',
 '定著述' => '定著述',
 '波里活' => '宝莱坞',
-'寬頻' => '宽带',
 '密执安' => '密歇根',
 '密西根' => '密歇根',
 '對著' => '对着',
@@ -18575,6 +18565,7 @@ public static $zh2CN = [
 '想著述' => '想著述',
 '義大利' => '意大利',
 '戈巴契夫' => '戈尔巴乔夫',
+'成份股' => '成份股',
 '成份' => '成分',
 '戰著' => '战着',
 '戰著書' => '战著书',
@@ -18818,6 +18809,7 @@ public static $zh2CN = [
 '撼著者' => '撼著者',
 '撼著述' => '撼著述',
 '作業系統' => '操作系统',
+'收錄著' => '收录着',
 '收帳' => '收账',
 '放著' => '放着',
 '放著作' => '放著作',
@@ -19550,6 +19542,7 @@ public static $zh2CN = [
 '索馬利蘭' => '索马里兰',
 '正體中文' => '繁体中文',
 '強斯頓環礁' => '约翰斯顿岛',
+'紀錄著' => '纪录着',
 '縱著' => '纵着',
 '組份' => '组分',
 '經常帳' => '经常账',
@@ -19686,7 +19679,6 @@ public static $zh2CN = [
 '落著稱' => '落著称',
 '落著者' => '落著者',
 '落著述' => '落著述',
-'滿地可' => '蒙特利尔',
 '蒙特婁' => '蒙特利尔',
 '蒙著' => '蒙着',
 '蒙著書' => '蒙著书',
@@ -19770,6 +19762,7 @@ public static $zh2CN = [
 '計畫' => '计划',
 '電腦程式' => '计算机程序',
 '認帳' => '认账',
+'記錄著' => '记录着',
 '記著' => '记着',
 '記著書' => '记著书',
 '記著作' => '记著作',
index 209f252..20047c4 100644 (file)
        "recentchanges-label-minor": "Nyoe neuandam ubeut",
        "recentchanges-label-bot": "Neuandam nyoe geupubuet le bot",
        "recentchanges-label-unpatrolled": "Neuandam nyoe goh lom geukalon",
-       "recentchanges-legend-heading": "'''Hareutoë:'''",
+       "recentchanges-legend-heading": "<strong>Hareutoë:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (eu cit [[Special:NewPages|dapeuta laman barô]])",
        "rcnotefrom": "Di yup nyoë nakeuh neuubah yôh <strong>$2</strong> (geupeudeuh trôh ‘an <strong>$1</strong> neuubah).",
        "rclistfrom": "Peudeuih neuubah barô yôh $3 $2 kön",
index f27094d..05e0c7c 100644 (file)
        "passwordreset-email": "Емэйл адрес:",
        "passwordreset-emailtitle": "Аккаунт и гъэпсыкIэхэр, мий щыI {{SITENAME}}",
        "passwordreset-emailelement": "НэбгырацIэ: \n$1\n\nTemporary password: \n$2",
-       "passwordreset-emailsent": "Мыр регистрыгъэ емэйлэу щытмэ уи аккаунтым пае, шъэфгущыIэм и зэтедз емэйл къыпфагъэхьыщт.",
+       "passwordreset-emailsentemail": "Мыр регистрыгъэ емэйлэу щытмэ уи аккаунтым пае, шъэфгущыIэм и зэтедз емэйл къыпфагъэхьыщт.",
        "passwordreset-emailsent-capture": "ШъэфгущыIэм изэтедз фэгъэхьыгъэ емэйлыр гъахьыгъэ, ычIэгъкIэ ар олъэгъу.",
        "changeemail": "Зэблэхъу е тегъэкI емэйл адресыр",
        "changeemail-no-info": "Мы нэкIубгъом занкIэу укIонэу уфаемэ, системэм ухэхьэгъэн фае.",
        "prefs-displayrc": "ГъэпсыкIэхэр къэгъэлъагъу",
        "prefs-displaywatchlist": "ГъэпсыкIэхэр къэгъэлъагъу",
        "prefs-tokenwatchlist": "Токен",
-       "email-address-validity-valid": "Емэйл адресыр тэрэзым фэд",
-       "email-address-validity-invalid": "Емэйл адрес тэрэз итх",
        "userrights-lookup-user": "Нэбгырэмэ якупхэр гъэпс",
        "userrights-user-editname": "Итх уи нэбгырацӀэр:",
        "editusergroup": "Нэбгырэмэ я купмэ яIаз",
        "recentchanges-label-bot": "Мы хэӀэзэныгъэр ботым ышӀыгъ",
        "recentchanges-label-unpatrolled": "Мы хэӀэзэныгъэм джыри патрулэу ауплъэкӀугъэп",
        "recentchanges-label-plusminus": "НэкIубгъом ионтэгъугъэ мыщ фэдиз байт пчъагъэкIэ зэхъокIыгъэ",
-       "recentchanges-legend-heading": "'''Тхыдэ:'''",
+       "recentchanges-legend-heading": "<strong>Тхыдэ:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (нэмыкӀэу еплъ [[Special:NewPages|нэкӀубгъуакӀэ куп]])",
        "rclistfrom": "ХэIэзэныкIэхэр къэгъэлъагъу мыщ щегъэжьагъэу $2, $3",
        "rcshowhideminor": "$1 зэхъокӀыныгъэ цӀыкӀу",
        "upload-description": "Файлым и къэбар",
        "upload-options": "Илъхьан гъэпсыкIэхэр",
        "watchthisupload": "Мы файлым лъыплъ",
-       "upload-success-subj": "ШIоу илъхьагъ",
        "upload-proto-error": "Протокол фыкъуагъэ",
        "upload-file-error": "ЫкIоцI фыкъуагъэ",
        "upload-misc-error": "ЗэхэмышIыкIыгъэ илъхьан фыкъуагъэ",
        "upload-dialog-button-done": "ЗэшIуэкIыгъэ",
        "upload-dialog-button-save": "Итх",
        "upload-dialog-button-upload": "Илъхь",
-       "upload-form-label-select-file": "Къыхэх файл",
        "upload-form-label-infoform-title": "Къэбар",
        "upload-form-label-infoform-name": "ЦIэ",
        "upload-form-label-infoform-description": "АгурыбгъэIон",
index 0d1c8d7..0c51902 100644 (file)
        "recentchanges-label-bot": "Hierdie wysiging is deur 'n bot gemaak",
        "recentchanges-label-unpatrolled": "Die wysiging is nog nie gekontroleer nie",
        "recentchanges-label-plusminus": "Bladsy is met die aantal grepe gewysig",
-       "recentchanges-legend-heading": "'''Sleutel:'''",
+       "recentchanges-legend-heading": "<strong>Sleutel:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sien ook die [[Special:NewPages|lys van nuwe bladsye]])",
        "rcnotefrom": "Wysigings sedert <strong>$2</strong> (maksimum van <strong>$1</strong> word gewys).",
        "rclistfrom": "Vertoon wysigings vanaf $3 $2",
index 44192fd..2621af9 100644 (file)
        "recentchanges-label-bot": "इ संपादन बॉट न॑ करलकै",
        "recentchanges-label-unpatrolled": "इ संपादन अखनी जाँचलऽ नै गेलऽ छै.",
        "recentchanges-label-plusminus": "पृष्ठ आकार इ बाइट संख्या सं॑ बदललै",
-       "recentchanges-legend-heading": "'''विवरण:'''",
+       "recentchanges-legend-heading": "<strong>विवरण:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नया पन्ना के सूची]] क॑ भी देखऽ)",
        "rclistfrom": "$3 $2 सं॑ नया बदलाव देखलाबऽ",
        "rcshowhideminor": "छोटऽ बदलाव $1",
index 2ec6120..358fa89 100644 (file)
@@ -58,7 +58,8 @@
                        "Haytham morsy",
                        "BAB ZAA",
                        "ASammour",
-                       "Maroen1990"
+                       "Maroen1990",
+                       "Sonic N800"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "moredotdotdot": "المزيد...",
        "morenotlisted": "هذه القائمة غير مكتملة.",
        "mypage": "صفحة",
+       "anonuserpage": "مستخدم غير معروف",
        "mytalk": "نقاش",
        "anontalk": "نقاش",
        "navigation": "تصفح",
        "nocookieslogin": "يستخدم {{SITENAME}} الكوكيز لتسجيل الدخول.\nالكوكيز معطلة لديك.\nمن فضلك فعلها ثم حاول مرة أخرى.",
        "nocookiesfornew": "لم يتم إنشاء حساب المستخدم، لأننا لم نستطع تأكيد مصدره. \nتأكد من أن ملفات تعريف الارتباط (الكوكيز) مفعلة عندك، ثم أعد تحميل الصفحة وحاول مرة أخرى.",
        "noname": "لم تحدد اسم مستخدم صحيح.",
-       "loginsuccesstitle": "تم الدخول بشكل صحيح",
+       "loginsuccesstitle": "تم الدخول",
        "loginsuccess": "'''لقد سجلت الدخول ل{{SITENAME}} باسم \"$1\".'''",
        "nosuchuser": "لا يوجد مستخدم بالاسم \"$1\".\nأسماء المستخدمين حساسة لحالة الحروف.\nتأكد من إملاء الاسم، أو [[Special:UserLogin/signup|قم بإنشاء حساب جديد]].",
        "nosuchusershort": "لا يوجد مستخدم باسم $1\".\nتأكد من إملاء الاسم.",
        "createaccount-title": "إنشاء حساب في {{SITENAME}}",
        "createaccount-text": "شخص ما أنشأ حسابا لعنوان بريدك الإلكتروني في {{SITENAME}} ($4) بالاسم \"$2\"، كلمة السر \"$3\".\nينبغي عليك تسجيل الدخول وتغيير كلمة السر الخاصة بك الآن.\n\nيمكنك تجاهل هذه الرسالة، لو تم إنشاء هذا الحساب بالخطأ.",
        "login-throttled": "لقد قمت بمحاولات دخول كثيرة جدا مؤخرا.\nمن فضلك انتظر $1 قبل المحاولة مرة أخرى.",
-       "login-abort-generic": "Ù\84Ù\85 Ù\8aÙ\86جح Ù\88Ù\84Ù\88جك - تم إجهاضه",
+       "login-abort-generic": "Ù\81Ø´Ù\84 Ø¯Ø®Ù\88Ù\84ك - تم إجهاضه",
        "login-migrated-generic": "تم تهجير حسابك، ولم يعد اسم المستخدم الخاص بك موجوداً على هذه الويكي",
        "loginlanguagelabel": "اللغة: $1",
        "suspicious-userlogout": "رفض طلب خروجك لأنه يبدو كأنه أرسل عن طريق متصفح معطوب أو وسيط تخزين.",
        "newpassword": "كلمة السر الجديدة:",
        "retypenew": "أعد كتابة كلمة السر الجديدة:",
        "resetpass_submit": "ضبط كلمة السر والدخول",
-       "changepassword-success": "تم تغيير كلمة السر بنجاح!",
+       "changepassword-success": "تم تغيير كلمة السر !",
        "changepassword-throttled": "لديك محاولات تسجيل دخول كثيرة حديثة. من فضلك انتظر $1 قبل المحاولة ثانية.",
        "botpasswords": "كلمات مرور البوت",
        "botpasswords-disabled": "كلمات السر الخاصة بالبوت معطلة.",
        "botpasswords-label-restrictions": "قيود الاستخدام:",
        "botpasswords-label-grants-column": "الممنوح",
        "botpasswords-bad-appid": "اسم البوت \"$1\" غير صحيح.",
+       "botpasswords-insert-failed": "فشل في اضافة  اسم البوت \"$1\".هل اضيف بالفعل؟",
+       "botpasswords-update-failed": "فشل في تحديث اسم بوت \"$1\". هل تم حذفه؟",
        "botpasswords-created-title": "صناعة كلمة سر ألية",
+       "botpasswords-created-body": "تم إنشاء كلمة مرور بوت \"$1\".",
        "botpasswords-updated-title": "تحديث كلمة السر الألية",
+       "botpasswords-updated-body": "كلمة سر البوت\"$1\" قد حذفت.",
        "botpasswords-deleted-title": "كلمة سر البوت حذفت",
        "botpasswords-deleted-body": "كلمة سر البوت\"$1\" قد حذفت.",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider غير متاح.",
        "resetpass_forbidden": "كلمات السر لا يمكن تغييرها",
        "resetpass-no-info": "يجب أن تكون مسجل الدخول للوصول إلى هذه الصفحة مباشرة.",
        "resetpass-submit-loggedin": "تغيير كلمة السر",
        "revdelete-unsuppress": "إزالة الضوابط من المراجعات المسترجعة",
        "revdelete-log": "السبب:",
        "revdelete-submit": "طبق على {{PLURAL:$1||المراجعة المختارة|المراجعتين المختارتين|المراجعات المختارة}}",
-       "revdelete-success": "'''تم تحديث رؤية المراجعات بنجاح.'''",
+       "revdelete-success": "تم تحديث رؤية المراجعات بنجاح.",
        "revdelete-failure": "'''تعذر تحديث رؤية المراجعة:'''\n$1",
-       "logdelete-success": "'''تم ضبط رؤية السجلات بنجاح.'''",
+       "logdelete-success": "تم ضبط رؤية السجلات بنجاح.",
        "logdelete-failure": "'''تعذر ضبط رؤية السجل:'''\n$1",
        "revdel-restore": "تغيير الرؤية",
        "pagehist": "تاريخ الصفحة",
        "mergehistory-go": "عرض التعديلات القابلة للدمج",
        "mergehistory-submit": "دمج المراجعات",
        "mergehistory-empty": "لا مراجعات يمكن دمجها.",
-       "mergehistory-done": "$3 {{PLURAL:$3|مراجعة|مراجعة}} من $1 تم دمجها بنجاح في [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|مراجعة|مراجعة}} من $1{{PLURAL:$3|كان|اين}} تم دمجها بنجاح في [[:$2]].",
        "mergehistory-fail": "غير قادر على عمل دمج التاريخ، من فضلك أعد التحقق من محددات الصفحة والزمن.",
        "mergehistory-fail-bad-timestamp": "الختم الزمني غير صالح.",
        "mergehistory-fail-invalid-source": "الصفحة المصدر غير صالحة.",
        "mergehistory-fail-no-change": "دمج التاريخ لم يدمج أية مراجعات. برجاء التحقق من معاملات الصفحة والزمن.",
        "mergehistory-fail-permission": "سماحيات غير كافية لدمج التاريخ.",
        "mergehistory-fail-self-merge": "الصفحتان المصدر والوجهة هما نفس الصفحة.",
+       "mergehistory-fail-timestamps-overlap": "مراجعات المصدر تتداخل أو تأتي بعد مراجعات الوجهة.",
        "mergehistory-fail-toobig": "لا يمكن إجراء دمج التاريخ بسبب تجاوز حدود عدد المراجعات المنقولة {{PLURAL:$1|المراجعة الواحدة|المراجعتين|$1 مراجعات|$1 مراجعة}}.",
        "mergehistory-no-source": "الصفحة المصدر $1 غير موجودة.",
        "mergehistory-no-destination": "الصفحة الهدف $1 غير موجودة.",
        "right-createpage": "إنشاء الصفحات (التي ليست صفحات نقاش)",
        "right-createtalk": "إنشاء صفحات النقاش",
        "right-createaccount": "إنشاء حسابات مستخدم جديدة",
+       "right-autocreateaccount": "تسجيل الدخول باستخدام حساب مستخدم خارجي",
        "right-minoredit": "التعليم على التعديلات كطفيفة",
        "right-move": "نقل الصفحات",
        "right-move-subpages": "نقل الصفحات مع صفحاتها الفرعية",
        "grant-editpage": "تعديل صفحات موجودة",
        "grant-editprotected": "تعديل صفحات محمية",
        "grant-highvolume": "تعديل كبير الحجم",
+       "grant-patrol": "تغييرات دورية للصفحات",
        "grant-protect": "حماية وإزالة حماية الصفحات",
        "grant-rollback": "استرجاع التغييرات في الصفحات",
        "grant-sendemail": "إرسال بريد إلكتروني للمستخدمين الآخرين",
        "action-createpage": "إنشاء الصفحات",
        "action-createtalk": "إنشاء صفحات النقاش",
        "action-createaccount": "إنشاء حساب المستخدم هذا",
+       "action-autocreateaccount": "تلقائيا إنشاء هذا الحساب مستخدم خارجي",
        "action-history": "اعرض تاريخ هذه الصفحة",
        "action-minoredit": "التعليم على هذا التعديل كطفيف",
        "action-move": "نقل هذه الصفحة",
        "uploadstash-clear": "مسح الملفات المخبأة",
        "uploadstash-nofiles": "ليس لديك أي ملفات مخبأة.",
        "uploadstash-badtoken": "لم ينجح أداء ذلك العمل، ربما لأن وثائق تفويض التحرير الخاصة بك منتهية الصلاحية. حاول مرة أخرى.",
-       "uploadstash-errclear": "Ù\84Ù\85 ØªÙ\86جح عملية مسح الملفات.",
+       "uploadstash-errclear": "Ù\81Ø´Ù\84ت عملية مسح الملفات.",
        "uploadstash-refresh": "تحديث قائمة الملفات",
        "invalid-chunk-offset": "قطعة أوفست غير صالحة",
        "img-auth-accessdenied": "رفض الوصول",
        "apisandbox-dynamic-error-exists": "يوجد بالفعل معامل باسم \"$1\".",
        "apisandbox-deprecated-parameters": "معاملات مهملة",
        "apisandbox-submit-invalid-fields-title": "بعض الحقول غير صالحة",
+       "apisandbox-submit-invalid-fields-message": "برجاء تصحيح الحقل المعلم والمحاولة مرة أخرى.",
        "apisandbox-results": "النتائج",
        "apisandbox-sending-request": "إرسال طلب API ...",
        "apisandbox-loading-results": "استقبال طلبات API ...",
        "apisandbox-request-url-label": "مسار الطلب:",
-       "apisandbox-request-time": "وقت الطلب: $1",
+       "apisandbox-request-time": "وقت الطلب: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "رمز الصحيح وإعادة الموافقة",
        "apisandbox-alert-page": "هناك حقول غير صالحة في هذه الصفحة.",
        "apisandbox-alert-field": "قيمة هذا الحقل غير صالحة.",
        "booksources": "مصادر كتاب",
        "changecontentmodel-title-label": "عنوان الصفحة",
        "changecontentmodel-model-label": "نموذج محتوى جديد",
        "changecontentmodel-reason-label": "السبب:",
+       "changecontentmodel-submit": "تغيير",
        "changecontentmodel-success-title": "نموذج المحتوى تم تغييره",
        "changecontentmodel-success-text": "نوع المحتوى ل[[:$1]] تم تغييره.",
        "changecontentmodel-cannot-convert": "المحتوى على [[:$1]] لا يمكن تحويله لنوع من $2.",
        "pageinfo-language": "لغة محتوى الصفحة",
        "pageinfo-content-model": "نموذج محتوى الصفحة",
        "pageinfo-robot-policy": "فهرسة الروبوتات",
-       "pageinfo-robot-index": "مسموحة",
-       "pageinfo-robot-noindex": "غير مسموحة",
+       "pageinfo-robot-index": "مسموح بها",
+       "pageinfo-robot-noindex": "غير مسموح بها",
        "pageinfo-watchers": "عدد المراقبين",
        "pageinfo-visiting-watchers": "عدد مراقبي الصفحة الذين زاروا التعديلات الأخيرة",
        "pageinfo-few-watchers": "أقل من {{PLURAL:$1||مراقب واحد|مراقبين اثنين|$1 مراقبين|$1 مراقباً|$1 مراقب}}",
        "tags-deactivate": "تعطيل",
        "tags-hitcount": "{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}",
        "tags-manage-no-permission": "ليس لديك صلاحية إدارة وسوم التغيير.",
+       "tags-manage-blocked": "لا يمكنك إدارة علامات التغيير في حين منعت.",
        "tags-create-heading": "إنشاء وسم جديد",
        "tags-create-explanation": "في الوضع الافتراضي، الوسوم الجديدة المنشأة سيتاح استخدامها للبوتات والمستخدمين.",
        "tags-create-tag-name": "اسم الوسم:",
        "tags-create-reason": "السبب:",
        "tags-create-submit": "أنشئ",
        "tags-create-no-name": "عليك أن تحدد اسم الوسم.",
+       "tags-create-invalid-title-chars": "يجب أن لا تحتوي أسماء العلامات الأحرف التي لا يمكن استخدامها في عناوين الصفحات.",
        "tags-create-already-exists": "الوسم \"$1\" موجود بالفعل.",
        "tags-create-warnings-below": "هل تود متابعة إنشاء الوسم؟",
        "tags-delete-title": "احذف الوسم",
        "tags-deactivate-reason": "سبب",
        "tags-deactivate-not-allowed": "من غير الممكن تعطيل الوسم \"$1\".",
        "tags-deactivate-submit": "عطل",
+       "tags-apply-no-permission": "ليس لديك إذن لتطبيق علامات التغيير جنبا إلى جنب مع التغييرات.",
+       "tags-apply-blocked": "لا يمكنك تطبيق علامات التغيير جنبا إلى جنب مع التغييرات في حين منعت.",
        "tags-apply-not-allowed-one": "السوم \"$1\" غير مسموح أن يتم تطبيقه يدويا.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|الوسم|الوسوم}} التالية غير مسموح أن يتم تطبيقها يدويا: $1",
        "tags-update-no-permission": "أنت لا تمتلك السماح لإضافة أو إزالة وسوم التغيير من المراجعات أو مدخلات السجل الفردية.",
        "tags-edit-reason": "السبب:",
        "tags-edit-revision-submit": "طبق التغييرات ل{{PLURAL:$1|هذه المراجعة|$1 مراجعات}}",
        "tags-edit-logentry-submit": "طبق التغييرات ل{{PLURAL:$1|مدخلة السجل هذه|$1 مدخلات السجل}}",
-       "tags-edit-success": "طبقت التغييرات بنجاح.",
+       "tags-edit-success": "طبقت التغييرات.",
        "tags-edit-failure": "التغييرات لم تطبق: $1",
        "tags-edit-nooldid-title": "مراجعة هدف غير صالحة",
        "tags-edit-none-selected": "من فضلك اختر على الأقل وسما واحدا للإضافة أو الإزالة.",
        "api-error-publishfailed": "خطأ داخلي: لم ينجح الخادوم في نشر ملف مؤقت",
        "api-error-stasherror": "حدث خطأ أثناء رفع الملف لتخزينه.",
        "api-error-stashedfilenotfound": "لم يعثر على الملف المحجوب عند محاولة رفعه من الحجب.",
+       "api-error-stashpathinvalid": "وكان الطريق الذي يجب أن يتم العثور على ملف مخبئ غير صالح.",
        "api-error-stashfilestorage": "حدث خطأ أثناء رفع الملف لتخزينه.",
+       "api-error-stashzerolength": "لا يمكن أن خادم تخبئة الملف، لأنه يحتوي على طول صفري.",
        "api-error-stashnotloggedin": "يجب عليك تسجيل الدخول لحفظ الملفات في مرفوعاتك.",
        "api-error-stashwrongowner": "الملف الذي كنت تحاول الوصول اليه في مخبوائتك ليس لك.",
        "api-error-stashnosuchfilekey": "الملف الذي كنت تحاول الوصول اليه في مخبوائتك غير موجود.",
        "expand_templates_generate_xml": "اعرض شجرة XML parse",
        "expand_templates_generate_rawhtml": "أظهر خام HTML",
        "expand_templates_preview": "عرض مسبق",
+       "expand_templates_preview_fail_html": "<em>عذرا! لم نستطع معالجة تعديلك بسبب فقدان بيانات الجلسة.\n\nلأن {{SITENAME}} بها HTML الخام مفعلة، العرض المسبق مخفي كاحتياط ضد هجمات الجافا سكريبت.</em>\n\n<strong>إذا كانت هذه محاولة تعديل صادقة، من فضلك حاول مرة أخرى.</strong>\nإذا كانت مازالت لا تعمل، حاول [[Special:UserLogout|تسجيل الخروج]] ثم تسجيل الدخول مجددا.و تاكد في  متصفحك من الكوكيز  الخاصة  بهذا الموقع.",
        "expand_templates_input_missing": "يجب تقديم بعض المدخلات النصية على الأقل.",
        "pagelanguage": "تغيير لغة الصفحة",
        "pagelang-name": "صفحة",
        "log-description-pagelang": "هذا سجل تغيرات في صفحة اللغات.",
        "logentry-pagelang-pagelang": " {{GENDER:$2|غيَّر|غيَّرت}} $1 لغة الصفحة «$3» من $4 إلى $5.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (مفعل)",
-       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''معطل''')",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>ملغاة</strong>)",
        "mediastatistics": "إحصاءات الميديا",
        "mediastatistics-summary": "إحصاءات عن أنماط الملفات المرفوعة، وتشمل أحدث نسخة من الملف فقط، حيث تستبعد النسخ القديمة أو المحذوفة من الملفات.",
        "mediastatistics-nbytes": "{{PLURAL:$1|بايت واحد|بايتان اثنان|$1 بايتات|$1 بايتاً|$1 بايت}} ($2; $3%)",
+       "mediastatistics-bytespertype": "الحجم الكلي لكل الملفات: {{PLURAL:$1|بايت$1|$1 بايت}}($2; $3%).",
        "mediastatistics-allbytes": "الحجم الكلي لكل الملفات: {{PLURAL:$1|$1 بايت}} ($2).",
        "mediastatistics-table-mimetype": "نوع MIME",
        "mediastatistics-table-extensions": "الامتدادات الممكنة",
index 8ef40db..9c7ef37 100644 (file)
        "recentchanges-label-bot": "ܒܘܬ (bot) ܥܒܕ ܗܢܐ ܫܘܚܠܦܐ",
        "recentchanges-label-unpatrolled": "ܫܘܚܠܦܐ ܗܢܐ ܠܐ ܗܘ ܟܪܝܟܐ ܠܗܫܐ",
        "recentchanges-label-plusminus": "ܥܓܪܐ ܕܦܐܬܐ ܐܫܬܚܠܦ ܒܗܢܐ ܡܢܝܢܐ ܡܢ ܒܝܛ̈",
-       "recentchanges-legend-heading": "'''ܦܘܫܩܐ:'''",
+       "recentchanges-legend-heading": "<strong>ܦܘܫܩܐ:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ܐܦ ܚܙܝ [[Special:NewPages|ܡܟܬܒܘܬܐ ܕܦܐܬܬ̈ܐ ܚܕ̈ܬܬܐ]])",
        "rcnotefrom": "ܠܬܚܬ ܫܘܚܠܦ̈ܐ ܕܡܢ '''$2''' (ܥܕ '''$1''' ܡܬܚܙܝܢ̈ܐ).",
        "rclistfrom": "ܚܘܝ ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ ܡܢ $3 $2",
index a1167f2..354c74b 100644 (file)
@@ -61,7 +61,7 @@
        "editfont-serif": "حروف بل زوايد",
        "sunday": "الحد",
        "monday": "لثنين",
-       "tuesday": "اÙ\84تÙ\84اتÙ\87",
+       "tuesday": "اÙ\84Ø«Ù\84اث",
        "wednesday": "لاربعه",
        "thursday": "الخميس",
        "friday": "الجمعه",
        "january": "جانفي",
        "february": "فيفري",
        "march": "مارس",
-       "april": "Ø£فريل",
+       "april": "افريل",
        "may_long": "ماي",
        "june": "جوان",
-       "july": "جويليي",
-       "august": "Ø£وت",
-       "september": "سبتامبر",
-       "october": "كتوبر",
-       "november": "نوفامبر",
+       "july": "جويلية",
+       "august": "اوت",
+       "september": "سبتمبر",
+       "october": "اكتوبر",
+       "november": "نوفمبر",
        "december": "ديسمبر",
        "january-gen": "جانفي",
        "february-gen": "فيفري",
        "jan": "جانفي",
        "feb": "فيفري",
        "mar": "مارس",
-       "apr": "Ø£فريل",
+       "apr": "افريل",
        "may": "ماي",
        "jun": "جوان",
-       "jul": "جويليي",
-       "aug": "Ø£وت",
-       "sep": "سبتامبر",
-       "oct": "كتوبر",
-       "nov": "نوفامبر",
-       "dec": "ديسامبر",
+       "jul": "جويلية",
+       "aug": "اوت",
+       "sep": "سبتمبر",
+       "oct": "اكتوبر",
+       "nov": "نوفمبر",
+       "dec": "ديسمبر",
        "january-date": "جانفيي $1",
        "february-date": "فيفريي $1",
        "march-date": "مارس $1",
        "december-date": "ديسمبر $1",
        "period-am": "تاع الصباح",
        "period-pm": "تاع العشيّة",
-       "pagecategories": "{{PLURAL:$1|Ù\81صÙ\8aÙ\84Ø©|Ù\81صÙ\8aÙ\84ات}}",
+       "pagecategories": "{{PLURAL:$1|Ù\83اتÙ\8aÚ­Ù\88رÙ\8a\83اتÙ\8aÚ­Ù\88رÙ\8aات}}",
        "category_header": "الباجه في التصنيف \"$1\"",
        "subcategories": "تصنيفات تحتيه",
        "category-media-header": "فيشيي ميلتيميديا فالكاتيكورى  \"$1\"",
        "mypage": "باجه",
        "mytalk": "تقرعيج",
        "anontalk": "تقرعيج",
-       "navigation": "تبحار",
+       "navigation": "ناڥيڭاسيون",
        "and": "&#32;و",
        "qbfind": "فتش",
        "qbbrowse": "اتجوّل فل مضمون",
        "faq": "المسقسية المتعاوده",
        "faqpage": "Project:سؤالات متكرره",
        "actions": "أفعال",
-       "namespaces": "بÙ\84اصة ØªØ§Ø¹ Ø£Ø³Ù\85Ù\88ات",
+       "namespaces": "بÙ\84اصة ØªØ§Ø¹ Ø§Ù\84اساÙ\85Ù\8a",
        "variants": "تنويعات",
-       "navigation-heading": "اÙ\84Ù\82اÙ\8aÙ\85Ø© ØªØ§Ø¹ Ø§Ù\84Ù\80تبحار",
+       "navigation-heading": "اÙ\84Ù\84Ù\8aستة ØªØ§Ø¹ Ø§Ù\84Ù\86اڥÙ\8aڭاسÙ\8aÙ\88Ù\86",
        "errorpagetitle": "غلطه",
        "returnto": "ولي إلى $1.",
-       "tagline": "من{{SITENAME}}",
+       "tagline": "من {{SITENAME}}",
        "help": "معاونة",
        "search": "فتّش",
        "searchbutton": "فتّش",
        "history": "تاريخ الملف",
        "history_short": "تاريخ",
        "updatedmarker": "مبدّل منلي الزيارة تاعي الـتالية",
-       "printableversion": "نسخة تاع طبيع",
-       "permalink": "Ù\88صÙ\8aÙ\84 دايم",
+       "printableversion": "ڥرسيون تقدر تطبعها",
+       "permalink": "Ù\84Ù\8aاÙ\86 دايم",
        "print": "امبريمي",
        "view": "اقرا",
        "view-foreign": "شوف على $1",
        "talkpage": "قرعَج على هاد الباجة",
        "talkpagelinktext": "تناقش",
        "specialpage": "باجة خوصوصيّة",
-       "personaltools": "دوزان شخصيه",
+       "personaltools": "دوزان مواليهم",
        "articlepage": "شوف الباجة تاع المحتاوا",
-       "talk": "مهادرة",
-       "views": "Ø´Ù\88Ù\81ات",
-       "toolbox": "دÙ\88زاÙ\86",
+       "talk": "تناقش",
+       "views": "Ø¢Ù\81Ù\8aشاج",
+       "toolbox": "ادÙ\8eÙ\88ات",
        "userpage": "شوف الباجة تاع المستعملي",
        "projectpage": "شوف الباجة تاع البروجي",
        "imagepage": "شوف الباجة تاع الفيشي",
        "viewhelppage": "شوف الباجة تاع المعاونة",
        "categorypage": "شوف الباجة تاع الصنيف",
        "viewtalkpage": "شوف التقرعيج",
-       "otherlanguages": "ب لوغات وحدُخرة",
+       "otherlanguages": "ب لوغات اخرين",
        "redirectedfrom": "(محول من $1)",
        "redirectpagesub": "باجة تاع التحوال",
        "redirectto": "حوّل لـ:",
-       "lastmodifiedat": "Ù\87اد Ø§Ù\84باجÙ\87 Ø±Ø§Ù\87Ù\8a ØªØ¨Ø¯Ù\91Ù\84ت Ù\86Ù\87ار Ø§Ù\84Ù\80 $1, Ø¹Ù\84Ù\89 Ø§Ù\84Ù\80ساعة $2.",
+       "lastmodifiedat": "Ù\87اذ Ø§Ù\84صÙ\81حة Ø±Ø§Ù\87Ù\8a ØªØ¨Ø¯Ù\91Ù\84ت Ø§Ø®Ù\91ر Ù\85رÙ\91Ø© Ù\86Ù\87ار $1Ø\8c Ù\85عا $2.",
        "viewcount": "هاد الباجة نشافت {{PLURAL:$1|خطرة وحدة|$1 خطرة}}.",
        "protectedpage": "باجة محضيّة",
-       "jumpto": "اÙ\82Ù\81ز ل:",
-       "jumptonavigation": "تبحار",
+       "jumpto": "سÙ\8aر ل:",
+       "jumptonavigation": "ناڥيڭاسيون",
        "jumptosearch": "فتّش",
        "view-pool-error": "اعدرونا، السربايات راهم مغبّنين ف هاد الوقيتة.\nبزّاف المستعمليّين راهم باغيين يشوفو هاد الباجة.\nاصبرو شي وقيتة قبل ما تحاولو تلحقو لها عاود.\n\n$1",
        "generic-pool-error": "اعدرونا، السربايات راهم مغبّنين ف هاد الوقيتة.\nبزّاف المستعمليّين راهم باغيين يشوفو هاد الباجة.\nاصبرو شي وقيتة قبل ما تحاولو تلحقو لها عاود.",
        "pool-errorunknown": "خلطة ماشي معروفة",
        "pool-servererror": "السربيس تاع العدّان راه حابس ( $1 ).",
        "poolcounter-usage-error": "غلطة تاع ستُعمال: $1",
-       "aboutsite": "على {{SITENAME}}",
-       "aboutpage": "Project:على",
+       "aboutsite": "كلّ شي على {{SITENAME}}",
+       "aboutpage": "Project:معلومات",
        "copyright": "المحتاوا راه تحت النسخة $1 تاع الليسانس، غير يلا كان مكتوب حاجاخرة.",
        "copyrightpage": "{{ns:project}}:حقوق النسخ",
        "currentevents": "الختيّارات",
        "currentevents-url": "Project:خبورات",
        "disclaimers": "تنبيهات",
-       "disclaimerpage": "Project:التنبيهات العامة",
+       "disclaimerpage": "Project:التنبيهات العامّة",
        "edithelp": "معونة",
        "helppage-top-gethelp": "معاونة",
-       "mainpage": "الپاجة اللولانيّة",
-       "mainpage-description": "اÙ\84پاجة Ø§Ù\84Ù\84Ù\88Ù\84اÙ\86Ù\8aÙ\91Ø©",
+       "mainpage": "الپاجة الاولانيّة",
+       "mainpage-description": "صÙ\81حة Ø§Ù\84استÙ\82باÙ\84",
        "policy-url": "Project:المقاون",
-       "portal": "بÙ\88رطاÙ\8a المجتمع",
-       "portal-url": "Project:بÙ\88رطاÙ\8a المجتمع",
-       "privacy": "السياسة تاع الخصوصية",
+       "portal": "بÙ\88ابة المجتمع",
+       "portal-url": "Project:بÙ\88ابة المجتمع",
+       "privacy": "السياسة تاع الخصوصيّة",
        "privacypage": "Project:السياسة تاع الخصوصيّة",
        "badaccess": "مشكل فل مسموحات",
        "badaccess-group0": "ماشي مقبول ليك تدير الشي الّي راك تسيّي تديرهُ.",
        "versionrequired": "النسخة $1 تاع ميدياويكي ملزومة",
        "versionrequiredtext": "النسخة $1 تاع ميدياويكي راهي ملزومة باش تنجم تستعمل هاد الباجة.\nشوف [[Special:Version|الباجة تاع النسخات باش تفهم كتَر على هاد الشي]]",
        "ok": "قابل",
-       "retrievedfrom": "جاÙ\8aبÙ\8aÙ\86Ù\87 من \"$1\"",
+       "retrievedfrom": "جاÙ\8aبÙ\8aÙ\86Ù\88 من \"$1\"",
        "youhavenewmessages": "عندك $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|عندك}} $1 من عند {PLURAL:$3|مستعملي واحد|زوج تاع المستعمليّين|$3 مستعملي}} ($2).",
        "youhavenewmessagesmanyusers": "عندك $1 من عند شحال من مستعملي ($2).",
        "feed-invalid": "النوع تاع التلقيمة ماشي مصلاح.",
        "feed-unavailable": "التلقيمات ما راهمش موجودين.",
        "site-rss-feed": "تيار آر‌إس‌إس $1",
-       "site-atom-feed": "$1 تيار آتوم",
+       "site-atom-feed": "سينيال آتوم تاع $1",
        "page-rss-feed": "تلقيمة RSS تاع \"$1\"",
        "page-atom-feed": "$1 تيار آتوم",
        "red-link-title": "$1 (الباجة ما كاينة شي)",
        "sort-descending": "رتّب بل نازولي",
        "sort-ascending": "رتّب بل طالوعي",
-       "nstab-main": "اÙ\84باجة",
+       "nstab-main": "صÙ\81Ø­ة",
        "nstab-user": "باجة{{GENDER:{{BASEPAGENAME}}|المستخدم|المستخدمة}}",
        "nstab-media": "باجة تاع ميديا",
        "nstab-special": "باجه خوصوصيّة",
        "nstab-template": "مودال",
        "nstab-help": "باجة تاع معاونة",
        "nstab-category": "تصنيف",
-       "mainpage-nstab": "الپاجة اللولانيّة",
+       "mainpage-nstab": "الپاجة الاولانيّة",
        "nosuchaction": "الشي الّي طلبتهُ ما كاينش",
        "nosuchactiontext": "الفعلة الّي مطلوبة فل URL ماشي مقبولة.\nبالاك ما دخّلتوش الـ URL كيما لازم ولا تاني تبّعتو كاش وصيل مغلوط.\nينجم تاني يكون كاين عُلّة فل لوجيسيال الّي مستعمل فـ {{SITENAME}}.",
        "nosuchspecialpage": "هاد الباجة الخوصوصيّة ما كاينش منها",
        "loginlanguagelabel": "اللوغه: $1",
        "suspicious-userlogout": "المطلب تاعك باش تسجّل خارج ما تسجّلش خاطر راه يبان مرسول من عند بحّار معطّل ولا  خزّان تاع وسّاط (proxy cache).",
        "createacct-another-realname-tip": "السميّة الحقّانيّة ماشي ملزومة.\nيلا تستعملها غادي تصلاح باش تنسّب ليك الخدمة الّي غادي تديرها.",
-       "pt-login": "دخÙ\84Ø©",
+       "pt-login": "ادخÙ\84",
        "pt-login-button": "دخول",
        "pt-createaccount": "اصنع حساب",
        "pt-userlogout": "الخروج",
        "revertmerge": "فرق",
        "history-title": " «$1»: تاريخ المراجعات",
        "difference-title": "فروقات بين التبدالات تاع \"$1\"",
-       "lineno": "سطر$1:",
+       "lineno": "سطر $1:",
        "compareselectedversions": "كومباري بين نسختين مخيرين",
        "editundo": "نحي",
        "diff-multi-sameuser": "({{PLURAL:$1|تبديلة متوسّطة وحدة|$1 تبديلات متوسّطين}} ماشي {{PLURAL:$1|مورّية|$1 مورّيين}} من عند نفس المستعملي)",
        "action-edit": "عدل هاذ الباجه",
        "nchanges": "$1 تبديله{{PLURAL:$1||s}}",
        "enhancedrc-history": "تاريخ",
-       "recentchanges": "اÙ\84تبداÙ\84ات Ø§Ù\84تÙ\88اÙ\84ا",
+       "recentchanges": "اÙ\84تبداÙ\84ات Ø§Ù\84اخÙ\91رة",
        "recentchanges-legend": "واش تختار ف`التبدالات التوالا",
        "recentchanges-summary": "اجبر التبدالات اللواخر الّي صراو ف هاد الصفحة.",
        "recentchanges-feed-description": "تبع التبديلات الجدد للويكي في هاذ التيار .",
        "recentchanges-label-bot": "هاذ التبديل ندار بروبو",
        "recentchanges-label-unpatrolled": "ما تراجعتش هاذ التبديله للآن",
        "recentchanges-label-plusminus": "الحجَم تاع الصفحة راه تبدّل ب هاد العدّة تاع البايتات",
-       "recentchanges-legend-heading": "'''تفسار:'''",
+       "recentchanges-legend-heading": "<strong>تفسار:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (شوف تاني [[Special:NewPages|ليستة تاع صفحات جديدة]])",
        "rcnotefrom": "التحت التبديلات من <strong>$2</strong> (إلى <strong>$1</strong> معروضة).",
        "rclistfrom": "بين التبديلات البديه من $3 $2",
        "recentchangeslinked-summary": "هاذي ليستة تع التبديلات اللي تمت هاذ الخطرة للباجات الموصولة من باجة معينة (ولا للأعضاء الداخلين في تصنيف معين).\nالصفحات في [[Special:Watchlist|ليستت مراقبة نتاعك]] '''مغلظه'''",
        "recentchangeslinked-page": "اسم الباجه:",
        "recentchangeslinked-to": "بين التبديلات للباجات الموصولة للباجه المعطية عوضا العكس",
-       "upload": "طلع فيشي",
+       "upload": "طلّع فيشيي",
        "uploadlogpage": "ريجيستر رفع الفيشيات",
        "filedesc": "ملخص",
        "license": "ترخيص:",
        "nolinkstoimage": "ما كانش باجات موصوله لهاذ الفيشي.",
        "sharedupload-desc-here": "هاذ الملف جاي من $1. يمكن يكون مستعمل من بروجيات وحد أخرين.\nالتوصيف نتاعو في [$2 باجت الصفات] محطوطه هنا لتحت.",
        "upload-disallowed-here": "ما تنحمش تعدّل هاد التصويرة",
-       "randompage": "باجة Ø¹Ù\84Ù\89 الزهر",
+       "randompage": "صÙ\81حة Ø¹ الزهر",
        "statistics": "إحصائيّات",
        "nbytes": "{{PLURAL:$1|بايت 1|$1 بايت}}",
        "nmembers": "$1 اعضاء{{PLURAL:$1||s}}",
        "tooltip-invert": "علّم هاد المقّبسة باش تخبّي التبدالات تاع الصفحات الّي فيها وسَع` التسمية (و وسَع التسمية المربوط يلا كاين)",
        "namespace_association": "وسَع التسمية المربوط",
        "tooltip-namespace_association": "علّم على هاد المقيبسة باش تدخّل تاني المهادرة ولا وسَع التسمية تاع الموضوع المربوط معا وسَع التسمية المسيليكسيوني",
-       "blanknamespace": "أساسي",
+       "blanknamespace": "رئÙ\8aسي",
        "contributions": "مساهمات {{GENDER:$1|المستخدم|المستخدمه}}",
        "contributions-title": "مساهمات {{GENDER:$1|المستخدم|المستخدمه}} $1",
        "mycontris": "المساهمات تاعي",
        "sp-contributions-username": "عنوان أيبي والال اسم مستخدم:",
        "sp-contributions-toponly": "ما تورّي غير المشاركات التوالا تاع المقالات",
        "sp-contributions-submit": "تفتاش",
-       "whatlinkshere": "واش واصل هنا",
+       "whatlinkshere": "شنوّ يوصّل ل هنا",
        "whatlinkshere-title": "الباجات اللي تقين في \"$1\"",
        "whatlinkshere-page": "الباجه:",
        "linkshere": "هاذ الباجات يوصلو إلى '''[[:$1]]''':",
        "tooltip-pt-preferences": "الختيّارات {{GENDER:|تاعك}}",
        "tooltip-pt-watchlist": "ليستت الباجات الي راك أتبع تبديلاتهم",
        "tooltip-pt-mycontris": "الليستة تاع المساهمات {{GENDER:|تاعك}}",
-       "tooltip-pt-login": "Ù\85ادابÙ\8aÙ\83 ØªØ³Ø¬Ù\84 Ø§Ù\84دخÙ\84Ø© ØªØ§Ø¹Ù\83 Ø\8c Ø¨ØµÙ\91Ø­ Ù\87ادا Ù\85اشÙ\8a Ù\85Ù\84زÙ\88Ù\85",
+       "tooltip-pt-login": "Ù\85اذا Ø¨Ù\8aÙ\83 ØªØ¯Ø®Ù\84 Ù\81 Ø§Ù\84Ù\83Ù\88Ù\86ت ØªØ§Ø¹Ù\83Ø\9b Ù\84اÙ\83Ù\86 Ù\87اذا Ù\85ا Ø´Ù\8a Ù\85Ù\84زÙ\88Ù\85 Ø¹Ù\84Ù\8aÙ\83",
        "tooltip-pt-logout": "سجل خروج",
-       "tooltip-pt-createaccount": "Ù\86Ù\86صح Ø¨Ø§Ø´ ØªØµÙ\86ع Ø­Ø³Ø§Ø¨ Ù\88 ØªØ³Ø¬Ù\84 Ø¯Ø®Ù\84تÙ\83 ; Ø¹Ù\84Ù\89 Ù\83Ù\84 Ø­Ø§Ù\84 Ù\85اÙ\87Ù\88Ø´ ضروري",
-       "tooltip-ca-talk": "مناقشه على هاد باجت المحتوا",
-       "tooltip-ca-edit": "بدÙ\91Ù\84 Ù\87اد Ø§Ù\84Ù\80صÙ\81Ø­Ù\87",
+       "tooltip-pt-createaccount": "Ù\85اذا Ø¨Ù\8aÙ\86ا Ù\84Ù\88 Ù\83اÙ\86 ØªØ¹Ù\85Ù\84 Ø­Ø³Ø§Ø¨ Ù\88تدخÙ\84 Ø¨Ù\8aÙ\87Ø\9b Ù\88 Ù\84اÙ\83Ù\86 Ù\87اذا Ù\85ا Ø´Ù\8a ضروري",
+       "tooltip-ca-talk": "مناقشة على هاذ الصفحة تاع المحتوى",
+       "tooltip-ca-edit": "بدÙ\91Ù\84 Ù\81 Ù\87اذ Ø§Ù\84Ù\80صÙ\81حة",
        "tooltip-ca-addsection": "ابدأ طرف جديد",
        "tooltip-ca-viewsource": "هاذ الباجه محميه. و شنو تقدرو تشوفو الأصلي نتاعها",
-       "tooltip-ca-history": "المراجعات التوالا تاع الباجة (معا المساهمين تاوعها)",
+       "tooltip-ca-history": "الڥرسيونات القدام ديال هاذ الصفحة",
        "tooltip-ca-protect": "بروتيجي هاذالباجه",
        "tooltip-ca-delete": "امحي هاذ الباجه",
        "tooltip-ca-move": "بدل أسم هذ الباجه",
        "tooltip-ca-watch": "زيد هذ الباجة لل ليستة تاعك تاع التتباع",
        "tooltip-ca-unwatch": "اقلع هاد الباجة منل ليستة تاعك تاع التتباع",
        "tooltip-search": " فتّش في {{SITENAME}}",
-       "tooltip-search-go": "رÙ\88Ø­ Ù\84 Ø¨Ø§Ø¬Ø© Ø¹Ù\86دÙ\87ا Ø°Ø§Ù\83 Ø§Ù\84آسÙ\85 Ø¨Ø¯Ù\91ات Ù\8aÙ\84ا Ù\83اÙ\86ت Ù\83اÙ\8aÙ\86Ø©",
-       "tooltip-search-fulltext": "فتّش على باجة ب هاد الكتبة",
-       "tooltip-p-logo": "زÙ\88ر Ø§Ù\84پاجة Ø§Ù\84Ù\84Ù\88Ù\84اÙ\86Ù\8aÙ\91Ø©",
+       "tooltip-search-go": "رÙ\88Ø­ Ù\84 ØµÙ\81حة Ø¹Ù\86دÙ\87ا Ù\86Ù\81س Ù\87اذ Ø§Ù\84اسÙ\85 Ø§Ù\8aذا ØªÙ\88جÙ\92دت",
+       "tooltip-search-fulltext": "فتّش ع الپاجات الّي فيها هاذ النصّ",
+       "tooltip-p-logo": "زÙ\88ر ØµÙ\81حة Ø§Ù\84استÙ\82باÙ\84",
        "tooltip-n-mainpage": "زور الپاجة اللولانيّة",
-       "tooltip-n-mainpage-description": "زÙ\88ر Ø§Ù\84پاجة Ø§Ù\84Ù\84Ù\88Ù\84اÙ\86Ù\8aÙ\91Ø©",
-       "tooltip-n-portal": "على الپروجي،واش تقدر تدير، وين تصيب واش تحتاج",
-       "tooltip-n-currentevents": "صÙ\8aب Ø®Ø¨Ø§Ø±Ø§Øª Ù\85ستÙ\91رÙ\8aÙ\86 Ø¹Ù\84Ù\89 Ø§Ù\84صÙ\88اÙ\84Ø­ Ø§Ù\84Ù\91Ù\8a Ø±Ø§Ù\87Ù\85 Ù\8aصراÙ\88 Ø¶Ø±Ù\83ا",
-       "tooltip-n-recentchanges": "الليستة تاع التبدالات الجديدة فل ويكي",
-       "tooltip-n-randompage": "Ø·Ù\84Ù\91ع Ø¨Ø§Ø¬Ù\87 Ø¹Ù\84Ù\89 الزهر",
-       "tooltip-n-help": "بلاصة المعونة",
-       "tooltip-t-whatlinkshere": "Ù\84Ù\8aستة ØªØ§Ø¹ Ù\83اÙ\85Ù\84 Ø¨Ø§Ø¬Ø§Øª Ø§Ù\84Ù\85حتاÙ\88ا Ø§Ù\84Ù\88اصÙ\84Ù\87 هنا",
+       "tooltip-n-mainpage-description": "زÙ\88ر ØµÙ\81حة Ø§Ù\84استÙ\82باÙ\84",
+       "tooltip-n-portal": "ع المشروع، شنوّ تقدر تدير، فين تلقى الحاجات الّي حاجتك بيها",
+       "tooltip-n-currentevents": "Ø´Ù\88Ù\81 Ø§Ø´ Ù\82اعد Ù\8aصÙ\8aر",
+       "tooltip-n-recentchanges": "ليستة تاع التبدالات الاخّرين ف الويكي",
+       "tooltip-n-randompage": "شرجÙ\8a ØµÙ\81حة Ø¹ الزهر",
+       "tooltip-n-help": "بلاصة المعاونة",
+       "tooltip-t-whatlinkshere": "Ù\84Ù\8aستة Ø¯Ù\8aاÙ\84 ØµÙ\81حات Ø§Ù\84Ù\88Ù\8aÙ\83Ù\8a Ø§Ù\84Ù\83Ù\84Ù\91 Ø§Ù\84Ù\91Ù\8a ØªÙ\88صÙ\91Ù\84 Ù\84 هنا",
        "tooltip-t-recentchangeslinked": "ليستة تاع التبديلات التوالا تاع الباجات الّي عندهم رباط معا هادي",
        "tooltip-feed-atom": "سيلان آتوم تاع هاد الباجة",
        "tooltip-t-contributions": "شوف ليستة تاع المساهمات تاع {{GENDER:$1|هاد المستعملي|هاد المستعمليّة}}",
        "tooltip-t-emailuser": "أرسل بريه لهاذ المستخدم",
-       "tooltip-t-upload": "أرسÙ\84 ØªØµÙ\88Ù\8aرة Ù\88 Ø¥Ù\84ا Ø£Ù\8a Ù\85Ù\84Ù\81 Ù\85Ù\8aدÙ\8aا Ù\84Ù\84سرÙ\81ر",
-       "tooltip-t-specialpages": "ليستة تاع كامل الباجات الخصوصيّة",
-       "tooltip-t-print": "نسخه لهاذ الباجه قابله للطبيع",
+       "tooltip-t-upload": "Ø·Ù\84Ù\91ع Ù\81Ù\8aØ´Ù\8aÙ\8aات",
+       "tooltip-t-specialpages": "ليستة تاع الباجات الخاصّين كلّهم",
+       "tooltip-t-print": "ڥرسيون تقدر تطبعها",
        "tooltip-t-permalink": "وصيل دايم رايح ل هاد النسخة تاع الباجة",
        "tooltip-ca-nstab-main": "شوف باجه المحتوى",
        "tooltip-ca-nstab-user": "شوف باجت المستعمل",
        "tooltip-undo": "\"نحّي\" فاصي هاد الـمعاودة و حلّ تاقة تاع تبدال بشوفه قبلانيّه. تخلّي باش ترجع لل معاوده التاليه و تزيد الـسبّة علاش فل قابسه تاع الـحويصله.",
        "tooltip-summary": "دخل تلخيص صغير",
        "simpleantispam-label": "مسيّة ضدّ السبام.\nما تعمّرش هادا!",
-       "pageinfo-toolboxlink": "Ù\85عÙ\84Ù\88Ù\85ات Ø¹Ù\84Ù\89 Ù\87اد Ø§Ù\84باجة",
+       "pageinfo-toolboxlink": "Ù\85عÙ\84Ù\88Ù\85ات Ø¹Ù\84Ù\89 Ù\87اد Ø§Ù\84صÙ\81Ø­ة",
        "previousdiff": "→ التعديل الي قبل",
        "nextdiff": "التبديل الجاي ←",
        "file-info-size": "$1 × $2 بكسل حجم الملف: $3، نوع MIME: $4",
        "watchlisttools-raw": "موديفي ليستت التبيعه الخام",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|تقرعيج]])",
        "duplicate-defaultsort": "'''توليه:''' مفتاح التستيف الافتراضي \"$2\" ديباسا مفتاح التستيف الافتراضي التالي\"$1\".",
-       "specialpages": "الباجات الخصوصية",
+       "specialpages": "الپاجات الخاصّين",
        "external_image_whitelist": " #<pre>خلى هاذ السطر كيما راه\n#حط منثورات التعبيرات المنتظمة (برك الجزء الي يروح بين //) بالتحت\n#هاذ يكون مطابقتها مع مسارات التصاوير البرانيه (الموصولة بصفه مباشره)\n#هاذي الي تشبهغادي تنعرض  كتصاور، خلاف هذا برك وصيلة للتصويرة غادي تنعرض\n#السطور اللي تبدأا ب# تعتبر تعليقات\n#هذا لا يتأثر بحالة الحروف\n\n#حط كامل منثورات التعبيرات المنتظمة فوق هذا السطر. خلي هاذ السطر سواسوا كيما هو</pre>",
        "tag-filter": "صفاية[[Special:Tags|الوشام]]:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1||وسم|وسمان|وسوم}}]]: $2)",
        "logentry-move-move": "{{GENDER:$2|نقّل|نقّلت}} $1 الصفحة $3 لـ $4",
        "logentry-newusers-create": "راه تفتح حساب {{GENDER:$2|المستخدم|المستخدمه}} $1",
        "logentry-upload-upload": " {{GENDER:$2|نزّل|نزّلت}} $1 $3",
-       "searchsuggest-search": "تفتاش"
+       "searchsuggest-search": "فتّش"
 }
index 12075c9..91089cc 100644 (file)
        "confirmable-no": "لا",
        "thisisdeleted": "عرض او استرجاع $1؟",
        "viewdeleted": "عرض $1؟",
-       "restorelink": "{{PLURAL:$1|تعدÙ\8aÙ\84 Ù\88احد Ù\85Ù\84غÙ\8a|تعدÙ\8aÙ\84Ù\8aÙ\86 Ù\85Ù\84غÙ\8aÙ\8aÙ\86|$1 ØªØ¹Ø¯Ù\8aÙ\84ات Ù\85Ù\84غÙ\8aØ©|$1 ØªØ¹Ø¯Ù\8aÙ\84 Ù\85Ù\84غÙ\8a|$1 ØªØ¹Ø¯Ù\8aÙ\84 Ù\85Ù\84غÙ\8a}}",
+       "restorelink": "{{PLURAL:$1|تعدÙ\8aÙ\84 Ù\88احد Ù\85Ù\84غÙ\89|$1 ØªØ¹Ø¯Ù\8aÙ\84ات Ù\85Ù\84غÙ\8aÙ\87}}",
        "feedlinks": "تلقيم:",
        "feed-invalid": "نوع اشتراك التغذية مش صح.",
        "feed-unavailable": "التغذية مش متوفرة",
        "recentchanges-label-minor": "ده تعديل صغير",
        "recentchanges-label-bot": "التعديل ده عمله بوت",
        "recentchanges-label-unpatrolled": "التعديل ده مإتراجعش لسه",
-       "recentchanges-legend-heading": "شرح",
+       "recentchanges-legend-heading": "<strong>شرح</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (بص كمان على [[Special:NewPages|قايمه الصفحات الجديده]])",
        "rcnotefrom": "دى التعديلات من '''$2''' (ل '''$1''' معروضه).",
        "rclistfrom": "اظهر التعديلات بدايه من $3 $2",
index c552cce..e702f32 100644 (file)
        "history": "পৃষ্ঠা ইতিহাস",
        "history_short": "ইতিহাস",
        "updatedmarker": "মোৰ শেহতীয়া পৰিদৰ্শনৰ পাছৰ সালসলনিবোৰ",
-       "printableversion": "পà§\8dৰà¦\95াশযোগ্য সংস্কৰণ",
+       "printableversion": "মà§\81দà§\8dৰণযোগ্য সংস্কৰণ",
        "permalink": "স্থায়ী সূত্ৰ (লিংক)",
        "print": "প্ৰিণ্ট কৰিবলৈ",
        "view": "দেখুৱাওক",
        "recentchanges-label-bot": "এই সম্পাদনাটো ব'টে কৰিছে",
        "recentchanges-label-unpatrolled": "এই সম্পাদনাটো এতিয়াও পৰীক্ষা কৰা হোৱা নাই",
        "recentchanges-label-plusminus": "পৃষ্ঠাৰ আকাৰ এই পৰিমাণৰ বাইট পৰিৱৰ্তন হৈছে",
-       "recentchanges-legend-heading": "'''ব্যাখ্যা:'''",
+       "recentchanges-legend-heading": "<strong>ব্যাখ্যা:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (লগতে [[Special:NewPages|নতুন পৃষ্ঠাসমূহৰ তালিকা]] চাওক)",
        "recentchanges-legend-plusminus": "(''±১২৩'')",
        "rcnotefrom": "তলত '''$2''' ৰ পৰা হোৱা ('''$1''' লৈকে) পৰিৱৰ্তন দেখুৱা হৈছে ।",
index 994c857..876d222 100644 (file)
        "newarticle": "(Nuevu)",
        "newarticletext": "Siguisti un enllaz a un artículu qu'inda nun esiste.\nPa crear la páxina, empecipia a escribir nel cuadru d'embaxo (mira la [$1 páxina d'ayuda] pa más información).\nSi llegasti equí por enquivocu, calca nel botón <strong>atrás</strong> del to restolador.",
        "anontalkpagetext": "----\n''Esta ye la páxina d'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.''\nPola mor d'ello ha usase la direición numbérica IP pa identificalu/la.\nTala IP pue compartise por varios usuarios.\nSi yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:UserLogin/signup|crea una cuenta]] o [[Special:UserLogin/signup|identifícate]] pa torgar futures confusiones con otros usuarios anónimos.",
-       "noarticletext": "Nestos momentos nun hai testu nesta páxina.\nPues [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n'otres páxines,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar esta páxina]</span>.",
+       "noarticletext": "Nestos momentos nun hai testu nesta páxina.\nPuedes [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n'otres páxines,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear esta páxina]</span>.",
        "noarticletext-nopermission": "Nestos momentos nun hai testu nesta páxina.\nPue [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n'otres páxines o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos]</span>, pero nun tiene permisu pa crear esta páxina.",
        "missing-revision": "La revisión #$1 de la páxina llamada \"{{FULLPAGENAME}}\" nun esiste.\n\nDe vezu la causa d'esto ye siguir un enllaz antiguu del historial a una páxina que se desanició.\nSe puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistru de desanicios].",
        "userpage-userdoesnotexist": "La cuenta d'usuariu «$1» nun ta rexistrada.\nPor favor comprueba si quies crear/editar esta páxina.",
        "recentchanges-label-bot": "Esta edición ta fecha por un bot",
        "recentchanges-label-unpatrolled": "Esta edición ta ensin patrullar entá",
        "recentchanges-label-plusminus": "El tamañu d'esta páxina cambió nesti númberu de bytes",
-       "recentchanges-legend-heading": "'''Lleenda:'''",
+       "recentchanges-legend-heading": "<strong>Lleenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ver tamién la  [[Special:NewPages|llista de páxines nueves]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Amosar",
index b5ff417..6cb75d2 100644 (file)
        "recentchanges-label-bot": "ई सम्पादन एक्ठु ब़ा़ट करे है",
        "recentchanges-label-unpatrolled": "ई संपादन अभीन नाइ जाँचि गा है",
        "recentchanges-label-plusminus": "पन्ना कय आकार इ बाइट संख्या से बदला",
-       "recentchanges-legend-heading": "'''कुंजी:'''",
+       "recentchanges-legend-heading": "<strong>कुंजी:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नवा पन्नन् कय सूची]] कय भी देखा जाय)",
        "rcnotefrom": "नीचे <strong>$2</strong> के बाद से (<strong>$1</strong> तक) {{PLURAL:$5|हुआ बदलाव दर्शाया गया है|हुए बदलाव दर्शाए गये हैं}}।",
        "rclistfrom": "$3 $2 से नँवा बदलाव देखावा जाय",
index 43c3d49..5a68e59 100644 (file)
        "recentchanges-label-bot": "Bu redaktə bot tərəfindən edilmişdir",
        "recentchanges-label-unpatrolled": "Bu redaktə hələ patrullanmayıb",
        "recentchanges-label-plusminus": "Səhifənin ölçüsündəki dəyişiklik (baytlarla)",
-       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (həmçinin bax: [[Special:NewPages|yeni səhifələrin siyahısı]])",
        "rcnotefrom": "Aşağıda <strong>$2</strong>-dən bu yana olan dəyişikliklər göstərilib (<strong>$1</strong>-dən çox olmayaraq).",
        "rclistfrom": "$3 $2 vaxtından başlayaraq yeni dəyişiklikləri göstər",
index bde18c8..f8cc340 100644 (file)
        "recentchanges-label-bot": "بو دییشیک بیر بوت طرفیندن ائدیلیب‌دیر",
        "recentchanges-label-unpatrolled": "بو دییشیکلیک هله گؤزدن گئچیریلمه‌ییب‌دیر",
        "recentchanges-label-plusminus": "صفحه‌نین اؤلچوسو بایت میقداری ایله تعیین ائدیلیر",
-       "recentchanges-legend-heading": "'''قیسالتمالار:'''",
+       "recentchanges-legend-heading": "<strong>قیسالتمالار:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (بیرده [[Special:NewPages|یئنی صفحه‌لرین لیستینه]] باخین)",
        "rcnotefrom": "آشاغی داکی دَییشیک لرده <strong>$3, $4</strong> (دن <strong>$1</strong> {{PLURAL:$5|چان گوستریلیب|چان گوستریلیب دیر}}).",
        "rclistfrom": "$3 $2 واختیندان باشلایاراق یئنی دییشیکلری گؤستر",
index d011119..6567c75 100644 (file)
@@ -17,7 +17,8 @@
                        "Ҡамыр Батыр",
                        "아라",
                        "Ләйсән",
-                       "Macofe"
+                       "Macofe",
+                       "Азат Хәлилов"
                ]
        },
        "tog-underline": "Һылтанмалар аҫтына һыҙыу:",
        "moredotdotdot": "Дауамы...",
        "morenotlisted": "Был исемлек тулы түгел",
        "mypage": "Бит",
+       "anonuserpage": "Билдәһеҙ ҡатнашыусы",
        "mytalk": "Әңгәмә",
        "anontalk": "Әңгәмә",
        "navigation": "Төп йүнәлештәр",
        "databaseerror-query": "Һоратыу: $1",
        "databaseerror-function": "Функция:$1",
        "databaseerror-error": "Хата: $1",
+       "transaction-duration-limit-exceeded": "$1 яҙмаһы оҙонлоғо мөмкин булған $2 сикләүен {{PLURAL:$2|секундҡа}}уҙып китте. Ҙур булмаған операциялар эшләп ҡарағыҙ.",
        "laggedslavemode": "'''Иғтибар:''' биттә һуңғы үҙгәртеүҙәр күрһәтелмәгән булырға мөмкин.",
        "readonly": "Мәғлүмәттәр базаһы бикләнгән",
        "enterlockreason": "Ябылыу сәбәбен һәм ваҡытын белдерегеҙ.",
        "missingarticle-rev": "(версия № $1)",
        "missingarticle-diff": "(айырма: $1, $2)",
        "readonly_lag": "Өҫтәмә сервер төп сервер менән синхронлашҡанға тиклем мәғлүмәттәр базаһы автоматик рәүештә үҙгәрештәргә ҡаршы ябылған.",
+       "nonwrite-api-promise-error": " 'Promise-Non-Write-API-Action' HTTP исеменә ғариза ебәрелде, тик API модюленә китте.",
        "internalerror": "Эске хата",
        "internalerror_info": "Эске хата: $1",
        "internalerror-fatal-exception": "$1 тибындағы төҙәтә алмаҫлыҡ ҡағиҙәнән ситкә тайпылыш",
        "badtitletext": "Биттең һоратылған исеме дөрөҫ түгел, буш йәки телдәр араһы йәки интервики исеме яңылыш күрһәтелгән. Исемдә тыйылған символдар булыуы ла мөмкин.",
        "title-invalid-empty": "Һоратылған бит башлығы буш йәки исемдәр арауығы була.",
        "title-invalid-utf8": "Һеҙ эҙләгән биттә дөрөҫ булмаған UTF-8 символдар теҙмәһе бар.",
+       "title-invalid-interwiki": "Һеҙ һораған биттә интервики-һылтанма бар, был исемдәрҙә ҡулланыла алмай.",
+       "title-invalid-talk-namespace": "Һеҙ һораған бит исеме булмаған фекер алышыу битенә һылтана.",
+       "title-invalid-characters": "Һеҙ һораған биттә ярамаған $1 символы бар.",
+       "title-invalid-relative": " (/,../) юлы булған исем ғәмәлдә түгел, ҡулланыусы браузер менән ҡулланған ваҡытта улар йыш ҡына асылмай.",
+       "title-invalid-magic-tilde": "Һоралған исемдә ярамаған исем бар (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Һоралған бит исеме бик оҙон. $1 {{PLURAL:$1|байттан}} артмаҫҡа тейеш.",
+       "title-invalid-leading-colon": "Һораған бит башында ярамаған ике нөктә бар.",
        "perfcached": "Был мәғлүмәттәр кэштан алынған, уларҙа һуңғы үҙгәртеүҙәр булмаҫҡа мөмкин. Кэшта иң күбе {{PLURAL:$1|язма}} һаҡлана.",
        "perfcachedts": "Был мәғлүмәттәр кэштан алынған, ул һуңғы тапҡыр $1 яңыртылды.  Кэшта иң күбе  {{PLURAL:$4|язма}} һаҡлана",
        "querypage-no-updates": "Был битте яңыртыу хәҙер тыйылған.\nБында күрһәтелгән мәғлүмәттәр яңыртылмаясаҡ.",
        "viewyourtext": "Был биттәге '''үҙгәртеүҙәрегеҙҙең''' сығанаҡ текстын ҡарай һәм күсермәһен ала алаһығыҙ:",
        "protectedinterface": "Был биттә программаның интерфейс хәбәре бар. Вандализм осраҡтарын булдырмау өсөн, был битте үҙгәртеү тыйыла.\nБыл хәбәрҙең тәржемәһен өҫтәү йәки үҙгәртеү өсөн, зинһар, MediaWiki проектының [//translatewiki.net/ translatewiki.net] локалләштереү сайтын ҡулланығыҙ.",
        "editinginterface": "'''Иғтибар.''' Һеҙ программаның арайөҙ тексты булған битте мөхәррирләйһегеҙ.\nУны үҙгәртеү, башҡа ҡулланыусыларҙын арайөҙ күренешен үҙгәртәсәктер.\nТәржемә өсөн [//translatewiki.net/wiki/Main_Page?setlang=ba translatewiki.net] адресын, MediaWiki-ны локалләштереү проектын ҡулланыу яҡшыраҡ буласаҡтыр.",
+       "translateinterface": "Был хәбәрҙе тәржәмә итү өсөн [//translatewiki.net/ translatewiki.net]сайтын ҡулланығыҙ.",
        "cascadeprotected": "Был бит үҙгәртеүҙәрҙән һаҡланған, сөнки ул эҙмә-эҙлекле һаҡлау ҡуйылған {{PLURAL:$1|1=биткә|биттәргә}} керә:\n$2",
        "namespaceprotected": "«$1» исем арауығындағы биттәрҙе мөхәррирләү өсөн хоҡуҡтарығыҙ юҡ.",
        "customcssprotected": "Был CSS-битте үҙгәртеү хоҡуғығыҙ юҡ, сөнки унда башҡа ҡулланыусының шәхси көйләүҙәре бар.",
        "invalidtitle-knownnamespace": "\"$2\" исем арауығы һәм \"$3\"  тексты исем өсөн ярамай",
        "invalidtitle-unknownnamespace": "\"$2\" тексты һәм \"$1\" арауыҡ өсөн билдәһеҙ номерлы исем ярамай",
        "exception-nologin": "Танылмағанһығыҙ",
-       "exception-nologin-text": "Был битте ҡарау йәки һоратылған ғәмәлде башҡарыу өсөн системала [[Special:Userlogin|танылыр]] кәрәк.",
+       "exception-nologin-text": "Был битте ҡарау йәки һоратылған ғәмәлде башҡарыу өсөн системала танылырға кәрәк.",
+       "exception-nologin-text-manual": "Был биткә кереү өсөн $1 булырға тейеш",
        "virus-badscanner": "Көйләү хатаһы: Билдәһеҙ вирустар сканеры: ''$1''",
        "virus-scanfailed": "сканлау хатаһы ($1 коды)",
        "virus-unknownscanner": "беленмәгән антивирус:",
        "logouttext": "'''Һеҙ эш сеансын тамамланығыҙ.'''\n\nҠайһы бер биттәр һеҙ системаға танылмаған кеүек күренеүен дауам итер. Быны бөтөрөү өсөн браузер кэшын таҙартығыҙ.",
        "cannotlogoutnow-title": "Хәҙер үк сығып булмай",
+       "cannotlogoutnow-text": "$1 файҙалланған ваҡытта инергә ярамай",
        "welcomeuser": "Рәхим итегеҙ $1!",
        "welcomecreation-msg": "Иҫәп яҙыуығыҙ яһалды.\nШәхси [[Special:Preferences|{{SITENAME}} көйләүҙәрен]] үҙегеҙгә уңайлы итеп үҙгәртергә онотмағыҙ.",
        "yourname": "Ҡатнашыусы исеме",
        "userlogin-remembermypassword": "Системала ҡалырға",
        "userlogin-signwithsecure": "Һаҡланыулы тоташыу",
        "cannotloginnow-title": "Хәҙер үк инеп булмай",
+       "cannotloginnow-text": "$1 файҙалланған ваҡытта инергә ярамай",
        "yourdomainname": "Һеҙҙең домен",
        "password-change-forbidden": "Был викила серһүҙегеҙҙе үҙгәртә алмайһығыҙ.",
        "externaldberror": "Тышҡы мәғлүмәт базаһы менән танылғанда хата барлыҡҡа килде йәки тышҡы үҙ көйләүҙәрегеҙҙе үҙгәртер өсөн хоҡуҡтарығыҙ етәрле түгел.",
        "wrongpassword": "Һеҙ ҡулланған серһүҙ ҡабул ителмәй. Яңынан яҙып ҡарағыҙ.",
        "wrongpasswordempty": "Зинһар, буш булмаған серһүҙ керетегеҙ.",
        "passwordtooshort": "Серһүҙ кәмендә $1 {{PLURAL:$1|символдан}} торорға тейеш.",
+       "passwordtoolong": "Серһүҙ {{PLURAL:$1|1 символдан}} артмаҫҡа тейеш.",
+       "passwordtoopopular": "Йыш ҡулланыдған серһүҙ ҡабул ителмәй, Башҡа серһүҙ һайлағыҙ.",
        "password-name-match": "Керетелгән серһүҙ ҡулланыусы исеменән айырылырға тейеш.",
        "password-login-forbidden": "Был ҡатнашыусы исемен һәм серһүҙҙе ҡулланыу тыйылған",
        "mailmypassword": "Серһүҙҙе ташлатыу",
        "createaccount-text": "Кемдер, электрон почта адресығыҙҙы күрһәтеп, {{SITENAME}} ($4) проектында «$3» пароле менән «$2» исемле иҫәп яҙыуы теркәне. Һеҙҙең кереүегеҙ һәм серһүҙегеҙҙе алмаштырыуығыҙ кәрәк.\n\nИҫәп яҙыуы яңылыш яһалһа, был хатҡа иғтибар итмәгеҙ.",
        "login-throttled": "Һеҙ системаға ҡат-ҡат танылырға тырыштығыҙ.\nТағы бер танылырҙан алда, зинһар, $1 көтөгөҙ.",
        "login-abort-generic": "Танылыу уңышһыҙ тамамланды",
+       "login-migrated-generic": "Һеҙҙең иҫәп яҙмаһы күсерелде, викила һеҙҙең иҫәп яҙмаһы башҡа юҡ.",
        "loginlanguagelabel": "Тел: $1",
        "suspicious-userlogout": "Һеҙҙең сеансты тамамлау тураһында һорауығыҙ кире ҡағылды, сөнки ул төҙөк булмаған браузер йәки кэшлаусы прокси тарафынан ебәрелгән һорауға оҡшаған.",
        "createacct-another-realname-tip": "Ысын исемегеҙ (мотлаҡ түгел).\nУны яҙып ҡуйһағыҙ, ул биткә кем төҙәтеү индергәнен күрһәтеү өсөн ҡулланыласаҡ.",
        "user-mail-no-addy": "Электрон почта адресы булмайынса электрон хәбәр ебәреп ҡараны",
        "user-mail-no-body": "Буш йә мәғәнәһеҙ йөкмәткеле ҡыҫҡа электрон хат ебәрергә тырышҡан.",
        "changepassword": "Серһүҙҙе үҙгәртергә",
-       "resetpass_announce": "Һеҙ системала электрон почта аша алынған ваҡытлыса серһүҙ менән танылдығыҙ. Системаға кереүҙә тамалау өсөн яңы серһүҙ булдырығыҙ.",
+       "resetpass_announce": "Системаға кереүҙә тамалау өсөн яңы серһүҙ булдырығыҙ.",
        "resetpass_header": "Иҫәп яҙыуы серһүҙен үҙгәртеү",
        "oldpassword": "Иҫке серһүҙ:",
        "newpassword": "Яңы серһүҙ:",
        "retypenew": "Серһүҙҙе яңынан керетегеҙ:",
        "resetpass_submit": "Серһүҙ ҡуйырға һәм танышырға",
        "changepassword-success": "Серһүҙегеҙ уңышлы үҙгәртелде!",
+       "changepassword-throttled": "Һеҙ системаға ҡат-ҡат танылырға тырыштығыҙ.\nТағы бер танылырҙан алда, зинһар, $1 көтөгөҙ.",
+       "botpasswords": "Роботтар серһүҙе.",
+       "botpasswords-summary": "<em>ПРобот пароле</em> API иҫәп яҙмаһына логин һәм паролһыҙ инергә мөмкинлек бирә. Робот пароле менән ингәндә ҡулланыусы хоҡуғы сикләнгән булыуы мөмкин.\n\nНи өсөн икәнен белмәһәгеҙ, быны эшләмәүегеҙ яҡшыраҡ.",
+       "botpasswords-disabled": "Роботтар серһүҙе һүндерелгән.",
+       "botpasswords-no-central-id": "Робот серһүҙен ғулланыу өсөн үҙәк иҫәп яҙмаһына инергә кәрәк.",
+       "botpasswords-existing": "Робот серһүҙҙәре.",
+       "botpasswords-createnew": "Робот өсөн яңы серһүҙ булдырырға.",
+       "botpasswords-editexisting": "Робот серһүҙен мөхәррирләргә.",
        "botpasswords-label-appid": "Бот исеме:",
        "botpasswords-label-create": "Төҙөргә",
        "botpasswords-label-update": "Яңыртырға",
        "botpasswords-label-delete": "Юйырға",
        "botpasswords-label-resetpassword": "Серһүҙҙе ташлатыу",
        "botpasswords-label-grants": "Ҡулланылған рөхсәттәр:",
+       "botpasswords-help-grants": "Һәр рөхсәт иҫәп яҙмаһы булған ҡулланыусы хоҡуҡтарын ҡулланырға рөхсәт бирә. Тулыраҡ мәғлүмәт өсөн [[Special:ListGrants|рөхсәт таблицаһын]] ҡарағыҙ.",
+       "botpasswords-label-restrictions": "Ҡулланыуҙы сикләү:",
+       "botpasswords-label-grants-column": "Рөхсәт",
+       "botpasswords-bad-appid": "$1 исемле робот ярамай.",
+       "botpasswords-insert-failed": "$1 исемле роботты өҫтәп булманы. Бәлки өҫтәлгән булғандыр?",
+       "botpasswords-update-failed": "$1 исемле роботты яңыртып булманы. Бәлки ул юйылғандыр?",
+       "botpasswords-created-title": "Робот серһүҙе булдырылды.",
+       "botpasswords-created-body": "$1 роботы өсөн $2 ҡулланыусыһы серһүҙе эшләнде.",
+       "botpasswords-updated-title": "Робот серһүҙе булдырылды.",
+       "botpasswords-updated-body": "$1 роботы өсөн $2 ҡулланыусыһы серһүҙе яңыртылды.",
+       "botpasswords-deleted-title": "Робот серһүҙе юйылды.",
+       "botpasswords-deleted-body": "$1 роботы өсөн $2 ҡулланыусыһы серһүҙе юйылды.",
+       "botpasswords-newpassword": "Инеү өсөн яңы серһүҙ <strong>$1</strong> — <strong>$2</strong>. <em>Артабан ҡулланыу өсөн яһып алығыҙ.</em>",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider ғәмәлдә түгел.",
+       "botpasswords-restriction-failed": "Робот серһүҙе менән бәйле сәбәптәр булғанға инеү башҡарылманы.",
+       "botpasswords-invalid-name": "Күрһәтелгән ҡулланыусы исемендә робот $1 серһүҙен бүлеүсе тамға юҡ.",
+       "botpasswords-not-exist": "$1 ҡулланыусыһының $2 роботы өсөн серһеҙе юҡ.",
        "resetpass_forbidden": "Серһүҙҙе үҙгәртеп булмай",
        "resetpass-no-info": "Был битте туранан ҡарау өсөн һеҙгә системала танылырға кәрәк.",
        "resetpass-submit-loggedin": "Серһүҙҙе үҙгәртергә",
        "resetpass-submit-cancel": "Бөтөрөргә",
        "resetpass-wrong-oldpass": "Хаталы ваҡытлыса йәки ағымдағы серһүҙ.\nҺеҙ, бәлки, серһүҙегеҙҙе алмаштырғанһығыҙ йәки яңы серһүҙ һоратҡанһығыҙ.",
+       "resetpass-recycled": "Зинһар өсөн үҙегеҙҙекенән айырмалы серһүҙ һайлағыҙ.",
+       "resetpass-temp-emailed": "Һеҙ электорон почта аша ебәрелгән ваҡытлыса серһүҙ менән индегеҙ. Инеүҙе башҡарыу өсөн яңы серһүҙ яҙығыҙ.",
        "resetpass-temp-password": "Ваҡытлыса серһүҙ",
        "resetpass-abort-generic": "Серһүҙҙе үҙгәртеү киңәйеү тарафынан өҙөлдө.",
        "resetpass-expired": "Һеҙҙең серһүҙҙең ғәмәл ваҡыты үткән. Зинһар, системала танылыу өсөн яңы серҙһүҙ ҡуйығыҙ.",
+       "resetpass-expired-soft": "Һеҙҙең серһүҙ ваҡыты сыҡты, хәҙер ул үҙгәртелергә тейеш. Яңы серһүҙ һайлағыҙ, йәки уны үҙгәртеү өсөн «{{int:resetpass-submit-cancel}}» баҫығыҙ.",
+       "resetpass-validity-soft": "Ярамаған серһүҙ һайланған $1",
        "passwordreset": "Серһүҙҙе ташлатыу",
        "passwordreset-text-one": "Серһүҙегеҙҙе ташлар өсөн ош ҡалыпты тултырығыҙ.",
        "passwordreset-text-many": "{{PLURAL:$1|Серһүҙҙе ташлар өсөн яландарҙың береһен тултырығыҙ.}}",
        "passwordreset-emailtext-user": "{{SITENAME}} проектындағы $1 ҡулланыусыһы {{SITENAME}} ($4) проектындағы иҫәп яҙыуығыҙҙы хәтерләтеүҙе һоратты. Киләһе ҡулланыусы {{PLURAL:$3|1=иҫәп яҙыуы|иҫәп яҙыуҙары}} был электрон почта адресы менән бәйле:\n\n$2\n\nБыл ваҡытлыса {{PLURAL:$3|1=серһүҙ|серһүҙҙәр}} {{PLURAL:$5|$5 көн}} ғәмәлдә буласаҡ.\nҺеҙ системала танылырға һәм яңы серһүҙ һайларға тейешһегеҙ.\nӘгәр, һеҙ быны һоратмаған булһағыҙ йәки элекке серһүҙегеҙҙе киренән иҫләһәгеҙ һәм уны үҙгәртергә теләмәһәгеҙ, был хатҡа иғтибар итмәгеҙ һәм элекке серһүҙеҙҙе ҡулланыуҙы дауам итегеҙ.",
        "passwordreset-emailelement": "Ҡулланыусы исеме: \n$1\n\nВаҡытлыса серһүҙ: \n$2",
        "passwordreset-emailsentemail": "Серһүҙҙе ташлау тураһындағы мәғлүмәт менән электрон почта аша хат ебәрелде.",
+       "passwordreset-emailsentusername": "Әгәр был ҡатнашыусының исеменә бәйле  электрон почтаһының адресы булһа, ул саҡта  серһүҙҙе тергеҙеү өсөн  хат ебәреләсәк.",
        "passwordreset-emailsent-capture": "Серһүҙҙе ташлау тураһындағы мәғлүмәт менән электрон хат ебәрелде, уның тексы түбәндә бирелә:",
        "passwordreset-emailerror-capture": "Серһүҙҙе ташлау тураһында хәбәр итеүсе электрон хат булдырылғайны, ләкин уны  {{GENDER:$2|kullanıcıya}} түбәндәге сәбәп арҡаһында ебәреп булманы: $1",
        "changeemail": "Электрон почта адресын үҙгәртергә",
        "changeemail-header": "Электрон почта адресын үҙгәртеү",
+       "changeemail-passwordrequired": "Әлеге үҙгәрештәрҙе раҫлау өсөн, Һеҙгә ҡулланыусының серһүҙен яҙырға кәрәк",
        "changeemail-no-info": "Был биткә туранан ирешеү өсөн һеҙгә системала танылыу кәрәк.",
        "changeemail-oldemail": "Хәҙерге электрон почта адресы:",
        "changeemail-newemail": "Яңы электрон почта адресы:",
+       "changeemail-newemail-help": "Әгәр һеҙ үҙегеҙҙең электрон почтағыҙҙы юйҙыртырға теләһәгеҙ, был ялан буш ҡалдырылырға тейеш. Тик уны юйғандан һуң һеҙ онотолған серһүҙҙе ырғыта алмайһығыҙ һәм был  вики проекттан хат алмаясаҡһығыҙ.",
        "changeemail-none": "(юҡ)",
        "changeemail-password": "{{SITENAME}} прокты өсөн серһүҙегеҙ:",
        "changeemail-submit": "Адресты үҙгәртергә",
+       "changeemail-throttled": "Һеҙ системаға ҡат-ҡат танылырға тырыштығыҙ.\nТағы бер танылырҙан алда, зинһар, $1 көтөгөҙ.",
+       "changeemail-nochange": "Зинһар,башҡа яңы электрон почтағыҙ адресын яҙығыҙ.",
        "resettokens": "Токендарҙы ташларға",
        "resettokens-text": "Иҫәп яҙмағыҙ менән бәйләнгән ҡайһы бер шәхси мәғлүмәттәрегеҙгә инеүгә юл асыусы токендарҙы ташлай алаһығыҙ.\n\nЯңылыштан уларҙы берәйһе менән уртаҡлашҡан  йәки аккаунтығыҙ ваттырылған осраҡта быны эшләү мотлаҡ.",
        "resettokens-no-tokens": "Ташлар өсөн токендар юҡ.",
        "preview": "Ҡарап сығыу",
        "showpreview": "Ҡарап сығырға",
        "showdiff": "Индерелгән үҙгәрештәр",
-       "anoneditwarning": "'''Иғтибар''': Һеҙ танылмағанһығыҙ. IP-адресығыҙ был биттең үҙгәртеүҙәр тарихына яҙыласаҡ.",
+       "blankarticle": "<strong>Иҫкәртеү:</strong> Һеҙ булдырасаҡ бит буш.\nӘгәр тағы ла «{{int:savearticle}}» кнопкаға баҫһағыҙ, шул уҡ йөкмәткеле бит  яңынан барлыҡҡа киләсәк.",
+       "anoneditwarning": "<strong>Иғтибар!</strong> Һеҙ сайтта теркәлмәнегеҙ. Әгәр ҙә һеҙ ниндәй ҙә булһа төҙәтмәләр  йәки үҙгәртүҙәр индерһәгеҙ, һеҙҙең IP-адрес башҡаларға ла күрһәтеләсәк. Сайтҡа <strong>[$1 керһәгеҙ]</strong> йәки <strong>[$2 ҡуллануысы яҙмаһын төҙөһәгеҙ]</strong>, һеҙ индергән үҙгәртеүҙәр һеҙҙең ҡулланыусы яҙмағыҙға бәйләнгән була, шулай уҡ башҡа мөмкинлектәр ҙә тыуасаҡ.",
        "anonpreviewwarning": "''Һеҙ танылмағанһығыҙ. Яҙҙырыу ваҡытында IP-адресығыҙ был биттең үҙгәртеүҙәр тарихына яҙыласаҡ.''",
        "missingsummary": "'''Иҫкәртеү.''' Һеҙ үҙгәртеүҙергә ҡыҫҡа тасуирлама яҙманығыҙ. Ҡабаттан «Битте һаҡларға» төймәһенә баҫһағыҙ, үҙгәртеүҙәрегеҙ тасуирламаһыҙ һаҡланасаҡ.",
+       "selfredirect": "<strong>Иғтибар:</strong> Һеҙ шул уҡ мәҡәләгә йүнәлтеү эшләйһегеҙ.\n «{{int:savearticle}}» төәмәһенә баҫһағыҙ тағы шул биткә йүнәлтеләсәк.",
        "missingcommenttext": "Зинһар, аҫҡа үҙ тасуирламағыҙҙы керетегеҙ.",
        "missingcommentheader": "'''Иҫкәртеү:''' Һеҙ был комментарий өсөн тема/исем яҙманығыҙ.\n«{{int:savearticle}}» төймәһенә ҡабат баҫыу менән үҙгәртеүҙерегеҙ исемһеҙ яҙыласаҡ.",
        "summary-preview": "Буласаҡ тасуирлама:",
        "subject-preview": "Тема/башлыҡты алдан ҡарау:",
+       "previewerrortext": "Алдан ҡарау ваҡытында хата китте.",
        "blockedtitle": "Ҡулланыусы блокланған",
        "blockedtext": "'''Иҫәп яҙыуығыҙ йәки IP-адресығыҙ блокланған.'''\n\nБлоклаусы хаким: $1.\nБелдерелгән сәбәп: ''$2''.\n\n* Блоклау башланған ваҡыт: $8\n* Блоклау  аҙағы: $6\n* Блоклауҙар һаны: $7\n\nҺеҙ $1 йәки башҡа [[{{MediaWiki:Grouppage-sysop}}|хакимгә]] блоклау буйынса һорауҙарығыҙҙы ебәрә алаһығыҙ.\nИҫегеҙҙе тотоғоҙ: әгәр һеҙ теркәлмәгән һәм электрон почта адресығыҙҙы раҫламаған булһағыҙ ([[Special:Preferences|көйләүҙәрем битендә]]), хакимгә хат ебәрә алмайһығыҙ. Шулай ук блоклау ваҡытында һеҙҙең хат ебәреү мөмкинлегегеҙ сикләгән булырға ла мөмкин.\nҺеҙҙең IP-адрес — $3, блоклау идентификаторы — #$5.\nХаттарҙа был мәғлүмәттәрҙе күрһәтергә онотмағыҙ.",
        "autoblockedtext": "Һеҙҙең IP-адресығыҙ автоматик рәүештә блокланған. Сәбәбе, был адрес элек блокланған ҡулланыусыларҙың береһе тарафынан ҡулланылған. Блоклаусы хаким ($1) киләһе сәбәпте белдергән:\n\n:«$2»\n\nБлоклаусы хаким: $1.\nБелдерелгән сәбәп: ''$2''.\n\n* Блоклау башланған ваҡыт: $8\n* Блоклау  аҙағы: $6\n* Блоклауҙар һаны: $7\n\nҺеҙ $1 йәки башҡа [[{{MediaWiki:Grouppage-sysop}}|хакимгә]] блоклау буйынса һорауҙарығыҙҙы ебәрә алаһығыҙ.\nИҫегеҙҙе тотоғоҙ: әгәр һеҙ теркәлмәгән һәм электрон почта адресығыҙҙы раҫламаған булһағыҙ ([[Special:Preferences|көйләүҙәрем битендә]]), хакимгә хат ебәрә алмайһығыҙ. Шулай ук блоклау ваҡытында һеҙҙең хат ебәреү мөмкинлегегеҙ сикләгән булырға ла мөмкин.\nҺеҙҙең IP-адрес — $3, блоклау идентификаторы — #$5.\nХаттарҙа был мәғлүмәттәрҙе күрһәтергә онотмағыҙ.",
        "yourdiff": "Айырмалыҡтар",
        "copyrightwarning": "Иғтибар, {{SITENAME}} сайтындағы бөтә өҫтәмәләр һәм үҙгәртеүҙәр $2 (ҡарағыҙ: $1) лицензияһы шарттары менән сығарылған тип иҫәпләнә. Әгәр текстарығыҙҙың ирекле рәүештә таратылыуын һәм төҙәтелеүен теләмәһәгеҙ, уларҙы бында өҫтәмәүегеҙ һорала.<br />\nШулай уҡ, керетелгән үҙгәртеүҙәрҙең авторы булыуығыҙҙы йәки уларҙы эстәлеге ирекле рәүештә таратылырға һәм үҙгәртелергә рөхсәт ителгән сығанаҡтан алыуығыҙҙы раҫлайһығыҙ.<br />\n'''РӨХСӘТ АЛМАЙЫНСА АВТОРЛЫҠ ХОҠУҠТАРЫ МЕНӘН ҺАҠЛАНҒАН МАТЕРИАЛДАР ҠУЙМАҒЫҘ!!!'''",
        "copyrightwarning2": "Иғтибар, һеҙ кереткән өҫтәмәләр башҡа ҡатнашыусылар тарафынан үҙгәртелергә йәки юйылырға мөмкин.\nӘгәр кемдең дә булһа текстарығыҙҙы үҙгәртеүен теләмәһәгеҙ, уларҙы бында ҡуймағыҙ.<br />\nШулай уҡ, кереткән өҫтәмәләрҙең авторы булыуығыҙҙы йәки уларҙы, эстәлеге ирекле рәүештә таратылырға һәм үҙгәртелергә рөхсәт ителгән сығанаҡтан алыуығыҙҙы раҫлайһығыҙ (ҡарағыҙ: $1).\n'''РӨХСӘТҺЕҘ, АВТОРЛЫҠ ХОҠУҠТАРЫ МЕНӘН ҺАҠЛАНҒАН МАТЕРИАЛДАР ҠУЙМАҒЫҘ!'''",
+       "editpage-cannot-use-custom-model": "Был бит моделе эстәлеген үҙгәртергә ярамай.",
        "longpageerror": "'''ХАТА: һаҡланасаҡ текст күләме $1 килобайт, был иһә рөхсәт ителгән {{PLURAL:$1|1=$1 килобайттан|$2 килобайттан}} күп. Битте һаҡлап булмай.'''",
-       "readonlywarning": "'''КИҪӘТЕҮ: Техник хеҙмәтләндереү сәбәпле мәғлүмәттәр базаһы блокланған, шунлыҡтан үҙгәртеүҙәрегеҙҙе хәҙер һаҡлай алмайһығыҙ.'''\nТексты аҙаҡтан ҡулланыу өсөн файлда һаҡлап тора алаһығыҙ.\n\nХаким белдергән сәбәп: $1",
+       "readonlywarning": "<strong>КИҪӘТЕҮ: Техник хеҙмәтләндереү сәбәпле мәғлүмәттәр базаһы блокланған, шунлыҡтан үҙгәртеүҙәрегеҙҙе хәҙер һаҡлай алмайһығыҙ.<strong>\nТексты аҙаҡтан ҡулланыу өсөн башҡа файлда һаҡлап тора алаһығыҙ.\n\nХаким белдергән сәбәп: $1",
        "protectedpagewarning": "'''КИҪӘТЕҮ: Һеҙ был битте үҙгәртә алмайһығыҙ, был хоҡуҡҡа хакимдәр генә эйә.'''\nБелешмә өсөн түбәндә һуңғы үҙгәртеү тураһында мәғлүмәт бирелә:",
        "semiprotectedpagewarning": "'''Киҫәтеү:''' был бит һаҡланған. Уны теркәлгән ҡулланыусылар ғына үҙгәртә ала.\nБелешмә өсөн түбәндә һуңғы үҙгәртеү тураһында мәғлүмәт бирелә:",
-       "cascadeprotectedwarning": "'''КИҪӘТЕҮ:''' Был битте тик хакимдәр генә үҙгәртә ала, сөнки ул эҙмә-эҙлекле һаҡлау ҡуйылған {{PLURAL:$1|1=киләһе биткә|киләһе биттәргә}} керә:",
+       "cascadeprotectedwarning": "<strong>Киҫәтеү:</strong> Был битте тик хакимдәр генә үҙгәртә ала.  Сөнки бит {{PLURAL:$1|каскадлы яҡлау исемлегенә индерелгән}}:",
        "titleprotectedwarning": "'''Киҫәтеү: Бындый исемле бит һаҡланған, уны үҙгәртеү өсөн [[Special:ListGroupRights|тейешле хоҡуҡҡа]] эйә булыу кәрәк.'''\nБелешмә өсөн түбәндә һуңғы үҙгәртеү тураһында мәғлүмәт бирелә:",
        "templatesused": "Был биттә ҡулланылған {{PLURAL:$1|1=ҡалып|ҡалыптар}}:",
        "templatesusedpreview": "Алдан ҡаралған биттә ҡулланылған {{PLURAL:$1|1=ҡалып|ҡалыптар}}:",
        "permissionserrors": "Инеү хоҡуғы хатаһы",
        "permissionserrorstext": "Түбәндәге {{PLURAL:$1|1=сәбәп|сәбәптәр}} буйынса һеҙҙең был ғәмәлде үтәү хоҡуғығыҙ юҡ:",
        "permissionserrorstext-withaction": "«'''$2'''» ғәмәлен башҡара алмайһығыҙ. {{PLURAL:$1|1=Сәбәбе|Сәбәптәре}}:",
+       "contentmodelediterror": "Был версияны мөхәррирләй алмайһығыҙ — <code>$1</code>, моделе ғәмәлдәге — <code>$2</code> моделенан айырыла.",
        "recreate-moveddeleted-warn": "'''Иғтибар: Һеҙ, элек юйылған битте яңынан яһарға теләйһегеҙ.'''\n\nҺеҙгә был битте яңынан яһау кәрәклеген яңынан уйлап ҡарағыҙ.\nТүбәндә биттең юйыу һәм исем үҙгәртеү яҙмалары килтерелә:",
        "moveddeleted-notice": "Был бит юйылған.\nБелешмә өсөн киләһе юйыу һәм исем үҙгәртеү яҙмалары килтерелә.",
+       "moveddeleted-notice-recent": "Үкенескә ҡаршы бит бит юйылған (һуүғы 24 сәғәт эсендә). Түбәндә юйыуҙар журналы һәм был журналға күсереүҙәр бирелгән.",
        "log-fulllog": "Бар яҙмаларҙы ҡарарға",
        "edit-hook-aborted": "Үҙгәртеүҙе ҡармаҡ-процедура кире ҡаҡты.\nӨҫтәмә аңлатма килтерелмәй.",
        "edit-gone-missing": "Битте яңыртып булмай.\nБәлки ул юйылғандыр.",
        "invalid-content-data": "Ярамаған мәғлүмәт",
        "content-not-allowed-here": "\"$1\" эстәлеге [[$2]] бит өсөн ярамай",
        "editwarning-warning": "Икенсе биткә күсеү һеҙ индергән үҙгәрештәрҙең юғалыуына килтереүе мөмкин.\nӘгәр системала танылыу үтһәгеҙ, көйләүҙәрегеҙ битенең \"Мөхәррирләү\" бүлегендә был киҫәтеүҙе һүндерә алаһығыҙ.",
+       "editpage-notsupportedcontentformat-title": "Ярамаған эстәлек форматы",
+       "editpage-notsupportedcontentformat-text": "$1 эстәлеге форматы $2 моделе форматы менән тап килмәй.",
        "content-model-wikitext": "викияҙма",
        "content-model-text": "ғәҙәти яҙма",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "content-json-empty-object": "Буш нәмә",
        "content-json-empty-array": "Буш массив",
+       "duplicate-args-warning": "<strong>Иғтибар:</strong> [[:$1]] берәүҙән артыҡ [[:$2]]  параметры  «$3» менән саҡыра. Һуңғы дәүмәл ҡулланыласаҡ.",
        "duplicate-args-category": "Ҡалыпты сығарғанда ҡабатланған аргументтарҙы ҡулланған биттәр",
        "duplicate-args-category-desc": "Түбәндәге ҡабатланған аргументтары <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> или <code><nowiki>{{foo|bar|1=bar}}</nowiki></code> булған ҡалыпты сығарыу эстәлекле биттәр.",
-       "expensive-parserfunction-warning": "'''Иғтибар:''' был биттә хәтерҙе күп ҡулланыусы функциялар ныҡ күп.\n\nҠуйылған сикләү: $2 {{PLURAL:$2|ҡулланыу}}, был осраҡта {{PLURAL:$1|$1 тапҡыр}} башҡарырға рөхсәт ителә.",
+       "expensive-parserfunction-warning": "<strong>Иғтибар:</strong>  был биттә хәтерҙе күп ҡулланыусы функциялар ныҡ күп.\n\nҠуйылған сикләү: $2 {{PLURAL:$2|ҡулланыу}}, был осраҡта {{PLURAL:$1|$1 тапҡыр}} башҡарырға рөхсәт ителә.",
        "expensive-parserfunction-category": "Хәтерҙе күп ҡулланыусы функциялары күп булған биттәр",
        "post-expand-template-inclusion-warning": "'''Иғтибар:''' Өҫтәлгән ҡалыптар күләме бик ҙур.\nҠайһы бер ҡалыптар өҫтәлмәйәсәк.",
        "post-expand-template-inclusion-category": "Рөхсәт ителгән күләмдән күп ҡалып ҡушылған биттәр",
        "parser-template-recursion-depth-warning": "($1) ҡалыбын рекурсия итеп ҡулланыу тәрәнлеге рөхсәт ителгәндән артып киткән",
        "language-converter-depth-warning": "Телдәрҙе үҙгәртеү тәрәнлегенең сиге үткән ($1)",
        "node-count-exceeded-category": "Төйөндәр һаны артҡан биттәр",
+       "node-count-exceeded-category-desc": "Биттә рөхсәт ителгән төйөндәр һаны артып киткән.",
        "node-count-exceeded-warning": "Биттә төйөндәр һаны артып киткән",
        "expansion-depth-exceeded-category": "Асылыу тәрәнлеге артып киткән биттәр",
        "expansion-depth-exceeded-category-desc": "Биттең асылыу тәрәнлеге мөмкин булған юғары сикте уҙған.",
        "undo-success": "Был үҙгәртеүҙе кире алып була. Зинһар, улар һеҙҙе ҡыҙыҡһындырған үҙгәртеүҙәр булыуынан шикләнмәҫ өсөн версияларҙы сағыштырыуҙы ҡарағыҙ һәм үҙгәртеүҙәрҙе ғәмәлғә керетер өсөн «Битте һаҡларға» төймәһенә баҫығыҙ.",
        "undo-failure": "Ара үҙгәртеүҙәр тура килмәү сәбәпле төҙәтеүҙе кире алып булмай.",
        "undo-norev": "Үҙгәртеүҙе кире алып булмай, сөнки юҡ йәки юйылған.",
+       "undo-nochange": "Төҙәтеү кире ҡайтарылған.",
        "undo-summary": "[[Special:Contributions/$2|$2]] ҡулланыусыһының ([[User talk:$2|фекер алышыу]]) $1 үҙгәртеүенән баш тартыу",
        "undo-summary-username-hidden": "Исеме йәшерелгән ҡатнашыусының төҙәтеүен  $1 кире ҡағыу",
        "cantcreateaccounttitle": "Иҫәп яҙыуын яһап булмай",
        "cantcreateaccount-text": "Был IP-адрестан (<b>$1</b>) иҫәп яҙыуҙары булдырыу [[User:$3|$3]] тарафынан тыйылған.\n\n$3 белдергән сәбәп: ''$2''",
+       "cantcreateaccount-range-text": "{{GENDER:$3|Ҡатнашыусы}} [[User:$3|$3]] һеҙҙең IP-адрес ингән (<strong>$4</strong>) <strong>$1</strong> диапозонында иҫәп яҙмаһын булдырмаҫҡа {{GENDER:$3|тыйыу}} ҡуйҙы.\n\nОшо сәбәп күһәтелгән: $2.",
        "viewpagelogs": "Был биттең яҙмаларын ҡарарға",
        "nohistory": "Был биттең үҙгәртеүҙәр тарихы юҡ.",
        "currentrev": "Ағымдағы версия",
        "history-feed-description": "Викилағы был биттең үҙгәртеүҙәр тарихы",
        "history-feed-item-nocomment": "$1, $2",
        "history-feed-empty": "Һоратылған бит юҡ.\nУл бит юйылған йәки исеме үҙгәртелгән булыуы мөмкин.\nВикила оҡшаш биттәрҙе [[Special:Search|эҙләп ҡарағыҙ]].",
+       "history-edit-tags": "Һайланған версияның тегын үҙгәртергә.",
        "rev-deleted-comment": "(мөхәррирләү тасуирламаһы юйылған)",
        "rev-deleted-user": "(автор исеме юйылған)",
        "rev-deleted-event": "(яҙма юйылған)",
        "rev-deleted-user-contribs": "[ҡулланыусы исеме йәки IP-адрес юйылған — төҙәтеү өлөш битенән йәшерелде]",
        "rev-deleted-text-permission": "Биттең был өлгөһө '''юйылған'''.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Юйыу яҙмалары журналында] аңлатмалар ҡалдырылыуы мөмкин.",
+       "rev-suppressed-text-permission": "Биттең был версияһы '''йәшерелгән'''.\nҺеҙ уны [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} йәшереү яҙмаларында] ҡарай алаһығыҙ .",
        "rev-deleted-text-unhide": "Биттең был версияһы '''юйылған'''.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Юйыу яҙмаларында] аңлатмалар ҡалдырылыуы мөмкин.\nТеләгегеҙ булһа [был версияны $1] ҡарай алаһығыҙ.",
        "rev-suppressed-text-unhide": "Биттең был версияһы '''Йәшерелгән'''.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Йәшереү яҙмаларында] аңлатмалар ҡалдырылыуы мөмкин.\nТеләгегеҙ булһа [был версияны $1] ҡарай алаһығыҙ.",
        "rev-deleted-text-view": "Биттең был версияһы '''юйылған'''.\nҺеҙ уны [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Юйыу яҙмаларында] ҡарай алаһығыҙ .",
        "rev-showdeleted": "күрһәтергә",
        "revisiondelete": "Бит версияларын юйырға/тергеҙергә",
        "revdelete-nooldid-title": "Маҡсат версия билдәләнмәгән",
-       "revdelete-nooldid-text": "Был функцияны үтәү өсөн һеҙ маҡсат версияны (йәки версияларҙы) билдәләмәнегеҙ. Билдәләнгән версия юҡ йәки версияны йәшерергә тырышаһығыҙ.",
+       "revdelete-nooldid-text": "Был функцияны үтәү өсөн һеҙ һуңғы версияны (йәки версияларҙы) билдәләмәнегеҙ. Билдәләнгән версия юҡ йәки версияны йәшерергә тырышаһығыҙ.",
        "revdelete-no-file": "Күрһәтелгән файл юҡ.",
        "revdelete-show-file-confirm": "$2, $3 ваҡытлы «<nowiki>$1</nowiki> файлының юйылған версияһын ҡарарға теләүегеҙҙе раҫлайһығыҙмы?",
        "revdelete-show-file-submit": "Эйе",
+       "revdelete-selected-text": "{{PLURAL:$1|Һайланған версия|Һайланған версиялар}} [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Һайланған файл версияһы|Һайланған файл версиялары}} [[:$2]]:",
        "logdelete-selected": "Яҙманың {{PLURAL:$1|1=һайланған яҙыуы|һайланған яҙыуҙары}}:",
+       "revdelete-text-text": "Тарих битендә юйылған версиялар күренәсәк, ҡайһы бер өлөштәре ҡатнышыусылар өсөн асыҡ буласаҡ.",
+       "revdelete-text-file": "Тарих битендә юйылған файл версиялары күренәсәк, ҡайһы бер өлөштәре ҡатнышыусылар өсөн асыҡ буласаҡ",
+       "logdelete-text": "Тарих битендә юйылған версиялар күренәсәк, ҡайһы бер өлөштәре ҡатнышыусылар өсөн асыҡ буласаҡ.",
+       "revdelete-text-others": "Башҡа админситраторҙарың йәшәрелгән эстәлеккә инергә мөмкинлеге бар, өҫтәмә сикләүҙәр булмаған осраҡта, улар уны кире ҡайтара ала.",
        "revdelete-confirm": "Зинһар, был ғәмәлде үтәргә теләүегеҙҙе, буласаҡ һөҙөмтәләрҙә аңлауығыҙҙы, [[{{MediaWiki:Policy-url}}|ҡағиҙәләр]] буйынса эшләүегеҙҙе раҫлағыҙ.",
        "revdelete-suppress-text": "Йәшереү '''тик''' киләһе осраҡтарҙа ғына башҡарыла:\n\n* Уңай булмаған шәхси мәғлүмәт\n* ''өй адресы, телефон номерҙары, паспорт номеры һ.б.''",
        "revdelete-legend": "Күренеш сикләүҙәрен көйләргә:",
        "revdelete-hide-text": "Биттең был версияһының текстын йәшерергә",
        "revdelete-hide-image": "Файл эстәлеген йәшерергә",
-       "revdelete-hide-name": "Ò\92Ó\99мÓ\99лде Ò»Ó\99м Ð¼Ð°Ò¡Ñ\81аÑ\82Ñ\8bн йәшерергә",
+       "revdelete-hide-name": "Ò\92Ó\99мÓ\99лде Ò»Ó\99м ÐºÓ©Ð¹Ð»Ó\99Ò¯Ò\99е йәшерергә",
        "revdelete-hide-comment": "Үҙгәртеүҙәр тасуирламаһы",
        "revdelete-hide-user": "Мөхәррирләүсенең исеме/IP-адресы",
        "revdelete-hide-restricted": "Мәғлүмәттәрҙе хакимдәрҙән дә йәшерергә",
        "mergehistory-empty": "Һис бер версияны берләштереп булмай.",
        "mergehistory-done": "$1 битенең $3 {{PLURAL:$3|үҙгәртеүе}} уңышлы [[:$2]] менән берләштерелде.",
        "mergehistory-fail": "Бит тарихтарын берләштереп булманы, зирһар, бит һәм ваҡыт параметрҙарын яңынан тикшерегеҙ.",
+       "mergehistory-fail-bad-timestamp": "Ваҡыт тамғаһы дөрөҫ түгел.",
+       "mergehistory-fail-invalid-source": "Сығанаҡ бит дөрөҫ түгел.",
+       "mergehistory-fail-invalid-dest": "Маҡсат бите дҡрҡҫ түгел.",
+       "mergehistory-fail-no-change": "Бит таризы версиялары ҡушылманы. Зинһар өсөн, бит һәм ваҡыт параметрҙарын тикшерегеҙ.",
+       "mergehistory-fail-permission": "Бит тарихын ҡушыу өсөн хоҡуҡтар етәрлек түгел.",
+       "mergehistory-fail-self-merge": "Сығанаҡ һәм маҡсат бит бер төрлө.",
+       "mergehistory-fail-timestamps-overlap": "Сығанаҡ версия ҡаплана йәки тәғәйенләнгән версиянан һуң килә.",
+       "mergehistory-fail-toobig": "Бит тарихын ҡушып булмай, сәнки $1 лимитын күберәк {{PLURAL:$1|версияһына}} күсерергә кәрәк.",
        "mergehistory-no-source": "Сығанаҡ бит «$1» юҡ.",
        "mergehistory-no-destination": "Маҡсат бит «$1» юҡ.",
        "mergehistory-invalid-source": "Сығанаҡ биттең исеме дөрөҫ булырға тейеш.",
        "showhideselectedversions": "Һайланған версияларҙы күрһәтергә/йәшерергә",
        "editundo": "кире алыу",
        "diff-empty": "(айырмалар юҡ)",
+       "diff-multi-sameuser": "(был ҡулланыусының {{PLURAL:$1|аралағы версия $1|аралағы версиялары $1}} күрһәтелмәгән)",
+       "diff-multi-otherusers": "({{PLURAL:$1|$1 ваҡытлы версия| $1 ваҡытлы версия}} күрһәтелмәгән {{PLURAL:$2|$2 ҡатнашыусы|$2 ҡатнашыусылар}})",
        "diff-multi-manyusers": "(Кәмендә {{PLURAL:$2|$2 ҡатнашыусының}} {{PLURAL:$1|ваҡытлы версияһы}} күрһәтелмәгән)",
        "difference-missing-revision": "$1 айырмаһының {{PLURAL:$2|1=бер өлгөһө|$2 өлгөһө}} табылманы.\n\nБыл хәл, ғәҙәттә, юйылған биткә яһалған айырма һылтанмаһының ваҡыты үтеүенән барлыҡҡа килә.\nТулыраҡ мәғлүмәт өсөн ҡарағыҙ: [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} юйыу яҙмалары].",
        "searchresults": "Эҙләү һөҙөмтәләре",
        "shown-title": "Бер биттә $1 {{PLURAL:$1|1=һөҙөмтә|һөҙөмтә}} күрһәтергә",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) ҡарарға",
        "searchmenu-exists": "'''Был вики-проектта «[[:$1]]» бите бар'''",
-       "searchmenu-new": "'''Был википроектта \"[[:$1]]\" бите булдырырға.'''",
+       "searchmenu-new": "{{PLURAL:$2|}}<strong>Был википроектта \"[[:$1]]\" бите булдырырға.</strong>",
        "searchprofile-articles": "Эстәлек биттәре",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything": "Барыһы",
        "search-result-category-size": "{{PLURAL:$1|1=$1 ағза}} ({{PLURAL:$2|$2 эске категория}}, {{PLURAL:$3|$3 файл}})",
        "search-redirect": "(йүнәлтеү $1)",
        "search-section": "($1 бүлеге)",
+       "search-category": "(категория $1)",
        "search-file-match": "(файл эстәлеге менән тура килә)",
        "search-suggest": "Бәлки, ошоно эҙләйһегеҙҙер: $1",
+       "search-rewritten": "$1 нәтижәһе күрһәтелгән. $2 урынына эҙләргә.",
        "search-interwiki-caption": "Туғандаш проекттар",
        "search-interwiki-default": "$1 һөҙөмтәһе:",
        "search-interwiki-more": "(тағы)",
        "searchrelated": "ҡағылышлы",
        "searchall": "барыһы",
        "showingresults": "Түбәндә №&nbsp;<strong>$2</strong> һөҙөмтәнән башлап <strong>$1</strong> {{PLURAL:$1|һөҙөмтә}} күрһәтелгән.",
+       "showingresultsinrange": "Түбәндә №&nbsp;<strong>$2</strong> һөҙөмтәнән башлап <strong>$1</strong> {{PLURAL:$1|һөҙөмтә}} күрһәтелгән.<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> нәтижәнән <strong>$1</strong>| <strong>$3</strong> нәтижәләрҙән <strong>$1 — $2</strong>}}",
        "search-nonefound": "Был һорауға яуап биреүсе һөҙөмтәләр табылманы.",
+       "search-nonefound-thiswiki": "Был һорауға яуап биреүсе һөҙөмтәләр табылманы.",
        "powersearch-legend": "Киңәйтелгән эҙләү",
        "powersearch-ns": "Исем аралыҡтарында эҙләү:",
        "powersearch-togglelabel": "Һайла:",
        "rows": "Юлдар:",
        "columns": "Бағаналар:",
        "searchresultshead": "Эҙләү",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">Материалдарға һылтанмалар </a> форматлау сиге (байттарҙа)",
+       "stub-threshold": "Яһалма һылтамаларҙың биҙәлеше буйынса сикләүҙәр ($1):",
        "stub-threshold-sample-link": "миҫал",
        "stub-threshold-disabled": "Һүндерелгән",
        "recentchangesdays": "Күҙәтеү исемлегендә күренгән көндәр һаны:",
        "right-sendemail": "Башҡа ҡатнашыусыларға электрон почта аша хат ебәреү",
        "right-passwordreset": "Серһүҙҙе яңыртыу осраҡтарын ҡарау",
        "right-managechangetags": "[[Special:Tags|билдәләр]] мәғлүмәттәр базаһында төҙөү һәм юйыу",
+       "right-applychangetags": " [[Special:Tags|тамғаһын]] үҙегеҙҙең төҙөтеү менән ҡулланырға",
+       "right-changetags": "Айырым үҙгәртеүҙәрҙә һәм журнал яҙмаланыда[[Special:Tags|тамғаһын]] өҫтәү һәм юйыу",
+       "grant-generic": "Хоҡуҡтар йыйынтығы «$1»",
+       "grant-group-page-interaction": "Башҡа биттәр менән бәйләнеш",
+       "grant-group-file-interaction": "Медиафайлдар менән бәйләнеш",
+       "grant-group-watchlist-interaction": "Күҙәтеүҙәр исемлеге менән бәйленеш",
        "grant-group-email": "Электрон хат ебәреү",
+       "grant-group-high-volume": "Юғары әүҙемлекле алым эшләргә",
+       "grant-group-customization": "Көйләүҙәр һәм өҫтөнлөк биргән көйләүҙәр",
+       "grant-group-administration": "Административ алымдар ҡулланыу",
+       "grant-group-other": "Әүҙемлек төрлө",
+       "grant-blockusers": "Иҫәп яҙмаларын блоклау һәм блоклауҙы асыу",
+       "grant-createaccount": "Иҫәп яҙмаһын булдырырға",
+       "grant-createeditmovepage": "Биттәрҙе булдырыу,мөхәррирләү һәм исемен үҙгәртеү",
+       "grant-delete": "Журналдағы биттәрҙе юйыу,төҙәтеү",
+       "grant-editinterface": "MediaWiki исеме арауығында төҙәтеү һәм ҡулланыусы CSS/JavaScript",
+       "grant-editmycssjs": "CSS/JavaScript ҡулланыусы кодын төҙәтеү",
        "grant-editmyoptions": "Һеҙҙең ҡулланыусы көйләүҙәрен мөхәррирләү",
+       "grant-editmywatchlist": "һеҙҙең күҙәтеүҙәр исемлеген мөхәррирләү",
+       "grant-editpage": "Ғәмәлдәге битте төҙәтеү",
+       "grant-editprotected": "Һаҡланған битте төҙәтеү",
+       "grant-highvolume": " Юғары әүҙемлектә мөхәррирләү",
+       "grant-oversight": "Башҡа ҡатнашыусылар тәҙәтеүенән бит версияһын йәшерергә",
+       "grant-patrol": "Бит үҙгәрештәрен күҙәтеү",
+       "grant-protect": "Битте һаҡлау һәм һаҡты сисеү",
+       "grant-rollback": "Биттеге үҙгәрештәрҙе кире ҡайтарыу",
+       "grant-sendemail": "Башҡа ҡатнашыусыларға электрон почта аша хат ебәреү",
+       "grant-uploadeditmovefile": "Файлдарҙы тейәү, алмаштырыу һәм исемен үҙгәртеү",
+       "grant-uploadfile": "Тағы файлдар тейәргә",
+       "grant-basic": "Төп хоҡуҡтар",
+       "grant-viewdeleted": "Юйылған файлдарҙы һәм биттерҙе тейәү",
+       "grant-viewmywatchlist": "һеҙҙең күҙәтеүҙәр исемлеген байҡау",
        "newuserlogpage": "Яңы ҡулланыусы яҙмалары",
        "newuserlogpagetext": "Яңы теркәлгән ҡатнашыусылар яҙмалары журналы.",
        "rightslog": "Ҡулланыусының хоҡуҡтары көндәлеге",
        "action-createpage": "Яңы бит яһау",
        "action-createtalk": "Фекер алышыу битен яһау",
        "action-createaccount": "Был ҡулланыусы иҫәп яҙыуын яһау",
+       "action-autocreateaccount": "Ҡатнашыусының тышҡы иҫәп яҙмаһы менән инергә",
+       "action-history": "Был биттең тарихын ҡарарға",
        "action-minoredit": "Был төҙәтеүҙе әҙ үҙгәреш тип билдәләү",
        "action-move": "Был биттең исемен үҙгәртеү",
        "action-move-subpages": "Был биттең һәм эске биттәренең исемен үҙгәртеү",
        "action-move-rootuserpages": "Ҡулланыусыларҙың төп биттәренең исемен үҙгәртеү",
+       "action-move-categorypages": "Категория биттәренең исемен үҙгәртеү",
        "action-movefile": "Был файлдың исемен үҙгәртеү",
        "action-upload": "Был файлды тейәү",
        "action-reupload": "Булған файлдың өҫтөнә яҙыу",
        "action-viewmywatchlist": "һеҙҙең күҙәтеүҙәр исемлеген байҡау",
        "action-viewmyprivateinfo": "һеҙҙең шәхси мәғлүмәтте байҡау",
        "action-editmyprivateinfo": "һеҙҙең шәхси мәғлүмәтте мөхәррирләү",
-       "nchanges": "$1 {{PLURAL:$1|1=үҙгәртеү|үҙгәртеү}}",
+       "action-editcontentmodel": "Биттең контент моделен мөхәррирләү",
+       "action-managechangetags": "Мәғлүмәт базаһында тамға булдырыу һәм юйыу",
+       "action-applychangetags": "Һеҙҙең үҙгәрештәр ТЕГын булдырырға",
+       "action-changetags": "Айырым үҙгәртеүҙәрҙә һәм журнал яҙмаланыда тег өҫтәү һәм юйыу",
+       "nchanges": "$1 {{PLURAL:$1|үҙгәртәү|үҙгәртеүҙәр}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|һеҙҙең һуңғы визит}}",
        "enhancedrc-history": "тарих",
        "recentchanges": "Һуңғы үҙгәртеүҙәр",
        "recentchanges-label-bot": "Был төҙәтеү бот тарафынан башҡарылды",
        "recentchanges-label-unpatrolled": "Был төҙәтеү ҡаралмаған әле",
        "recentchanges-label-plusminus": "Бит шул тиклем байтҡа үҙгәрҙе",
-       "recentchanges-legend-heading": "'''Легенда:'''",
+       "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|Яңы биттәр исемлеген]] ҡарағыҙ)",
-       "rcnotefrom": "Түбәндә '''$2''' башлап ('''$1''' тиклем) үҙгәртеүҙәр күрһәтелгән.",
+       "recentchanges-submit": "Күрһәтергә",
+       "rcnotefrom": "Аҫтарак <strong>$3, $4</strong> өсөн {{PLURAL:$5|үҙгәртеүҙәр күрһәтелгән}} (<strong>$1</strong> артыҡ түгел).",
        "rclistfrom": "$3 $2 башлап яңы үҙгәртеүҙәрҙе күрһәт.",
        "rcshowhideminor": "бәләкәй төҙәтеүҙәрҙе $1",
        "rcshowhideminor-show": "Күрһәтергә",
        "rcshowhidemine": "минең үҙгәртеүҙәремде $1",
        "rcshowhidemine-show": "Күрһәтергә",
        "rcshowhidemine-hide": "Йәшерергә",
+       "rcshowhidecategorization": "$1 биттәрҙе категориялаштырыу",
+       "rcshowhidecategorization-show": "Күрһәтергә",
+       "rcshowhidecategorization-hide": "Йәшерелгән",
        "rclinks": "Һуңғы $2 көн эсендәге һуңғы $1 үҙгәртеүҙе күрһәтергә<br />$3",
        "diff": "айыр.",
        "hist": "тарих",
        "newpageletter": "Я",
        "boteditletter": "б",
        "number_of_watching_users_pageview": "[$1 күҙәткән {{PLURAL:$1|ҡатнашыусы}}]",
-       "rc_categories": "Ð\9eÑ\88о ÐºÐ°Ñ\82егоÑ\80иÑ\8fлаÑ\80Ò\99ан Ò\93Ñ\8bна («|» Ð¼ÐµÐ½Ó\99н Ð°Ð¹Ñ\8bÑ\80Ñ\8bÑ\80Ò\93а)",
-       "rc_categories_any": "Һәр",
+       "rc_categories": "Тик ÐºÐ°Ñ\82егоÑ\80иÑ\8fлаÑ\80Ò\99ан Ò\93Ñ\8bна (бүлеүÑ\81е Â«|»):",
+       "rc_categories_any": "Һайланғандың теләһә ҡайһыһы",
        "rc-change-size-new": "Үҙгәртештән һуң күләм: $1 {{PLURAL:$1|1=байт|байт}}",
        "newsectionsummary": "/* $1 */ яңы бүлек",
        "rc-enhanced-expand": "Ваҡ-төйәгенә тиклем күрһәтергә",
        "recentchangeslinked-summary": "Был күрһәтелгән бит һылтанма яһаған (йәки күрһәтелгән категорияға кергән) һуңғы үҙгәртеүҙәр исемлеге.\n[[Special:Watchlist|Күҙәтеү исемлегегеҙгә]] керә торған биттәр '''ҡалын''' итеп күрһәтелгән.",
        "recentchangeslinked-page": "Бит исеме:",
        "recentchangeslinked-to": "Киреһенсә, был биткә һылтанма яһаған биттәрҙәге үҙгәртеүҙәрҙе күрһәтергә",
+       "recentchanges-page-added-to-category": "[[:$1]] категорияға өҫтәлгән",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] һәм {{PLURAL:$2|бер бит|$2 биттәр}} категорияға өҫтәлгән",
+       "recentchanges-page-removed-from-category": "[[:$1]] категориянан алынған",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] һәм {{PLURAL:$2|бер бит|$2 биттәр}} категориянан алынған",
+       "autochange-username": "Автоматик рәүештә MediaWiki үҙгәртелә",
        "upload": "Файл тейәү",
        "uploadbtn": "Файлды тейәргә",
        "reuploaddesc": "Тейәү формаһына кире ҡайтырға",
        "upload-recreate-warning": "'''Иғтибар. Бындай исемле файл юйылған йәки күсерелгән. '''\nБыл биттең юйыуҙары һәм күсереүҙәре яҙмалары журналы түбәндә килтерелгән:",
        "uploadtext": "Файл тейәү өсөн түбәндәге форманы ҡулланығыҙ.\nЭлек тейәлгән файлдарҙы байҡар өсөн [[Special:FileList|тейәлгән файлдар исемлеген]] ҡарағыҙ. Файл тейәүҙәр шулай уҡ [[Special:Log/upload|тейәү яҙмаларына]], юйыуҙар иһә [[Special:Log/delete|юйыу яҙмаларына]] яҙылып баралар.\n\nФайлды мәҡәләгә өҫтәү өсөн киләһе юлдарҙы ҡуллана алаһығыҙ:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' — файлдың тулы өлгөһөн ҡуйыр өсөн;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|тасуирлама]]</nowiki></code>''' — файлдың киңлек буйынса 200 нөктәгә тиклем бәләкәсәйтелгән, һулға тигеҙләнгән һәм аҫтында тасуирламаһы булған өлгөһөн ҡуйыр өсөн;\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' — эстәлеген биттә күрһәтмәйенсә файлға һылтанма ҡуйыу өсөн.",
        "upload-permitted": "{{PLURAL:$2|Рөхсәт ителгән файл төрө|Рөхсәт ителгән файл төрҙөре}}: $1.",
-       "upload-preferred": "Уңайлы файл типтары: $1.",
+       "upload-preferred": "Уңайлы файл типтары: {{PLURAL:$2|type|types}}: $1.",
        "upload-prohibited": "{{PLURAL:$2|Тыйылған файл төрө|Тыйылған файл төрҙәре}}: $1.",
        "uploadlogpage": "Тейәү яҙмалары",
        "uploadlogpagetext": "Түбәндә, һуңғы файл тейәүҙәр исемлеге күрһәтелгән.\nШулай уҡ [[Special:NewFiles|яңы файлдар галереяһын]] ҡарағыҙ; һуңғы тейәүҙәр ентекле рәүештә күрһәтелгән.",
        "windows-nonascii-filename": "Был вики махсус символ булған файл исемдәрен терәкләмәй.",
        "fileexists": "Бындай исемле файл бар инде, зинһар, уны алыштырырға теләүегеҙҙә шикләнһәгеҙ,  <strong>[[:$1]]</strong>тикшерегеҙ.\n[[$1|thumb]]",
        "filepageexists": "Был файлдың тасуирламаһы бите булдырылған инде: <strong>[[:$1]]</strong>, әммә бындай исемле файл юҡ.\nКеретелгән тасуирлама файлдың тасуирламаһы битендә сыҡмаясаҡ.\nЯңы тасуирлама өҫтәр өсөн, һеҙгә уны ҡул менән үҙгәртергә тура киләсәк.\n[[$1|thumb]]",
-       "fileexists-extension": "Ð\9eÒ¡Ñ\88аÑ\88 Ð¸Ñ\81емле Ñ\84айл Ð±Ð°Ñ\80: [[$2|thumb]]\n* Ð¢ÐµÐ¹Ó\99лгÓ\99н Ñ\84айлдÑ\8bÒ£ Ð¸Ñ\81еме: <strong>[[:$1]]</strong>\n* Ð\91Ñ\83лÒ\93ан Ñ\84айлдÑ\8bÒ£ Ð¸Ñ\81еме: <strong>[[:$2]]</strong>\nÐ\97инһаÑ\80, Ð±Ð°Ñ\88ҡа Ð¸Ñ\81ем Ò»Ð°Ð¹Ð»Ð°Ò\93Ñ\8bÒ\99.",
+       "fileexists-extension": "Ð\9eÒ¡Ñ\88аÑ\88 Ð¸Ñ\81емле Ñ\84айл Ð±Ð°Ñ\80: [[$2|thumb]]\n* Ð¢ÐµÐ¹Ó\99лгÓ\99н Ñ\84айлдÑ\8bÒ£ Ð¸Ñ\81еме: <strong>[[:$1]]</strong>\n* Ð\91Ñ\83лÒ\93ан Ñ\84айлдÑ\8bÒ£ Ð¸Ñ\81еме: <strong>[[:$2]]</strong>\nÐ\91аÑ\88ҡа Ñ\82Ó©Ñ\80лө Ð¸Ñ\81ем Ò»Ð°Ð¹Ð»Ð¿Ñ\80Ò\93а Ñ\82елÓ\99йһегеÒ\99ме?",
        "fileexists-thumbnail-yes": "Файл бәләкәйтелгән өлгө ''(шартлы рәсем)'' булырға тейеш.\n[[$1|thumb]]\nЗинһар, <strong>[[:$1]]</strong> файлын тикшерегеҙ.\nӘгәр ул ошо уҡ файлдың төп өлгөһө булһа, уның бәләкәйтелгән өлгөһөн айырым тейәүҙең кәрәге юҡ.",
        "file-thumbnail-no": "Файлдың исеме <strong>$1</strong> менән башлана.\nБәлки, ул рәсемдең бәләкәйтелгән өлгөһөлөр ''(шартлы рәсем)''.\nӘгәр һеҙҙә был рәсемдең ҙур өлгөһө булһа, зинһар, уны керетегеҙ йәки файлдың исемен үҙгәртегеҙ.",
        "fileexists-forbidden": "Бындай исемле файл бар инде һәм ул үҙгәртелә алмай.\nӘгәр һеҙ шулай ҙа был файлды тейәргә теләһәгеҙ, зинһар, кире ҡайтығыҙ һәм уны икенсе исем аҫтында тейәгеҙ.\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Бындай исемле файл дөйөм файл һаҡлағыста бар инде.\nӘгәр һеҙ шулай ҙа был файлды тейәргә теләһәгеҙ, зинһар, кире ҡайтығыҙ һәм яңы исем һайлағыҙ.\n[[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Был файл түбәндәге {{PLURAL:$1|1=файл|файлдар}} менән тап килә:",
        "file-deleted-duplicate": "Оҡшаш файл ([[:$1]]) юйылғайны инде. Уны ҡайтанан тейәр алдынан, зинһар, файлды юйыу тарихын ҡарағыҙ.",
+       "file-deleted-duplicate-notitle": "Ошоға оҡшаған файл юйылған,ә исеме тыйылған булған. Яүынан тейәү алдынан администратор хоҡуғы булған кешенән тыйылған файлдарҙы ҡарап сығыуын һорарға кәрәк.",
        "uploadwarning": "Киҫәтеү",
        "uploadwarning-text": "Зинһар, түбәндәге файл тасуирламаһын үҙгәртегеҙ һәм яңынан ҡабатлап ҡарағыҙ.",
        "savefile": "Һөҙгөстө яҙҙырып ҡуйырға",
        "uploaddisabledtext": "Файлдар тейәү рөхсәт ителмәй.",
        "php-uploaddisabledtext": "Файлдар тейәү PHP көйләүҙәрендә рөхсәт ителмәй. Зинһар, file_uploads көйләүен тикшерегеҙ.",
        "uploadscripted": "Файлда булған HTML-кодты йәки скриптты браузер дөрөҫ эшкәртмәүе мөмкин.",
+       "upload-scripted-pi-callback": "XML стилендәге таблицаны эшкәртеү инструкцияһы булған файлды тейеп булмай.",
+       "uploaded-script-svg": "Тейәлгән SVG-файлында хәүефле  «$1» элементы табылды.",
+       "uploaded-hostile-svg": "Тейәлгән SVG-файлда хәүефле CSS-код табылды.",
+       "uploaded-event-handler-on-svg": "SVG-файлдары өсөн  <code>$1=\"$2\"</code> атрибуты ҡуйыу рөхсәт ителмәй.",
+       "uploaded-href-attribute-svg": "SVG-файлында href-атрибуты  <code><$1 $2=\"$3\"></code> тик http:// йәки https:// башланған маҡсатҡа рөхсәт ителә.",
+       "uploaded-href-unsafe-target-svg": "Тейәлгән SVG-файлда хәүефле мәғлүмәт табылды: URI <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-animate-svg": "Тейәлгән SVG-файлында тег «animate»  табылды,  «from»-атрибут <code>&lt;$1 $2=\"$3\"&gt;</code> ярҙамында һылтанманы үҙгәртә ала.",
+       "uploaded-setting-event-handler-svg": "Тейәлгән SVG-файлда  <code>&lt;$1 $2=\"$3\"&gt;</code> коды табылды, атрибуттар ғуйыу блокланды.",
+       "uploaded-setting-href-svg": "«href» атрибутына  «set» тегын ҡуйыу блокланды.",
+       "uploaded-wrong-setting-svg": "«set» тегын файҙаланыу  блокландыо. Тейәлгән SVG-файлында  <code>&lt;set to=\"$1\"&gt;</code> конструкцияһы табылды.",
+       "uploaded-setting-handler-svg": "SVG«handler» атрибутын өҫтәүсе SVG блокланды.Тейәлгән SVG-файлда  <code>$1=\"$2\"</code> конструкцияһы табылды.",
+       "uploaded-remote-url-svg": "SVG«handler» атрибутын өҫтәүсе SVG блокланды.Тейәлгән SVG-файлда  <code>$1=\"$2\"</code> конструкцияһы табылды.",
+       "uploaded-image-filter-svg": "Тейәлгән SVG-файлда рәсемдәр фильтры табылды URL-адресом <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploadscriptednamespace": " SVG-файлында ярамаған исем бар '$1'",
+       "uploadinvalidxml": "Тейәлгән файлда анализлап булмай XML .",
        "uploadvirus": "Файлда вирус бар!\nТулыраҡ мәғлүмәт: $1",
        "uploadjava": "Был, эсендә Java .class файлы булған ZIP-архив.\nИменлек өсөн Java-файлдарын тейәү тыйылған.",
        "upload-source": "Сығанаҡ файл",
        "upload-options": "Тейәү көйләүҙәре",
        "watchthisupload": "Файлды күҙәтергә",
        "filewasdeleted": "Бындай исемле файл бығаса булған һәм юйылған. Зинһар, ҡабаттан тейәр алдынан $1 битен ҡарағыҙ.",
+       "filename-thumb-name": "Файл исеме рәсемдең бәләкәйләтелгән исеменә оөңҡшаған. Зинһар өсөн, бындай миниатюраларҙы вики-проектҡа тейәмәгеҙ. Әгәр һеҙгә был файл бик кәрәк булһа, исемен эстәлегенә ярашлы үҙгәртегеҙ.",
        "filename-bad-prefix": "Тейәлә торған файлдың исеме ''«$1»''' менән башлана һәм ул цифрлы камераларҙа файлдарға уҙенән-үҙе бирелә торған исемгә оҡшаған.\nЗинһар, файлды яҡшыраҡ тасуирлаған исем һайлағыҙ.",
        "upload-proto-error": "Протокол дөрөҫ түгел",
        "upload-proto-error-text": "Алыҫтан тейәү өсөн <code>http://</code> йәки <code>ftp://</code> менән башланған адрес кәрәк.",
        "upload-too-many-redirects": "URL бигерәк күп йүнәлтмәләр яһай.",
        "upload-http-error": "HTTP хата килеп сыҡты: $1",
        "upload-copy-upload-invalid-domain": "Был доменға ҡараған сайттарҙан файл күсереү асыҡ түгел",
+       "upload-foreign-cant-upload": "Вики ситтәге репозиторийға фаәл тейәргә көйләнмәгән.",
+       "upload-dialog-title": "Файлды тейәргә",
+       "upload-dialog-button-cancel": "Кире алырға",
+       "upload-dialog-button-done": "Әҙер",
+       "upload-dialog-button-save": "Һаҡларға",
+       "upload-dialog-button-upload": "Тейәргә",
+       "upload-form-label-infoform-title": "Ентеклерәк",
+       "upload-form-label-infoform-name": "Исем",
+       "upload-form-label-infoform-name-tooltip": "Башлыҡтың үҙенсәләкле исеме һаҡланасаҡ. Ябай телдә яҙылған исем һәм пробелдар ҡулланырға була. Киңәйтеүҙәр ҡулланмағыҙ.",
+       "upload-form-label-infoform-description": "Тасуирлау",
+       "upload-form-label-infoform-description-tooltip": "Был әҫәр тураһында ҡыҫҡаса тасуирлама бирегеҙ. Фото өсөн - фотола нимә иң мөһиме, төшөрөлгән урынды яҙығыҙ.",
+       "upload-form-label-usage-title": "Ҡулланыу",
+       "upload-form-label-usage-filename": "Файл исеме",
+       "foreign-structured-upload-form-label-own-work": "Был минең эш",
+       "foreign-structured-upload-form-label-infoform-categories": "Категориялар",
+       "foreign-structured-upload-form-label-infoform-date": "Дата",
+       "foreign-structured-upload-form-label-own-work-message-local": "Тейәлгән файл  {{SITENAME}} лицензия сәйәсәтенә ярашлы икәнен раҫлайым.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "{{SITENAME}} ҡағиҙәләренә ярашлы файлды тейәй алмаһағыҙ, диалог теҙерәһен ябығыҙ ҙа тейәү !с!н башҡа ысулды һайлағыҙ.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "{{SITENAME}} ҡағиҙәләренә ярашлы файлды тейәй алмаһағыҙ, диалог теҙерәһен ябығыҙ ҙа тейәү !с!н башҡа ысулды һайлағыҙ.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "{{SITENAME}} талаптарына ярашлы файлы тейәп булһа,  [[Special:Upload|тейәү битен]] ҡарағыҙ.",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "{{SITENAME}} талаптарына ярашлы файлы тейәп булһа,  [[Special:Upload|тейәү битен]] ҡарағыҙ.",
        "backend-fail-stream": "$1 файлын трансляциялап булмай.",
        "backend-fail-backup": "$1 файлының резерв күсермәһен эшләп булмай.",
        "backend-fail-notexists": "$1 файлы юҡ.",
        "backend-fail-closetemp": "Ваҡытлы файлды ябып булмай.",
        "backend-fail-read": "«$1» файлын уҡып булмай.",
        "backend-fail-create": "«$1» файлын яҙып булмай.",
-       "backend-fail-maxsize": "$1 Ñ\84айлÑ\8bн Ñ\8fÒ\99Ñ\8bп Ð±Ñ\83лманÑ\8b, Ñ\81өнки Ñ\83нÑ\8bÒ£ ÐºÒ¯Ð»Ó\99ме {{PLURAL:$2|1=$2 Ð±Ð°Ð¹Ñ\82Ñ\82ан|$2 Ð±Ð°Ð¹Ñ\82Ñ\82ан}} ÐºÒ¯Ð¿.",
+       "backend-fail-maxsize": "$1 Ñ\84айлÑ\8bн Ñ\8fÒ\99Ñ\8bп Ð±Ñ\83лманÑ\8b, Ñ\81өнки Ñ\83нÑ\8bÒ£ ÐºÒ¯Ð»Ó\99ме {{PLURAL:$2|1=$2 Ð±Ð°Ð¹Ñ\82Ñ\82ан|$2 Ð±Ð°Ð¹Ñ\82Ñ\82ан}} Ð°Ñ\80Ñ\82Ñ\8bÒ¡.",
        "backend-fail-readonly": "$1 һаҡлағысы әлегә уҡыу өсөн генә асыҡ. Сәбәбе: $2",
        "backend-fail-synced": "$1 файлы эске һаҡлағыста ярашһыҙ хәлдә тора.",
        "backend-fail-connect": "\"$1\" һаҡлағысы менән бәйләнеш яһап булманы.",
        "licenses-edit": "Лицензия параметрҙарын үҙгәртергә",
        "license-nopreview": "(Ҡарап сығыу мөмкин түгел)",
        "upload_source_url": "(Дөрөҫ, дөйөм ҡулланыу өсөн асыҡ URL-адрес)",
-       "upload_source_file": "(һеҙҙең компьютерҙағы файл)",
+       "upload_source_file": "(һеҙ компьютерҙағы файлды һайланығыҙ)",
+       "listfiles-delete": "юйырға",
        "listfiles-summary": "Был ярҙамсы бит бөтә тейәлгән файлдарҙы күрһәтә.",
        "listfiles_search_for": "Файл исеме буйынса эҙләү:",
        "listfiles-userdoesnotexist": "\"$1\" иҫәп яҙмаһы теркәлмәгән.",
        "filerevert-legend": "Файлдың элекке өлгөһөнә ҡайтыу",
        "filerevert-intro": "Һеҙ '''[[Media:$1|$1]]''' файлын [$2 $3 булдырылған $4 өлгөһөнә] ҡайтараһығыҙ.",
        "filerevert-comment": "Сәбәп:",
-       "filerevert-defaultcomment": "$1 $2 өлгөһөнә ҡайтыу",
+       "filerevert-defaultcomment": "$1 $2 ($3) өлгөһөнә ҡайтыу",
        "filerevert-submit": "Кире алырға",
        "filerevert-success": "'''[[Media:$1|$1]]''' [$2 $3 булдырылған $4 өлгөһөнә] ҡайтарылды.",
        "filerevert-badversion": "Файлдың күрһәтелгән ваҡыт билдәһе менән алдағы урындағы өлгөһө юҡ.",
        "unwatchedpages": "Бер кем дә күҙәтмәгән биттәр",
        "listredirects": "Йүнәлтеүҙәр исемлеге",
        "listduplicatedfiles": "Күсермәләр менән файлдар исемлеге",
+       "listduplicatedfiles-entry": " [[:File:$1|$1]] файлының — [[$3|{{PLURAL:$2|$2 дубликаты}}]] бар.",
        "unusedtemplates": "Ҡулланылмаған ҡалыптар",
        "unusedtemplatestext": "Был биттә {{ns:template}} исемдәр арауығының бөтә башҡа биттәргә индерелмәгән биттәре исемлеге килтерелгән.\nҠалыпты юйыр алдынан, уға башҡа һылтанмалар юҡлығын тикшерергә онотмағыҙ.",
        "unusedtemplateswlh": "Башҡа һылтанмалар",
        "randomincategory-nopages": "[[:Category:$1|$1]] категорияһында биттәр юҡ.",
        "randomincategory-category": "Категория:",
        "randomincategory-legend": "Категорияла осраҡлы файл",
+       "randomincategory-submit": "Күсергә",
        "randomredirect": "Осраҡлы биткә күсеү",
        "randomredirect-nopages": "\"$1\" исемдәр арауығында йүнәлтеүҙәр юҡ.",
        "statistics": "Статистика",
        "wantedfiles": "Кәрәкле файлдар",
        "wantedfiletext-cat": "Киләһе файлдарҙы улар булмаған хәлдә ҡулланырға тырышыла. Тыш һаҡлағыстарҙа булған файлдар был исемлеккә яңылыш эләгеүе мөмкин. Бындай хаталы белдереүҙәр <del>һыҙыҡ</del> менән күрһәтеләсәк. Шулай уҡ, булмаған файлдарҙы алған биттәр киләһе исемлектә күрһәтелгән: [[:$1]]",
        "wantedfiletext-nocat": "Киләһе файлдарҙы улар булмаған хәлдә ҡулланырға тырышыла. Тыш һаҡлағыстарҙа булған файлдар был исемлеккә яңылыш эләгеүе мөмкин. Бындай хаталы белдереүҙәр <del>һыҙыҡ</del> менән күрһәтеләсәк.",
+       "wantedfiletext-nocat-noforeign": "Түбәндәге файл ҡулланыла, әммә ул юҡ.",
        "wantedtemplates": "Кәрәкле ҡалыптар",
        "mostlinked": "Иң күп һылтанма яһалған биттәр",
        "mostlinkedcategories": "Иң күп һылтанма яһалған категориялар",
-       "mostlinkedtemplates": "Ð\98Ò£ ÐºÒ¯Ð¿ Ò»Ñ\8bлÑ\82анма Ñ\8fһалÒ\93ан Ò¡Ð°Ð»Ñ\8bпÑ\82ар",
+       "mostlinkedtemplates": "Ð\98Ò£ ÐºÒ¯Ð¿ Ò¡Ñ\83лланÑ\8bлÒ\93ан Ð±Ð¸Ñ\82Ñ\82Ó\99р",
        "mostcategories": "Күп категорияларға кертелгән биттәр",
        "mostimages": "Иң күп һылтанма яһалған рәсемдәр",
        "mostinterwikis": "Иң күп интервики-һылтанмалы биттәр",
        "mostrevisions": "Иң күп үҙгәртеү яһалған биттәр",
        "prefixindex": "Исемдәре башында ҡушымта торған биттәр",
        "prefixindex-namespace": "Префикслы бар биттәр ( $1 исемдәр арауығы)",
+       "prefixindex-submit": "Күрһәтергә",
        "prefixindex-strip": "Һөҙөмтәләр исемлегендә префиксты йәшерергә",
        "shortpages": "Ҡыҫҡа биттәр",
        "longpages": "Оҙон биттәр",
        "protectedpages-performer": "Ҡатнашыусыны һаҡлау",
        "protectedpages-params": "Һаҡ параметрҙары",
        "protectedpages-reason": "Сәбәп",
+       "protectedpages-submit": "Биттәрҙе күрһәтеү",
        "protectedpages-unknown-timestamp": "Билдәһеҙ",
        "protectedpages-unknown-performer": "Билдәһеҙ ҡатнашыусы",
        "protectedtitles": "Тыйылған исемдәр",
        "protectedtitlesempty": "Әлеге ваҡытта күрһәтелгән шарттар менән һаҡланған исемдәр юҡ.",
+       "protectedtitles-submit": "Күренгән исем",
        "listusers": "Ҡатнашыусылар исемлеге",
        "listusers-editsonly": "Кәмендә бер үҙгәртеү индергән ҡатнашыусыларҙы ғына күрһәтергә",
        "listusers-creationsort": "Булдырыу көнө буйынса тәртипкә килтерергә",
        "listusers-desc": "Кәмеү буйынса айырырға",
-       "usereditcount": "$1 {{PLURAL:$1|үҙгәртеү}}",
+       "usereditcount": "{{PLURAL:$1|үҙгәртеү}}",
        "usercreated": "$3 ҡулланыусыһының теркәлеү ваҡыты: $1 $2",
        "newpages": "Яңы биттәр",
+       "newpages-submit": "Күрһәтергә",
        "newpages-username": "Ҡатнашыусы:",
        "ancientpages": "Иң иҫке мәҡәләләр",
        "move": "Яңы исем биреү",
        "notargettext": "Һеҙ был ғәмәл өсөн кәрәкле битте йәки ҡатнашыусыны күрһәтмәгәнһегеҙ.",
        "nopagetitle": "Бындай бит юҡ",
        "nopagetext": "Һеҙ күрһәткән бит юҡ.",
-       "pager-newer-n": "{{PLURAL:$1|1=1 яңыраҡ|$1 яңыраҡ}}",
+       "pager-newer-n": "$1{{PLURAL:$1|1=1 яңыраҡ|$1 яңыраҡ}}",
        "pager-older-n": "{{PLURAL:$1|1=1 иҫкерәк|$1 иҫкерәк}}",
        "suppress": "Йәшереү",
        "querypage-disabled": "Был махсус бит һөҙөмтәлелекте арттырыу өсөн ябылған.",
        "apihelp": "API белешмәһе",
        "apihelp-no-such-module": "«$1» модуле табылмаған.",
        "apisandbox": "API һынау урыны",
+       "apisandbox-jsonly": " API-һынап ҡарау урыны өсөн  JavaScript талап ителә.",
        "apisandbox-api-disabled": "Был сайтта API һүндерелгән.",
        "apisandbox-intro": "''MediaWiki API''' өйрәнеү бите.  API ҡулланыу тураһында белешмә алыу өсөн [//www.mediawiki.org/wiki/API:Main_page API документацияһы]на мөрәжәғәт итегеҙ. Мәҫәләң, [//www.mediawiki.org/wiki/API#A_simple_example Башбит эстәлеген нисек алырға]. Башҡа миҫалдарҙы күреү өсөн ғәмәлде ҡулланығыҙ.",
+       "apisandbox-fullscreen": "Панелды асырға",
+       "apisandbox-fullscreen-tooltip": "Браузер тәҙрәһен тултырыу өсөн һынап ҡарау панелен асырға.",
+       "apisandbox-unfullscreen": "Битте күрһәтергә",
+       "apisandbox-unfullscreen-tooltip": "MediaWiki навигация һылтанмалары күренһен өсөн һынап ҡарау панелен бәләкәйләтергә.",
        "apisandbox-submit": "Һоратыу яһарға",
        "apisandbox-reset": "Таҙарт",
-       "apisandbox-examples": "Миҫал",
+       "apisandbox-retry": "Ҡабатлау",
+       "apisandbox-loading": " API-модуле өсөн мәғлүмәт тейәү «$1»…",
+       "apisandbox-load-error": "API-модуле өсөн мәғлүмәт тейәгәндә хата китте «$1»: $2",
+       "apisandbox-no-parameters": "API-модуленең параметрҙары юҡ.",
+       "apisandbox-helpurls": "Белешмәгә һылтанма",
+       "apisandbox-examples": "Миҫалдар",
+       "apisandbox-dynamic-parameters": "Өҫтәмә параметрҙар",
+       "apisandbox-dynamic-parameters-add-label": "Параметр өҫтәргә",
+       "apisandbox-dynamic-parameters-add-placeholder": "Параметр исеме",
+       "apisandbox-dynamic-error-exists": " «$1» исемле параметр бар.",
+       "apisandbox-deprecated-parameters": "Иҫкергән параметрҙар",
+       "apisandbox-fetch-token": "Торенды автоматик тултырыу",
+       "apisandbox-submit-invalid-fields-title": "Ҡайһы бер ҡырҙыр дөрөҫ түгел",
+       "apisandbox-submit-invalid-fields-message": "Билдәләнгән ҡырҙырҙы тәҙәтегеҙ һәм яңынан эшләр ҡарағыҙ.",
        "apisandbox-results": "Һөҙөмтә",
+       "apisandbox-sending-request": "API-ғариза ебәреү",
+       "apisandbox-loading-results": "API-яуап алыу",
+       "apisandbox-results-error": " API-яуап алғанда хата китте: $1.",
        "apisandbox-request-url-label": "Һоратыуҙың URL-адресы:",
-       "apisandbox-request-time": "Мөрәжәғәт ваҡыты:$1",
+       "apisandbox-request-time": "Мөрәжәғәт ваҡыты:{{PLURAL:$1|$1 мс}}",
+       "apisandbox-results-fixtoken": "Токенды төҙөтегеҙ, ебәреүҙе ҡабатлағыҙ",
+       "apisandbox-results-fixtoken-fail": " «$1» токенына инеп булманы",
+       "apisandbox-alert-page": "Был биттә ҡайһы бер ҡырҙар дөрөҫ түгел.",
+       "apisandbox-alert-field": "Был ҡыр дәүмәле ярамай.",
        "booksources": "Китап сығанаҡтары",
        "booksources-search-legend": "Китап сығанаҡтарын эҙлә",
        "booksources-search": "Эҙләү",
        "booksources-text": "Түбәндәге исемлектә — китаптар һатыу менән шөғөлләнеүсе сайттарға һәм китапханаларҙың эҙләү системаларына һылтанмалар, һәм уларҙа һеҙ эҙләгән китаптар тураһында өҫтәмә мәғлүмәт булыуы мөмкин.",
        "booksources-invalid-isbn": "Күрһәтелгән ISBN номерҙа хата булырға тейеш. Зинһар, номерҙы сығанаҡтан дөрөҫ күсереүегеҙҙе тикшерегеҙ.",
        "specialloguserlabel": "Башҡарыусы:",
-       "speciallogtitlelabel": "Маҡсат (исем йәки ҡулланыусы):",
+       "speciallogtitlelabel": "Маҡсат (исем йәки ҡулланыусы {{ns:user}}):",
        "log": "Журналдар",
+       "logeventslist-submit": "Күрһәтергә",
        "all-logs-page": "Барлыҡ асыҡ журналдар",
        "alllogstext": "{{SITENAME}} проектының дөйөм яҙмалар журналы исемлеге. Һеҙ һөҙөмтәләрҙе журнал төрө буйынса, ҡатаншыусы исеме буйынса (ҙур/бәләкәй хәрефкә һиҙгер) йәки ҡағылған бит исеме буйынса (шулай уҡ ҙур/бәләкәй хәрефкә һиҙгер) һайлап ала алаһығыҙ.",
        "logempty": "Журнал яҙмаларында һайланған юлдар юҡ.",
        "log-title-wildcard": "Керетелгән хәрефтәр менән башланған исемдәрҙе табырға",
        "showhideselectedlogentries": "Журналдың һайланған яҙмаларын күрһәтергә/йәшерергә.",
+       "log-edit-tags": "Журналдағы яҙмала тэгты мөхәррирләргә",
+       "checkbox-select": "Һайланған: $1",
+       "checkbox-all": "Барыһы",
+       "checkbox-none": "Юҡ",
+       "checkbox-invert": "Әйләндерү",
        "allpages": "Бөтә биттәр",
        "nextpage": "Киләһе бит ($1)",
        "prevpage": "Алдағы бит ($1)",
        "cachedspecial-viewing-cached-ts": "Һеҙ биттең кэшланған өлгөһөн ҡарайһығыҙ. Уның хәҙерге өлгөнән бик ныҡ айырылыуы мөмкин.",
        "cachedspecial-refresh-now": "Һуңғы версияны ҡарарға",
        "categories": "Категориялар",
-       "categoriespagetext": "Түбәндәге {{PLURAL:$1|1=категорияла|категорияларҙа}} биттәр йәки файлдар бар.\n[[Special:UnusedCategories|Ҡулланылмаған категориялар]] бында күрһәтелмәгән.\nШулай уҡ [[Special:WantedCategories|кәрәкле категориялар исемлеген]] ҡарағыҙ.",
+       "categories-submit": "Күрһәтергә",
+       "categoriespagetext": "{{PLURAL:$1|1=Был категория}}ла биттәр һәм    медиа-файллардар бар.\nАҫта [[Special:UnusedCategories|ҡулланылмаған категориялар]] күһәтелмәгән.\nШулай уҡ  [[Special:WantedCategories|талап ителгән категориялар]] күһәтелгән.",
        "categoriesfrom": "Ошондай хәрефтәрҙән башланған категорияларҙы күрһәтергә:",
        "special-categories-sort-count": "күләме буйынса тәртипкә килтерергә",
        "special-categories-sort-abc": "алфавит буйынса тәртипкә килтерергә",
        "activeusers-hidebots": "Боттарҙы йәшерергә",
        "activeusers-hidesysops": "Хакимдәрҙе йәшерергә",
        "activeusers-noresult": "Ҡатнашыусылар табылманы",
+       "activeusers-submit": "Әүҙем ҡулланыусыларҙы күрһәтергә",
        "listgrouprights": "Ҡатнашыусылар төркөмө хоҡуҡтары",
        "listgrouprights-summary": "Түбәндә был вики-проектта билдәләнгән ҡатнашыусы төркөмдәре килтерелгән һәм уларҙың хоҡуҡтары күрһәтелгән.\nШәхси хоҡуҡтар тураһында [[{{MediaWiki:Listgrouprights-helppage}}|өҫтәмә мәғлүмәт]] булыуы мөмкин.",
        "listgrouprights-key": "Легенда:\n* <span class=\"listgrouprights-granted\">Бирелгән хоҡуҡтар</span>\n* <span class=\"listgrouprights-revoked\">Алынған хоҡуҡтар</span>",
        "listgrouprights-removegroup-self-all": "Үҙенең иҫәп яҙмаһынан бөтә төркөмдәрҙе юйыу",
        "listgrouprights-namespaceprotection-header": "Исемдәр арауығы сикләүҙәре",
        "listgrouprights-namespaceprotection-namespace": "Исемдәр арауығы",
+       "listgrouprights-namespaceprotection-restrictedto": "Ҡулланыусы мәхәррирләй мөкинлеген биргән хоҡуҡтар",
+       "listgrants": "Рөхсәттәр",
+       "listgrants-grant": "Рөхсәт",
+       "listgrants-rights": "Хоҡуҡтар",
+       "trackingcategories": "Категорияларҙы күҙәтеү",
        "trackingcategories-name": "Хәбәр исеме",
        "mailnologin": "Хат ебәреү өсөн адрес юҡ",
        "mailnologintext": "Башҡа ҡатнашыусыларға хат ебәреү өсөн, һеҙ [[Special:UserLogin|танылырға]] һәм [[Special:Preferences|көйләүҙәрегеҙҙә]] ысын электрон адрес почтаһы кереткән булырға тейешһегеҙ.",
index 4b3829c..943b13f 100644 (file)
        "recentchanges-label-bot": "ائ ویرایش گون یک رباتء کتن بیتگ",
        "recentchanges-label-unpatrolled": "این ویرایش اناگتء گشت‌زنی نه بیتگ",
        "recentchanges-label-plusminus": "تاکء سایز همگرنچ گون ائ بایت انی انداجگ ٹگل وارتگ انت",
-       "recentchanges-legend-heading": "'''اختصاران:'''",
+       "recentchanges-legend-heading": "<strong>اختصاران:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (هنچوش پر [[Special:NewPages|نوکین تاکانء فهرست]] بچار ات)",
        "rcnotefrom": "بی جهلگا ٹگلان شه <strong>$3, $4</strong> (تا <strong>$1</strong> {{PLURAL:$5|نشان داته بوته انت|نشان داته بوته انت}}).",
        "rclistfrom": "پیش دار نوکین تغییراتآ چه $3 $2",
index 4254ee4..99c880f 100644 (file)
        "recentchanges-label-bot": "Ining pagliwat pinaghimo bilang sarong bot",
        "recentchanges-label-unpatrolled": "Ining pagliwat dae pa tabi pinagpatrolyahan",
        "recentchanges-label-plusminus": "An kadakulaan nin pahina pinagliwat sa paagi kaining numero nin mga bayta",
-       "recentchanges-legend-heading": "'''Kabalaynan:'''",
+       "recentchanges-legend-heading": "<strong>Kabalaynan:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (hilngon man [[Special:NewPages|listahan kan mga baguhong pahina]])",
        "recentchanges-legend-plusminus": "(''±saro-duwa-tolo'')",
        "rcnotefrom": "Sa ibaba iyo an mga kaliwatan poon kan '''$2''' (sagkod sa '''$1''' na ipinapahiling).",
index 356080e..9c35d9c 100644 (file)
        "moredotdotdot": "Далей…",
        "morenotlisted": "Гэта ня поўны сьпіс.",
        "mypage": "Старонка",
+       "anonuserpage": "Невядомы ўдзельнік",
        "mytalk": "Гутаркі",
        "anontalk": "Гутаркі",
        "navigation": "Навігацыя",
        "nocookieslogin": "{{SITENAME}} выкарыстоўвае файлы-кукі для ўваходу ў сыстэму.\nУ Вашым браўзэры файлы-кукі адключаныя.\nКалі ласка, уключыце іх і паспрабуйце яшчэ раз.",
        "nocookiesfornew": "Рахунак удзельніка ня быў створаны, таму што мы не змаглі пацьвердзіць яго крыніцу. \nУпэўніцеся, што ў Вас уключаныя файлы-кукі, перазагрузіце гэтую старонку і паспрабуйце зноў.",
        "noname": "Вы пазначылі няслушнае імя ўдзельніка.",
-       "loginsuccesstitle": "Ð\9fаÑ\81Ñ\8cпÑ\8fÑ\85овÑ\8b Ñ\9eваÑ\85од Ñ\83 сыстэму",
+       "loginsuccesstitle": "УвайÑ\88лÑ\96 Ñ\9e сыстэму",
        "loginsuccess": "<strong>Цяпер Вы ўвайшлі ў {{GRAMMAR:вінавальны|{{SITENAME}}}} як «$1».</strong>",
        "nosuchuser": "Удзельніка «$1» не існуе.\nВялікія і малыя літары адрозьніваюцца ў імёнах удзельнікаў.\nПраверце напісаньне альбо [[Special:UserLogin/signup|стварыце новы рахунак]].",
        "nosuchusershort": "Удзельніка зь іменем «$1» не існуе. Праверце напісаньне.",
        "createaccount-title": "Стварэньне рахунку ў {{GRAMMAR:месны|{{SITENAME}}}}",
        "createaccount-text": "Нехта стварыў рахунак «$2» у {{GRAMMAR:месны|{{SITENAME}}}} ($4) для Вашага адрасу электроннай пошты. Пароль для гэтага рахунку — «$3». Вам трэба ўвайсьці і зьмяніць Ваш пароль зараз.\n\nВы можаце праігнараваць гэты ліст, калі гэты рахунак быў створаны памылкова.",
        "login-throttled": "Вы зрабілі надта шмат спробаў уваходу ў сыстэму.\nКалі ласка, пачакайце $1 перад тым як паспрабаваць ізноў.",
-       "login-abort-generic": "Не атрымалася ўвайсьці ў сыстэму, скасавана",
+       "login-abort-generic": "Не атрымалася ўвайсьці ў сыстэму — спынена",
        "login-migrated-generic": "Ваш рахунак быў перанесены і вашае імя ўдзельніка больш не існуе ў гэтай вікі.",
        "loginlanguagelabel": "Мова: $1",
        "suspicious-userlogout": "Ваш запыт на выхад з сыстэмы быў адхілены, таму што выглядае, што ён быў дасланы пашкоджаным браўзэрам альбо кэшаваным проксі-сэрвэрам.",
        "newpassword": "Новы пароль:",
        "retypenew": "Паўтарыце новы пароль:",
        "resetpass_submit": "Захаваць пароль і ўвайсьці",
-       "changepassword-success": "Ð\92аÑ\88 Ð¿Ð°Ñ\80олÑ\8c Ð±Ñ\8bÑ\9e Ð¿Ð°Ñ\81Ñ\8cпÑ\8fÑ\85ова Ð·Ñ\8cмененÑ\8b!",
+       "changepassword-success": "Ваш пароль быў зьменены!",
        "changepassword-throttled": "Вы зрабілі зашмат спробаў увайсьці ў сыстэму.\nКалі ласка, пачакайце $1 перад наступнай спробай.",
        "botpasswords": "Паролі робатаў",
        "botpasswords-summary": "<em>Паролі робатаў</em> дазваляюць доступ да рахунку ўдзельніка праз API без выкарыстаньня лагіну і паролю асноўнага рахунку. Правы ўдзельніка пры выкарыстаньні паролю робата могуць быць абмежаваныя.\n\nКалі вы ня ведаеце, навошта вам гэта, мабыць, не рабіце гэтага. Ніхто не павінен прасіць вас згенэраваць такі пароль і перадаць гэты пароль яму.",
        "botpasswords-insert-failed": "Не атрымалася дадаць робата зь імем «$1». Магчыма, ён ужо быў дададзены?",
        "botpasswords-update-failed": "Не атрымалася абнавіць робата зь імем «$1». Магчыма, ён быў выдалены?",
        "botpasswords-created-title": "Пароль робата створаны",
-       "botpasswords-created-body": "Пароль робата «$1» быў пасьпяхова створаны.",
+       "botpasswords-created-body": "Пароль робата для робата з назвай «$1» удзельніка «$2» быў створаны.",
        "botpasswords-updated-title": "Пароль робата абноўлены",
-       "botpasswords-updated-body": "Пароль робата «$1» быў пасьпяхова абноўлены.",
+       "botpasswords-updated-body": "Пароль робата для робата «$1» удзельніка «$2» быў абноўлены.",
        "botpasswords-deleted-title": "Пароль робата выдалены",
-       "botpasswords-deleted-body": "Пароль робата «$1» быў выдалены.",
+       "botpasswords-deleted-body": "Пароль робата для робата «$1» удзельніка «$2» быў выдалены.",
        "botpasswords-newpassword": "Новы пароль для ўваходу пад <strong>$1</strong> — <strong>$2</strong>. <em>Калі ласка, запішыце яго для далейшага выкарыстаньня.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider недаступны.",
        "botpasswords-restriction-failed": "Уваход ня выкананы праз абмежаваньні на пароль робата",
index f2a978e..16325d3 100644 (file)
        "moredotdotdot": "Яшчэ...",
        "morenotlisted": "Гэты спіс не поўны.",
        "mypage": "Старонка",
+       "anonuserpage": "Нявызначаны ўдзельнік",
        "mytalk": "Размовы",
        "anontalk": "Размовы",
        "navigation": "Навігацыя",
        "title-invalid-interwiki": "Запытаны загаловак зьмяшчае інтэрвікі-спасылку, якую нельга ўжываць у назвах.",
        "title-invalid-talk-namespace": "Запытаная назва старонкі адпавядае старонцы размоў, якая не можа існаваць.",
        "title-invalid-characters": "Запытаная назва старонкі ўтрымлівае недапушчальныя сімвалы: \"$1\".",
+       "title-invalid-relative": "Назва ўтрымлівае адносны шлях. Адносныя назвы старонак (./, ../) недапушчальныя, паколькі яны часта недасяжныя падчас апрацоўкі карыстальніцкім браўзерам.",
        "title-invalid-magic-tilde": "Запытаная назва старонкі ўтрымлівае недапушчальную паслядоўнасць тыльдаў (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "Запытаная назва старонкі занадта доўгая. Яна павінна быць не даўжэй за $1 {{PLURAL:$1|байт|байты|байтаў}} у кадаванні UTF-8.",
        "title-invalid-leading-colon": "Запытаная назва старонкі ўтрымлівае недапушчальнае двухкроп'е ў пачатку.",
        "changepassword-success": "Ваш пароль паспяхова зменены!",
        "changepassword-throttled": "Занадта многа нядаўніх спроб увайсці пад гэтым уліковым запісам. \nПачакайце $1 перад тым, як спрабаваць ізноў.",
        "botpasswords": "Паролі робатаў",
+       "botpasswords-summary": "<em>Паролі робатаў</em> дазваляюць доступ да ўліковага запісу ўдзельніка праз API без выкарыстання звестак асноўнага акаунта. Дазволы ўдзельніка пры выкарыстанні пароля робата могуць быць абмежаваныя.\n\nКалі вы не ведаеце, навошта гэта вам, хутчэй за ўсё, вам гэта не трэба. Ніхто не павінен прасіць вас стварыць такі пароль і перадаць гэты пароль яму.",
+       "botpasswords-disabled": "Паролі робатаў адключаны.",
+       "botpasswords-no-central-id": "Каб выкарыстоўваць паролі робатаў, вы павінны ўвайсці ў сістэму з цэнтралізаваным уліковым запісам.",
+       "botpasswords-existing": "Наяўныя паролі робатаў",
+       "botpasswords-createnew": "Стварыць новы пароль робата",
+       "botpasswords-editexisting": "Рэдагаваць наяўны пароль робата",
+       "botpasswords-label-appid": "Назва робата:",
+       "botpasswords-label-create": "Стварыць",
+       "botpasswords-label-update": "Абнавіць",
+       "botpasswords-label-cancel": "Скасаваць",
+       "botpasswords-label-delete": "Сцерці",
+       "botpasswords-label-resetpassword": "Скінуць пароль",
+       "botpasswords-label-grants": "Прыдатныя дазволы:",
+       "botpasswords-help-grants": "Кожны дазвол дае доступ да правоў удзельніка, якія ўжо прызначаны ўліковаму запісу удзельніка. Глядзіце [[Special:ListGrants|табліцу дазволаў]] для атрымання дадатковых зьвестак.",
+       "botpasswords-label-restrictions": "Абмежаванні на выкарыстанне:",
+       "botpasswords-label-grants-column": "Дазволена",
+       "botpasswords-bad-appid": "Назва робата \"$1\" недапушчальная.",
+       "botpasswords-insert-failed": "Не ўдалося дадаць робату назву \"$1\". Магчыма, яна ўжо дададзена?",
+       "botpasswords-update-failed": "Не ўдалося змяніць робату назву \"$1\". Можа, яна сцёртая?",
+       "botpasswords-created-title": "Пароль робата створаны",
+       "botpasswords-created-body": "Пароль для робата \"$1\" удзельніка \"$2\" паспяхова створаны.",
+       "botpasswords-updated-title": "Пароль робата абноўлены",
+       "botpasswords-updated-body": "Пароль для робата \"$1\" удзельніка \"$2\" паспяхова абноўлены.",
+       "botpasswords-deleted-title": "Пароль робата сцёрты",
+       "botpasswords-deleted-body": "Пароль для робата \"$1\" удзельніка \"$2\" паспяхова сцёрты.",
+       "botpasswords-newpassword": "Новы пароль для ўваходу пад <strong>$1</strong> — <strong>$2</strong>. <em>Калі ласка, запішыце яго для выкарыстання ў будучыні.</em>",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider недаступны.",
+       "botpasswords-restriction-failed": "Уваход не выкананы з-за абмежаванняў на пароль робата.",
+       "botpasswords-invalid-name": "Паказанае імя ўдзельніка не ўтрымлівае падзяляльнік паролю робата (\"$1\").",
+       "botpasswords-not-exist": "Удзельнік \"$1\" не мае паролю для робата з назвай \"$2\".",
        "resetpass_forbidden": "Не дазволена мяняць паролі",
        "resetpass-no-info": "Трэба ўвайсці ў сістэму, каб звяртацца да гэтай старонкі наўпрост.",
        "resetpass-submit-loggedin": "Змяніць пароль",
        "anoneditwarning": "<strong>Увага!</strong> Вы не аўтарызаваліся на сайце. Ваш IP-адрас будзе публічна бачным, калі вы будзеце ўносіць любыя праўкі. Калі вы <strong>[$1 ўвойдзеце]</strong> ці <strong>[$2 створыце ўліковы запіс]</strong>, праўкі замест гэтага будуць звязаны з вашым імем карыстальніка, а таксама ў вас з'явяцца іншыя перавагі.",
        "anonpreviewwarning": "''Вы не прайшлі ідэнтыфікацыю Захаванне будзе запісана з вашым IP адрасам у гісторыі правак гэтай старонкі.''",
        "missingsummary": "<strong>Нагадваем:</strong> вы не ўпісалі тлумачэння для сваёй праўкі. Калі націснуць \"{{int:savearticle}}\" яшчэ раз, праўка будзе замацавана без тлумачэння.",
+       "selfredirect": "<strong>Увага:</strong> Вы перанакіроўваеце старонку на самую сябе.\nМагчыма, вы ўказалі няправільную мэту перанакіравання, ці правіце не тую старонку.\nКалі націсніце \"{{int:savearticle}}\" ізноў, перанакіраванне ўсё ж будзе створана.",
        "missingcommenttext": "Калі ласка, увядзіце ніжэй каментарый.",
        "missingcommentheader": "'''Напамінанне:''' вы нічога не ўпісалі ў тэму/загаловак гэтай заўвагі.\nПры паўторным націсканні кнопкі '{{int:savearticle}}' ваша праўка будзе запісана з пустым загалоўкам.",
        "summary-preview": "Перадпаказ апісання:",
        "subject-preview": "Перадпаказ тэмы/загалоўка:",
+       "previewerrortext": "Здарылася памылка пры спробе папярэдняга прагляду вашых змяненняў.",
        "blockedtitle": "Удзельнік заблакаваны",
        "blockedtext": "'''Ваша імя ўдзельніка або адрас IP былі пастаўлены пад блок.'''\n\nБлок быў пастаўлены ўдзельнікам: $1. Пададзеная прычына: ''$2''.\n\n* Блок пастаўлены: $8\n* Блок канчаецца: $6\n* Атрымальнік блока: $7\n\nВы можаце звярнуцца да $1 або да аднаго з іншых [[{{MediaWiki:Grouppage-sysop}}|адміністратараў]], каб паразмаўляць пра гэты блок.\nВы не зможаце дзеля гэтага карыстацца функцыяй ''{{:{{ns:mediawiki}}:emailuser/be}}'', калі гэта вам забаронена, або калі вы не наставілі правільнага пацверджанага адрасу эл.пошты ў сваіх [[Special:Preferences|настаўленнях]].\nВаш адрас IP: $3, нумар блоку: #$5. Падавайце ўсе гэтыя звесткі ў кожным сваім звароце адносна гэтага блоку.",
        "autoblockedtext": "Ваш адрас IP быў аўтаматычна заблакаваны, таму што ім карыстаўся ўдзельнік, заблакаваны адміністратарам $1.\nПададзеная прычына блоку:\n\n:''$2''\n\n* Блок пастаўлены: $8\n* Блок канчаецца: $6\n* Атрымальнік блоку: $7\n\nВы можаце звярнуцца да $1 або да аднаго з іншых [[{{MediaWiki:Grouppage-sysop}}|адміністратараў]], каб паразмаўляць пра гэты блок.\n\nВы не зможаце дзеля гэтага карыстацца функцыяй ''{{:{{ns:mediawiki}}:emailuser/be}}'', калі гэта вам забаронена, або калі вы не наставілі правільнага пацверджанага адрасу эл.пошты ў сваіх [[Special:Preferences|настаўленнях]].\n\nВаш адрас IP: $3. Ваш нумар блоку: $5. Падавайце ўсе гэтыя звесткі ў кожным сваім звароце адносна гэтага блоку.",
        "previewnote": "<strong>Памятайце, гэта толькі папярэдні паказ.</strong> Праўкі яшчэ не замацаваныя!",
        "continue-editing": "Працягнуць рэдагаванне",
        "previewconflict": "Гэта папярэдні паказ магчымага выніку замацоўвання актуальнага стану крынічнага тэксту ў верхнім тэкставым полі.",
-       "session_fail_preview": "'''Не ўдалося апрацаваць вашу праўку, таму што сервер згубіў звесткі аб вашым сеансе.\nПаспрабуйце, калі ласка, ізноў.\nКалі і тады не атрымаецца, паспрабуйце [[Special:UserLogout|выйсці з сістэмы]] і зайсці ізноў.'''",
-       "session_fail_preview_html": "'''Не ўдалося апрацаваць вашу праўку з-за таго, што згубіліся даныя аб сеансе.'''\n\n''Перадпаказ не зроблены, бо на пляцоўцы {{SITENAME}} дазволены сыры код HTML, што робіць магчымымі атакі праз Яваскрыпт.''\n\n'''Калі гэта нармальная спроба праўкі, паспрабуйце паўтарыць запісванне. Калі і гэта не дапаможа, паспрабуйце [[Special:UserLogout|выйсці з сістэмы]] і ўвайсці ізноў.'''",
+       "session_fail_preview": "Не ўдалося апрацаваць вашу праўку, таму што сервер згубіў звесткі аб вашым сеансе.\n\nМагчыма, вы выйшлі з сістэмы. <strong>Калі ласка, праверце, што вы ўвайшлі ў сістэму і паспрабуйце яшчэ раз.</strong>\nКалі і тады не атрымаецца, паспрабуйце [[Special:UserLogout|выйсці з сістэмы]] і зайсці ізноў, таксама праверце, што ваш браўзер дазваляе кукі з гэтага сайта.",
+       "session_fail_preview_html": "Не ўдалося апрацаваць вашу праўку з-за таго, што згубіліся даныя аб сеансе.\n\n<em>Перадпаказ не зроблены, бо на пляцоўцы {{SITENAME}} дазволены сыры код HTML, што робіць магчымымі атакі праз Яваскрыпт.</em>\n\n<strong>Калі гэта нармальная спроба праўкі, паспрабуйце паўтарыць запісванне.</strong>\nКалі і гэта не дапаможа, паспрабуйце [[Special:UserLogout|выйсці з сістэмы]] і ўвайсці ізноў, таксама праверце, што ваш браўзер дазваляе кукі з гэтага сайта.",
        "token_suffix_mismatch": "'''Ваша праўка была адхілена, каб пазбегнуць сапсавання тэксту старонкі, таму што ваш браўзер папсаваў знакі прыпынку ў квітку праўкі.\nМагчыма, прычына ў выкарыстанні вамі ананімнага проксі-сервера, праграмы якога працуюць некарэктна.'''",
        "edit_form_incomplete": "'''Некаторыя часткі формы рэдагавання не дасягнулі сервера. Упэўніцеся, што Вашыя рэдагаванні не пашкоджаныя і паспрабуйце зноў.'''",
        "editing": "Правім $1",
        "yourdiff": "Адрозненні",
        "copyrightwarning": "Заўважце, што ўсе ўклады на {{SITENAME}} лічацца выданымі на ўмовах $2 (бач падрабязнасці на $1). Калі вы не жадаеце, каб вашыя матэрыялы бязлітасна правіліся, і свабодна распаўсюджваліся, то і не аддавайце іх сюды.<br />\nТаксама вы нам абяцаеце, што напісалі гэта самі, або скапіравалі з рэсурсу, які знаходзіцца ў публічнай уласнасці, або з аналагічнага свабоднага рэсурсу.\n'''НЕ КЛАДЗІЦЕ СЮДЫ, БЕЗ АДПАВЕДНАГА ДАЗВОЛУ, МАТЭРЫЯЛУ, ЯКІ АХОЎВАЕЦЦА АЎТАРСКІМ ПРАВАМ!'''",
        "copyrightwarning2": "Заўважце, што кожны ўклад на {{SITENAME}} можа быць папраўлены, зменены або выдалены іншымі ўдзельнікамі. Калі вы не жадаеце, каб вашыя матэрыялы бязлітасна правіліся, то і не давайце іх сюды.<br />\nТаксама вы нам абяцаеце, што напісалі гэта самі, або скапіравалі з рэсурсу, які знаходзіцца ў публічнай уласнасці, або з аналагічнага свабоднага рэсурсу (бач падрабязнасці на $1).\n'''НЕ КЛАДЗІЦЕ СЮДЫ, БЕЗ АДПАВЕДНАГА ДАЗВОЛУ, МАТЭРЫЯЛУ, ЯКІ АХОЎВАЕЦЦА АЎТАРСКІМ ПРАВАМ!'''",
+       "editpage-cannot-use-custom-model": "Мадэль зместу гэтай старонкі не можа быць зменена.",
        "longpageerror": "'''Памылка: Аб’ём тэксту, які Вы спрабуеце запісаць складае $1 {{PLURAL:$1|кілабайт|кілабайты|кілабайтаў}}, што болей устаноўленага абмежавання на $2 {{PLURAL:$2|кілабайт|кілабайты|кілабайтаў}}.'''\nСтаронка не можа быць захаваная.",
-       "readonlywarning": "<strong>Увага: Ð·Ð°Ñ\80аз Ð²Ñ\8b Ð½Ðµ Ð¼Ð¾Ð¶Ð°Ñ\86е Ð·Ð°Ð¿Ñ\96Ñ\81аÑ\86Ñ\8c Ñ\81вае Ð¿Ñ\80аÑ\9eкÑ\96, Ñ\82амÑ\83 Ñ\88Ñ\82о Ð±Ð°Ð·Ð° Ð·Ð²ÐµÑ\81Ñ\82ак Ð·Ð°Ñ\87Ñ\8bнена Ð½Ð° Ð°Ð±Ñ\81лÑ\83гоÑ\9eванне.</strong>\nÐ\9cагÑ\87Ñ\8bма, Ð²Ð°Ñ\80Ñ\82а Ð¿ÐµÑ\80анеÑ\81Ñ\86Ñ\96 Ð²Ð°Ñ\88 Ñ\82Ñ\8dкÑ\81Ñ\82 Ñ\83 Ð°Ñ\81обнÑ\8b Ñ\84айл Ñ\96 Ð·Ð°Ð¿Ñ\96Ñ\81аÑ\86Ñ\8c Ð½Ð° Ð¿Ð¾Ñ\82Ñ\8bм.\n\nÐ\90дміністратар, які зачыніў базу, растлумачыў гэта так: $1",
+       "readonlywarning": "<strong>Увага: Ð·Ð°Ñ\80аз Ð²Ñ\8b Ð½Ðµ Ð¼Ð¾Ð¶Ð°Ñ\86е Ð·Ð°Ð¿Ñ\96Ñ\81аÑ\86Ñ\8c Ñ\81вае Ð¿Ñ\80аÑ\9eкÑ\96, Ñ\82амÑ\83 Ñ\88Ñ\82о Ð±Ð°Ð·Ð° Ð·Ð²ÐµÑ\81Ñ\82ак Ð·Ð°Ñ\87Ñ\8bнена Ð½Ð° Ð°Ð±Ñ\81лÑ\83гоÑ\9eванне.</strong>\nÐ\9cагÑ\87Ñ\8bма, Ð²Ð°Ñ\80Ñ\82а Ð¿ÐµÑ\80анеÑ\81Ñ\86Ñ\96 Ð²Ð°Ñ\88 Ñ\82Ñ\8dкÑ\81Ñ\82 Ñ\83 Ð°Ñ\81обнÑ\8b Ñ\84айл Ñ\96 Ð·Ð°Ð¿Ñ\96Ñ\81аÑ\86Ñ\8c Ð½Ð° Ð¿Ð¾Ñ\82Ñ\8bм.\n\nСÑ\96Ñ\81Ñ\82Ñ\8dмнÑ\8b Ð°дміністратар, які зачыніў базу, растлумачыў гэта так: $1",
        "protectedpagewarning": "'''УВАГА: старонка пастаўлена пад ахову, таму яе могуць правіць толькі адміністратары.'''\nНіжэй паказаны апошні запіс з адпаведнага журнала:",
        "semiprotectedpagewarning": "'''Увага:''' старонка пастаўлена пад ахову, таму яе могуць правіць толькі зарэгістраваныя ўдзельнікі («паў-ахова»). Ніжэй паказаны апошні запіс з адпаведнага журнала:",
-       "cascadeprotectedwarning": "'''Увага:''' гэтая старонка ахоўваецца, таму яе могуць правіць толькі ўдзельнікі з правамі адміністратара. Прычына аховы: улучэнне гэтай старонкі ў {{PLURAL:$1|старонку, якая стаіць|старонкі, якія стаяць}} пад каскаднай аховай:",
+       "cascadeprotectedwarning": "<strong>Увага:</strong> гэтая старонка ахоўваецца, таму яе могуць правіць толькі ўдзельнікі з правамі адміністратара. Прычына аховы: улучэнне гэтай старонкі ў {{PLURAL:$1|старонку, якая стаіць|старонкі, якія стаяць}} пад каскаднай аховай:",
        "titleprotectedwarning": "'''УВАГА: старонка пастаўлена пад ахову, таму яе могуць ствараць толькі ўдзельнікі з [[Special:ListGroupRights|адмысловымі правамі]].'''\nНіжэй паказаны апошні запіс з адпаведнага журнала:",
        "templatesused": "Шабло{{PLURAL:$1|н|ны}} на гэтай старонцы:",
        "templatesusedpreview": "Шабло{{PLURAL:$1|н у|ны ў}} гэтым перадпаказе:",
        "permissionserrors": "Памылка доступу",
        "permissionserrorstext": "Вам не дазволена гэтага рабіць, з наступн{{PLURAL:$1|ай прычыны|ых прычын}}:",
        "permissionserrorstext-withaction": "Вам не дазволена $2, з-за наступ{{PLURAL:$1|най прычыны|ных прычын}}:",
+       "contentmodelediterror": "Вы не можаце правіць гэту версію, таму што яе мадэль зместу — <code>$1</code>, што адрозніваецца ад цяперашняй мадэлі зместу старонкі, <code>$2</code>.",
        "recreate-moveddeleted-warn": "<strong>Увага: Вы аднаўляеце старонку, якая раней была сцёрта.</strong>\n\nТрэба падумаць, ці варта далей працаваць з гэтай старонкай.\nВось журнал сціранняў і пераносаў для гэтай старонкі:",
        "moveddeleted-notice": "Гэтая старонка была сцёртая.\nНіжэй паказаны журнал сціранняў і пераносаў для гэтай старонкі.",
+       "moveddeleted-notice-recent": "Выбачайце, гэта старонка была нядаўна сцёрта (цягам апошніх 24 гадзін).\nЖурналы сціранняў і пераносаў для гэтай старонкі пададзены ніжэй для даведкі.",
        "log-fulllog": "Паглядзець поўны лог",
        "edit-hook-aborted": "Праўка спынена хукам (hook).\nТлумачэнняў не было.",
        "edit-gone-missing": "Не ўдалося абнавіць старонку.\nЗдаецца, што яна была сцёртая.",
        "content-model-text": "звычайны тэкст",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Пусты аб'ект",
+       "content-json-empty-array": "Пусты масіў",
+       "duplicate-args-warning": "<strong>Увага:</strong> [[:$1]] выклікае [[:$2]] з больш чым адным значэннем для параметра \"$3\". Толькі апошняе з пададзеных значэнняў будзе ўжытае.",
+       "duplicate-args-category": "Старонкі, якія выкарыстоўваюць задубляваныя параметры ў шаблонах",
+       "duplicate-args-category-desc": "Старонка ўтрымлівае шаблоны з задубляванымі параметрамі, напрыклад, <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> або <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Увага: На старонцы занадта шмат працаёмістых зваротаў да парсера.\n\nТрэба, каб зваротаў было меней за $2, а зараз ёсць $1.<!--In this particular lingual case, there's no need for plurals at all, so let's make checker happy by adding commented out {{PLURAL:$2|call|calls}} and {{PLURAL:$1|is now $1 call|are now $1 calls}}-->",
        "expensive-parserfunction-category": "Старонкі, дзе шмат працаёмістых зваротаў да парсера",
        "post-expand-template-inclusion-warning": "Увага: аб'ём улучанага шаблона занадта вялікі.\nНекаторыя шаблоны не будуць улучаныя.",
        "history-feed-description": "Гісторыя версій гэтай старонкі",
        "history-feed-item-nocomment": "$1 на $2",
        "history-feed-empty": "Не знойдзена такая старонка.\nМагчыма, яна была сцёртая або названая іначай.\nПаспрабуйце [[Special:Search|пашукаць яе на гэтай Вікі]] сярод новых старонак.",
+       "history-edit-tags": "Правіць біркі абраных версій",
        "rev-deleted-comment": "(выдаленае кароткае апісанне змен)",
        "rev-deleted-user": "(удзельнік выдалены)",
        "rev-deleted-event": "(падрабязнасці з журнала сцёртыя)",
        "revdelete-legend": "Настроіць абмежаванні бачнасці",
        "revdelete-hide-text": "Тэкст версіі",
        "revdelete-hide-image": "Схаваць змест файла",
-       "revdelete-hide-name": "Ð\9dе Ð¿Ð°ÐºÐ°Ð·Ð²Ð°Ñ\86Ñ\8c Ð´Ð·ÐµÑ\8fннÑ\8f Ñ\96 Ð¼Ñ\8dÑ\82ы",
+       "revdelete-hide-name": "Ð\9dе Ð¿Ð°ÐºÐ°Ð·Ð²Ð°Ñ\86Ñ\8c Ð¼Ñ\8dÑ\82Ñ\83 Ñ\96 Ð¿Ð°Ñ\80амеÑ\82Ñ\80ы",
        "revdelete-hide-comment": "Тлумачэнне праўкі",
        "revdelete-hide-user": "Імя ўдзельніка /адрас IP",
        "revdelete-hide-restricted": "Таксама абмяжоўваць такім чынам адміністратараў",
        "revdelete-submit": "Прымяніць да азначан{{PLURAL:$1|ай ерсіі|ых версій}}",
        "revdelete-success": "Паспяхова абноўлена бачнасць версіі.",
        "revdelete-failure": "'''Не ўдалося абнавіць бачнасць версіі:'''\n$1",
-       "logdelete-success": "'''Бачнасць падзеі настаўленая паспяхова.'''",
+       "logdelete-success": "Бачнасць падзеі настаўленая паспяхова.",
        "logdelete-failure": "'''Бачнасць журнала не ўсталявана:'''\n$1",
        "revdel-restore": "памяняць бачнасць",
        "pagehist": "Гісторыя старонкі",
        "mergehistory-empty": "Няма версій, якія можна аб'яднаць.",
        "mergehistory-done": "$3 {{PLURAL:$3|версія|версій}} $1 паспяхова аб'яднаныя ў склад [[:$2]].",
        "mergehistory-fail": "Немагчыма аб'яднаць гісторыі, праверце зададзеныя назву і час.",
+       "mergehistory-fail-bad-timestamp": "Недапушчальная пазнака часу.",
+       "mergehistory-fail-invalid-source": "Недапушчальная старонка-крыніца.",
+       "mergehistory-fail-invalid-dest": "Недапушчальная старонка-мэта.",
+       "mergehistory-fail-no-change": "Пры аб'яднанні гісторыі ніводная версія не была аб'яднана. Калі ласка, праверце параметры старонкі і часу.",
+       "mergehistory-fail-permission": "Недастаткова правоў для аб'яднання гісторыі.",
+       "mergehistory-fail-self-merge": "Крынічная старонка і старонка-прызначэнне супадаюць.",
+       "mergehistory-fail-timestamps-overlap": "Крынічныя версіі перакрываюць або ідуць пасля версій прызначэння.",
        "mergehistory-fail-toobig": "Немагчыма аб'яднаць гісторыі правак, бо для гэтага трэба перанесці больш за ліміт у $1 {{PLURAL:$1|версію|версіі|версій}}.",
        "mergehistory-no-source": "Не існуе крынічная старонка $1.",
        "mergehistory-no-destination": "Не існуе мэтавая старонка $1.",
        "notextmatches": "Нічога не знойдзена ў тэкстах старонак",
        "prevn": "папярэдн. {{PLURAL:$1|$1}}",
        "nextn": "наступ. {{PLURAL:$1|$1}}",
+       "prev-page": "папярэдняя старонка",
+       "next-page": "наступная старонка",
        "prevn-title": "Папярэдні{{PLURAL:$1| вынік|я $1 вынікі(аў)}}",
        "nextn-title": "Наступны{{PLURAL:$1| вынік|я $1 вынікі(аў)}}",
        "shown-title": "Паказваць $1 {{PLURAL:$1|вынік|вынікі(аў)}} на старонку",
        "search-result-category-size": "{{PLURAL:$1|$1 элемент|$1 элемента|$1 элементаў}} ({{PLURAL:$2|$2 падкатэгорыя|$2 падкатэгорыі|$2 падкатэгорый}}, {{PLURAL:$3|$3 файл|$3 файла|$3 файлаў}})",
        "search-redirect": "(перасылка $1)",
        "search-section": "(падраздзел $1)",
+       "search-category": "(катэгорыя $1)",
        "search-file-match": "(адпавядае змесціву файла)",
        "search-suggest": "Ці хацелі вы сказаць: $1",
+       "search-rewritten": "Паказаны вынікі для $1. Замест гэтага шукаць $2.",
        "search-interwiki-caption": "Сумежныя праекты",
        "search-interwiki-default": "Вынікі з $1:",
        "search-interwiki-more": "(яшчэ)",
        "showingresultsinrange": "Ніжэй паказаны да {{PLURAL:$1|<strong>1</strong> выніку|<strong>$1</strong> вынікаў}} у дыяпазоне ад #<strong>$2</strong> да #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Вынік <strong>$1</strong> з <strong>$3</strong>|Вынікі <strong>$1 — $2</strong> з <strong>$3</strong>}}",
        "search-nonefound": "Нічога не было знойдзена.",
+       "search-nonefound-thiswiki": "Няма вынікаў, якія б адпавядалі такому запыту на гэтым сайце.",
        "powersearch-legend": "Падрабязны пошук",
        "powersearch-ns": "Шукаць у прасторах назваў:",
        "powersearch-togglelabel": "Пазначыць:",
        "prefs-personal": "Удзельнік",
        "prefs-rc": "{{:{{ns:mediawiki}}:Recentchanges/be}}",
        "prefs-watchlist": "Спіс назірання",
+       "prefs-editwatchlist": "Правіць спіс назірання",
+       "prefs-editwatchlist-label": "Правіць запісы ў вашым спісе назірання:",
+       "prefs-editwatchlist-edit": "Прагляд і сціранне старонак з вашага спісу назірання",
+       "prefs-editwatchlist-raw": "Правіць нефарматаваны спіс назірання",
+       "prefs-editwatchlist-clear": "Ачысціць ваш спіс назірання",
        "prefs-watchlist-days": "За колькі дзён паказваць змяненні ў назіраным:",
        "prefs-watchlist-days-max": "(найбольш $1 {{PLURAL:$1|дзень|дні|дзён}})",
        "prefs-watchlist-edits": "Колькасць правак для паказу ў разгорнутым выглядзе:",
        "prefs-watchlist-token": "Сакрэтны ключ для RSS:",
        "prefs-misc": "Рознае",
        "prefs-resetpass": "Змяніць пароль",
-       "prefs-changeemail": "Змяніць e-mail",
+       "prefs-changeemail": "Змяніць або выдаліць адрас электроннай пошты",
        "prefs-setemail": "Устаноўка электроннага адраса",
        "prefs-email": "Эл.пошта",
        "prefs-rendering": "Від",
        "rows": "Радкі:",
        "columns": "Калонкі:",
        "searchresultshead": "Пошук",
-       "stub-threshold": "Парог для паказу спасылкі <a href=\"#\" class=\"stub\">як на пачатковы артыкул</a> (у байтах):",
+       "stub-threshold": "Парог для паказу спасылкі як на пачатковы артыкул ($1):",
+       "stub-threshold-sample-link": "прыклад",
        "stub-threshold-disabled": "Не ўключана",
        "recentchangesdays": "За колькі дзён паказваць {{lc:{{:{{ns:mediawiki}}:recentchanges/be}}}}:",
        "recentchangesdays-max": "(найбольш $1 {{PLURAL:$1|дзень|дзён}})",
        "userrights": "Распараджэнне правамі ўдзельніка",
        "userrights-lookup-user": "Распараджацца групамі ўдзельнікаў",
        "userrights-user-editname": "Увядзіце імя ўдзельніка:",
-       "editusergroup": "Правіць групы ўдзельнікаў",
-       "editinguser": "Змена праў удзельніка '''[[User:$1|$1]]''' $2",
+       "editusergroup": "Правіць групы {{GENDER:$1|ўдзельнікаў|ўдзельніц}}",
+       "editinguser": "Змена праў {{GENDER:$1|удзельніка|удзельніцы}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Распараджацца групамі ўдзельніка",
-       "saveusergroups": "Захаваць групы ўдзельнікаў",
+       "saveusergroups": "Захаваць групы {{GENDER:$1|ўдзельнікаў|ўдзельніц}}",
        "userrights-groupsmember": "У групе:",
        "userrights-groupsmember-auto": "Няяўны член:",
        "userrights-groups-help": "Тут можна мяняць групы, да якіх належыць гэты ўдзельнік.\n* Адзначанае поле выбару азначае ўваходжанне ўдзельніка ў пэўную групу.\n* Чыстае поле выбару азначае неўваходжанне.\n* Знак * азначае, што нельга выняць удзельніка з групы, калі ён ужо там, або наадварот.",
        "userrights-changeable-col": "Групы, якія вам дазволена мяняць",
        "userrights-unchangeable-col": "Групы, якія вам не дазволена мяняць",
        "userrights-conflict": "Канфлікт змянення ўдзельніцкіх дазволаў! Калі ласка, праверце і пацвердзіце змены.",
-       "userrights-removed-self": "Ð\92Ñ\8b Ð¿Ð°Ñ\81пÑ\8fÑ\85ова Ð²Ñ\8bдалÑ\96лÑ\96 Ñ\81вае Ñ\9eлаÑ\81нÑ\8bÑ\8f Ð¿Ñ\80авÑ\8b. Ð¢Ð°ÐºÑ\96м Ñ\87Ñ\8bнам, Ð\92Ñ\8b Ð±Ð¾Ð»Ñ\8cÑ\88 Ð½Ðµ Ð·Ð¼Ð¾Ð¶Ð°Ñ\86е Ð°Ñ\82Ñ\80Ñ\8bмаÑ\86Ñ\8c Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ð´Ð° Ð³Ñ\8dÑ\82ай Ñ\81Ñ\82аÑ\80онкÑ\96.",
+       "userrights-removed-self": "Вы выдалілі свае ўласныя правы. Такім чынам, Вы больш не зможаце атрымаць доступ да гэтай старонкі.",
        "group": "Група:",
        "group-user": "Удзельнікі",
        "group-autoconfirmed": "Аўта-пацверджаныя ўдзельнікі",
        "right-createpage": "Ствараць старонкі (не размоўныя)",
        "right-createtalk": "Ствараць размоўныя старонкі",
        "right-createaccount": "Ствараць новыя рахункі ўдзелу",
+       "right-autocreateaccount": "Аўтаматычны ўваход у сістэму з вонкавага ўліковага запісу ўдзельніка",
        "right-minoredit": "Азначаць праўкі як дробныя",
        "right-move": "Пераносіць старонкі",
        "right-move-subpages": "Пераносіць старонкі разам з пад-старонкамі",
        "right-protect": "Мяняць узроўні аховы і правіць старонкі пад каскаднай аховай",
        "right-editprotected": "Правіць старонкі пад аховай \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Правіць старонкі, што пад аховай \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Рэдагаваць мадэль змесціва старонкі",
        "right-editinterface": "Правіць карыстальніцкі інтэрфейс",
        "right-editusercssjs": "Правіць файлы CSS і JS іншых удзельнікаў",
        "right-editusercss": "Правіць файлы CSS іншых удзельнікаў",
        "right-override-export-depth": "Экспартаваць старонкі, у тым ліку звязаныя, да глыбіні спасылак 5.",
        "right-sendemail": "Адпраўляць электронныя лісты іншым удзельнікам",
        "right-passwordreset": "Бачыць электронныя лісты аб змяненні пароля",
+       "right-managechangetags": "Ствараць і выдаляць [[Special:Tags|біркі]] з базы даных",
+       "right-applychangetags": "Прымяняць [[Special:Tags|біркі]] са сваімі праўкамі",
+       "right-changetags": "Дадаваць і выдаляць адвольныя [[Special:Tags|біркі]] да асобных версій і запісаў у журнале падзей",
+       "grant-generic": "Набор дазволаў \"$1\"",
+       "grant-group-page-interaction": "Узаемадзейнічаць з старонкамі",
+       "grant-group-file-interaction": "Узаемадзейнічаць з медыяфайламі",
+       "grant-group-watchlist-interaction": "Узаемадзейнічаць з вашым спісам назірання",
+       "grant-group-email": "Адпраўляць эл. пошту",
+       "grant-group-high-volume": "Выконваць вялікі аб'ём дзейнасці",
+       "grant-group-customization": "Настройкі і перавагі",
+       "grant-group-administration": "Выконваць адміністрацыйныя дзеянні",
+       "grant-group-other": "Розная актыўнасць",
+       "grant-blockusers": "Блакаваць і разблакаваць удзельнікаў",
+       "grant-createaccount": "Ствараць уліковыя запісы",
+       "grant-createeditmovepage": "Ствараць, правіць і пераносіць старонкі",
+       "grant-delete": "Сціраць старонкі, версіі і запісы ў журналах",
+       "grant-editmyoptions": "Змяняць вашы настройкі",
+       "grant-editmywatchlist": "Правіць ваш спіс назірання",
+       "grant-editpage": "Правіць наяўныя старонкі",
+       "grant-editprotected": "Правіць абароненыя старонкі",
+       "grant-highvolume": "Вялікі аб'ём рэдагавання",
+       "grant-oversight": "Утойваць удзельнікаў і версіі старонак",
+       "grant-patrol": "Патруляваць змены старонак",
+       "grant-protect": "Ахоўваць і здымаць ахову старонак",
+       "grant-rollback": "Адкатваць змяненні старонак",
+       "grant-sendemail": "Адпраўляць электронную пошту іншым удзельнікам",
+       "grant-uploadeditmovefile": "Загружаць, замяняць і пераносіць файлы",
+       "grant-uploadfile": "Укладаць новыя файлы",
+       "grant-basic": "Асноўныя правы",
+       "grant-viewdeleted": "Праглядаць сцёртыя файлы і старонкі",
+       "grant-viewmywatchlist": "Бачыць ваш спіс назірання",
        "newuserlogpage": "Журнал рэгістрацыі ўдзельнікаў",
        "newuserlogpagetext": "Гэта журнал рэгістрацыі новых удзельнікаў.",
        "rightslog": "Журнал правоў удзельнікаў",
        "action-createpage": "ствараць старонкі",
        "action-createtalk": "ствараць размоўныя старонкі",
        "action-createaccount": "ствараць гэты рахунак удзельніка",
+       "action-autocreateaccount": "аўтаматычна ствараць гэты вонкавы ўліковы запіс удзельніка",
        "action-history": "глядзець гісторыю гэтай старонкі",
        "action-minoredit": "значыць гэтую праўку як дробную",
        "action-move": "пераносіць гэтую старонку",
        "action-viewmywatchlist": "глядзець свой спіс назірання",
        "action-viewmyprivateinfo": "бачыць свае асабістыя звесткі",
        "action-editmyprivateinfo": "правіць свае асабістыя звесткі",
+       "action-editcontentmodel": "правіць мадэль змесціва старонкі",
+       "action-managechangetags": "ствараць і выдаляць біркі з базы даных",
+       "action-changetags": "дадаваць і выдаляць адвольныя біркі да асобных версій і запісаў у журнале падзей",
        "nchanges": "$1 {{PLURAL:$1|змена|змены|змен}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|з часу апошняга наведвання}}",
        "enhancedrc-history": "гісторыя",
        "recentchanges-label-bot": "Праўка зроблена праграмай-робатам",
        "recentchanges-label-unpatrolled": "Праўка яшчэ не атрымала адзнакі ўхваленасці (за ёй не сочыць \"патруль\")",
        "recentchanges-label-plusminus": "Аб'ём старонкі змяніўся на гэтую лічбу байтаў",
-       "recentchanges-legend-heading": "'''Легенда:'''",
+       "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (гл. асобна [[Special:NewPages|новыя старонкі]])",
+       "recentchanges-submit": "Паказаць",
        "rcnotefrom": "Ніжэй {{PLURAL:$5|паказана змяненне|паказаны змены}} з <strong>$3, $4</strong> (не больш за <strong>$1</strong>).",
        "rclistfrom": "Паказаць змены з $3 $2",
        "rcshowhideminor": "$1 дробныя праўкі",
        "rcshowhidemine": "$1 уласныя праўкі",
        "rcshowhidemine-show": "Паказаць",
        "rcshowhidemine-hide": "Схаваць",
+       "rcshowhidecategorization": "$1 катэгарызацыю старонак",
+       "rcshowhidecategorization-show": "Паказаць",
+       "rcshowhidecategorization-hide": "Схаваць",
        "rclinks": "Паказаць апошнія $1 змен за мінулыя $2 дзён<br />$3",
        "diff": "розн.",
        "hist": "гіст.",
        "newpageletter": "Н",
        "boteditletter": "р",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|назіральнік|назіральнікі|назіральнікаў}}]",
-       "rc_categories": "Абмежаваць катэгорыямі (размяжоўваць знакам \"|\")",
+       "rc_categories": "Абмежаваць катэгорыямі (размяжоўваць знакам \"|\"):",
        "rc_categories_any": "Усе",
        "rc-change-size-new": "$1 {{PLURAL:$1|байт|байты|байтаў}} пасля змены",
        "newsectionsummary": "/* $1 */ новы падраздзел",
        "recentchangeslinked-summary": "Гэта пералік нядаўніх змяненняў старонак, на якія спасылаецца азначаная старонка, або змяненняў складнікаў азначанай катэгорыі.\nСтаронкі, якія ўваходзяць у [[Special:Watchlist|лік назіраных вамі]], выдзелены <strong>стылем</strong>.",
        "recentchangeslinked-page": "Назва старонкі:",
        "recentchangeslinked-to": "Паказваць, замест гэтага, змяненні на старонках, што спасылаюцца сюды",
+       "recentchanges-page-added-to-category": "[[:$1]] дададзена ў катэгорыю",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] і яшчэ {{PLURAL:$2|адна старонка дададзена|$2 старонкі дададзены|$2 старонак дададзена}} ў катэгорыю",
+       "recentchanges-page-removed-from-category": "[[:$1]] выдалена з катэгорыі",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] і яшчэ {{PLURAL:$2|адна старонка выдалена|$2 старонкі выдалены|$2 старонак выдалена}} з катэгорыі",
+       "autochange-username": "Аўтаматычная змена MediaWiki",
        "upload": "Укласці файл",
        "uploadbtn": "Укласці файл",
        "reuploaddesc": "Спыніць укладанне і вярнуцца да пачатковага фармуляра.",
        "uploaderror": "Памылка пры ўкладанні",
        "upload-recreate-warning": "'''Увага''': файл з такім імем быў выдалены або перамешчаны.''' \n\nЖурнал выдалення і перамяшчэння гэтай старонкі прыводзіцца тут для зручнасці:",
        "uploadtext": "Тут можна ўкласці файлы ў вікі.\nПрагляд або пошук раней укладзенага [[Special:FileList|робіцца тут]]; апроч таго, усе ўкладанні і сціранні адзначаюцца ў журналах [[Special:Log/upload|укладання]] і [[Special:Log/delete|сцірання]], адпаведна.\n\nКаб уставіць файл ў старонку, ужываецца спасылка, зробленая адным з наступных спосабаў:\n* '''<code><nowiki>[[</nowiki>image<nowiki>:File.jpg]]</nowiki></code>''' паказвае файл у поўным памеры\n*  '''<code><nowiki>[[</nowiki>image<nowiki>:File.png|200px|thumb|left|тлумачальны тэкст]]</nowiki></code>''' паказвае файл, маштабаваны да шырыні 200 кропак, у рамцы, змешчанай злева, і з 'тлумачальным тэкстам' у якасці подпісу\n* '''<code><nowiki>[[</nowiki>media<nowiki>:File.ogg]]</nowiki></code>''' не паказвае самога файла, а толькі спасылку на яго",
-       "upload-permitted": "Дазволеныя тыпы файлаў: $1.",
-       "upload-preferred": "Больш прымальныя тыпы файлаў: $1.",
-       "upload-prohibited": "Забароненыя тыпы файлаў: $1.",
+       "upload-permitted": "{{PLURAL:$2|Дазволены тып|Дазволеныя тыпы}} файлаў: $1.",
+       "upload-preferred": "Больш {{PLURAL:$2|прымальны тып|прымальныя тыпы}} файлаў: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Забаронены тып|Забароненыя тыпы}} файлаў: $1.",
        "uploadlogpage": "Журнал укладанняў",
        "uploadlogpagetext": "Ніжэй паказаны спіс [[Special:NewFiles|нядаўна ўкладзеных]] файлаў.",
        "filename": "Назва файла",
        "upload-too-many-redirects": "Занадта шмат перасылак за гэтым адрасам (URL)",
        "upload-http-error": "Памылка HTTP: $1",
        "upload-copy-upload-invalid-domain": "Капіраванне загрузак не дазволенае ў гэтым дамене.",
+       "upload-dialog-title": "Укласці файл",
+       "upload-dialog-button-cancel": "Нічога",
+       "upload-dialog-button-done": "Гатова",
+       "upload-dialog-button-save": "Запісаць",
+       "upload-dialog-button-upload": "Укласці",
+       "upload-form-label-infoform-title": "Падрабязнасці",
+       "upload-form-label-infoform-name": "Назва",
        "upload-form-label-infoform-description": "Апісанне",
+       "upload-form-label-usage-title": "Выкарыстанне",
+       "upload-form-label-usage-filename": "Назва файла",
+       "foreign-structured-upload-form-label-own-work": "Гэта мая ўласная праца",
+       "foreign-structured-upload-form-label-infoform-categories": "Катэгорыі",
        "foreign-structured-upload-form-label-infoform-date": "Дата",
        "backend-fail-stream": "Не атрымалася трансляваць файл $1.",
        "backend-fail-backup": "Немагчыма зрабіць рэзервную копію $1.",
        "backend-fail-read": "Не атрымалася прачытаць файл $1.",
        "backend-fail-create": "Немагчыма запісаць файл \"$1\".",
        "backend-fail-maxsize": "Немагчыма запісаць файл \"$1\", таму што ён большы за {{PLURAL:$2|адзін байт|$2 байты|$2 байтаў}}.",
-       "backend-fail-readonly": "Сервер сховішча «$1» у рэжыме толькі чытання. Прычына: «$2»",
+       "backend-fail-readonly": "Сервер сховішча «$1» у рэжыме толькі чытання. Прычына: <em>$2</em>",
        "backend-fail-synced": "Стан файла «$1» адрозніваецца ад стану на ўнутраным серверы сховішча",
        "backend-fail-connect": "Немагчыма далучыцца да сервера сховішча «$1».",
        "backend-fail-internal": "Узнікла невядомая памылка на серверы сховішча «$1».",
        "randomincategory-nopages": "Няма старонак у катэгорыі [[:Category:$1|$1]].",
        "randomincategory-category": "Катэгорыя:",
        "randomincategory-legend": "Выпадковая старонка ў катэгорыі",
+       "randomincategory-submit": "Перайсці",
        "randomredirect": "Выпадковая перасылка",
        "randomredirect-nopages": "Няма перасылак у прасторы назваў \"$1\".",
        "statistics": "Статыстыка",
        "mostrevisions": "Артыкулы з найбольшай колькасцю версій",
        "prefixindex": "Старонкі з назвамі на ўзор",
        "prefixindex-namespace": "Усе старонкі з прэфіксам ( $1 прастора імёнаў)",
+       "prefixindex-submit": "Паказаць",
        "prefixindex-strip": "Прыбраць прэфікс у пераліку",
        "shortpages": "Старонкі малога аб'ёму",
        "longpages": "Старонкі вялікага аб'ёму",
        "protectedpages-performer": "Паставіў ахову",
        "protectedpages-params": "Тыпы аховы",
        "protectedpages-reason": "Прычына",
+       "protectedpages-submit": "Паказаць старонкі",
        "protectedpages-unknown-timestamp": "Невядома",
        "protectedpages-unknown-performer": "Нявызначаны ўдзельнік",
        "protectedtitles": "Назвы пад аховай",
        "protectedtitles-summary": "На гэтай старонцы пералічаны назвы, якія зараз абаронены ад стварэння. Спіс існых старонак пад аховай гл. [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Няма назваў, якія зараз бы ахоўваліся з такімі параметрамі.",
+       "protectedtitles-submit": "Паказаць назвы",
        "listusers": "Усе ўдзельнікі",
        "listusers-editsonly": "Толькі ўдзельнікі, якія маюць праўкі",
        "listusers-creationsort": "У парадку датаў стварэння",
        "usereditcount": "$1 {{PLURAL:$1|праўка|праўкі|правак}}",
        "usercreated": "\t{{GENDER:$3|Зарэгістраваўся|Зарэгістравалася}} $1 у $2",
        "newpages": "Новыя старонкі",
+       "newpages-submit": "Паказаць",
        "newpages-username": "Імя ўдзельніка:",
        "ancientpages": "Найстарэйшыя старонкі",
        "move": "Перанесці",
        "pager-older-n": "{{PLURAL:$1|1 старэйшая|$1 старэйшыя}}",
        "suppress": "Падавіць",
        "querypage-disabled": "Гэта адмысловая старонка адключана для павышэння прадукцыйнасці.",
+       "apihelp": "Даведка па API",
+       "apihelp-no-such-module": "Модуль \"$1\" не знойдзены.",
+       "apisandbox": "Пясочніца API",
+       "apisandbox-fullscreen": "Разгарнуць панэль",
+       "apisandbox-unfullscreen": "Паказаць старонку",
+       "apisandbox-submit": "Зрабіць запыт",
+       "apisandbox-reset": "Ачысціць",
+       "apisandbox-retry": "Паўтарыць",
+       "apisandbox-helpurls": "Спасылкі на даведку",
+       "apisandbox-examples": "Прыклады",
+       "apisandbox-dynamic-parameters": "Дадатковыя параметры",
+       "apisandbox-dynamic-parameters-add-label": "Дадаць параметр:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Назва параметра",
        "booksources": "Кнігі",
        "booksources-search-legend": "Знайсці, дзе купіць кнігі",
        "booksources-search": "Пошук",
        "booksources-text": "Ніжэй паказаны пералік спасылак на іншыя сеціўныя пляцоўкі, якія прадаюць новыя і б/у кнігі, і, магчыма, маюць больш звестак пра кнігі, якіх вы шукаеце:",
        "booksources-invalid-isbn": "Гэты ISBN не выглядае правільным; праверце правільнасць капіравання з арыгіналу.",
        "specialloguserlabel": "Выканаўца:",
-       "speciallogtitlelabel": "Мэта (назва ці ўдзельнік):",
+       "speciallogtitlelabel": "Мэта (назва ці {{ns:user}}:імя_ўдзельніка для ўдзельніка):",
        "log": "Журналы",
+       "logeventslist-submit": "Паказаць",
        "all-logs-page": "Усе публічныя журналы",
        "alllogstext": "Супольны паказ усіх магчымых журналаў на пляцоўцы {{SITENAME}}.\nМожна звузіць аб'ём паказу, выбіраючы тып журнала, імя ўдзельніка (з улікам рэгістру літар) або старонкі (таксама з улікам рэгістру).",
        "logempty": "Нічога адпаведнага ў журнале не знойдзена.",
        "log-title-wildcard": "Знайсці назвы, якія пачынаюцца з гэтага тэксту",
        "showhideselectedlogentries": "Паказаць/схаваць выбраныя запісы журнала",
+       "checkbox-all": "Усе",
        "allpages": "Усе старонкі",
        "nextpage": "Наступная старонка ($1)",
        "prevpage": "Папярэдняя старонка ($1)",
        "wlheader-showupdated": "Старонкі, якія былі зменены пасля вашага апошняга наведвання, паказаны <strong>абрысам шрыфту</strong>.",
        "wlnote": "Ніжэй {{PLURAL:$1|паказана апошняя <strong>$1</strong> змена|паказаны апошнія <strong>$1</strong> змены|паказаны апошнія <strong>$1</strong> змен}} за {{PLURAL:$2|апошнюю|апошнія|апошнія}} <strong>$2</strong> {{PLURAL:$2|гадзіну|гадзіны|гадзін}}, на момант часу $3 $4.",
        "wlshowlast": "Паказваць апошнія $1 гадз. $2 дзён",
+       "watchlist-hide": "Схаваць",
+       "watchlist-submit": "Паказаць",
+       "wlshowtime": "Перыяд часу для паказу:",
+       "wlshowhideminor": "дробныя праўкі",
+       "wlshowhidebots": "робатаў",
+       "wlshowhideliu": "пазнаных удзельнікаў",
+       "wlshowhideanons": "ананімных удзельнікаў",
+       "wlshowhidepatr": "ухваленыя праўкі",
+       "wlshowhidemine": "мае праўкі",
+       "wlshowhidecategorization": "катэгарызацыю старонак",
        "watchlist-options": "Магчымасці назірання",
        "watching": "Дапісваецца ў спіс назірання...",
        "unwatching": "Спыняем назіранне...",
        "deletepage": "Сцерці старонку",
        "confirm": "Пацвердзіць",
        "excontent": "тэкст быў: '$1'",
-       "excontentauthor": "тэкст быў: '$1' (і адзіны аўтар: '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "тэкст быў: '$1' (і адзіны аўтар: \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|размовы]]))",
        "exbeforeblank": "змесціва перад ачысткаю было: '$1'",
        "delete-confirm": "Сцерці \"$1\"",
        "delete-legend": "Сцерці",
        "historywarning": "<strong>Увага:</strong> Старонка, якую вы хочаце сцерці, мае гісторыю з прыблізна $1 {{PLURAL:$1|праўкі|правак}}:",
+       "historyaction-submit": "Паказаць",
        "confirmdeletetext": "Вы збіраецеся сцерці старонку разам з цэлай яе гісторыяй правак.\nПацвердзіце свой намер зрабіць гэта, сваё разуменне наступстваў, і што вы робіце гэта ў адпаведнасці з [[{{MediaWiki:Policy-url}}|палітыкай (асноўнымі правіламі)]].",
        "actioncomplete": "Завершана аперацыя",
        "actionfailed": "Памылка дзеяння",
        "delete-toobig": "Старонка мае вялікую гісторыю правак, больш за $1 {{PLURAL:$1|версію|версій}}. Сціранне такіх старонак было абмежавана, каб пазбегчы ўтварэння выпадковых перашкод працы {{SITENAME}}.",
        "delete-warning-toobig": "Старонка мае вялікую гісторыю правак, больш за $1 {{PLURAL:$1|версію|версій}}. Сціранне такіх старонак можа перашкодзіць працы базы даных {{SITENAME}}; будзьце асцярожнымі.",
        "deleteprotected": "Вы не можаце сцерці гэтую старонку, таму што яна ахоўваецца.",
-       "deleting-backlinks-warning": "'''Увага:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Іншыя старонкі]] спасылаюцца на ці ўключаюць старонку, якую вы збіраецеся сцерці.",
+       "deleting-backlinks-warning": "<strong>Увага:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Іншыя старонкі]] спасылаюцца на ці ўключаюць старонку, якую вы збіраецеся сцерці.",
        "rollback": "Адкаціць праўкі",
        "rollbacklink": "адкат",
        "rollbacklinkcount": "адкаціць $1 {{PLURAL:$1|праўку|праўкі|правак}}",
        "rollback-success": "Адкочаны праўкі $1; вернута апошняя версія $2.",
        "sessionfailure-title": "Памылка сеансу",
        "sessionfailure": "Магчыма, ёсць праблемы з вашым сеансам працы ў сістэме. Таму вам было адмоўлена ў выкананні дзеяння, каб засцерагчыся ад захопу сеанса.\n\nВярніцеся на папярэднюю старонку, перазагрузіце яе і тады паспрабуйце зноў.",
+       "changecontentmodel-reason-label": "Прычына:",
        "protectlogpage": "Журнал аховы",
        "protectlogtext": "Ніжэй прыведзены журнал змен абароны старонкі.\nВы можаце таксама прагледзець [[Special:ProtectedPages|пералік старонак пад аховай]].",
        "protectedarticle": "пад аховай «[[$1]]»",
        "undeletepagetext": "Наступн{{PLURAL:$1|ая старонка была сцёртая, але застаецца ў архіве і можа быць адноўленая|ыя $1 старонкі былі сцёртыя, але застаюцца ў архіве і могуць быць адноўлены}}\nАрхіў можа перыядычна ачышчацца.",
        "undelete-fieldset-title": "Аднавіць версіі",
        "undeleteextrahelp": "Для поўнага аднаўлення гісторыі старонкі пакіньце ўсе адзнакі пустымі і націсніце '''«{{int:undeletebtn}}»'''. Для частковага аднаўлення, пазначце тыя версіі старонкі, якія трэба аднавіць, і націсніце '''«{{int:undeletebtn}}»'''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|версія|версій}} з архіву",
+       "undeleterevisions": "$1 {{PLURAL:$1|версія|версій}} сцёрта",
        "undeletehistory": "Калі аднавіць старонку, то ў яе гісторыю правак вернуцца ўсе яе версіі.\nКалі пасля сцірання стваралася новая старонка з такой самай назвай, то адноўленыя версіі з'явяцца ў яе гісторыі перад часам стварэння новай старонкі.",
        "undeleterevdel": "Аднаўленне не будзе выконвацца, калі ў яго выніку была б часткова сцёртая найноўшая версія старонкі або файла. У такіх выпадках трэба зняць выбар з самых нядаўніх сцёртых версій або дазволіць іх паказ.",
        "undeletehistorynoadmin": "Гэтая старонка была сцёртая. Прычына сцірання паказаная ў ніжэй, разам з падрабязнасцямі пра ўдзельнікаў, якія правілі старонку перад сціраннем. Сам тэкст сцёртых версій даступны толькі адміністратарам.",
        "cant-move-to-user-page": "Вам не дазволена пераносіць старонку ў старонку карыстальніка (не лічачы пад-старонак карыстальніка).",
        "cant-move-category-page": "Вам не дазволена пераносіць старонкі катэгорый.",
        "cant-move-to-category-page": "Вам не дазволена пераносіць старонку ў старонку катэгорыі.",
-       "newtitle": "Ð\9fад Ð½Ð¾Ð²Ñ\83Ñ\8e Ð½Ð°Ð·Ð²Ñ\83:",
+       "newtitle": "Ð\9dоваÑ\8f Ð½Ð°Ð·Ð²Ð°:",
        "move-watch": "Назіраць за старонкай",
        "movepagebtn": "Перанесці старонку",
        "pagemovedsub": "Паспяховы перанос",
        "move-leave-redirect": "Пакінуць перасылку са старой назвы",
        "protectedpagemovewarning": "<strong>Папярэджанне:</strong> Гэта старонка была змешчана пад ахову; пераназваць яе могуць толькі ўдзельнікі з паўнамоцтвамі адміністратараў.\nНіжэй для даведкі прыведзена апошні запіс журнала:",
        "semiprotectedpagemovewarning": "<strong>Заўвага:</strong> Гэта старонка была змешчана пад ахову; пераносіць яе пад іншую назву могуць толькі зарэгістраваныя ўдзельнікі.\nНіжэй для даведкі прыведзена апошні запіс журнала:",
-       "move-over-sharedrepo": "== Файл існуе ==\nФайл з назвай [[:$1]] ёсць у агульным сховішчы. Файл, перанесены пад такую назву, будзе перамагаць файл з агульнага сховішча.",
+       "move-over-sharedrepo": "Файл з назвай [[:$1]] ёсць у агульным сховішчы. Файл, перанесены пад такую назву, будзе перамагаць файл з агульнага сховішча.",
        "file-exists-sharedrepo": "Такая назва файла ўжо выкарыстана ў агульным сховішчы.\nВыберыце іншую назву.",
        "export": "Экспартаваць старонкі",
        "exporttext": "Тут можна экспартаваць тэкст і гісторыю правак пэўнай старонкі або збору старонак, з наступным абгортваннем у адмысловы код XML. Такое потым можна імпартаваць у іншую Вікі на аснове пакету MediaWiki праз [[Special:Import|старонку імпартавання]].\n\nКаб экспартаваць старонкі, упішыце іх назвы, адну на радок, у тэкставым полі, што ніжэй, і абазначце, ці жадаеце актуальныя версіі разам са старымі версіямі і з гісторыяй правак, ці толькі актуальныя з інфармацыяй пра апошнюю праўку.\n\nУ апошнім выпадку можна карыстацца адмысловай формай спасылкі ў выглядзе, напр., [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] для \"[[{{MediaWiki:Mainpage}}]]\".",
        "thumbnail_image-missing": "Хутчэй за ўсё, адсутнічае файл $1",
        "thumbnail_image-failure-limit": "Занадта шмат нядаўніх няўдалых спроб ($1 ці болей) стварыць гэту мініяцюру. Калі ласка, паспрабуйце пазней.",
        "import": "Імпартаваць старонкі",
-       "importinterwiki": "Імпарт Transwiki",
-       "import-interwiki-text": "Ð\92Ñ\8bбаÑ\80 Ð²Ñ\96кÑ\96 Ñ\96 Ð½Ð°Ð·Ð²Ñ\8b Ñ\81Ñ\82аÑ\80онкÑ\96 Ð´Ð·ÐµÐ»Ñ\8f Ñ\96мпаÑ\80Ñ\82Ñ\83.\nÐ\94аÑ\82Ñ\8b Ð²ÐµÑ\80Ñ\81Ñ\96й і імёны аўтараў будуць захаваныя.\nУсе транс-вікавыя імпарты запісваюцца ў [[Special:Log/import|журнале імпартаў]].",
+       "importinterwiki": "Імпарт з іншай вікі",
+       "import-interwiki-text": "Ð\92Ñ\8bбеÑ\80Ñ\8bÑ\86е Ð²Ñ\96кÑ\96 Ñ\96 Ð½Ð°Ð·Ð²Ñ\83 Ñ\81Ñ\82аÑ\80онкÑ\96 Ð´Ð»Ñ\8f Ñ\96мпаÑ\80Ñ\82Ñ\83.\nÐ\94аÑ\82Ñ\8b Ð¿Ñ\80авак і імёны аўтараў будуць захаваныя.\nУсе транс-вікавыя імпарты запісваюцца ў [[Special:Log/import|журнале імпартаў]].",
        "import-interwiki-sourcewiki": "Крынічная вікі:",
        "import-interwiki-sourcepage": "Крынічная старонка:",
        "import-interwiki-history": "Капіраваць усе гістарычныя версіі гэтай старонкі",
        "javascripttest-qunit-intro": "Глядзіце [$1 дакументацыю па тэставанні] на mediawiki.org.",
        "tooltip-pt-userpage": "Ваша ўласная старонка",
        "tooltip-pt-anonuserpage": "Старонка ўдзельніка для таго IP, з якога вы зараз працуеце",
-       "tooltip-pt-mytalk": "Ваша старонка размоў",
+       "tooltip-pt-mytalk": "{{GENDER:|Ваша}} старонка размоў",
        "tooltip-pt-anontalk": "Размовы аб праўках, зробленых з гэтага IP-адраса",
-       "tooltip-pt-preferences": "Вашы настройкі",
+       "tooltip-pt-preferences": "{{GENDER:|Вашы}} настройкі",
        "tooltip-pt-watchlist": "Пералік старонак, за змяненнямі ў якіх вы сочыце",
-       "tooltip-pt-mycontris": "Пералік вашага ўкладу",
+       "tooltip-pt-mycontris": "Пералік {{GENDER:|вашага}} ўкладу",
        "tooltip-pt-anoncontribs": "Спіс правак, зробленых з гэтага IP-адраса",
        "tooltip-pt-login": "Вам прапануецца ўвайсці ў сістэму, але гэта неабавязкова.",
        "tooltip-pt-logout": "Выйсці з сістэмы",
        "tooltip-t-recentchangeslinked": "Нядаўнія змены ў старонках, на якія спасылаецца гэтая старонка",
        "tooltip-feed-rss": "RSS-струмень гэтай старонкі",
        "tooltip-feed-atom": "Струмень навін Atom для гэтай старонкі",
-       "tooltip-t-contributions": "Ð\9fаказаÑ\86Ñ\8c Ð¿ÐµÑ\80алÑ\96к Ñ\83кладаÑ\9e Ð³Ñ\8dÑ\82ага Ñ\9eдзелÑ\8cнÑ\96ка",
-       "tooltip-t-emailuser": "Адаслаць удзельніку ліст эл.пошты",
+       "tooltip-t-contributions": "Ð\9fеÑ\80алÑ\96к Ñ\83кладаÑ\9e {{GENDER:$1|гÑ\8dÑ\82ага Ñ\9eдзелÑ\8cнÑ\96ка|гÑ\8dÑ\82ай Ñ\83дзелÑ\8cнÑ\96Ñ\86Ñ\8b}}",
+       "tooltip-t-emailuser": "Адаслаць {{GENDER:$1|удзельніку|удзельніцы}} ліст эл.пошты",
        "tooltip-t-upload": "Укласці файлы",
        "tooltip-t-specialpages": "Пералік усіх адмысловых старонак",
        "tooltip-t-print": "Друкавальная версія гэтай старонкі",
        "lastmodifiedatby": "Апошняе змяненне старонкі адбылося $2, $1 аўтарства $3.",
        "othercontribs": "На аснове працы $1.",
        "others": "іншае",
-       "siteusers": "{{PLURAL:$2|удзельнік|удзельнікі}} з пляцоўкі {{SITENAME}} - $1",
+       "siteusers": "{{PLURAL:$2|{{GENDER:$1|удзельнік|удзельніца}}|удзельнікі}} з пляцоўкі {{SITENAME}} - $1",
        "anonusers": "ананімны{{PLURAL:$2| ўдзельнік|я ўдзельнікі}} {{SITENAME}} - $1",
        "creditspage": "Аўтарства старонкі",
        "nocredits": "Няма звестак пра аўтараў гэтай старонкі.",
        "scarytranscludetoolong": "[Занадта доўгі URL]",
        "deletedwhileediting": "'''Увага''': гэтая старонка была сцёрта пасля таго, як вы пачалі з ёй працаваць!",
        "confirmrecreate": "Удзельнік [[User:$1|$1]] ([[User talk:$1|размова]]) сцёр гэты артыкул пасля таго, як вы пачалі працу з ім, падаўшы прычыну:\n: ''$2''\nПацвердзіце свой намер аднавіць гэты артыкул.",
-       "confirmrecreate-noreason": "Удзельнік [[User:$1|$1]] ([[User talk:$1|размовы]]) выдаліў гэтую старонку пасля таго, як вы пачалі яе рэдагаваць. Калі ласка, пацвердзіце, што вы сапраўды жадаеце аднавіць гэтую старонку.",
+       "confirmrecreate-noreason": "{{GENDER:$1|Удзельнік|Удзельніца}} [[User:$1|$1]] ([[User talk:$1|размовы]]) {{GENDER:$1|сцёр|сцёрла}} гэту старонку пасля таго, як вы пачалі яе рэдагаваць.\nКалі ласка, пацвердзіце, што вы сапраўды жадаеце аднавіць гэтую старонку.",
        "recreate": "Аднавіць",
        "unit-pixel": "крпк",
        "confirm_purge_button": "ОК",
        "version-entrypoints": "Уваходныя адрасы",
        "version-entrypoints-header-entrypoint": "Кропка ўваходу",
        "version-entrypoints-header-url": "URL",
-       "redirect": "Перасылка да файла, ID удзельніка, старонкі ці версіі",
+       "version-libraries-version": "Версія",
+       "version-libraries-license": "Ліцэнзія",
+       "version-libraries-description": "Апісанне",
+       "version-libraries-authors": "Аўтары",
+       "redirect": "Перасылка да файла, ID удзельніка, старонкі, версіі ці журнала",
        "redirect-legend": "Перасылка да файла ці старонкі",
        "redirect-summary": "Гэта адмысловая старонка перасылае да файла (з назвы файла), на старонку (з ідэнтыфікатара версіі ці старонкі), ці на старонку ўдзельніка (калі дадзены лічбавы ID удзельніка). Ужыванне: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], ці [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Перайсці",
        "tags-tag": "Назва біркі",
        "tags-display-header": "Назва на паказ",
        "tags-description-header": "Поўнае апісанне значэння",
+       "tags-source-header": "Крыніца",
        "tags-active-header": "Актыўны?",
        "tags-hitcount-header": "Пазначаных правак",
+       "tags-actions-header": "Дзеянні",
        "tags-active-yes": "Да",
        "tags-active-no": "Не",
+       "tags-source-none": "Больш не выкарыстоўваецца",
        "tags-edit": "правіць",
+       "tags-delete": "сцерці",
+       "tags-activate": "актываваць",
+       "tags-deactivate": "адключыць",
        "tags-hitcount": "$1 {{PLURAL:$1|змена|змены|змен}}",
+       "tags-create-tag-name": "Назва біркі:",
+       "tags-create-reason": "Прычына:",
+       "tags-create-submit": "Стварыць",
        "comparepages": "Параўнанне старонак",
        "compare-page1": "Старонка 1",
        "compare-page2": "Старонка 2",
        "feedback-error3": "Памылка. Няма адказу ад API",
        "feedback-message": "Паведамленне",
        "feedback-subject": "Тэма:",
-       "feedback-submit": "Даслаць водгук",
+       "feedback-submit": "Даслаць",
        "feedback-thanks": "Дзякуй! Ваш водгук размешчаны на старонцы «[$2 $1]».",
        "searchsuggest-search": "Знайсці",
        "searchsuggest-containing": "змяшчае...",
        "expand_templates_generate_xml": "Паказаць дрэва сінтаксічнага аналізу XML",
        "expand_templates_generate_rawhtml": "Паказаць зыходны код HTML",
        "expand_templates_preview": "Перадпаказ",
-       "pagelanguage": "Ð\92Ñ\8bбаÑ\80 Ð¼Ð¾Ð²Ñ\8b старонкі",
+       "pagelanguage": "Ð\97мÑ\8fнÑ\96Ñ\86Ñ\8c Ð¼Ð¾Ð²Ñ\83 старонкі",
        "pagelang-name": "Старонка",
        "pagelang-language": "Мова",
        "pagelang-use-default": "Прадвызначаная мова",
index f0686c6..7d8303e 100644 (file)
        "recentchanges-label-bot": "Тази редакция е извършена от бот",
        "recentchanges-label-unpatrolled": "Тази редакция все още не е проверена",
        "recentchanges-label-plusminus": "Размерът на страницата е променен с този брой байтове",
-       "recentchanges-legend-heading": "'''Легенда:'''",
+       "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (вижте също [[Special:NewPages|списъка с нови страници]])",
        "recentchanges-submit": "Покажи",
        "rcnotefrom": "Дадени са промените от <strong>$2</strong> (до <strong>$1</strong> показани).",
index c4b6b67..bae6d56 100644 (file)
@@ -6,7 +6,8 @@
                        "Rachitrali",
                        "Mjbmr",
                        "Macofe",
-                       "Hosseinblue"
+                       "Hosseinblue",
+                       "Dalba"
                ]
        },
        "tog-underline": "لینکانی جهلگا خط کشیتین",
@@ -88,7 +89,7 @@
        "february-gen": "فیبروری",
        "march-gen": "مارچ",
        "april-gen": "اپریل",
-       "may-gen": "می",
+       "may-gen": "مای",
        "june-gen": "جون",
        "july-gen": "جولای",
        "august-gen": "اگوست",
        "feb": "فیبروری",
        "mar": "مارچ",
        "apr": "اپریل",
-       "may": "می",
+       "may": "مای",
        "jun": "جون",
        "jul": "جولای",
        "aug": "اگوست",
        "mypage": "تاکدیم",
        "mytalk": "گپ",
        "anontalk": "ای آی پی نشانی ئی باره ئا گپ",
-       "navigation": "ناوبری",
+       "navigation": "جهت یابي",
        "and": "&#32;و",
        "qbfind": "ودی کورتین",
        "qbbrowse": "مرور",
        "variants": "لهجه ئان",
        "navigation-heading": "ناوبری مینو",
        "errorpagetitle": "خطا",
-       "returnto": "بیئرگشت بئ $1.",
+       "returnto": "بیئرگشت به $1.",
        "tagline": "شه {{SITENAME}}",
        "help": "کومک",
        "search": "گشتین",
        "searchbutton": "گشتین",
        "go": "برا",
-       "searcharticle": "برا",
+       "searcharticle": "بررÙ\87",
        "history": "تاکدیمی تاریخچه",
        "history_short": "تاریخچه",
        "updatedmarker": "نئ آخرین آپڈیٹا نشان داتین",
        "viewhelppage": "کومکی تاکدیما نشان داتین",
        "categorypage": "دیستین تهری تاکدیمی",
        "viewtalkpage": "گپ تاکدیمی نشان داتین",
-       "otherlanguages": "بی دیگه زبانانی تا",
+       "otherlanguages": "به دیگه زبانانی‌تا",
        "redirectedfrom": "(گردینته بوته شه $1 ئا)",
        "redirectpagesub": "تاکدیمی تغییرمسیر داتین",
        "redirectto": "گردینتین په:",
-       "lastmodifiedat": "ای تاکدیم آخرین‌ وارا بی $1 سائت $2 تا تغییر بوته.",
+       "lastmodifiedat": "ای تاکدیم آخرین‌ وارا بِه $1‌ تاریخئا و $2 ساعت‌‌ئا گردینته بوته.",
        "viewcount": "شه ای تاکدیما کسی {{PLURAL:$1|یکوار|$1ور}} دیدن کورته.",
        "protectedpage": "قُلپ بوتگین تاکدیم",
-       "jumpto": "جوپ کورتین بی:",
-       "jumptonavigation": "ناوبری",
+       "jumpto": "جوپ کورتین بِه:",
+       "jumptonavigation": "جهت یابي",
        "jumptosearch": "گشتین",
        "view-pool-error": "متاسفانه موچین سرویس بی انونین وختا باز مشغول انت.\nبازین شه کار گیروکان لوٹنت که ای تاکدیما بگیندنت. \nمهربانی بکنیت دیم شه ایشی که پدا په ای تاکدیمی دیستینا کوشش بکنیت یک کمی صبر بکنیت.\n\n$1",
        "generic-pool-error": "متاسفانه موچین سرویس بی انونین وختا باز مشغول انت.\nبازین شه کار گیروکان لوتنت که ای تاکدیما بگیندنت. \nمهربانی بکنیت دیم شه ایشی که پدا په ای تاکدیمی دیستینا کوشش بکنیت یک کمی صبر بکنیت.",
        "pool-servererror": "پول سنتر سرویس بی دسترس ئا نه اینت ( $1 ).",
        "poolcounter-usage-error": "خطا استفاده شه: $1",
        "aboutsite": "بی بارها {{SITENAME}}",
-       "aboutpage": "Project:بی بارها",
+       "aboutpage": "Project:بِه باره‌ئا",
        "copyright": "محتوایات بی  $1 اجازه نامه ئا هستنت مگه ای که آی خلاف ئا ذکر بوته بیئنت .",
        "copyrightpage": "{{ns:project}}:کاپی رایت یا باز کورتینی حق",
-       "currentevents": "اÙ\86Ù\88Ù\86Û\8cÙ\86 Ù\88اÙ\82ئات",
-       "currentevents-url": "Project:اÙ\86Ù\88Ù\86Û\8cÙ\86 Ù\88اÙ\82ئاتان",
+       "currentevents": "اÙ\86Ù\88Ù\86Û\8cÙ\86 Ù\88اÙ\82عات",
+       "currentevents-url": "Project:اÙ\86Ù\88Ù\86Û\8cÙ\86 Ù\88اÙ\82عاتان",
        "disclaimers": "تکذیب‌ نامه‌هان",
-       "disclaimerpage": "Project:ئÙ\85Ù\88Ù\85Û\8c Ø¦Û\8cÙ\86 ØªÚ©Ø°Û\8cبâ\80\8c نامه",
+       "disclaimerpage": "Project:عÙ\85Ù\88Ù\85Û\8câ\80\8cئÛ\8cÙ\86 ØªÚ©Ø°Û\8cبâ\80\8câ\80\8cنامه",
        "edithelp": "کومک په ایدیت ئی خاتیرا",
        "helppage-top-gethelp": "کومک",
        "mainpage": "بُنیادی تاکدیم",
        "policy-url": "Project:سیاست‌ئان",
        "portal": "کار زوروکانئ داخل بوتین",
        "portal-url": "Project:کار زوروکانئ داخل بوتین",
-       "privacy": "سیاست محرمانگی",
-       "privacypage": "Project:سیاست محرمانگی",
+       "privacy": "محرمانگین سیاست",
+       "privacypage": "Project:محرمانگین سیاست",
        "badaccess": "دسترسی ئی خطا",
        "badaccess-group0": "شما اجازه په ای ئملی اجرائا که درخواست کورته ئیت نداریت.",
        "badaccess-groups": "ای ئملی که شما درخواست کورته ئیت مخصوص بی  {{PLURAL:$2|ای گروپ|ای گروپ ئان}} شه کار زوروکان اینت: $1.",
        "viewsourceold": "نشان داتین مبدائی",
        "editlink": "ایڈیٹ",
        "viewsourcelink": "نشان داتین مبدائی",
-       "editsectionhint": "ایدیت کورتین : $1 بخشی",
-       "toc": "Ù\85حتÙ\88Û\8cات",
+       "editsectionhint": "$1‌ئی: بخشێ ایڈیت کورتین",
+       "toc": "Ù\84Ú\91",
        "showtoc": "نشان داتین",
        "hidetoc": "چیهر داتین",
        "collapsible-collapse": "بستین",
        "feed-invalid": "هبر وانی وراک ئی قیسم جواز نداریت.",
        "feed-unavailable": "هبر وانی وراک ئان بی دسترس نه انت",
        "site-rss-feed": "آراس‌اس وراک په $1",
-       "site-atom-feed": "اتومئ وراک په $1",
+       "site-atom-feed": "اتومین وررگ په $1",
        "page-rss-feed": "آراس‌اس وراک په \"$1\"",
-       "page-atom-feed": "اتومي وراک په «$1»",
+       "page-atom-feed": "اتومين وررگ په «$1»",
        "red-link-title": "$1 ( دیم موجود نه اینت)",
        "sort-descending": "نزولین ترتیب کورتین",
        "sort-ascending": "صعودی ترتیب کورتین",
        "perfcached": "همراهی کنوکین دیتا شه نهانی ئین حافظهٔ ئا فراخوانی بوته و ممکن اینت کاملاً اپڈیٹ نه بوته. حداکثر {{PLURAL:$1|یک نتیجه| $1 نتیجه}} بي نهانی ئین حافظهٔ تا دسترس ئی وڈ اینت.",
        "perfcachedts": "همرای کنوکین دیتا شه نهانی ئین حافظه ئا فرخوانی بوته و آخرین وار  بئ  $1 ئی تا اپڈیٹ بوته. حداکثر {{PLURAL:$4|یک نتیجه|$4 نتیجه}} بئ نهانی ئین حافظه تا دسترس ئی وڈ اینت.",
        "querypage-no-updates": "ای تاکدیمی اپڈیٹ کورتین انون غیر فئال بوته.\nای تاکدیمی مئلومات ممکن اینت که نوک نه بوته انت.",
-       "viewsource": "Ù\86شاÙ\86 Ø¯Ø§ØªÛ\8cÙ\86 Ù\85بدائÛ\8c",
+       "viewsource": "Ù\85بدائÛ\8cÙ\86 Ù\86Ù\85اÛ\8cØ´",
        "viewsource-title": "مبدا ئی نشان داتین په $1",
        "actionthrottled": "شمی ئملی دیم گیپته بوت",
        "actionthrottledtext": "په دیمگیری شه اسپم شینک بوتینی خاتیرا، په شما اجازه نه اینت که ایرنگین ئملی ئا چینکه وار بی یک کمین وختی تا انجام دهیت.\nمهربانی بکنیت پد شه چینکه دقیقه ئا کوشش بکنیت.",
        "userlogin-createanother": "دیگرین کار زوروکین حسابئ جوڑ کورتین",
        "createacct-emailrequired": "ایمیل ادرس",
        "createacct-emailoptional": "ایمیل ادرس (اختیاری)",
-       "createacct-email-ph": "وتئ ایمیل ادرسا داخل بکنیت",
+       "createacct-email-ph": "وتي ایمیل ادرسا داخل بکنیت",
        "createacct-another-email-ph": "ایمیل ادرسی داخل کورتین",
        "createaccountmail": "استفاده شه تصادفین پاسوردا و آیی دیم داتین بی مشخصین ایمیل ادرسیا",
        "createacct-realname": "واقئین نام (اختیاری)",
        "createaccountreason": "دلیل:",
        "createacct-reason": "دلیل",
        "createacct-reason-ph": "پچی شما لوٹیت که دیگرین کار زوروکین حساب جوڑ کنیت؟",
-       "createacct-submit": "وتئ کار زوروکین حسابا جوڑ کنیت",
+       "createacct-submit": "وتي کار زوروکین حسابا جوڑ کنیت",
        "createacct-another-submit": "دیگرین کار زوروکین حسابئ جوڑ کورتین",
        "createacct-benefit-heading": "ای {{SITENAME}} چو شمیا همیرنگین مردمانی واسطه ئا جوڑ بوته",
        "createacct-benefit-body1": "{{PLURAL:$1|ایڈیٹ}}",
        "subject": "موضو/ئنوان:",
        "minoredit": "ای یک گونڈین ایڈیٹئ است",
        "watchthis": "دیستین ای تاکدیمی",
-       "savearticle": "اÛ\8c ØªØ§Ú©Ø¯Û\8cÙ\85 Ø°Ø®Û\8cرÙ\87 Ø¨Û\8cئت",
+       "savearticle": "تاکدÛ\8cÙ\85ئ Ø³Ø§ØªÛ\90تÛ\8cÙ\86",
        "preview": "دیم دیست",
        "showpreview": "دیم دیست",
        "showdiff": "تغیراتانئ نشان داتین",
        "previousrevision": "→ قدیمین نخسه",
        "nextrevision": "نوکین نخسه ←",
        "currentrevisionlink": "انونین نخسه یی نشان داتین",
-       "cur": "فعلی",
+       "cur": "انونین",
        "next": "بعدی",
        "last": "دیمتیرین",
        "page_first": "اولین",
        "difference-title": "$1: نخسه ئانی مانجینا فرق",
        "difference-title-multipage": "$1 و $2:تاکدیمانئ مانجینی فرق",
        "difference-multipage": "(تاکدیمانی مانجینا فرق)",
-       "lineno": "سطر $1:",
+       "lineno": "$1‌ئین سطر:",
        "compareselectedversions": "انتخاب بوته ئین نخسه ئانی مقایسه",
        "showhideselectedversions": "انتخاب بوته ئین نخسه ئانی پدیداری تغیر",
        "editundo": "خنثی‌ کورتین",
        "search-result-size": "$1 ({{PLURAL:$2|یک کلیمه|$2 کلیمه}})",
        "search-result-category-size": "{{PLURAL:$1|یک عضو|$1 عضو}} ({{PLURAL:$2|یک گۆنڈ تهر|$2 گۆنڈ تهر}}، {{PLURAL:$3|یک فایل|$3 فایل}})",
        "search-redirect": "($1 یي گردینتین)",
-       "search-section": "(بخش $1)",
+       "search-section": "($1 بخش)",
        "search-category": "(تهر  $1)",
        "search-file-match": "(فایلی محتوایی یکرنگی)",
        "search-suggest": "آیا شمی منظور ایش ات: $1",
        "showingresults": "نشان داتین حداکثر {{PLURAL:$1|'''۱''' نتیجه|'''$1''' نتیجه}} بی جهلگا، شرو شه شماره ئی  '''$2'''.",
        "showingresultsinrange": "نمایش بی جهلگا {{PLURAL:$1|<strong>1</strong> نتیجه|<strong>$1</strong> نتیجه}} بی محدودهٔ ئی #<strong>$2</strong> تا #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|نتیجه ئان <strong>$1</strong> شه <strong>$3</strong>|نتیجه ئان <strong>$1 - $2</strong> شه <strong>$3</strong>}}",
-       "search-nonefound": "نتیجه په چیزی که شما لوٹیته تیت بی دست نه یات.",
+       "search-nonefound": "نتیجه په چیزی که شما لوٹیته‌تیت به‌دست نه یات.",
        "powersearch-legend": "پیشرفته ئین گشتین",
        "powersearch-ns": "گشتین بی نامئ فضائان:",
        "powersearch-togglelabel": "چیک کورتین:",
        "recentchanges-noresult": "هیچ تغیری بئ تعین بوته ئین دوره ئی تا گۆ ای معیاران هموانی نداشت.",
        "recentchanges-feed-description": "به ائ ویکیێ تا نۆکین و آخیرئین تغیرانه به ای فیڈئ تا بگیندێت.",
        "recentchanges-label-newpage": "ای ایڈیٹ نوکین تاکدیمی ئا جوڑ کورت",
-       "recentchanges-label-minor": "ای یک گونڈین ایڈیٹئ است",
-       "recentchanges-label-bot": "ای ایڈیٹا یک ربات ئی کورته",
+       "recentchanges-label-minor": "ای یک گونڈین ایڈیٹئ اینت",
+       "recentchanges-label-bot": "ای ایڈیٹا یک رباتئی کورته",
        "recentchanges-label-unpatrolled": "ای ایڈیٹ تا انون گشت وارته نه بوته",
-       "recentchanges-label-plusminus": "تاکدیمئ حجم بئ ای اندازگ بایٹ ئا تغیر کورته",
+       "recentchanges-label-plusminus": "تاکدیمئ حجم بِه ای اندازگ بایٹ‌ئا تغیر کورته",
        "recentchanges-legend-heading": "<strong>اختصارئان:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همیرنگ بی [[Special:NewPages|نوکین تاکدیمانئ لڑ لیست]] ئا سیل بکنیت)",
        "rcnotefrom": "بِه جهلگا تغیرات شه <strong>$3, $4</strong> (تا <strong>$1</strong> {{PLURAL:$5|نشان داته بوته|نشان داته انت}}).",
        "rcshowhidecategorization-show": "نشان داتین",
        "rcshowhidecategorization-hide": "چیهر داتین",
        "rclinks": "نشان داتین $1 آخیر ئین تغییر بئ $2 اخیرین روچا<br />$3",
-       "diff": "تفاوت",
+       "diff": "فرق",
        "hist": "تاریخچه",
        "hide": "چیهر داتین",
        "show": "نشان داتین",
        "recentchangeslinked-toolbox": "مربوتین تغیراتان",
        "recentchangeslinked-title": "مربوتین تغیراتان گو $1",
        "recentchangeslinked-summary": "بئ جهلگا یک لڑلیست ئی شه آخیرئین ٹگلان گیندیت که بئ تاکدیما لینک بوته انت (یا چَمّی چیهری شریکین تهر) ئانه گیندیت .\nآ تاکدیمان که [[Special:Watchlist|شمی پدگیری لیست]] ئی تا به ینت '''پررنگ''' نشان داته ئه به ینت.",
-       "recentchangeslinked-page": "تاکدیم نام:",
+       "recentchangeslinked-page": "تاکدیمئ نام:",
        "recentchangeslinked-to": "نشان داتین تاکدیماني تغیرات که گۆ ای تاکدیما لینک دارنت",
        "recentchanges-page-added-to-category": "[[:$1]] به تهرئ تا اڈ بوت",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] و {{PLURAL:$2|یک دیم|$2 pages}} به تهرئ تا اڈ بوتنت",
        "filehist-dimensions": "ابعاد",
        "filehist-filesize": "فایلی اندازه",
        "filehist-comment": "کومنیت",
-       "imagelinks": "بی کار گیپتین فایلئ",
+       "imagelinks": "کار گیپتین شه فایلا",
        "linkstoimage": "{{PLURAL:$1|تاکدیم|تاکدیمان}} جهلگین بی اکسا لینک {{PLURAL:$1|داریت|دارنت}}:",
        "linkstoimage-more": "گیشتیر شه $1 تاکدیم گۆ ای فایلا لینک {{PLURAL:$1|داریت|دارنت}}.\nجهلگی لڑ تانا {{PLURAL:$1|اولین لینک|اولین $1 لینک}} گۆ ای دیما نشان ئا دنت.\n[[Special:WhatLinksHere/$2|کامیلین لیست]] هم موجود اینت.",
        "nolinkstoimage": "شه ای فایلا بِه هیچ تاکدیمئ تا کار گیپته نه بوته.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]][[$3|{{PLURAL:$2|یک تکرار|$2 تکرار}}]] داریت.",
        "unusedtemplates": "استفاده نه بوته ئین تراشوانان",
        "unusedtemplateswlh": "دیگه لینک ئان",
-       "randompage": "تصادفی مقاله",
+       "randompage": "تصادفین مقاله",
        "randomincategory": "تصادفین تاکدیم بئ تهر ئی تا",
        "randomincategory-invalidcategory": "«$1» یک موتبرین نامئ په تهر ئان نه اینت.",
        "randomincategory-nopages": "هیچ تاکدیمی بئ  [[:Category:$1|$1]] ئی تهری تا موجود نه اینت.",
        "allpagesto": "تاکدیمانئ نشان داتین الاسئ گو:",
        "allarticles": "موچین تاکدیمان",
        "allinnamespace": "موچین تاکدیمان ($1 نامی فضا)",
-       "allpagessubmit": "برا",
+       "allpagessubmit": "بررÙ\87",
        "allpagesprefix": "تاکدیمانی نمایش گۆ دیمۆندا:",
        "allpagesbadtitle": "شمی درخواستین ئنوان ناموتبر،خالی،یا میان زبانین یا میان ویکی ئین ئنوان و یا شه خرابین لینکی است.\nممکن اینت که یک یا چینکه نویسگ داشته بیئت که نتوانن آوانا بئ تاکدیمانی ئنوانانی تا استیپاده کنن.",
        "allpages-bad-ns": "{{SITENAME}} ، «$1» ئی نامی فضا ئا نداریت.",
        "deleteprotected": "شما نه توانیت که ای تاکدیما پاک کنیت چون که شه آیی محافظت بوته.",
        "deleting-backlinks-warning": "''' هشدار:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|دیگرین تاکدیم]] هستنت که گۆ ای تاکدیما که شما ئه لوٹیت آیرا پاک بکنیت لینک بوته انت.",
        "rollback": "ایڈیٹئ بیئرگردینتین",
-       "rollbacklink": "بÛ\8cجا Ø¢Ù\88رتین",
+       "rollbacklink": "بÛ\8cرگردÛ\8cÙ\86â\80\8cتین",
        "rollbacklinkcount": "بیئرگردینتین $1 {{PLURAL:$1|ایڈیٹ|ایڈیٹ هانئ}}",
        "rollbacklinkcount-morethan": "بیئرگردینتین گیشتیر شه $1 ایڈیٹا",
        "rollbackfailed": "بیئرگردینته نه بوت",
        "blocklink": "بلاک یا بستین",
        "unblocklink": "پاچ یا انبلاک بێت",
        "change-blocklink": "بلاک ئی تغیرداتین",
-       "contribslink": "مشارکت ئان",
+       "contribslink": "شراکت‌ئان",
        "emaillink": "ایمیلی دیم داتین",
        "blocklogpage": "کورمئ بستین",
        "blocklogentry": "«[[$1]]» ئا تا $2 بست $3",
        "tooltip-pt-preferences": "{{GENDER:|شمئ}} تنظیماتان",
        "tooltip-pt-watchlist": "آ دیمانی لیست که شما آوانی تغیرانا پدگیری ئا کنیت",
        "tooltip-pt-mycontris": "{{GENDER:|شمئ}} شراکتاني لڑ",
-       "tooltip-pt-login": "توصیه ئه کنن که بئ سایٹ ئی تا داخل بئیت. اگرچه که ای کار په جبر و زور نه اینت",
+       "tooltip-pt-login": "توصیه ئه کنن که بِه سایٹ‌ئی تا داخل به‌ئێت. اگرچه ای کار په جبر و زور نه اینت",
        "tooltip-pt-logout": "در بوتین",
-       "tooltip-pt-createaccount": "شه شما ئه لوٹن که په وت یک کار زوروکئ حساب ئی جۆڑ بکنیت و بئ سایٹ ئی تا داخل بئیت؛هرچینکه که ای کار جبری نه اینت",
+       "tooltip-pt-createaccount": "شه شما ئه لوٹن که په وت یک کار زوروکین حساب‌ئی جۆڑ بکنیت و بِه سایٹ‌ئی تا داخل به‌ئێت؛هرچینکه که ای کار جبری نه اینت",
        "tooltip-ca-talk": "ای دیمی محتوا ئانی باره ئا حبر و گپ",
        "tooltip-ca-edit": "شما ئا توانیت که ای دیما ایڈیٹ بکنیت. مهربانی بکنیت دیم شه ایشی که ای دیما ذخیره بکنیت، شه دیم دیست ئا استفاده بکنیت.",
        "tooltip-ca-addsection": "نوکین بخشی جۆڑ بکنیت",
        "tooltip-ca-move": "ای تاکدیمی انتقال",
        "tooltip-ca-watch": "اضافه کورتین ای تاکدیمی بی نی واچلیستی تا",
        "tooltip-ca-unwatch": "ڈیلیٹ کورتین ای تاکدیمی شه نی واچلیستی لڑ لیستا",
-       "tooltip-search": "گشتین بی {{SITENAME}}",
-       "tooltip-search-go": "اگÙ\87 Ø§Ù\85کاÙ\86 Ø¯Ø§Ø´ØªÙ\87 Ø¨Û\8cئت ØªØ§Ú©Ø¯Û\8cÙ\85Û\8c ØªØ§ Ú¯Ù\88 Ø§Û\8c Ù\86اÙ\85ا Ø¨Ø±Ø§",
-       "tooltip-search-fulltext": "گشتین په ای کلمه ئی خاتیرا بی تاکدیمانی تا",
+       "tooltip-search": "گشتین بِه {{SITENAME}}‌ئی تا",
+       "tooltip-search-go": "اگÙ\87 Ø§Ù\85کاÙ\86 Ø¯Ø§Ø´ØªÙ\87 Ø¨Û\90ت Ø¨Ù\87 Ø§Û\8c Ù\86اÙ\85 Ù\88Ù\84ائÛ\8cÙ\86 ØªØ§Ú©Ø¯Û\8cÙ\85Û\8c ØªØ§ Ø¨Ø±Ø±Ù\87",
+       "tooltip-search-fulltext": "به تاکدیمانی تا گشتین په ای کلمه‌ئی خاتیرا",
        "tooltip-p-logo": "بُنیاد ئین تاکدیمی دیستین",
        "tooltip-n-mainpage": "بُنیاد ئین تاکدیمی دیستین",
        "tooltip-n-mainpage-description": "بُنیاد ئین تاکدیمی دیستین",
-       "tooltip-n-portal": "بی پروژه ئی موریدا٬ آنچه که توانیت انجام دهیت و ای که چی چیزی ئا شه گوجا ودی بکنیت",
+       "tooltip-n-portal": "بِه پروژه‌ئی موریدا٬ آنچه که توانێت انجام دهیت و ای که چی چیزی‌ئا شه گوجا ودی بکنێت",
        "tooltip-n-currentevents": "پدزمینه ئین مئلوماتئ بدست آورتین شه انونین رویداد ئان",
        "tooltip-n-recentchanges": "ائ ویکیێ نۆکین و آخیرئین تغیراني لڑ",
-       "tooltip-n-randompage": "یک تصادفی ئین دیمی آورتین",
-       "tooltip-n-help": "جای په ودی کورتین ئا",
+       "tooltip-n-randompage": "یک تصادفیئین دیمی آورتین",
+       "tooltip-n-help": "جاگه په ودي کورتین‌ئا",
        "tooltip-t-whatlinkshere": "موچین تاکدیمانی لڑ لیست که گۆ ای دیما لینک وارته انت",
        "tooltip-t-recentchangeslinked": "تاکدیمانئ آخیرین تغیران که ای دیم گۆ آوان لینک داریت",
        "tooltip-feed-rss": "آراس‌اس ئی خبرنامه په ای تاکدیما",
        "tooltip-ca-nstab-help": "دیستین کومکی تاکدیمئ",
        "tooltip-ca-nstab-category": "دیستین تهری تاکدیمی",
        "tooltip-minoredit": "ای ایڈیٹ ئا گۆنڈ ایڈیٹ نشانگ کن",
-       "tooltip-save": "وتئ تغیرانا ذخیره بکنیت",
-       "tooltip-preview": "شمی تغیرانی دیم دیست، مهربانی بکنیت دیما شه تاکدیمی ذخیره کورتینا شه ای کیلی ئا استفاده بکنیت.",
-       "tooltip-diff": "شمی تغیرانی نمایش که شما بئ متن ئی تا داته ایت.",
+       "tooltip-save": "وتي تغیرانا ذخیره بکنیت",
+       "tooltip-preview": "شمئ تغیرانی دیم دیست، مهربانی بکنیت دیما شه تاکدیمی ذخیره کورتینا شه ای کیلی ئا استفاده بکنیت.",
+       "tooltip-diff": "شمی تغیرانی نمایش که شما بِه متن‌ئی تا داته ایت.",
        "tooltip-compareselectedversions": "ای تاکدمئ دو انتخاب بوته ئین نخسه ئاني فرقاني دیستین",
        "tooltip-watch": "ای دیما به وتي واچلیست یا پدگیری لیستئ تا اڈڈ بکنیت",
        "tooltip-watchlistedit-normal-submit": "ئنوانانی پاک کورتین",
        "pageinfo-hidden-categories": "چیهرین {{PLURAL:$1| تهر|تهر هان}} ( $1 )",
        "pageinfo-templates": "{{PLURAL:$1|تراشوان|تراشوان}} استفاده‌ بوته ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|تاکدیم|تاکدیمان}} ترانسکلوڈ بوتگ بئ ($1) تا",
-       "pageinfo-toolboxlink": "تاکدÛ\8cÙ\85ئ Ù\85ئلومات",
+       "pageinfo-toolboxlink": "تاکدÛ\8cÙ\85ئ Ù\85الومات",
        "pageinfo-redirectsto": "تغییر مسیر بی",
        "pageinfo-redirectsto-info": "مئلومات",
        "pageinfo-contentpage": "هیساب بوته بئ ئنوان مهتوائین دیمی",
        "exif-copyright": "کاپی رایٹ ئی واوُند",
        "exif-exifversion": "exif ئی نخسه",
        "exif-flashpixversion": "Flashpix ئی پُشتیوانی بوته ئین نخسه",
-       "exif-colorspace": "رنگانئ فضا",
+       "exif-colorspace": "رنگاني فضا",
        "exif-componentsconfiguration": "هریک شه مووله په ئانی مانا",
        "exif-compressedbitsperpixel": "اکس ئی پشرده ئی هالت",
        "exif-pixelydimension": "اکسئ گۆر",
index c0742ed..cf66e2b 100644 (file)
        "recentchanges-label-bot": "इ संपादन एगो बॉट द्वारा कइल गइल बा",
        "recentchanges-label-unpatrolled": "ए संपादन के अभिन ले जाँचल नइखे गइल",
        "recentchanges-label-plusminus": "एतना बाइटस् से पन्ना के साइज बदलल गइल",
-       "recentchanges-legend-heading": "'''संकेत:'''",
+       "recentchanges-legend-heading": "<strong>संकेत:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (इहो देखीं [[Special:NewPages|नया पन्नवन के लिस्ट]])",
        "rclistfrom": "$2, $3 से शुरु नया बदलाव देखाईं",
        "rcshowhideminor": "$1 छोट संपादन",
index 8185527..570797a 100644 (file)
        "category-media-header": "\"$1\" বিষয়শ্রেণীতে অন্তর্ভুক্ত মিডিয়া ফাইলগুলি",
        "category-empty": "''এই বিষয়শ্রণীতে বর্তমানে কোন পাতা বা মিডিয়া ফাইল নেই।''",
        "hidden-categories": "{{PLURAL:$1|লুকায়িত বিষয়শ্রেণী|লুকায়িত বিষয়শ্রেণীসমূহ}}",
-       "hidden-category-category": "লুকায়িত বিষয়শ্রেণীসমূহ",
+       "hidden-category-category": "লà§\81à¦\95à§\8dà¦\95ায়িত à¦¬à¦¿à¦·à¦¯à¦¼à¦¶à§\8dরà§\87ণà§\80সমà§\82হ",
        "category-subcat-count": "{{PLURAL:$2|এই বিষয়শ্রেণীতে কেবলমাত্র নিচের উপবিষয়শ্রেণীটি আছে।|এই বিষয়শ্রেণীতে অন্তর্ভুক্ত মোট $2টি উপবিষয়শ্রেণীর মধ্যে {{PLURAL:$1|টি উপবিষয়শ্রেণী|$1টি উপবিষয়শ্রেণী}} নিচে দেখানো হয়েছে।}}",
        "category-subcat-count-limited": "এই বিষয়শ্রেণীতে নিচের {{PLURAL:$1|টি উপবিষয়শ্রেণী|$1টি উপবিষয়শ্রেণী আছে}}।",
        "category-article-count": "{{PLURAL:$2|এই বিষয়শ্রেণীতে কেবল নিচের পাতাটি আছে।|এই বিষয়শ্রেণীতে অন্তর্ভুক্ত মোট $2টি পাতার মধ্যে {{PLURAL:$1|টি পাতা|$1টি পাতা}} নিচে দেখানো হল।}}",
        "moredotdotdot": "আরও...",
        "morenotlisted": "এটি একটি অসম্পূর্ণ তালিকা।",
        "mypage": " পাতা",
+       "anonuserpage": "অজানা ব্যবহারকারী",
        "mytalk": "আলোচনা",
        "anontalk": "আলাপ",
        "navigation": "পরিভ্রমণ",
        "revdelete-unsuppress": "সংশোধন পুনঃস্থাপনের উপর সীমাবদ্ধতা দূর করো",
        "revdelete-log": "কারণ:",
        "revdelete-submit": "নির্বাচিত {{PLURAL:$1|সংশোধনে|সংশোধসমূহে}} প্রয়োগ করো",
-       "revdelete-success": "'''সংশোধন দৃশ্যমানতা সফলভাবে হালনাগাদ করা হয়েছে।'''",
+       "revdelete-success": "সংশোধনের দৃশ্যমানতা হালনাগাদ করা হয়েছে।",
        "revdelete-failure": "সংশোধনের দৃশ্যমানতা হালনাগাদ করা যায়নি:\n$1",
        "logdelete-success": "'''ঘটনা দৃশ্যমানতা সফলভাবে স্থাপন করা হয়েছে।'''",
        "logdelete-failure": "'''লগ-এর দৃশ্যমানতা নির্ধারণ সম্ভব হচ্ছে না:'''\n$1",
        "allowemail": "অন্য ব্যবহারকারীদেরকে আপনাকে ই-মেইল পাঠানোর অনুমতি দিন।",
        "prefs-searchoptions": "অনুসন্ধান",
        "prefs-namespaces": "নামস্থানসমূহ",
-       "default": "à¦\86দি à¦\85বসà§\8dথা",
+       "default": "পà§\82রà§\8dবনিরà§\8dধারিত",
        "prefs-files": "ফাইল",
        "prefs-custom-css": "স্বনির্ধারিত CSS",
        "prefs-custom-js": "স্বনির্ধারিত JS",
        "changecontentmodel-title-label": "পাতার শিরোনাম",
        "changecontentmodel-model-label": "পাতার বিষয়বস্তুর প্রতিরূপ",
        "changecontentmodel-reason-label": "কারণ:",
+       "changecontentmodel-submit": "পরিবর্তন করুন",
        "changecontentmodel-success-title": "বিষয়বস্তুর প্রতিরূপ পরিবর্তিত হয়েছিলো",
        "changecontentmodel-success-text": "[[:$1]]-এর বিষয়বস্তুর ধরণ পরিবর্তন হয়েছে।",
        "log-name-contentmodel": "বিষয়বস্তুর মডেল পরিবর্তন লগ",
        "mw-widgets-titleinput-description-new-page": "পাতা এখনো বিদ্যমান নয়",
        "mw-widgets-titleinput-description-redirect": "$1-এ পুনঃনির্দেশিত",
        "api-error-blacklisted": "অনুগ্রহ করে অপর কোনো বর্ণনামূলক নাম ব্যবহার করুন।",
-       "sessionmanager-tie": "একাধিক অনুরোধের প্রমাণীকরণের ধরন একত্রিত করা যাবে না: $1.",
+       "sessionmanager-tie": "একাধিক অনুরোধের প্রমাণীকরণের ধরন একত্রিত করা যাবে না: $1",
        "sessionprovider-generic": "$1টি সেশন",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "কুকি-ভিত্তিক সেশন",
        "sessionprovider-nocookies": "কুকি নিষ্ক্রিয় করা। নিশ্চিত করুন যে আপনার কুকি সক্রিয় আছে এবং আবার শুরু করুন।",
index 6abf1d9..c542737 100644 (file)
        "recentchanges-label-bot": "Gant ur bot eo bet degaset ar c'hemm-mañ.",
        "recentchanges-label-unpatrolled": "N'eo ket bet gwiriet ar c'hemm-mañ evit c'hoazh.",
        "recentchanges-label-plusminus": "Kemmet eo ment ar bajenn eus an niver-mañ a oktedoù",
-       "recentchanges-legend-heading": "'''Alc'hwez :'''",
+       "recentchanges-legend-heading": "<strong>Alc'hwez :</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (gwelet ivez [[Special:NewPages|roll ar pajennoù nevez]])",
        "rcnotefrom": "Setu aze roll ar c'hemmoù c'hoarvezet abaoe an <strong>$2</strong> (<strong>$1</strong> d'ar muiañ).",
        "rclistfrom": "Diskouez ar c'hemmoù diwezhañ abaoe an/ar $3 $2",
index 50c03e5..6ded141 100644 (file)
        "mypreferencesprotected": "Nemate dozvolu da uređujete svoje postavke.",
        "ns-specialprotected": "Specijalne stranice se ne mogu uređivati.",
        "titleprotected": "Ovaj naslov stranice je od pravljenja [[User:$1|{{GENDER:$1|zaštitio $1|zaštitila $1}}]].\nRazlog: <em>$2</em>.",
-       "filereadonlyerror": "Ne mogu promijeniti datoteku \"$1\" jer je skladište datoteka \"$2\" zaključano samo za čitanje.\n\nAdministrator koji ga je zaključao naveo je ovo objašnjenje: \"$3\".",
+       "filereadonlyerror": "Ne mogu promijeniti datoteku \"$1\" jer je skladište datoteka \"$2\" zaključano samo za čitanje.\n\nSistemski administrator koji ga je zaključao naveo je ovo objašnjenje: \"$3\".",
        "invalidtitle-knownnamespace": "Neispravan naslov s imenskim prostorom \"$2\" i tekstom \"$3\"",
        "invalidtitle-unknownnamespace": "Neispravan naslov s imenskim prostorom br. $1 i tekstom \"$2\"",
        "exception-nologin": "Niste prijavljeni",
        "nocookieslogin": "{{SITENAME}} koristi kolačiće (''cookies'') da bi se korisnici prijavili.  Vi ste onemogućili kolačiće na Vašem kompjuteru.  Molimo Vas da ih omogućite i da pokušate ponovo sa prijavom.",
        "nocookiesfornew": "Korisnički račun nije napravljen, jer nismo mogli da potvrdimo njegov izvor.\nProvjerite da li su cookies omogućeni, ponovo učitajte ovu stranicu i pokušajte ponovo.",
        "noname": "Niste izabrali ispravno korisničko ime.",
-       "loginsuccesstitle": "Prijavljivanje uspješno",
+       "loginsuccesstitle": "Prijavljen",
        "loginsuccess": "'''Sad ste prijavljeni na {{SITENAME}} kao \"$1\".'''",
        "nosuchuser": "Ne postoji korisnik s imenom \"$1\".\nKorisnička imena razlikuju velika i mala slova.\nProvjerite Vaš unos ili [[Special:UserLogin/signup|napravite novi korisnički račun]].",
        "nosuchusershort": "Ne postoji korisnik s imenom \"$1\".\nProvjerite jeste li dobro ukucali.",
        "wrongpasswordempty": "Lozinka koju ste unijeli je bila prazna.\nMolimo Vas da pokušate ponovno.",
        "passwordtooshort": "Lozinka mora imati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}.",
        "passwordtoolong": "Lozinke ne mogu biti duže od {{PLURAL:$1|jednog znaka|$1 znaka|$1 znakova}}.",
-       "password-name-match": "Vaša šifra mora biti različita od Vašeg korisničkog imena.",
+       "password-name-match": "Vaša lozinka mora biti različita od Vašeg korisničkog imena.",
        "password-login-forbidden": "Korištenje ovih korisničkih imena i šifara je zabranjeo.",
        "mailmypassword": "Poništi lozinku",
-       "passwordremindertitle": "{{SITENAME}} - privremena šifra",
-       "passwordremindertext": "Neko (vjerovatno Vi, sa IP adrese $1) je zahtjevao da vam pošaljemo novu šifru za {{SITENAME}}  ($4). Privremena šifra za korisnika \"$2\" je napravljena i glasi \"$3\". Ako ste to željeli, sad treba da se prijavite i promjenite šifru.\nVaša privremena šifra će isteči za {{PLURAL:$5|$5 dan|$5 dana}}.\n\nAko je neko drugi napravio ovaj zahtjev ili ako ste se sjetili vaše šifre i ne želite više da je promjenite, možete da ignorišete ovu poruku i da nastavite koristeći vašu staru šifru.",
+       "passwordremindertitle": "Privremena lozinka za {{GRAMMAR:akuzativ|{{SITENAME}}}}",
+       "passwordremindertext": "Neko (vjerovatno Vi, s IP adrese $1) zathijevao je da Vam pošaljemo novu lozinku za {{GRAMMAR:akuzativ|{{SITENAME}}}} ($4). Privremena lozinka za korisnika \"$2\" napravljena je i glasi \"$3\". Ako ste to željeli, sad se trebate prijaviti i promijeniti lozinku.\nVaša privremena lozinku isteći će za {{PLURAL:$5|$5 dan|$5 dana}}.\n\nAko je neko drugi napravio ovaj zahtjev ili ako ste se u međuvremenu sjetili Vaše lozinke i više je ne želite promijeniti, možete ignorirati ovu poruku i nastaviti da koristite Vašu staru lozinku.",
        "noemail": "Ne postoji adresa e-pošte za korisnika \"$1\".",
        "noemailcreate": "Morate da navedete validnu e-mail adresu",
-       "passwordsent": "Nova šifra je poslata na adresu e-pošte korisnika \"$1\".\nMolimo Vas da se prijavite nakon što je primite.",
-       "blocked-mailpassword": "Da bi se spriječila nedozvoljena akcija, Vašoj IP adresi je onemogućeno uređivanje stranica kao i mogućnost zahtijevanje nove šifre.",
+       "passwordsent": "Nova lozinka poslana je na adresu e-pošte korisnika \"$1\".\nMolimo Vas da se prijavite nakon što je primite.",
+       "blocked-mailpassword": "Da bi se spriječila nedozvoljena akcija, Vašoj IP adresi je onemogućeno uređivanje stranica kao i mogućnost zahtijevanje nove lozinke.",
        "eauthentsent": "Na navedenu adresu e-pošte poslana je poruka s potvrdom.\nPrije nego što pošaljemo daljnje poruke, pratite uputstva s e-pošte da biste potvrdili da je račun zaista Vaš.",
-       "throttled-mailpassword": "Već Vam je poslan e-mail za promjenu šifre u {{PLURAL:$1|posljednjih sat vremena|posljednja $1 sata|posljednjih $1 sati}}.\nDa bi se spriječila zloupotreba, može se poslati samo jedan e-mail za promjenu šifre {{PLURAL:$1|svakih sat vremena|svaka $1 sata|svakih $1 sati}}.",
+       "throttled-mailpassword": "Već Vam je poslana e-poruka za promjenu lozinke u {{PLURAL:$1|posljednjih sat vremena|posljednja $1 sata|posljednjih $1 sati}}.\nDa bi se spriječila zloupotreba, može se poslati samo jedna e-poruka za promjenu lozinke {{PLURAL:$1|svakih sat vremena|svaka $1 sata|svakih $1 sati}}.",
        "mailerror": "Greška pri slanju e-pošte: $1",
        "acct_creation_throttle_hit": "Posjetioci na ovoj wiki koji koriste Vašu IP adresu su već napravili {{PLURAL:$1|$1 račun|$1 računa}} u zadnjih nekoliko dana, što je najveći broj dopuštenih napravljenih računa za ovaj period.\nKao rezultat, posjetioci koji koriste ovu IP adresu ne mogu trenutno praviti više računa.",
        "emailauthenticated": "Vaša adresa e-pošte potvrđena je $2 u $3.",
        "accountcreated": "Korisnički račun je napravljen",
        "accountcreatedtext": "Korisnički račun za [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|razgovor]]) je napravljen.",
        "createaccount-title": "Pravljenje korisničkog računa za {{SITENAME}}",
-       "createaccount-text": "Neko je napravio korisnički račun za vašu e-mail adresu na {{SITENAME}} ($4) sa imenom \"$2\", i sa šifrom \"$3\".\nTrebali biste se prijaviti i promijeniti šifru.\n\nMožete ignorisati ovu poruku, ako je korisnički račun napravljen greškom.",
+       "createaccount-text": "Neko je napravio korisnički račun za Vašu adresu e-pošte na {{GRAMMAR:dativ|{{SITENAME}}}} ($4) s imenom \"$2\", i s lozinkom \"$3\".\nTrebali biste se prijaviti i promijeniti lozinku.\n\nMožete ignorirati ovu poruku, ako je korisnički račun napravljen greškom.",
        "login-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
-       "login-abort-generic": "Vaša prijava nije bila uspješna – Prekinuto",
+       "login-abort-generic": "Neuspješna prijava – Prekinuto",
        "login-migrated-generic": "Vaš račun je premješten, a vaše korisničko ime više ne postoji na ovoj wiki.",
        "loginlanguagelabel": "Jezik: $1",
        "suspicious-userlogout": "Vaš zahtjev za odjavu je odbijen jer je poslan preko pokvarenog preglednika ili keširanog proksija.",
        "php-mail-error-unknown": "Nepoznata greška u PHP funkciji mail()",
        "user-mail-no-addy": "Pokušaj slanja e-maila bez navedene e-mail adrese.",
        "user-mail-no-body": "Pokušano slanje e-poruke s praznim ili nerazumno kratkim sadržajem.",
-       "changepassword": "Promijeni šifru",
-       "resetpass_announce": "Da biste završili prijavu, morate postaviti novu šifru.",
+       "changepassword": "Promijeni lozinku",
+       "resetpass_announce": "Da biste završili prijavu, morate podesiti novu lozinku.",
        "resetpass_text": "<!-- Unesi tekst ovdje -->",
-       "resetpass_header": "Obnovi šifru za račun",
-       "oldpassword": "Stara šifra:",
-       "newpassword": "Nova šifra:",
-       "retypenew": "Ponovo upišite novu šifru:",
-       "resetpass_submit": "Odredi šifru i prijavi se",
-       "changepassword-success": "Vaša šifra/lozinka je uspiješno promjenjena!",
+       "resetpass_header": "Promjena lozinke računa",
+       "oldpassword": "Stara lozinka:",
+       "newpassword": "Nova lozinka:",
+       "retypenew": "Ponovo upišite novu lozinku:",
+       "resetpass_submit": "Postavi lozinku i prijavi se",
+       "changepassword-success": "Vaša lozinka je promijenjena.",
        "changepassword-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
-       "resetpass_forbidden": "Šifre ne mogu biti promjenjene",
+       "resetpass_forbidden": "Lozinke ne mogu biti promijenjene",
        "resetpass-no-info": "Morate biti prijavljeni da biste pristupili ovoj stranici direktno.",
-       "resetpass-submit-loggedin": "Promijeni šifru",
+       "resetpass-submit-loggedin": "Promijeni lozinku",
        "resetpass-submit-cancel": "Odustani",
-       "resetpass-wrong-oldpass": "Privremena ili trenutna šifra nije validna.\nMožda ste već uspješno promijenili Vašu šifru ili ste tražili novu privremenu šifru.",
+       "resetpass-wrong-oldpass": "Privremena ili trenutna lozinka nije validna.\nMožda ste već promijenili Vašu lozinku ili ste tražili novu privremenu lozinku.",
        "resetpass-recycled": "Molimo resetirajte vašu lozinku u nešto drugo od vaše trenutne lozinke.",
        "resetpass-temp-emailed": "Prijavili ste se sa privremenim kodom iz e-pošte.\nDa biste završili prijavljivanje morate postaviti novu lozinku ovdje:",
-       "resetpass-temp-password": "Privremena šifra:",
-       "resetpass-abort-generic": "Promjenu šifre/lozinke je prekinula ekstenzija.",
+       "resetpass-temp-password": "Privremena lozinka:",
+       "resetpass-abort-generic": "Promjenu lozinke prekinulo je proširenje.",
        "resetpass-expired": "Vaša lozinka je istekla. Postavite novu lozinku da biste se prijavili.",
        "resetpass-expired-soft": "Vaša šifra je istekla i mora se resetirati. Molimo odaberite sada novu šifru ili kliknite  \"{{int:resetpass-submit-cancel}}\" da je resetirate kasnije.",
        "resetpass-validity-soft": "Vaša šifra nije valjana: $1\n\nMolimo odaberite novu šifru ili kliknite \"{{int:resetpass-submit-cancel}}\" da je resetirate kasnije.",
        "newarticle": "(Novi)",
        "newarticletext": "Došli ste na stranicu koja još nema sadržaja.\n*Ako želite unijeti sadržaj, počnite tipkati u prozor ispod ovog teksta.\n*Ako Vam treba pomoć, idite na [$1 stranicu za pomoć].\n*Ako ste ovamo dospjeli slučajno, kliknite na dugme \"Nazad\" (''Back'') u Vašem internetskom pregledniku.",
        "anontalkpagetext": "----''Ovo je stranica za razgovor za anonimnog korisnika koji još nije napravio nalog ili ga ne koristi.\nZbog toga moramo da koristimo brojčanu IP adresu kako bismo identifikovali njega ili nju.\nTakvu adresu može dijeliti više korisnika.\nAko ste anonimni korisnik i mislite da su vam upućene nebitne primjedbe, molimo Vas da [[Special:UserLogin/signup|napravite nalog]] ili se [[Special:UserLogin|prijavite]] da biste izbjegli buduću zabunu sa ostalim anonimnim korisnicima.''",
-       "noarticletext": "Na ovoj stranici trenutno nema teksta.\nMožete [[Special:Search/{{PAGENAME}}|tražiti naslov ove stranice]] na drugim stranicama.\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tražiti u povezanim zapisnicima] ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} urediti ovu stranicu]</span>.",
+       "noarticletext": "Na ovoj stranici trenutno nema teksta.\nMožete [[Special:Search/{{PAGENAME}}|tražiti naslov ove stranice]] na drugim stranicama,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tražiti u povezanim zapisnicima] ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} napraviti ovu stranicu]</span>.",
        "noarticletext-nopermission": "Trenutno nema teksta na ovoj stranici.\nMožete [[Special:Search/{{PAGENAME}}|tražiti ovaj naslov stranice]] na drugim stranicama ili <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti povezane zapisnike]</span>, ali nemate dozvolu da napravite ovu stranicu.",
        "missing-revision": "Uređivanje broj $1 na stranici \"{{FULLPAGENAME}}\" ne postoji.\n\nOvo se obično dešava kad pratite zastarjelu vezu na stranicu koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokolu brisanja].",
        "userpage-userdoesnotexist": "Korisnički račun \"<nowiki>$1</nowiki>\" nije registrovan.\nMolimo provjerite da li želite napraviti/izmijeniti ovu stranicu.",
        "recentchanges-label-bot": "Izmjenu napravio bot",
        "recentchanges-label-unpatrolled": "Ova izmjena još nije patrolirana",
        "recentchanges-label-plusminus": "Promjena veličine stranice u bajtovima",
-       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|spisak novih stranica]])",
        "recentchanges-submit": "Prikaži",
        "rcnotefrom": "Ispod {{PLURAL:$5|je izmjena|su izmjene}} od <strong>$3, $4</strong> (do <strong>$1</strong> prikazano).",
        "foreign-structured-upload-form-label-not-own-work-local-default": "Možete također pokušati koristeći  [[Special:Upload|stranicu za postavljanje na  {{GRAMMAR:dativ|{{SITENAME}}}}]], ako se ova datoteka može postaviti pod tamošnjim pravilima.",
        "foreign-structured-upload-form-label-own-work-message-shared": "Potvrđujem da posjedujem autorska prava za ovu datoteku i slažem se da ću je neopozivo postaviti na Wikimedia Commons pod licencom [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], te se slažem s [https://wikimediafoundation.org/wiki/Terms_of_Use Uvjetima korištenja].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Ako ne posjedujete autorska prava za ovu datoteku ili je želite postaviti pod drugom licencom, imajte na umu da možete koristiti [https://commons.wikimedia.org/wiki/Special:UploadWizard čarobnjak za postavljanje datoteka na Commonsu].",
-       "foreign-structured-upload-form-label-not-own-work-local-shared": "Također možete koristiti [[Special:Upload|stranicu za postavljanje datoteka na projektu {{SITENAME}}]] ako politika stranice dozvoljava postavljanje ove datoteke.",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Također možete koristiti [[Special:Upload|stranicu za postavljanje datoteka na {{GRAMMAR:dativ|{{SITENAME}}}}]] ako pravila te stranice dozvoljavaju postavljanje ove datoteke.",
        "backend-fail-stream": "Ne mogu emitirati datoteku $1.",
        "backend-fail-backup": "Ne može sigurnosno kopirati datoteku $1.",
        "backend-fail-notexists": "Datoteka $1 ne postoji.",
        "javascripttest-pagetext-frameworks": "Molimo Vas izaberite jednu od sljedećih testnih okvira: $1",
        "javascripttest-pagetext-skins": "Izaberite s kojom temom želite da pokrenete probu:",
        "javascripttest-qunit-intro": "Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.",
-       "tooltip-pt-userpage": "Vaša korisnička stranica",
+       "tooltip-pt-userpage": "{{GENDER:|Vaša}} korisnička stranica",
        "tooltip-pt-anonuserpage": "Korisnička stranica za ip koju Vi uređujete kao",
-       "tooltip-pt-mytalk": "Vaša stranica za razgovor",
+       "tooltip-pt-mytalk": "{{GENDER:|Vaša}} stranica za razgovor",
        "tooltip-pt-anontalk": "Razgovor o doprinosu sa ove IP adrese",
-       "tooltip-pt-preferences": "Vaše postavke",
+       "tooltip-pt-preferences": "{{GENDER:|Vaše}} postavke",
        "tooltip-pt-watchlist": "Spisak stranica koje pratite",
-       "tooltip-pt-mycontris": "Spisak vaših doprinosa",
+       "tooltip-pt-mycontris": "Spisak {{GENDER:|Vaših}} doprinosa",
        "tooltip-pt-login": "Predlažemo da se prijavite, ali nije obvezno.",
        "tooltip-pt-logout": "Odjavi me",
        "tooltip-pt-createaccount": "Ohrabrujemo vas da otvorite nalog i prijavite se, međutim to nije obavezno",
        "tooltip-t-recentchangeslinked": "Nedavne izmjene na stranicama koje su povezane sa ovom",
        "tooltip-feed-rss": "RSS za ovu stranicu",
        "tooltip-feed-atom": "Atom za ovu stranicu",
-       "tooltip-t-contributions": "Pogledajte spisak doprinosa ovog korisnika",
+       "tooltip-t-contributions": "Pogledajte spisak doprinosa {{GENDER:$1|ovog korisnika|ove korisnice|ove osobe}}",
        "tooltip-t-emailuser": "Pošaljite pismo ovom korisniku",
        "tooltip-t-info": "Više informacija o ovoj stranici",
        "tooltip-t-upload": "Postavi slike i druge medije",
index de6f9ed..a3dd1b4 100644 (file)
        "moredotdotdot": "Més...",
        "morenotlisted": "Aquesta llista no és completa.",
        "mypage": "Pàgina",
+       "anonuserpage": "Usuari desconegut",
        "mytalk": "Discussió",
        "anontalk": "Discussió",
        "navigation": "Navegació",
        "nocookiesfornew": "No s'ha creat el compte d'usuari, ja que no es podia confirmar el seu origen.\nVerifiqueu que teniu habilitades les galetes al vostre navegador, torneu a carregar aquesta pàgina i intenteu-lo de nou.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
        "noname": "No heu especificat un nom vàlid d'usuari.",
-       "loginsuccesstitle": "S'ha iniciat la sessió amb èxit",
+       "loginsuccesstitle": "Sessió iniciada",
        "loginsuccess": "Heu iniciat la sessió a {{SITENAME}} com a «$1».",
        "nosuchuser": "No hi ha cap usuari anomenat «$1».\nReviseu-ne l'ortografia (recordeu que es distingeixen les majúscules i minúscules), o [[Special:UserLogin/signup|creeu un compte d'usuari nou]].",
        "nosuchusershort": "No hi ha cap usuari anomenat «$1». Comproveu que ho hàgiu escrit correctament.",
        "createaccount-title": "Creació d'un compte a {{SITENAME}}",
        "createaccount-text": "Algú ha creat un compte d'usuari anomenat $2 en el projecte {{SITENAME}}\n($4) amb la vostra adreça de correu electrònic. La contrasenya per a l'usuari «$2» és «$3». Hauríeu d'accedir al compte i canviar-vos aquesta contrasenya com més aviat millor.\n\nSi no hi teniu cap relació i aquest compte s'ha creat per error, simplement ignoreu el missatge.",
        "login-throttled": "Heu realitzat massa intents d'accés a la sessió.\nEspereu $1 abans de tornar-ho a provar.",
-       "login-abort-generic": "L'entrada al compte d'usuari no ha reeixit - S'ha interromput.",
+       "login-abort-generic": "L'inici de sessió ha fallat - Operació anul·lada.",
        "login-migrated-generic": "S'ha migrat el vostre compte, i el vostre nom d'usuari ja no existeix en aquest wiki.",
        "loginlanguagelabel": "Llengua: $1",
        "suspicious-userlogout": "S'ha denegat la vostra petició per a tancar la sessió, ja que sembla que va ser enviada per un navegador defectuós o un servidor intermediari.",
        "newpassword": "Contrasenya nova",
        "retypenew": "Torneu a escriure la nova contrasenya:",
        "resetpass_submit": "Definiu una contrasenya i inicieu una sessió",
-       "changepassword-success": "S'ha canviat la vostra contrasenya amb èxit!",
+       "changepassword-success": "S'ha canviat la vostra contrasenya!",
        "changepassword-throttled": "Heu realitzat massa intents d'inici de sessió.\nEspereu $1 abans de tornar-ho a provar.",
        "botpasswords": "Contrasenyes de bot",
        "botpasswords-disabled": "S'han inhabilitat les contrasenyes dels bots",
        "botpasswords-no-central-id": "Per a utilitzar contrasenyes de bots heu d'haver iniciat una sessió en un compte centralitzat.",
+       "botpasswords-existing": "Contrasenyes de bot existents",
+       "botpasswords-createnew": "Crea una contrasenya de bot nova",
+       "botpasswords-editexisting": "Edita una contrasenya de bot existent",
        "botpasswords-label-appid": "Nom del bot:",
        "botpasswords-label-create": "Crea",
        "botpasswords-label-update": "Actualitza",
        "botpasswords-label-cancel": "Cancel·la",
        "botpasswords-label-delete": "Suprimeix",
        "botpasswords-label-resetpassword": "Reinicia la contrasenya",
+       "botpasswords-label-restrictions": "Restriccions d'ús:",
+       "botpasswords-bad-appid": "",
        "resetpass_forbidden": "No poden canviar-se les contrasenyes",
        "resetpass-no-info": "Heu d'estar registrats en un compte per a poder accedir directament a aquesta pàgina.",
        "resetpass-submit-loggedin": "Canvia la contrasenya",
        "passwordreset-emailtext-ip": "Algú (vós mateix segurament, des de l'adreça IP $1) ha demanat una reinicialització de la vostra contrasenya al projecte {{SITENAME}} ($4). {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:\n\n$2\n\n{{PLURAL:$3|Aquesta contrasenya temporal caducarà|Aquestes contrasenyes temporals caducaran}} en {{PLURAL:$5|un dia|$5 dies}}.\nHauríeu d'entrar al compte per a fixar-hi una nova contrasenya al més aviat possible. Si algú que no sou vós és qui ha fet aquesta petició o si heu recordat la contrasenya original i ja no la voleu canviar, podeu ignorar aquest missatge i seguir utilitzant la vostra antiga contrasenya.",
        "passwordreset-emailtext-user": "L'usuari $1 de {{SITENAME}} ha demanat una reinicialització de la vostra contrasenya per al projecte {{SITENAME}} ($4). {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:\n\n$2\n\n{{PLURAL:$3|Aquesta contrasenya temporal caducarà|Aquestes contrasenyes temporals caducaran}} en {{PLURAL:$5|un dia|$5 dies}}.\nHauríeu d'entrar ara per fixar una nova contrasenya. Si algú que no sou vós és qui ha fet aquesta petició o si heu recordat la contrasenya original i ja no la voleu canviar, podeu ignorar aquest missatge i seguir utilitzant la vostra antiga contrasenya.",
        "passwordreset-emailelement": "Nom d'usuari: \n$1\n\nContrasenya temporal: \n$2",
-       "passwordreset-emailsentemail": "Si aquesta és una adreça electrònica registrada amb el vostre compte, s’hi enviarà un missatge de restabliment de contrasenya.",
+       "passwordreset-emailsentemail": "Si aquesta adreça electrònica està associada al vostre compte, s’enviarà un missatge de restabliment de contrasenya.",
        "passwordreset-emailsent-capture": "S'ha enviat un correu electrònic de reinicialització de contrasenya, tal com es mostra a continuació.",
        "passwordreset-emailerror-capture": "S'ha generat un correu electrònic de renovació de contrasenya, que es mostra a continuació, però ha fallat l'enviament a {{GENDER:$2:l'usuari|la usuària}}: $1",
        "changeemail": "Canvia o elimina l’adreça electrònica",
        "copyrightwarning2": "Si us plau, tingueu en compte que totes les contribucions al projecte {{SITENAME}} poden ser corregides, alterades o esborrades per altres usuaris. Si no desitgeu la modificació i distribució lliure dels vostres escrits sense el vostre consentiment, no els poseu ací.<br />\nA més a més, en enviar el vostre text, doneu fe que és vostra l'autoria, o bé de fonts en el domini públic o altres recursos lliures similars (consulteu $1 per a més detalls).\n'''No feu servir textos amb drets d'autor sense permís!'''",
        "editpage-cannot-use-custom-model": "El model de contingut d'aquesta pàgina no pot ser canviat.",
        "longpageerror": "'''Error: El text que heu introduït és {{PLURAL:$1|d'un kilobyte|de $1 kilobytes}} i sobrepassa el màxim permès de {{PLURAL:$2|one kilobyte|$2 kilobytes}}.'''\nNo es pot desar.",
-       "readonlywarning": "'''Avís: La base de dades està tancada per manteniment, de manera que no podreu desar els canvis ara mateix.'''\nÉs possible que vulgueu copiar i enganxar el text en un arxiu de text i desar-ho més tard.\n\nL'administrador que l'ha bloquejada ha donat la següent explicació: $1",
+       "readonlywarning": "<strong>Avís: La base de dades està tancada per manteniment, de manera que no podreu desar els canvis ara mateix.</strong>\nÉs possible que vulgueu copiar i enganxar el text en un arxiu de text i desar-ho més tard.\n\nL'administrador de sistema que l'ha bloquejada ha donat la següent explicació: $1",
        "protectedpagewarning": "'''ATENCIÓ: Aquesta pàgina està bloquejada i només els usuaris amb drets d'administrador la poden modificar.\nA continuació es mostra la darrera entrada del registre com a referència:",
        "semiprotectedpagewarning": "'''Avís:''' Aquesta pàgina està bloquejada i només pot ser modificada per usuaris registrats.\nA continuació es mostra la darrera entrada del registre com a referència:",
        "cascadeprotectedwarning": "'''Atenció:''' Aquesta pàgina està protegida de forma que només la poden modificar els administradors, ja que està inclosa a {{PLURAL:$1|la següent pàgina|les següents pàgines}} amb l'opció de «protecció en cascada» activada:",
        "permissionserrors": "Error de permisos",
        "permissionserrorstext": "No teniu permisos per a fer-ho, {{PLURAL:$1|pel següent motiu|pels següents motius}}:",
        "permissionserrorstext-withaction": "No teniu permís per a $2, {{PLURAL:$1|pel motiu següent|pels motius següents}}:",
-       "contentmodelediterror": "No podeu modificar aquesta revisió perquè el seu model de contingut és <code>$1</code>, i el model de contingut actual de la pàgina és <code>$2</code>.",
+       "contentmodelediterror": "No podeu modificar aquesta revisió perquè el seu model de contingut és <code>$1</code>, que difereix del model de contingut actual de la pàgina <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Avís: esteu creant una pàgina que s'ha suprimit prèviament.'''\n\nHauríeu de considerar si és realment necessari continuar editant aquesta pàgina.\nA continuació s'ofereix el registre de supressions i de reanomenaments de la pàgina:",
        "moveddeleted-notice": "S'ha suprimit aquesta pàgina.\nA continuació us mostrem com a referència el registre d'esborraments i reanomenaments de la pàgina.",
        "moveddeleted-notice-recent": "S’ha suprimit aquesta pàgina recentment (en les últimes 24 hores).\nA continuació us mostrem com a referència el registre de supressions i reanomenaments de la pàgina.",
        "revdelete-unsuppress": "Suprimir les restriccions de les revisions restaurades",
        "revdelete-log": "Motiu:",
        "revdelete-submit": "Aplica a {{PLURAL:$1|la revisió seleccionada|les revisions seleccionades}}",
-       "revdelete-success": "'''La visibilitat d'aquesta revisió s'ha actualitzat correctament.'''",
+       "revdelete-success": "La visibilitat d'aquesta revisió s'ha actualitzat.",
        "revdelete-failure": "'''La visibilitat de la revisió no ha pogut actualitzar-se:'''\n$1",
        "logdelete-success": "'''S'ha establert correctament la visibilitat d'aquest element.'''",
        "logdelete-failure": "'''No s'ha pogut establir la visibilitat del registre:'''\n$1",
        "mergehistory-empty": "No pot fusionar-se cap revisió.",
        "mergehistory-done": "{{PLURAL:$3|S’ha|S’han}} fusionat correctament $3 {{PLURAL:$3|revisió|revisions}} de $1 a [[:$2]].",
        "mergehistory-fail": "No s'ha pogut realitzar la fusió de l'historial, comproveu la pàgina i els paràmetres horaris.",
+       "mergehistory-fail-bad-timestamp": "La marca horària no és vàlida.",
+       "mergehistory-fail-invalid-source": "La pàgina font no és vàlida.",
+       "mergehistory-fail-invalid-dest": "La pàgina de destinació no és vàlida.",
+       "mergehistory-fail-self-merge": "Les pàgines d'origen i de destinació no poden ser la mateixa",
        "mergehistory-fail-toobig": "No s'ha pogut fer la fusió de l'historial perquè es mourien més del límit de $1 {{PLURAL:$1|revisió|revisions}}.",
        "mergehistory-no-source": "La pàgina d'origen $1 no existeix.",
        "mergehistory-no-destination": "La pàgina de destinació $1 no existeix.",
        "userrights": "Gestió dels permisos d’usuari",
        "userrights-lookup-user": "Gestiona els grups d'usuari",
        "userrights-user-editname": "Introduïu un nom d'usuari:",
-       "editusergroup": "Edita els grups d'usuaris",
+       "editusergroup": "Edita els grups d'{{GENDER:$1|usuari}}",
        "editinguser": "Modificació dels permisos de {{GENDER:$1|l'usuari|la usuària}} <strong>[[User:$1|$1]]</strong>$2",
        "userrights-editusergroup": "Edita els grups d'usuaris",
-       "saveusergroups": "Desa els grups d'usuari",
+       "saveusergroups": "Desa els grups d'{{GENDER:$1|usuari}}",
        "userrights-groupsmember": "Membre de:",
        "userrights-groupsmember-auto": "Membre implícit de:",
        "userrights-groupsmember-type": "$1",
        "userrights-unchangeable-col": "Grups que no podeu canviar",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Conflicte de canvis dels permisos d'usuari. Reviseu i confirmeu els canvis.",
-       "userrights-removed-self": "Heu suprimit els vostres propis permisos correctament. Per tant, ja no podeu tornar a accedir a aquesta pàgina.",
+       "userrights-removed-self": "Heu suprimit els vostres propis permisos. Per tant, ja no podeu tornar a accedir a aquesta pàgina.",
        "group": "Grup:",
        "group-user": "Usuaris",
        "group-autoconfirmed": "Usuaris autoconfirmats",
        "grant-createaccount": "Crea comptes",
        "grant-createeditmovepage": "Crea, modifica i reanomena pàgines",
        "grant-delete": "Suprimeix pàgines, revisions i entrades de registre",
+       "grant-editmywatchlist": "Modifica la llista de seguiment",
+       "grant-editpage": "Modifica les pàgines existents",
+       "grant-editprotected": "Modifica pàgines protegides",
+       "grant-highvolume": "Edició d'alt volum",
+       "grant-oversight": "Amaga usuaris i suprimeix revisions",
+       "grant-uploadfile": "Carrega fitxers nous",
        "newuserlogpage": "Registre de creació d'usuaris",
        "newuserlogpagetext": "Aquest és un registre de creació de nous usuaris.",
        "rightslog": "Registre dels permisos d'usuari",
        "recentchanges-label-bot": "Aquesta modificació fou feta per un bot",
        "recentchanges-label-unpatrolled": "Aquesta modificació encara no s'ha patrullat",
        "recentchanges-label-plusminus": "La mida de la pàgina ha canviat aquest nombre de bytes",
-       "recentchanges-legend-heading": "'''Llegenda:'''",
+       "recentchanges-legend-heading": "<strong>Llegenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vegeu també la [[Special:NewPages|llista de pàgines noves]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Mostra",
        "rcshowhidemine": "$1 edicions pròpies",
        "rcshowhidemine-show": "Mostra",
        "rcshowhidemine-hide": "Amaga",
-       "rcshowhidecategorization": "$1 la categorització de la pàgina",
+       "rcshowhidecategorization": "$1 categoritzacions de pàgina",
        "rcshowhidecategorization-show": "Mostra",
        "rcshowhidecategorization-hide": "Amaga",
        "rclinks": "Mostra els darrers $1 canvis en els darrers $2 dies<br />$3",
        "apisandbox-submit": "Fes sol·licitud",
        "apisandbox-reset": "Neteja",
        "apisandbox-examples": "Exemple",
-       "apisandbox-results": "Resultat",
+       "apisandbox-results": "Resultats",
        "apisandbox-request-url-label": "Sol·licita URL:",
        "apisandbox-request-time": "Temps de sol·licitud: $1",
        "booksources": "Obres de referència",
        "wlshowhideanons": "usuaris anònims",
        "wlshowhidepatr": "edicions supervisades",
        "wlshowhidemine": "les meves edicions",
+       "wlshowhidecategorization": "categorització de pàgines",
        "watchlist-options": "Opcions de la llista de seguiment",
        "watching": "S'està vigilant...",
        "unwatching": "S'està desatenent...",
        "expand_templates_preview": "Previsualitza",
        "expand_templates_preview_fail_html": "<em>Atès que {{SITENAME}} té HTML cru i hi ha hagut una pèrdua de dades de la sessió, s'ha amagat la vista prèvia com a mesura de precaució contra atacs en JavaScript.</em>\n\n<strong>Si això és un intent de previsualització legítim, torneu-ho a provar.</strong>\nSi encara no funciona, intenteu [[Special:UserLogout|finalitzar la sessió]] i iniciar-la de nou.",
        "expand_templates_preview_fail_html_anon": "<em>Atès que {{SITENAME}} té l'HTML cru habilitat i no heu iniciat una sessió, s'ha amagat la previsualització com a prevenció d'atacs en JavaScript.</em>\n\n<strong>Si això és un intent de previsualització legítim, [[Special:UserLogin|inicieu una sessió]] i torneu-ho a provar.</strong>",
-       "pagelanguage": "Selector de l'idioma de les pàgines",
+       "pagelanguage": "Canvia l'idioma de la pàgina",
        "pagelang-name": "Pàgina",
        "pagelang-language": "Idioma",
        "pagelang-use-default": "Utilitza l'idioma per defecte",
        "pagelang-select-lang": "Selecciona un idioma",
+       "pagelang-submit": "Envia",
        "right-pagelang": "Canvia l'idioma de la pàgina",
        "action-pagelang": "canvia l'idioma de la pàgina",
        "log-name-pagelang": "Canvia el registre de llengua",
index 8c4cf3e..cf650ea 100644 (file)
        "tagline": "來源:{{SITENAME}}",
        "help": "幫助",
        "search": "尋討",
-       "searchbutton": "討",
+       "searchbutton": "討",
        "go": "去",
        "searcharticle": "去",
        "history": "頁面歷史",
        "toc": "目錄",
        "showtoc": "顯示",
        "hidetoc": "囥起",
-       "collapsible-collapse": "",
+       "collapsible-collapse": "",
        "collapsible-expand": "現",
        "confirmable-confirm": "汝會確定𣍐?",
        "confirmable-yes": "是",
        "site-atom-feed": "$1原子訂閱",
        "page-rss-feed": "「$1」RSS訂閱",
        "page-atom-feed": "「$1」原子訂閱",
-       "red-link-title": "$1(頁面無敆𡅏)",
+       "red-link-title": "$1(無許頁)",
        "sort-descending": "降序排序",
        "sort-ascending": "升序排序",
        "nstab-main": "頁面",
        "searchrelated": "相關其",
        "searchall": "全部",
        "showingresults": "顯示趁#<b>$2</b>開始其{{PLURAL:$1|'''$1'''萆結果}}。",
+       "search-nonefound": "討毋着",
        "preferences": "設定",
        "mypreferences": "我其設定",
        "prefs-edits": "修改數量:",
        "watchlisttools-view": "看相關改變",
        "watchlisttools-edit": "看共修改監視單",
        "watchlisttools-raw": "修改原始監視單",
-       "specialpages": "特殊頁"
+       "specialpages": "特殊頁",
+       "searchsuggest-search": "討"
 }
index 8658f09..e92e416 100644 (file)
        "redirectedfrom": "($1 дӀасахьажийна кхузе)",
        "redirectpagesub": "АгӀо-дӀасахьажорг",
        "redirectto": "ДӀасахьажор тӀе:",
-       "lastmodifiedat": "Ð¥Ó\80окÑ\85Ñ\83 Ð°Ð³Ó\80онан тӀаьххьара хийцамаш бина: $1, $2.",
+       "lastmodifiedat": "Ð¥Ó\80окÑ\85Ñ\83 Ð°Ð³Ó\80онна тӀаьххьара хийцамаш бина: $1, $2.",
        "viewcount": "ХӀокху агӀонг хьовсийна $1 {{PLURAL:$1|за}}.",
        "protectedpage": "ГӀароллийца йолу агӀо",
        "jumpto": "Дехьа гӀо:",
        "recentchanges-label-bot": "ХӀара нисдар бото дина",
        "recentchanges-label-unpatrolled": "ХӀара нисдар хӀинца цхьано патрулировать дина дац",
        "recentchanges-label-plusminus": "байташкахь барам хийцар",
-       "recentchanges-legend-heading": "'''Легенда:&nbsp;'''",
+       "recentchanges-legend-heading": "<strong>Легенда:&nbsp;</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (хьажа кхин [[Special:NewPages|керла агӀонийн могӀа]])",
        "recentchanges-submit": "Гайта",
        "rcnotefrom": "Лахахь гайтина тӀера <strong>$2</strong> (хийцамаш <strong>$1</strong> кӀезиг).",
        "newtitle": "Керла цӀе",
        "move-watch": "ХӀара агӀо тергаме могӀанан юкъатоха",
        "movepagebtn": "АгӀон цӀе хийца",
-       "pagemovedsub": "АгӀон цӀе хийцина",
+       "pagemovedsub": "АгӀонан цӀе хийцина",
        "movepage-moved": "'''АгӀон цӀе «$1» хийцина → «$2»'''",
        "movepage-moved-redirect": "Кхоьллина дӀасахьажорг.",
        "movepage-moved-noredirect": "ДӀасхьажорг кхоллар дохина.",
        "seconds-abbrev": "$1 оцу",
        "minutes-abbrev": "$1 мин",
        "hours-abbrev": "$1 сахь.",
+       "days-abbrev": "$1 д",
        "seconds": "{{PLURAL:$1|$1 секунд|$1 секунд}}",
        "minutes": "{{PLURAL:$1|$1 минот|$1 минот}}",
        "hours": "{{PLURAL:$1|$1 сахьт}}",
index c3d1797..928a791 100644 (file)
        "recentchanges-label-bot": "ئەم دەستکارییە لە لایەن بۆتەوە کراوە",
        "recentchanges-label-unpatrolled": "ئەم دەستکارییە ھێشتا پاس نەدراوە",
        "recentchanges-label-plusminus": "قەبارەی پەڕە ئەوەندە بایت گۆڕاوە",
-       "recentchanges-legend-heading": "'''کورتکراوەکان:'''",
+       "recentchanges-legend-heading": "<strong>کورتکراوەکان:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ھەروەھا بڕوانە [[Special:NewPages|پێرستی پەڕە نوێکان]])",
        "recentchanges-legend-plusminus": "(''±۱٢٣'')",
        "recentchanges-submit": "نیشانی بدە",
index f4c011f..1bac2e1 100644 (file)
        "recentchanges-label-bot": "Бу бир ботнынъ япкъан денъиштирмеси",
        "recentchanges-label-unpatrolled": "Бу денъиштирме аля даа тешкерильмеген",
        "recentchanges-label-plusminus": "Байт эсабынен саифе буюклигининъ денъиштирильмеси",
-       "recentchanges-legend-heading": "'''Ишаретлер:'''",
+       "recentchanges-legend-heading": "<strong>Ишаретлер:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|янъы саифелер джедвелине]] де бакъынъыз)",
        "rcnotefrom": "<strong>$3, $4</strong> тарихындан башлап япылгъан {{PLURAL:$5|денъиштирме|денъиштирмелер}} ашагъыдадыр (энъ чокъ <strong>$1</strong> дане саифе косьтериле).",
        "rclistfrom": "$3 $2 тарихындан берли япылгъан денъиштирмелерни косьтер",
index 301dba4..9333f95 100644 (file)
        "recentchanges-label-bot": "Bu bir botnıñ yapqan deñiştirmesi",
        "recentchanges-label-unpatrolled": "Bu deñiştirme alâ daa teşkerilmegen",
        "recentchanges-label-plusminus": "Bayt esabınen saife büyükliginiñ deñiştirilmesi",
-       "recentchanges-legend-heading": "'''İşaretler:'''",
+       "recentchanges-legend-heading": "<strong>İşaretler:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|yañı saifeler cedveline]] de baqıñız)",
        "rcnotefrom": "<strong>$3, $4</strong> tarihından başlap yapılğan {{PLURAL:$5|deñiştirme|deñiştirmeler}} aşağıdadır (eñ çоq <strong>$1</strong> dane saife kösterile).",
        "rclistfrom": "$3 $2 tarihından berli yapılğan deñiştirmelerni köster",
index 45e2766..ab0092a 100644 (file)
@@ -28,7 +28,8 @@
                        "לערי ריינהארט",
                        "Cvanca",
                        "Macofe",
-                       "Urbanecm"
+                       "Urbanecm",
+                       "LordMsz"
                ]
        },
        "tog-underline": "Podtrhávat odkazy:",
@@ -63,7 +64,7 @@
        "tog-watchlisthidebots": "Na seznamu sledovaných stránek skrýt editace botů",
        "tog-watchlisthideminor": "Na seznamu sledovaných stránek skrýt malé editace",
        "tog-watchlisthideliu": "Na seznamu sledovaných stránek skrýt editace přihlášených uživatelů",
-       "tog-watchlistreloadautomatically": "Při změně nastavení automaticky aktualizovat seznam sledovaných stránek (vyžaduje JavaScript)",
+       "tog-watchlistreloadautomatically": "Při změně filtru automaticky aktualizovat seznam sledovaných stránek (vyžaduje JavaScript)",
        "tog-watchlisthideanons": "Na seznamu sledovaných stránek skrýt editace nepřihlášených uživatelů",
        "tog-watchlisthidepatrolled": "Skrýt prověřené editace ve sledovaných stránkách",
        "tog-watchlisthidecategorization": "Skrýt kategorizaci stránek",
        "moredotdotdot": "Další…",
        "morenotlisted": "Tento seznam není úplný.",
        "mypage": "Stránka",
+       "anonuserpage": "Neznámý uživatel",
        "mytalk": "Diskuse",
        "anontalk": "Diskuse",
        "navigation": "Navigace",
        "directoryreadonlyerror": "Adresář „$1“ je pouze pro čtení.",
        "directorynotreadableerror": "Adresář „$1“ nelze číst.",
        "filenotfound": "Nebylo možné najít soubor „$1“.",
-       "unexpected": "Neočekávaná hodnota: \"$1\"=\"$2\".",
+       "unexpected": "Neočekávaná hodnota: „$1“=„$2“.",
        "formerror": "Chyba: nebylo možné odeslat formulář",
        "badarticleerror": "Tuto činnost nelze na této stránce provést.",
        "cannotdelete": "Nebylo možné smazat stránku nebo soubor „$1“.\nMožná už byl(a) smazán(a) někým jiným.",
        "title-invalid-empty": "Požadovaný název stránky je prázdný nebo obsahuje pouze název jmenného prostoru.",
        "title-invalid-utf8": "Požadovaný název stránky obsahuje neplatnou sekvenci UTF-8.",
        "title-invalid-interwiki": "Požadovaný název stránky obsahuje interwiki odkaz, který nelze v názvech používat.",
-       "title-invalid-talk-namespace": "Požadovaný název stránky odkazuje na diskusní stránku, která neexistuje.",
+       "title-invalid-talk-namespace": "Požadovaný název stránky odkazuje na diskusní stránku, která nemůže existovat.",
        "title-invalid-characters": "Požadovaný název stránky obsahuje neplatné znaky: „$1“.",
        "title-invalid-relative": "Název obsahuje relativní cestu. Relativní názvy stránek (./, ../) jsou neplatné, protože často budou nedostupné, když je zpracuje prohlížeč uživatele.",
        "title-invalid-magic-tilde": "Požadovaný název stránky obsahuje neplatnou magickou posloupnost vlnovek (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "Požadovaný název stránky je příliš dlouhý. V kódování UTF-8 nesmí být delší než $1 {{PLURAL:$1|bajt|bajty|bajtů}}.",
-       "title-invalid-leading-colon": "Požadovaný název stránku na začátku obsahuje neplatnou dvojtečku.",
+       "title-invalid-leading-colon": "Požadovaný název stránky na začátku obsahuje neplatnou dvojtečku.",
        "perfcached": "Následující data jsou z cache a nemusí být plně aktuální. Cache může obsahovat maximálně {{PLURAL:$1|jeden výsledek|$1 výsledky|$1 výsledků}}.",
        "perfcachedts": "Následující data jsou z cache, která byla naposledy aktualizována $1. Cache může obsahovat maximálně {{PLURAL:$4|jeden výsledek|$4 výsledky|$4 výsledků}}.",
        "querypage-no-updates": "Aktualizace této stránky je vypnuta. Data nyní nebudou obnovována.",
        "editinginterface": "<strong>Upozornění:</strong> Editujete stránku, která definuje texty rozhraní.\nZměny této stránky ovlivní vzhled uživatelského rozhraní všem uživatelům této wiki.",
        "translateinterface": "Pro přidávání a změny překladů pro všechny wiki použijte [//translatewiki.net/ translatewiki.net], projekt pro lokalizaci MediaWiki.",
        "cascadeprotected": "Tato stránka je zamčena, neboť je vložena na {{PLURAL:$1|následující stránku, zamčenou|následující stránky, zamčené}} kaskádovým zámkem:\n$2",
-       "namespaceprotected": "Nemáte povoleno editovat stránky ve jmenném prostoru '''$1'''.",
+       "namespaceprotected": "Nemáte povoleno editovat stránky ve jmenném prostoru <strong>$1</strong>.",
        "customcssprotected": "Nemáte povoleno editovat tuto stránku s CSS, protože obsahuje osobní nastavení jiného uživatele.",
        "customjsprotected": "Nemáte povoleno editovat tuto stránku s JavaScriptem, protože obsahuje osobní nastavení jiného uživatele.",
        "mycustomcssprotected": "Nemáte oprávnění editovat tuto stránku s CSS.",
        "newpassword": "Nové heslo:",
        "retypenew": "Napište znovu nové heslo",
        "resetpass_submit": "Nastavit heslo a přihlásit se",
-       "changepassword-success": "Vaše heslo bylo úspěšně změněno!",
+       "changepassword-success": "Vaše heslo bylo změněno!",
        "changepassword-throttled": "Provedli jste příliš mnoho pokusů o přihlášení.\nČekejte prosím $1 a zkuste to znovu.",
        "botpasswords": "Hesla pro boty",
        "botpasswords-summary": "<em>Hesla pro boty</em> umožňují přistupovat k uživatelskému účtu prostřednictví API bez použití hlavních přihlašovacích údajů účtu. Uživatelská oprávnění dostupná po přihlášení pomocí hesla pro boty mohou být omezena.\n\nPokud nevíte, k čemu byste to {{GENDER:|chtěl|chtěla|chtěli}} použít, pravděpodobně byste to používat {{GENDER:|neměl|neměla|neměli}}. Nikdo by vás nikdy neměl žádat, abyste si zde vygenerovali heslo a dali mu ho.",
        "botpasswords-label-cancel": "Storno",
        "botpasswords-label-delete": "Smazat",
        "botpasswords-label-resetpassword": "Resetovat heslo",
+       "botpasswords-label-grants": "Použitelná oprávnění:",
+       "botpasswords-help-grants": "Každé přidělení dává přístup k uvedeným uživatelským oprávněním, která uživatelský účet již má. Viz [[Special:ListGrants|table of grants]] pro více informací.",
        "botpasswords-label-restrictions": "Omezení užití:",
        "botpasswords-label-grants-column": "Přiděleno",
        "botpasswords-bad-appid": "Název bota „$1“ není platný.",
        "botpasswords-insert-failed": "Nepodařilo se přidat název bota „$1“. Nebyl už přidán?",
        "botpasswords-update-failed": "Nepodařilo se aktualizovat název bota „$1“. Nebyl smazán?",
        "botpasswords-created-title": "Heslo pro bota vytvořeno",
-       "botpasswords-created-body": "Heslo pro bota „$1“ bylo úspěšně vytvořeno.",
+       "botpasswords-created-body": "Heslo pro bota jménem „$1“ {{GENDER:$2|uživatele|uživatelky}} „$2“ bylo vytvořeno.",
        "botpasswords-updated-title": "Heslo pro bota aktualizováno",
-       "botpasswords-updated-body": "Heslo pro bota „$1“ bylo úspěšně aktualizováno.",
+       "botpasswords-updated-body": "Heslo pro bota jménem „$1“ {{GENDER:$2|uživatele|uživatelky}} „$2“ bylo aktualizováno.",
        "botpasswords-deleted-title": "Heslo pro bota smazáno",
-       "botpasswords-deleted-body": "Heslo pro bota „$1“ bylo smazáno.",
+       "botpasswords-deleted-body": "Heslo pro bota jménem „$1“ {{GENDER:$2|uživatele|uživatelky}} „$2“ bylo smazáno.",
        "botpasswords-newpassword": "Nové přihlašovací heslo pro bota <strong>$1</strong> je <strong>$2</strong>. <em>Zaznamenejte si je pro budoucí použití.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider není dostupný.",
        "botpasswords-restriction-failed": "Toto přihlášení bylo zamítnuto omezením hesel pro boty.",
        "resetpass-no-info": "K této stránce mají přímý přístup jen přihlášení uživatelé.",
        "resetpass-submit-loggedin": "Změnit heslo",
        "resetpass-submit-cancel": "Storno",
-       "resetpass-wrong-oldpass": "Nesprávné dočasné nebo aktuální heslo.\nMožná jste si již úspěšně heslo změnili, nebo jste si vyžádali nové dočasné heslo.",
+       "resetpass-wrong-oldpass": "Nesprávné dočasné nebo aktuální heslo.\nMožná jste si již heslo změnili, nebo jste si vyžádali nové dočasné heslo.",
        "resetpass-recycled": "Jako nové heslo si prosím nastavte něco jiného než stávající heslo.",
        "resetpass-temp-emailed": "Přihlašujete se pomocí dočasného hesla, které bylo zasláno e-mailem.\nAbyste dokončili přihlášení, nastavte si nové heslo:",
        "resetpass-temp-password": "Dočasné heslo:",
        "revdelete-unsuppress": "Odstranit omezení na obnovených revizích",
        "revdelete-log": "Důvod:",
        "revdelete-submit": "Aplikovat na {{PLURAL:$1|zvolenou revizi|zvolené revize}}",
-       "revdelete-success": "'''Viditelnost revize úspěšně nastavena.'''",
+       "revdelete-success": "Viditelnost revize nastavena.",
        "revdelete-failure": "'''Nepodařilo se nastavit viditelnost revize:'''\n$1",
-       "logdelete-success": "'''Viditelnost události úspěšně nastavena.'''",
+       "logdelete-success": "Viditelnost události úspěšně nastavena.",
        "logdelete-failure": "'''Nepodařilo se nastavit viditelnost protokolu:'''\n$1",
        "revdel-restore": "Změnit viditelnost",
        "pagehist": "Historie stránky",
        "mergehistory-empty": "Nelze sloučit žádnou verzi.",
        "mergehistory-done": "$3 {{PLURAL:$3|verze|verze|verzí}} stránky $1 {{PLURAL:$3|byla úspěšně sloučena|byly úspěšně sloučeny|bylo úspěšně sloučeno}} do stránky [[:$2]].",
        "mergehistory-fail": "Sloučení historií nelze provést. Překontrolujte zadané stránky a jejich historii.",
+       "mergehistory-fail-bad-timestamp": "Časové razítko je neplatné.",
        "mergehistory-fail-invalid-source": "Zdrojová stránka je neplatná.",
        "mergehistory-fail-invalid-dest": "Cílová stránka je neplatná.",
+       "mergehistory-fail-no-change": "Sloučení historie nespojilo žádné revize. Překontrolujte prosím stránku a časové parametry.",
        "mergehistory-fail-permission": "Nedostatečná oprávnění ke slučování historie.",
        "mergehistory-fail-self-merge": "Zdrojová a cílová stránka jsou shodné.",
+       "mergehistory-fail-timestamps-overlap": "Zdrojové revize se překrývají, nebo přichází až po cílových revizích.",
        "mergehistory-fail-toobig": "Nelze provést sloučení historie, protože by se přesouvalo více revizí, než je limit $1.",
        "mergehistory-no-source": "Zdrojová stránka $1 neexistuje.",
        "mergehistory-no-destination": "Cílová stránka $1 neexistuje.",
        "userrights-changeable-col": "Skupiny, které můžete měnit",
        "userrights-unchangeable-col": "Skupiny, které nemůžete měnit",
        "userrights-conflict": "Konflikt změn uživatelských práv! Zkontrolujte a potvrďte požadované změny.",
-       "userrights-removed-self": "Úspěšně jste si odebrali vlastní práva. Tudíž už nemáte k této stránce přístup.",
+       "userrights-removed-self": "Odebrali jste si vlastní práva. Tudíž už nemáte k této stránce přístup.",
        "group": "Skupina:",
        "group-user": "Uživatelé",
        "group-autoconfirmed": "Automaticky schválení uživatelé",
        "ignorewarning": "Ignorovat varování a načíst soubor.",
        "ignorewarnings": "Ignorovat všechna varování",
        "minlength1": "Jméno souboru musí mít alespoň jeden znak.",
-       "illegalfilename": "Název souboru \"$1\" obsahuje znaky, které nejsou povoleny v názvech stránek. Prosím přejmenujte soubor a zkuste jej nahrát znovu.",
+       "illegalfilename": "Název souboru „$1“ obsahuje znaky, které nejsou povoleny v názvech stránek. Prosím přejmenujte soubor a zkuste jej nahrát znovu.",
        "filename-toolong": "Jména souborů nemohou být delší než 240 bajtů.",
        "badfilename": "Jméno souboru bylo změněno na „$1“.",
        "filetype-mime-mismatch": "Přípona souboru „.$1“ neodpovídá rozpoznanému MIME typu souboru ($2).",
        "filetype-bad-ie-mime": "Nelze načíst tento soubor, neboť Internet Explorer by ho považoval za „$1“, což je nedovolený a potenciálně nebezpečný typ souboru.",
        "filetype-unwanted-type": "„.$1“''' je nežádoucí formát souborů. {{PLURAL:$3|Upřednostňovaný formát souborů je|Upřednostňované formáty souborů jsou}} $2.",
        "filetype-banned-type": "'''„.$1“''' {{PLURAL:$4|je nedovolený formát souborů|jsou nedovolené formáty souborů}}.\n{{PLURAL:$3|Povolený formát souborů je|Povolené formáty souborů jsou}} $2.",
-       "filetype-missing": "Soubor nemá příponu (např. \".jpg\").",
+       "filetype-missing": "Soubor nemá příponu (např. „.jpg“).",
        "empty-file": "Načtený soubor je prázdný.",
        "file-too-large": "Načtený soubor je příliš velký.",
        "filename-tooshort": "Název souboru je příliš krátký.",
        "uploadstash-summary": "Tato stránka nabízí přístup k načteným (nebo právě načítaným) souborům, které dosud nejsou zveřejněny na wiki. Tyto soubory se nezobrazí nikomu kromě uživatele, který je načetl.",
        "uploadstash-clear": "Vymazat soubory ve skrýši",
        "uploadstash-nofiles": "Ve skrýši nemáte žádné soubory.",
-       "uploadstash-badtoken": "Operace se nezdařila, možná vypršela platnost vašeho oprávnění k editaci. Zkuste to znovu.",
+       "uploadstash-badtoken": "Operace se nezdařila. Možná vypršela platnost vašeho oprávnění k editaci. Zkuste to znovu.",
        "uploadstash-errclear": "Soubory se nepodařilo vymazat.",
        "uploadstash-refresh": "Aktualizovat seznam souborů",
        "invalid-chunk-offset": "Neplatný posun bloku",
        "changecontentmodel-title-label": "Název stránky",
        "changecontentmodel-model-label": "Nový model obsahu",
        "changecontentmodel-reason-label": "Důvod:",
+       "changecontentmodel-submit": "Změnit",
        "changecontentmodel-success-title": "Model obsahu byl změněn",
        "changecontentmodel-success-text": "Model obsahu stránky [[:$1]] byl změněn.",
        "changecontentmodel-cannot-convert": "Obsah stránky [[:$1]] nelze zkonvertovat na typ $2.",
        "changecontentmodel-nodirectediting": "Model obsahu $1 nepodporuje přímou editaci",
        "log-name-contentmodel": "Kniha změny modelů obsahu",
        "log-description-contentmodel": "Události týkající se modelů obsahu stránek",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|založil|založila}} stránku $3 za použití nestandardního modelu obsahu „$5“",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|změnil|změnila}} model obsahu stránky $3 z „$4“ na „$5“",
        "logentry-contentmodel-change-revertlink": "vrátit",
        "logentry-contentmodel-change-revert": "vrácení zpět",
        "tooltip-pt-anoncontribs": "Seznam editací provedených z této IP adresy",
        "tooltip-pt-login": "Doporučujeme vám přihlásit se, ovšem není to povinné.",
        "tooltip-pt-logout": "Odhlásit se",
-       "tooltip-pt-createaccount": "Doporučujeme vytvořit si účet a přihlásit se, není to však povinné",
+       "tooltip-pt-createaccount": "Doporučujeme vytvořit si účet a přihlásit se, ovšem není to povinné",
        "tooltip-ca-talk": "Diskuse ke stránce",
        "tooltip-ca-edit": "Editovat tuto stránku",
        "tooltip-ca-addsection": "Začít novou sekci",
        "tooltip-ca-nstab-media": "Zobrazit stránku souboru",
        "tooltip-ca-nstab-special": "Toto je speciální stránka, kterou nelze editovat.",
        "tooltip-ca-nstab-project": "Zobrazit stránku o wiki",
-       "tooltip-ca-nstab-image": "Zobrazit stránku obrázku",
+       "tooltip-ca-nstab-image": "Zobrazit stránku souboru",
        "tooltip-ca-nstab-mediawiki": "Zobrazit systémovou zprávu",
        "tooltip-ca-nstab-template": "Zobrazit šablonu",
        "tooltip-ca-nstab-help": "Zobrazit stránku nápovědy",
        "exif-copyrighted-true": "Chráněno autorským právem",
        "exif-copyrighted-false": "Bez informací o autorských právech",
        "exif-photometricinterpretation-1": "Černobílá (černá je 0)",
+       "exif-photometricinterpretation-4": "Maska průhlednosti",
        "exif-unknowndate": "neznámé datum",
        "exif-orientation-1": "Normální",
        "exif-orientation-2": "Vodorovně převráceno",
        "tags-delete-not-allowed": "Značky definované rozšířeními nelze smazat, leda by to příslušné rozšíření výslovně umožnilo.",
        "tags-delete-not-found": "Značka „$1“ neexistuje.",
        "tags-delete-too-many-uses": "Značkou „$1“ {{PLURAL:$2|je označena více než $2 revize|jsou označeny více než $2 revize|je označeno více než $2 revizí}}, což znamená, že ji nelze smazat.",
-       "tags-delete-warnings-after-delete": "Značka „$1“ byla úspěšně smazána, ale {{PLURAL:$1|bylo zjištěno|byla zjištěna}} následující varování:",
+       "tags-delete-warnings-after-delete": "Značka „$1“ byla smazána, ale {{PLURAL:$2|bylo zjištěno|byla zjištěna}} následující varování:",
        "tags-activate-title": "Aktivovat značku",
        "tags-activate-question": "Chystáte se aktivovat značku „$1“.",
        "tags-activate-reason": "Důvod:",
        "tags-edit-reason": "Důvod:",
        "tags-edit-revision-submit": "Aplikovat změny na {{PLURAL:$1|tuto revizi|tyto $1 revize|těchto $1 revizí}}",
        "tags-edit-logentry-submit": "Aplikovat změny na {{PLURAL:$1|tento protokolovací záznam|tyto $1 protokolovací záznamy|těchto $1 protokolovacích záznamů}}",
-       "tags-edit-success": "Změny byly úspěšně aplikovány.",
+       "tags-edit-success": "Změny byly aplikovány.",
        "tags-edit-failure": "Změny se nepodařilo provést:\n$1",
        "tags-edit-nooldid-title": "Neplatná cílová revize",
        "tags-edit-nooldid-text": "Buď jste nezadali žádnou cílovou revizi, na kterou by se tato funkce měla použít, nebo uvedená revize neexistuje.",
index 16799cf..d76acad 100644 (file)
@@ -50,6 +50,7 @@
        "tog-watchlisthidebots": "Cuddio golygiadau bot yn fy rhestr wylio",
        "tog-watchlisthideminor": "Cuddio golygiadau bychain rhag y rhestr wylio",
        "tog-watchlisthideliu": "Cuddio golygiadau gan ddefnyddwyr mewngofnodedig rhag y rhestr wylio",
+       "tog-watchlistreloadautomatically": "Ail-lwyther y Rhestr wylio yn otomatigpan newider ffiltr (angen JavaScript)",
        "tog-watchlisthideanons": "Cuddio golygiadau gan ddefnyddwyr anhysbys rhag y rhestr wylio",
        "tog-watchlisthidepatrolled": "Cuddio golygiadau sydd wedi derbyn ymweliad patrôl rhag y rhestr wylio",
        "tog-watchlisthidecategorization": "Cuddiwych y categoriau",
        "october-date": "$1 Hydref",
        "november-date": "$1 Tachwedd",
        "december-date": "$1 Rhagfyr",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Categori|Categori|Categorïau|Categorïau|Categorïau|Categorïau}}",
        "category_header": "Erthyglau yn y categori \"$1\"",
        "subcategories": "Is-gategorïau",
        "moredotdotdot": "Rhagor...",
        "morenotlisted": "Nid yw'r rhestr hon yn llawn.",
        "mypage": "Tudalen defnyddiwr",
+       "anonuserpage": "Defnyddiwr anhysbys",
        "mytalk": "Sgwrs",
        "anontalk": "Sgwrs",
        "navigation": "Panel llywio",
        "newpassword": "Cyfrinair newydd:",
        "retypenew": "Ail-deipiwch y cyfrinair newydd:",
        "resetpass_submit": "Gosod y cyfrinair a mewngofnodi",
-       "changepassword-success": "Llwyddodd y newid i'ch cyfrinair!",
+       "changepassword-success": "Newidiwyd eich cyfrinair!",
        "changepassword-throttled": "Rydych wedi ceisio logio mewn yn rhy aml.\nArhoswch am $1 cyn trio eto.",
+       "botpasswords-label-delete": "Diddymu neu ddileu",
+       "botpasswords-label-resetpassword": "Ailosod y cyfrinair",
+       "botpasswords-label-grants": "Nawdd perthnasol:",
        "resetpass_forbidden": "Ni ellir newid cyfrineiriau",
        "resetpass-no-info": "Ni allwch fynd at y dudalen hon yn uniongyrchol heblaw eich bod wedi mewngofnodi.",
        "resetpass-submit-loggedin": "Newidier y cyfrinair",
        "sig_tip": "Eich llofnod gyda stamp amser",
        "hr_tip": "Llinell lorweddol (peidiwch â'i gor-ddefnyddio)",
        "summary": "Crynodeb:",
-       "subject": "Pwnc/pennawd:",
+       "subject": "Pwnc:",
        "minoredit": "Golygiad bychan yw hwn",
        "watchthis": "Gwylier y dudalen hon",
        "savearticle": "Cadw'r dudalen",
        "missingsummary": "'''Sylwer:''' Nid ydych wedi gosod nodyn yn y blwch 'Crynodeb'.\nOs y pwyswch eto ar 'Cadw'r dudalen' caiff y golygiad ei gadw heb nodyn.",
        "selfredirect": "<strong>Gofal:</strong> Rydych yn ailgyfeirio'r dudalen hon ati hi ei hun!  Gwirwch yr hyn rydych yn ceisio'i wneud. Os cliciwch \"{{int:savearticle}}\" eto yna caiff y dudalen ailgyfeirio (wallus!) ei chreu beth bynnag.",
        "missingcommenttext": "Rhowch eich sylwadau isod.",
-       "missingcommentheader": "'''Nodyn:''' Nid ydych wedi cynnig unrhywbeth yn y blwch 'Pwnc/Pennawd:'. Os y cliciwch \"{{int:savearticle}}\" eto fe gedwir y golygiad heb bennawd.",
+       "missingcommentheader": "<strong>Nodyn atgoffa:</strong> \nNid ydych wedi cynnig unrhywbeth yn y blwch 'Pwnc:'. Os y cliciwch \"{{int:savearticle}}\" eto fe gedwir y golygiad heb bennawd.",
        "summary-preview": "Rhagolwg o'r crynodeb:",
-       "subject-preview": "Rhagolwg pwnc/pennawd:",
+       "subject-preview": "Rhagolwg pwnc:",
        "blockedtitle": "Mae'r defnyddiwr hwn wedi cael ei flocio",
        "blockedtext": "'''Mae eich enw defnyddiwr neu gyfeiriad IP wedi cael ei flocio.'''\n\n$1 a osododd y bloc.\nY rheswm a roddwyd dros y blocio yw: ''$2''.\n\n*Dechreuodd y bloc am: $8\n*Bydd y bloc yn dod i ben am: $6\n*Bwriadwyd blocio: $7\n\nGallwch gysylltu â $1 neu un arall o'r [[{{MediaWiki:Grouppage-sysop}}|gweinyddwyr]] i drafod y bloc.\nSylwch mai dim ond y rhai sydd wedi gosod cyfeiriad e-bost yn eu [[Special:Preferences|dewisiadau defnyddiwr]], a hwnnw heb ei flocio, sydd yn gallu 'anfon e-bost at ddefnyddiwr' trwy'r wici.\n$3 yw eich cyfeiriad IP presennol. Cyfeirnod y bloc yw #$5.\nPan yn ysgrifennu at weinyddwr, cofiwch gynnwys yr holl fanylion uchod, os gwelwch yn dda.",
        "autoblockedtext": "Rhoddwyd bloc yn awtomatig ar eich cyfeiriad IP oherwydd iddo gael ei ddefnyddio gan ddefnyddiwr arall, a bod bloc wedi ei roi ar hwnnw gan $1.\nY rheswm a roddwyd dros y bloc oedd:\n\n:''$2''\n\n*Dechreuodd y bloc am: $8\n*Daw'r bloc i ben am: $6\n*Bwriadwyd blocio: $7\n\nGallwch gysylltu â $1 neu un arall o'r [[{{MediaWiki:Grouppage-sysop}}|gweinyddwyr]] i drafod y bloc.\n\nSylwch mai dim ond y rhai sydd wedi gosod cyfeiriad e-bost yn eu [[Special:Preferences|dewisiadau defnyddiwr]], a hwnnw heb ei flocio, sydd yn gallu 'anfon e-bost at ddefnyddiwr' trwy'r wici.\n\nEich cyfeiriad IP presennol yw $3. Cyfeirnod y bloc yw $5. Nodwch y manylion hyn wrth drafod y bloc.",
        "notextmatches": "Does dim testun yn cyfateb",
        "prevn": "{{PLURAL:$1||yr $1 cynt|y $1 gynt|y $1 chynt|y $1 chynt|y $1 cynt}}",
        "nextn": "y {{PLURAL:$1|$1}} nesaf",
+       "prev-page": "tudalen flaenorol",
+       "next-page": "tudalen nesaf",
        "prevn-title": "Y $1 {{PLURAL:$1|canlyiad|canlyniad|ganlyniad|chanlyniad|chanlyniad|canlyniad}} cynt",
        "nextn-title": "Y $1 {{PLURAL:$1|canlyiad|canlyniad|ganlyniad|chanlyniad|chanlyniad|canlyniad}} nesaf",
        "shown-title": "Dangos $1 {{PLURAL:$1|canlyiad|canlyniad|ganlyniad|chanlyniad|chanlyniad|canlyniad}} y dudalen",
        "userrights": "Rheoli galluoedd defnyddwyr",
        "userrights-lookup-user": "Rheoli grwpiau defnyddiwr",
        "userrights-user-editname": "Rhowch enw defnyddiwr:",
-       "editusergroup": "Golygu Grwpiau Defnyddwyr",
+       "editusergroup": "Golygu Grwpiau {{GENDER:$1|Defnyddwyr}}",
        "editinguser": "Newid galluoedd {{GENDER:$1|y defnyddiwr}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Golygu grwpiau defnyddwyr",
-       "saveusergroups": "Cadw'r Grwpiau Defnyddwyr",
+       "saveusergroups": "Cadw'r Grwpiau {{GENDER:$1|Defnyddwyr}}",
        "userrights-groupsmember": "Yn aelod o:",
        "userrights-groupsmember-auto": "Ac ynghlwm wrth aelodaeth y grwpiau uchod, yn aelod o:",
        "userrights-groups-help": "Gallwch newid y grwpiau y perthyn y defnyddiwr hwn iddynt:\n* Mae defnyddiwr yn perthyn i grŵp pan mae tic yn y bocs.\n* Nid yw defnyddiwr yn perthyn i grŵp pan nad oes tic yn y bocs.\n* Mae * yn golygu na fyddwch yn gallu dad-wneud unrhyw newid yn y grŵp hwnnw.",
        "userrights-changeable-col": "Grwpiau y gallwch eu newid",
        "userrights-unchangeable-col": "Grwpiau na allwch eu newid",
        "userrights-conflict": "Gwrthdaro oherwydd newid i hawliau defnyddiwr! Adolygwch eich newidiadau a'u cadarnhau.",
-       "userrights-removed-self": "Rydych wedi llwyddo rhoi'r gorau i'ch galluoedd. Gan hynny, nid ydych yn cael myned i'r dudalen hon bellach.",
+       "userrights-removed-self": "Rydych wedi rhoi'r gorau i'ch galluoedd. Gan hynny, ni allwch gyrchu'r ddalen hon bellach.",
        "group": "Grŵp:",
        "group-user": "Defnyddwyr",
        "group-autoconfirmed": "Defnyddwyr wedi eu cadarnhau'n awtomatig",
        "right-sendemail": "Anfon e-bost at ddefnyddwyr eraill",
        "right-passwordreset": "Gweld e-byst sy'n ailosod cyfrinair",
        "right-managechangetags": "Creu a dileu [[Special:Tags|tagiau]] o'r gronfa ddata",
+       "grant-group-email": "Danfon ebost",
+       "grant-basic": "Hawliau sylfaenol",
+       "grant-viewdeleted": "Gweld ffeiliau a ddilewyd",
+       "grant-viewmywatchlist": "Gweld eich Rhestr Wylio",
        "newuserlogpage": "Lòg creu cyfrifon defnyddwyr newydd",
        "newuserlogpagetext": "Dyma restr o'r defnyddwyr newydd sydd wedi ymuno â'r wici.",
        "rightslog": "Lòg galluoedd defnyddiwr",
        "recentchanges-label-bot": "Golygwyd gan fot",
        "recentchanges-label-unpatrolled": "Nid yw'r golygiad hwn wedi derbyn ymweliad patrôl eto",
        "recentchanges-label-plusminus": "Newidiodd maint y dudalen o'r nifer hwn o feitiau",
-       "recentchanges-legend-heading": "'''Allwedd:'''",
+       "recentchanges-legend-heading": "<strong>Allwedd:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (gweler hefyd [[Special:NewPages|restr y tudalennau newydd]])",
        "recentchanges-legend-plusminus": "(''±123'')",
+       "recentchanges-submit": "Dangos",
        "rcnotefrom": "Isod rhestrir pob newid er <strong>$3, $4</strong> (ymddengys <strong>$1</strong> ohonynt).",
        "rclistfrom": "Dangos newidiadau newydd, gan ddechrau ers $3 $2",
        "rcshowhideminor": "$1 golygiadau bychain",
        "rcshowhidemine": "$1 fy ngolygiadau",
        "rcshowhidemine-show": "Dangoser",
        "rcshowhidemine-hide": "Cuddier",
+       "rcshowhidecategorization": "Categorieiddio tudalen $1",
+       "rcshowhidecategorization-show": "Dangos",
+       "rcshowhidecategorization-hide": "Cuddio",
        "rclinks": "Dangos y $1 newid diweddaraf yn ystod y(r) $2 diwrnod diwethaf<br />$3",
        "diff": "gwahan",
        "hist": "hanes",
        "recentchangeslinked-to": "Dangos newidiadau i'r tudalennau â chyswllt arnynt sy'n arwain at y dudalen a enwir",
        "recentchanges-page-added-to-category": "Ychwanegwyd [[:$1]] at y categori",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] ac {{PLURAL:$2|un ddalen|$2 dalen}} wedi'u hychwanegu at y categori",
+       "recentchanges-page-removed-from-category": "Symudwyd [[:$1]] o'r categori",
        "upload": "Uwchlwytho ffeil",
        "uploadbtn": "Uwchlwytho ffeil",
        "reuploaddesc": "Dileu'r uwchlwytho a dychwelyd i'r ffurflen uwchlwytho",
        "upload-too-many-redirects": "Roedd gormod o ailgyfeiriadau yn yr URL",
        "upload-http-error": "Digwyddodd gwall HTTP: $1",
        "upload-copy-upload-invalid-domain": "Ni ellir uwchlwytho ffeiliau o'r parth hwn.",
+       "upload-dialog-title": "Uwchlwytho ffeil",
+       "upload-dialog-button-cancel": "Canslo",
+       "upload-dialog-button-done": "Wedi cwbwlhau",
+       "upload-dialog-button-save": "Wedi ei gadw",
+       "upload-dialog-button-upload": "Uwchlwytho",
+       "upload-form-label-infoform-title": "Manylion",
+       "upload-form-label-infoform-name": "Enw",
+       "upload-form-label-infoform-description": "Disgrifiad",
+       "upload-form-label-usage-title": "Defnydd",
+       "upload-form-label-usage-filename": "Enw'r ffeil",
+       "foreign-structured-upload-form-label-own-work": "Dyma fy ngwaith fy hun",
+       "foreign-structured-upload-form-label-infoform-categories": "Categoriau",
+       "foreign-structured-upload-form-label-infoform-date": "Dyddiad",
+       "foreign-structured-upload-form-label-own-work-message-local": "Rwy'n cadarnhau fy mod yn uwchlwytho'r ffeil yma gan ddilyn amodau a pholisiau trwyddedu {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Efallai y carwch hefyd roi gynnig ar [[Special:Upload|y ddalen uwchlwytho diofyn]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Rwy'n cadarnhau fy mod yn uwchlwytho'r ffeil yma i fan sy'n cael ei rannu gan nifer. Rwy'n cadarnhau hefyd y gwnaf hyn gan ddilyn yr amodau a'r polisiau trwyddedu sydd yno.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Cadarnhaf mai fi yw perchennog hawlfraint y ffeil hon, a chytunaf  yn ddi-droi'n ôl i ryddhau'r ffeil hon i Gomin Wicimedia dan drwydded [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], a chytunaf gyda'r[https://wikimediafoundation.org/wiki/Terms_of_Use Amodau Defnyddio].",
        "backend-fail-stream": "Wedi methu ffrydio'r ffeil $1.",
        "backend-fail-backup": "Wedi methu gwneud copi wrth gefn o'r ffeil $1.",
        "backend-fail-notexists": "Nid yw'r ffeil $1 ar gael.",
        "backend-fail-read": "Wedi methu darllen y ffeil $1.",
        "backend-fail-create": "Wedi methu ysgrifennu'r ffeil $1.",
        "backend-fail-maxsize": "Ni ellid ysgrifennu'r ffeil $1 oherwydd ei bod yn fwy na{{PLURAL:$2||g un beit| $2 feit| $2 beit| $2 beit| $2 beit}} o faint.",
-       "backend-fail-readonly": "Ar hyn o bryd gellir darllen y storfa \"$1\" yn unig. Y rheswm dros hyn yw: \"''$2''\"",
+       "backend-fail-readonly": "Ar hyn o bryd gellir darllen y storfa \"$1\" yn unig. Y rheswm dros hyn yw:\n<em>$2</em>",
        "backend-fail-synced": "Mae'r ffeil \"$1\" mewn cyflwr anghyson oddi mewn i'r storfeydd tu ôl i'r llenni.",
        "backend-fail-connect": "Ni ellid cysylltu â'r storfa tu ôl i'r llenni yn \"$1\".",
        "backend-fail-internal": "Cafwyd gwall anhysbys yn y storfa tu ôl i'r llenni yn \"$1\".",
        "uploadstash-summary": "O'r dudalen hon gallwch gyrchu'r ffeiliau sydd wedi cael eu huwchlwytho (neu wrthi'n cael eu huwchlwytho) ond nad ydynt wedi eu cyhoeddi ar y wici eto. Nid oes neb yn gallu gweld y ffeiliau heblaw am y defnyddiwr a'u huwchlwythodd.",
        "uploadstash-clear": "Clirio'r celc ffeiliau",
        "uploadstash-nofiles": "Nid oes unrhyw ffeiliau mewn celc gennych.",
-       "uploadstash-badtoken": "Ni lwyddodd y weithred, efallai oherwydd bod eich cymwysterau golygu wedi dod i ben. Ceisiwch eto.",
+       "uploadstash-badtoken": "Ni lwyddodd y weithred. Efallai oherwydd bod eich cymwysterau golygu wedi dod i ben. Ceisiwch eto.",
        "uploadstash-errclear": "Ni lwyddwyd i glirio'r ffeiliau.",
        "uploadstash-refresh": "Adnewyddu rhestr y ffeiliau",
        "invalid-chunk-offset": "Atred annilys i'r talpiau",
        "listfiles-delete": "dileu",
        "listfiles-summary": "Rhestr yr holl ffeiliau sydd wedi eu huwchlwytho sydd ar y dudalen hon.",
        "listfiles_search_for": "Chwilio am enw'r ddelwedd:",
+       "listfiles-userdoesnotexist": "Ni yw cyfrif defnyddiwr \"$1\" wedi'i gofrestru.",
        "imgfile": "ffeil",
        "listfiles": "Rhestr o'r holl ffeiliau",
        "listfiles_thumb": "Mân-lun",
        "randomincategory-nopages": "Nid oes unrhyw dudalennau yn y categori [[:Category:$1]].",
        "randomincategory-category": "Categori:",
        "randomincategory-legend": "Tudalen ar hap o blith tudalennau'r categori",
+       "randomincategory-submit": "Ewch",
        "randomredirect": "Tudalen ailgyfeirio ar hap",
        "randomredirect-nopages": "Does dim tudalennau ailgyfeirio yn y parth \"$1\".",
        "statistics": "Ystadegau",
        "mostrevisions": "Tudalennau yn nhrefn nifer y newidiadau iddynt",
        "prefixindex": "Pob tudalen yn ôl parth",
        "prefixindex-namespace": "Pob tudalen â rhagddodiad penodol (y parth $1)",
+       "prefixindex-submit": "Dangos",
        "prefixindex-strip": "Diosg y rhagddodiad wrth restru",
        "shortpages": "Erthyglau byr",
        "longpages": "Tudalennau hirion",
        "protectedpages-performer": "Y diogelwr",
        "protectedpages-params": "Paramedrau'r diogelu",
        "protectedpages-reason": "Rheswm",
+       "protectedpages-submit": "Dangos y dalenau",
        "protectedpages-unknown-timestamp": "Anhysbys",
        "protectedpages-unknown-performer": "Defnyddiwr anhysbys",
        "protectedtitles": "Teitlau wedi eu diogelu",
        "protectedtitlesempty": "Ar hyn o bryd nid oes unrhyw deitlau wedi eu diogelu a'r paramedrau hyn.",
+       "protectedtitles-submit": "Dangos y teitlau",
        "listusers": "Rhestr defnyddwyr",
        "listusers-editsonly": "Dangos y defnyddwyr hynny sydd wedi golygu rhywbeth yn unig",
        "listusers-creationsort": "Trefnwch yn ôl dyddiad creu",
        "usereditcount": "$1 {{PLURAL:$1|golygiad|golygiad|olygiad|golygiad|golygiad|o olygiadau}}",
        "usercreated": "{{GENDER:$3|Crëwyd}} ar $1 am $2",
        "newpages": "Erthyglau newydd",
+       "newpages-submit": "Dangos",
        "newpages-username": "Enw defnyddiwr:",
        "ancientpages": "Erthyglau hynaf",
        "move": "Symud",
        "apihelp": "Cymorth API",
        "apihelp-no-such-module": "Ni chafwyd hyd i fodiwl \"$1\".",
        "apisandbox": "Pwll tywod API",
+       "apisandbox-fullscreen": "Ehangu'r panel",
+       "apisandbox-unfullscreen": "Dangos y ddalen",
+       "apisandbox-submit": "Gwnewch gais",
+       "apisandbox-reset": "Clirio",
+       "apisandbox-retry": "Ailgeisio",
        "booksources": "Ffynonellau llyfrau",
        "booksources-search-legend": "Chwilier am lyfrau",
        "booksources-search": "Chwilio",
        "import-nonewrevisions": "Ni fewnforwyd unrhyw ddiwygiadau (y cwbl eisoes yn bresennol, neu wedi eu hepgor oherwydd eu bod yn wallus).",
        "xml-error-string": "$1 ar linell $2, col $3 (beit $4): $5",
        "import-upload": "Uwchlwytho data XML",
-       "import-token-mismatch": "Collwyd data'r sesiwn. Ceisiwch eto.",
+       "import-token-mismatch": "Collwyd y data.\n\nEfallai i chi allgofnodi (logio allan).<strong>Cadarnhewch eich bod yn dal wedi mewngofnodi a cheisiwch eto</strong>\nOs yw'n parhau i fethu, ceisiwch [[Special:UserLogout|allgofnodi]] a mewngofnodwch drachefn, a gwirwch fod eich porwr yn caniatau cwcis o'r wefan hon.",
        "import-invalid-interwiki": "Ni ellir uwchlwytho o'r wici dewisedig.",
        "import-error-edit": "Ni fewnforiwyd y dudalen \"$1\" oherwydd nad yw'r gallu i'w golygu gennych.",
        "import-error-create": "Ni fewnforiwyd y dudalen \"$1\" oherwydd nad yw'r hawl i'w chreu gennych.",
        "pageinfo-category-files": "Nifer y ffeiliau",
        "markaspatrolleddiff": "Marcio ei bod wedi derbyn ymweliad patrôl",
        "markaspatrolledtext": "Marcio bod y dudalen wedi derbyn ymweliad patrôl",
+       "markaspatrolledtext-file": "Marcio fod fersiwn y ffeil wedi cael ymweliad",
        "markedaspatrolled": "Gosodwyd marc ei bod wedi derbyn ymweliad patrôl",
        "markedaspatrolledtext": "Wedi gosod marc bod y golygiad dewisedig o [[:$1]] wedi derbyn ymweliad patrôl.",
        "rcpatroldisabled": "Patrol y Newidiadau Diweddar wedi'i analluogi",
        "expand_templates_generate_xml": "Dangos y goeden dosrannu XML",
        "expand_templates_generate_rawhtml": "Dangos HTML crai",
        "expand_templates_preview": "Rhagolwg",
-       "pagelanguage": "Dewis iaith y dudalen",
+       "pagelanguage": "Newidiwch iaith ddalen",
        "pagelang-name": "Tudalen",
        "pagelang-language": "Iaith",
        "pagelang-use-default": "Defnyddier yr iaith arferol",
        "pagelang-select-lang": "Dewis iaith",
+       "pagelang-submit": "Ei wneud",
        "right-pagelang": "Newidiwch iaith y dudalen",
        "action-pagelang": "newidiwch iaith y dudalen",
        "log-name-pagelang": "Newidiwch iaith y log",
        "mediastatistics-header-text": "Testun",
        "mediastatistics-header-executable": "Gweithredadwy",
        "mediastatistics-header-archive": "Fformat wedi'i gywasgu",
+       "mediastatistics-header-total": "Pob ffeil",
        "json-warn-trailing-comma": "Tynnwyd $1 {{PLURAL:$1|coma}} o JSON",
        "json-error-unknown": "Roedd gwall gyda JSON. Gwall: $1",
        "json-error-depth": "Aethpwyd dros y dyfnder mwyaf a ganiateir",
index 59c1c23..8263cf6 100644 (file)
        "recentchanges-label-bot": "Denne redigering blev udført af en bot",
        "recentchanges-label-unpatrolled": "Denne redigering er endnu ikke blevet patruljeret",
        "recentchanges-label-plusminus": "Størrelsen på siden blev ændret med dette antal bytes",
-       "recentchanges-legend-heading": "'''Forklaring:'''",
+       "recentchanges-legend-heading": "<strong>Forklaring:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se også [[Special:NewPages|listen over nye sider]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Nedenfor er op til '''$1''' {{PLURAL:$5|ændring|ændringer}} siden '''$2''' vist.",
index cdb14db..5a33125 100644 (file)
        "moredotdotdot": "Mehr …",
        "morenotlisted": "Diese Liste ist nicht vollständig.",
        "mypage": "Eigene Seite",
+       "anonuserpage": "Unbekannter Benutzer",
        "mytalk": "Diskussion",
        "anontalk": "Diskussionsseite",
        "navigation": "Navigation",
        "nocookieslogin": "{{SITENAME}} benutzt Cookies zur Anmeldung der Benutzer. Du hast Cookies deaktiviert, bitte aktiviere diese und versuche es erneut.",
        "nocookiesfornew": "Das Benutzerkonto wurde nicht erstellt, da die Datenherkunft nicht ermittelt werden konnte.\nBitte stelle sicher, dass du Cookies aktiviert hast. Lade diese Seite danach erneut und versuche es noch einmal.",
        "noname": "Du musst einen gültigen Benutzernamen angeben.",
-       "loginsuccesstitle": "Anmeldung erfolgreich",
+       "loginsuccesstitle": "Angemeldet",
        "loginsuccess": "<strong>Du bist jetzt als „$1“ bei {{SITENAME}} angemeldet.</strong>",
        "nosuchuser": "Der Benutzername „$1“ existiert nicht.\nÜberprüfe die Schreibweise (Groß-/Kleinschreibung beachten) oder [[Special:UserLogin/signup|lege ein neues Benutzerkonto an]].",
        "nosuchusershort": "Der Benutzername „$1“ ist nicht vorhanden. Bitte überprüfe die Schreibweise.",
        "createaccount-title": "Erstellung eines Benutzerkontos für {{SITENAME}}",
        "createaccount-text": "Es wurde für dich ein Benutzerkonto „$2“ auf {{SITENAME}} ($4) erstellt. Das automatisch generierte Passwort für „$2“ ist „$3“. Du solltest dich nun anmelden und das Passwort ändern.\n\nFalls das Benutzerkonto irrtümlich angelegt wurde, kannst du diese Nachricht ignorieren.",
        "login-throttled": "Du hast zu oft versucht, dich anzumelden.\nBitte warte $1, bevor du es erneut probierst.",
-       "login-abort-generic": "Deine Anmeldung war nicht erfolgreich – Abgebrochen",
+       "login-abort-generic": "Deine Anmeldung ist fehlgeschlagen – Abgebrochen",
        "login-migrated-generic": "Dein Benutzerkonto wurde migriert. Dein Benutzername ist auf diesem Wiki nicht mehr vorhanden.",
        "loginlanguagelabel": "Sprache: $1",
        "suspicious-userlogout": "Deine Abmeldeanfrage wurde verweigert, da sie vermutlich von einem defekten Browser oder einem Cache-Proxy gesendet wurde.",
        "newpassword": "Neues Passwort:",
        "retypenew": "Neues Passwort (nochmal):",
        "resetpass_submit": "Passwort übermitteln und anmelden",
-       "changepassword-success": "Dein Passwort wurde erfolgreich geändert!",
+       "changepassword-success": "Dein Passwort wurde geändert!",
        "changepassword-throttled": "Du hast kürzlich zu viele Anmeldeversuche unternommen.\nBitte warte $1, bevor du es erneut versuchst.",
        "botpasswords": "Botpasswörter",
        "botpasswords-summary": "<em>Botpasswörter</em> erlauben Zugriff auf ein Benutzerkonto über die API, ohne die Hauptanmeldeinformationen des Benutzerkontos zu verwenden. Die verfügbaren Benutzerrechte bei der Anmeldung mit einem Botpasswort können beschränkt sein.\n\nWenn du nicht weißt, warum du ein Passwort erstellen sollst, tu es nicht. Du solltest ein Passwort nie für einen anderen erzeugen und es an ihn übergeben.",
        "botpasswords-insert-failed": "Der Botname „$1“ konnte nicht hinzugefügt werden. Wurde er bereits hinzugefügt?",
        "botpasswords-update-failed": "Der Botname „$1“ konnte nicht aktualisiert werden. Wurde er gelöscht?",
        "botpasswords-created-title": "Botpasswort erstellt",
-       "botpasswords-created-body": "Das Botpasswort „$1“ wurde erfolgreich erstellt.",
+       "botpasswords-created-body": "Das Botpasswort für den Botnamen „$1“ des Benutzers „$2“ wurde erstellt.",
        "botpasswords-updated-title": "Botpasswort aktualisiert",
-       "botpasswords-updated-body": "Das Botpasswort „$1“ wurde erfolgreich aktualisiert.",
+       "botpasswords-updated-body": "Das Botpasswort für den Botnamen „$1“ des Benutzers „$2“ wurde aktualisiert.",
        "botpasswords-deleted-title": "Botpasswort gelöscht",
-       "botpasswords-deleted-body": "Das Botpasswort „$1“ wurde gelöscht.",
+       "botpasswords-deleted-body": "Das Botpasswort für den Botnamen „$1“ des Benutzers „$2“ wurde gelöscht.",
        "botpasswords-newpassword": "Das neue Passwort zur Anmeldung mit <strong>$1</strong> ist <strong>$2</strong>. <em>Bitte halte dies für die Zukunft fest.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider ist nicht verfügbar.",
        "botpasswords-restriction-failed": "Beschränkungen des Botpassworts verhindern diese Anmeldung.",
        "resetpass-no-info": "Du musst dich anmelden, um auf diese Seite direkt zuzugreifen.",
        "resetpass-submit-loggedin": "Passwort ändern",
        "resetpass-submit-cancel": "Abbrechen",
-       "resetpass-wrong-oldpass": "Ungültiges temporäres oder aktuelles Passwort.\nMöglicherweise hast du dein Passwort bereits erfolgreich geändert oder ein neues temporäres Passwort beantragt.",
+       "resetpass-wrong-oldpass": "Ungültiges temporäres oder aktuelles Passwort.\nMöglicherweise hast du dein Passwort bereits geändert oder ein neues temporäres Passwort beantragt.",
        "resetpass-recycled": "Bitte setze dein Passwort auf ein anderes Passwort als dein aktuelles fest.",
        "resetpass-temp-emailed": "Du hast dich mit einem temporären E-Mail-Code angemeldet.\nUm die Anmeldung abzuschließen, musst du jetzt ein neues Passwort festlegen:",
        "resetpass-temp-password": "Temporäres Passwort:",
        "revdelete-unsuppress": "Einschränkungen für wiederhergestellte Versionen aufheben",
        "revdelete-log": "Grund:",
        "revdelete-submit": "Auf gewählte {{PLURAL:$1|Version|Versionen}} anwenden",
-       "revdelete-success": "'''Die Versionsansicht wurde aktualisiert.'''",
+       "revdelete-success": "Die Versionsansicht wurde aktualisiert.",
        "revdelete-failure": "'''Die Versionssichtbarkeit konnte nicht aktualisiert werden:'''\n$1",
-       "logdelete-success": "'''Logbuchansicht erfolgreich geändert.'''",
+       "logdelete-success": "Logbuchansicht geändert.",
        "logdelete-failure": "'''Logbuchsichtbarkeit kann nicht geändert werden:'''\n$1",
        "revdel-restore": "Sichtbarkeit ändern",
        "pagehist": "Versionsgeschichte",
        "userrights-changeable-col": "Gruppenzugehörigkeit, die du ändern kannst",
        "userrights-unchangeable-col": "Gruppenzugehörigkeit, die du nicht ändern kannst",
        "userrights-conflict": "Benutzerrechteänderungskonflikt! Bitte überprüfe und bestätige deine Änderungen.",
-       "userrights-removed-self": "Du hast deine eigenen Rechte erfolgreich entfernt. Du kannst nicht länger auf diese Seite zugreifen.",
+       "userrights-removed-self": "Du hast deine eigenen Rechte entfernt. Du kannst nicht länger auf diese Seite zugreifen.",
        "group": "Gruppe:",
        "group-user": "Benutzer",
        "group-autoconfirmed": "Automatisch bestätigte Benutzer",
        "uploadstash-summary": "Diese Seite ermöglicht den Zugriff auf Dateien, die hochgeladen wurden, bzw. gerade hochgeladen werden, aber noch nicht auf dem Wiki publiziert wurden. Die Dateien sind ausschließlich für den hochladenden Benutzer einsehbar.",
        "uploadstash-clear": "Die vorab gespeicherten Dateien entfernen",
        "uploadstash-nofiles": "Es sind keine vorab gespeicherten Dateien vorhanden.",
-       "uploadstash-badtoken": "Das Entfernen der vorab gespeicherten Dateien war erfolglos, vielleicht weil deine Sitzungsdaten abgelaufen sind. Bitte versuche es erneut.",
-       "uploadstash-errclear": "Das Entfernen der vorab gespeicherten Dateien war erfolglos.",
+       "uploadstash-badtoken": "Das Entfernen der vorab gespeicherten Dateien ist fehlgeschlagen, da vielleicht deine Sitzungsdaten abgelaufen sind. Bitte versuche es erneut.",
+       "uploadstash-errclear": "Das Entfernen der vorab gespeicherten Dateien ist fehlgeschlagen.",
        "uploadstash-refresh": "Liste der Dateien aktualisieren",
        "invalid-chunk-offset": "Ungültiger Startpunkt",
        "img-auth-accessdenied": "Zugriff verweigert",
        "changecontentmodel-title-label": "Seitentitel",
        "changecontentmodel-model-label": "Neues Inhaltsmodell",
        "changecontentmodel-reason-label": "Grund:",
+       "changecontentmodel-submit": "Ändern",
        "changecontentmodel-success-title": "Das Inhaltsmodell wurde geändert",
        "changecontentmodel-success-text": "Der Inhaltstyp von [[:$1]] wurde geändert.",
        "changecontentmodel-cannot-convert": "Der Inhalt von [[:$1]] kann nicht zum Typ $2 konvertiert werden.",
        "tags-delete-not-allowed": "Markierungen, die von einer Erweiterung definiert werden, können nicht gelöscht werden, außer die Erweiterung erlaubt es ausdrücklich.",
        "tags-delete-not-found": "Die Markierung „$1“ ist nicht vorhanden.",
        "tags-delete-too-many-uses": "Die Markierung „$1“ wird bei mehr als {{PLURAL:$2|einer Version|$2 Versionen}} verwendet und kann deshalb nicht gelöscht werden.",
-       "tags-delete-warnings-after-delete": "Die Markierung „$1“ wurde erfolgreich gelöscht, aber die {{PLURAL:$2|folgende Warnung ist|folgenden Warnungen sind}} aufgetreten:",
+       "tags-delete-warnings-after-delete": "Die Markierung „$1“ wurde gelöscht, aber die {{PLURAL:$2|folgende Warnung ist|folgenden Warnungen sind}} aufgetreten:",
        "tags-activate-title": "Markierung aktivieren",
        "tags-activate-question": "Du bist dabei, die Markierung „$1“ zu aktivieren.",
        "tags-activate-reason": "Grund:",
        "tags-edit-reason": "Grund:",
        "tags-edit-revision-submit": "Änderungen an {{PLURAL:$1|diese Version|$1 Versionen}} anwenden",
        "tags-edit-logentry-submit": "Änderungen an {{PLURAL:$1|diesen Logbucheintrag|$1 Logbucheinträgen}} anwenden",
-       "tags-edit-success": "Die Änderungen wurden erfolgreich angewandt.",
+       "tags-edit-success": "Die Änderungen wurden angewandt.",
        "tags-edit-failure": "Die Änderungen konnten nicht angewandt werden:\n$1",
        "tags-edit-nooldid-title": "Ungültige Zielversion",
        "tags-edit-nooldid-text": "Du hast entweder keine Zielversion angegeben, für die diese Funktion ausgeführt werden soll oder die angegebene Version ist nicht vorhanden.",
index b4ff483..4625c89 100644 (file)
        "delete-hook-aborted": "Esterıtışi terefê çengeli ra ibtal bi.\nQet tesrih beyan nêbi.",
        "no-null-revision": "Qandé \"$1\" zew rewizyono newe névıraziya.",
        "badtitle": "Sernameo xırabın",
-       "badtitletext": "Sernamey pela ke şıma waşt, nêvêrd, thalo/vengo ya ki zıwano miyanêno ğelet gırêdae ya ki sernamey wiki.\nBeno ke, tede yew ya zi zêdê işareti estê ke sernaman de nêxebetiyenê.",
+       "badtitletext": "Sernameyê pela ke şıma waşt, nêvêrd, vengo ya zi zıwano miyanêno ğelet gırêdaye ya zi sernameyê wiki.\nBeno ke, tede yew ya zi zêdê işareti estê ke sernameyan de nêxebetiyenê.",
        "perfcached": "Datay cı ver hazır biye. No semedê ra nıkayin niyo! tewr zaf {{PLURAL:$1|netice|$1 netice}} debêno de",
        "perfcachedts": "Cêr de malumatê nımıteyi esti, demdê newe kerdışo peyın: $1. Tewr zaf {{PLURAL:$4|netice|$4 neticey cı}} debyayo de",
        "querypage-no-updates": "Rocanebiyayışê na pele nıka cadayiyê.\nDayiyi tiya nıka newe nêbenê.",
        "recentchanges-label-bot": "Eno vurnayış terefê yew boti ra vıraziyo",
        "recentchanges-label-unpatrolled": "Eno vurnayış hewna dewriya nêbiyo",
        "recentchanges-label-plusminus": "Ebadê pele de bazê bayti de vayeyê cı",
-       "recentchanges-legend-heading": "'''Kıtabek:'''",
+       "recentchanges-legend-heading": "<strong>Kıtabek:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|Lista pelanê neweyan]] zi bıvêne)",
        "recentchanges-legend-plusminus": "''(±123)''",
        "rcnotefrom": "Cêr de <strong>$2</strong> ra nata vurnayışiyê asenê (tewr vêşi <strong>$1</strong> asenê).",
        "rollbackfailed": "Peyserardış nêbi",
        "cantrollback": "karbero peyin têna paşt dayo, no semedi ra vuriyayiş tepiya nêgeriyeni.",
        "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}} hetê [[Special:Contributions/$2|{{int:contribslink}}]]) ra pelê ıney[[:$1]] de vurnayiş biyo u no vurnayiş tepiya nêgeriyeno;\nyewna ten pel de vurnayiş kerdo u pel tepiya nêgeriyeno.\n\noyo ke vurnayişo peyin kerdo: [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
-       "editcomment": "kılmnuşteyê vurnayişibi: <em>$1</em>.",
+       "editcomment": "Xulasaya vurnayışi: <em>$1</em>.",
        "revertpage": "Hetê [[Special:Contributions/$2|$2]] ([[User talk:$2|Mesac]]) ra vurnayiş biyo u ney vurnayişi tepiya geriyayo u no [[User:$1|$1]] kes o ke cuwa ver revizyon kerdo revizyonê no kesi tepiya anciyayo.",
        "revertpage-nouser": "No keso ke vuriyayiş kerdo vuriyayişé{{GENDER:$1|[[User:$1|$1]]}} ker o",
        "rollback-success": "vurnayişê no kesi $1 tepiya geriyayo u hetê no\n$2 kesi ra cıwa ver o ke revizyon biyo no revizyon tepiya anciyayo.",
index 86b5f17..0817b87 100644 (file)
        "recentchanges-label-bot": "Toś ta změna jo se pśez bośik wuwjadła.",
        "recentchanges-label-unpatrolled": "Toś ta změna hyšći njejo se pśekontrolěrowała",
        "recentchanges-label-plusminus": "Změnjona wjelikosc boka (licba bajtow)",
-       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (glej teke [[Special:NewPages|lisćinu nowych bokow]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Dołojce pokazuju se změny wót <strong>$2</strong> (maks. <strong>$1</strong> zapisow).",
index cba5f25..51104de 100644 (file)
        "recentchanges-label-bot": "यो सम्पादन बोटबठे गरियाको थ्यो",
        "recentchanges-label-unpatrolled": "यो सम्पादन यैलसम्म गस्ती गरियाको नाइथी",
        "recentchanges-label-plusminus": "यति बाइटहरू संख्याले पानाको आकार फेरबदल  भयाको छ",
-       "recentchanges-legend-heading": "'''आदर्श वाक्य:'''",
+       "recentchanges-legend-heading": "<strong>आदर्श वाक्य:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नौला पानाको सूची]] यैलाई लै हेरिदिय)",
        "rclistfrom": "$3 $2 देखिका नयाँ परिवर्तनहरू देखाउन्या",
        "rcshowhideminor": "$1 सानतिनो सम्पादन",
index bc53c06..388ad61 100644 (file)
        "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.",
        "recentchanges-label-plusminus": "Cambiamèint ed la pàgina in nómer ed byte",
-       "recentchanges-legend-heading": "'''Spiegasiòun:'''",
+       "recentchanges-legend-heading": "<strong>Spiegasiòun:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (guêrda [[Special:NewPages|al pàgini nōvi]])",
        "rcnotefrom": "Ché sòt a {{PLURAL:$5|gh'é la mudéfica fâta|gh'în al mudéfichi fâti}} a partîr da<strong>$3,$4</strong>(fîn a <strong>$1</strong>).",
        "rclistfrom": "Fà vèder al mudéfichi fâti a partîr da $3 $2",
index 13fe7ce..16d8c33 100644 (file)
        "markedaspatrollednotify": "Αυτή η αλλαγή σε $1 έχει επισημανθεί ως ελεγμένη.",
        "markedaspatrollederrornotify": "Σήμανση ως ελεγμένη απέτυχε.",
        "patrol-log-page": "Αρχείο καταγραφής περιπολιών",
-       "patrol-log-header": "Αυτός είναι ένας κατάλογος περιπολούμενων αναθεωρήσεων.",
-       "log-show-hide-patrol": "$1 ÎºÎ±Ï\84αγÏ\81αÏ\86ή ÎµÏ\80ιÏ\84ήÏ\81ηÏ\83ηÏ\82",
+       "patrol-log-header": "Αυτό είναι μητρώο ελεγμένων αναθεωρήσεων.",
+       "log-show-hide-patrol": "$1 Î¼Î·Ï\84Ï\81Ï\8eοÏ\85 ÎµÎ»Î­Î³Ï\87οÏ\85 ÎµÏ\80εξεÏ\81γαÏ\83ιÏ\8eν",
        "log-show-hide-tag": "$1 ετικέττα καταγραφής",
        "deletedrevision": "Η παλιά έκδοση της $1 διαγράφτηκε",
        "filedeleteerror-short": "Σφάλμα κατά τη διαγραφή του αρχείου: $1",
        "logentry-move-move_redir": "{{GENDER:$2|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στην $4 πάνω από την ανακατεύθυνση",
        "logentry-move-move_redir-noredirect": "{{GENDER:$2|Ο|Η}} $1 μετακίνησε την σελίδα $3 στην $4 πάνω από μια ανακατεύθυνση χωρίς να αφήσει ανακατεύθυνση",
        "logentry-patrol-patrol": "{{GENDER:$2|Ο|Η}} $1 επισήμανε την έκδοση $4 της σελίδας $3 ως ελεγμένη",
-       "logentry-patrol-patrol-auto": "{{GENDER:$2|Î\9f\97}} $1 Î±Ï\85Ï\84Ï\8cμαÏ\84α Ï\83ήμανε την έκδοση $4 της σελίδας $3 ως ελεγμένη",
+       "logentry-patrol-patrol-auto": "{{GENDER:$2|Î\9f\97}} $1 Î±Ï\85Ï\84Ï\8cμαÏ\84α Ï\83ημείÏ\89Ï\83ε την έκδοση $4 της σελίδας $3 ως ελεγμένη",
        "logentry-newusers-newusers": "Ο λογαριασμός χρήστη $1 {{GENDER:$2|δημιουργήθηκε}}",
        "logentry-newusers-create": "Ο λογαριασμός χρήστη $1 {{GENDER:$2|δημιουργήθηκε}}",
        "logentry-newusers-create2": "Ο λογαριασμός χρήστη $3 δημιουργήθηκε από {{GENDER:$2|τον|την}} $1",
index fea9fbd..5b32b97 100644 (file)
        "moredotdotdot": "More...",
        "morenotlisted": "This list is not complete.",
        "mypage": "Page",
+       "anonuserpage": "Unknown user",
        "mytalk": "Talk",
        "anontalk": "Talk",
        "navigation": "Navigation",
        "botpasswords-insert-failed": "Failed to add bot name \"$1\". Was it already added?",
        "botpasswords-update-failed": "Failed to update bot name \"$1\". Was it deleted?",
        "botpasswords-created-title": "Bot password created",
-       "botpasswords-created-body": "The bot password \"$1\" was created.",
+       "botpasswords-created-body": "The bot password for bot name \"$1\" of user \"$2\" was created.",
        "botpasswords-updated-title": "Bot password updated",
-       "botpasswords-updated-body": "The bot password \"$1\" was updated.",
+       "botpasswords-updated-body": "The bot password for bot name \"$1\" of user \"$2\" was updated.",
        "botpasswords-deleted-title": "Bot password deleted",
-       "botpasswords-deleted-body": "The bot password \"$1\" was deleted.",
+       "botpasswords-deleted-body": "The bot password for bot name \"$1\" of user \"$2\" was deleted.",
        "botpasswords-newpassword": "The new password to log in with <strong>$1</strong> is <strong>$2</strong>. <em>Please record this for future reference.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider is not available.",
        "botpasswords-restriction-failed": "Bot password restrictions prevent this login.",
        "changecontentmodel-title-label": "Page title",
        "changecontentmodel-model-label": "New content model",
        "changecontentmodel-reason-label": "Reason:",
+       "changecontentmodel-submit": "Change",
        "changecontentmodel-success-title": "The content model was changed",
        "changecontentmodel-success-text": "The content type of [[:$1]] has been changed.",
        "changecontentmodel-cannot-convert": "The content on [[:$1]] cannot be converted to a type of $2.",
index 148f851..57a3405 100644 (file)
        "createacct-yourpasswordagain": "Konfirmu pasvorton",
        "createacct-yourpasswordagain-ph": "Retajpu pasvorton",
        "remembermypassword": "Memori mian ensalutadon ĉe ĉi tiu komputilo (daŭrante maksimume $1 {{PLURAL:$1|tagon|tagojn}})",
-       "userlogin-remembermypassword": "Memoru mian ensaluton",
+       "userlogin-remembermypassword": "Memori mian ensaluton",
        "userlogin-signwithsecure": "Uzu sekurigitan konekton",
        "cannotloginnow-title": "Nuntempe ne eblas ensaluti",
        "cannotloginnow-text": "Ne eblas ensaluti dum uzado de $1.",
        "rollbackfailed": "Malfaro malsukcesis",
        "cantrollback": "Ne povas restarigi antaŭan redakton; la redaktinto lasta estas la sola aŭtoro de la paĝo.",
        "alreadyrolled": "Ne povas restarigi la lastan redakton de [[:$1]] de la [[User:$2|$2]] ([[User talk:$2|diskuto]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\npro tio, ke oni intertempe redaktis aŭ restarigis la paĝon.\nLa lasta redaktinto estis [[User:$3|$3]] ([[User talk:$3|diskuto]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
-       "editcomment": "La resumo de la komento estis: <em>$1</em>.",
+       "editcomment": "La resumo de la redakto estis: <em>$1</em>.",
        "revertpage": "Malfaris redaktojn de [[Special:Contributions/$2|$2]] ([[User talk:$2|diskuto]]) al la lasta versio de [[User:$1|$1]]",
        "revertpage-nouser": "Restarigis redaktojn de (salutnomo forigita) al lasta revizio de {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Restaris redaktojn de $1; ŝanĝis al lasta versio de $2.",
        "limitreport-expansiondepth": "Plej alta profundeco de etendo",
        "limitreport-expensivefunctioncount": "Nombro de kostaj sintaks-analizilaj funkcioj",
        "expandtemplates": "Ŝablonetendilo",
-       "expand_templates_intro": "Ĉi tiu speciala paĝo traktas tekston kaj ampleksigas ĉiujn ŝablonojn en ĝi rekursie.\nĜi ankaŭ ampleksigas sintaksajn funkciojn kiel\n<code><nowiki>{{</nowiki>#language:…}}</code> kaj variablojn kiel\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>. Fakte preskaŭ iujn ajn en duoblaj krampoj.",
+       "expand_templates_intro": "Ĉi tiu speciala paĝo prenas tekston kaj rikure etendas ĉiujn ŝablonojn en ĝi.\nĜi etendas ankaŭ sintaksajn funkciojn kiel\n<code><nowiki>{{</nowiki>#language:…}}</code> kaj variablojn kiel\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nFakte, ĝi etendas preskaŭ ĉion en duoblaj krampoj.",
        "expand_templates_title": "Kunteksta titolo, por {{FULLPAGENAME}}, ktp.:",
        "expand_templates_input": "Enigita teksto:",
        "expand_templates_output": "Rezulto",
index 21ecee3..ba5efa0 100644 (file)
        "moredotdotdot": "Más...",
        "morenotlisted": "Esta lista no está completa.",
        "mypage": "Página",
+       "anonuserpage": "Usuario desconocido",
        "mytalk": "Discusión",
        "anontalk": "Discusión",
        "navigation": "Navegación",
        "currentevents": "Actualidad",
        "currentevents-url": "Project:Actualidad",
        "disclaimers": "Aviso legal",
-       "disclaimerpage": "Project:Limitación general de responsabilidad",
+       "disclaimerpage": "Project:Descargo general",
        "edithelp": "Ayuda de edición",
        "helppage-top-gethelp": "Ayuda",
        "mainpage": "Página principal",
        "createaccount-title": "Creación de cuenta para {{SITENAME}}",
        "createaccount-text": "Alguien creó en {{SITENAME}} ($4) una cuenta asociada a este correo electrónico con el nombre «$2» y contraseña «$3». Por favor, accede ahora y cambia tu contraseña.\n\nSi esta cuenta fue creada por error, ignora este mensaje.",
        "login-throttled": "Has intentado iniciar sesión demasiadas veces seguidas. Por favor espera $1 antes de intentarlo nuevamente.",
-       "login-abort-generic": "Se ha intentado acceder sin éxito - Cancelado",
+       "login-abort-generic": "Falló el inicio de sesión - Cancelado",
        "login-migrated-generic": "Se ha trasladado tu cuenta. Tu nombre de usuario ya no existe en este wiki.",
        "loginlanguagelabel": "Idioma: $1",
        "suspicious-userlogout": "Tu solicitud de desconexión ha sido denegada, pues parece haber sido enviada desde un navegador defectuoso o un proxy caché.",
        "newpassword": "Contraseña nueva:",
        "retypenew": "Confirmar la contraseña nueva:",
        "resetpass_submit": "Establecer contraseña e iniciar sesión",
-       "changepassword-success": "La contraseña se modificó correctamente.",
+       "changepassword-success": "Se modificó la contraseña.",
        "changepassword-throttled": "Has intentado acceder demasiadas veces recientemente.\nEspera $1 antes de intentarlo de nuevo.",
        "botpasswords": "Contraseñas de bots",
        "botpasswords-summary": "Las <em>contraseñas de bots</em> permiten el acceso a una cuenta de usuario mediante la API sin usar las credenciales principales de la cuenta. Los derechos de un usuario mientras haya iniciado sesión con una contraseña de bot pueden estar restringidos.\n\nSi no sabes por qué querrías hacer esto, probablemente no deberías hacerlo. Nadie debería pedirte que generes una de estas claves y que se la entregues.",
        "botpasswords-insert-failed": "No se pudo agregar el nombre del bot \"$1\". ¿Ya ha sido añadido?",
        "botpasswords-update-failed": "No se pudo actualizar el nombre del bot \"$1\". ¿Ha sido borrado?",
        "botpasswords-created-title": "Se creó la contraseña de bot",
-       "botpasswords-created-body": "La contraseña de bot \"$1\" se creó correctamente.",
-       "botpasswords-updated-title": "La contraseña de bot ha sido actualizada",
-       "botpasswords-updated-body": "La contraseña de bot\"$1\" se actualizó correctamente.",
-       "botpasswords-deleted-title": "La contraseña de bot ha sido eliminada",
-       "botpasswords-deleted-body": "La contraseña de bot \"$1\" ha sido eliminada.",
+       "botpasswords-created-body": "Se creó la contraseña del bot llamado \"$1\" del usuario \"$2\".",
+       "botpasswords-updated-title": "Se actualizó la contraseña de bot",
+       "botpasswords-updated-body": "Se actualizó la contraseña del bot llamado \"$1\" del usuario \"$2\".",
+       "botpasswords-deleted-title": "Se eliminó la contraseña de bot",
+       "botpasswords-deleted-body": "Se eliminó la contraseña del bot llamado \"$1\" del usuario \"$2\".",
        "botpasswords-newpassword": "La nueva contraseña para iniciar sesión con <strong>$1</strong> es <strong>$2</strong>. <em>Conserva estos datos para usos futuros.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider no está disponible.",
        "botpasswords-restriction-failed": "Las restricciones de la contraseña de bot impiden este inicio de sesión.",
        "resetpass-no-info": "Debes iniciar sesión para acceder directamente a esta página.",
        "resetpass-submit-loggedin": "Cambiar contraseña",
        "resetpass-submit-cancel": "Cancelar",
-       "resetpass-wrong-oldpass": "La contraseña actual, o temporal, no es correcta.\nPuede que ya hayas cambiado exitosamente tu contraseña o que hayas pedido una nueva contraseña temporal.",
+       "resetpass-wrong-oldpass": "La contraseña actual, o temporal, no es correcta.\nPuede que ya hayas cambiado tu contraseña o que hayas pedido una nueva contraseña temporal.",
        "resetpass-recycled": "Restablece tu contraseña a algo distinto de tu contraseña actual.",
        "resetpass-temp-emailed": "Has iniciado sesión con una contraseña temporal enviada por correo electrónico.\nPara continuar, debes establecer una nueva contraseña aquí:",
        "resetpass-temp-password": "Contraseña temporal:",
        "revdelete-unsuppress": "Eliminar restricciones de las revisiones restauradas",
        "revdelete-log": "Motivo:",
        "revdelete-submit": "Aplicar a {{PLURAL:$1|la revisión seleccionada|las revisiones seleccionadas}}",
-       "revdelete-success": "Se ha cambiado con éxito la visibilidad de las revisiones.",
+       "revdelete-success": "Se cambió la visibilidad de las revisiones.",
        "revdelete-failure": "No se ha podido cambiar la visibilidad de las revisiones:\n$1",
-       "logdelete-success": "Se ha cambiado con éxito la visibilidad de los eventos.",
+       "logdelete-success": "Se cambió la visibilidad de los registros.",
        "logdelete-failure": "No se pudo cambiar la visibilidad de los eventos:\n$1",
        "revdel-restore": "cambiar visibilidad",
        "pagehist": "Historial de la página",
        "userrights-changeable-col": "Grupos que puedes cambiar",
        "userrights-unchangeable-col": "Grupos que no puedes cambiar",
        "userrights-conflict": "¡Conflicto de cambio de los permisos de usuario! Por favor, revisa y confirma tus cambios.",
-       "userrights-removed-self": "Has eliminado con éxito tus propios permisos. Por tanto, ya no podrás volver a acceder a esta página.",
+       "userrights-removed-self": "Has eliminado tus propios permisos. Por tanto, ya no podrás volver a acceder a esta página.",
        "group": "Grupo:",
        "group-user": "Usuarios",
        "group-autoconfirmed": "Autoconfirmados",
        "recentchanges-label-bot": "Esta edición fue realizada por un robot",
        "recentchanges-label-unpatrolled": "Esta edición aún no ha sido verificada",
        "recentchanges-label-plusminus": "El tamaño de la página cambió esta cantidad de bytes",
-       "recentchanges-legend-heading": "'''Leyenda:'''",
+       "recentchanges-legend-heading": "<strong>Leyenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (véase también la [[Special:NewPages|lista de páginas nuevas]])",
        "recentchanges-submit": "Mostrar",
        "rcnotefrom": "Debajo aparece{{PLURAL:$5| el cambio|n los cambios}} desde <strong>$3, $4</strong> (se muestran hasta <strong>$1</strong>).",
        "uploadstash-clear": "Borrar los ficheros escondidos",
        "uploadstash-nofiles": "No tienes archivos escondidos.",
        "uploadstash-badtoken": "No se pudo realizar la acción. Es posible que haya finalizado el tiempo de espera de la sesión. Inténtalo de nuevo.",
-       "uploadstash-errclear": "El borrado de los archivos no tuvo éxito.",
+       "uploadstash-errclear": "Falló el borrado de los archivos.",
        "uploadstash-refresh": "Actualizar la lista de archivos",
        "invalid-chunk-offset": "Desplazamiento inválido del fragmento",
        "img-auth-accessdenied": "Acceso denegado",
        "changecontentmodel-title-label": "Título de página",
        "changecontentmodel-model-label": "Modelo de contenido nuevo",
        "changecontentmodel-reason-label": "Motivo:",
+       "changecontentmodel-submit": "Cambiar",
        "changecontentmodel-success-title": "Se cambió el modelo de contenido",
        "changecontentmodel-success-text": "Se ha cambiado el tipo de contenido de [[:$1]].",
        "changecontentmodel-cannot-convert": "El contenido de [[:$1]] no se puede convertir a un tipo de $2.",
        "exif-attributionurl": "Cuando reutilices este trabajo, por favor enlaza a",
        "exif-preferredattributionname": "Al volver a utilizar este trabajo, por favor da crédito",
        "exif-pngfilecomment": "Comentario de archivo PNG",
-       "exif-disclaimer": "Aviso legal",
+       "exif-disclaimer": "Descargo",
        "exif-contentwarning": "Advertencia de contenido",
        "exif-giffilecomment": "Comentario de archivo GIF",
        "exif-intellectualgenre": "Tipo de elemento",
        "tags-delete-not-allowed": "No se pueden eliminar las etiquetas definidas por una extensión, a menos que esta lo permita expresamente.",
        "tags-delete-not-found": "La etiqueta «$1» no existe.",
        "tags-delete-too-many-uses": "No se puede borrar la etiqueta \"$1\" porque se ha aplicado a más de {{PLURAL:$2|una revisión|$2 revisiones}}.",
-       "tags-delete-warnings-after-delete": "La etiqueta \"$1\" se borró exitosamente, pero con {{PLURAL:$2|la siguiente advertencia|las siguientes advertencias}}:",
+       "tags-delete-warnings-after-delete": "La etiqueta \"$1\" se borró, pero con {{PLURAL:$2|la siguiente advertencia|las siguientes advertencias}}:",
        "tags-activate-title": "Activar etiqueta",
        "tags-activate-question": "Estás a punto de activar la etiqueta «$1».",
        "tags-activate-reason": "Motivo:",
        "tags-edit-reason": "Motivo:",
        "tags-edit-revision-submit": "Aplicar los cambios a {{PLURAL:$1|esta revisión|$1 revisiones}}",
        "tags-edit-logentry-submit": "Aplicar los cambios a {{PLURAL:$1|esta entrada del registro|$1 entradas del registro}}",
-       "tags-edit-success": "Los cambios se aplicaron con éxito.",
+       "tags-edit-success": "Se aplicaron los cambios.",
        "tags-edit-failure": "No se pudieron aplicar los cambios:\n$1",
        "tags-edit-nooldid-title": "Revisión de página no válida",
        "tags-edit-nooldid-text": "No se especificó ninguna revisión en que realizar esta acción, o bien, la revisión especificada no existe.",
index 4e95038..5ce1955 100644 (file)
        "recentchanges-label-bot": "Roboti tehtud muudatus",
        "recentchanges-label-unpatrolled": "Seda muudatust ei ole veel kontrollitud",
        "recentchanges-label-plusminus": "Lehekülje suuruse muutus baitides",
-       "recentchanges-legend-heading": "'''Seletus:'''",
+       "recentchanges-legend-heading": "<strong>Seletus:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vaata ka [[Special:NewPages|uute lehekülgede loendit]])",
        "recentchanges-submit": "Näita",
        "rcnotefrom": "Allpool on toodud {{PLURAL:$5|muudatus|muudatused}} alates: <strong>$3, kell $4</strong> (näidatakse kuni <strong>$1</strong> muudatust)",
index 5659fd0..e99ed78 100644 (file)
        "recentchanges-label-bot": "Aldaketa hau bot batek egin du",
        "recentchanges-label-unpatrolled": "Aldaketa hau ez da oraindik patruilatua izan",
        "recentchanges-label-plusminus": "Orriaren neurriak byte kopuru honen gorabehera izan du",
-       "recentchanges-legend-heading": "'''Azalpenak:'''",
+       "recentchanges-legend-heading": "<strong>Azalpenak:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ikus, gainera, [[Special:NewPages|orri berrien zerrenda]])",
        "recentchanges-submit": "Erakutsi",
        "rcnotefrom": "Jarraian azaltzen diren aldaketak data honetatik aurrerakoak dira: <b>$2</b> (gehienez <b>$1</b> erakusten dira).",
index 7b007e8..6b1e3e0 100644 (file)
@@ -50,7 +50,8 @@
                        "MRG90",
                        "Mahdy Saffar",
                        "Arian Ar",
-                       "Ms96"
+                       "Ms96",
+                       "Freshman404"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
        "moredotdotdot": "بیشتر...",
        "morenotlisted": "این فهرست کامل نیست.",
        "mypage": "صفحه",
+       "anonuserpage": "کاربر ناشناس",
        "mytalk": "بحث",
        "anontalk": "بحث",
        "navigation": "ناوبری",
        "nocookieslogin": "{{SITENAME}} برای ورود کاربران به سامانه از کوکی‌ها استفاده می‌کند.\nشما کوکی‌ها را از کار انداخته‌اید.\nلطفاً کوکی‌ها را به کار بیندازید و دوباره امتحان کنید.",
        "nocookiesfornew": "حساب کاربری ساخته نشد، زیرا نتوانستیم منبع آن را تأیید کنیم.\nمطمئن شوید که کوکی‌ها فعال هستند، آن‌گاه صفحه را از نو بارگیری کنید و دوباره امتحان کنید.",
        "noname": "شما نام کاربری معتبری مشخص نکرده‌اید.",
-       "loginsuccesstitle": "ورود موفقیت‌آمیز به سامانه",
+       "loginsuccesstitle": "ورود به سامانه",
        "loginsuccess": "'''شما اکنون با نام «$1» به {{SITENAME}} وارد شده‌اید.'''",
        "nosuchuser": "کاربری با نام «$1» وجود ندارد.\nنام کاربری به بزرگی و کوچکی حروف حساس است.\nاملای نام را بررسی کنید، یا [[Special:UserLogin/signup|یک حساب کاربری تازه بسازید]].",
        "nosuchusershort": "هیچ کاربری با نام ''$1'' وجود ندارد.\nاملایتان را وارسی کنید.",
        "newpassword": "گذرواژهٔ تازه:",
        "retypenew": "گذرواژهٔ تازه را دوباره وارد کنید",
        "resetpass_submit": "تنظیم گذرواژه و ورود به سامانه",
-       "changepassword-success": "گذرÙ\88اÚ\98Ù\87Ù\94 Ø´Ù\85ا Ø¨Ø§ Ù\85Ù\88Ù\81Ù\82Û\8cت ØªØºÛ\8cÛ\8cر Ø¯Ø§Ø¯Ù\87 Ø´Ø¯!",
+       "changepassword-success": "گذرواژهٔ شما تغییر داده شد!",
        "changepassword-throttled": "شما به تازگی چندین‌بار برای ثبت ورود تلاش کرده‌اید.\nلطفاً پیش از آنکه دوباره تلاش کنید $1 صبر کنید.",
        "botpasswords": "گذرواژه ربات",
        "botpasswords-summary": "<em>گذرواژه‌های رباتی</em> اجازه دسترسی به یک حساب کاربری با ای‌پی‌آی بدون استفاده از رمز اصلی حساب را می‌دهد. دسترسی‌های کاربری موجود هنگامی که با گذرواژهٔ رباتیک وارد می‌شوید ممکن است محدود باشند.\n\nاگر نمی‌دانید که ممکن است با این چه کنید، احتمالاً نباید هیچ کاری کنید. هیچ‌کس نباید از شما خواسته باشد که یکی از این‌ها درست کنید به آن‌ها بدهید.",
        "botpasswords-insert-failed": "شکست در افزودن نام ربات «$1». در حال حاضر اضافه شده است؟",
        "botpasswords-update-failed": "شکست در به‌روزرسانی نام رباتی «$1». حذف شده است؟",
        "botpasswords-created-title": "گذرواژه ربات ایجاد شد",
-       "botpasswords-created-body": "گذرواژهٔ رباتی «$1» با موفقیت ایجاد شد.",
+       "botpasswords-created-body": "گذرواژهٔ رباتی برای ربات «$1» و کاربر «$2» ایجاد شد.",
        "botpasswords-updated-title": "گذرواژه ربات به‌روز شد",
-       "botpasswords-updated-body": "گذرواژهٔ رباتی «$1» با موفقیت به‌روز شد.",
+       "botpasswords-updated-body": "گذرواژهٔ رباتی برای ربات «$1» و کاربر «$2» به‌روز شد.",
        "botpasswords-deleted-title": "گذرواژه ربات حذف شد",
-       "botpasswords-deleted-body": "گذرواژهٔ رباتی «$1» حذف شد.",
+       "botpasswords-deleted-body": "گذرواژهٔ رباتی برای ربات «$1» و کاربر «$2» حذف شد.",
        "botpasswords-newpassword": "<strong>$2</strong> گذرواژهٔ جدید برای ورود با <strong>$1</strong> است. <em>لطفاً این را برای ارجاع در آینده ذخیره کنید.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider موجود نیست.",
        "botpasswords-restriction-failed": "محدودیت‌های گذرواژهٔ ربات از این ورود جلوگیری می‌کند.",
        "resetpass-no-info": "برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.",
        "resetpass-submit-loggedin": "تغییر گذرواژه",
        "resetpass-submit-cancel": "لغو",
-       "resetpass-wrong-oldpass": "گذرÙ\88اÚ\98Ù\87Ù\94 Ù\85Ù\88Ù\82ت Û\8cا Ø§Ø®Û\8cر Ù\86اÙ\85عتبر.\nÙ\85Ù\85Ú©Ù\86 Ø§Ø³Øª Ú©Ù\87 Ø´Ù\85ا Ù\87Ù\85Û\8cÙ\86Ú© Ú¯Ø°Ø±Ù\88اÚ\98Ù\87â\80\8cتاÙ\86 Ø±Ø§ Ø¨Ø§ Ù\85Ù\88Ù\81Ù\82Û\8cت ØªØºÛ\8cÛ\8cر Ø¯Ø§Ø¯Ù\87 Ø¨Ø§Ø´Û\8cد Û\8cا Ø¯Ø±Ø®Ù\88است Û\8cÚ© Ú¯Ø°Ø±Ù\88اÚ\98Ù\87Ù\94 Ù\85Ù\88Ù\82ت ØªØ§Ø²Ù\87 Ú©Ø±Ø¯Ù\87 Ø¨Ø§Ø´Û\8cد.",
+       "resetpass-wrong-oldpass": "گذرواژهٔ موقت یا اخیر نامعتبر.\nممکن است که شما همینک گذرواژه‌تان را تغییر داده باشید یا درخواست یک گذرواژهٔ موقت تازه کرده باشید.",
        "resetpass-recycled": "لطفاً رمز عبور خود را به چیز دیگری غیر از رمز عبور فعلی تنظیم کنید.",
        "resetpass-temp-emailed": "شما با یک کد ایمیل شدهٔ موقت وارد شده‌اید.\nبرای پایان ورود، شما باید رمز عبور جدیدی اینجا وارد کنید:",
        "resetpass-temp-password": "گذرواژهٔ موقت:",
        "userpage-userdoesnotexist": "حساب کاربر «<nowiki>$1</nowiki>» ثبت نشده‌است.\nلطفاً مطمئن شوید که می‌خواهید این صفحه را ایجاد یا ویرایش کنید.",
        "userpage-userdoesnotexist-view": "حساب کاربری «$1» ثبت نشده‌است.",
        "blocked-notice-logextract": "دسترسی این کاربر در حال حاضر بسته است.\nآخرین مورد سیاهه قطع دسترسی در زیر آمده‌است:",
-       "clearyourcache": "<strong>نکته:</strong> پس از ذخیرهکردن ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.\n*<strong>فایرفاکس / سافاری:</strong> کلید <em>Shift</em> را نگه دارید و روی دکمهٔ <em>Reload</em> کلیک کنید، یا کلید‌های <em>Ctrl-F5</em> یا <em>Ctrl-R</em> را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های <em>⌘-R</em>)\n*<strong>گوگل کروم:</strong> کلیدهای <em>Ctrl+Shift+R</em> را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های <em>⌘-Shift-R</em>)\n*<strong>اینترنت اکسپلورر:</strong> کلید <em>Ctrl</em> را نگه‌دارید و روی دکمهٔ <em>Refresh</em> کلیک کنید، یا کلید‌های <em>Ctrl-F5</em> را با هم فشار دهید\n*<strong>اپرا:</strong> حافظهٔ نهانی مرورگر را از طریق منوی <em>Tools &rarr; Preferences</em> پاک کنید",
-       "usercssyoucanpreview": "'''نکته:''' پیش از ذخیرهکردن پرونده سی‌اس‌اس خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
-       "userjsyoucanpreview": "'''نکته:''' پیش از ذخیرهکردن پروندهٔ جاوااسکریپت خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
+       "clearyourcache": "<strong>نکته:</strong> پس از ذخیره کردن ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.\n*<strong>فایرفاکس / سافاری:</strong> کلید <em>Shift</em> را نگه دارید و روی دکمهٔ <em>Reload</em> کلیک کنید، یا کلید‌های <em>Ctrl-F5</em> یا <em>Ctrl-R</em> را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های <em>⌘-R</em>)\n*<strong>گوگل کروم:</strong> کلیدهای <em>Ctrl+Shift+R</em> را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های <em>⌘-Shift-R</em>)\n*<strong>اینترنت اکسپلورر:</strong> کلید <em>Ctrl</em> را نگه‌دارید و روی دکمهٔ <em>Refresh</em> کلیک کنید، یا کلید‌های <em>Ctrl-F5</em> را با هم فشار دهید\n*<strong>اپرا:</strong> حافظهٔ نهانی مرورگر را از طریق منوی <em>Tools &rarr; Preferences</em> پاک کنید",
+       "usercssyoucanpreview": "'''نکته:''' پیش از ذخیره کردن پرونده سی‌اس‌اس خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
+       "userjsyoucanpreview": "'''نکته:''' پیش از ذخیره کردن پروندهٔ جاوااسکریپت خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
        "usercsspreview": "'''فراموش مکنید که شما فقط دارید پیش‌نمایش سی‌اس‌اس کاربری‌تان را می‌بینید.'''\n'''این سی‌اس‌اس هنوز ذخیره نشده‌است!'''",
        "userjspreview": "'''به یاد داشته باشید که شما فقط دارید جاوااسکریپت کاربری‌تان را امتحان می‌کنید/پیش‌نمایش آن را می‌بینید.'''\n'''این جاوااسکریپت هنوز ذخیره نشده‌است!'''",
        "sitecsspreview": "'''به یاد داشته باشید که شما فقط دارید پیش‌نمایش این سی‌اس‌اس را می‌بینید.'''\n'''این سی‌اس‌اس هنوز ذخیره نشده‌است!'''",
        "revdelete-unsuppress": "حذف محدودیت‌ها در بازبینی‌های ترمیم‌شده",
        "revdelete-log": "دلیل:",
        "revdelete-submit": "اعمال بر {{PLURAL:$1|نسخهٔ|نسخه‌های}} انتخاب شده",
-       "revdelete-success": "'''پیدایی نسخه با موفقیت به روز شد.'''",
+       "revdelete-success": "'''پیدایی نسخه به روز شد.'''",
        "revdelete-failure": "'''پیدایی نسخه‌ها قابل به روز کردن نیست:'''\n$1",
-       "logdelete-success": "تغÛ\8cÛ\8cر Ù¾Û\8cداÛ\8cÛ\8c Ù\85Ù\88رد Ø¨Ø§ Ù\85Ù\88Ù\81Ù\82Û\8cت Ø§Ù\86جاÙ\85 Ø´Ø¯.",
+       "logdelete-success": "تغییر پیدایی مورد انجام شد.",
        "logdelete-failure": "'''پیدایی سیاهه‌ها قابل تنظیم نیست:'''\n$1",
        "revdel-restore": "تغییر پیدایی",
        "pagehist": "تاریخچهٔ صفحه",
        "search-suggest": "آیا منظورتان این بود: $1",
        "search-rewritten": "نمایش نتایج $1. جستجوی به جای $2.",
        "search-interwiki-caption": "پروژه‌های خواهر",
-       "search-interwiki-default": "نتایج از $1 :",
+       "search-interwiki-default": "نتایج از $1:",
        "search-interwiki-more": "(بیشتر)",
        "search-relatedarticle": "مرتبط",
        "searchrelated": "مرتبط",
        "userrights-changeable-col": "گروه‌هایی که می‌توانید تغییر دهید",
        "userrights-unchangeable-col": "گروه‌هایی که نمی‌توانید تغییر دهید",
        "userrights-conflict": "تعارض دسترسی‌های کاربری! لطفاً بررسی کنید و تغییرات را تأیید کنید.",
-       "userrights-removed-self": "Ø´Ù\85ا Ø¨Ø§ Ù\85Ù\88Ù\81Ù\82Û\8cت Ø¯Ø³ØªØ±Ø³Û\8câ\80\8cÙ\87اÛ\8c Ø®Ù\88د Ø±Ø§ Ù\88استاÙ\86دÛ\8cد. Ø¨Ù\87 Ø§Û\8cÙ\86 ØªØ±ØªÛ\8cب Ø´Ù\85ا Ø¯Û\8cگر Ø¨Ù\87 Ø§Û\8cÙ\86 ØµÙ\81Ø­Ù\87 Ø¯Ø³ØªØ±Ø³Û\8c Ù\86دارÛ\8cد.",
+       "userrights-removed-self": "شما دسترسی‌های خود را واستاندید. به این ترتیب شما دیگر به این صفحه دسترسی ندارید.",
        "group": "گروه:",
        "group-user": "کاربران",
        "group-autoconfirmed": "کاربران تأییدشدهٔ خودکار",
        "uploadstash-summary": "این صفحه دسترسی به پرونده‌هایی که بارگذاری شده‌اند (یا در حال بارگذاری هستند) اما هنوز در ویکی منتشر نشده‌اند را فراهم می‌کند. این پرونده‌ها توسط هیچ کاربری به جز کسی که آن‌ها را بارگذاری کرده قابل دیدن نیستند.",
        "uploadstash-clear": "پاک‌کردن پرونده‌های انبارشده",
        "uploadstash-nofiles": "شما هیچ پروندهٔ انبارشده‌ای ندارید.",
-       "uploadstash-badtoken": "انجام این اقدام ناموفق بود، احتمالاً به این دلیل که اعتبار ویرایش شما به اتمام رسیده است. دوباره امتحان کنید.",
+       "uploadstash-badtoken": "انجام این اقدام ناموفق بود، احتمالاً به این دلیل که اعتبار ویرایش شما به اتمام رسیده است. لطفاً دوباره امتحان کنید.",
        "uploadstash-errclear": "پاک‌کردن پرونده‌ها ناموفق بود.",
        "uploadstash-refresh": "تازه کردن فهرست پرونده‌ها",
        "invalid-chunk-offset": "جابجایی نامعتبر قطعه",
        "ninterwikis": "$1 {{PLURAL:$1|میان‌ویکی|میان‌ویکی}}",
        "nlinks": "$1 {{PLURAL:$1|پیوند|پیوند}}",
        "nmembers": "$1 {{PLURAL:$1|عضو|عضو}}",
-       "nmemberschanged": "$1 â\86\92 $2   {{PLURAL:$2| عضو|عضو}}",
+       "nmemberschanged": "$1 â\86\90 $2 {{PLURAL:$2| عضو|عضو}}",
        "nrevisions": "$1 {{PLURAL:$1|نسخه|نسخه}}",
        "nimagelinks": "مورد استفاده در $1 {{PLURAL:$1|صفحه|صفحه}}",
        "ntransclusions": "در $1 {{PLURAL:$1|صفحه|صفحه}} استفاده شده‌است",
        "changecontentmodel-title-label": "عنوان صفحه",
        "changecontentmodel-model-label": "نمونه محتوای جدید",
        "changecontentmodel-reason-label": "دلیل:",
+       "changecontentmodel-submit": "تغییر",
        "changecontentmodel-success-title": "نمونه محتوی تغییر یافت",
        "changecontentmodel-success-text": "نوع محتوی [[:$1]]  تغییر یافت",
        "changecontentmodel-cannot-convert": "محتوی در [[:$1]] نمی‌تواند به گونه‌ای از $2 تبدیل شود.",
        "sp-contributions-newbies-sub": "برای تازه‌کاران",
        "sp-contributions-newbies-title": "مشارکت‌های کاربری برای حساب‌های تازه‌کار",
        "sp-contributions-blocklog": "سیاههٔ بسته‌شدن‌ها",
-       "sp-contributions-suppresslog": "کمک‌های کاربر متوقف شده",
+       "sp-contributions-suppresslog": "مشارکت‌های فرونشانی‌شده",
        "sp-contributions-deleted": "مشارکت‌های حذف‌شدهٔ کاربر",
        "sp-contributions-uploads": "بارگذاری‌ها",
        "sp-contributions-logs": "سیاهه‌ها",
        "tooltip-ca-nstab-category": "دیدن صفحهٔ رده",
        "tooltip-minoredit": "این ویرایش را ویرایش جزئی نشانه‌گذاری کن",
        "tooltip-save": "تغییرات خود را ذخیره کنید",
-       "tooltip-preview": "پیش‌نمایش تغییرات شما، لطفاً قبل از ذخیرهکردن صفحه از این کلید استفاده کنید.",
+       "tooltip-preview": "پیش‌نمایش تغییرات شما، لطفاً قبل از ذخیره کردن صفحه از این کلید استفاده کنید.",
        "tooltip-diff": "نمایش تغییراتی که شما در متن داده‌اید.",
        "tooltip-compareselectedversions": "دیدن تفاوت‌های دو نسخهٔ انتخاب‌شده از این صفحه",
        "tooltip-watch": "این صفحه را به فهرست پی‌گیری‌هایتان بیفزایید.",
        "tags-delete-not-allowed": "برچسب‌هایی که در یک افزونه تعریف می‌شوند قابل حذف نیستند، مگر اینکه آن افزونه در این مورد خاص این قابلیت را بدهد.",
        "tags-delete-not-found": "تگ «$1» وجود ندارد.",
        "tags-delete-too-many-uses": "برچسب \"$1\" در بیش از $2 نسخه اعمال شده است و نمی‌توان آن را حذف نمود.",
-       "tags-delete-warnings-after-delete": "برÚ\86سب \"$1\" Ø¨Ø§ Ù\85Ù\88Ù\81Ù\82Û\8cت Ø­Ø°Ù\81 Ø´Ø¯Ø\8c Ø§Ù\85ا Ø¨Ø§ {{PLURAL:$2|خطاÛ\8c|خطاÙ\87اÛ\8c}} Ø²Û\8cر Ù\87Ù\85راÙ\87 Ø¨Ù\88د:",
+       "tags-delete-warnings-after-delete": "برچسب \"$1\" حذف شد، اما با {{PLURAL:$2|خطای|خطاهای}} زیر همراه بود:",
        "tags-activate-title": "فعال‌سازی برچسب",
        "tags-activate-question": "شما در حال فعال‌سازی تگ «$1» هستید.",
        "tags-activate-reason": "دلیل:",
        "tags-edit-reason": "دلیل:",
        "tags-edit-revision-submit": "اعمال تغییرات بر روی {{PLURAL:$1|این نسخه|$1 نسخه}}",
        "tags-edit-logentry-submit": "اعمال تغییرات بر روی {{PLURAL:$1|این سیاهه|$1 سیاهه}}",
-       "tags-edit-success": "تغÛ\8cÛ\8cرات Ø¨Ø§ Ù\85Ù\88Ù\81Ù\82Û\8cت Ø§Ø¹Ù\85اÙ\84 Ø´Ø¯Ù\86د.",
+       "tags-edit-success": "تغییرات اعمال شدند.",
        "tags-edit-failure": "امکان اعمال تغییرات وجود ندارد: $1",
        "tags-edit-nooldid-title": "نسخهٔ مقصد نادرست",
        "tags-edit-nooldid-text": "نسخهٔ مقصد برای اعمال تابع مورد نظر را مشخص نکرده‌اید، یا نسخهٔ مورد نظر وجود ندارد.",
index 805ed0e..d12e340 100644 (file)
        "recentchanges-label-bot": "Henda rætting varð gjørd av einum botti",
        "recentchanges-label-unpatrolled": "Henda rætting er ikki blivin eftirkannað enn",
        "recentchanges-label-plusminus": "Støddin á síðuni broyttist við hesum talinum av bytes",
-       "recentchanges-legend-heading": "'''Teknfrágreiðing:'''",
+       "recentchanges-legend-heading": "<strong>Teknfrágreiðing:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sí eisini [[Special:NewPages|yvirlit yvir nýggjar síður]])",
        "rcnotefrom": "Niðanfyri verða broytingar síðan <strong>$2</strong> (upp til <strong>$1</strong> vístar).",
        "rclistfrom": "Sýn nýggjar broytingar byrjandi við $3 $2",
index a0ef809..cd0cfd0 100644 (file)
                        "StevenJ81",
                        "The RedBurn",
                        "Fredlefred",
-                       "Lbayle"
+                       "Lbayle",
+                       "Cl3m3n7",
+                       "C13m3n7"
                ]
        },
        "tog-underline": "Soulignement des liens :",
        "moredotdotdot": "Plus...",
        "morenotlisted": "Cette liste n’est pas complète.",
        "mypage": "Page",
+       "anonuserpage": "Utilisateur inconnu",
        "mytalk": "Discussion",
        "anontalk": "Discussion",
        "navigation": "Navigation",
        "nocookieslogin": "{{SITENAME}} utilise des cookies pour la connexion mais vous les avez désactivés. Veuillez les activer et vous reconnecter.",
        "nocookiesfornew": "Le compte utilisateur n'a pas été créé, car nous n'avons pas pu identifier son origine.\nVérifiez que vous avez activé les cookies, rechargez la page et réessayez.",
        "noname": "Vous n'avez pas saisi un nom d'utilisateur valide.",
-       "loginsuccesstitle": "Connexion réussie",
+       "loginsuccesstitle": "Connecté",
        "loginsuccess": "Vous êtes maintenant connecté{{GENDER:$1||e}} à {{SITENAME}} en tant que « $1 ».",
        "nosuchuser": "L'utilisateur « $1 » n'existe pas.\nLes noms d'utilisateurs sont sensibles à la casse.\nVérifiez l'orthographe, ou [[Special:UserLogin/signup|créez un nouveau compte]].",
        "nosuchusershort": "Il n'y a pas de contributeur avec le nom « $1 ». Veuillez vérifier l'orthographe.",
        "newpassword": "Nouveau mot de passe :",
        "retypenew": "Confirmer le nouveau mot de passe :",
        "resetpass_submit": "Changer le mot de passe et se connecter",
-       "changepassword-success": "Votre mot de passe a été changé avec succès !",
+       "changepassword-success": "Votre mot de passe a été modifié !",
        "changepassword-throttled": "Vous avez fait trop de tentatives de connexion récemment.\nVeuillez attendre $1 avant de réessayer.",
        "botpasswords": "Mots de passe de robots",
        "botpasswords-summary": "<em>Mots de passe de robots</em> permet d’accéder à un compte utilisateur via l’API sans utiliser les identifiants de connexion principaux. Les droits utilisateur disponibles en étant connecté avec un mot de passe robot peuvent être réduits.\n\nSi vous ne voyez pas pourquoi vous voudriez faire cela, c’est que vous n’en avez pas besoin. Personne ne devrait jamais vous demander d’en générer un et de le lui donner.",
        "botpasswords-insert-failed": "Échec de l’ajout du nom de robot « $1 ». A-t-il déjà été ajouté ?",
        "botpasswords-update-failed": "Échec à la mise à jour du nom de robot « $1 ». A-t-il déjà été supprimé ?",
        "botpasswords-created-title": "Mot de passe de robots créé",
-       "botpasswords-created-body": "Le mot de passe de robots « $1 » a bien été créé.",
+       "botpasswords-created-body": "Le mot de passe pour le robot « $1 » de l'utilisateur « $2 » a été créé.",
        "botpasswords-updated-title": "Mot de passe de robots mis à jour",
-       "botpasswords-updated-body": "Le mot de passe de robots « $1 » a bien été mis à jour.",
+       "botpasswords-updated-body": "Le mot de passe pour le robot « $1 » de l'utilisateur « $2 » a été mis à jour.",
        "botpasswords-deleted-title": "Mot de passe de robots supprimé",
-       "botpasswords-deleted-body": "Le mot de passe de robots « $1 » a été supprimé.",
+       "botpasswords-deleted-body": "Le mot de passe pour le robot « $1 » de l'utilisateur « $2 » a été supprimé.",
        "botpasswords-newpassword": "Le nouveau mot de passe pour se connecter avec <strong>$1</strong> est <strong>$2</strong>. <em>Veuillez l’enregistrer pour y faire référence ultérieurement.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider n’est pas disponible.",
        "botpasswords-restriction-failed": "Les restrictions de mot de passe de robots empêchent cette connexion.",
        "revdelete-unsuppress": "Enlever les restrictions sur les versions restaurées",
        "revdelete-log": "Motif :",
        "revdelete-submit": "Appliquer {{PLURAL:$1|à la révision sélectionnée|aux révisions sélectionnées}}",
-       "revdelete-success": "'''Visibilité des versions mise à jour avec succès.'''",
+       "revdelete-success": "Visibilité des versions mise à jour.",
        "revdelete-failure": "'''La visibilité de la version n'a pas pu être mise à jour :'''\n$1",
-       "logdelete-success": "'''Visibilité du journal paramétrée avec succès.'''",
+       "logdelete-success": "Visibilité du journal modifiée.",
        "logdelete-failure": "'''La visibilité du journal n'a pas pu être définie :'''\n$1",
        "revdel-restore": "modifier la visibilité",
        "pagehist": "Historique de la page",
        "userrights-changeable-col": "Les groupes que vous pouvez modifier",
        "userrights-unchangeable-col": "Les groupes que vous ne pouvez pas modifier",
        "userrights-conflict": "Conflit de modification de droits utilisateur ! Veuillez relire et confirmer vos modifications.",
-       "userrights-removed-self": "Vous avez bien supprimé vos propres droits. Du coup, vous ne pouvez plus accéder à cette page.",
+       "userrights-removed-self": "Vous avez supprimé vos propres droits. Par conséquent, vous ne pouvez plus accéder à cette page.",
        "group": "Groupe :",
        "group-user": "Utilisateurs",
        "group-autoconfirmed": "Utilisateurs autoconfirmés",
        "uploadstash-summary": "Cette page donne accès aux fichiers qui sont importés (ou en cours d’importation), mais ne sont pas encore publiés dans le wiki. Ces fichiers ne sont pas encore visibles, sauf pour l’utilisateur qui les a importés.",
        "uploadstash-clear": "Effacer les fichiers en cache",
        "uploadstash-nofiles": "Vous n’avez pas de fichiers en cache d’import.",
-       "uploadstash-badtoken": "L’exécution de cette action a échoué, peut-être parce que vos informations d’identification ont expiré. Réessayez.",
+       "uploadstash-badtoken": "L’exécution de cette action a échoué, peut-être parce que vos informations d’identification ont expiré. Veuillez réessayer.",
        "uploadstash-errclear": "La suppression des fichiers a échoué.",
        "uploadstash-refresh": "Actualiser la liste des fichiers",
        "invalid-chunk-offset": "Offset de segment non valide",
        "changecontentmodel-title-label": "Titre de la page",
        "changecontentmodel-model-label": "Nouveau modèle de contenu",
        "changecontentmodel-reason-label": "Motif :",
+       "changecontentmodel-submit": "Modifier",
        "changecontentmodel-success-title": "Le modèle de contenu a été modifié",
        "changecontentmodel-success-text": "Le modèle de contenu de [[:$1]] a été modifié.",
        "changecontentmodel-cannot-convert": "Le contenu sur [[:$1]] n’a pas pu être converti en un type de $2.",
        "tags-delete-not-allowed": "Les balises définies par une extension ne peuvent pas être supprimées, à moins que l'extension ne le permette spécifiquement.",
        "tags-delete-not-found": "La balise « $1 » n’existe pas.",
        "tags-delete-too-many-uses": "La balise « $1 » est appliquée à plus de $2 {{PLURAL:$2|révision|révisions}}, ce qui signifie qu'elle ne peut pas être supprimée.",
-       "tags-delete-warnings-after-delete": "La balise « $1 » a été supprimée avec succès, mais {{PLURAL:$2|l' avertissement suivant a|avertissements suivants ont}} été rencontré{{PLURAL:$2||s}} :",
+       "tags-delete-warnings-after-delete": "La balise « $1 » a été supprimée, mais {{PLURAL:$2|l’avertissement suivant a|les avertissements suivants ont}} été rencontré{{PLURAL:$2||s}} :",
        "tags-activate-title": "Activer la balise",
        "tags-activate-question": "Vous êtes sur le point d'activer la balise « $1 ».",
        "tags-activate-reason": "Motif :",
        "tags-edit-reason": "Motif :",
        "tags-edit-revision-submit": "Appliquer les modifications à {{PLURAL:$1|cette révision|$1 révisions}}",
        "tags-edit-logentry-submit": "Appliquer les modifications à {{PLURAL:$1|cette entrée de journal|$1 entrées de journal}}",
-       "tags-edit-success": "Les modifications ont été appliquées avec succès.",
+       "tags-edit-success": "Les modifications ont été appliquées.",
        "tags-edit-failure": "Les modifications n’ont pas pu être appliquées :\n$1",
        "tags-edit-nooldid-title": "Révision cible non valide",
        "tags-edit-nooldid-text": "Vous n’avez soit pas spécifié de révision cible sur laquelle exécuter cette fonction, soit la révision spécifiée n’existe pas.",
index be92a64..89cc1a1 100644 (file)
        "nchanges": "$1 changement{{PLURAL:$1||s}}",
        "enhancedrc-history": "changements",
        "recentchanges": "Changements récent",
-       "recentchanges-legend-heading": "'''Légende:'''",
+       "recentchanges-legend-heading": "<strong>Légende:</strong>",
        "rcshowhideminor-hide": "Cacher",
        "rcshowhidebots": "$1 les robots",
        "rcshowhidebots-show": "Afficher",
index 97548fe..4ec0544 100644 (file)
        "moredotdotdot": "Més...",
        "morenotlisted": "Cela lista est pas complèta.",
        "mypage": "Pâge",
+       "anonuserpage": "Utilisator encognu",
        "mytalk": "Discussion",
        "anontalk": "Discussion",
        "navigation": "Navegacion",
        "help": "Éde",
        "search": "Rechèrche",
        "searchbutton": "Rechèrchiér",
-       "go": "Alar trovar",
+       "go": "Emmodar",
        "searcharticle": "Liére",
        "history": "Historico de la pâge",
        "history_short": "Historico",
        "pool-errorunknown": "Fôta encognua",
        "pool-servererror": "Lo sèrviço de comptâjo de la resèrva est pas disponiblo ($1).",
        "poolcounter-usage-error": "Fôta d’usâjo : $1",
-       "aboutsite": "Dessus {{SITENAME}}",
+       "aboutsite": "Sur {{SITENAME}}",
        "aboutpage": "Project:A propôs",
        "copyright": "Lo contegnu est disponiblo desot licence $1 betâ a pârt mencion contrèra.",
        "copyrightpage": "{{ns:project}}:Drêts d’ôtor",
        "helppage-top-gethelp": "Éde",
        "mainpage": "Reçua",
        "mainpage-description": "Reçua",
-       "policy-url": "Project:Règlles de dedens",
+       "policy-url": "Project:Politiques",
        "portal": "Reçua de la comunôtât",
        "portal-url": "Project:Reçua de la comunôtât",
        "privacy": "Politica de confidencialitât",
        "confirmable-confirm": "{{GENDER:$1|Vos}} éte de sûr  ?",
        "confirmable-yes": "Ouè",
        "confirmable-no": "Nan",
-       "thisisdeleted": "Vos voléd vêre ou ben refâre $1 ?",
+       "thisisdeleted": "Vos voléd vêre refâre $1 ?",
        "viewdeleted": "Vos voléd vêre $1 ?",
        "restorelink": "{{PLURAL:$1|un changement suprimâ|$1 changements suprimâs}}",
        "feedlinks": "Flux :",
        "nosuchaction": "Accion encognua",
        "nosuchactiontext": "L’accion spècifiâye dens l’URL est pas justa.\nPôt-étre vos éd mâl-buchiê l’URL ou ben siuvu un lim fôx.\nPôt asse-ben étre na cofieria dedens la programeria empleyêe per {{SITENAME}}.",
        "nosuchspecialpage": "Pâge spèciâla inègzistenta",
-       "nospecialpagetext": "<strong>Vos éd demandâ na pâge spèciâla qu’ègziste pas.</strong>\n\nNa lista de les pâges spèciâles justes sè trôve dessus [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nospecialpagetext": "<strong>Vos éd demandâ na pâge spèciâla pas justa.</strong>\n\nNa lista de les pâges spèciâles justes sè trôve dessus [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Fôta",
        "databaseerror": "Fôta de la bâsa de balyês",
        "databaseerror-text": "Na fôta de demanda de bâsa de balyês est arrevâye.\nCen pôt vegnir d’una cofieria dedens la programeria.",
        "databaseerror-query": "Demanda : $1",
        "databaseerror-function": "Fonccion : $1",
        "databaseerror-error": "Fôta : $1",
-       "transaction-duration-limit-exceeded": "Por èvitar na trop fôrt’ôgmentacion du dèlê de rèplicacion, cela transaccion est étâye anulâye perce que lo temps d’ècritura ($1) at dèpassâ la limita de $2 second{{PLURAL:$2|a|es}}.\nSe vos chèrchiéd a changiér un mouél de piéces en mémo temps, pletout èprovâd de fâre l’opèracion en doux-três ètapes.",
+       "transaction-duration-limit-exceeded": "Por èvitar na trop fôrt’ôgmentacion du dèlê de rèplicacion, cela transaccion est étâye anulâye, lo temps d’ècritura ($1) at dèpassâ la limita de $2 second{{PLURAL:$2|a|es}}.\nSe vos chèrchiéd a changiér un mouél de piéces en mémo temps, pletout èprovâd de fâre l’opèracion en doux-três ètapes.",
        "laggedslavemode": "<strong>Atencion :</strong> cela pâge pôt pas contegnir los fins dèrriérs changements fêts.",
        "readonly": "Bâsa de balyês cotâye",
        "enterlockreason": "Buchiéd na rêson du vèrroly et pués un’èstimacion de son temps",
        "readonlytext": "Ora la bâsa de balyês est cotâye por de novèles entrês et d’ôtros changements, de sûr por na rotina d’entretin, dês cen tot tornerat en ôrdre.\n\nL’administrator sistèmo que l’at cotâ at balyê cel’èxplicacion : $1",
-       "missing-article": "La bâsa de balyês at pas trovâ lo tèxto d’una pâge qu’el arêt diu trovar, apelâye « $1 » $2.\n\nEn g·ènèrâl cen arreve en siuvent un lim dèpassâ d’una dif d’un historico de vers na pâge suprimâye.\n\nS’o est pas lo câs, pôt étre na cofieria dedens la programeria.\nSe vos plét, signalâd-la a un [[Special:ListUsers/sysop|administrator]] sen oubliar de lui endicar l’URL du lim.",
+       "missing-article": "La bâsa de balyês at pas trovâ lo tèxto d’una pâge qu’arêt diu trovar, apelâye « $1 » $2.\n\nEn g·ènèrâl cen arreve en siuvent un lim dèpassâ d’una dif d’un historico de vers na pâge suprimâye.\n\nS’o est pas lo câs, pôt étre na cofieria dedens la programeria.\nSe vos plét, signalâd-la a un [[Special:ListUsers/sysop|administrator]] sen oubliar de lui endicar l’URL du lim.",
        "missingarticle-rev": "(numerô de vèrsion : $1)",
        "missingarticle-diff": "(dif : $1, $2)",
        "readonly_lag": "La bâsa de balyês est étâye cotâye ôtomaticament pendent que los sèrviors secondèros ratrapont lor retârd sur lo sèrvior principâl.",
        "delete-hook-aborted": "Suprèssion anulâye per un’èxtension.\nNion’èxplicacion est étâye balyêe.",
        "no-null-revision": "Y at pas moyen de fâre na novèla vèrsion voueda por la pâge « $1 »",
        "badtitle": "Crouyo titro",
-       "badtitletext": "Lo titro de la pâge demandâye est pas justo, vouedo ou ben o est un titro entèrlengoua ou entèrvouiqui mâl-liyê.\nContint de sûr yon ou ben un mouél de caractèros que pôvont pas étre empleyês dedens los titros.",
+       "badtitletext": "Lo titro de la pâge demandâye est pas justo, vouedo ou ben o est un titro entèrlengoua entèrvouiqui mâl-liyê.\nContint de sûr yon ou ben un mouél de caractèros que pôvont pas étre empleyês dedens los titros.",
        "title-invalid-empty": "Lo titro de la pâge demandâye est vouedo ou ben contint mas que lo nom d’un èspâço de noms.",
        "title-invalid-utf8": "Lo titro de la pâge demandâye contint na cobla UTF-8 pas justa.",
        "title-invalid-interwiki": "Lo titro de la pâge demandâye contint un lim entèrvouiqui que pôt pas étre empleyê dedens los titros.",
        "title-invalid-talk-namespace": "Lo titro de la pâge demandâye s’en rèfère a na pâge de discussion que pôt pas ègzistar.",
        "title-invalid-characters": "Lo titro de la pâge demandâye contint de caractèros pas justos : « $1 ».",
-       "title-invalid-relative": "Lo titro contint un chemin relatif. Los titros que rèferençont de pâges relatives (./, ../) sont pas justos, perce que seront sovent inaccèssiblos dês los navegators des utilisators.",
+       "title-invalid-relative": "Lo titro contint un chemin relatif. Los titros que rèferençont de pâges relatives (./, ../) sont pas justos, seront sovent inaccèssiblos dês los navegators des utilisators.",
        "title-invalid-magic-tilde": "Lo titro de la pâge demandâye contint na cobla de tildes magicos pas justa (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "Lo titro de la pâge demandâye est trop long. Dêt pas dèpassar $1 octèt{{PLURAL:$1||s}} dens l’encodâjo UTF-8.",
        "title-invalid-leading-colon": "Lo titro de la pâge demandâye contint un doux-pouents pas justo u comencement.",
        "protectedpagetext": "Cela pâge est étâye protègiêe por empachiér son changement ou ben d’ôtres accions.",
        "viewsourcetext": "Vos pouede vêre et copiyér lo tèxto sôrsa de cela pâge.",
        "viewyourtext": "Vos pouede vêre et copiyér lo tèxto sôrsa de <strong>voutros changements</strong> a cela pâge.",
-       "protectedinterface": "Cela pâge-que balye de tèxto d’entèrface por la programeria sur cél vouiqui et est vêr protègiêe por èvitar los abus.\nPor apondre ou ben changiér de traduccions sur tôs los vouiquis, se vos plét empleyéd [//translatewiki.net/ translatewiki.net], lo projèt de localisacion de MediaWiki.",
+       "protectedinterface": "Cela pâge balye de tèxto d’entèrface por la programeria sur cél vouiqui et est vêr protègiêe por èvitar los abus.\nPor apondre ou ben changiér de traduccions sur tôs los vouiquis, se vos plét empleyéd [//translatewiki.net/ translatewiki.net], lo projèt de localisacion de MediaWiki.",
        "editinginterface": "<strong>Atencion :</strong> vos éte aprés changiér na pâge empleyêe por fâre lo tèxto d’entèrface de la programeria.\nLos changements sè cognetront sur l’aparence de l’entèrface utilisator por los ôtros utilisators de cél vouiqui.",
-       "translateinterface": "Por apondre ou ben changiér des traduccions sur tôs los vouiquis, se vos plét empleyéd [//translatewiki.net/ translatewiki.net], lo projèt de localisacion de MediaWiki.",
-       "cascadeprotected": "Cela pâge est protègiêe contre los changements perce qu’el est transcllua per {{PLURAL:$1|cela pâge-que qu’est étâye protègiêe|celes pâges-que que sont étâyes protègiêes}} avouéc lo chouèx « protèccion en cascâda » activâ :\n$2",
+       "translateinterface": "Por apondre changiér de traduccions sur tôs los vouiquis, se vos plét empleyéd [//translatewiki.net/ translatewiki.net], lo projèt de localisacion de MediaWiki.",
+       "cascadeprotected": "Cela pâge est protègiêe contre los changementsel est transcllua per {{PLURAL:$1|cela pâge-que qu’est étâye protègiêe|celes pâges-que que sont étâyes protègiêes}} avouéc lo chouèx « protèccion en cascâda » activâ :\n$2",
        "namespaceprotected": "Vos éd pas la pèrmission de changiér les pâges de l’èspâço de noms « <strong>$1</strong> ».",
-       "customcssprotected": "Vos éd pas la pèrmission de changiér cela pâge CSS perce que contint la configuracion a sè d’un ôtr’utilisator.",
-       "customjsprotected": "Vos éd pas la pèrmission de changiér cela pâge JavaScript perce que contint la configuracion a sè d’un ôtr’utilisator.",
+       "customcssprotected": "Vos éd pas la pèrmission de changiér cela pâge CSS, contint la configuracion a sè d’un ôtr’utilisator.",
+       "customjsprotected": "Vos éd pas la pèrmission de changiér cela pâge JavaScript, contint la configuracion a sè d’un ôtr’utilisator.",
        "mycustomcssprotected": "Vos éd pas la pèrmission de changiér cela pâge CSS.",
        "mycustomjsprotected": "Vos éd pas la pèrmission de changiér cela pâge JavaScript.",
        "myprivateinfoprotected": "Vos éd pas la pèrmission de changiér voutres enformacions a vos.",
        "mypreferencesprotected": "Vos éd pas la pèrmission de changiér voutres prèferences.",
        "ns-specialprotected": "Les pâges spèciâles pôvont pas étre changiêes.",
        "titleprotected": "Cél titro est étâ protègiê a la crèacion per [[User:$1|$1]].\nLa rêson balyêe est « <em>$2</em> ».",
-       "filereadonlyerror": "Y at pas moyen de changiér lo fichiér « $1 » perce que lo dèpôt de fichiérs « $2 » est mas qu’en lèctura.\n\nL’administrator sistèmo que l’at cotâ at balyê cel’èxplicacion : « $3 ».",
+       "filereadonlyerror": "Y at pas moyen de changiér lo fichiér « $1 », lo dèpôt de fichiérs « $2 » est mas qu’en lèctura.\n\nL’administrator sistèmo que l’at cotâ at balyê cel’èxplicacion : « $3 ».",
        "invalidtitle-knownnamespace": "Titro pas justo avouéc l’èspâço de noms « $2 » et lo tèxto « $3 »",
        "invalidtitle-unknownnamespace": "Titro pas justo avouéc lo numerô d’èspâço de noms encognu $1 et lo tèxto « $2 »",
        "exception-nologin": "Pas branchiê",
        "cannotloginnow-text": "Lo branchement est pas possiblo en empleyent $1.",
        "yourdomainname": "Voutron domêno :",
        "password-change-forbidden": "Vos pouede pas changiér los contresegnos sur cél vouiqui.",
-       "externaldberror": "Ou ben na fôta est arrevâye avouéc la bâsa de balyês d’ôtentificacion de defôr, ou ben vos éte pas ôtorisâ{{GENDER:||ye}} a betar a jorn voutron comptio de defôr.",
+       "externaldberror": "Ou ben na fôta est arrevâye avouéc la bâsa de balyês d’ôtentificacion de defôr ou ben vos éte pas ôtorisâ{{GENDER:||ye}} a betar a jorn voutron comptio de defôr.",
        "login": "Branchement",
        "nav-login-createaccount": "Sè branchiér ou ben fâre un comptio",
        "userlogin": "Sè branchiér ou ben fâre un comptio",
        "loginerror": "Fôta de branchement",
        "createacct-error": "Fôta pendent la crèacion du comptio",
        "createaccounterror": "Y at pas moyen de fâre lo comptio : $1",
-       "nocookiesnew": "Lo comptio utilisator est étâ fêt, mas vos éte pas branchiê{{GENDER:||e}}.\n{{SITENAME}} emplèye des raportiors (<em>cookies</em>) por lo branchement mas vos los éd dèsactivâs.\nSe vos plét, activâd-los et pués tornâd-vos branchiér avouéc voutron novél nom d’utilisator et voutron contresegno.",
-       "nocookieslogin": "{{SITENAME}} emplèye des raportiors (<em>cookies</em>) por lo branchement mas vos los éd dèsactivâs.\nSe vos plét, activâd-los et pués tornâd èprovar.",
-       "nocookiesfornew": "Lo comptio utilisator est pas étâ fêt, perce que nos ens pas possu confirmar son origina.\nControlâd que vos éd activâ los raportiors (<em>cookies</em>), rechargiéd la pâge et pués tornâd èprovar.",
+       "nocookiesnew": "Lo comptio utilisator est étâ fêt, mas vos éte pas branchiê{{GENDER:||e}}.\n{{SITENAME}} emplèye de raportiors (<em>cookies</em>) por lo branchement mas vos los éd dèsactivâs.\nSe vos plét, activâd-los et pués tornâd-vos branchiér avouéc voutron novél nom d’utilisator et voutron contresegno.",
+       "nocookieslogin": "{{SITENAME}} emplèye de raportiors (<em>cookies</em>) por lo branchement mas vos los éd dèsactivâs.\nSe vos plét, activâd-los et pués tornâd èprovar.",
+       "nocookiesfornew": "Lo comptio utilisator est pas étâ fêt, nos ens pas possu confirmar son origina.\nControlâd que vos éd activâ los raportiors (<em>cookies</em>), rechargiéd la pâge et pués tornâd èprovar.",
        "noname": "Vos éd pas spècifiâ un nom d’utilisator justo.",
-       "loginsuccesstitle": "Branchement reussi",
+       "loginsuccesstitle": "Branchiê(e)",
        "loginsuccess": "<strong>Ora vos éte branchiê{{GENDER:$1||e}} a {{SITENAME}} coment « $1 ».</strong>",
        "nosuchuser": "Y at gins d’utilisator avouéc lo nom « $1 ».\nLos noms d’utilisator sont sensiblos a la câssa.\nSe vos plét, controlâd l’ortografia ou ben [[Special:UserLogin/signup|féte un comptio novél]].",
        "nosuchusershort": "Y at gins d’utilisator avouéc lo nom « $1 ».\nSe vos plét, controlâd l’ortografia.",
        "eauthentsent": "Un mèssâjo de confirmacion est étâ mandâ a l’adrèce èlèctronica spècifiâye.\nDevant qu’un ôtro mèssâjo seye mandâ a cél comptio, vos devréd siuvre les enstruccions du mèssâjo et pués confirmar que lo comptio est franc lo voutro.",
        "throttled-mailpassword": "Un mèssâjo de remês’a zérô de voutron contresegno est ja étâ mandâ pendent {{PLURAL:$1|l’hora passâye|les $1 hores passâyes}}.\nPor èvitar los abus, ren que yon serat mandâ per {{PLURAL:$1|hora|entèrvalo de $1 hores}}.",
        "mailerror": "Fôta pendent l’èxpèdicion du mèssâjo : $1",
-       "acct_creation_throttle_hit": "Des vesitors de cél vouiqui-que qu’emplèyont voutron adrèce IP ant fêt $1 comptio{{PLURAL:$1||s}} pendent lo jorn passâ, cen qu’est lo més ôtorisâ dens ceti temps.\nDu côp los vesitors qu’emplèyont cel’adrèce IP pôvont fâre gins de comptio por lo moment.",
+       "acct_creation_throttle_hit": "Des vesitors de cél vouiqui qu’emplèyont voutron adrèce IP ant fêt $1 comptio{{PLURAL:$1||s}} pendent lo jorn passâ, cen qu’est lo més ôtorisâ dens ceti temps.\nDu côp los vesitors qu’emplèyont cel’adrèce IP pôvont fâre gins de comptio por lo moment.",
        "emailauthenticated": "Voutron adrèce èlèctronica est étâye confirmâye lo $2 a $3.",
        "emailnotauthenticated": "Voutron adrèce èlèctronica est p’oncor confirmâye.\nNion mèssâjo serat mandâ por châcuna de celes fonccionalitâts-que.",
        "noemailprefs": "Spècifiâd un’adrèce èlèctronica dens voutres prèferences por empleyér celes fonccionalitâts.",
        "emailconfirmlink": "Confirmâd voutron adrèce èlèctronica",
-       "invalidemailaddress": "Cel’adrèce èlèctronica pôt pas étre accèptâye perce que semble avêr un format pas justo.\nSe vos plét, buchiéd un’adrèce ben formatâye ou ben lèssiéd cél champ vouedo.",
+       "invalidemailaddress": "Cel’adrèce èlèctronica pôt pas étre accèptâye, semble avêr un format pas justo.\nSe vos plét, buchiéd un’adrèce ben formatâye ou ben lèssiéd cél champ vouedo.",
        "cannotchangeemail": "Les adrèces èlèctroniques des comptios pôvont pas étre changiêes sur cél vouiqui.",
        "emaildisabled": "Cél seto pôt pas mandar de mèssâjos.",
        "accountcreated": "Comptio fêt",
        "accountcreatedtext": "Lo comptio utilisator por [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|discussion]]) est étâ fêt.",
        "createaccount-title": "Crèacion d’un comptio por {{SITENAME}}",
-       "createaccount-text": "Yon at fêt un comptio por voutron adrèce èlèctronica dessus {{SITENAME}} ($4) apelâ « $2 », avouéc lo contresegno « $3 ».\nVos vos devriâd branchiér et pués changiér dês ora voutron contresegno.\n\nIgnorâd cél mèssâjo-que se cél compto est étâ fêt per fôta.",
+       "createaccount-text": "Yon at fêt un comptio por voutron adrèce èlèctronica dessus {{SITENAME}} ($4) apelâ « $2 », avouéc lo contresegno « $3 ».\nVos vos devriâd branchiér et pués changiér dês ora voutron contresegno.\n\nIgnorâd cél mèssâjo se cél comptio est étâ fêt per fôta.",
        "login-throttled": "Dês pou vos éd èprovâ un mouél de branchements.\nSe vos plét, atende-vos $1 devant que tornar èprovar.",
        "login-abort-generic": "Voutron branchement at pas reussi - Anulâ",
        "login-migrated-generic": "Voutron comptio est étâ migrâ, et pués voutron nom d’utilisator ègziste pas més sur cél vouiqui.",
        "loginlanguagelabel": "Lengoua : $1",
-       "suspicious-userlogout": "Voutra demanda de dèbranchement est étâye refusâye perce que semble qu’est étâye mandâye per un navegator câsso ou ben la mêsa en cacho d’un proxi.",
+       "suspicious-userlogout": "Voutra demanda de dèbranchement est étâye refusâye, semble qu’el est étâye mandâye per un navegator câsso ou ben la mêsa en cacho d’un sèrvior mandatèro (<em>proxy</em>).",
        "createacct-another-realname-tip": "Lo veré nom est u chouèx.\nSe vos dècidâd de lo balyér, serat empleyê por atribuar a l’utilisator ses ôvres.",
        "pt-login": "Sè branchiér",
        "pt-login-button": "Sè branchiér",
        "newpassword": "Contresegno novél :",
        "retypenew": "Confirmar lo contresegno novél :",
        "resetpass_submit": "Changiér lo contresegno et pués sè branchiér",
-       "changepassword-success": "Voutron contresegno est étâ changiê avouéc reusséta !",
+       "changepassword-success": "Voutron contresegno est étâ changiê !",
        "changepassword-throttled": "Dês pou vos éd èprovâ un mouél de branchements.\nSe vos plét, atende-vos $1 devant que tornar èprovar.",
        "botpasswords": "Contresegnos de robots",
        "botpasswords-summary": "<em>Contresegnos de robots</em> pèrmèt d’arrevar a un comptio utilisator avouéc l’API sen empleyér los identifients de branchement principâls. Los drêts d’utilisator disponiblos en étent branchiê avouéc un contresegno de robot pôvont étre rèduits.\n\nSe vos vêde pas porquè vos vodriâd cen fâre, o est que vos en éd pas fôta. Nion vos devrêt jamés demandar de nen fâre yon et pués de lo y balyér.",
        "botpasswords-insert-failed": "Falyita de l’aponsa du nom de robot « $1 ». Est-o qu’il est ja étâ apondu ?",
        "botpasswords-update-failed": "Falyita a la mês’a jorn du nom de robot « $1 ». Est-o qu’il est ja étâ suprimâ ?",
        "botpasswords-created-title": "Contresegno de robot fêt",
-       "botpasswords-created-body": "Lo contresegno de robot « $1 » est étâ fêt avouéc reusséta.",
+       "botpasswords-created-body": "Lo contresegno de robot por lo nom de robot « $1 » a l’utilisator « $2 » est étâ fêt.",
        "botpasswords-updated-title": "Contresegno de robot betâ a jorn",
-       "botpasswords-updated-body": "Lo contresegno de robot « $1 » est étâ betâ a jorn avouéc reusséta.",
+       "botpasswords-updated-body": "Lo contresegno de robot por lo nom de robot « $1 » a l’utilisator « $2 » est étâ betâ a jorn.",
        "botpasswords-deleted-title": "Contresegno de robot suprimâ",
-       "botpasswords-deleted-body": "Lo contresegno de robot « $1 » est étâ suprimâ.",
+       "botpasswords-deleted-body": "Lo contresegno de robot por lo nom de robot « $1 » a l’utilisator « $2 » est étâ suprimâ.",
        "botpasswords-newpassword": "Lo contresegno novél por sè branchiér avouéc <strong>$1</strong> est <strong>$2</strong>. <em>Se vos plét, encartâd-lo por y fâre rèference ples târd.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider est pas disponiblo.",
        "botpasswords-restriction-failed": "Les rèstriccions de contresegno de robot empachont cél branchement.",
        "resetpass-no-info": "Vos dête étre branchiê por arrevar tot drêt a cela pâge.",
        "resetpass-submit-loggedin": "Changiér lo contresegno",
        "resetpass-submit-cancel": "Anular",
-       "resetpass-wrong-oldpass": "Contresegno temporèro ou ben d’ora pas justo.\nPôt-étre vos éd ja changiê voutron contresegno avouéc reusséta ou ben demandâ un contresegno temporèro novél.",
+       "resetpass-wrong-oldpass": "Contresegno temporèro ou ben d’ora pas justo.\nPôt-étre vos éd ja changiê voutron contresegno ou ben demandâ un contresegno temporèro novél.",
        "resetpass-recycled": "Se vos plét, rebetâd voutron contresegno a quârque-ren d’ôtro que celi d’ora.",
        "resetpass-temp-emailed": "Vos éte branchiê{{GENDER:||e}} avouéc un code temporèro mandâ per mèssageria èlèctronica.\nPor chavonar lo branchement, vos dête dèfenir un contresegno novél ique :",
        "resetpass-temp-password": "Contresegno temporèro :",
        "resetpass-expired-soft": "Voutron contresegno at èxpirâ et dêt étre rebetâ a zérô. Se vos plét, chouèsésséd-nen un novél ora ou ben cllicâd dessus « {{int:resetpass-submit-cancel}} » por o fâre ples târd.",
        "resetpass-validity-soft": "Voutron contresegno est pas justo : $1\n\nSe vos plét, chouèsésséd-nen un novél ora ou ben cllicâd dessus « {{int:resetpass-submit-cancel}} » por o fâre ples târd.",
        "passwordreset": "Remês’a zérô du contresegno",
-       "passwordreset-text-one": "Rempléd cél formulèro por recêvre un contresegno temporèro per mèssageria èlèctronica.",
-       "passwordreset-text-many": "{{PLURAL:$1|Rempléd yon des champs por recêvre un contresegno temporèro per mèssageria èlèctronica.}}",
+       "passwordreset-text-one": "Empléd cél formulèro por recêvre un contresegno temporèro per mèssageria èlèctronica.",
+       "passwordreset-text-many": "{{PLURAL:$1|Empléd yon des champs por recêvre un contresegno temporèro per mèssageria èlèctronica.}}",
        "passwordreset-disabled": "La remês’a zérô des contresegnos est étâye dèsactivâye sur cél vouiqui.",
        "passwordreset-emaildisabled": "Les fonccionalitâts de mèssageria èlèctronica sont étâyes dèsactivâyes sur cél vouiqui.",
        "passwordreset-username": "Nom d’utilisator :",
        "passwordreset-email": "Adrèce èlèctronica :",
        "passwordreset-emailtitle": "Dètalys du comptio dessus {{SITENAME}}",
        "passwordreset-emailtext-ip": "Yon (de sûr vos, avouéc l’adrèce IP $1) at demandâ na remês’a zérô de voutron\ncontresegno por {{SITENAME}} ($4). {{PLURAL:$3|Cél comptio utilisator-que est associyê|Celos comptios utilisators-que sont associyês}}\na cel’adrèce èlèctronica :\n\n$2\n\n{{PLURAL:$3|Cél contresegno temporèro èxpirerat|Celos contresegnos temporèros èxpireront}} dens {{PLURAL:$5|un jorn|$5 jorns}}.\nOra vos vos dête branchiér et pués chouèsir un contresegno novél. Se cela demanda vint pas de vos\nou ben se vos vos éte rapelâ de voutron contresegno originâl et que vos en voléd pas més changiér,\nvos pouede ignorar cél mèssâjo et continuar a empleyér voutron viely contresegno.",
-       "passwordreset-emailtext-user": "L’utilisator $1 dessus {{SITENAME}} at demandâ na remês’a zérô de voutron contresegno por {{SITENAME}}\n($4). {{PLURAL:$3|Cél compto utilisator-que est associyê|Celos comptos utilisators-que sont associyês}}\na cel’adrèce èlèctronica :\n\n$2\n\n{{PLURAL:$3|Cél contresegno temporèro èxpirerat|Celos contresegnos temporèros èxpireront}} dens {{PLURAL:$5|un jorn|$5 jorns}}.\nOra vos vos dête branchiér et pués chouèsir un contresegno novél. Se cela demanda vint pas de vos\nou ben se vos vos éte rapelâ de voutron contresegno originâl et que vos en voléd pas més changiér,\nvos pouede ignorar cél mèssâjo et continuar a empleyér voutron viely contresegno.",
+       "passwordreset-emailtext-user": "L’utilisator $1 dessus {{SITENAME}} at demandâ na remês’a zérô de voutron contresegno por {{SITENAME}}\n($4). {{PLURAL:$3|Cél comptio utilisator-que est associyê|Celos comptios utilisators-que sont associyês}}\na cel’adrèce èlèctronica :\n\n$2\n\n{{PLURAL:$3|Cél contresegno temporèro èxpirerat|Celos contresegnos temporèros èxpireront}} dens {{PLURAL:$5|un jorn|$5 jorns}}.\nOra vos vos dête branchiér et pués chouèsir un contresegno novél. Se cela demanda vint pas de vos\nou ben se vos vos éte rapelâ de voutron contresegno originâl et que vos en voléd pas més changiér,\nvos pouede ignorar cél mèssâjo et continuar a empleyér voutron viely contresegno.",
        "passwordreset-emailelement": "Nom d’utilisator :\n$1\n\nContresegno temporèro :\n$2",
        "passwordreset-emailsentemail": "Se cel’adrèce èlèctronica est associyêe a voutron comptio, adonc un mèssâjo de remês’a zérô de contresegno serat mandâ.",
        "passwordreset-emailsentusername": "S’y at un’adrèce èlèctronica associyêe a cél nom d’utilisator, adonc un mèssâjo de remês’a zérô de contresegno serat mandâ.",
-       "passwordreset-emailsent-capture": "Un mèssâjo de remês’a zérô de contresegno est étâ mandâ, qu’est montrâ ce-desot.",
-       "passwordreset-emailerror-capture": "Un mèssâjo de remês’a zérô de contresegno est étâ fêt, qu’est montrâ ce-desot, mas l’èxpèdicion a l’utilisat{{GENDER:$2|or|rice}} at pas reussi : $1",
-       "changeemail": "Changiér ou ben enlevar l’adrèce èlèctronica",
+       "passwordreset-emailsent-capture": "Un mèssâjo de remês’a zérô de contresegno est étâ mandâ, qu’il est montrâ ce-desot.",
+       "passwordreset-emailerror-capture": "Un mèssâjo de remês’a zérô de contresegno est étâ fêt, qu’il est montrâ ce-desot, mas l’èxpèdicion a l’utilisat{{GENDER:$2|or|rice}} at pas reussi : $1",
+       "changeemail": "Changiér enlevar l’adrèce èlèctronica",
        "changeemail-header": "Complètâd cél formulèro por changiér voutron adrèce èlèctronica. Se vos voléd enlevar l’associacion d’un’adrèce èlèctronica avouéc voutron comptio, lèssiéd la novèl’adrèce èlèctronica voueda pendent la somission du formulèro.",
        "changeemail-passwordrequired": "Vos devréd buchiér voutron contresegno por confirmar cél changement.",
        "changeemail-no-info": "Vos dête étre branchiê por arrevar tot drêt a cela pâge.",
        "showpreview": "Montrar un apèrçu",
        "showdiff": "Montrar los changements",
        "blankarticle": "<strong>Atencion :</strong> la pâge que vos éte aprés fâre est voueda.\nSe vos tornâd cllicar dessus « {{int:savearticle}} », la pâge serat fêta sen gins de contegnu.",
-       "anoneditwarning": "<strong>Atencion :</strong> vos éte pas branchiê. Voutron adrèce IP serat visibla devant tot lo mondo se vos féte des changements. Se vos vos <strong>[$1 branchiéd]</strong> ou ben <strong>[$2 féte un comptio]</strong>, voutros changements seront atribuâs a voutron nom d’utilisator, entre-mié ôtros avantâjos.",
+       "anoneditwarning": "<strong>Atencion :</strong> vos éte pas branchiê. Voutron adrèce IP serat visibla devant tot lo mondo se vos féte de changements. Se vos vos <strong>[$1 branchiéd]</strong> ou ben <strong>[$2 féte un comptio]</strong>, voutros changements seront atribuâs a voutron nom d’utilisator, entre-mié ôtros avantâjos.",
        "anonpreviewwarning": "<em>Vos éte pas branchiê{{GENDER:||e}}. En encartent, voutron adrèce IP serat encartâye dedens l’historico des changements de cela pâge.</em>",
        "missingsummary": "<strong>Sovegnence :</strong> vos éd balyê gins de rèsumâ de changement.\nSe vos tornâd cllicar dessus « {{int:savearticle}} », voutron changement serat encartâ sen rèsumâ.",
        "selfredirect": "<strong>Atencion :</strong> vos éte aprés redirigiér la pâge vers lyé-méma.\nVos pouede avêr spècifiâ na crouye ciba por la redirèccion ou ben pôt-étre vos changiéd na crouye pâge.\nSe vos tornâd cllicar dessus « {{int:savearticle}} », la redirèccion serat fêta tot-un.",
        "subject-preview": "Apèrçu de la chousa :",
        "previewerrortext": "Na fôta est arrevâye pendent l’èprôva d’apèrçu de voutros changements.",
        "blockedtitle": "L’utilisator est blocâ",
-       "blockedtext": "<strong>Voutron nom dâ\80\99utilisator voutron adrèce IP est Ã©tâ(ye) blocâ(ye).</strong>\n\nLo blocâjo est Ã©tâ fêt per $1.\nLa rêson balyêe est <em>$2</em>.\n\n* Comencement du blocâjo : $8\n* Ã\88xpiracion du blocâjo : $6\n* Comptio blocâ : $7\n\nVos vos pouede veriér vers $1 ou ben un Ã´trâ\80\99[[{{MediaWiki:Grouppage-sysop}}|administrator]] por nen discutar.\nVos pouede pas empleyér la fonccionalitât Â« Y mandar un mèssâjo Â» a muens quâ\80\99unâ\80\99adrèce Ã¨lèctronica justa seye spècifiâye dens voutres [[Special:Preferences|prèferences]] et que vos seyâd pas Ã©tâ blocâ de lâ\80\99empleyér.\nVoutron adrèce IP dâ\80\99ora est $3 et lâ\80\99identifient de blocâjo est $5.\nSe vos plét, entrebetâd tôs los dètalys ce-dessus dedens totes les demandes que vos faréd.",
-       "autoblockedtext": "Voutron adrèce IP est étâye blocâye ôtomaticament perce qu’el est étâye empleyêe per un ôtr’utilisator, lui-mémo blocâ per $1.\nLa rêson balyêe est :\n\n:<em>$2</em>\n\n* Comencement du blocâjo : $8\n* Èxpiracion du blocâjo : $6\n* Comptio blocâ : $7\n\nVos vos pouede veriér vers $1 ou ben yon des ôtros [[{{MediaWiki:Grouppage-sysop}}|administrators]] por nen discutar.\n\nNotâd que vos porréd pas empleyér la fonccionalitât « Y mandar un mèssâjo » a muens que vos èyâd un’adrèce èlèctronica justa encartâye dens voutres [[Special:Preferences|prèferences]] et que vos seyâd pas étâ blocâ de l’empleyér.\n\nVoutron adrèce IP d’ora est $3 et l’identifient de blocâjo est $5.\nSe vos plét, entrebetâd tôs los dètalys ce-dessus dedens totes les demandes que vos faréd.",
+       "blockedtext": "<strong>Voutron nom dâ\80\99utilisator voutron adrèce IP est Ã©tâ(ye) blocâ(ye).</strong>\n\nLo blocâjo est Ã©tâ fêt per $1.\nLa rêson balyêe est <em>$2</em>.\n\n* Comencement du blocâjo : $8\n* Ã\88xpiracion du blocâjo : $6\n* Comptio blocâ : $7\n\nVos vos pouede veriér vers $1 ou ben un Ã´trâ\80\99[[{{MediaWiki:Grouppage-sysop}}|administrator]] por nen discutar.\nVos pouede pas empleyér la fonccionalitât Â« Y mandar un mèssâjo Â» a muens quâ\80\99unâ\80\99adrèce Ã¨lèctronica justa seye spècifiâye dens voutres [[Special:Preferences|prèferences]] et que vos seyéd pas Ã©tâ blocâ de lâ\80\99empleyér.\nVoutron adrèce IP dâ\80\99ora est $3 et lâ\80\99identifient de blocâjo est $5.\nSe vos plét, rapondéd tôs los dètalys ce-dessus dedens totes les demandes que vos faréd.",
+       "autoblockedtext": "Voutron adrèce IP est étâye blocâye ôtomaticament, el est étâye empleyêe per un ôtr’utilisator, lui-mémo blocâ per $1.\nLa rêson balyêe est :\n\n:<em>$2</em>\n\n* Comencement du blocâjo : $8\n* Èxpiracion du blocâjo : $6\n* Comptio blocâ : $7\n\nVos vos pouede veriér vers $1 ou ben yon des ôtros [[{{MediaWiki:Grouppage-sysop}}|administrators]] por nen discutar.\n\nNotâd que vos porréd pas empleyér la fonccionalitât « Y mandar un mèssâjo » a muens que vos èyéd un’adrèce èlèctronica justa encartâye dens voutres [[Special:Preferences|prèferences]] et que vos seyéd pas étâ blocâ de l’empleyér.\n\nVoutron adrèce IP d’ora est $3 et l’identifient de blocâjo est $5.\nSe vos plét, rapondéd tôs los dètalys ce-dessus dedens totes les demandes que vos faréd.",
        "blockednoreason": "niona rêson balyêe",
        "whitelistedittext": "Se vos plét, vos vos dête $1 por povêr changiér les pâges.",
        "confirmedittext": "Vos dête confirmar voutron adrèce èlèctronica devant que changiér les pâges.\nSe vos plét, buchiéd et pués validâd voutron adrèce èlèctronica dens voutres [[Special:Preferences|prèferences]].",
        "nosuchsectiontitle": "Y at pas moyen de trovar la sèccion",
-       "nosuchsectiontext": "Vos éd èprovâ de changiér na sèccion qu’ègziste pas.\nPôt-étre el est étâye dèplaciêe ou ben ôtâye dês que vos éd liesu cela pâge.",
+       "nosuchsectiontext": "Vos éd èprovâ de changiér na sèccion qu’ègziste pas.\nPôt-étre el est étâye dèplaciêe ôtâye dês que vos éd liesu cela pâge.",
        "loginreqtitle": "Branchement nècèssèro",
        "loginreqlink": "branchiér",
        "loginreqpagetext": "Se vos plét, vos vos dête $1 por povêr vêre les ôtres pâges.",
        "accmailtext": "Un contresegno fêt a l’hasârd por [[User talk:$1|$1]] est étâ mandâ a $2. Pôt étre changiê dessus la pâge de <em>[[Special:ChangePassword|changement de contresegno]]</em> aprés branchement.",
        "newarticle": "(Novél)",
        "newarticletext": "Vos éd siuvu un lim de vers na pâge qu’ègziste p’oncor.\nPor fâre cela pâge, buchiéd voutron tèxto dedens la bouèta ce-desot (vêde la [$1 pâge d’éde] por més d’enformacions).\nSe vos éte arrevâ{{GENDER:||ye}} ique per fôta, cllicâd dessus lo boton <strong>Devant</strong> de voutron navegator.",
-       "anontalkpagetext": "----\n<em>O est la pâge de discussion d’un utilisator anonimo qu’at p’oncor fêt un comptio ou ben que nen emplèye pas.</em>\nPor cen, nos devens empleyér son adrèce IP numerica por o identifiar.\nUn’adrèce IP d’ense pôt étre partagiêe per un mouél d’utilisators.\nSe vos éte {{GENDER:|un utilisator|un’utilisatrice}} anonim{{GENDER:|o|a}} et pués se vos constatâd que des comentèros que vos regârdont pas vos sont étâs adrèciês, se vos plét [[Special:UserLogin/signup|féte un comptio]] ou ben [[Special:UserLogin|branchiéd-vos]] por èvitar tota confusion que vint avouéc d’ôtros utilisators anonimos.",
+       "anontalkpagetext": "----\n<em>O est la pâge de discussion d’un utilisator anonimo qu’at p’oncor fêt un comptio ou ben que nen emplèye pas.</em>\nPor cen, nos devens empleyér son adrèce IP numerica por o identifiar.\nUn’adrèce IP d’ense pôt étre partagiêe per un mouél d’utilisators.\nSe vos éte {{GENDER:|un utilisator|un’utilisatrice}} anonim{{GENDER:|o|a}} et pués se vos constatâd que de comentèros que vos regârdont pas vos sont étâs adrèciês, se vos plét [[Special:UserLogin/signup|féte un comptio]] ou ben [[Special:UserLogin|branchiéd-vos]] por èvitar tota confusion que vint avouéc d’ôtros utilisators anonimos.",
        "noarticletext": "Ora y at gins de tèxto dedens cela pâge.\nVos pouede [[Special:Search/{{PAGENAME}}|fâre na rechèrche sur cél titro]] dedens les ôtres pâges,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechèrchiér dedens los jornâls liyês]\nou ben [{{fullurl:{{FULLPAGENAME}}|action=edit}} fâre cela pâge]</span>.",
        "noarticletext-nopermission": "Ora y at gins de tèxto dedens cela pâge.\nVos pouede [[Special:Search/{{PAGENAME}}|fâre na rechèrche sur cél titro]] dedens les ôtres pâges ou ben <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechèrchiér dedens los jornâls liyês]</span>, mas vos éd pas la pèrmission de fâre cela pâge.",
        "missing-revision": "La vèrsion n° $1 de la pâge apelâye « {{FULLPAGENAME}} » ègziste pas.\n\nEn g·ènèrâl cen arreve en siuvent un lim dèpassâ d’un historico de vers na pâge qu’est étâye suprimâye.\nVos pouede trovar més de dètalys dessus lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornâl de les suprèssions].",
-       "userpage-userdoesnotexist": "Lo comptio utilisator « $1 » est pas encartâ.\nSe vos plét, controlâd se vos voléd fâre ou ben changiér cela pâge.",
+       "userpage-userdoesnotexist": "Lo comptio utilisator « $1 » est pas encartâ.\nSe vos plét, controlâd se vos voléd fâre changiér cela pâge.",
        "userpage-userdoesnotexist-view": "Lo comptio utilisator « $1 » est pas encartâ.",
        "blocked-notice-logextract": "Ora {{GENDER:$1|cél utilisator|cel’utilisatrice}} est blocâ{{GENDER:$1||ye}}.\nLa dèrriére entrâ du jornâl des blocâjos est balyêe ce-desot coment rèference :",
        "clearyourcache": "<strong>Nota :</strong> aprés avêr encartâ, sè pôt que vos deveyéd forciér lo rechargement complèt du cacho de voutron navegator por vêre los changements.\n* <strong>Firefox / Safari :</strong> mantegnéd la toche <em>Granta Lètra</em> (<em>Shift</em>) en clliquent dessus <em>Rechargiér</em> (<em>Reload</em>) ou ben apoyéd dessus <em>Ctrl-F5</em> <em>Ctrl-R</em> (<em>⌘-R</em> sur un Mac)\n* <strong>Google Chrome :</strong> apoyéd dessus <em>Ctrl-Shift-R</em> (''⌘-Shift-R</em> sur un Mac)\n* <strong>Internet Explorer :</strong> mantegnéd la toche <em>Ctrl</em> en clliquent dessus <em>Rafrèchir</em> (<em>Refresh</em>) ou ben apoyéd dessus <em>Ctrl-F5</em>\n* <strong>Opera :</strong> vouedâd lo cacho dedens <em>Outils → Prèferences</em>",
        "usercssyoucanpreview": "<strong>Combina :</strong> empleyéd lo boton « {{int:showpreview}} » por èprovar voutra fôlye CSS novèla devant que l’encartar.",
        "userjsyoucanpreview": "<strong>Combina :</strong> empleyéd lo boton « {{int:showpreview}} » por èprovar voutra fôlye JavaScript novèla devant que l’encartar.",
        "usercsspreview": "<strong>Rapelâd-vos que vos éte ren qu’aprés prèvêre voutra fôlye CSS.\nEl est p’oncor étâye encartâye !</strong>",
-       "userjspreview": "<strong>Rapelâd-vos que vos éte ren qu’aprés prèvêre voutron code JavaScript.\nIl est p’oncor étâ encartâ !</strong>",
+       "userjspreview": "<strong>Rapelâd-vos que vos éte ren qu’aprés èprovar prèvêre voutron code JavaScript.\nIl est p’oncor étâ encartâ !</strong>",
        "sitecsspreview": "<strong>Rapelâd-vos que vos éte ren qu’aprés prèvêre cela fôlye CSS.\nEl est p’oncor étâye encartâye !</strong>",
        "sitejspreview": "<strong>Rapelâd-vos que vos éte ren qu’aprés prèvêre cél code JavaScript.\nIl est p’oncor étâ encartâ !</strong>",
-       "userinvalidcssjstitle": "<strong>Atencion :</strong> ègziste gins d’habelyâjo « $1 ».\nRapelâd-vos que les pâges a sè avouéc èxtensions .css et .js emplèyont des titros en petiôtes lètres, per ègzemplo {{ns:user}}:Foo/vector.css et pas {{ns:user}}:Foo/Vector.css.",
+       "userinvalidcssjstitle": "<strong>Atencion :</strong> ègziste gins d’habelyâjo « $1 ».\nRapelâd-vos que les pâges a sè avouéc èxtensions .css et .js emplèyont de titros en petiôtes lètres, per ègzemplo {{ns:user}}:Foo/vector.css et pas {{ns:user}}:Foo/Vector.css.",
        "updated": "(Betâ a jorn)",
        "note": "<strong>Nota :</strong>",
        "previewnote": "<strong>Rapelâd-vos qu’o est ren qu’un apèrçu.</strong>\nVoutros changements sont p’oncor étâs encartâs !",
        "previewconflict": "Cél apèrçu fât vêre lo tèxto de la zona de changement de d’amont coment aparêtrat se vos chouèsésséd de l’encartar.",
        "session_fail_preview": "Dèsolâ ! Nos povens pas encartar voutron changement a côsa d’una pèrda d’enformacions sur voutra sèssion.\n\nPôt-étre vos éte étâ dèbranchiê. <strong>Se vos plét, controlâd que vos éte adés branchiê et pués tornâd èprovar.</strong>\nSe cen tôrne pas reussir, èprovâd de vos [[Special:UserLogout|dèbranchiér]] et pués de vos tornar branchiér, et controlâd que voutron navegator accèpte los raportiors (<em>cookies</em>) de cél seto.",
        "session_fail_preview_html": "Dèsolâ ! Nos povens pas encartar voutron changement a côsa d’una pèrda d’enformacions sur voutra sèssion.\n\n<em>Perce que {{SITENAME}} at activâ l’HTML bruto, l’apèrçu est étâ cachiê por prèvegnir les ataques per JavaScript.</em>\n\n<strong>Se l’èprôva de changement est lèg·itima, se vos plét tornâd èprovar.</strong>\nSe cen tôrne pas reussir, èprovâd de vos [[Special:UserLogout|dèbranchiér]] et pués de vos tornar branchiér, et controlâd que voutron navegator accèpte los raportiors (<em>cookies</em>) de cél seto.",
-       "token_suffix_mismatch": "<strong>Voutron changement est pas étâ accèptâ perce que voutron cliant at mècllâ los caractèros de ponctuacion dedens lo jeton de changement.</strong>\nLo changement est étâ refusâ por empachiér la corrupcion du tèxto de la pâge.\nDes côps cél problèmo arreve quand vos empleyéd un sèrviço de proxi Vouèbe anonimo qu’est pas de sûr.",
+       "token_suffix_mismatch": "<strong>Voutron changement est pas étâ accèptâ, voutron cliant at mècllâ los caractèros de ponctuacion dedens lo jeton de changement.</strong>\nLo changement est étâ refusâ por empachiér la corrupcion du tèxto de la pâge.\nDes côps cél problèmo arreve quand vos empleyéd un sèrviço de sèrvior mandatèro (<em>proxy</em>) Vouèbe anonimo qu’est pas de sûr.",
        "edit_form_incomplete": "<strong>Doux-três parties du formulèro de changement ant pas avengiê lo sèrvior ; controlâd que voutros changements sont entactos et pués tornâd èprovar.</strong>",
        "editing": "Changement de $1",
        "creating": "Crèacion de $1",
        "editingsection": "Changement de $1 (sèccion)",
        "editingcomment": "Changement de $1 (novèla sèccion)",
        "editconflict": "Disputa de changement : $1",
-       "explainconflict": "Un Ã´tro at changiê cela pâge aprés que vos vos seyâd betâ a la changiér.\nLa zona de changement de d’amont contint lo tèxto de la pâge coment ègziste orendrêt.\nVoutros changements aparèssont dedens la zona de changement de desot.\nVos voléd devêr fusionar voutros changements dedens lo tèxto ègzistent.\n<strong>Solament</strong> lo tèxto de la zona de changement de d’amont serat encartâ se vos cllicâd dessus « {{int:savearticle}} ».",
+       "explainconflict": "Un Ã´tro at changiê cela pâge aprés que vos vos seyéd betâ a la changiér.\nLa zona de changement de d’amont contint lo tèxto de la pâge coment ègziste orendrêt.\nVoutros changements aparèssont dedens la zona de changement de desot.\nVos voléd devêr fusionar voutros changements dedens lo tèxto ègzistent.\n<strong>Solament</strong> lo tèxto de la zona de changement de d’amont serat encartâ se vos cllicâd dessus « {{int:savearticle}} ».",
        "yourtext": "Voutron tèxto",
        "storedversion": "Vèrsion encartâye",
        "nonunicodebrowser": "<strong>Atencion : voutron navegator recognêt pas l’Unicode.</strong>\nNa solucion de rechanjo est étâye trovâye por vos pèrmetre de changiér en tota suretât na pâge : los caractèros nan-ASCII aparêtront dedens la zona de changement coment codes hègzadècimâls.",
        "editingold": "<strong>Atencion : vos éte aprés changiér na vèrsion dèpassâye de cela pâge.</strong>\nSe vos l’encartâd, tôs los changements fêts dês cela vèrsion seront pèrdus.",
        "yourdiff": "Difèrences",
        "copyrightwarning": "Se vos plét, notâd que totes les contribucions a {{SITENAME}} sont considèrâyes coment publeyêes desot los tèrmos de la $2 (vêde $1 por més de dètalys).\nSe vos voléd pas que voutros ècrits seyont changiês sen pediêt et pués redistribuâs a volontât, adonc mandâd-los pas ique.<br />\nVos nos assurâd asse-ben que vos éd cen ècrit vos-mémo ou ben que vos l’éd copiyê d’una sôrsa que vint du domêno publico ou d’un’ôtra ressôrsa libra.\n<strong>Empleyéd gins d’ôvra desot drêt d’ôtor sen pèrmission èxprèssa !</strong>",
-       "copyrightwarning2": "Se vos plét, notâd que totes les contribucions a {{SITENAME}} pôvont étre changiêes ou ben enlevâyes per d’ôtros contributors.\nSe vos voléd pas que voutros ècrits seyont changiês sen pediêt, adonc mandâd-los pas ique.<br />\nVos nos assurâd asse-ben que vos éd cen ècrit vos-mémo ou ben que vos l’éd copiyê d’una sôrsa que vint du domêno publico ou d’un’ôtra ressôrsa libra (vêde $1 por més de dètalys).\n<strong>Empleyéd gins d’ôvra desot drêt d’ôtor sen pèrmission èxprèssa !</strong>",
+       "copyrightwarning2": "Se vos plét, notâd que totes les contribucions a {{SITENAME}} pôvont étre changiêes enlevâyes per d’ôtros contributors.\nSe vos voléd pas que voutros ècrits seyont changiês sen pediêt, adonc mandâd-los pas ique.<br />\nVos nos assurâd asse-ben que vos éd cen ècrit vos-mémo ou ben que vos l’éd copiyê d’una sôrsa que vint du domêno publico ou d’un’ôtra ressôrsa libra (vêde $1 por més de dètalys).\n<strong>Empleyéd gins d’ôvra desot drêt d’ôtor sen pèrmission èxprèssa !</strong>",
        "editpage-cannot-use-custom-model": "Lo modèlo de contegnu de cela pâge pôt pas étre changiê.",
        "longpageerror": "<strong>Fôta : lo tèxto que vos éd mandâ fât {{PLURAL:$1|un Kio|$1 Kio}}, cen que dèpâsse la limita fixâye a {{PLURAL:$2|un Kio|$2 Kio}}.</strong>\nPôt pas étre encartâ.",
        "readonlywarning": "<strong>Atencion : la bâsa de balyês est étâye cotâye por na rotina d’entretin, cen fât que vos porréd vêr pas encartar voutros changements orendrêt.</strong>\nVos pouede copiyér et côlar voutron tèxto dedens un fichiér tèxto et pués l’encartar por ples târd.\n\nL’administrator sistèmo que l’at cotâ at balyê cel’èxplicacion : $1",
-       "protectedpagewarning": "<strong>Atencion : cela pâge est étâye protègiêe de façon que solament los utilisators qu’ant lo statut d’administrator la pouessont changiér.</strong>\nLa dèrriére entrâ du jornâl est balyêe ce-desot coment rèference :",
-       "semiprotectedpagewarning": "<strong>Nota :</strong> cela pâge est étâye protègiêe de façon que solament los utilisators encartâs la pouessont changiér.\nLa dèrriére entrâ du jornâl est balyêe ce-desot coment rèference :",
-       "cascadeprotectedwarning": "<strong>Atencion :</strong> cela pâge est étâye protègiêe de façon que solament los utilisators qu’ant lo statut d’administrator la pouessont changiér perce qu’el est transcllua dedens {{PLURAL:$1|cela pâge protègiêe|celes pâges protègiêes}}-que avouéc la « protèccion en cascâda » activâye :",
-       "titleprotectedwarning": "<strong>Atencion : cela pâge est étâye protègiêe de façon que des [[Special:ListGroupRights|drêts spècificos]] sont nècèssèros por la povêr fâre.</strong>\nLa dèrriére entrâ du jornâl est balyêe ce-desot coment rèference :",
+       "protectedpagewarning": "<strong>Atencion : cela pâge est étâye protègiêe por que solament los utilisators qu’ant los drêts d’administrator la pouessont changiér.</strong>\nLa dèrriére entrâ du jornâl est balyêe ce-desot coment rèference :",
+       "semiprotectedpagewarning": "<strong>Nota :</strong> cela pâge est étâye protègiêe por que solament los utilisators encartâs la pouessont changiér.\nLa dèrriére entrâ du jornâl est balyêe ce-desot coment rèference :",
+       "cascadeprotectedwarning": "<strong>Atencion :</strong> cela pâge est étâye protègiêe por que solament los utilisators qu’ant los drêts d’administrator la pouessont changiér, el est transcllua dedens {{PLURAL:$1|cela pâge protègiêe|celes pâges protègiêes}}-que avouéc la « protèccion en cascâda » activâye :",
+       "titleprotectedwarning": "<strong>Atencion : cela pâge est étâye protègiêe por que de [[Special:ListGroupRights|drêts spècificos]] sont nècèssèros por la povêr fâre.</strong>\nLa dèrriére entrâ du jornâl est balyêe ce-desot coment rèference :",
        "templatesused": "{{PLURAL:$1|Modèlo empleyê|Modèlos empleyês}} per cela pâge :",
        "templatesusedpreview": "{{PLURAL:$1|Modèlo empleyê|Modèlos empleyês}} dedens cél apèrçu :",
        "templatesusedsection": "{{PLURAL:$1|Modèlo empleyê|Modèlos empleyês}} dedens cela sèccion :",
        "permissionserrors": "Fôta de pèrmission",
        "permissionserrorstext": "Vos éd pas la pèrmission de fâre l’accion demandâye por {{PLURAL:$1|cela rêson|celes rêsons}}-que :",
        "permissionserrorstext-withaction": "Vos éd pas la pèrmission de $2 por {{PLURAL:$1|cela rêson|celes rêsons}}-que :",
-       "contentmodelediterror": "Vos pouede pas changiér cela vèrsion perce que son modèlo de contegnu est <code>$1</code>, cen que sè difèrence du modèlo de contegnu d’ora de la pâge <code>$2</code>.",
+       "contentmodelediterror": "Vos pouede pas changiér cela vèrsion, son modèlo de contegnu est <code>$1</code>, cen que sè difèrence du modèlo de contegnu d’ora de la pâge <code>$2</code>.",
        "recreate-moveddeleted-warn": "<strong>Atencion : vos éte aprés refâre na pâge qu’est étâye suprimâye dês devant.</strong>\n\nDemandâd-vos se fôt franc continuar son changement.\nLo jornâl de les suprèssions et des dèplacements de cela pâge est balyê ce-desot por comoditât :",
        "moveddeleted-notice": "Cela pâge est étâye suprimâye.\nLo jornâl de les suprèssions et des dèplacements de cela pâge est balyê ce-desot coment rèference.",
        "moveddeleted-notice-recent": "Dèsolâ, dês pou cela pâge est étâye suprimâye (dens les 24 hores passâyes).\nLo jornâl de les suprèssions et des dèplacements de cela pâge est balyê ce-desot coment rèference.",
        "edit-hook-aborted": "Changement anulâ per un’èxtension.\nNion’èxplicacion est étâye balyêe.",
        "edit-gone-missing": "Y at pas moyen de betar a jorn la pâge.\nSemble que seye étâye suprimâye.",
        "edit-conflict": "Disputa de changement.",
-       "edit-no-change": "Voutron changement est étâ ignorâ perce que nion changement est étâ fêt u tèxto.",
+       "edit-no-change": "Voutron changement est étâ ignorâ, nion changement est étâ fêt u tèxto.",
        "postedit-confirmation-created": "La pâge est étâye fêta.",
        "postedit-confirmation-restored": "La pâge est étâye refêta.",
        "postedit-confirmation-saved": "Voutron changement est étâ encartâ.",
        "duplicate-args-category-desc": "La pâge contint d’apèls de modèlo qu’emplèyont d’arguments doblos, coment <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ou ben <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "<strong>Atencion :</strong> cela pâge contint trop d’apèls a des fonccions parsiors que revegnont chieres.\n\nY devrêt avêr muens de $2 apèl{{PLURAL:$2||s}}, pendent qu’y en at ora $1.",
        "expensive-parserfunction-category": "Pâges avouéc trop d’apèls a des fonccions parsiors que revegnont chieres",
-       "post-expand-template-inclusion-warning": "<strong>Atencion :</strong> la talye des modèlos entrebetâs est trop grôssa.\nDoux-três modèlos seront pas entrebetâs.",
-       "post-expand-template-inclusion-category": "Pâges yô que la talye des modèlos entrebetâs est dèpassâye",
+       "post-expand-template-inclusion-warning": "<strong>Atencion :</strong> la talye des modèlos rapondus est trop grôssa.\nDoux-três modèlos seront pas rapondus.",
+       "post-expand-template-inclusion-category": "Pâges yô que la talye des modèlos rapondus est dèpassâye",
        "post-expand-template-argument-warning": "<strong>Atencion :</strong> cela pâge contint por lo muens un argument de modèlo qu’at na talye d’èxpension trop grôssa.\nCelos arguments sont pas étâs betâs.",
        "post-expand-template-argument-category": "Pâges que contegnont d’arguments de modèlo pas betâs",
        "parser-template-loop-warning": "Modèlo bocllo dècelâ : [[$1]]",
        "converter-manual-rule-error": "Fôta dècelâye dedens la règlla de convèrsion manuâla de lengoua",
        "undo-success": "Lo changement pôt étre dèfêt.\nSe vos plét, controlâd la comparèson ce-desot por vos assurar qu’o est franc cen que vos voléd fâre, et pués encartâd los changements por chavonar sa dèfêta.",
        "undo-failure": "Lo changement at pas possu étre dèfêt a côsa d’una disputa avouéc des changements entèrmèdièros.",
-       "undo-norev": "Lo changement at pas possu étre dèfêt perce qu’il est inègzistent ou ben qu’il est étâ suprimâ.",
+       "undo-norev": "Lo changement at pas possu étre dèfêt, il est inègzistent ou ben il est étâ suprimâ.",
        "undo-nochange": "Semble que lo changement seye ja étâ dèfêt.",
        "undo-summary": "Dèfêta du changement $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discutar]])",
        "undo-summary-username-hidden": "Dèfêta du changement $1 d’un utilisator cachiê",
        "rev-suppressed-text-unhide": "Cela vèrsion de la pâge est étâye <strong>rèprimâye</strong>.\nY pôt avêr més de dètalys dessus lo [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jornâl de les rèprèssions].\nVos pouede adés [$1 vêre cela vèrsion] se vos o voléd.",
        "rev-deleted-text-view": "Cela vèrsion de la pâge est étâye <strong>suprimâye</strong>.\nVos la pouede vêre ; y pôt avêr més de dètalys dessus lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornâl de les suprèssions].",
        "rev-suppressed-text-view": "Cela vèrsion de la pâge est étâye <strong>rèprimâye</strong>.\nVos la pouede vêre ; y pôt avêr més de dètalys dessus lo [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jornâl de les rèprèssions].",
-       "rev-deleted-no-diff": "Vos pouede pas vêre cela dif perce que yona de les vèrsions est étâye <strong>suprimâye</strong>.\nY pôt avêr més de dètalys dessus lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornâl de les suprèssions].",
-       "rev-suppressed-no-diff": "Vos pouede pas vêre cela dif perce que yona de les vèrsions est étâye <strong>suprimâye</strong>.",
+       "rev-deleted-no-diff": "Vos pouede pas vêre cela dif, yona de les vèrsions est étâye <strong>suprimâye</strong>.\nY pôt avêr més de dètalys dessus lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornâl de les suprèssions].",
+       "rev-suppressed-no-diff": "Vos pouede pas vêre cela dif, yona de les vèrsions est étâye <strong>suprimâye</strong>.",
        "rev-deleted-unhide-diff": "Yona de les vèrsions de cela dif est étâye <strong>suprimâye</strong>.\nY pôt avêr més de dètalys dessus lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornâl de les suprèssions].\nVos pouede adés [$1 vêre cela dif] se vos o voléd.",
        "rev-suppressed-unhide-diff": "Yona de les vèrsions de cela dif est étâye <strong>rèprimâye</strong>.\nY pôt avêr més de dètalys dessus lo [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jornâl de les rèprèssions].\nVos pouede adés [$1 vêre cela dif] se vos o voléd.",
        "rev-deleted-diff-view": "Yona de les vèrsions de cela dif est étâye <strong>suprimâye</strong>.\nVos pouede vêre cela dif ; y pôt avêr més de dètalys dessus lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornâl de les suprèssions].",
        "rev-suppressed-diff-view": "Yona de les vèrsions de cela dif est étâye <strong>rèprimâye</strong>.\nVos pouede vêre cela dif ; y pôt avêr més de dètalys dessus lo [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jornâl de les rèprèssions].",
        "rev-delundel": "changiér la visibilitât",
        "rev-showdeleted": "montrar",
-       "revisiondelete": "Suprimar ou ben refâre de vèrsions",
+       "revisiondelete": "Suprimar refâre de vèrsions",
        "revdelete-nooldid-title": "Vèrsion ciba pas justa",
-       "revdelete-nooldid-text": "Vos éd spècifiâ gins de vèrsion ciba por y fâre cela fonccion, ou ben la vèrsion spècifiâye ègziste pas, ou ben vos èprovâd de cachiér la vèrsion d’ora.",
+       "revdelete-nooldid-text": "Vos éd spècifiâ gins de vèrsion ciba por y fâre cela fonccion, ou ben la vèrsion spècifiâye ègziste pas ou ben vos èprovâd de cachiér la vèrsion d’ora.",
        "revdelete-no-file": "Lo fichiér spècifiâ ègziste pas.",
        "revdelete-show-file-confirm": "Vos éte de sûr de volêr vêre na vèrsion suprimâye du fichiér « <nowiki>$1</nowiki> » que dâte du $2 a $3 ?",
        "revdelete-show-file-submit": "Ouè",
        "revdelete-text-file": "Les vèrsions de fichiér suprimâyes continueront a aparêtre dedens l’historico du fichiér, mas na partia de lor contegnu serat inaccèssibla u publico.",
        "logdelete-text": "Los èvènements du jornâl suprimâs continueront a aparêtre dedens los jornâls, mas na partia de lor contegnu serat inaccèssibla u publico.",
        "revdelete-text-others": "Los ôtros administrators porront adés arrevar u contegnu cachiê et lo refâre, a muens que des rèstriccions de més seyont dèfenies.",
-       "revdelete-confirm": "Se vos plét, confirmâd qu’o est franc cen que vos voléd fâre, que vos en compregnéd les consèquences, et pués que vos o féte en acôrd avouéc les [[{{MediaWiki:Policy-url}}|règlles]].",
+       "revdelete-confirm": "Se vos plét, confirmâd qu’o est franc cen que vos voléd fâre, que vos en compregnéd les consèquences, et pués que vos o féte en acôrd avouéc les [[{{MediaWiki:Policy-url}}|politiques]].",
        "revdelete-suppress-text": "La rèprèssion dêt étre empleyêe <strong>ren que</strong> dens celos câs-que :\n* Enformacions que pôvont étre difamatouères\n* Enformacions a sè que vant pas avouéc\n*: <em>adrèce, numerô de tèlèfono, numerô d’identificacion nacionâl, et tot cen que vat avouéc</em>",
        "revdelete-legend": "Dèfenir de rèstriccions de visibilitât",
        "revdelete-hide-text": "Tèxto de la vèrsion",
        "revdelete-unsuppress": "Enlevar les rèstriccions sur les vèrsions refêtes",
        "revdelete-log": "Rêson :",
        "revdelete-submit": "Aplicar a {{PLURAL:$1|la vèrsion chouèsia|les vèrsions chouèsies}}",
-       "revdelete-success": "Visibilitât de la vèrsion betâye a jorn avouéc reusséta.",
+       "revdelete-success": "Visibilitât de la vèrsion betâye a jorn.",
        "revdelete-failure": "La visibilitât de la vèrsion at pas possu étre betâye a jorn :\n$1",
-       "logdelete-success": "Visibilitât du jornâl dèfenia avouéc reusséta.",
+       "logdelete-success": "Visibilitât du jornâl dèfenia.",
        "logdelete-failure": "La visibilitât du jornâl at pas possu étre dèfenia :\n$1",
        "revdel-restore": "changiér la visibilitât",
        "pagehist": "Historico de la pâge",
        "revdelete-hide-current": "Fôta en cachient la piéce datâye du $1 a $2 : o est la vèrsion d’ora.\nPôt pas étre cachiêe.",
        "revdelete-show-no-access": "Fôta en montrent la piéce datâye du $1 a $2 : el est marcâye coment « rètrenta ».\nVos y éd pas accès.",
        "revdelete-modify-no-access": "Fôta en changient la piéce datâye du $1 a $2 : el est marcâye coment « rètrenta ».\nVos y éd pas accès.",
-       "revdelete-modify-missing": "Fôta en changient la piéce avouéc l’ID $1 : el est manquenta dedens la bâsa de balyês !",
+       "revdelete-modify-missing": "Fôta en changient la piéce avouéc l’ID $1 : el est entrovâbla dedens la bâsa de balyês !",
        "revdelete-no-change": "<strong>Atencion :</strong> la piéce datâye du $1 a $2 at ja la configuracion de visibilitât demandâye.",
        "revdelete-concurrent-change": "Fôta en changient la piéce datâye du $1 a $2 : son statut semble étre étâ changiê per un ôtro justo que vos èprovâvâd d’o changiér.\nSe vos plét, controlâd los jornâls.",
        "revdelete-only-restricted": "Fôta en cachient la piéce datâye du $1 a $2 : vos pouede pas rèprimar de piéces de la viua ux administrators sen chouèsir avouéc d’ôtros chouèx de visibilitât.",
        "revdelete-reasonotherlist": "Ôtra rêson",
        "revdelete-edit-reasonlist": "Changiér les rêsons de suprèssion",
        "revdelete-offender": "Ôtor de la vèrsion :",
-       "suppressionlog": "Jornâl de les suprèssions",
+       "suppressionlog": "Jornâl de les prèssions",
        "suppressionlogtext": "Vê-que na lista de les suprèssions et des blocâjos qu’ant de contegnu cachiê ux administrators.\nVêde la [[Special:BlockList|lista des blocâjos]] por la lista des banissements et des blocâjos que sont ora actifs.",
        "mergehistory": "Fusionar los historicos de les pâges",
        "mergehistory-header": "Cela pâge vos pèrmèt de fusionar de vèrsions de l’historico d’una pâge d’origina vers na pâge novèla.\nAssurâd-vos que cél changement consèrverat la continuitât de l’historico de la pâge.",
        "mergehistory-fail-no-change": "La fusion des historicos at fusionâ gins de vèrsion. Se vos plét, tornâd chouèsir la pâge et pués los paramètros de temps.",
        "mergehistory-fail-permission": "Drêts ensufisents por fusionar los historicos.",
        "mergehistory-fail-self-merge": "Les pâges d’origina et de dèstinacion sont pariéres.",
-       "mergehistory-fail-timestamps-overlap": "Les vèrsions d’origina cavalont ou ben siuvont les vèrsions de dèstinacion.",
-       "mergehistory-fail-toobig": "Y at pas moyen de fâre la fusion des historicos perce qu’un nombro de {{PLURAL:$1|vèrsions}} d’amont la limita de $1 devrêt étre dèplaciê.",
+       "mergehistory-fail-timestamps-overlap": "Les vèrsions d’origina cavalont siuvont les vèrsions de dèstinacion.",
+       "mergehistory-fail-toobig": "Y at pas moyen de fâre la fusion des historicosun nombro de {{PLURAL:$1|vèrsions}} d’amont la limita de $1 devrêt étre dèplaciê.",
        "mergehistory-no-source": "La pâge d’origina $1 ègziste pas.",
        "mergehistory-no-destination": "La pâge de dèstinacion $1 ègziste pas.",
        "mergehistory-invalid-source": "La pâge d’origina dêt avêr un titro justo.",
        "prefs-watchlist-token": "Jeton por la lista de gouârda :",
        "prefs-misc": "De totes sôrtes",
        "prefs-resetpass": "Changiér lo contresegno",
-       "prefs-changeemail": "Changiér ou ben enlevar l’adrèce èlèctronica",
+       "prefs-changeemail": "Changiér enlevar l’adrèce èlèctronica",
        "prefs-setemail": "Dèfenir un’adrèce èlèctronica",
        "prefs-email": "Chouèx de mèssageria èlèctronica",
        "prefs-rendering": "Aparence",
        "saveusergroups": "Encartar les tropes d’{{GENDER:$1|utilisators}}",
        "userrights-groupsmember": "Membro de :",
        "userrights-groupsmember-auto": "Membro tacito de :",
-       "userrights-groups-help": "Vos pouede changiér les tropes a lesquintes est {{GENDER:$1|cél utilisator|cel’utilisatrice}} :\n* Na câsa pouentâye vôt dére que l’utilisat{{GENDER:$1|or|rice}} sè trôve dedens cela tropa.\n* Na câsa pas pouentâye vôt dére qu’y sè trôve pas.\n* Na petiôt’ètêla (*) endique que vos pouede pas enlevar cela tropa setout que vos l’éd apondua ou ben l’una l’ôtra.",
+       "userrights-groups-help": "Vos pouede changiér les tropes que lor est {{GENDER:$1|cél utilisator|cel’utilisatrice}} :\n* Na câsa pouentâye vôt dére que l’utilisat{{GENDER:$1|or|rice}} sè trôve dedens cela tropa.\n* Na câsa pas pouentâye vôt dére qu’y sè trôve pas.\n* Na petiôt’ètêla (*) endique que vos pouede pas enlevar cela tropa setout que vos l’éd apondua ou ben l’una l’ôtra.",
        "userrights-reason": "Rêson :",
        "userrights-no-interwiki": "Vos éd pas la pèrmission de changiér de drêts d’utilisator sur d’ôtros vouiquis.",
        "userrights-nodatabase": "La bâsa de balyês « $1 » ègziste pas ou ben est pas locâla.",
        "userrights-nologin": "Vos vos dête [[Special:UserLogin|branchiér]] avouéc un comptio d’administrator por balyér de drêts d’utilisator.",
-       "userrights-notallowed": "Vos éd pas la pèrmission de balyér ou ben enlevar de drêts d’utilisator.",
+       "userrights-notallowed": "Vos éd pas la pèrmission de balyér enlevar de drêts d’utilisator.",
        "userrights-changeable-col": "Les tropes que vos pouede changiér",
        "userrights-unchangeable-col": "Les tropes que vos pouede pas changiér",
        "userrights-conflict": "Disputa de changement de drêts d’utilisator ! Se vos plét, controlâd et pués confirmâd voutros changements.",
-       "userrights-removed-self": "Vos éd enlevâ avouéc reusséta los voutros drêts. Cen fât que vos pouede pas més arrevar a cela pâge.",
+       "userrights-removed-self": "Vos éd enlevâ los voutros drêts. Cen fât que vos pouede pas més arrevar a cela pâge.",
        "group": "Tropa :",
        "group-user": "Utilisators",
        "group-autoconfirmed": "Utilisators ôtoconfirmâs",
        "group-bot": "Robots",
        "group-sysop": "Administrators",
        "group-bureaucrat": "Grata-papiérs",
-       "group-suppress": "Suprèssiors",
+       "group-suppress": "prèssiors",
        "group-all": "(tôs)",
        "group-user-member": "utilisat{{GENDER:$1|or|rice}}",
        "group-autoconfirmed-member": "utilisat{{GENDER:$1|or ôtoconfirmâ|rice ôtoconfirmâye}}",
        "group-bot-member": "{{GENDER:$1|robot}}",
        "group-sysop-member": "administrat{{GENDER:$1|or|rice}}",
        "group-bureaucrat-member": "{{GENDER:$1|grata-papiér}}",
-       "group-suppress-member": "suprèssio{{GENDER:$1|r|sa}}",
+       "group-suppress-member": "prèssio{{GENDER:$1|r|sa}}",
        "grouppage-user": "{{ns:project}}:Utilisators",
        "grouppage-autoconfirmed": "{{ns:project}}:Utilisators ôtoconfirmâs",
        "grouppage-bot": "{{ns:project}}:Robots",
        "grouppage-sysop": "{{ns:project}}:Administrators",
        "grouppage-bureaucrat": "{{ns:project}}:Grata-papiérs",
-       "grouppage-suppress": "{{ns:project}}:Suprèssiors",
+       "grouppage-suppress": "{{ns:project}}:prèssiors",
        "right-read": "Liére les pâges",
        "right-edit": "Changiér les pâges",
        "right-createpage": "Fâre de pâges (que sont pas de pâges de discussion)",
        "right-block": "Blocar en ècritura d’ôtros utilisators",
        "right-blockemail": "Empachiér un utilisator de mandar de mèssâjos",
        "right-hideuser": "Blocar un utilisator en cachient son nom u publico",
-       "right-ipblock-exempt": "Èvitar los blocâjos d’IP, los blocâjos ôtomaticos et los blocâjos de plages d’IP",
+       "right-ipblock-exempt": "Èvitar los blocâjos d’IP, los blocâjos ôtomaticos et los blocâjos de plages IP",
        "right-unblockself": "Sè dèblocar sè-mémo",
        "right-protect": "Changiér los nivéls de protèccion et pués changiér les pâges protègiêes en cascâda",
        "right-editprotected": "Changiér les pâges protègiêes avouéc « {{int:protect-level-sysop}} »",
        "grant-editpage": "Changiér de pâges ègzistentes",
        "grant-editprotected": "Changiér de pâges protègiêes",
        "grant-highvolume": "Changement de grôs volumo",
-       "grant-oversight": "Cachiér los utilisators et suprimar les vèrsions",
+       "grant-oversight": "Cachiér los utilisators et primar les vèrsions",
        "grant-patrol": "Gouardar los changements a les pâges",
        "grant-protect": "Protègiér et enlevar la protèccion de pâges",
        "grant-rollback": "Rèvocar de changements sur des pâges",
        "grant-uploadeditmovefile": "Tèlèchargiér, remplaciér et dèplaciér de fichiérs",
        "grant-uploadfile": "Tèlèchargiér de novéls fichiérs",
        "grant-basic": "Drêts de bâsa",
-       "grant-viewdeleted": "Vêre los fichiérs et les pâges suprimâ(ye)s",
+       "grant-viewdeleted": "Vêre los fichiérs et les pâges suprimâs",
        "grant-viewmywatchlist": "Vêre voutra lista de gouârda",
        "newuserlogpage": "Jornâl de les crèacions de comptios utilisator",
        "newuserlogpagetext": "O est un jornâl de les crèacions de comptios utilisator.",
        "action-mergehistory": "fusionar l’historico de cela pâge",
        "action-userrights": "changiér tôs los drêts d’utilisator",
        "action-userrights-interwiki": "changiér los drêts d’utilisator d’utilisators que sont sur d’ôtros vouiquis",
-       "action-siteadmin": "cotar ou ben dècotar la bâsa de balyês",
+       "action-siteadmin": "cotar dècotar la bâsa de balyês",
        "action-sendemail": "mandar de mèssâjos",
        "action-editmywatchlist": "changiér voutra lista de gouârda",
        "action-viewmywatchlist": "vêre voutra lista de gouârda",
        "recentchanges-label-plusminus": "La talye de la pâge at changiê de cél nombro d’octèts.",
        "recentchanges-legend-heading": "<strong>Lègenda :</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vêde avouéc la [[Special:NewPages|lista de les pâges novèles]]).",
-       "recentchanges-submit": "Listar",
+       "recentchanges-submit": "Montrar",
        "rcnotefrom": "Vê-que {{PLURAL:$5|lo changement fêt|los changements fêts}} dês lo <strong>$3 a $4</strong> (tant qu’a <strong>$1</strong> montrâs).",
        "rclistfrom": "Montrar los novéls changements dês lo $3 a $2",
        "rcshowhideminor": "$1 los petiôts changements",
        "upload-tryagain": "Mandar la dèscripcion du fichiér changiê",
        "uploadnologin": "Pas branchiê(ye)",
        "uploadnologintext": "Se vos plét, vos vos dête $1 por povêr tèlèchargiér de fichiérs.",
-       "upload_directory_missing": "Lo rèpèrtouèro de tèlèchargement ($1) est manquent et at pas possu étre fêt per lo sèrvior Vouèbe.",
-       "upload_directory_read_only": "Lo rèpèrtouèro de tèlèchargement ($1) est pas accèssiblo en ècritura dês lo sèrvior Vouèbe.",
+       "upload_directory_missing": "Lo rèpèrtouèro de tèlèchargement ($1) est entrovâblo et at pas possu étre fêt per lo sèrvior Vouèbe.",
+       "upload_directory_read_only": "Lo rèpèrtouèro de tèlèchargement ($1) est pas enscriptiblo dês lo sèrvior Vouèbe.",
        "uploaderror": "Fôta pendent lo tèlèchargement",
-       "upload-recreate-warning": "<strong>Atencion : un fichiér avouéc cél nom est étâ suprimâ ou ben dèplaciê.</strong>\n\nLo jornâl de les suprèssions et des dèplacements de cela pâge est balyê ique por comoditât :",
-       "uploadtext": "Empleyéd lo formulèro ce-desot por tèlèchargiér de fichiérs.\nPor vêre ou ben rechèrchiér de fichiérs tèlèchargiês dês devant, vêde la [[Special:FileList|lista des fichiérs tèlèchargiês]]. Los (re-)tèlèchargements sont asse-ben encartâs dessus lo [[Special:Log/upload|jornâl des tèlèchargements]], et les suprèssions dessus lo [[Special:Log/delete|jornâl de les suprèssions]].\n\nPor entrebetar un fichiér dedens na pâge, empleyéd un lim de yona de celes fôrmes-que :\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichiér.jpg]]</nowiki></code></strong> por empleyér la vèrsion en plêna largior du fichiér\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichiér.png|200px|thumb|left|tèxto dèscriptif]]</nowiki></code></strong> por empleyér na miniatura de 200 pixèls de lârjo dedens na bouèt’a gôche avouéc « tèxto dèscriptif » coment dèscripcion\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fichiér.ogg]]</nowiki></code></strong> por liyér tot drêt vers lo fichiér sen lo fâre vêre",
+       "upload-recreate-warning": "<strong>Atencion : un fichiér avouéc cél nom est étâ suprimâ dèplaciê.</strong>\n\nLo jornâl de les suprèssions et des dèplacements de cela pâge est balyê ique por comoditât :",
+       "uploadtext": "Empleyéd lo formulèro ce-desot por tèlèchargiér de fichiérs.\nPor vêre rechèrchiér de fichiérs tèlèchargiês dês devant, vêde la [[Special:FileList|lista des fichiérs tèlèchargiês]]. Los (re-)tèlèchargements sont asse-ben encartâs dessus lo [[Special:Log/upload|jornâl des tèlèchargements]], et les suprèssions dessus lo [[Special:Log/delete|jornâl de les suprèssions]].\n\nPor rapondre un fichiér dedens na pâge, empleyéd un lim de yona de celes fôrmes-que :\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichiér.jpg]]</nowiki></code></strong> por empleyér la vèrsion en plêna largior du fichiér\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichiér.png|200px|thumb|left|tèxto dèscriptif]]</nowiki></code></strong> por empleyér na miniatura de 200 pixèls de lârjo dedens na bouèt’a gôche avouéc « tèxto dèscriptif » coment dèscripcion\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fichiér.ogg]]</nowiki></code></strong> por liyér tot drêt vers lo fichiér sen lo fâre vêre",
        "upload-permitted": "Tipo{{PLURAL:$2||s}} de fichiérs ôtorisâ{{PLURAL:$2||s}} : $1.",
        "upload-preferred": "Tipo{{PLURAL:$2||s}} de fichiérs prèferâ{{PLURAL:$2||s}} : $1.",
        "upload-prohibited": "Tipo{{PLURAL:$2||s}} de fichiérs dèfendu{{PLURAL:$2||s}} : $1.",
        "badfilename": "Lo nom du fichiér est étâ changiê en « $1 ».",
        "filetype-mime-mismatch": "L’èxtension du fichiér « .$1 » corrèspond pas u tipo MIME dècelâ du fichiér ($2).",
        "filetype-badmime": "Los fichiérs du tipo MIME « $1 » pôvont pas étre tèlèchargiês.",
-       "filetype-bad-ie-mime": "Lo fichiér pôt pas étre tèlèchargiê perce que serêt dècelâ coment « $1 » per Internet Explorer, cen que corrèspond a un tipo de fichiér dèfendu et pués pôt-étre dangerox.",
+       "filetype-bad-ie-mime": "Lo fichiér pôt pas étre tèlèchargiê, serêt dècelâ coment « $1 » per Internet Explorer, cen que corrèspond a un tipo de fichiér dèfendu et pués pôt-étre dangerox.",
        "filetype-unwanted-type": "<strong>« .$1 »</strong> est un tipo de fichiér pas volu.\n{{PLURAL:$3|Lo tipo de fichiér prèferâ est|Los tipos de fichiérs prèferâs sont}} $2.",
        "filetype-banned-type": "<strong>« .$1 »</strong> {{PLURAL:$4|est pas un tipo de fichiér ôtorisâ|sont pas de tipos de fichiérs ôtorisâs}}.\n{{PLURAL:$3|Lo tipo de fichiér ôtorisâ est|Los tipos de fichiérs ôtorisâs sont}} $2.",
        "filetype-missing": "Lo fichiér at gins d’èxtension (coment « .jpg » per ègzemplo).",
        "largefileserver": "Cél fichiér est ples grôs que lo sèrvior est configurâ por l’ôtorisar.",
        "emptyfile": "Lo fichiér que vos éd tèlèchargiê semble étre vouedo.\nCen pôt étre diu a na fôta dedens lo nom du fichiér.\nSe vos plét, controlâd que vos voléd franc tèlèchargiér cél fichiér.",
        "windows-nonascii-filename": "Cél vouiqui recognêt pas los noms de fichiérs avouéc des caractèros spèciâls.",
-       "fileexists": "Un fichiér avouéc cél nom ègziste ja, se vos plét controlâd <strong>[[:$1]]</strong> se {{GENDER:|vos}} éte pas de sûr de lo volêr changiér.\n[[$1|thumb]]",
+       "fileexists": "Un fichiér avouéc cél nom ègziste ja, se vos plét controlâd <strong>[[:$1]]</strong> se {{GENDER:|vos}} éte pas de sûr do volêr changiér.\n[[$1|thumb]]",
        "filepageexists": "La pâge de dèscripcion por cél fichiér est ja étâye fêta ique <strong>[[:$1]]</strong>, mas nion fichiér avouéc cél nom ègziste ora.\nLo rèsumâ que vos voléd buchiér aparêtrat pas dessus la pâge de dèscripcion.\nPor o fâre, vos la devréd changiér a la man.\n[[$1|thumb]]",
        "fileexists-extension": "Un fichiér avouéc un nom d’ense ègziste ja : [[$2|thumb]]\n* Nom du fichiér a tèlèchargiér : <strong>[[:$1]]</strong>\n* Nom du fichiér ègzistent : <strong>[[:$2]]</strong>\nPôt-étre vos voléd empleyér un nom ples prôpro ?",
        "fileexists-thumbnail-yes": "Lo fichiér semble étre un’émâge en talye rèduita <em>(miniatura)</em>.\n[[$1|thumb]]\nSe vos plét, controlâd lo fichiér <strong>[[:$1]]</strong>.\nSe lo fichiér controlâ est la mém’émâge avouéc la talye originâla, y at pas fôta de tèlèchargiér na miniatura de més.",
        "uploadscriptednamespace": "Cél fichiér SVG contint un èspâço de noms « $1 » pas ôtorisâ.",
        "uploadinvalidxml": "Lo XML dedens lo fichiér tèlèchargiê at pas possu étre analisâ.",
        "uploadvirus": "Cél fichiér contint un virus !\nDètalys : $1",
-       "uploadjava": "O est un fichiér ZIP que contint un fichiér Java « .class ».\nLo tèlèchargement de fichiérs Java est pas ôtorisâ perce que pôvont èvitar de rèstriccions de sècuritât.",
+       "uploadjava": "O est un fichiér ZIP que contint un fichiér Java « .class ».\nLo tèlèchargement de fichiérs Java est pas ôtorisâ, pôvont èvitar de rèstriccions de sècuritât.",
        "upload-source": "Fichiér sôrsa",
        "sourcefilename": "Nom du fichiér sôrsa :",
        "sourceurl": "URL sôrsa :",
        "watchthisupload": "Siuvre cél fichiér",
        "filewasdeleted": "Un fichiér avouéc cél nom est ja étâ tèlèchargiê et pués suprimâ.\nVos devriâd controlar lo $1 devant que lo tornar tèlèchargiér.",
        "filename-thumb-name": "Cen ressemble a un titro de miniatura. Se vos plét, tèlèchargiéd gins de miniatura ja presenta sur lo mémo vouiqui. Ôtrament, se vos plét corregiéd lo nom du fichiér por que seye ples significatif et pués qu’il èye pas lo prèfixo de miniatura.",
-       "filename-bad-prefix": "Lo nom du fichiér que vos tèlèchargiéd comence per <strong>« $1 »</strong> qu’est en g·ènèrâl un nom pas dèscriptif balyê ôtomaticament per los aparèlys-fotô numericos.\nSe vos plét, chouèsésséd-nen un nom ples dèscriptif.",
+       "filename-bad-prefix": "Lo nom du fichiér que vos tèlèchargiéd comence per <strong>« $1 »</strong> qu’est en g·ènèrâl un nom pas dèscriptif balyê ôtomaticament per los aparèlys-fotô numericos.\nSe vos plét, chouèsésséd-nen un nom ples dèscriptif.",
        "filename-prefix-blacklist": " #<!-- lèssiéd ceta legne justo d’ense --> <pre>\n# La sintaxa est ceta :\n#  * Tot tèxto que siut un « # » tant qu’a la fin de la legne est un comentèro.\n#  * Tota legne pas voueda est un prèfixo tipico de nom de fichiér balyê ôtomaticament per los aparèlys-fotô numericos :\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # quârques enfatâblos\nIMG # g·ènèrico\nJD # Jenoptik\nMGP # Pentax\nPICT # de totes sôrtes\n #</pre> <!-- lèssiéd ceta legne justo d’ense -->",
        "upload-proto-error": "Protocolo fôx",
        "upload-proto-error-text": "Lo tèlèchargement a distance at fôta d’URLs que començont per <code>http://</code> ou ben <code>ftp://</code>.",
        "upload-dialog-button-upload": "Tèlèchargiér",
        "upload-form-label-infoform-title": "Dètalys",
        "upload-form-label-infoform-name": "Nom",
-       "upload-form-label-infoform-name-tooltip": "Un titro dèscriptif sen pariér por lo fichiér, que sèrvirat coment nom de fichiér. Vos pouede empleyér de lengâjo corent avouéc des èspâços. Pas entrebetar l’èxtension du fichiér.",
+       "upload-form-label-infoform-name-tooltip": "Un titro dèscriptif sen pariér por lo fichiér, que sèrvirat coment nom de fichiér. Vos pouede empleyér de lengâjo corent avouéc des èspâços. Pas rapondre l’èxtension du fichiér.",
        "upload-form-label-infoform-description": "Dèscripcion",
        "upload-form-label-infoform-description-tooltip": "Dècrire vito tot cen qu’y at de particuliér por cel’ôvra.\nPor na fotô, mencionar les chouses principâles que sont semondues, l’ocasion ou ben l’endrêt.",
        "upload-form-label-usage-title": "Usâjo",
        "backend-fail-closetemp": "Y at pas moyen de cllôre lo fichiér temporèro.",
        "backend-fail-read": "Y at pas moyen de liére lo fichiér « $1 ».",
        "backend-fail-create": "Y at pas moyen d’ècrire lo fichiér « $1 ».",
-       "backend-fail-maxsize": "Y at pas moyen d’ècrire lo fichiér « $1 » perce qu’il est ples grôs {{PLURAL:$2|qu’un octèt|que $2 octèts}}.",
+       "backend-fail-maxsize": "Y at pas moyen d’ècrire lo fichiér « $1 »il est ples grôs {{PLURAL:$2|qu’un octèt|que $2 octèts}}.",
        "backend-fail-readonly": "Ora lo sistèmo de stocâjo « $1 » est mas qu’en lèctura. La rêson balyêe est : <em>$2</em>",
        "backend-fail-synced": "Lo fichiér « $1 » est dens un ètat dèsordonâ dedens los sistèmos de stocâjo de dedens",
        "backend-fail-connect": "Y at pas moyen de sè branchiér u sistèmo de stocâjo « $1 ».",
        "backend-fail-internal": "Na fôta encognua est arrevâye dedens lo sistèmo de stocâjo « $1 ».",
        "backend-fail-contenttype": "Y at pas moyen de dètèrmenar lo tipo de contegnu du fichiér a stocar dedens « $1 ».",
        "backend-fail-batchsize": "Lo sistèmo de stocâjo at balyê na pârt de $1 {{PLURAL:$1|opèracion|opèracions}} de fichiér ; la limita est $2 {{PLURAL:$2|opèracion|opèracions}}.",
-       "backend-fail-usable": "Y at pas moyen de liére d’ècrire lo fichiér « $1 » a côsa de drêts ensufisents ou ben de rèpèrtouèros conteniors manquents.",
+       "backend-fail-usable": "Y at pas moyen de liére d’ècrire lo fichiér « $1 » a côsa de drêts ensufisents ou ben de rèpèrtouèros de conteniors entrovâblos.",
        "filejournal-fail-dbconnect": "Y at pas moyen de sè branchiér a la bâsa de balyês du jornâl por lo sistèmo de stocâjo « $1 ».",
        "filejournal-fail-dbquery": "Y at pas moyen de betar a jorn la bâsa de balyês du jornâl por lo sistèmo de stocâjo « $1 ».",
        "lockmanager-notlocked": "Y at pas moyen de dècotar « $1 » ; o est pas cotâ.",
        "uploadstash-summary": "Cela pâge balye accès ux fichiérs que sont tèlèchargiês ou ben en cors de tèlèchargement, mas sont p’oncor publeyês dedens lo vouiqui. Celos fichiérs sont p’oncor visiblos, solament por l’utilisator que los at tèlèchargiês.",
        "uploadstash-clear": "Vouedar los fichiérs en cacho",
        "uploadstash-nofiles": "Vos éd gins de fichiér en cacho.",
-       "uploadstash-badtoken": "L’ègzécucion de cel’accion at pas reussi, pôt-étre perce que voutros identifients de changement ant èxpirâ. Tornâd èprovar.",
-       "uploadstash-errclear": "L’èfacement des fichiérs at pas reussi.",
+       "uploadstash-badtoken": "L’ègzécucion de cel’accion at pas reussi. Pôt-étre perce que voutros identifients de changement ant èxpirâ. Se vos plét, tornâd èprovar.",
+       "uploadstash-errclear": "La vouegiê des fichiérs at pas reussi.",
        "uploadstash-refresh": "Rafrèchir la lista des fichiérs",
        "invalid-chunk-offset": "Dèplacement de bocon pas justo",
        "img-auth-accessdenied": "Accès refusâ",
-       "img-auth-nopathinfo": "PATH_INFO manquent.\nVoutron sèrvior est pas configurâ por passar cel’enformacion.\nPôt-étre que fonccione en CGI et recognêt vêr pas img_auth.\nVêde https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO entrovâblo.\nVoutron sèrvior est pas configurâ por passar cel’enformacion.\nPôt-étre que fonccione en CGI et recognêt vêr pas img_auth.\nVêde https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Lo chemin demandâ est pas lo rèpèrtouèro de tèlèchargement configurâ.",
        "img-auth-badtitle": "Y at pas moyen de construire un titro justo dês « $1 ».",
        "img-auth-nologinnWL": "Vos éte pas branchiê et pués « $1 » est pas dedens la lista blanche.",
        "listfiles_size": "Talye",
        "listfiles_description": "Dèscripcion",
        "listfiles_count": "Vèrsions",
-       "listfiles-show-all": "Entrebetar les vielyes vèrsions de les émâges",
+       "listfiles-show-all": "Rapondre les vielyes vèrsions de les émâges",
        "listfiles-latestversion": "Vèrsion d’ora",
        "listfiles-latestversion-yes": "Ouè",
        "listfiles-latestversion-no": "Nan",
        "nolinkstoimage": "Niona pâge emplèye cél fichiér.",
        "morelinkstoimage": "Vêde [[Special:WhatLinksHere/$1|més de lims]] de vers cél fichiér.",
        "linkstoimage-redirect": "$1 (redirèccion de fichiér) $2",
-       "duplicatesoffile": "{{PLURAL:$1|Cél fichiér-que est un doblo|Celos $1 fichiérs-que sont des doblos}} de ceti ([[Special:FileDuplicateSearch/$2|més de dètalys]]) :",
+       "duplicatesoffile": "{{PLURAL:$1|Cél fichiér-que est un doblo|Celos $1 fichiérs-que sont de doblos}} de ceti ([[Special:FileDuplicateSearch/$2|més de dètalys]]) :",
        "sharedupload": "Cél fichiér vint de $1 et pôt étre empleyê per d’ôtros projèts.",
        "sharedupload-desc-there": "Cél fichiér vint de $1 et pôt étre empleyê per d’ôtros projèts.\nSe vos plét, vêde sa [$2 pâge de dèscripcion] por més d’enformacions.",
        "sharedupload-desc-here": "Cél fichiér vint de $1 et pôt étre empleyê per d’ôtros projèts.\nLa dèscripcion dessus sa [$2 pâge de dèscripcion] est montrâye ce-desot.",
        "filedelete-reason-otherlist": "Ôtra rêson",
        "filedelete-reason-dropdown": "*Rêsons comenes de suprèssion\n** Violacion du drêt d’ôtor\n** Fichiér en doblo",
        "filedelete-edit-reasonlist": "Changiér les rêsons de suprèssion",
-       "filedelete-maintenance": "La suprèssion et la rèstoracion de fichiérs est dèsactivâye por un moment pendent la mantegnence.",
+       "filedelete-maintenance": "La suprèssion et la rèstoracion de fichiérs est pas dèsactivâye por grant-temps pendent l’entretin.",
        "filedelete-maintenance-title": "Y at pas moyen de suprimar lo fichiér",
        "mimesearch": "Rechèrche per tipo MIME",
-       "mimesearch-summary": "Ceta pâge pèrmèt de filtrar los fichiérs per lor tipo MIME.\nEntrâ : ''tipodecontegnu''/''sot-tipo'', per ègzemplo <code>image/jpeg</code>.",
+       "mimesearch-summary": "Cela pâge vos pèrmèt de filtrar los fichiérs per lor tipo MIME.\nEntrâ : tipo_de_contegnu/sot-tipo ou ben tipo_de_contegnu/*, per ègzemplo <code>image/jpeg</code>.",
        "mimetype": "Tipo MIME :",
        "download": "tèlèchargiér",
        "unwatchedpages": "Pâges pas siuvues",
        "listredirects": "Lista de les redirèccions",
+       "listduplicatedfiles": "Lista de fichiérs en doblo",
+       "listduplicatedfiles-summary": "O est na lista de fichiérs yô que la vèrsion la ples novèla du fichiér est na copia de la vèrsion la ples novèla d’un ôtro fichiér. Solament los fichiérs locâls sont ègzamenâs.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] at [[$3|{{PLURAL:$2|un doblo|$2 doblos}}]].",
        "unusedtemplates": "Modèlos pas empleyês",
-       "unusedtemplatestext": "Ceta pâge liste totes les pâges de l’èspâço de noms « {{ns:template}} » que sont pas entrebetâyes dedens nion’ôtra pâge.\nOubliâd pas de controlar s’y at gins d’ôtro lim de vers los modèlos devant que los suprimar.",
+       "unusedtemplatestext": "Cela pâge liste totes les pâges de l’èspâço de noms « {{ns:template}} » que sont pas rapondues dedens nion’ôtra pâge.\nOubliâd pas de controlar s’y at gins d’ôtro lim de vers los modèlos devant que los suprimar.",
        "unusedtemplateswlh": "ôtros lims",
        "randompage": "Pâge a l’hasârd",
-       "randompage-nopages": "Y at gins de pâge dedens {{PLURAL:$2|cet’èspâço|cetos èspâços}} de noms : $1.",
+       "randompage-nopages": "Y at gins de pâge dedens {{PLURAL:$2|cél èspâço|celos èspâços}} de noms-que : $1.",
+       "randomincategory": "Pâge a l’hasârd dedens la catègoria",
+       "randomincategory-invalidcategory": "« $1 » est pas un nom de catègoria justo.",
+       "randomincategory-nopages": "Y at gins de pâge dedens la catègoria [[:Category:$1|$1]].",
+       "randomincategory-category": "Catègoria :",
+       "randomincategory-legend": "Pâge a l’hasârd dedens la catègoria",
        "randomincategory-submit": "Emmodar",
-       "randomredirect": "Redirèccion per hasârd",
-       "randomredirect-nopages": "Y at gins de pâge de redirèccion dedens l’èspâço de noms « $1 ».",
+       "randomredirect": "Redirèccion a l’hasârd",
+       "randomredirect-nopages": "Y at gins de redirèccion dedens l’èspâço de noms « $1 ».",
        "statistics": "Statistiques",
        "statistics-header-pages": "Statistiques de les pâges",
        "statistics-header-edits": "Statistiques des changements",
        "statistics-users-active-desc": "Utilisators qu’ant fêt por lo muens un’accion pendent {{PLURAL:$1|lo jorn passâ|los $1 jorns passâs}}",
        "pageswithprop": "Pâges avouéc na propriètât de pâge",
        "pageswithprop-legend": "Pâges avouéc na propriètât de pâge",
-       "pageswithprop-text": "Ceta pâge liste les pâges qu’emplèyont na propriètât de pâge particuliére.",
+       "pageswithprop-text": "Cela pâge liste les pâges qu’emplèyont na propriètât de pâge particuliére.",
        "pageswithprop-prop": "Nom de la propriètât :",
-       "pageswithprop-submit": "Alar trovar",
+       "pageswithprop-submit": "Emmodar",
+       "pageswithprop-prophidden-long": "valor de propriètât de tèxto long cachiêe ($1)",
+       "pageswithprop-prophidden-binary": "valor de propriètât binèra cachiêe ($1)",
        "doubleredirects": "Redirèccions dobles",
-       "doubleredirectstext": "Ceta pâge liste les pâges que redirijont vers d’ôtres pâges de redirèccion.\nChâque renche contint des lims de vers la premiére et la seconda redirèccion, et pués la ciba de la seconda redirèccion, cen que balye habituèlament la « veré » pâge ciba, de vers laquinta la premiére redirèccion devrêt pouentar.\nLes entrâs <del>barrâyes</del> sont étâyes solucionâyes.",
-       "double-redirect-fixed-move": "[[$1]] est étâye dèplaciêe.\nOra redirige vers [[$2]].",
-       "double-redirect-fixed-maintenance": "Correge la redirèccion dobla de [[$1]] vers [[$2]].",
+       "doubleredirectstext": "Cela pâge liste les pâges que redirijont vers d’ôtres pâges de redirèccion.\nChâque renche contint de lims de vers la premiére et la seconda redirèccion, et pués la ciba de la seconda redirèccion, cen que balye per habituda la « veré » pâge ciba que la premiére redirèccion devrêt pouentar.\nLes entrês <del>barrâyes</del> sont étâyes solucionâyes.",
+       "double-redirect-fixed-move": "[[$1]] est étâ dèplaciê.\nIl est étâ betâ a jorn ôtomaticament et redirige ora vers [[$2]].",
+       "double-redirect-fixed-maintenance": "Corrèccion ôtomatica de la redirèccion dobla de [[$1]] de vers [[$2]] dens un ovrâjo d’entretin.",
        "double-redirect-fixer": "Corrèctor de redirèccion",
        "brokenredirects": "Redirèccions câsses",
-       "brokenredirectstext": "Cetes redirèccions mènont vers des pâges pas ègzistentes :",
+       "brokenredirectstext": "Celes redirèccions-que mènont vers de pâges inègzistentes :",
        "brokenredirects-edit": "changiér",
        "brokenredirects-delete": "suprimar",
        "withoutinterwiki": "Pâges sen lims entèrlengoues",
-       "withoutinterwiki-summary": "Cetes pâges ant gins de lim de vers d’ôtres lengoues.",
+       "withoutinterwiki-summary": "Celes pâges-que ant gins de lim de vers des vèrsions en ôtres lengoues.",
        "withoutinterwiki-legend": "Prèfixo",
        "withoutinterwiki-submit": "Montrar",
-       "fewestrevisions": "Pâges avouéc lo muens de vèrsions",
+       "fewestrevisions": "Pâges les muens changiêes",
        "nbytes": "$1 octèt{{PLURAL:$1||s}}",
-       "ncategories": "$1 catègorie{{PLURAL:$1||s}}",
+       "ncategories": "$1 catègori{{PLURAL:$1|a|es}}",
        "ninterwikis": "$1 {{PLURAL:$1|lim entèrvouiqui|lims entèrvouiquis}}",
        "nlinks": "$1 lim{{PLURAL:$1||s}}",
        "nmembers": "$1 membro{{PLURAL:$1||s}}",
+       "nmemberschanged": "$1 → $2 membro{{PLURAL:$2||s}}",
        "nrevisions": "$1 vèrsion{{PLURAL:$1||s}}",
        "nimagelinks": "Empleyê dessus $1 pâge{{PLURAL:$1||s}}",
        "ntransclusions": "empleyê dessus $1 pâge{{PLURAL:$1||s}}",
        "specialpage-empty": "Y at gins de rèsultat a fâre vêre.",
        "lonelypages": "Pâges orfenes",
-       "lonelypagestext": "Cetes pâges sont ni pouentâyes ni entrebetâyes per d’ôtres pâges de {{SITENAME}}.",
+       "lonelypagestext": "Celes pâges-que sont ni liyêes ni transcllues per d’ôtres pâges de {{SITENAME}}.",
        "uncategorizedpages": "Pâges sen catègories",
        "uncategorizedcategories": "Catègories sen catègories",
        "uncategorizedimages": "Fichiérs sen catègories",
        "unusedimages": "Fichiérs pas empleyês",
        "wantedcategories": "Catègories demandâyes",
        "wantedpages": "Pâges demandâyes",
+       "wantedpages-summary": "Lista de les pâges inègzistentes qu’ant lo més de lims de vers lor, en èxcllusent les pâges qu’ant ren que de redirèccions pouentent vers lor. Por avêr na lista de les pâges inègzistentes qu’ant de redirèccions pouentent vers lor, vêde la [[{{#special:BrokenRedirects}}|lista de les redirèccions câsses]].",
        "wantedpages-badtitle": "Titro pas justo dedens l’ensemblo de rèsultats : $1",
        "wantedfiles": "Fichiérs demandâs",
-       "wantedfiletext-cat": "Cetos fichiérs sont empleyês, mas ègzistont pas. Los fichiérs de dèpôts de defôr pôvont étre listâs mémo s’ègzistont. Tôs celos fôx positifs seront <del>barrâs</del>. Et pués les pâges qu’apondont des fichiérs qu’ègzistont pas sont listâs dedens [[:$1]].",
-       "wantedfiletext-nocat": "Cetos fichiérs sont empleyês, mas ègzistont pas. Los fichiérs de dèpôts de defôr pôvont étre listâs mémo s’ègzistont. Tôs celos fôx positifs seront <del>barrâs</del>.",
+       "wantedfiletext-cat": "Celos fichiérs-que sont empleyês, mas ègzistont pas. Los fichiérs de dèpôts de defôr pôvont étre listâs mémo s’ègzistont. Tôs celos fôx positifs seront <del>barrâs</del>. Et pués les pâges qu’apondont de fichiérs qu’ègzistont pas sont listâs dedens [[:$1]].",
+       "wantedfiletext-cat-noforeign": "Celos fichiérs-que sont empleyês, mas ègzistont pas. Et pués les pâges qu’apondont de fichiérs qu’ègzistont pas sont listâs dedens [[:$1]].",
+       "wantedfiletext-nocat": "Celos fichiérs-que sont empleyês, mas ègzistont pas. Los fichiérs de dèpôts de defôr pôvont étre listâs mémo s’ègzistont. Tôs celos fôx positifs seront <del>barrâs</del>.",
+       "wantedfiletext-nocat-noforeign": "Celos fichiérs-que sont empleyês, mas ègzistont pas.",
        "wantedtemplates": "Modèlos demandâs",
        "mostlinked": "Pâges les ples liyêes",
        "mostlinkedcategories": "Catègories les ples liyêes",
-       "mostlinkedtemplates": "Modèlos los ples liyês",
+       "mostlinkedtemplates": "Modèlos los ples transcllus",
        "mostcategories": "Pâges avouéc lo més de catègories",
        "mostimages": "Fichiérs los ples liyês",
        "mostinterwikis": "Pâges avouéc lo més de lims entèrvouiquis",
-       "mostrevisions": "Pâges avouéc lo més de vèrsions",
+       "mostrevisions": "Pâges les ples changiêes",
        "prefixindex": "Totes les pâges que començont per...",
        "prefixindex-namespace": "Totes les pâges avouéc prèfixo (èspâço de noms $1)",
+       "prefixindex-submit": "Montrar",
+       "prefixindex-strip": "Enlevar lo prèfixo dedens la lista",
        "shortpages": "Pâges côrtes",
        "longpages": "Pâges longes",
-       "deadendpages": "Pâges en cul-de-sac",
-       "deadendpagestext": "Cetes pâges contegnont gins de lim de vers d’ôtres pâges de {{SITENAME}}.",
+       "deadendpages": "Pâges en charriére borgne",
+       "deadendpagestext": "Celes pâges-que contegnont gins de lim de vers d’ôtres pâges de {{SITENAME}}.",
        "protectedpages": "Pâges protègiêes",
-       "protectedpages-indef": "Ren que les protèccions sen fin",
-       "protectedpages-cascade": "Ren que les protèccions en cascâda",
+       "protectedpages-indef": "Mas que les protèccions sen fin",
+       "protectedpages-summary": "Cela pâge liste les pâges ègzistentes que sont ora protègiêes. Por na lista des titros protègiês contre la crèacion, vêde [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
+       "protectedpages-cascade": "Mas que les protèccions en cascâda",
+       "protectedpages-noredirect": "Cachiér les redirèccions",
        "protectedpagesempty": "Ora niona pâge est protègiêe avouéc celos paramètros.",
+       "protectedpages-timestamp": "Dâta et hora",
+       "protectedpages-page": "Pâge",
+       "protectedpages-expiry": "Èxpire lo",
+       "protectedpages-performer": "Protèccion per l’utilisator",
+       "protectedpages-params": "Paramètros de protèccion",
+       "protectedpages-reason": "Rêson",
+       "protectedpages-submit": "Fâre vêre les pâges",
+       "protectedpages-unknown-timestamp": "Encognua",
+       "protectedpages-unknown-performer": "Utilisator encognu",
        "protectedtitles": "Titros protègiês",
+       "protectedtitles-summary": "Cela pâge liste los titros que sont ora protègiês contre la crèacion. Por na lista de les pâges ègzistentes protègiêes, vêde [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Ora nion titro est protègiê avouéc celos paramètros.",
+       "protectedtitles-submit": "Fâre vêre los titros",
        "listusers": "Lista des utilisators",
        "listusers-editsonly": "Montrar ren que los utilisators avouéc des contribucions",
        "listusers-creationsort": "Betar per dâta de crèacion",
+       "listusers-desc": "Betar en ôrdre dècrèssent",
        "usereditcount": "$1 changement{{PLURAL:$1||s}}",
        "usercreated": "Fêt{{GENDER:$3||a}} lo $1 a $2",
        "newpages": "Pâges novèles",
+       "newpages-submit": "Montrar",
        "newpages-username": "Nom d’utilisator :",
        "ancientpages": "Pâges les ples vielyes",
        "move": "Dèplaciér",
-       "movethispage": "Dèplaciér ceta pâge",
-       "unusedimagestext": "Cetos fichiérs ègzistont, mas sont pas entrebetâs dedens niona pâge.\nSe vos plét, notâd que d’ôtros setos Vouèbe pôvont avêr un lim de vers un fichiér avouéc un’URL drêta, donc un fichiér pôt adés étre listâ ique pendent qu’il est en usâjo actif.",
-       "unusedcategoriestext": "Cetes catègories ègzistont, mas nion’ôtra pâge niona catègorie les emplèye.",
+       "movethispage": "Dèplaciér cela pâge",
+       "unusedimagestext": "Celos fichiérs-que ègzistont, mas sont pas apondus a niona pâge.\nSe vos plét, notâd que d’ôtros setos Vouèbe pôvont avêr un lim de vers un fichiér avouéc un’URL drêta, adonc un fichiér pôt adés étre listâ ique pendent qu’il est en usâjo actif.",
+       "unusedcategoriestext": "Celes catègories-que ègzistont, mas nion’ôtra pâge niona catègoria les emplèye.",
        "notargettitle": "Niona ciba",
-       "notargettext": "Vos éd pas spècifiâ na pâge un utilisator ciba sur laquinta / loquint vos souhètâd fâre cel’accion.",
+       "notargettext": "Vos éd pas spècifiâ na pâge un utilisator ciba que vos voléd fâre cel’accion.",
        "nopagetitle": "Niona pâge ciba d’ense",
        "nopagetext": "La pâge ciba que vos éd spècifiâye ègziste pas.",
        "pager-newer-n": "{{PLURAL:$1|ples novèla|$1 ples novèles}}",
        "pager-older-n": "{{PLURAL:$1|ples vielye|$1 ples vielyes}}",
-       "suppress": "Ôtar",
-       "querypage-disabled": "Ceta pâge spèciâla est dèsactivâye por des rêsons de capacitât.",
+       "suppress": "Rèprimar",
+       "querypage-disabled": "Cela pâge spèciâla est dèsactivâye por de rêsons de capacitât.",
+       "apihelp": "Éde de l’API",
+       "apihelp-no-such-module": "Lo modulo « $1 » est entrovâblo.",
        "apisandbox": "Bouèta de sabla API",
-       "apisandbox-api-disabled": "API est dèsactivâ sur ceti seto.",
-       "apisandbox-intro": "Utilisâd ceta pâge por èxpèrimentar avouéc '''MediaWiki API'''.\nReportâd-vos sur [//www.mediawiki.org/wiki/API:Main_page la documentacion de l’API] por més de dètalys sur l’usâjo de l’API.",
+       "apisandbox-jsonly": "La bouèta de sabla API at fôta de JavaScript.",
+       "apisandbox-api-disabled": "L’API est dèsactivâ sur cél seto.",
+       "apisandbox-intro": "Empleyéd cela pâge por èprovar lo <strong>sèrviço Vouèbe API de MediaWiki</strong>.\nNen rèferâd-vos a la [[mw:API:Main page|documentacion de l’API]] por més de dètalys dessus l’usâjo de l’API. Ègzemplo : [//www.mediawiki.org/wiki/API#A_simple_example avêr lo contegnu d’una pâge principâla]. Chouèsésséd un’accion por vêre d’ôtros ègzemplos.\n\nNotâd que, quand ben qu’o est na bouèta de sabla, les accions que vos féte sur cela pâge pôvont changiér lo vouiqui.",
+       "apisandbox-fullscreen": "Èpatar la banche",
+       "apisandbox-fullscreen-tooltip": "Èpatar la banche de la bouèta de sabla por emplir la fenétra du navegator.",
+       "apisandbox-unfullscreen": "Montrar la pâge",
+       "apisandbox-unfullscreen-tooltip": "Rèduire la banche de la bouèta de sabla, por que los lims de navegacion de MediaWiki seyont disponiblos.",
        "apisandbox-submit": "Fâre la demanda",
-       "apisandbox-reset": "Èfaciér",
-       "apisandbox-examples": "Ègzemplo",
-       "apisandbox-results": "Rèsultat",
-       "apisandbox-request-url-label": "Requéta URL :",
-       "apisandbox-request-time": "Durâ de la demanda : $1",
-       "booksources": "Ôvres de refèrence",
-       "booksources-search-legend": "Rechèrchiér entre-mié les ôvres de refèrence",
+       "apisandbox-reset": "Vouedar",
+       "apisandbox-retry": "Tornar èprovar",
+       "apisandbox-loading": "Chargement de les enformacions du modulo « $1 » de l’API...",
+       "apisandbox-load-error": "Na fôta est arrevâye pendent lo chargement de les enformacions du modulo « $1 » de l’API : $2",
+       "apisandbox-no-parameters": "Cél modulo de l’API at gins de paramètro.",
+       "apisandbox-helpurls": "Lims d’éde",
+       "apisandbox-examples": "Ègzemplos",
+       "apisandbox-dynamic-parameters": "Paramètros de més",
+       "apisandbox-dynamic-parameters-add-label": "Aponsa du paramètro :",
+       "apisandbox-dynamic-parameters-add-placeholder": "Nom du paramètro",
+       "apisandbox-dynamic-error-exists": "Un paramètro apelâ « $1 » ègziste ja.",
+       "apisandbox-deprecated-parameters": "Paramètros dèpassâs",
+       "apisandbox-fetch-token": "Ôtô-remplissâjo du jeton",
+       "apisandbox-submit-invalid-fields-title": "Doux-três champs sont pas justos",
+       "apisandbox-submit-invalid-fields-message": "Se vos plét, corregiéd los champs marcâs et pués tornâd èprovar.",
+       "apisandbox-results": "Rèsultats",
+       "apisandbox-sending-request": "Èxpèdicion de la demanda a l’API...",
+       "apisandbox-loading-results": "Rècèpcion des rèsultats de l’API...",
+       "apisandbox-results-error": "Na fôta est arrevâye pendent lo chargement de la rèponsa a la demanda de l’API : $1.",
+       "apisandbox-request-url-label": "URL de la demanda :",
+       "apisandbox-request-time": "Temps de la demanda : {{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "Corregiéd lo jeton et pués remandâd",
+       "apisandbox-results-fixtoken-fail": "Y at pas moyen de rècupèrar lo jeton « $1 ».",
+       "apisandbox-alert-page": "Los champs de cela pâge sont pas justos.",
+       "apisandbox-alert-field": "La valor de cél champ est pas justa.",
+       "booksources": "Ôvres de rèference",
+       "booksources-search-legend": "Rechèrchiér entre-mié d’ôvres de rèference",
        "booksources-isbn": "ISBN :",
        "booksources-search": "Rechèrchiér",
-       "booksources-text": "Vê-que na lista de lims de vers d’ôtros setos que vendont des lévros nôfs et d’ocasion, et pués pôvont avêr des enformacions de ples sur les ôvres que vos chèrchiéd :",
+       "booksources-text": "Vê-que na lista de lims de vers d’ôtros setos que vendont de lévros nôvos et d’ocasion, et pués que pôvont asse-ben avêr d’enformacions de més sur les ôvres que vos chèrchiéd :",
        "booksources-invalid-isbn": "L’ISBN balyê semble pas étre justo ; controlâd se vos éd fêt na fôta en copiyent la sôrsa originâla.",
        "specialloguserlabel": "Ôtor :",
-       "speciallogtitlelabel": "Ciba (titro ou ben utilisator) :",
-       "log": "Jornals",
-       "all-logs-page": "Tôs los jornals publicos",
-       "alllogstext": "Vua combinâye de tôs los jornals disponiblos dessus {{SITENAME}}.\nVos pouede rètrendre la vua en chouèséssent un tipo de jornal, lo nom d’utilisator (sensiblo a la câssa) la pâge regardâye (sensibl’a la câssa avouéc).",
-       "logempty": "Niona piéce que corrèspond sur lo jornal.",
-       "log-title-wildcard": "Chèrchiér entre-mié los titros que començont per cél tèxto",
-       "showhideselectedlogentries": "Montrar / cachiér les entrâs de jornal chouèsies",
+       "speciallogtitlelabel": "Ciba (titro ou ben {{ns:user}}:nom d’utilisator por un utilisator) :",
+       "log": "Jornâls",
+       "logeventslist-submit": "Montrar",
+       "all-logs-page": "Tôs los jornâls publicos",
+       "alllogstext": "Viua combinâye de tôs los jornâls disponiblos dessus {{SITENAME}}.\nVos pouede rètrendre la viua en chouèséssent un tipo de jornâl, lo nom d’utilisator (sensiblo a la câssa) ou ben la pâge regardâye (sensibl’a la câssa avouéc).",
+       "logempty": "Niona piéce d’ense sur lo jornâl.",
+       "log-title-wildcard": "Rechèrchiér entre-mié los titros que començont per cél tèxto",
+       "showhideselectedlogentries": "Changiér la visibilitât de les entrês de jornâl chouèsies",
+       "log-edit-tags": "Changiér les balises de les entrês de jornâl chouèsies",
+       "checkbox-select": "Chouèsir : $1",
+       "checkbox-all": "Totes",
+       "checkbox-none": "Pas yona",
+       "checkbox-invert": "Envèrsar",
        "allpages": "Totes les pâges",
        "nextpage": "Pâge aprés ($1)",
        "prevpage": "Pâge devant ($1)",
        "allpagesfrom": "Fâre vêre les pâges dês :",
        "allpagesto": "Fâre vêre les pâges tant qu’a :",
        "allarticles": "Totes les pâges",
-       "allinnamespace": "Totes les pâges (dedens l’èspâço de noms « $1 »)",
-       "allpagessubmit": "Listar",
+       "allinnamespace": "Totes les pâges (dedens l’èspâço de noms $1)",
+       "allpagessubmit": "Emmodar",
        "allpagesprefix": "Fâre vêre les pâges que començont per lo prèfixo :",
-       "allpagesbadtitle": "Lo titro de la pâge balyêe est pas justo ou ben contint un prèfixo entèrlengoua ou entèrvouiqui resèrvâ.\nContint de sûr yon ou ben un mouél de caractèros que pôvont pas étre empleyês dedens los titros.",
+       "allpagesbadtitle": "Lo titro de la pâge balyêe est pas justo ou ben contint un prèfixo entèrlengoua entèrvouiqui resèrvâ.\nContint de sûr yon ou ben un mouél de caractèros que pôvont pas étre empleyês dedens los titros.",
        "allpages-bad-ns": "{{SITENAME}} at gins d’èspâço de noms « $1 ».",
        "allpages-hide-redirects": "Cachiér les redirèccions",
        "cachedspecial-viewing-cached-ttl": "Vos vêde na vèrsion betâye en cacho de cela pâge, que pôt étre vielye por lo més $1.",
-       "cachedspecial-viewing-cached-ts": "Vos vêde na vèrsion betâye en cacho de cela pâge, que porrêt pas étre tot a fêt a jorn.",
+       "cachedspecial-viewing-cached-ts": "Vos vêde na vèrsion betâye en cacho de cela pâge, que porrêt pas étre a chavon a jorn.",
        "cachedspecial-refresh-now": "Vêre la ples novèla.",
        "categories": "Catègories",
-       "categoriespagetext": "{{PLURAL:$1|Ceta catègorie contint|Cetes catègories contegnont}} des pâges des fichiérs mèdia.\nLes [[Special:UnusedCategories|catègories pas empleyêes]] sont pas montrâyes ique.\nVêde asse-ben les [[Special:WantedCategories|catègories demandâyes]].",
+       "categories-submit": "Montrar",
+       "categoriespagetext": "{{PLURAL:$1|Cela catègoria-que contint|Celes catègories-que contegnont}} de pâges de fichiérs multimèdiâ.\nLes [[Special:UnusedCategories|catègories pas empleyêes]] sont pas montrâyes ique.\nVêde avouéc les [[Special:WantedCategories|catègories demandâyes]].",
        "categoriesfrom": "Fâre vêre les catègories dês :",
-       "special-categories-sort-count": "tri per nombro de piéces",
-       "special-categories-sort-abc": "tri alfabètico",
+       "special-categories-sort-count": "chouèx per comptâjo",
+       "special-categories-sort-abc": "chouèx alfabètico",
        "deletedcontributions": "Contribucions suprimâyes",
        "deletedcontributions-title": "Contribucions suprimâyes",
        "sp-deletedcontributions-contribs": "contribucions",
        "linksearch": "Rechèrche de lims de defôr",
-       "linksearch-pat": "Modèlo de rechèrche :",
+       "linksearch-pat": "Plan de rechèrche :",
        "linksearch-ns": "Èspâço de noms :",
        "linksearch-ok": "Rechèrchiér",
-       "linksearch-text": "Des caractèros j·oquères coment « *.wikipedia.org » pôvont étre empleyês.\nIls ant fôta de por lo muens un domêno de nivél de dessus, per ègzemplo « *.org ».<br />\n{{PLURAL:$2|Protocolo recognu|Protocolos recognus}} : $1 (http:// per dèfôt se nion protocolo est spècifiâ).",
+       "linksearch-text": "Des mètacaractèros coment « *.wikipedia.org » pôvont étre empleyês.\nIls ant fôta d’u muens un domêno de nivél de dessus, per ègzemplo « *.org ».<br />\n{{PLURAL:$2|Protocolo recognu|Protocolos recognus}} : $1 (http:// per dèfôt se nion protocolo est spècifiâ).",
        "linksearch-line": "$1 est liyê dês $2",
-       "linksearch-error": "Los caractèros j·oquères pôvont étre empleyês ren qu’u comencement du nom de domêno de l’hôto.",
+       "linksearch-error": "Los mètacaractèros pôvont étre empleyês ren qu’u comencement du nom de domêno de l’hôto.",
        "listusersfrom": "Fâre vêre los utilisators dês :",
-       "listusers-submit": "Listar",
-       "listusers-noresult": "Nion utilisator trovâ.",
-       "listusers-blocked": "(blocâ{{GENDER:$1||ye|(ye)}})",
+       "listusers-submit": "Montrar",
+       "listusers-noresult": "Nion utilisator est étâ trovâ.",
+       "listusers-blocked": "(blocâ{{GENDER:$1||ye}})",
        "activeusers": "Lista des utilisators actifs",
-       "activeusers-intro": "O est na lista des utilisators qu’ant ègzèrciê un’activitât la quinta que seye pendent {{PLURAL:$1|lo jorn passâ|los $1 jorns passâs}}.",
+       "activeusers-intro": "O est na lista des utilisators qu’ant ègzèrciê un’activitât quinta que seye pendent {{PLURAL:$1|lo jorn passâ|los $1 jorns passâs}}.",
        "activeusers-count": "$1 accion{{PLURAL:$1||s}} pendent {{PLURAL:$3|lo jorn passâ|los $3 jorns passâs}}",
        "activeusers-from": "Fâre vêre los utilisators dês :",
        "activeusers-hidebots": "Cachiér los robots",
        "activeusers-hidesysops": "Cachiér los administrators",
-       "activeusers-noresult": "Nion utilisator trovâ.",
+       "activeusers-noresult": "Nion utilisator est étâ trovâ.",
+       "activeusers-submit": "Fâre vêre los utilisators actifs",
        "listgrouprights": "Drêts de les tropes d’utilisators",
-       "listgrouprights-summary": "Vê-que na lista de les tropes d’utilisators dèfenies sur ceti vouiqui et pués los sins drêts d’accès.\nY pôt avêr [[{{MediaWiki:Listgrouprights-helppage}}|més d’enformacions]] sur los drêts endividuèls.",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Drêt balyê</span>\n* <span class=\"listgrouprights-revoked\">Drêt cassâ</span>",
+       "listgrouprights-summary": "Vê-que na lista de les tropes d’utilisators dèfenies sur cél vouiqui et pués lors drêts d’accès associyês.\nY pôt avêr [[{{MediaWiki:Listgrouprights-helppage}}|més d’enformacions]] sur los drêts endividuèls.",
+       "listgrouprights-key": "Lègenda :\n* <span class=\"listgrouprights-granted\">Drêt balyê</span>\n* <span class=\"listgrouprights-revoked\">Drêt cassâ</span>",
        "listgrouprights-group": "Tropa",
        "listgrouprights-rights": "Drêts",
        "listgrouprights-helppage": "Help:Drêts de les tropes",
        "listgrouprights-removegroup": "Enlevar de {{PLURAL:$2|la tropa|les tropes}} : $1",
        "listgrouprights-addgroup-all": "Apondre a totes les tropes",
        "listgrouprights-removegroup-all": "Enlevar de totes les tropes",
-       "listgrouprights-addgroup-self": "Sè pôt apondre {{PLURAL:$2|la tropa|les tropes}} a son prôpro compto : $1",
-       "listgrouprights-removegroup-self": "Sè pôt enlevar {{PLURAL:$2|la tropa|les tropes}} de son prôpro compto : $1",
-       "listgrouprights-addgroup-self-all": "Sè pôt apondre totes les tropes a son prôpro compto",
-       "listgrouprights-removegroup-self-all": "Sè pôt enlevar totes les tropes de son prôpro compto",
+       "listgrouprights-addgroup-self": "Sè pôt apondre {{PLURAL:$2|la tropa|les tropes}} u sin comptio : $1",
+       "listgrouprights-removegroup-self": "Sè pôt enlevar {{PLURAL:$2|la tropa|les tropes}} du sin comptio : $1",
+       "listgrouprights-addgroup-self-all": "Sè pôt apondre totes les tropes u sin comptio",
+       "listgrouprights-removegroup-self-all": "Sè pôt enlevar totes les tropes du sin comptio",
+       "listgrouprights-namespaceprotection-header": "Rèstriccions d’èspâço de noms",
+       "listgrouprights-namespaceprotection-namespace": "Èspâço de noms",
+       "listgrouprights-namespaceprotection-restrictedto": "Drêt(s) que pèrmèt(ont) a l’utilisator de changiér",
+       "listgrants": "Ôtorisacions",
+       "listgrants-summary": "Vê-que na lista des drêts avouéc lor accès associyê ux drêts d’utilisator. Los utilisators pôvont ôtorisar les aplicacions a empleyér lor comptio, mas avouéc des drêts limitâs d’aprés los drêts que l’utilisator at balyê a l’aplicacion. Portant un’aplicacion fassent u nom d’un utilisator pôt pas ben empleyér de drêts que l’utilisator at pas.\nY pôt avêr [[{{MediaWiki:Listgrouprights-helppage}}|més d’enformacions]] sur los drêts endividuèls.",
+       "listgrants-grant": "Ôtorisacion",
+       "listgrants-rights": "Drêts",
+       "trackingcategories": "Catègories de gouârda",
+       "trackingcategories-summary": "Cela pâge liste les catègories de gouârda que sont emplies ôtomaticament per MediaWiki. Lors noms pôvont étre changiês en changient los mèssâjos sistèmo que corrèspondont dedens l’èspâço de noms {{ns:8}}.",
+       "trackingcategories-msg": "Catègoria de gouârda",
+       "trackingcategories-name": "Nom du mèssâjo",
+       "trackingcategories-desc": "Critèros de raponsa de la catègoria",
+       "noindex-category-desc": "La pâge est pas endèxâye per los robots, contint lo mot magico <code><nowiki>__NOINDEX__</nowiki></code> et est dedens un èspâço de noms yô que cél marcâjo est ôtorisâ.",
+       "index-category-desc": "La pâge contint un <code><nowiki>__INDEX__</nowiki></code> (et est dedens un èspâço de noms yô que cél marcâjo est ôtorisâ), et pués serat vêr endèxâye per los robots pendent qu’o serêt pas étâ normalament.",
+       "post-expand-template-inclusion-category-desc": "La talye de la pâge dèpâsse <code>$wgMaxArticleSize</code> aprés l’èxpension de tôs los modèlos, cen fât que doux-três modèlos ant vêr pas étâ èpatâs.",
+       "post-expand-template-argument-category-desc": "La pâge dèpâsse <code>$wgMaxArticleSize</code> aprés l’èxpension d’un argument de modèlo (quârque-ren entre-mié colâdes triples, coment <code>{{{Foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "La pâge emplèye trop de fonccions parsiors que revegnont chieres (coment <code>#ifexist</code>). Vêde [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "La pâge contint un lim de fichiér câsso (un lim por apondre un fichiér pendent que ceti ègziste pas).",
+       "hidden-category-category-desc": "La catègoria contint <code><nowiki>__HIDDENCAT__</nowiki></code> dedens son contegnu, cen qu’empache per dèfôt sa viua dens la bouèta des lims de catègoria sur les pâges.",
+       "trackingcategories-nodesc": "Niona dèscripcion disponibla.",
+       "trackingcategories-disabled": "La catègoria est dèsactivâye",
        "mailnologin": "Nion’adrèce d’èxpèdior",
-       "mailnologintext": "Vos dête étre [[Special:UserLogin|branchiê]] et avêr spècifiâ un’adrèce èlèctronica justa dens voutres [[Special:Preferences|prèferences]] por povêr mandar des mèssâjos a d’ôtros utilisators.",
-       "emailuser": "Lui mandar un mèssâjo",
-       "emailuser-title-target": "Mandar un mèssâjo a cet’utilisat{{GENDER:$1|or|rice}}",
+       "mailnologintext": "Vos dête étre [[Special:UserLogin|branchiê]] et pués avêr un’adrèce èlèctronica justa dens voutres [[Special:Preferences|prèferences]] por povêr mandar de mèssâjos a d’ôtros utilisators.",
+       "emailuser": "Y mandar un mèssâjo",
+       "emailuser-title-target": "Mandar un mèssâjo a {{GENDER:$1|cél utilisator|cel’utilisatrice}}",
        "emailuser-title-notarget": "Mandar un mèssâjo a l’utilisator",
-       "emailpagetext": "Vos pouede empleyér lo formulèro ce-desot por mandar un mèssâjo a cet’utilisat{{GENDER:$1|or|rice}}.\nL’adrèce èlèctronica que vos éd buchiêe dens voutres [[Special:Preferences|prèferences]] aparêtrat dedens lo champ « Èxpèdior » de voutron mèssâjo ; d’ense, lo dèstinatèro vos porrat rèpondre tot drêt.",
+       "emailpagetext": "Vos pouede empleyér lo formulèro ce-desot por mandar un mèssâjo a {{GENDER:$1|cél utilisator|cel’utilisatrice}}.\nL’adrèce èlèctronica que vos éd buchiêe dens voutres [[Special:Preferences|prèferences]] aparêtrat dedens lo champ « Èxpèdior » de voutron mèssâjo, cen fât que lo dèstinatèro vos porrat rèpondre tot drêt.",
        "defemailsubject": "Mèssâjo de {{SITENAME}} de l’utilisator « $1 »",
        "usermaildisabled": "L’èxpèdicion de mèssâjos entre utilisators est dèsactivâye",
-       "usermaildisabledtext": "Vos pouede pas mandar de mèssâjos a d’ôtros utilisators sur ceti vouiqui",
+       "usermaildisabledtext": "Vos pouede pas mandar de mèssâjos a d’ôtros utilisators sur cél vouiqui",
        "noemailtitle": "Nion’adrèce èlèctronica",
-       "noemailtext": "Cet’utilisator at pas spècifiâ un’adrèce èlèctronica justa.",
+       "noemailtext": "Cél utilisator at pas spècifiâ un’adrèce èlèctronica justa.",
        "nowikiemailtext": "Cél utilisator at chouèsi de pas recêvre de mèssâjos de la pârt d’ôtros utilisators.",
        "emailnotarget": "Nom d’utilisator du dèstinatèro pas ègzistent pas justo.",
        "emailtarget": "Buchiéd lo nom d’utilisator du dèstinatèro",
        "emailccsubject": "Copia de voutron mèssâjo a $1 : $2",
        "emailsent": "Mèssâjo mandâ",
        "emailsenttext": "Voutron mèssâjo est étâ mandâ per mèssageria èlèctronica.",
-       "emailuserfooter": "Ceti mèssâjo est étâ mandâ per « $1 » a « $2 » per la fonccion « Lui mandar un mèssâjo » de {{SITENAME}}.",
+       "emailuserfooter": "Cél mèssâjo est étâ {{GENDER:$1|mandâ}} per « $1 » a « {{GENDER:$2|$2}} » per la fonccion « {{int:emailuser}} » de {{SITENAME}}.",
        "usermessage-summary": "At lèssiê un mèssâjo sistèmo.",
        "usermessage-editor": "Mèssagiér du sistèmo",
        "usermessage-template": "MediaWiki:MèssâjoUtilisator",
-       "watchlist": "Lista de siuvu",
-       "mywatchlist": "Lista de siuvu",
+       "watchlist": "Lista de gouârda",
+       "mywatchlist": "Lista de gouârda",
        "watchlistfor2": "Por $1 $2",
-       "nowatchlist": "Vos éd gins de piéce dedens voutra lista de siuvu.",
-       "watchlistanontext": "Se vos plét, vos vos dête $1 por povêr vêre ou ben changiér les piéces de voutra lista de siuvu.",
+       "nowatchlist": "Vos éd gins de piéce dedens voutra lista de gouârda.",
+       "watchlistanontext": "Se vos plét, branchiéd-vos por vêre changiér les piéces de voutra lista de gouârda.",
        "watchnologin": "Pas branchiê",
-       "addwatch": "Apondre a la lista de siuvu",
-       "addedwatchtext": "La pâge « [[:$1]] » est étâye apondua a voutra [[Special:Watchlist|lista de siuvu]].\nLos changements que vegnont de ceta pâge et de la sina pâge de discussion y seront listâs.",
-       "removewatch": "Enlevar de la lista de siuvu",
-       "removedwatchtext": "La pâge « [[:$1]] » est étâye enlevâye de voutra [[Special:Watchlist|lista de siuvu]].",
+       "addwatch": "Apondre a la lista de gouârda",
+       "addedwatchtext": "« [[:$1]] » et sa pâge de discussion sont étâyes apondues a voutra [[Special:Watchlist|lista de gouârda]].",
+       "addedwatchtext-short": "La pâge « $1 » est étâye apondua a voutra lista de gouârda.",
+       "removewatch": "Enlevar de la lista de gouârda",
+       "removedwatchtext": "« [[:$1]] » et sa pâge de discussion sont étâyes enlevâyes de voutra [[Special:Watchlist|lista de gouârda]].",
+       "removedwatchtext-short": "La pâge « $1 » est étâye enlevâye de voutra lista de gouârda.",
        "watch": "Siuvre",
-       "watchthispage": "Siuvre ceta pâge",
+       "watchthispage": "Siuvre cela pâge",
        "unwatch": "Pas més siuvre",
        "unwatchthispage": "Pas més siuvre",
        "notanarticle": "O est pas na pâge de contegnu",
        "notvisiblerev": "La dèrriére vèrsion per un ôtr’utilisator est étâye suprimâye",
-       "watchlist-details": "Y at $1 pâge{{PLURAL:$1||s}} dedens voutra lista de siuvu, sen comptar les pâges de discussion.",
+       "watchlist-details": "Y at $1 pâge{{PLURAL:$1||s}} dedens voutra lista de gouârda, sen comptar a pârt les pâges de discussion.",
        "wlheader-enotif": "La notificacion per mèssageria èlèctronica est activâye.",
-       "wlheader-showupdated": "Les pâges que sont étâyes changiêes dês voutra dèrriére visita sont montrâyes en '''grâs'''.",
-       "wlnote": "Vê-que {{PLURAL:$1|lo dèrriér changement fêt|los '''$1''' dèrriérs changements fêts}} pendent {{PLURAL:$2|l’hora passâye|les '''$2''' hores passâyes}}, dês $3 a $4.",
-       "wlshowlast": "Montrar les $1 hores passâyes, los $2 jorns passâs ou ben",
-       "watchlist-options": "Chouèx de la lista de siuvu",
-       "watching": "Siuvu...",
-       "unwatching": "Fin du siuvu...",
-       "watcherrortext": "Na fôta est arrevâye pendent lo changement de la configuracion de voutra lista de siuvu por « $1 ».",
-       "enotif_reset": "Marcar totes les pâges coment visitâyes",
+       "wlheader-showupdated": "Les pâges que sont étâyes changiêes dês voutra dèrriére vesita sont montrâyes en <strong>grôs</strong>.",
+       "wlnote": "Vê-que {{PLURAL:$1|lo dèrriér changement fêt|los <strong>$1</strong> dèrriérs changements fêts}} pendent {{PLURAL:$2|l’hora passâye|les <strong>$2</strong> hores passâyes}}, tant qu’u $3 a $4.",
+       "wlshowlast": "Montrar les $1 hores passâyes, los $2 jorns passâs",
+       "watchlist-hide": "Cachiér",
+       "watchlist-submit": "Montrar",
+       "wlshowtime": "Temps a fâre vêre :",
+       "wlshowhideminor": "petiôts changements",
+       "wlshowhidebots": "robots",
+       "wlshowhideliu": "utilisators encartâs",
+       "wlshowhideanons": "utilisators anonimos",
+       "wlshowhidepatr": "changements gouardâs",
+       "wlshowhidemine": "mos changements",
+       "wlshowhidecategorization": "catègorisacion de les pâges",
+       "watchlist-options": "Chouèx de la lista de gouârda",
+       "watching": "Comencement de la gouârda...",
+       "unwatching": "Fin de la gouârda...",
+       "watcherrortext": "Na fôta est arrevâye pendent lo changement de la configuracion de voutra lista de gouârda por « $1 ».",
+       "enotif_reset": "Marcar totes les pâges coment vesitâyes",
        "enotif_impersonal_salutation": "Utilisator de {{SITENAME}}",
-       "enotif_subject_deleted": "La pâge $1 dessus {{SITENAME}} est étâye suprimâye per {{GENDER:$2|$2}}",
-       "enotif_subject_created": "La pâge $1 dessus {{SITENAME}} est étâye fêta per {{GENDER:$2|$2}}",
-       "enotif_subject_moved": "La pâge $1 dessus {{SITENAME}} est étâye dèplaciêe per {{GENDER:$2|$2}}",
-       "enotif_subject_restored": "La pâge $1 dessus {{SITENAME}} est étâye refêta per {{GENDER:$2|$2}}",
-       "enotif_subject_changed": "La pâge $1 dessus {{SITENAME}} est étâye changiêe per {{GENDER:$2|$2}}",
-       "enotif_body_intro_deleted": "La pâge $1 dessus {{SITENAME}} est étâye suprimâye lo $PAGEEDITDATE per {{GENDER:$2|$2}}, vêde $3.",
-       "enotif_body_intro_created": "La pâge $1 dessus {{SITENAME}} est étâye fêta lo $PAGEEDITDATE per {{GENDER:$2|$2}}, vêde $3 por la vèrsion d’ora.",
-       "enotif_body_intro_moved": "La pâge $1 dessus {{SITENAME}} est étâye dèplaciêe lo $PAGEEDITDATE per {{GENDER:$2|$2}}, vêde $3 por la vèrsion d’ora.",
-       "enotif_body_intro_restored": "La pâge $1 dessus {{SITENAME}} est étâye refêta lo $PAGEEDITDATE per {{GENDER:$2|$2}}, vêde $3 por la vèrsion d’ora.",
-       "enotif_body_intro_changed": "La pâge $1 dessus {{SITENAME}} est étâye changiêe lo $PAGEEDITDATE per {{GENDER:$2|$2}}, vêde $3 por la vèrsion d’ora.",
-       "enotif_lastvisited": "Vêde $1 por tôs los changements dês voutra dèrriére visita.",
+       "enotif_subject_deleted": "La pâge $1 dessus {{SITENAME}} est étâye {{GENDER:$2|suprimâye}} per $2",
+       "enotif_subject_created": "La pâge $1 dessus {{SITENAME}} est étâye {{GENDER:$2|fêta}} per $2",
+       "enotif_subject_moved": "La pâge $1 dessus {{SITENAME}} est étâye {{GENDER:$2|dèplaciêe}} per $2",
+       "enotif_subject_restored": "La pâge $1 dessus {{SITENAME}} est étâye {{GENDER:$2|refêta}} per $2",
+       "enotif_subject_changed": "La pâge $1 dessus {{SITENAME}} est étâye {{GENDER:$2|changiêe}} per $2",
+       "enotif_body_intro_deleted": "La pâge $1 dessus {{SITENAME}} est étâye {{GENDER:$2|suprimâye}} lo $PAGEEDITDATE per $2, vêde $3.",
+       "enotif_body_intro_created": "La pâge $1 dessus {{SITENAME}} est étâye {{GENDER:$2|fêta}} lo $PAGEEDITDATE per $2, vêde $3 por la vèrsion d’ora.",
+       "enotif_body_intro_moved": "La pâge $1 dessus {{SITENAME}} est étâye {{GENDER:$2|dèplaciêe}} lo $PAGEEDITDATE per $2, vêde $3 por la vèrsion d’ora.",
+       "enotif_body_intro_restored": "La pâge $1 dessus {{SITENAME}} est étâye {{GENDER:$2|refêta}} lo $PAGEEDITDATE per $2, vêde $3 por la vèrsion d’ora.",
+       "enotif_body_intro_changed": "La pâge $1 dessus {{SITENAME}} est étâye {{GENDER:$2|changiêe}} lo $PAGEEDITDATE per $2, vêde $3 por la vèrsion d’ora.",
+       "enotif_lastvisited": "Vêde $1 por tôs los changements dês voutra dèrriére vesita.",
        "enotif_lastdiff": "Vêde $1 por vêre cél changement.",
        "enotif_anon_editor": "utilisator anonimo $1",
-       "enotif_body": "Chier(a) $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRèsumâ du contributor : $PAGESUMMARY $PAGEMINOREDIT\n\nVeriéd-vos vers lo contributor :\nmèl. : $PAGEEDITOR_EMAIL\nvouiqui : $PAGEEDITOR_WIKI\n\nY arat gins d’ôtra notificacion en câs de changements a vegnir, du muens que vos visiteyâd cela pâge. Vos pouede asse-ben rebetar a zérô los segnalements de notificacion por totes les pâges de voutra lista de siuvu.\n\nVoutron sistèmo de notificacion de {{SITENAME}}\n\n--\nPor changiér la configuracion de notificacion per mèssageria èlèctronica, visitâd\n{{canonicalurl:{{#special:Preferences}}}}\n\nPor changiér la configuracion de voutra lista de siuvu, visitâd\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPor suprimar la pâge de voutra lista de siuvu, visitâd\n$UNWATCHURL\n\nAvis et assistance de ples :\n$HELPPAGE",
+       "enotif_body": "Chier{{GENDER:$WATCHINGUSERNAME||a}} $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRèsumâ du contributor : $PAGESUMMARY $PAGEMINOREDIT\n\nVeriéd-vos vers lo contributor :\nmèl. : $PAGEEDITOR_EMAIL\nvouiqui : $PAGEEDITOR_WIKI\n\nY arat gins d’ôtra notificacion en câs de changements a vegnir, a muens que vos vesiteyéd cela pâge a pêna branchiê. Vos pouede asse-ben rebetar a zérô los marcâjos de notificacion por totes les pâges de voutra lista de gouârda.\n\nVoutron sistèmo de notificacion de {{SITENAME}}\n\n--\nPor changiér la configuracion de notificacion per mèssageria èlèctronica, vesitâd\n{{canonicalurl:{{#special:Preferences}}}}\n\nPor changiér la configuracion de voutra lista de gouârda, vesitâd\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPor suprimar la pâge de voutra lista de gouârda, vesitâd\n$UNWATCHURL\n\nAvis et éde de més :\n$HELPPAGE",
        "created": "fêta",
        "changed": "changiê",
        "deletepage": "Suprimar la pâge",
        "confirm": "Confirmar",
        "excontent": "lo contegnu ére : « $1 »",
-       "excontentauthor": "lo contegnu ére : « $1 » (et lo solèt contributor ére « [[Special:Contributions/$2|$2]] »)",
+       "excontentauthor": "lo contegnu ére : « $1 », et lo solèt contributor « [[Special:Contributions/$2|$2]] » ([[User talk:$2|discutar]])",
        "exbeforeblank": "lo contegnu devant blanchiment ére : « $1 »",
        "delete-confirm": "Suprimar « $1 »",
        "delete-legend": "Suprimar",
-       "historywarning": "'''Atencion :''' la pâge que vos éte prèst a suprimar at un historico avouéc a pou prés $1 vèrsion{{PLURAL:$1||s}} :",
-       "confirmdeletetext": "Vos éte prèst a suprimar na pâge et pués tot lo sin historico.\nSe vos plét, confirmâd qu’o est franc cen que vos voléd fâre, que vos en compregnéd les consèquences et pués que vos o féte en acôrd avouéc les [[{{MediaWiki:Policy-url}}|règlles de dedens]].",
+       "historywarning": "<strong>Atencion :</strong> la pâge que vos éte prèst a suprimar at un historico avouéc $1 vèrsion{{PLURAL:$1||s}} :",
+       "historyaction-submit": "Montrar",
+       "confirmdeletetext": "Vos éte prèst a suprimar na pâge et pués tot son historico.\nSe vos plét, confirmâd qu’o est franc cen que vos voléd fâre, que vos en compregnéd les consèquences et pués que vos o féte en acôrd avouéc les [[{{MediaWiki:Policy-url}}|politiques]].",
        "actioncomplete": "Accion fêta",
        "actionfailed": "L’accion at pas reussi",
        "deletedtext": "« $1 » est étâye suprimâye.\nVêde lo $2 por na lista de les novèles suprèssions.",
-       "dellogpage": "Jornal de les suprèssions",
+       "dellogpage": "Jornâl de les suprèssions",
        "dellogpagetext": "Vê-que na lista de les suprèssions les ples novèles.",
-       "deletionlog": "jornal de les suprèssions",
-       "reverted": "Vèrsion devant rètablia",
+       "deletionlog": "jornâl de les suprèssions",
+       "reverted": "Rèvocâ a la vèrsion devant",
        "deletecomment": "Rêson :",
-       "deleteotherreason": "Ôtra rêson / rêson de ples :",
+       "deleteotherreason": "Ôtra rêson ou ben rêson de més :",
        "deletereasonotherlist": "Ôtra rêson",
-       "deletereason-dropdown": "*Rêsons corentes de suprèssion\n** Demanda de l’ôtor\n** Violacion du drêt d’ôtor\n** Vandalismo",
+       "deletereason-dropdown": "* Rêsons corentes de suprèssion\n** Mèssâjo cofo\n** Vandalismo\n** Violacion du drêt d’ôtor\n** Demanda de l’ôtor\n** Redirèccion câssa",
        "delete-edit-reasonlist": "Changiér les rêsons de suprèssion",
-       "delete-toobig": "Ceta pâge at un grôs historico de changements avouéc més de $1 vèrsion{{PLURAL:$1||s}}.\nLa suprèssion de pâges d’ense est étâye rètrenta por prèvegnir des pèrturbacions emprèvues de {{SITENAME}}.",
-       "delete-warning-toobig": "Ceta pâge at un grôs historico de changements avouéc més de $1 vèrsion{{PLURAL:$1||s}}.\nLa suprimar pôt troblar la mârche de la bâsa de balyês de {{SITENAME}} ;\na fâre avouéc prudence.",
+       "delete-toobig": "Cela pâge at un grôs historico de changements avouéc més de $1 vèrsion{{PLURAL:$1||s}}.\nLa suprèssion de pâges d’ense est étâye rètrenta por prèvegnir de pèrturbacions emprèviues de {{SITENAME}}.",
+       "delete-warning-toobig": "Cela pâge at un grôs historico de changements avouéc més de $1 vèrsion{{PLURAL:$1||s}}.\nLa suprimar pôt troblar la mârche de la bâsa de balyês de {{SITENAME}} ;\na fâre avouéc prudence.",
+       "deleteprotected": "Vos pouede pas suprimar cela pâge, el est étâye protègiêe.",
+       "deleting-backlinks-warning": "<strong>Atencion :</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|D’ôtres pâges]] ant un lim de vers ou ben transcllusont la pâge que vos voléd suprimar.",
        "rollback": "Rèvocar los changements",
        "rollbacklink": "rèvocar",
        "rollbacklinkcount": "rèvocar $1 changement{{PLURAL:$1||s}}",
        "rollbacklinkcount-morethan": "rèvocar més de $1 changement{{PLURAL:$1||s}}",
        "rollbackfailed": "La rèvocacion at pas reussi",
-       "cantrollback": "Y at pas moyen de rèvocar lo changement ;\nlo dèrriér contributor est lo solèt ôtor de ceta pâge.",
-       "alreadyrolled": "Y at pas moyen de rèvocar lo dèrriér changement de la pâge « [[:$1]] » fêt per [[User:$2|$2]] ([[User talk:$2|discutar]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ;\nun ôtro at ja changiê ou ben rèvocâ la pâge.\n\nLo dèrriér changement de la pâge est étâ fêt per [[User:$3|$3]] ([[User talk:$3|discutar]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "cantrollback": "Y at pas moyen de rèvocar lo changement ;\nlo dèrriér contributor est lo solèt ôtor de cela pâge.",
+       "alreadyrolled": "Y at pas moyen de rèvocar lo dèrriér changement de la pâge « [[:$1]] » fêt per [[User:$2|$2]] ([[User talk:$2|discutar]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ;\nun ôtro at ja changiê rèvocâ la pâge.\n\nLo dèrriér changement de la pâge est étâ fêt per [[User:$3|$3]] ([[User talk:$3|discutar]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Lo rèsumâ de changement ére : <em>$1</em>.",
        "revertpage": "Rèvocacion des changements de [[Special:Contributions/$2|$2]] ([[User talk:$2|discutar]]) de vers la dèrriére vèrsion de [[User:$1|$1]]",
-       "revertpage-nouser": "Rèvocacion des changements de (nom d’utilisator enlevâ) de vers la dèrriére vèrsion de [[User:$1|$1]]",
+       "revertpage-nouser": "Rèvocacion des changements per un utilisator cachiê de vers la dèrriére vèrsion de {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Rèvocacion des changements de $1 ;\nrèstoracion de la dèrriére vèrsion de $2.",
-       "sessionfailure-title": "Falyita de sèance",
-       "sessionfailure": "Voutra sèance de branchement semble avêr des problèmos ;\ncel’accion est étâye anulâye en prèvencion d’un piratâjo de sèance.\nSe vos plét, clicâd dessus « Devant », rechargiéd la pâge de yô que vos vegnéd et pués tornâd èprovar.",
-       "protectlogpage": "Jornal de les protèccions",
+       "sessionfailure-title": "Falyita de sèssion",
+       "sessionfailure": "Voutra sèssion de branchement semble avêr de problèmos ;\ncel’accion est étâye anulâye en prèvencion d’un piratâjo de sèssion.\nSe vos plét, cllicâd dessus « Devant », rechargiéd la pâge de yô que vos vegnéd et pués tornâd èprovar.",
+       "changecontentmodel": "Changiér lo modèlo de contegnu d’una pâge",
+       "changecontentmodel-legend": "Changiér lo modèlo de contegnu",
+       "changecontentmodel-title-label": "Titro de la pâge",
+       "changecontentmodel-model-label": "Novél modèlo de contegnu",
+       "changecontentmodel-reason-label": "Rêson :",
+       "changecontentmodel-submit": "Changiér",
+       "changecontentmodel-success-title": "Lo modèlo de contegnu est étâ changiê",
+       "changecontentmodel-success-text": "Lo tipo de contegnu de [[:$1]] est étâ changiê.",
+       "changecontentmodel-cannot-convert": "Lo contegnu dessus [[:$1]] at pas possu étre convèrti en un tipo de $2.",
+       "changecontentmodel-nodirectediting": "Lo modèlo de contegnu $1 recognêt pas lo changement drêt",
+       "log-name-contentmodel": "Jornâl des changements de modèlo de contegnu",
+       "log-description-contentmodel": "Èvènements sur los modèlos de contegnu d’una pâge",
+       "logentry-contentmodel-new": "$1 at {{GENDER:$2|fêt}} la pâge $3 en empleyent un modèlo de contegnu « $5 » ôtro que celi per dèfôt",
+       "logentry-contentmodel-change": "$1 at {{GENDER:$2|changiê}} lo modèlo de contegnu de la pâge $3 de « $4 » en « $5 »",
+       "logentry-contentmodel-change-revertlink": "rèvocar",
+       "logentry-contentmodel-change-revert": "rèvocar",
+       "protectlogpage": "Jornâl de les protèccions",
        "protectlogtext": "Vê-que na lista des changements de les protèccions de pâges.\nVêde la [[Special:ProtectedPages|lista de les pâges protègiêes]] por la lista de les protèccions que sont ora actives.",
        "protectedarticle": "at protègiê « [[$1]] »",
        "modifiedarticleprotection": "at changiê lo nivél de protèccion de « [[$1]] »",
        "protect-title-notallowed": "Vêre lo nivél de protèccion de « $1 »",
        "prot_1movedto2": "at dèplaciê [[$1]] vers [[$2]]",
        "protect-badnamespace-title": "Èspâço de noms pas protèjâblo",
-       "protect-badnamespace-text": "Les pâges dedens cet’èspâço de noms pôvont pas étre protègiêes.",
+       "protect-badnamespace-text": "Les pâges dedens cél èspâço de noms pôvont pas étre protègiêes.",
        "protect-norestrictiontypes-text": "Cela pâge pôt pas étre protègiêe, y at gins de tipo de rèstriccion disponiblo.",
        "protect-norestrictiontypes-title": "Pâge pas protèjâbla",
        "protect-legend": "Confirmar la protèccion",
        "protectcomment": "Rêson :",
        "protectexpiry": "Dâta d’èxpiracion :",
-       "protect_expiry_invalid": "La dâta d’èxpiracion est pas justa.",
-       "protect_expiry_old": "La dâta d’èxpiracion est ja passâye.",
-       "protect-unchain-permissions": "Dèvèrrolyér adés més de chouèx de protèccion",
-       "protect-text": "Ique vos pouede vêre et changiér lo nivél de protèccion de la pâge '''$1'''.",
-       "protect-locked-blocked": "Vos pouede pas changiér los nivéls de protèccion tant que vos éte blocâ{{GENDER:||ye|(ye)}}.\nVê-que la configuracion d’ora de la pâge '''$1''' :",
-       "protect-locked-dblock": "Los nivéls de protèccion pôvont pas étre changiês, la bâsa de balyês est vèrrolyêe.\nVê-que la configuracion d’ora de la pâge '''$1''' :",
-       "protect-locked-access": "Voutron compto at pas los drêts nècèssèros por changiér los nivéls de protèccion de pâges.\nVê-que la configuracion d’ora de la pâge '''$1''' :",
-       "protect-cascadeon": "Ora cela pâge-que est protègiêe, el est entrebetâye dedens {{PLURAL:$1|ceta pâge qu’est étâye protègiêe|cetes pâges que sont étâyes protègiêes}} avouéc lo chouèx « protèccion en cascâda » activâ.\nVos pouede changiér lo nivél de protèccion de cela pâge sen que cen afècte la protèccion en cascâda.",
+       "protect_expiry_invalid": "Lo temps d’èxpiracion est pas justo.",
+       "protect_expiry_old": "Lo temps d’èxpiracion est ja passâ.",
+       "protect-unchain-permissions": "Dècotar adés més de chouèx de protèccion",
+       "protect-text": "Ique vos pouede vêre et changiér lo nivél de protèccion de la pâge <strong>$1</strong>.",
+       "protect-locked-blocked": "Vos pouede pas changiér los nivéls de protèccion tant que vos éte blocâ{{GENDER:||ye}}.\nVê-que la configuracion d’ora de la pâge <strong>$1</strong> :",
+       "protect-locked-dblock": "Los nivéls de protèccion pôvont pas étre changiês, la bâsa de balyês est cotâye.\nVê-que la configuracion d’ora de la pâge <strong>$1</strong> :",
+       "protect-locked-access": "Voutron comptio at pas los drêts nècèssèros por changiér los nivéls de protèccion de pâges.\nVê-que la configuracion d’ora de la pâge <strong>$1</strong> :",
+       "protect-cascadeon": "Ora cela pâge est protègiêe, el est transcllua dedens {{PLURAL:$1|cela pâge-que qu’est étâye protègiêe|celes pâges-que que sont étâyes protègiêes}} avouéc lo chouèx « protèccion en cascâda » activâ.\nLos changements du nivél de protèccion de cela pâge afècteront pas la protèccion en cascâda.",
        "protect-default": "Ôtorisar tôs los utilisators",
-       "protect-fallback": "Ôtorisar ren que los utilisators avouéc lo drêt « $1 »",
-       "protect-level-autoconfirmed": "Ôtorisar ren que los utilisators ôtoconfirmâs",
-       "protect-level-sysop": "Ôtorisar ren que los administrators",
+       "protect-fallback": "Ôtorisar mas que los utilisators avouéc lo drêt « $1 »",
+       "protect-level-autoconfirmed": "Ôtorisar mas que los utilisators ôtoconfirmâs",
+       "protect-level-sysop": "Ôtorisar mas que los administrators",
        "protect-summary-cascade": "protèccion en cascâda",
-       "protect-expiring": "èxpire lo $2 a $3 (UTC)",
+       "protect-expiring": "èxpire lo $1 (UTC)",
        "protect-expiring-local": "èxpire lo $1",
        "protect-expiry-indefinite": "sen fin",
-       "protect-cascade": "Protègiér les pâges entrebetâyes dedens ceta (protèccion en cascâda)",
-       "protect-cantedit": "Vos pouede pas changiér los nivéls de protèccion de ceta pâge, vos éd pas la pèrmission de la changiér.",
-       "protect-othertime": "Ôtra dâta d’èxpiracion :",
-       "protect-othertime-op": "ôtra dâta d’èxpiracion",
-       "protect-existing-expiry": "Dâta d’èxpiracion ègzistenta : $2 a $3",
-       "protect-otherreason": "Ôtra rêson / rêson de ples :",
+       "protect-cascade": "Protègiér les pâges rapondues dedens ceta (protèccion en cascâda)",
+       "protect-cantedit": "Vos pouede pas changiér los nivéls de protèccion de cela pâge, vos éd pas la pèrmission de la changiér.",
+       "protect-othertime": "Ôtro temps :",
+       "protect-othertime-op": "ôtro temps",
+       "protect-existing-expiry": "Temps d’èxpiracion ègzistent : $2 a $3",
+       "protect-existing-expiry-infinity": "Temps d’èxpiracion ègzistent : sen fin",
+       "protect-otherreason": "Ôtra rêson ou ben rêson de més :",
        "protect-otherreason-op": "Ôtra rêson",
-       "protect-dropdown": "*Rêsons corentes de protèccion\n** Vandalismo èxcèssif\n** Spame èxcèssif\n** Guèrres de changements contre-productives\n** Pâge a trafic fôrt",
+       "protect-dropdown": "*Rêsons corentes de protèccion\n** Vandalismo afrox\n** Mèssâjos cofos afrox\n** Disputes de changement vouedes\n** Pâge a trafic fôrt",
        "protect-edit-reasonlist": "Changiér les rêsons de protèccion",
        "protect-expiry-options": "1 hora:1 hour,1 jorn:1 day,1 semana:1 week,2 semanes:2 weeks,1 mês:1 month,3 mês:3 months,6 mês:6 months,1 an:1 year,sen fin:infinite",
        "restriction-type": "Pèrmission :",
        "restriction-level-autoconfirmed": "mié-protèccion",
        "restriction-level-all": "tôs los nivéls",
        "undelete": "Vêre les pâges suprimâyes",
-       "undeletepage": "Vêre et refâre des pâges suprimâyes",
-       "undeletepagetitle": "'''Ceta lista contint des vèrsions suprimâyes de [[:$1|$1]].'''",
+       "undeletepage": "Vêre et refâre de pâges suprimâyes",
+       "undeletepagetitle": "<strong>Cela lista-que contint de vèrsions suprimâyes de [[:$1|$1]].</strong>",
        "viewdeletedpage": "Vêre les pâges suprimâyes",
-       "undeletepagetext": "{{PLURAL:$1|Ceta pâge est étâye suprimâye et pués sè trôve|Cetes pâges sont étâyes suprimâyes et pués sè trôvont}} adés dedens les arch·ives, de yô que pô{{PLURAL:$1||von}}t étre refêt{{PLURAL:$1|a|es}}.\nLes arch·ives pôvont étre èfaciêes règuliérement.",
+       "undeletepagetext": "{{PLURAL:$1|Cela pâge-que est étâye suprimâye et pués sè trôve|Celes pâges-que sont étâyes suprimâyes et pués sè trôvont}} adés dedens les arch·ives, de yô que pô{{PLURAL:$1||von}}t étre refêt{{PLURAL:$1|a|es}}.\nLes arch·ives pôvont étre neteyêes règuliérement.",
        "undelete-fieldset-title": "Refâre les vèrsions",
-       "undeleteextrahelp": "Por refâre l’historico complèt de la pâge, lèssiéd totes les câses pas pouentâyes et pués clicâd dessus '''''{{int:undeletebtn}}'''''.\nPor fâre na rèstoracion a mêtiêt, pouentâd les câses que corrèspondont a les vèrsions a refâre et pués clicâd dessus '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|vèrsion arch·ivâye|vèrsions arch·ivâyes}}",
+       "undeleteextrahelp": "Por refâre l’historico complèt de la pâge, lèssiéd totes les câses pas pouentâyes et pués cllicâd dessus <strong><em>{{int:undeletebtn}}</em></strong>.\nPor fâre na rèstoracion a mêtiêt, pouentâd les câses que corrèspondont a les vèrsions a refâre et pués cllicâd dessus <strong><em>{{int:undeletebtn}}</em></strong>.",
+       "undeleterevisions": "$1 {{PLURAL:$1|vèrsion suprimâye|vèrsions suprimâyes}}",
        "undeletehistory": "Se vos reféte la pâge, totes les vèrsions seront rebetâyes dedens l’historico.\nS’una pâge novèla avouéc lo mémo nom est étâye fêta dês la suprèssion, les vèrsions refêtes aparêtront dedens l’historico devant.",
-       "undeleterevdel": "La rèstoracion serat pas fêta s’a la fin la vèrsion la ples novèla de la pâge du fichiér réste a mêtiêt suprimâye.\nDens celos câs, vos dête pas pouentar ou ben cachiér la vèrsion suprimâye la ples novèla.",
-       "undeletehistorynoadmin": "Ceta pâge est étâye suprimâye.\nLa rêson de la suprèssion est montrâye dens lo rèsumâ ce-desot, avouéc los dètalys des utilisators que l’ant changiê devant la sina suprèssion.\nLo contegnu èfèctif de celes vèrsions suprimâyes est accèssiblo ren qu’ux administrators.",
+       "undeleterevdel": "La rèstoracion serat pas fêta se finalament la vèrsion la ples novèla de la pâge du fichiér réste a mêtiêt suprimâye.\nDens celos câs, vos dête pas pouentar cachiér la vèrsion suprimâye la ples novèla.",
+       "undeletehistorynoadmin": "Cela pâge est étâye suprimâye.\nLa rêson de la suprèssion est montrâye dens lo rèsumâ ce-desot, avouéc los dètalys des utilisators que l’ant changiê devant sa suprèssion.\nLo contegnu èfèctif de celes vèrsions suprimâyes est accèssiblo ren qu’ux administrators.",
        "undelete-revision": "Vèrsion suprimâye de $1 (du $4 a $5) per $3 :",
-       "undeleterevision-missing": "Vèrsion pas justa ou ben manquenta.\nPôt-étre vos éd un crouyo lim ou ben la vèrsion at possu étre refêta ou enlevâye de les arch·ives.",
+       "undeleterevision-missing": "Vèrsion pas justa ou ben entrovâbla.\nPôt-étre vos éd un crouyo lim ou ben la vèrsion at possu étre refêta enlevâye de les arch·ives.",
        "undelete-nodiff": "Niona vèrsion devant trovâye.",
        "undeletebtn": "Refâre",
        "undeletelink": "vêre / refâre",
        "undeletedrevisions-files": "$1 vèrsion{{PLURAL:$1||s}} et $2 fichiér{{PLURAL:$2||s}} refêts",
        "undeletedfiles": "$1 {{PLURAL:$1|fichiér refêt|fichiérs refêts}}",
        "cannotundelete": "Falyita de la rèstoracion :\n$1",
-       "undeletedpage": "'''$1 est étâye refêta'''\n\nVêde lo [[Special:Log/delete|jornal de les suprèssions]] por avêr na lista de les novèles suprèssions et rèstoracions.",
-       "undelete-header": "Vêde lo [[Special:Log/delete|jornal de les suprèssions]] por avêr les pâges suprimâyes dês pou.",
-       "undelete-search-title": "Rechèrchiér des pâges suprimâs",
-       "undelete-search-box": "Rechèrchiér des pâges suprimâs",
+       "undeletedpage": "<strong>$1 est étâye refêta</strong>\n\nVêde lo [[Special:Log/delete|jornâl de les suprèssions]] por avêr na lista de les novèles suprèssions et rèstoracions.",
+       "undelete-header": "Vêde lo [[Special:Log/delete|jornâl de les suprèssions]] por avêr les pâges suprimâyes dês pou.",
+       "undelete-search-title": "Rechèrchiér de pâges suprimâyes",
+       "undelete-search-box": "Rechèrchiér de pâges suprimâyes",
        "undelete-search-prefix": "Montrar les pâges que començont per :",
        "undelete-search-submit": "Rechèrchiér",
-       "undelete-no-results": "Niona pâge d’ense at étâ trovâ dens les arch·ives de suprèssion.",
-       "undelete-filename-mismatch": "Empossiblo de refâre la vèrsion du fichiér datâ du $1 : lo nom de fichiér corrèspond pas.",
-       "undelete-bad-store-key": "Empossiblo de refâre la vèrsion du fichiér datâ du $1 : lo fichiér ére absent devant la suprèssion.",
-       "undelete-cleanup-error": "Èrror pendent la suprèssion du fichiér de les arch·ives inutilisâ « $1 ».",
-       "undelete-missing-filearchive": "Empossiblo de refâre lo fichiér de les arch·ives avouéc lo numerô $1 perce qu’il est pas dens la bâsa de balyês.\nIl at pôt-étre ja étâ refêt.",
-       "undelete-error": "Èrror pendent la rèstoracion de la pâge",
-       "undelete-error-short": "Èrror pendent la rèstoracion du fichiér : $1",
-       "undelete-error-long": "Des èrrors ont étâ rencontrâs pendent la rèstoracion du fichiér :\n\n$1",
-       "undelete-show-file-confirm": "Éte-vos de sûr de volêr vêre una vèrsion suprimâ du fichiér « <nowiki>$1</nowiki> » que dâte du $2 a $3 ?",
+       "undelete-no-results": "Niona pâge d’ense est étâye trovâye dedens les arch·ives de suprèssion.",
+       "undelete-filename-mismatch": "Y at pas moyen de refâre la vèrsion du fichiér datâye du $1 : lo nom de fichiér corrèspond pas.",
+       "undelete-bad-store-key": "Y at pas moyen de refâre la vèrsion du fichiér datâye du $1 : lo fichiér ére entrovâblo devant la suprèssion.",
+       "undelete-cleanup-error": "Fôta pendent la suprèssion du fichiér de les arch·ives pas empleyê « $1 ».",
+       "undelete-missing-filearchive": "Y at pas moyen de refâre lo fichiér de les arch·ives avouéc l’ID $1, il est pas dedens la bâsa de balyês.\nPôt-étre il est ja étâ refêt.",
+       "undelete-error": "Fôta pendent la rèstoracion de la pâge",
+       "undelete-error-short": "Fôta pendent la rèstoracion du fichiér : $1",
+       "undelete-error-long": "Des fôtes sont arrevâyes pendent la rèstoracion du fichiér :\n\n$1",
+       "undelete-show-file-confirm": "Vos éte de sûr de volêr vêre na vèrsion suprimâye du fichiér « <nowiki>$1</nowiki> » que dâte du $2 a $3 ?",
        "undelete-show-file-submit": "Ouè",
        "namespace": "Èspâço de noms :",
        "invert": "Envèrsar lo chouèx",
-       "tooltip-invert": "Pouentâd ceta câsa por cachiér los changements de les pâges dens l’èspâço de noms chouèsi (et l’èspâço de noms associyê avouéc se pouentâ)",
+       "tooltip-invert": "Pouentâd cela câsa por cachiér los changements de les pâges dedens l’èspâço de noms chouèsi (et l’èspâço de noms associyê avouéc se pouentâ)",
+       "tooltip-whatlinkshere-invert": "Pouentâd cela câsa por cachiér los lims de les pâges dedens l’èspâço de noms chouèsi.",
        "namespace_association": "Èspâço de noms associyê",
-       "tooltip-namespace_association": "Pouentâd ceta câsa por encllure avouéc l’èspâço de noms de discussion associyê a l’èspâço de noms chouèsi",
+       "tooltip-namespace_association": "Pouentâd cela câsa por rapondre avouéc l’èspâço de noms de discussion de chousa associyê a l’èspâço de noms chouèsi",
        "blanknamespace": "(Principâl)",
        "contributions": "Contribucions de l’utilisat{{GENDER:$1|or|rice}}",
-       "contributions-title": "Lista de les contribucions a l’usanciér $1",
+       "contributions-title": "Contribucions de l’utilisat{{GENDER:$1|or|rice}} $1",
        "mycontris": "Contribucions",
+       "anoncontribs": "Contribucions",
        "contribsub2": "Por {{GENDER:$3|$1}} ($2)",
-       "nocontribs": "Y at gins de changement que corrèspond a cetos critèros.",
+       "contributions-userdoesnotexist": "Lo comptio utilisator « $1 » est pas encartâ.",
+       "nocontribs": "Y at gins de changement que corrèspond a celos critèros.",
        "uctop": "(d’ora)",
        "month": "Dês lo mês (et devant) :",
        "year": "Dês l’an (et devant) :",
        "sp-contributions-newbies": "Montrar ren que les contribucions des novéls utilisators",
-       "sp-contributions-newbies-sub": "Permié los comptos novéls",
-       "sp-contributions-newbies-title": "Contribucions d’usanciérs permié los comptos novéls",
-       "sp-contributions-blocklog": "jornal des blocâjos",
-       "sp-contributions-deleted": "contribucions suprimâs",
+       "sp-contributions-newbies-sub": "Entre-mié los comptios novéls",
+       "sp-contributions-newbies-title": "Contribucions d’utilisators entre-mié los comptios novéls",
+       "sp-contributions-blocklog": "jornâl des blocâjos",
+       "sp-contributions-suppresslog": "contribucions d’utilisators rèprimâyes",
+       "sp-contributions-deleted": "contribucions d’utilisators suprimâyes",
        "sp-contributions-uploads": "tèlèchargements",
-       "sp-contributions-logs": "jornals",
+       "sp-contributions-logs": "jornâls",
        "sp-contributions-talk": "discutar",
-       "sp-contributions-userrights": "administrar los drêts d’usanciér",
-       "sp-contributions-blocked-notice": "Ceti usanciér est ora blocâ.\nLa dèrriére entrâ du jornal des blocâjos est disponibla ce-desot :",
-       "sp-contributions-blocked-notice-anon": "Ceta adrèce IP est ora blocâ.\nLa dèrriére entrâ du jornal des blocâjos est disponibla ce-desot :",
+       "sp-contributions-userrights": "maneyér los drêts d’utilisator",
+       "sp-contributions-blocked-notice": "Ora cél utilisator est blocâ.\nLa dèrriére entrâ du jornâl des blocâjos est balyêe ce-desot coment rèference :",
+       "sp-contributions-blocked-notice-anon": "Ora cel’adrèce IP est blocâye.\nLa dèrriére entrâ du jornâl des blocâjos est balyêe ce-desot coment rèference :",
        "sp-contributions-search": "Rechèrchiér les contribucions",
-       "sp-contributions-username": "Adrèce IP ou ben nom d’usanciér :",
-       "sp-contributions-toponly": "Montrar ren que les novèles vèrsions",
+       "sp-contributions-username": "Adrèce IP ou ben nom d’utilisator :",
+       "sp-contributions-toponly": "Montrar ren que los changements que sont les dèrriéres vèrsions",
+       "sp-contributions-newonly": "Montrar ren que los changements que sont de crèacions de pâge",
        "sp-contributions-submit": "Rechèrchiér",
        "whatlinkshere": "Pâges liyêes",
        "whatlinkshere-title": "Pâges que pouentont vers « $1 »",
        "whatlinkshere-page": "Pâge :",
-       "linkshere": "Les pâges ce-desot contegnont un lim de vers '''[[:$1]]''' :",
-       "nolinkshere": "Niona pâge contint de lim de vers '''[[:$1]]'''.",
-       "nolinkshere-ns": "Niona pâge contint de lim de vers '''[[:$1]]''' dens l’èspâço de noms chouèsi.",
+       "linkshere": "Celes pâges-que contegnont un lim de vers <strong>[[:$1]]</strong> :",
+       "nolinkshere": "Niona pâge contint de lim de vers <strong>[[:$1]]</strong>.",
+       "nolinkshere-ns": "Niona pâge contint de lim de vers <strong>[[:$1]]</strong> dedens l’èspâço de noms chouèsi.",
        "isredirect": "pâge de redirèccion",
-       "istemplate": "encllusion",
+       "istemplate": "transcllusion",
        "isimage": "lim de vers lo fichiér",
        "whatlinkshere-prev": "{{PLURAL:$1|devant|$1 devant}}",
        "whatlinkshere-next": "{{PLURAL:$1|aprés|$1 aprés}}",
        "whatlinkshere-links": "← lims",
        "whatlinkshere-hideredirs": "$1 les redirèccions",
-       "whatlinkshere-hidetrans": "$1 les encllusions",
+       "whatlinkshere-hidetrans": "$1 les transcllusions",
        "whatlinkshere-hidelinks": "$1 los lims",
-       "whatlinkshere-hideimages": "$1 los fichiérs liyês",
+       "whatlinkshere-hideimages": "$1 los lims de vers lo fichiér",
        "whatlinkshere-filters": "Filtros",
-       "autoblockid": "Blocâjo ôtomatico #$1",
-       "block": "Blocar l’usanciér",
-       "unblock": "Dèblocar l’usanciér",
-       "blockip": "Blocar l’usanciér",
-       "blockip-legend": "Blocar l’usanciér",
-       "blockiptext": "Utilisâd lo formulèro ce-desot por blocar l’accès en ècritura dês una adrèce IP spècefica ou ben un nom d’usanciér.\nUna tâla mesera devrêt étre prêsa ren que por empachiér lo vandalismo et en acôrd avouéc les [[{{MediaWiki:Policy-url}}|règlles de dedens]].\nBalyéd ce-desot una rêson justa (per ègzemplo en citent les pâges qu’ont étâ vandalisâs).",
-       "ipaddressorusername": "Adrèce IP ou ben nom d’usanciér :",
+       "whatlinkshere-submit": "Emmodar",
+       "autoblockid": "Blocâjo ôtomatico n° $1",
+       "block": "Blocar l’utilisator",
+       "unblock": "Dèblocar l’utilisator",
+       "blockip": "Blocar l’utilisat{{GENDER:$1|or|rice}}",
+       "blockip-legend": "Blocar l’utilisator",
+       "blockiptext": "Empleyéd lo formulèro ce-desot por blocar l’accès en ècritura dês un’adrèce IP spècifica un nom d’utilisator spècifico.\nNa mesera d’ense devrêt étre prêsa ren que por empachiér lo vandalismo et pués en acôrd avouéc les [[{{MediaWiki:Policy-url}}|politiques]].\nBalyéd ce-desot na rêson prècisa (per ègzemplo en citent les pâges que sont étâyes vandalisâyes).\nVos pouede blocar de plages IP en empleyent la sintaxa [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] ; la ples granta plage ôtorisâye est /$1 por IPv4 et /$2 por IPv6.",
+       "ipaddressorusername": "Adrèce IP ou ben nom d’utilisator :",
        "ipbexpiry": "Temps devant èxpiracion :",
        "ipbreason": "Rêson :",
-       "ipbreason-dropdown": "*Rêsons corentes de blocâjo\n** Entrebetâ d’enformacions fôsses\n** Suprèssion de contegnu de les pâges\n** Entrebetâ de lims de defôr publicitèros (spame)\n** Entrebetâ de contegnu sen gins de significacion et d’ècovelyes dedens les pâges\n** Tentativa d’entimidacion ou ben de torment\n** Abus d’usâjo d’un mouél de comptos\n** Nom d’utilisator pas accèptâblo",
-       "ipb-hardblock": "Empache los changements des usanciérs encartâs qu’utilisont cela adrèce IP",
-       "ipbcreateaccount": "Empachiér la crèacion de compto",
-       "ipbemailban": "Empachiér l’usanciér de mandar des mèssâjos",
-       "ipbenableautoblock": "Blocar ôtomaticament la dèrriére adrèce IP utilisâ per l’usanciér et pués totes ses adrèces IP a vegnir que porrêt èprovar",
-       "ipbsubmit": "Blocar ceti usanciér",
+       "ipbreason-dropdown": "*Rêsons corentes de blocâjo\n** Entrebetâ d’enformacions fôsses\n** Suprèssion de contegnu de les pâges\n** Raponsa de lims de defôr cofos (recllâma)\n** Entrebetâ de contegnu sen gins de significacion et d’ècovelyes dedens les pâges\n** Èprôva d’entimidacion de pèrsècucion\n** Abus d’usâjo d’un mouél de comptios\n** Nom d’utilisator pas accèptâblo",
+       "ipb-hardblock": "Empachiér los utilisators branchiês de changiér en empleyent cel’adrèce IP",
+       "ipbcreateaccount": "Empachiér la crèacion de comptio",
+       "ipbemailban": "Empachiér l’utilisator de mandar de mèssâjos",
+       "ipbenableautoblock": "Blocar ôtomaticament la dèrriére adrèce IP empleyêe per l’utilisator et pués totes ses adrèces IP a vegnir que porrêt èprovar",
+       "ipbsubmit": "Blocar cél utilisator",
        "ipbother": "Ôtro temps :",
        "ipboptions": "2 hores:2 hours,1 jorn:1 day,3 jorns:3 days,1 semana:1 week,2 semanes:2 weeks,1 mês:1 month,3 mês:3 months,6 mês:6 months,1 an:1 year,sen fin:infinite",
-       "ipbhidename": "Cachiér lo nom d’usanciér des changements et de les listes",
-       "ipbwatchuser": "Siuvre les pâges usanciér et de discussion a ceti usanciér",
-       "ipb-disableusertalk": "Empache cél usanciér de changiér sa prôpra pâge de discussion pendent lo temps de son blocâjo",
-       "ipb-change-block": "Tornar blocar ceti usanciér avouéc celos paramètres",
+       "ipbhidename": "Cachiér lo nom d’utilisator des changements et de les listes",
+       "ipbwatchuser": "Siuvre les pâges utilisator et de discussion a cél utilisator",
+       "ipb-disableusertalk": "Empachiér cél utilisator de changiér la sina pâge de discussion pendent lo blocâjo",
+       "ipb-change-block": "Tornar blocar l’utilisator avouéc cela configuracion",
        "ipb-confirm": "Confirmar lo blocâjo",
-       "badipaddress": "L’adrèce IP est fôssa.",
+       "badipaddress": "L’adrèce IP est pas justa.",
        "blockipsuccesssub": "Blocâjo reussi",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] at étâ blocâ.<br />\nVêde la [[Special:BlockList|lista des blocâjos]] por revêre los blocâjos.",
-       "ipb-blockingself": "Vos éte prèst a vos blocar vos-mémo !  Éte-vos de sûr de lo volêr fâre ?",
-       "ipb-confirmhideuser": "Vos éte prèst a blocar un usanciér avouéc « cachiér l’usanciér » activâ.  Cen suprime lo nom a l’usanciér dens totes les listes et les entrâs du jornal.  Éte-vos de sûr de lo volêr fâre ?",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] est {{GENDER:$1|étâ blocâ|étâye blocâye}}.<br />\nVêde la [[Special:BlockList|lista des blocâjos]] por revêre los blocâjos.",
+       "ipb-blockingself": "Vos éte prèst a vos blocar vos-mémo ! Vos éte de sûr d’o volêr fâre ?",
+       "ipb-confirmhideuser": "Vos éte prèst a blocar un utilisator avouéc « cachiér l’utilisator » activâ. Cen rèprime lo nom a l’utilisator dedens totes les listes et les entrês du jornâl. Vos éte de sûr d’o volêr fâre ?",
+       "ipb-confirmaction": "Se vos éte de sûr d’o volêr franc fâre, se vos plét pouentâd lo champ « {{int:ipb-confirm}} » d’avâl.",
        "ipb-edit-dropdown": "Changiér les rêsons de blocâjo",
        "ipb-unblock-addr": "Dèblocar $1",
-       "ipb-unblock": "Dèblocar un usanciér ou ben una adrèce IP",
-       "ipb-blocklist": "Vêde los blocâjos ègzistents",
-       "ipb-blocklist-contribs": "Contribucions por $1",
-       "unblockip": "Dèblocar l’usanciér",
-       "unblockiptext": "Utilisâd lo formulèro ce-desot por rètablir l’accès en ècritura dês una adrèce IP spècefica ou ben un nom d’usanciér.",
-       "ipusubmit": "Enlevar ceti blocâjo",
-       "unblocked": "[[User:$1|$1]] at étâ dèblocâ",
-       "unblocked-range": "$1 at étâ dèblocâ",
-       "unblocked-id": "Lo blocâjo $1 at étâ enlevâ",
-       "blocklist": "Usanciérs blocâs",
-       "ipblocklist": "Usanciérs blocâs",
-       "ipblocklist-legend": "Chèrchiér un usanciér blocâ",
-       "blocklist-userblocks": "Cachiér los blocâjos de comptos",
+       "ipb-unblock": "Dèblocar un nom d’utilisator un’adrèce IP",
+       "ipb-blocklist": "Vêre los blocâjos ègzistents",
+       "ipb-blocklist-contribs": "Contribucions por {{GENDER:$1|$1}}",
+       "unblockip": "Dèblocar un utilisator",
+       "unblockiptext": "Empleyéd lo formulèro ce-desot por rètablir l’accès en ècritura dês un’adrèce IP blocâye un nom d’utilisator blocâ los côps devant.",
+       "ipusubmit": "Enlevar cél blocâjo",
+       "unblocked": "[[User:$1|$1]] est {{GENDER:$1|étâ dèblocâ|étâye dèblocâye}}.",
+       "unblocked-range": "$1 est étâ dèblocâ.",
+       "unblocked-id": "Lo blocâjo $1 est étâ enlevâ.",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] est étâ dèblocâ.",
+       "blocklist": "Utilisators blocâs",
+       "ipblocklist": "Utilisators blocâs",
+       "ipblocklist-legend": "Trovar un utilisator blocâ",
+       "blocklist-userblocks": "Cachiér los blocâjos de comptios",
        "blocklist-tempblocks": "Cachiér los blocâjos temporèros",
-       "blocklist-addressblocks": "Cachiér los blocâjos d’adrèces IP solètes",
-       "blocklist-rangeblocks": "Cachiér los blocos de portâ",
+       "blocklist-addressblocks": "Cachiér los blocâjos de mas qu’un’adrèce IP",
+       "blocklist-rangeblocks": "Cachiér los blocâjos de plages IP",
        "blocklist-timestamp": "Dâta et hora",
        "blocklist-target": "Ciba",
-       "blocklist-expiry": "Dâta d’èxpiracion",
+       "blocklist-expiry": "Èxpiracion",
        "blocklist-by": "Administrator qu’at fêt lo blocâjo",
-       "blocklist-params": "Paramètres de blocâjo",
+       "blocklist-params": "Paramètros de blocâjo",
        "blocklist-reason": "Rêson",
        "ipblocklist-submit": "Rechèrchiér",
        "ipblocklist-localblock": "Blocâjo locâl",
        "ipblocklist-otherblocks": "{{PLURAL:$1|Ôtro blocâjo|Ôtros blocâjos}}",
        "infiniteblock": "sen fin",
        "expiringblock": "èxpire lo $1 a $2",
-       "anononlyblock": "solament los usanciérs pas encartâs",
+       "anononlyblock": "mas que los utilisators anonimos",
        "noautoblockblock": "blocâjo ôtomatico dèsactivâ",
-       "createaccountblock": "crèacion de compto dèfendua",
-       "emailblock": "mèssageria èlèctronica blocâ",
-       "blocklist-nousertalk": "pôt pas changiér sa prôpra pâge de discussion",
-       "ipblocklist-empty": "Ora, la lista a les adrèces IP blocâs est voueda.",
-       "ipblocklist-no-results": "L’adrèce IP ou ben l’usanciér demandâ est pas blocâ.",
+       "createaccountblock": "crèacion de comptio dèsactivâye",
+       "emailblock": "mèssageria èlèctronica dèsactivâye",
+       "blocklist-nousertalk": "pôt pas changiér la sina pâge de discussion",
+       "ipblocklist-empty": "La lista des blocâjos est voueda.",
+       "ipblocklist-no-results": "L’adrèce IP demandâye lo nom d’utilisator demandâ est pas blocâ(ye).",
        "blocklink": "blocar",
        "unblocklink": "dèblocar",
        "change-blocklink": "changiér lo blocâjo",
        "contribslink": "contribucions",
        "emaillink": "mandar un mèssâjo",
-       "autoblocker": "Vos avéd étâ blocâ ôtomaticament perce que voutra adrèce IP at étâ utilisâ dèrriérement per « [[User:$1|$1]] ».\nLa rêson balyê por lo blocâjo a $1 est : « $2 ».",
-       "blocklogpage": "Jornal des blocâjos",
-       "blocklog-showlog": "Ceti usanciér at étâ blocâ dês devant.\nLo jornal des blocâjos est disponiblo ce-desot :",
-       "blocklog-showsuppresslog": "Ceti usanciér at étâ blocâ et pués cachiê dês devant.\nLo jornal de les suprèssions est disponiblo ce-desot :",
-       "blocklogentry": "at blocâ [[$1]] ; èxpiracion : $2 $3",
-       "reblock-logentry": "at changiê los paramètres du blocâjo a [[$1]] avouéc una èxpiracion u $2 $3",
-       "blocklogtext": "O est lo jornal de les accions de blocâjo et dèblocâjo d’utilisators.\nLes adrèces IP blocâyes ôtomaticament sont pas listâyes.\nVêde la [[Special:BlockList|lista des blocâjos]] por la lista des banissements et des blocâjos que sont ora actifs.",
+       "autoblocker": "Vos éte étâ blocâ ôtomaticament, voutron adrèce IP est étâye empleyêe dês pou per « [[User:$1|$1]] ».\nLa rêson balyêe por lo blocâjo de $1 est « $2 ».",
+       "blocklogpage": "Jornâl des blocâjos",
+       "blocklog-showlog": "Cél utilisator est étâ blocâ los côps devant.\nLo jornâl des blocâjos est balyê ce-desot coment rèference :",
+       "blocklog-showsuppresslog": "Cél utilisator est étâ blocâ et pués cachiê los côps devant.\nLo jornâl de les rèprèssions est balyê ce-desot coment rèference :",
+       "blocklogentry": "at blocâ [[$1]] avouéc un temps d’èxpiracion de $2 $3",
+       "reblock-logentry": "at changiê la configuracion du blocâjo de [[$1]] avouéc un temps d’èxpiracion de $2 $3",
+       "blocklogtext": "O est lo jornâl de les accions de blocâjo et dèblocâjo d’utilisators.\nLes adrèces IP blocâyes ôtomaticament sont pas listâyes.\nVêde la [[Special:BlockList|lista des blocâjos]] por la lista des banissements et des blocâjos que sont ora actifs.",
        "unblocklogentry": "at dèblocâ $1",
-       "block-log-flags-anononly": "solament los usanciérs pas encartâs",
-       "block-log-flags-nocreate": "crèacion de compto dèfendua",
-       "block-log-flags-noautoblock": "ôtoblocâjo a les adrèces IP dèsactivâ",
-       "block-log-flags-noemail": "èxpèdicion de mèssâjo dèfendua",
-       "block-log-flags-nousertalk": "pôt pas changiér sa prôpra pâge de discussion",
-       "block-log-flags-angry-autoblock": "ôtoblocâjo mèlyorâ activâ",
-       "block-log-flags-hiddenname": "nom d’usanciér cachiê",
-       "range_block_disabled": "Lo povêr d’administrator de fâre des blocâjos de plages d’adrèces IP est dèsactivâ.",
-       "ipb_expiry_invalid": "Temps d’èxpiracion fôx.",
-       "ipb_expiry_temp": "Los blocâjos de noms d’usanciér cachiês dêvont étre sen fin.",
-       "ipb_hide_invalid": "Empossiblo de suprimar ceti compto ; semble avêr trop de changements.",
+       "block-log-flags-anononly": "mas que los utilisators anonimos",
+       "block-log-flags-nocreate": "crèacion de comptio dèsactivâye",
+       "block-log-flags-noautoblock": "blocâjo ôtomatico dèsactivâ",
+       "block-log-flags-noemail": "mèssageria èlèctronica dèsactivâye",
+       "block-log-flags-nousertalk": "pôt pas changiér la sina pâge de discussion",
+       "block-log-flags-angry-autoblock": "blocâjo ôtomatico bônâ activâ",
+       "block-log-flags-hiddenname": "nom d’utilisator cachiê",
+       "range_block_disabled": "Lo moyen d’administrator de fâre de blocâjos de plages IP est dèsactivâ.",
+       "ipb_expiry_invalid": "Temps d’èxpiracion pas justo.",
+       "ipb_expiry_old": "Lo temps d’èxpiracion est ja passâ.",
+       "ipb_expiry_temp": "Los blocâjos de noms d’utilisator cachiês dêvont étre sen fin.",
+       "ipb_hide_invalid": "Y at pas moyen de rèprimar cél comptio ; semble avêr més {{PLURAL:$1|d’un changement|de $1 changements}}.",
        "ipb_already_blocked": "« $1 » est ja blocâ",
-       "ipb-needreblock": "$1 est ja blocâ.\nVoléd-vos changiér los paramètres ?",
+       "ipb-needreblock": "$1 est ja blocâ.\nVos voléd changiér la configuracion ?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Ôtro blocâjo|Ôtros blocâjos}}",
-       "unblock-hideuser": "Vos pouede pas dèblocar cél usanciér, perce que son nom d’usanciér at étâ cachiê.",
-       "ipb_cant_unblock": "Èrror : numerô de blocâjo $1 pas trovâ.\nO est possiblo qu’un dèblocâjo èye ja étâ fêt.",
-       "ipb_blocked_as_range": "Èrror : l’adrèce IP $1 est pas blocâ tot drêt et pôt vêr pas étre dèblocâ.\nPortant, el est avouéc la plage $2 que pôt étre dèblocâ.",
-       "ip_range_invalid": "Plage d’adrèces IP fôssa.",
-       "ip_range_toolarge": "Los blocâjos de plages d’adrèces IP ples grantes que /$1 sont pas ôtorisâs.",
-       "proxyblocker": "Bloquior de sèrvors mandatèros (''proxies'')",
-       "proxyblockreason": "Voutra adrèce IP at étâ blocâ perce qu’o est un sèrvor mandatèro (''proxy'') uvèrt.\nVos volyéd veriér vers voutron fornissor d’accès u Malyâjo ou ben voutra assistance tècnica et l’enformar de cél problèmo de sècuritât sèriox.",
-       "sorbsreason": "Voutra adrèce IP est listâ coment sèrvor mandatèro (''proxy'') uvèrt dens lo DNSBL utilisâ per {{SITENAME}}.",
-       "sorbs_create_account_reason": "Voutra adrèce IP est listâ coment sèrvor mandatèro (''proxy'') uvèrt dens lo DNSBL utilisâ per {{SITENAME}}.\nVos pouede pas fâre un compto.",
-       "cant-see-hidden-user": "L’usanciér que vos tâchiéd de blocar at ja étâ blocâ et cachiê.\nPas èyent lo drêt hideuser, vos pouede pas vêre ou ben changiér lo blocâjo a l’usanciér.",
-       "ipbblocked": "Vos pouede pas blocar ou ben dèblocar d’ôtros usanciérs, perce que vos éte vos-mémo blocâ",
-       "ipbnounblockself": "Vos éte pas ôtorisâ a vos dèblocar vos-mémo",
-       "lockdb": "Vèrrolyér la bâsa de balyês",
-       "unlockdb": "Dèvèrrolyér la bâsa de balyês",
-       "lockdbtext": "Lo vèrrolyâjo de la bâsa de balyês empachierat tôs los usanciérs de changiér des pâges, d’encartar lors prèferences, de changiér lor lista de survelyence et pués de fâre totes les ôtres opèracions qu’ont fôta des changements dens la bâsa de balyês.\nVolyéd confirmar qu’o est franc cen que vos voléd fâre et que vos dèvèrrolyeréd la bâsa setout que voutra opèracion de mantegnence serat chavonâ.",
-       "unlockdbtext": "Lo dèvèrrolyâjo de la bâsa de balyês tornerat pèrmetre a tôs los usanciérs de changiér des pâges, d’encartar lors prèferences, de changiér lor lista de survelyence et pués de fâre totes les ôtres opèracions qu’ont fôta des changements dens la bâsa de balyês.\nVolyéd confirmar qu’o est franc cen que vos voléd fâre.",
-       "lockconfirm": "Ouè, confirmo que souhèto vèrrolyér la bâsa de balyês.",
-       "unlockconfirm": "Ouè, confirmo que souhèto dèvèrrolyér la bâsa de balyês.",
-       "lockbtn": "Vèrrolyér la bâsa de balyês",
-       "unlockbtn": "Dèvèrrolyér la bâsa de balyês",
+       "unblock-hideuser": "Vos pouede pas dèblocar cél utilisator, son nom d’utilisator est étâ cachiê.",
+       "ipb_cant_unblock": "Fôta : identifient de blocâjo $1 pas trovâ. O est possiblo qu’un dèblocâjo èye ja étâ fêt.",
+       "ipb_blocked_as_range": "Fôta : l’adrèce IP $1 est pas blocâye tot drêt et pués pôt vêr pas étre dèblocâye.\nPortant el est avouéc la plage IP $2 que pôt étre dèblocâye.",
+       "ip_range_invalid": "Plage IP pas justa.",
+       "ip_range_toolarge": "Los blocâjos de plages IP ples grantes que /$1 sont pas ôtorisâs.",
+       "proxyblocker": "Bloquior de sèrviors mandatèros (<em>proxies</em>)",
+       "proxyblockreason": "Voutron adrèce IP est étâye blocâye, o est un sèrvior mandatèro (<em>proxy</em>) uvèrt.\nSe vos plét, veriéd-vos vers voutron fornissor d’accès u Malyâjo voutron supôrt tècnico et pués enformâd-los de cél problèmo de sècuritât sèriox.",
+       "sorbsreason": "Voutron adrèce IP est listâye coment sèrvior mandatèro (<em>proxy</em>) uvèrt dedens lo DNSBL empleyê per {{SITENAME}}.",
+       "sorbs_create_account_reason": "Voutron adrèce IP est listâye coment sèrvior mandatèro (<em>proxy</em>) uvèrt dedens lo DNSBL empleyê per {{SITENAME}}.\nVos pouede pas fâre un comptio.",
+       "xffblockreason": "Un’adrèce IP dedens l’en-téta X-Forwarded-For, ou ben la voutra ou ben cela d’un sèrvior mandatèro (<em>proxy</em>) que vos empleyéd, est étâye blocâye. La rêson originâla du blocâjo ére : $1",
+       "cant-see-hidden-user": "L’utilisator que vos èprovâd de blocar est ja étâ blocâ et cachiê.\nSen lo drêt « hideuser », vos pouede pas vêre changiér lo blocâjo de l’utilisator.",
+       "ipbblocked": "Vos pouede pas blocar dèblocar d’ôtros utilisators, vos éte vos-mém{{GENDER:|o|a}} blocâ{{GENDER:||ye}}.",
+       "ipbnounblockself": "Vos éte pas ôtorisâ{{GENDER:||ye}} a vos dèblocar vos-mém{{GENDER:|o|a}}.",
+       "lockdb": "Cotar la bâsa de balyês",
+       "unlockdb": "Dècotar la bâsa de balyês",
+       "lockdbtext": "Lo vèrroly de la bâsa de balyês empachierat tôs los utilisators de changiér de pâges, d’encartar lors prèferences, de changiér lor lista de gouârda et pués de fâre totes les ôtres opèracions qu’ant fôta de changements dedens la bâsa de balyês.\nSe vos plét, confirmâd qu’o est franc cen que vos voléd fâre et que vos la dècoteréd setout que voutra rotina d’entretin serat chavonâye.",
+       "unlockdbtext": "La fin du vèrroly de la bâsa de balyês tornerat pèrmetre a tôs los utilisators de changiér de pâges, d’encartar lors prèferences, de changiér lor lista de gouârda et pués de fâre totes les ôtres opèracions qu’ant fôta de changements dedens la bâsa de balyês.\nSe vos plét, confirmâd qu’o est franc cen que vos voléd fâre.",
+       "lockconfirm": "Ouè, confirmo que vuel cotar la bâsa de balyês.",
+       "unlockconfirm": "Ouè, confirmo que vuel dècotar la bâsa de balyês.",
+       "lockbtn": "Cotar la bâsa de balyês",
+       "unlockbtn": "Dècotar la bâsa de balyês",
        "locknoconfirm": "Vos éd pas pouentâ la câsa de confirmacion.",
-       "lockdbsuccesssub": "Vèrrolyâjo de la bâsa de balyês reussi",
-       "unlockdbsuccesssub": "Vèrrolyâjo de la bâsa de balyês enlevâ",
-       "lockdbsuccesstext": "La bâsa de donâs est étâye vèrrolyêye.<br />\nOubliâd pas de [[Special:UnlockDB|la dèvèrrolyér]] quand vos aréd chavonâ voutra opèracion de mantegnence.",
-       "unlockdbsuccesstext": "La bâsa de balyês at étâ dèvèrrolyê.",
-       "lockfilenotwritable": "Lo fichiér de vèrrolyâjo de la bâsa de balyês est pas enscriptiblo.\nPor vèrrolyér ou ben dèvèrrolyér la bâsa de balyês, dêt étre accèssiblo en ècritura dês lo sèrvor vouèbe.",
-       "databasenotlocked": "La bâsa de balyês est pas vèrrolyê.",
-       "lockedbyandtime": "(per $1 lo $2 a $3)",
-       "move-page": "Renomar $1",
-       "move-page-legend": "Renomar una pâge",
-       "movepagetext": "Utilisâd lo formulèro ce-desot por renomar una pâge, en dèplacient tot son historico vers lo novél nom.\nLo viely titro vindrat una pâge de redirèccion de vers lo titro novél.\nVos pouede betar a jorn ôtomaticament les redirèccions d’ora que pouentont vers lo titro originâl.\nSe vos chouèsésséd de pas lo fâre, assurâd-vos de controlar tota [[Special:DoubleRedirects|redirèccion dobla]] ou ben [[Special:BrokenRedirects|câssa]].\nVos avéd la rèsponsabilitât de vos assurar que los lims continuont de pouentar vers lor dèstinacion suposâ.\n\nNotâd que la pâge serat '''pas''' dèplaciê s’y at ja una pâge avouéc lo titro novél, a muens que cela dèrriére seye voueda ou ben seye ren qu’una redirèccion et que son historico des changements seye vouedo.\nCen vôt dére que vos pouede renomar una pâge vers sa posicion d’origina se vos éd fêt una èrror, mas que vos pouede pas ècllafar una pâge ja ègzistenta.\n\n'''ATENCION !'''\nCen pôt provocar un changement fôrt et emprèvu por una pâge sovent vua ;\nassurâd-vos de nen avêr comprês les consèquences devant que continuar.",
-       "movepagetext-noredirectfixer": "Utilisâd lo formulèro ce-desot por renomar una pâge, en dèplacient tot son historico vers lo novél nom.\nLo viely titro vindrat una pâge de redirèccion de vers lo titro novél.\nControlâd bien les [[Special:DoubleRedirects|redirèccions dobles]] ou ben [[Special:BrokenRedirects|câsses]].\nVos avéd la rèsponsabilitât de vos assurar que los lims continuont de pouentar vers lor dèstinacion suposâ.\n\nNotâd que la pâge serat '''pas''' dèplaciê s’y at ja una pâge avouéc lo titro novél, a muens que cela dèrriére seye voueda ou ben seye ren qu’una redirèccion et que son historico des changements seye vouedo.\nCen vôt dére que vos pouede renomar una pâge vers sa posicion d’origina se vos éd fêt una èrror, mas que vos pouede pas ècllafar una pâge ja ègzistenta.\n\n'''ATENCION !'''\nCen pôt provocar un changement fôrt et emprèvu por una pâge sovent vua ;\nassurâd-vos de nen avêr comprês les consèquences devant que continuar.",
-       "movepagetalktext": "La pâge de discussion associyê, se presente, serat renomâ ôtomaticament avouéc '''a muens que :'''\n* una pâge de discussion pas voueda ègziste ja avouéc lo novél nom, ou ben\n* vos pouentâd pas la câsa ce-desot.\n\nDens celos câs, vos devréd renomar ou ben fusionar la pâge a la man se vos lo voléd.",
-       "moveuserpage-warning": "'''Atencion :''' vos éte prèst a renomar una pâge usanciér. Volyéd notar que solament la pâge serat renomâ et que l’usanciér serat '''pas''' renomâ.",
-       "movenologintext": "Por povêr renomar una pâge, vos dête étre [[Special:UserLogin|branchiê]] coment usanciér encartâ.",
-       "movenotallowed": "Vos avéd pas la pèrmission de renomar les pâges.",
-       "movenotallowedfile": "Vos avéd pas la pèrmission de renomar los fichiérs.",
-       "cant-move-user-page": "Vos avéd pas la pèrmission de renomar les pâges principâles d’usanciérs (en defôr de lors sot-pâges).",
-       "cant-move-to-user-page": "Vos avéd pas la pèrmission de renomar una pâge vers una pâge usanciér (a l’èxcèpcion d’una sot-pâge).",
-       "newtitle": "De vers lo titro novél :",
+       "lockdbsuccesssub": "Vèrroly de la bâsa de balyês reussi",
+       "unlockdbsuccesssub": "Vèrroly de la bâsa de balyês enlevâ",
+       "lockdbsuccesstext": "La bâsa de balyês est étâye cotâye.<br />\nOubliâd pas de la [[Special:UnlockDB|dècotar]] quand vos aréd chavonâ voutra rotina d’entretin.",
+       "unlockdbsuccesstext": "La bâsa de balyês est étâye dècotâye.",
+       "lockfilenotwritable": "Lo fichiér de vèrroly de la bâsa de balyês est pas enscriptiblo.\nPor cotar dècotar la bâsa de balyês, dêt étre enscriptiblo dês lo sèrvior Vouèbe.",
+       "databasenotlocked": "La bâsa de balyês est pas cotâye.",
+       "lockedbyandtime": "(per {{GENDER:$1|$1}} lo $2 a $3)",
+       "move-page": "Dèplaciér $1",
+       "move-page-legend": "Dèplaciér na pâge",
+       "movepagetext": "Empleyéd lo formulèro ce-desot por renomar na pâge, en dèplacient tot son historico vers lo novél nom.\nLo viely titro vindrat na pâge de redirèccion de vers lo titro novél.\nVos pouede betar a jorn ôtomaticament les redirèccions d’ora que pouentont vers lo titro originâl.\nSe vos chouèsésséd de pas o fâre, assurâd-vos de controlar tota [[Special:DoubleRedirects|redirèccion dobla]] [[Special:BrokenRedirects|câssa]].\nVos éd la rèsponsabilitât de vos assurar que los lims continuont de pouentar vers lor dèstinacion suposâye.\n\nNotâd que la pâge serat <strong>pas</strong> dèplaciêe s’y at ja na pâge avouéc lo titro novél, a muens que cela dèrriére seye na simpla redirèccion avouéc un historico de changements vouedo.\nCen vôt dére que vos pouede renomar na pâge vers sa posicion d’origina se vos éd fêt na fôta, mas que vos pouede pas ècllafar na pâge ja ègzistenta.\n\n<strong>Nota :</strong>\nCen pôt côsar un changement radicâl et emprèviu por na pâge sovent viua ;\nse vos plét assurâd-vos de nen avêr comprês les consèquences devant que continuar.",
+       "movepagetext-noredirectfixer": "Empleyéd lo formulèro ce-desot por renomar na pâge, en dèplacient tot son historico vers lo novél nom.\nLo viely titro vindrat na pâge de redirèccion de vers lo titro novél.\nAssurâd-vos de controlar tota [[Special:DoubleRedirects|redirèccion dobla]] [[Special:BrokenRedirects|câssa]].\nVos éd la rèsponsabilitât de vos assurar que los lims continuont de pouentar vers lor dèstinacion suposâye.\n\nNotâd que la pâge serat <strong>pas</strong> dèplaciêe s’y at ja na pâge avouéc lo titro novél, a muens que cela dèrriére seye na simpla redirèccion avouéc un historico de changements vouedo.\nCen vôt dére que vos pouede renomar na pâge vers sa posicion d’origina se vos éd fêt na fôta, mas que vos pouede pas ècllafar na pâge ja ègzistenta.\n\n<strong>Nota :</strong>\nCen pôt côsar un changement radicâl et emprèviu por na pâge sovent viua ;\nse vos plét assurâd-vos de nen avêr comprês les consèquences devant que continuar.",
+       "movepagetalktext": "Se vos pouentâd cela câsa, la pâge de discussion associyêe serat asse-ben dèplaciêe ôtomaticament, a muens qu’una pâge de discussion pas voueda ègzisteye ja desot lo novél nom.\n\nDens cél câs, vos devréd dèplaciér fusionar la pâge a la man se vos o voléd.",
+       "moveuserpage-warning": "<strong>Atencion :</strong> vos éte prèst a dèplaciér na pâge utilisator. Se vos plét, notâd que solament la pâge serat dèplaciêe et que l’utilisator serat <em>pas</em> renomâ.",
+       "movecategorypage-warning": "<strong>Atencion :</strong> vos éte prèst a dèplaciér na pâge de catègoria. Se vos plét, notâd que solament la pâge serat dèplaciêe et que <em>pas yona</em> de les pâges de la vielye catègoria serat betâye dedens la novèla.",
+       "movenologintext": "Vos dête étre un utilisator encartâ et [[Special:UserLogin|branchiê]] por povêr dèplaciér na pâge.",
+       "movenotallowed": "Vos éd pas la pèrmission de dèplaciér de pâges.",
+       "movenotallowedfile": "Vos éd pas la pèrmission de dèplaciér de fichiérs.",
+       "cant-move-user-page": "Vos éd pas la pèrmission de dèplaciér de pâges utilisator (en defôr de sot-pâges).",
+       "cant-move-to-user-page": "Vos éd pas la pèrmission de dèplaciér na pâge vers na pâge utilisator (mas pas vers na sot-pâge utilisator).",
+       "cant-move-category-page": "Vos éd pas la pèrmission de dèplaciér de pâges de catègoria.",
+       "cant-move-to-category-page": "Vos éd pas la pèrmission de dèplaciér na pâge vers na pâge de catègoria.",
+       "newtitle": "Titro novél :",
        "move-watch": "Siuvre les pâges sôrsa et ciba",
-       "movepagebtn": "Renomar la pâge",
+       "movepagebtn": "Dèplaciér la pâge",
        "pagemovedsub": "Changement de nom reussi",
-       "movepage-moved": "'''« $1 » at étâ renomâ en « $2 »'''",
-       "movepage-moved-redirect": "Una redirèccion dês lo viely nom at étâ fêta.",
-       "movepage-moved-noredirect": "La crèacion d’una redirèccion dês lo viely nom at étâ anulâ.",
-       "articleexists": "Ègziste ja una pâge que pôrte cél titro, ou ben lo titro que vos éd chouèsi est fôx.\nNen volyéd chouèsir un ôtro.",
-       "cantmove-titleprotected": "Vos pouede pas dèplaciér una pâge vers cél emplacement perce que lo titro novél at étâ protègiê a la crèacion.",
-       "movetalk": "Renomar avouéc la pâge de discussion associyê",
-       "move-subpages": "Renomar les sot-pâges (tant qu’a $1 pâges)",
-       "move-talk-subpages": "Renomar les sot-pâges de la pâge de discussion (tant qu’a $1 pâges)",
-       "movepage-page-exists": "La pâge $1 ègziste ja et pôt pas étre ècrasâ ôtomaticament.",
-       "movepage-page-moved": "La pâge $1 at étâ renomâ en $2.",
-       "movepage-page-unmoved": "La pâge $1 at pas possu étre renomâ en $2.",
-       "movepage-max-pages": "Lo més de $1 {{PLURAL:$1|pâge at étâ renomâ|pâges ont étâ renomâs}} et niona ôtra pâge serat renomâ ôtomaticament.",
-       "movelogpage": "Jornal des changements de nom",
-       "movelogpagetext": "Vê-que la lista de totes les pâges renomâs ou dèplaciês.",
+       "movepage-moved": "<strong>« $1 » est étâ dèplaciê vers « $2 »</strong>",
+       "movepage-moved-redirect": "Na redirèccion est étâye fêta.",
+       "movepage-moved-noredirect": "La crèacion d’una redirèccion est étâye rèprimâye.",
+       "articleexists": "Ègziste ja na pâge avouéc cél nom, ou ben lo nom que vos éd chouèsi est pas justo.\nSe vos plét, chouèsésséd-nen un ôtro.",
+       "cantmove-titleprotected": "Vos pouede pas dèplaciér na pâge vers cél endrêt, lo titro novél est étâ protègiê a la crèacion.",
+       "movetalk": "Dèplaciér avouéc la pâge de discussion associyêe",
+       "move-subpages": "Dèplaciér les sot-pâges (tant qu’a $1)",
+       "move-talk-subpages": "Dèplaciér les sot-pâges de la pâge de discussion (tant qu’a $1)",
+       "movepage-page-exists": "La pâge $1 ègziste ja et pués pôt pas étre ècllafâye ôtomaticament.",
+       "movepage-page-moved": "La pâge $1 est étâye dèplaciêe vers $2.",
+       "movepage-page-unmoved": "La pâge $1 at pas possu étre dèplaciêe vers $2.",
+       "movepage-max-pages": "Lo més de $1 pâge{{PLURAL:$1||s}} est étâ dèplaciê et pués pas yona de més serat dèplaciêe ôtomaticament.",
+       "movelogpage": "Jornâl des changements de nom",
+       "movelogpagetext": "Vê-que na lista de totes les pâges dèplaciêes.",
        "movesubpage": "Sot-pâge{{PLURAL:$1||s}}",
-       "movesubpagetext": "Cela pâge at $1 {{PLURAL:$1|sot-pâge montrâ|sot-pâges montrâs}} ce-desot.",
-       "movenosubpage": "Ceta pâge at gins de sot-pâge.",
+       "movesubpagetext": "Cela pâge at $1 {{PLURAL:$1|sot-pâge montrâye|sot-pâges montrâyes}} ce-desot.",
+       "movenosubpage": "Cela pâge at gins de sot-pâge.",
        "movereason": "Rêson :",
-       "revertmove": "rètablir",
-       "delete_and_move_text": "== Suprèssion nècèssèra ==\nLa pâge de dèstinacion « [[:$1]] » ègziste ja.\nLa voléd-vos suprimar por pèrmetre lo changement de nom ?",
-       "delete_and_move_confirm": "Ouè, j’accèpto de suprimar la pâge de dèstinacion por pèrmetre lo changement de nom.",
-       "delete_and_move_reason": "Pâge suprimâ por pèrmetre lo changement de nom dês « [[$1]] »",
-       "selfmove": "Los titros d’origina et de dèstinacion sont los mémos ;\nempossiblo de renomar una pâge sur lyé-méma.",
-       "immobile-source-namespace": "Vos pouede pas renomar les pâges dens l’èspâço de noms « $1 »",
-       "immobile-target-namespace": "Vos pouede pas renomar des pâges vers l’èspâço de noms « $1 »",
-       "immobile-target-namespace-iw": "Los lims entèrvouiquis sont pas una ciba valida por los changements de nom.",
-       "immobile-source-page": "Cela pâge est pas renomâbla.",
-       "immobile-target-page": "Empossiblo de renomar la pâge vers cél titro.",
-       "imagenocrossnamespace": "Empossiblo de renomar un fichiér vers un èspâço de noms ôtro que « {{ns:file}} ».",
-       "nonfile-cannot-move-to-file": "Empossiblo de renomar quârque-ren d’ôtro qu’un fichiér vers l’èspâço de noms « {{ns:file}} ».",
-       "imagetypemismatch": "La novèla èxtension de cél fichiér corrèspond pas a son tipo.",
-       "imageinvalidfilename": "Lo nom du fichiér ciba est fôx",
-       "fix-double-redirects": "Betar a jorn les redirèccions que pouentont vers lo titro originâl",
-       "move-leave-redirect": "Lèssiér una redirèccion de vers lo titro novél",
-       "protectedpagemovewarning": "'''ATENCION :''' ceta pâge at étâ protègiê de façon que solament los usanciérs qu’ont lo statut d’administrator la pouessont renomar.\nLa dèrriére entrâ du jornal est montrâ ce-desot coment refèrence :",
-       "semiprotectedpagemovewarning": "'''Nota :''' ceta pâge at étâ protègiê de façon que solament los usanciérs encartâs la pouessont renomar.\nLa dèrriére entrâ du jornal est montrâ ce-desot coment refèrence :",
-       "move-over-sharedrepo": "== Lo fichiér ègziste ==\n[[:$1]] ègziste ja sur un dèpôt partagiê. Renomar cél fichiér rendrat lo fichiér sur lo dèpôt partagiê pas accèssiblo.",
-       "file-exists-sharedrepo": "Lo nom chouèsi est ja utilisâ per un fichiér sur un dèpôt partagiê.\nNen volyéd chouèsir un ôtro.",
-       "export": "Èxportar des pâges",
-       "exporttext": "Vos pouede èxportar en XML lo tèxto et l’historico d’una pâge ou ben d’un ensemblo de pâges ;\nlo rèsultat pôt adonc étre importâ dens un ôtro vouiqui qu’utilise la programeria MediaWiki avouéc la [[Special:Import|pâge d’importacion]].\n\nPor èxportar des pâges, buchiéd lors titros dens la bouèta de tèxto ce-desot, yon titro per legne, et pués chouèsésséd se vos voléd ou pas la vèrsion d’ora avouéc totes les vielyes vèrsions, avouéc les legnes de l’historico de la pâge, ou ben simplament la pâge d’ora avouéc des enformacions sur lo dèrriér changement.\n\nDens cél dèrriér câs, vos pouede asse-ben utilisar un lim, coment [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] por la pâge « [[{{MediaWiki:Mainpage}}]] ».",
+       "revertmove": "rèvocar",
+       "delete_and_move_text": "La pâge de dèstinacion « [[:$1]] » ègziste ja.\nVos la voléd suprimar por pèrmetre lo changement de nom ?",
+       "delete_and_move_confirm": "Ouè, suprimar la pâge",
+       "delete_and_move_reason": "Suprimâye por pèrmetre lo changement de nom dês « [[$1]] »",
+       "selfmove": "Los titros d’origina et de dèstinacion sont los mémos ;\ny at pas moyen de dèplaciér na pâge vers lyé-méma.",
+       "immobile-source-namespace": "Vos pouede pas dèplaciér les pâges dedens l’èspâço de noms « $1 ».",
+       "immobile-target-namespace": "Vos pouede pas dèplaciér de pâges vers l’èspâço de noms « $1 ».",
+       "immobile-target-namespace-iw": "Los lims entèrvouiquis sont pas na ciba justa por los changements de nom.",
+       "immobile-source-page": "Cela pâge est pas dèplaçâbla.",
+       "immobile-target-page": "Y at pas moyen de dèplaciér vers cél titro de dèstinacion.",
+       "bad-target-model": "La dèstinacion volua emplèye un ôtro modèlo de contegnu. Y at pas moyen de convèrtir de $1 vers $2.",
+       "imagenocrossnamespace": "Y at pas moyen de dèplaciér un fichiér vers un èspâço de noms ôtro que « {{ns:file}} ».",
+       "nonfile-cannot-move-to-file": "Y at pas moyen de dèplaciér quârque-ren d’ôtro qu’un fichiér vers l’èspâço de noms « {{ns:file}} ».",
+       "imagetypemismatch": "La novèla èxtension du fichiér corrèspond pas a son tipo.",
+       "imageinvalidfilename": "Lo nom du fichiér ciba est pas justo.",
+       "fix-double-redirects": "Betar a jorn totes les redirèccions que pouentont vers lo titro originâl",
+       "move-leave-redirect": "Lèssiér na redirèccion",
+       "protectedpagemovewarning": "<strong>Atencion :</strong> cela pâge est étâye protègiêe por que solament los utilisators qu’ant los drêts d’administrator la pouessont dèplaciér.\nLa dèrriére entrâ du jornâl est balyêe ce-desot coment rèference :",
+       "semiprotectedpagemovewarning": "<strong>Nota :</strong> cela pâge est étâye protègiêe por que solament los utilisators encartâs la pouessont dèplaciér.\nLa dèrriére entrâ du jornâl est balyêe ce-desot coment rèference :",
+       "move-over-sharedrepo": "[[:$1]] ègziste ja sur un dèpôt partagiê. Dèplaciér un fichiér vers cél titro ècllaferat lo fichiér partagiê.",
+       "file-exists-sharedrepo": "Lo nom de fichiér chouèsi est ja empleyê sur un dèpôt partagiê.\nSe vos plét, chouèsésséd-nen un ôtro.",
+       "export": "Èxportar de pâges",
+       "exporttext": "Vos pouede èxportar en XML lo tèxto et l’historico d’una pâge d’un ensemblo de pâges.\nAdonc lo rèsultat pôt étre importâ dens un ôtro vouiqui qu’emplèye la programeria MediaWiki avouéc la [[Special:Import|pâge d’importacion]].\n\nPor èxportar de pâges, buchiéd lors titros dedens la bouèta de tèxto ce-desot, un titro per legne, et pués chouèsésséd se vos voléd la vèrsion d’ora avouéc totes les vielyes vèrsions, avouéc les legnes de l’historico de la pâge, ou ben simplament la pâge d’ora avouéc des enformacions sur lo dèrriér changement.\n\nDens cél dèrriér câs, vos pouede asse-ben empleyér un lim, coment [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] por la pâge « [[{{MediaWiki:Mainpage}}]] ».",
        "exportall": "Èxportar totes les pâges",
-       "exportcuronly": "Èxportar ren que la vèrsion d’ora, sen l’historico complèt",
-       "exportnohistory": "----\n'''Nota :''' l’èxportacion de l’historico complèt de les pâges avouéc ceti formulèro at étâ dèsactivâ por des rêsons de capacitât.",
-       "exportlistauthors": "Encllure una lista complèta ux contributors por châque pâge",
+       "exportcuronly": "Rapondre mas que la vèrsion d’ora, sen l’historico complèt",
+       "exportnohistory": "----\n<strong>Nota :</strong> l’èxportacion de l’historico complèt de les pâges avouéc cél formulèro est étâye dèsactivâye por des rêsons de capacitât.",
+       "exportlistauthors": "Rapondre na lista complèta des contributors por châque pâge",
        "export-submit": "Èxportar",
-       "export-addcattext": "Apondre les pâges de la catègorie :",
+       "export-addcattext": "Apondre de pâges de la catègoria :",
        "export-addcat": "Apondre",
-       "export-addnstext": "Apondre des pâges dens l’èspâço de noms :",
+       "export-addnstext": "Apondre de pâges de l’èspâço de noms :",
        "export-addns": "Apondre",
-       "export-download": "Encartar dens un fichiér",
-       "export-templates": "Encllure los modèlos",
-       "export-pagelinks": "Encllure les pâges liyês a una provondior de :",
+       "export-download": "Encartar dedens un fichiér",
+       "export-templates": "Rapondre los modèlos",
+       "export-pagelinks": "Rapondre les pâges liyêes a na provondior de :",
+       "export-manual": "Apondre de pâges a la man :",
        "allmessages": "Mèssâjos sistèmo",
-       "allmessagesname": "Nom du mèssâjo",
-       "allmessagesdefault": "Mèssâjo per dèfôt",
-       "allmessagescurrent": "Tèxto d’ora",
-       "allmessagestext": "O est la lista des mèssâjos sistèmo disponiblos dens l’èspâço MediaWiki.\nVolyéd visitar la [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation localisacion de MediaWiki] et pués [//translatewiki.net translatewiki.net] se vos voléd contribuar a la localisacion g·ènèrica de MediaWiki.",
-       "allmessagesnotsupportedDB": "Ceta pâge '''{{ns:special}}:Allmessages''' est inutilisâbla perce que '''$wgUseDatabaseMessages''' at étâ dèsactivâ.",
+       "allmessagesname": "Nom",
+       "allmessagesdefault": "Tèxto du mèssâjo per dèfôt",
+       "allmessagescurrent": "Tèxto du mèssâjo d’ora",
+       "allmessagestext": "O est na lista des mèssâjos sistèmo disponiblos dedens l’èspâço de noms MediaWiki.\nSe vos plét, vesitâd la [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation localisacion de MediaWiki] et pués [//translatewiki.net translatewiki.net] se vos voléd contribuar a la localisacion g·ènèrâla de MediaWiki.",
+       "allmessagesnotsupportedDB": "Cela pâge est pas empleyâbla, <strong>$wgUseDatabaseMessages</strong> est étâ dèsactivâ.",
        "allmessages-filter-legend": "Filtro",
-       "allmessages-filter": "Filtrar per ètat de changement :",
+       "allmessages-filter": "Filtrar per ètat de pèrsonalisacion :",
        "allmessages-filter-unmodified": "Pas changiê",
        "allmessages-filter-all": "Tôs",
        "allmessages-filter-modified": "Changiê",
        "allmessages-prefix": "Filtrar per prèfixo :",
        "allmessages-language": "Lengoua :",
-       "allmessages-filter-submit": "Aplicar",
+       "allmessages-filter-submit": "Emmodar",
+       "allmessages-filter-translate": "Traduire",
        "thumbnail-more": "Agrantir",
-       "filemissing": "Fichiér manquent",
-       "thumbnail_error": "Èrror pendent la crèacion de la figura : $1",
-       "djvu_page_error": "Pâge DjVu en defôr de les limites",
-       "djvu_no_xml": "Empossiblo de rècupèrar lo XML por lo fichiér DjVu",
-       "thumbnail-temp-create": "Empossiblo de fâre lo fichiér de figura temporèra",
-       "thumbnail-dest-create": "Empossiblo d’encartar la figura sur la dèstinacion",
-       "thumbnail_invalid_params": "Paramètres de la figura fôx",
-       "thumbnail_dest_directory": "Empossiblo de fâre lo rèpèrtouèro de dèstinacion",
+       "filemissing": "Fichiér entrovâblo",
+       "thumbnail_error": "Fôta pendent la crèacion de la miniatura : $1",
+       "thumbnail_error_remote": "Mèssâjo de fôta de $1 :\n$2",
+       "djvu_page_error": "Pâge DjVu en defôr de portâ",
+       "djvu_no_xml": "Y at pas moyen de rècupèrar lo XML por lo fichiér DjVu",
+       "thumbnail-temp-create": "Y at pas moyen de fâre lo fichiér de miniatura temporèro",
+       "thumbnail-dest-create": "Y at pas moyen d’encartar la miniatura sur la dèstinacion",
+       "thumbnail_invalid_params": "Paramètros de la miniatura pas justos",
+       "thumbnail_toobigimagearea": "Fichiér avouéc des dimensions d’amont $1",
+       "thumbnail_dest_directory": "Y at pas moyen de fâre lo rèpèrtouèro de dèstinacion",
        "thumbnail_image-type": "Tipo d’émâge pas recognu",
        "thumbnail_gd-library": "Configuracion encomplèta de la bibliotèca GD : fonccion $1 entrovâbla",
-       "thumbnail_image-missing": "Ceti fichiér est entrovâblo : $1",
-       "import": "Importar des pâges",
-       "importinterwiki": "Importacion entèrvouiqui",
-       "import-interwiki-text": "Chouèsésséd un vouiqui et un titro de pâge a importar.\nLes dâtes de les vèrsions et los noms ux contributors seront presèrvâs.\nTotes les accions d’importacion entèrvouiqui sont consignês dens lo [[Special:Log/import|jornal de les importacions]].",
-       "import-interwiki-history": "Copiyér totes les vèrsions de l’historico de ceta pâge",
-       "import-interwiki-templates": "Encllure tôs los modèlos",
+       "thumbnail_image-missing": "Lo fichiér semble étre entrovâblo : $1",
+       "thumbnail_image-failure-limit": "Dês pou y at avu un mouél d’èprôves pas reussies ($1 ou ben més) por rèstituar cela miniatura. Se vos plét, tornâd èprovar ples târd.",
+       "import": "Importar de pâges",
+       "importinterwiki": "Importar dês un ôtro vouiqui",
+       "import-interwiki-text": "Chouèsésséd un vouiqui et pués un titro de pâge a importar.\nLes dâtes de les vèrsions et los noms des contributors seront presèrvâs.\nTotes les importacions dês d’ôtros vouiquis sont encartâyes dessus lo [[Special:Log/import|jornâl de les importacions]].",
+       "import-interwiki-sourcewiki": "Vouiqui d’origina :",
+       "import-interwiki-sourcepage": "Pâge d’origina :",
+       "import-interwiki-history": "Copiyér totes les vèrsions de l’historico de cela pâge",
+       "import-interwiki-templates": "Rapondre tôs los modèlos",
        "import-interwiki-submit": "Importar",
+       "import-mapping-default": "Importar ux endrêts per dèfôt",
+       "import-mapping-namespace": "Importar vers un èspâço de noms :",
+       "import-mapping-subpage": "Importar coment sot-pâges de cela pâge-que :",
        "import-upload-filename": "Nom du fichiér :",
        "import-comment": "Comentèro :",
-       "importtext": "Volyéd èxportar lo fichiér dês lo vouiqui d’origina en utilisent son [[Special:Export|outil d’èxportacion]].\nSôvâd-lo sur voutron ordenator et pués tèlèchargiéd-lo ique.",
+       "importtext": "Se vos plét, èxportâd lo fichiér dês lo vouiqui d’origina en empleyent son [[Special:Export|outil d’èxportacion]].\nEncartâd-lo sur voutron ordenator et pués tèlèchargiéd-lo ique.",
        "importstart": "Importacion de les pâges...",
        "import-revision-count": "$1 vèrsion{{PLURAL:$1||s}}",
-       "importnopages": "Gins de pâge a importar.",
-       "imported-log-entries": "$1 entrâ{{PLURAL:$1||s}} du jornal importâ{{PLURAL:$1||s}}.",
+       "importnopages": "Niona pâge a importar.",
+       "imported-log-entries": "$1 entr{{PLURAL:$1|â|ês}} du jornâl importâye{{PLURAL:$1||s}}.",
        "importfailed": "Falyita de l’importacion : <nowiki>$1</nowiki>",
        "importunknownsource": "Tipo de la sôrsa a importar encognu",
-       "importcantopen": "Empossiblo d’uvrir lo fichiér a importar",
+       "importcantopen": "Y at pas moyen d’uvrir lo fichiér a importar",
        "importbadinterwiki": "Crouyo lim entèrvouiqui",
-       "importsuccess": "L’importacion at reussia !",
-       "importnosources": "Niona sôrsa d’importacion entèrvouiqui at étâ dèfenia et los tèlèchargements drêts d’historicos sont dèsactivâs.",
-       "importnofile": "Nion fichiér a importar at étâ tèlèchargiê.",
-       "importuploaderrorsize": "Lo tèlèchargement du fichiér a importar at pas reussi.\nSa talye est ples granta que cela ôtorisâ.",
-       "importuploaderrorpartial": "Lo tèlèchargement du fichiér a importar at pas reussi.\nSon contegnu at étâ tèlèchargiê ren qu’a mêtiêt.",
-       "importuploaderrortemp": "Lo tèlèchargement du fichiér a importar at pas reussi.\nUn dossiér temporèro est manquent.",
+       "importsuccess": "L’importacion at reussi !",
+       "importnosources": "Nion vouiqui d’origina est étâ dèfeni et pués los tèlèchargements drêts d’historicos sont dèsactivâs.",
+       "importnofile": "Nion fichiér a importar est étâ tèlèchargiê.",
+       "importuploaderrorsize": "Lo tèlèchargement du fichiér a importar at pas reussi.\nSa talye est ples granta que cela ôtorisâye.",
+       "importuploaderrorpartial": "Lo tèlèchargement du fichiér a importar at pas reussi.\nSon contegnu est étâ tèlèchargiê ren qu’a mêtiêt.",
+       "importuploaderrortemp": "Lo tèlèchargement du fichiér a importar at pas reussi.\nUn dossiér temporèro est entrovâblo.",
        "import-parse-failure": "Falyita pendent l’analise du XML a importar",
-       "import-noarticle": "Gins de pâge a importar !",
-       "import-nonewrevisions": "Totes les vèrsions ont étâ importâs dês devant.",
+       "import-noarticle": "Niona pâge a importar !",
+       "import-nonewrevisions": "Niona vèrsion importâye (totes érant ja presentes ou ben ignorâyes a côsa de fôtes).",
        "xml-error-string": "$1 a la legne $2, colona $3 (octèt $4) : $5",
        "import-upload": "Tèlèchargement de balyês XML",
-       "import-token-mismatch": "Pèrta de les balyês de sèance.\nVolyéd tornar èprovar.",
-       "import-invalid-interwiki": "Empossiblo d’importar dês lo vouiqui spècefiâ.",
-       "import-error-edit": "La pâge « $1 » est pas importâ perce que vos éte pas ôtorisâ a la changiér.",
-       "import-error-create": "La pâge « $1 » est pas importâ perce que vos éte pas ôtorisâ a la fâre.",
+       "import-token-mismatch": "Pèrda de les balyês de sèssion.\n\nPôt-étre vos éte étâ dèbranchiê. <strong>Se vos plét, controlâd que vos éte adés branchiê et pués tornâd èprovar.</strong>\nSe cen tôrne pas reussir, èprovâd de vos [[Special:UserLogout|dèbranchiér]] et pués de vos tornar branchiér, et controlâd que voutron navegator accèpte los raportiors (<em>cookies</em>) de cél seto.",
+       "import-invalid-interwiki": "Y at pas moyen d’importar dês lo vouiqui spècifiâ.",
+       "import-error-edit": "La pâge « $1 » est pas étâye importâye, vos éte pas ôtorisâ a la changiér.",
+       "import-error-create": "La pâge « $1 » est pas étâye importâye, vos éte pas ôtorisâ a la fâre.",
+       "import-error-interwiki": "La pâge « $1 » est pas étâye importâye, son nom est resèrvâ por un lim de defôr (entèrvouiqui).",
+       "import-error-special": "La pâge « $1 » est pas étâye importâye, el est a un èspâço de noms spèciâl qu’ôtorise gins de pâge.",
+       "import-error-invalid": "La pâge « $1 » est pas étâye importâye, lo nom que lyé serêt étâye importâye desot est pas justo sur cél vouiqui.",
+       "import-error-unserialize": "La vèrsion $2 de la pâge « $1 » pôt pas étre dèssèrialisâye. La vèrsion ére raportâye coment empleyent lo modèlo de contegnu $3 sèrialisâ en $4.",
+       "import-error-bad-location": "La vèrsion $2 qu’emplèye lo modèlo de contegnu $3 at pas possu étre stocâye dessus « $1 » sur cél vouiqui-que, cél modèlo est pas recognu sur cela pâge.",
        "import-options-wrong": "{{PLURAL:$2|Crouyo chouèx|Crouyos chouèx}} : <nowiki>$1</nowiki>",
-       "importlogpage": "Jornal de les importacions",
+       "import-rootpage-invalid": "La pâge racena balyêe est un titro pas justo.",
+       "import-rootpage-nosubpage": "L’èspâço de noms « $1 » de la pâge racena ôtorise pas les sot-pâges.",
+       "importlogpage": "Jornâl de les importacions",
        "importlogpagetext": "Importacions administratives de pâges avouéc lor historico de changements dês d’ôtros vouiquis.",
-       "import-logentry-upload-detail": "$1 vèrsion{{PLURAL:$1||s}}",
-       "import-logentry-interwiki-detail": "$1 vèrsion{{PLURAL:$1||s}} dês $2",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|vèrsion importâye|vèrsions importâyes}}",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|vèrsion importâye|vèrsions importâyes}} dês $2",
        "javascripttest": "Èprôva de JavaScript",
+       "javascripttest-pagetext-noframework": "Cela pâge est resèrvâye por l’ègzécucion de les èprôves de JavaScript.",
+       "javascripttest-pagetext-unknownframework": "Câdro d’èprôva « $1 » encognu.",
+       "javascripttest-pagetext-unknownaction": "Accion « $1 » encognua.",
+       "javascripttest-pagetext-frameworks": "Se vos plét, chouèsésséd yon de celos câdros d’èprôva-que : $1",
+       "javascripttest-pagetext-skins": "Chouèsésséd un habelyâjo por emmodar les èprôves :",
        "javascripttest-qunit-intro": "Vêde la [$1 documentacion de les èprôves] dessus mediawiki.org.",
-       "tooltip-pt-userpage": "Voutra pâge usanciér",
-       "tooltip-pt-anonuserpage": "La pâge usanciér de l’adrèce IP avouéc laquinta vos contribuâd",
-       "tooltip-pt-mytalk": "Voutra pâge de discussion",
-       "tooltip-pt-anontalk": "La pâge de discussion por les contribucions dês cela adrèce IP",
-       "tooltip-pt-preferences": "Voutres prèferences",
-       "tooltip-pt-watchlist": "La lista de les pâges que vos siude los changements",
-       "tooltip-pt-mycontris": "La lista de voutres contribucions",
-       "tooltip-pt-login": "Vos éte encoragiê a vos branchiér ; portant o est pas oblegatouèro.",
+       "tooltip-pt-userpage": "{{GENDER:|Voutra}} pâge utilisator",
+       "tooltip-pt-anonuserpage": "La pâge utilisator por l’adrèce IP que vos empleyéd",
+       "tooltip-pt-mytalk": "{{GENDER:|Voutra}} pâge de discussion",
+       "tooltip-pt-anontalk": "Discussion sur los changements fêts dês cel’adrèce IP",
+       "tooltip-pt-preferences": "{{GENDER:|Voutres}} prèferences",
+       "tooltip-pt-watchlist": "Na lista de les pâges que vos gouardâd los changements",
+       "tooltip-pt-mycontris": "Na lista de {{GENDER:|voutres}} contribucions",
+       "tooltip-pt-anoncontribs": "Na lista des changements fêts dês cel’adrèce IP",
+       "tooltip-pt-login": "Vos éte encoragiê a vos branchiér ; portant o est pas oblegatouèro",
        "tooltip-pt-logout": "Sè dèbranchiér",
-       "tooltip-pt-createaccount": "Vos éte encoragiê a fâre un comptio et pués a vos branchiér ; portant o est pas oblegatouèro.",
-       "tooltip-ca-talk": "Discussion dessus cela pâge de contegnu",
+       "tooltip-pt-createaccount": "Vos éte encoragiê a fâre un comptio et pués a vos branchiér ; portant o est pas oblegatouèro",
+       "tooltip-ca-talk": "Discussion sur lo contegnu de la pâge",
        "tooltip-ca-edit": "Changiér cela pâge",
-       "tooltip-ca-addsection": "Comenciér una novèla sèccion",
-       "tooltip-ca-viewsource": "Ceta pâge est protègiêye.\nPortant vos en pouede vêre lo sin tèxto sôrsa",
+       "tooltip-ca-addsection": "Comenciér na novèla sèccion",
+       "tooltip-ca-viewsource": "Cela pâge est protègiêe.\nPortant vos en pouede vêre son tèxto sôrsa",
        "tooltip-ca-history": "Vèrsions passâyes de cela pâge",
-       "tooltip-ca-protect": "Protègiér ceta pâge",
-       "tooltip-ca-unprotect": "Changiér la protèccion de ceta pâge",
-       "tooltip-ca-delete": "Suprimar ceta pâge",
-       "tooltip-ca-undelete": "Refâre los changements fêts sur ceta pâge devant sa suprèssion",
-       "tooltip-ca-move": "Renomar ceta pâge",
+       "tooltip-ca-protect": "Protègiér cela pâge",
+       "tooltip-ca-unprotect": "Changiér la protèccion de cela pâge",
+       "tooltip-ca-delete": "Suprimar cela pâge",
+       "tooltip-ca-undelete": "Refâre los changements fêts sur cela pâge devant sa suprèssion",
+       "tooltip-ca-move": "Dèplaciér cela pâge",
        "tooltip-ca-watch": "Apondre cela pâge a voutra lista de gouârda",
-       "tooltip-ca-unwatch": "Enlevar ceta pâge de voutra lista de survelyence",
+       "tooltip-ca-unwatch": "Enlevar cela pâge de voutra lista de gouârda",
        "tooltip-search": "Rechèrchiér dedens {{SITENAME}}",
-       "tooltip-search-go": "Alar de vers na pâge que pôrte justo cél nom s’ègziste.",
-       "tooltip-search-fulltext": "Rechèrchiér les pâges que presentont cél tèxto.",
+       "tooltip-search-go": "Emmodar vers na pâge que pôrte justo cél nom s’ègziste",
+       "tooltip-search-fulltext": "Rechèrchiér les pâges que presentont cél tèxto",
        "tooltip-p-logo": "Vesitar la pâge principâla",
        "tooltip-n-mainpage": "Vesitar la pâge principâla",
        "tooltip-n-mainpage-description": "Vesitar la pâge principâla",
-       "tooltip-n-portal": "Dessus lo projèt, cen que vos pouede fâre, yô que trovar les chouses.",
-       "tooltip-n-currentevents": "Trovar les enformacions de fond dessus les dèrriéres novèles",
+       "tooltip-n-portal": "Sur lo projèt, cen que vos pouede fâre, yô que trovar de chouses",
+       "tooltip-n-currentevents": "Trovar les enformacions de fond sur les novèles d’ora",
        "tooltip-n-recentchanges": "Na lista des dèrriérs changements sur lo vouiqui",
-       "tooltip-n-randompage": "Fâre vêre na pâge a l’hasârd",
-       "tooltip-n-help": "L’endrêt por nen savêr més.",
-       "tooltip-t-whatlinkshere": "Na lista de les pâges liyêes a ceta",
+       "tooltip-n-randompage": "Chargiér na pâge a l’hasârd",
+       "tooltip-n-help": "L’endrêt por nen savêr més",
+       "tooltip-t-whatlinkshere": "Na lista de totes les pâges du vouiqui liyêes a ceta",
        "tooltip-t-recentchangeslinked": "Dèrriérs changements de les pâges liyêes a ceta",
-       "tooltip-feed-rss": "Flux RSS por ceta pâge",
-       "tooltip-feed-atom": "Flux Atom por ceta pâge",
-       "tooltip-t-contributions": "Vêre la lista de les contribucions de cet’utilisator",
-       "tooltip-t-emailuser": "Mandar un mèssâjo a ceti usanciér",
-       "tooltip-t-upload": "Tèlèchargiér des fichiérs",
+       "tooltip-feed-rss": "Flux RSS por cela pâge",
+       "tooltip-feed-atom": "Flux Atom por cela pâge",
+       "tooltip-t-contributions": "Na lista de les contribucions de {{GENDER:$1|cél utilisator|cel’utilisatrice}}",
+       "tooltip-t-emailuser": "Mandar un mèssâjo a {{GENDER:$1|cél utilisator|cel’utilisatrice}}",
+       "tooltip-t-info": "Més d’enformacions sur cela pâge",
+       "tooltip-t-upload": "Tèlèchargiér de fichiérs",
        "tooltip-t-specialpages": "Na lista de totes les pâges spèciâles",
        "tooltip-t-print": "Vèrsion emprimâbla de cela pâge",
        "tooltip-t-permalink": "Lim fixo de vers cela vèrsion de la pâge",
        "tooltip-ca-nstab-main": "Vêre la pâge de contegnu",
        "tooltip-ca-nstab-user": "Vêre la pâge utilisator",
-       "tooltip-ca-nstab-media": "Vêre la pâge du fichiér mèdia",
-       "tooltip-ca-nstab-special": "O est na pâge spèciâla que pôt pas étre changiêe.",
+       "tooltip-ca-nstab-media": "Vêre la pâge du fichiér multimèdiâ",
+       "tooltip-ca-nstab-special": "O est na pâge spèciâla que pôt pas étre changiêe",
        "tooltip-ca-nstab-project": "Vêre la pâge projèt",
        "tooltip-ca-nstab-image": "Vêre la pâge du fichiér",
        "tooltip-ca-nstab-mediawiki": "Vêre lo mèssâjo sistèmo",
        "tooltip-ca-nstab-template": "Vêre lo modèlo",
        "tooltip-ca-nstab-help": "Vêre la pâge d’éde",
-       "tooltip-ca-nstab-category": "Vêre la pâge de la catègorie",
+       "tooltip-ca-nstab-category": "Vêre la pâge de la catègoria",
        "tooltip-minoredit": "Marcar mos changements coment petiôts",
-       "tooltip-save": "Sôvar voutros changements",
-       "tooltip-preview": "Volyéd prèvisualisar voutros changements devant que los sôvar !",
-       "tooltip-diff": "Pèrmèt de montrar los changements que vos éd fêts",
-       "tooltip-compareselectedversions": "Fâre ressortir les difèrences entre doves vèrsions de ceta pâge",
-       "tooltip-watch": "Apondre ceta pâge a voutra lista de survelyence",
+       "tooltip-save": "Encartar voutros changements",
+       "tooltip-preview": "Prèvêde voutros changements. Se vos plét, empleyéd-lo devant qu’encartar.",
+       "tooltip-diff": "Montrar los changements que vos éd aportâs u tèxto",
+       "tooltip-compareselectedversions": "Fâre ressortir les difèrences entre les doves vèrsions chouèsies de cela pâge",
+       "tooltip-watch": "Apondre cela pâge a voutra lista de gouârda",
        "tooltip-watchlistedit-normal-submit": "Enlevar los titros",
-       "tooltip-watchlistedit-raw-submit": "Betar a jorn la lista de survelyence",
-       "tooltip-recreate": "Refâre la pâge mémo se ceta at étâ suprimâ",
+       "tooltip-watchlistedit-raw-submit": "Betar a jorn la lista de gouârda",
+       "tooltip-recreate": "Refâre la pâge quand ben que ceta est étâye suprimâye",
        "tooltip-upload": "Emmodar lo tèlèchargement",
-       "tooltip-rollback": "« Rèvocar » anule tot d’un côp lo ou ben los changement(s) de cela pâge per lo dèrriér contributor.",
-       "tooltip-undo": "« Dèfâre » rèvoque ceti changement et ôvre la fenétra d’èdicion en fôrma de prèvisualisacion.\nPèrmèt de rètablir la vèrsion devant et pués d’apondre una rêson dens la bouèta de rèsumâ.",
+       "tooltip-rollback": "« Rèvocar » anule tot d’un côp lo(s) changement(s) de cela pâge per lo dèrriér contributor",
+       "tooltip-undo": "« Dèfâre » anule cél changement et pués ôvre la fenétra de changement en fôrma d’apèrçu. Pèrmèt d’apondre na rêson dens lo rèsumâ.",
        "tooltip-preferences-save": "Encartar les prèferences",
        "tooltip-summary": "Buchiéd un côrt rèsumâ",
        "common.css": "/* Lo code CSS betâ ique serat aplicâ a tôs los habelyâjos. */",
        "group-bot.js": "/* Tot code JavaScript betâ ique serat chargiê ren que por los bots. */",
        "group-sysop.js": "/* Tot code JavaScript betâ ique serat chargiê ren que por los administrators. */",
        "group-bureaucrat.js": "/* Tot code JavaScript betâ ique serat chargiê ren que por los grata-papiérs. */",
-       "anonymous": "{{PLURAL:$1|Usanciér pas encartâ|Usanciérs pas encartâs}} dessus {{SITENAME}}",
-       "siteuser": "l’usanciér{{GENDER:$2||e}} $1 de {{SITENAME}}",
-       "anonuser": "l’usanciér pas encartâ $1 de {{SITENAME}}",
-       "lastmodifiedatby": "Ceta pâge at étâ changiê por lo dèrriér côp lo $1 a $2 per $3.",
+       "anonymous": "{{PLURAL:$1|Utilisator anonimo|Utilisators anonimos}} dessus {{SITENAME}}",
+       "siteuser": "l’utilisat{{GENDER:$2|or|rice}} $1 de {{SITENAME}}",
+       "anonuser": "l’utilisator anonimo $1 de {{SITENAME}}",
+       "lastmodifiedatby": "Cela pâge est étâye changiêe por lo dèrriér côp lo $1 a $2 per $3.",
        "othercontribs": "Basâ sur l’ôvra a $1.",
        "others": "ôtros",
-       "siteusers": "{{PLURAL:$2|l’usanciér|los usanciérs}} $1 de {{SITENAME}}",
-       "anonusers": "{{PLURAL:$2|l’usanciér pas encartâ|los usanciérs pas encartâs}} $1 de {{SITENAME}}",
-       "creditspage": "Crèdits de la pâge",
-       "nocredits": "Y at gins d’enformacion d’atribucion disponibla por ceta pâge.",
-       "spamprotectiontitle": "Pâge protègiê ôtomaticament a côsa de spame",
-       "spamprotectiontext": "La pâge que vos éd tâchiê de sôvar at étâ blocâ per lo filtro anti-spame.\nO est probâblament diu a un lim de vers un seto de defôr qu’aparêt sur la lista nêre.",
-       "spamprotectionmatch": "La chêna de caractèros « '''$1''' » at dècllenchiê lo dècelior de spame.",
-       "spambot_username": "Neteyâjo de spame per MediaWiki",
+       "siteusers": "{{PLURAL:$2|{{GENDER:$1|l’utilisator|l’utilisatrice}}|{{Gender:$1|los utilisators|les utilisatrices}}}} $1 de {{SITENAME}}",
+       "anonusers": "{{PLURAL:$2|l’utilisator anonimo|los utilisators anonimos}} $1 de {{SITENAME}}",
+       "creditspage": "Atribucions de la pâge",
+       "nocredits": "Y at gins d’enformacion d’atribucion disponibla por cela pâge.",
+       "spamprotectiontitle": "Filtro de protèccion contre los mèssâjos cofos",
+       "spamprotectiontext": "Lo tèxto que vos éd volu encartar est étâ blocâ per lo filtro contre los mèssâjos cofos.\nO est probâblament diu a un lim de vers un seto de defôr qu’aparêt sur la lista nêre.",
+       "spamprotectionmatch": "Cél tèxto-que est cen qu’at dècllenchiê noutron filtro contre los mèssâjos cofos : $1",
+       "spambot_username": "Neteyâjo de mèssâjos cofos per MediaWiki",
        "spam_reverting": "Rètablissement de la dèrriére vèrsion que contint gins de lim de vers $1",
-       "spam_blanking": "Totes les vèrsions que contegnont des lims de vers $1 sont blanchies",
-       "spam_deleting": "Totes les vèrsions que contegnont des lims de vers $1 sont suprimâs",
-       "simpleantispam-label": "Contrôlo anti-spame.\nEnscrîde '''REN''' ique !",
+       "spam_blanking": "Totes les vèrsions que contegnont de lims de vers $1 sont blanchies",
+       "spam_deleting": "Totes les vèrsions que contegnont de lims de vers $1 sont suprimâyes",
+       "simpleantispam-label": "Contrôlo contre los mèssâjos cofos.\nEmpléd <strong>ren</strong> ique !",
        "pageinfo-title": "Enformacions por « $1 »",
+       "pageinfo-not-current": "Dèsolâ, y at pas moyen de balyér cel’enformacion por les vielyes vèrsions.",
        "pageinfo-header-basic": "Enformacions de bâsa",
        "pageinfo-header-edits": "Historico des changements",
        "pageinfo-header-restrictions": "Protèccion de la pâge",
        "pageinfo-header-properties": "Propriètâts de la pâge",
        "pageinfo-display-title": "Titro montrâ",
-       "pageinfo-default-sort": "Cllâf de tri per dèfôt",
+       "pageinfo-default-sort": "Cllâf de chouèx per dèfôt",
        "pageinfo-length": "Talye de la pâge (en octèts)",
-       "pageinfo-article-id": "Numerô de la pâge",
+       "pageinfo-article-id": "Identifient de la pâge",
        "pageinfo-language": "Lengoua du contegnu de la pâge",
+       "pageinfo-content-model": "Modèlo de contegnu de la pâge",
        "pageinfo-robot-policy": "Statut de motor de rechèrche",
        "pageinfo-robot-index": "Endèxâblo",
        "pageinfo-robot-noindex": "Pas endèxâblo",
        "percent": "$1&#160;%",
        "imgmultipageprev": "← pâge devant",
        "imgmultipagenext": "pâge aprés →",
-       "imgmultigo": "Listar !",
+       "imgmultigo": "Emmodar !",
        "imgmultigoto": "Alar a la pâge $1",
+       "img-lang-go": "Emmodar",
        "ascending_abbrev": "que crêt",
        "descending_abbrev": "que dècrêt",
        "table_pager_next": "Pâge aprés",
        "table_pager_last": "Dèrriére pâge",
        "table_pager_limit": "Montrar $1 èlèment{{PLURAL:$1||s}} per pâge",
        "table_pager_limit_label": "Rèsultats per pâge :",
-       "table_pager_limit_submit": "Listar",
+       "table_pager_limit_submit": "Emmodar",
        "table_pager_empty": "Gins de rèsultat",
        "autosumm-blank": "Pâge blanchia",
        "autosumm-replace": "Contegnu remplaciê per « $1 »",
        "version-entrypoints": "URL de pouent d’entrâ",
        "version-entrypoints-header-entrypoint": "Pouent d’entrâ",
        "version-entrypoints-header-url": "URL",
+       "redirect-submit": "Emmodar",
        "fileduplicatesearch": "Rechèrche des fichiérs en doblo",
        "fileduplicatesearch-summary": "Rechèrche des fichiérs en doblo d’aprés lor mârca de chaplâjo.",
        "fileduplicatesearch-legend": "Rechèrche d’un doblo",
index 490a0f2..0306e65 100644 (file)
        "recentchanges-label-bot": "Feranrang faan en bot",
        "recentchanges-label-unpatrolled": "Detdiar feranrang as noch ei efterluket wurden",
        "recentchanges-label-plusminus": "Feranert sidjengrate (am soföl bytes)",
-       "recentchanges-legend-heading": "'''Ferklaarang:'''",
+       "recentchanges-legend-heading": "<strong>Ferklaarang:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (luke uk bi't [[Special:NewPages|list mä nei sidjen]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Diar {{PLURAL:$5|woort det feranrang|wurd a feranrangen}} sant <strong>$3,$4</strong>uunwiset (ei muar üs <strong>$1</strong> feranrangen).",
index 551586e..42da004 100644 (file)
        "recentchanges-label-bot": "Chest cambiament al è stât eseguît di un bot",
        "recentchanges-label-unpatrolled": "Chest cambiament nol è stât ancjemò verificât",
        "recentchanges-label-plusminus": "La dimension de pagjine e je cambiade di chest numar di byte",
-       "recentchanges-legend-heading": "'''Lejende:'''",
+       "recentchanges-legend-heading": "<strong>Lejende:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (cjale lis [[Special:NewPages|gnovis pagjinis]])",
        "rcnotefrom": "Ca sot i cambiaments dal '''$2''' (fintremai al '''$1''').",
        "rclistfrom": "Mostre i ultins cambiaments dal $3 $2",
index 742f244..80329a0 100644 (file)
        "recentchanges-label-minor": "Dit is in tekstwiziging",
        "recentchanges-label-bot": "Dizze wiziging is troch in robot makke",
        "recentchanges-label-unpatrolled": "Dizze wiziging is noch net neisjûn",
-       "recentchanges-legend-heading": "'''Leginda:'''",
+       "recentchanges-legend-heading": "<strong>Leginda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sjoch ek de [[Special:NewPages|list mei nije siden]])",
        "rcnotefrom": "Dit binne de feroarings sûnt <b>$2</b> (maksimaal <b>$1</b>).",
        "rclistfrom": "Jou nije feroarings, begjinnende mei $3 $2",
index 0beaec8..fce0339 100644 (file)
@@ -19,7 +19,8 @@
                        "පසිඳු කාවින්ද",
                        "아라",
                        "SeoMac",
-                       "Macofe"
+                       "Macofe",
+                       "Tem"
                ]
        },
        "tog-underline": "Folínte faoi naisc:",
        "articlepage": "Féach ar an alt",
        "talk": "Plé",
        "views": "Radhairc",
-       "toolbox": "Bosca uirlisí",
+       "toolbox": "Uirlisí",
        "userpage": "Féach ar lch úsáideora",
        "projectpage": "Féach ar lch thionscadail",
        "imagepage": "Féach ar lch comhaid",
index 2f731f2..1bb1745 100644 (file)
        "recentchanges-label-bot": "'S e bot a rinn an deasachadh seo",
        "recentchanges-label-unpatrolled": "Cha do chuir freiceadan comharra ris an deasachadh seo fhathast",
        "recentchanges-label-plusminus": "Seo meud atharrachadh na duilleige ann am byte",
-       "recentchanges-legend-heading": "'''Treòir:'''",
+       "recentchanges-legend-heading": "<strong>Treòir:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (faic [[Special:NewPages|liosta nan duilleagan ùra]] cuideachd)",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "Chì thu {{PLURAL:$5|am mùthadh|na mùthaidhean|na mùthaidhean|na mùthaidhean}} o <strong>$3 $4</strong> (gu ruige <strong>$1</strong> dhiubh) gu h-ìosal.",
index 5c31b88..ddd17dd 100644 (file)
@@ -21,7 +21,8 @@
                        "Breogan2008",
                        "VaiPolaSombra",
                        "Macofe",
-                       "Banjo"
+                       "Banjo",
+                       "Josep Maria Roca Peña"
                ]
        },
        "tog-underline": "Subliñar as ligazóns:",
        "moredotdotdot": "Máis...",
        "morenotlisted": "Esta lista non está completa.",
        "mypage": "Páxina",
+       "anonuserpage": "Usuario descoñecido",
        "mytalk": "Conversa",
        "anontalk": "Conversa",
        "navigation": "Navegación",
        "nocookieslogin": "{{SITENAME}} usa cookies para rexistrar os usuarios.\nVostede ten as cookies deshabilitadas.\nPor favor, habilíteas e inténteo de novo.",
        "nocookiesfornew": "Non se creou a conta de usuario porque non puidemos confirmar a súa orixe.\nAsegúrese de que ten as cookies habilitadas, volva cargar a páxina e inténteo de novo.",
        "noname": "Non especificou un nome de usuario válido.",
-       "loginsuccesstitle": "Accedeu correctamente",
+       "loginsuccesstitle": "Conectado",
        "loginsuccess": "<strong>Accedeu ao sistema de {{SITENAME}} como \"$1\".</strong>",
        "nosuchuser": "Non existe ningún usuario chamado \"$1\".\nOs nomes de usuario diferencian entre maiúsculas e minúsculas.\nVerifique o nome que inseriu ou [[Special:UserLogin/signup|cree unha nova conta]].",
        "nosuchusershort": "Non existe ningún usuario chamado \"$1\".\nVerifique o nome que inseriu.",
        "createaccount-title": "Creación dunha conta para {{SITENAME}}",
        "createaccount-text": "Alguén creou unha conta chamada \"$2\" para o seu enderezo de correo electrónico en {{SITENAME}} ($4), e con contrasinal \"$3\".\nDebe acceder ao sistema e mudar o contrasinal agora.\n\nPode facer caso omiso desta mensaxe se se creou esta conta por erro.",
        "login-throttled": "Fixo demasiados intentos de acceder ao sistema.\nPor favor, agarde $1 antes de probar outra vez.",
-       "login-abort-generic": "Acceso ao sistema incorrecto; abortado",
+       "login-abort-generic": "Fallou o inicio de sesión - Cancelado",
        "login-migrated-generic": "A súa conta foi migrada e o seu nome de usuario xa non existe neste wiki.",
        "loginlanguagelabel": "Lingua: $1",
        "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.",
        "newpassword": "Contrasinal novo:",
        "retypenew": "Insira outra vez o novo contrasinal:",
        "resetpass_submit": "Establecer o contrasinal e acceder ao sistema",
-       "changepassword-success": "O seu contrasinal modificouse correctamente!",
+       "changepassword-success": "O seu contrasinal foi modificado!",
        "changepassword-throttled": "Fixo demasiados intentos de acceder ao sistema.\nPor favor, agarde $1 antes de probar outra vez.",
        "botpasswords": "Contrasinais de Bot",
        "botpasswords-summary": "Os <em>contrasinais de Bot</em> permiten acceder a unha conta de usuario por medio da API sen usar as crecenciais de acceso da conta principal. Os dereitos de usuario dispoñibles cando se accede ao sistema cun contrasinal de bot poden estar restrinxidos.",
        "botpasswords-insert-failed": "Erro ao engadir o nome de bot \"$1\". Revise se xa foi engadido previamente.",
        "botpasswords-update-failed": "Erro ao actualizar o nome de bot \"$1\". Revise se foi borrado.",
        "botpasswords-created-title": "Contrasinal de bot creado",
-       "botpasswords-created-body": "O contrasinal de bot \"$1\" creouse con éxito.",
+       "botpasswords-created-body": "Creouse o contrasinal para o bot de nome \"$1\" do usuario \"$2\".",
        "botpasswords-updated-title": "Contrasinal de bot actualizado",
-       "botpasswords-updated-body": "O contrasinal de bot \"$1\" actualizouse con éxito.",
+       "botpasswords-updated-body": "O contrasinal de bot do bot de nome \"$1\" do usuario \"$2\" foi actualizado.",
        "botpasswords-deleted-title": "Contrasinal de bot borrado",
-       "botpasswords-deleted-body": "O contrasinal de bot \"$1\" foi borrado.",
+       "botpasswords-deleted-body": "O contrasinal de bot do bot de nome \"$1\" do usuario \"$2\" foi borrado.",
        "botpasswords-newpassword": "O novo contrasinal para acceder con strong>$1</strong> é <strong>$2</strong>. <em>Por favor, rexistra isto para referencia futura.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider non está dispoñible.",
        "botpasswords-restriction-failed": "Restricións de contrasinal de bots evitaron esta conexión.",
        "revdelete-unsuppress": "Retirar as restricións sobre as revisións restauradas",
        "revdelete-log": "Motivo:",
        "revdelete-submit": "Aplicar {{PLURAL:$1|á revisión seleccionada|ás revisións seleccionadas}}",
-       "revdelete-success": "'''Actualizouse sen problemas a visibilidade da revisión.'''",
+       "revdelete-success": "Actualizouse a visibilidade da revisión.",
        "revdelete-failure": "'''Non se puido actualizar a visibilidade da revisión:'''\n$1",
-       "logdelete-success": "'''Configurouse sen problemas a visibilidade do rexistro.'''",
+       "logdelete-success": "Configurouse a visibilidade do rexistro.",
        "logdelete-failure": "'''A visibilidade do rexistro non pode ser fixada:'''\n$1",
        "revdel-restore": "cambiar a visibilidade",
        "pagehist": "Historial da páxina",
        "userrights-changeable-col": "Os grupos que pode cambiar",
        "userrights-unchangeable-col": "Os grupos que non pode cambiar",
        "userrights-conflict": "Hai un conflito na modificación dos dereitos de usuario! Por favor, revíseo e confirme os seus cambios.",
-       "userrights-removed-self": "Retirou correctamente os seus propios dereitos. Polo tanto, xa non ten acceso a esta páxina.",
+       "userrights-removed-self": "Retirou os seus propios dereitos. Polo tanto, xa non ten acceso a esta páxina.",
        "group": "Grupo:",
        "group-user": "Usuarios",
        "group-autoconfirmed": "Usuarios autoconfirmados",
        "uploadstash-summary": "Esta páxina proporciona acceso a ficheiros que xa están cargados (ou en proceso de carga), pero que aínda non están publicados no wiki. Estes ficheiros non son visibles para ninguén, agás para o usuario que os cargou.",
        "uploadstash-clear": "Borrar os ficheros agochados",
        "uploadstash-nofiles": "Non ten ningún ficheiro agochado.",
-       "uploadstash-badtoken": "A acción non se puido completar, seica porque caducou a información de acceso. Inténteo de novo.",
+       "uploadstash-badtoken": "A acción fallou, probablemente porque caducou a información de acceso. Por favor, inténteo de novo.",
        "uploadstash-errclear": "Fallou o borrado de ficheiros.",
        "uploadstash-refresh": "Actualizar a lista de ficheiros",
        "invalid-chunk-offset": "Desprazamento inválido do fragmento",
        "changecontentmodel-title-label": "Título da páxina",
        "changecontentmodel-model-label": "Novo modelo de contido",
        "changecontentmodel-reason-label": "Motivo:",
+       "changecontentmodel-submit": "Cambiar",
        "changecontentmodel-success-title": "O modelo de contido foi modificado",
        "changecontentmodel-success-text": "O tipo de contido de [[:$1]] foi modificado.",
        "changecontentmodel-cannot-convert": "O contido en [[:$1]] non pode converterse ó tipo de $2.",
        "changecontentmodel-nodirectediting": "O modelo de contido $1 non permite a modificación directa",
        "log-name-contentmodel": "Rexistro de cambios de modelo de contido",
        "log-description-contentmodel": "Eventos relacinados cos modelos de contido dunha páxina",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|creou}} a páxina $3 usando un modelo de contido non predeterminado \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|cambiou}} o modelo de contido da páxina $3 de \"$4\" a \"$5\"",
        "logentry-contentmodel-change-revertlink": "reverter",
        "logentry-contentmodel-change-revert": "reverter",
        "tags-delete-not-allowed": "As etiquetas definidas por unha extensión non se poden borrar, agás que a extensión específica o permita.",
        "tags-delete-not-found": "A páxina \"$1\" non existe.",
        "tags-delete-too-many-uses": "A etiqueta \"$1\" aplícase a máis de $2 {{PLURAL:$2|revisión|revisións}}; isto significa que non se pode borrar.",
-       "tags-delete-warnings-after-delete": "A etiqueta \"$1\" borrouse correctamente; con todo, {{PLURAL:$2|atopouse o seguinte erro|atopáronse os seguintes erros}}:",
+       "tags-delete-warnings-after-delete": "A etiqueta \"$1\" borrouse; con todo, {{PLURAL:$2|atopouse o seguinte aviso|atopáronse os seguintes avisos}}:",
        "tags-activate-title": "Activar unha etiqueta",
        "tags-activate-question": "Está a piques de activar a etiqueta\"$1\".",
        "tags-activate-reason": "Motivo:",
        "tags-edit-reason": "Motivo:",
        "tags-edit-revision-submit": "Aplicar os cambios a {{PLURAL:$1|esta revisión|$1 revisións}}",
        "tags-edit-logentry-submit": "Aplicar os cambios a {{PLURAL:$1|esta entrada do rexistro|$1 entradas do rexistro}}",
-       "tags-edit-success": "Os cambios aplicáronse con éxito.",
+       "tags-edit-success": "Aplicáronse os cambios.",
        "tags-edit-failure": "Non se puideron aplicar os cambios:\n$1",
        "tags-edit-nooldid-title": "Revisión inválida",
        "tags-edit-nooldid-text": "Non indicou a revisión sobre a que realizar esta función, ou a revisión especificada non existe.",
index 21ec0d4..b48844d 100644 (file)
        "recentchanges-label-bot": "हें संपादन रोबॉटान केला.",
        "recentchanges-label-unpatrolled": "हें संपादन आजून तपासूंक ना",
        "recentchanges-label-plusminus": "ह्या पानाचो आकार इतल्या बाइट्सन बदललो",
-       "recentchanges-legend-heading": "'''कुंजी:'''",
+       "recentchanges-legend-heading": "<strong>कुंजी:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages| नव्या पानांची सुची]] पळयात)",
        "rcnotefrom": "$2 पासून केल्ले बदल सकयल दिल्यात ($1 मेरेन दाखयल्यात)",
        "rclistfrom": "$3 $2 साकून नवें बदल दाखयात",
        "namespace_association": "संबंदीत नांवथोळ",
        "tooltip-namespace_association": "चर्चा वा वेंचीक नांवाचें सुवातीक संबंदीत विशयाच्या नांवाची सुवात आस्पावन घेवपाखातीर ह्या बॉक्सांत पळयात",
        "blanknamespace": "(मुखेल)",
-       "contributions": "{{GENDER:$1|à¤\89पà¥\87à¤\97à¤\95रà¥\8dतà¥\8b}} योगदानां",
+       "contributions": "{{GENDER:$1|वापरपà¥\80}} योगदानां",
        "contributions-title": "$1 खातीर वापरप्याचीं योगदानां",
        "mycontris": "योगदान",
        "uctop": "(हालीचें)",
index e135d4b..5343a48 100644 (file)
        "privacy": "Gupitaiechem dhoronn",
        "privacypage": "Project:Gupitachem dhoronn",
        "badaccess-group0": "Tumi tillson kel'lem karya korunk tumkam permissanv na.",
-       "badaccess-groups": "Tumi tillson kel'lem kary mat {{PLURAL:$2|the group|one of the groups}}: $1 -ak permissanv asa.",
+       "badaccess-groups": "Tumi tillson kel'lem karya mat {{PLURAL:$2|hea zomeache|hantuntle eke zomeache}} vaporpeank porvangi asa: $1.",
        "versionrequired": "MediaWikichem $1 version zai",
        "versionrequiredtext": "Hem pan vaprunk MediaWikichem $1 version zai.\n[[Special:Version|version page]] pan poloea.",
        "ok": "Zait",
index 72e24cc..05fcdc3 100644 (file)
        "action-siteadmin": "Κλῄειν ἢ ἐκκλῄειν τὴν βάσιν δεδομένων",
        "nchanges": "$1 {{PLURAL:$1|μεταβολή|μεταβολαί}}",
        "enhancedrc-history": "Αἱ πρότεραι",
-       "recentchanges": "Î\91á¼± Î½έαι μεταβολαί",
+       "recentchanges": "Î\9dέαι μεταβολαί",
        "recentchanges-legend": "Ἐπιλογαὶ προσφάτων μεταβολῶν",
        "recentchanges-summary": "Ἀνιχνεύσειν τὰς πλείω πρόσφατους ἀλλαγὰς οῦ βίκι ἐν τῇδε τῇ δέλτῳ.",
        "recentchanges-feed-description": "Παρακολουθεῖν τὰς πλείω προσφάτους ἀλλαγὰς τοῦ βίκι ἐν ταύτῃ περιλήψει.",
index 9e06079..77cfb9e 100644 (file)
        "recentchanges-label-bot": "Die Bearbeitig isch dur e Bott uusgfiert wore",
        "recentchanges-label-unpatrolled": "Die Bearbeitig isch nonig vun eme Fäldhieter aagluegt wore",
        "recentchanges-label-plusminus": "Di gänderet Sytegreßi (Aazahl in Byte)",
-       "recentchanges-legend-heading": "'''Legänd:'''",
+       "recentchanges-legend-heading": "<strong>Legänd:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lueg au d [[Special:NewPages|Lischt vu neie Syte]])",
        "rcnotefrom": "Azeigt {{PLURAL:$5|isch d Änderig|sy maximal <strong>$1</strong> Änderige}} syt <strong>$3, $4</strong>.",
        "rclistfrom": "Nume Änderige syt $3, $2 Uhr zeige.",
index 8179211..35bdcc0 100644 (file)
        "recentchanges-label-bot": "આ ફેરફાર બોટ દ્વારા કરાયો છે",
        "recentchanges-label-unpatrolled": "આ ફેરફાર હજી ચકાસાયો નથી",
        "recentchanges-label-plusminus": "પાનાનું કદ આપેલા અંકો જેટલાં બાઈટ્સ જેટલું બદલ્યુ છે.",
-       "recentchanges-legend-heading": "'''કળ:'''",
+       "recentchanges-legend-heading": "<strong>કળ:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|નવા પાનાઓની યાદી]] પણ જુઓ)",
        "rcnotefrom": "નીચે <strong>$2</strong> થી ફેરફારો દર્શાવેલ છે (<strong>$1</strong> સુધી દર્શાવલે છે).",
        "rclistfrom": "$3 $2 બાદ થયેલા નવા ફેરફારો બતાવો",
index 4e6e453..49605f4 100644 (file)
        "moredotdotdot": "עוד…",
        "morenotlisted": "רשימה זו אינה מלאה.",
        "mypage": "דף משתמש",
+       "anonuserpage": "משתמש לא ידוע",
        "mytalk": "שיחה",
        "anontalk": "שיחה",
        "navigation": "ניווט",
        "nocookieslogin": "{{SITENAME}} משתמש בעוגיות כדי להכניס משתמשים למערכת.\nבדפדפן שלכם העוגיות מבוטלות.\nאנא הפעילו אותן מחדש ונסו שוב.",
        "nocookiesfornew": "חשבון המשתמש לא נוצר, כיוון שלא יכולנו לוודא את מקורו.\nודאו שהעוגיות מופעלות בדפדפן שלכם, העלו מחדש דף זה ונסו שוב.",
        "noname": "לא הכנסת שם משתמש תקין",
-       "loginsuccesstitle": "×\94×\9b× ×\99ס×\94 ×\94×\95ש×\9c×\9e×\94 ×\91×\94צ×\9c×\97×\94",
+       "loginsuccesstitle": "× ×\9bנסת ×\9c×\97ש×\91×\95×\9f",
        "loginsuccess": "'''נכנסת ל{{grammar:תחילית|{{SITENAME}}}} בשם \"$1\".'''",
        "nosuchuser": "אין משתמש בשם \"$1\".\nאנא ודאו שהאיות נכון (כולל אותיות רישיות וקטנות), או [[Special:UserLogin/signup|צרו חשבון חדש]].",
        "nosuchusershort": "אין משתמש בשם \"$1\".\nאנא ודאו שהאיות נכון.",
        "createaccount-title": "יצירת חשבון ב{{grammar:תחילית|{{SITENAME}}}}",
        "createaccount-text": "מישהו יצר חשבון בשם $2 ב{{grammar:תחילית|{{SITENAME}}}} ($4), והסיסמה הזמנית של החשבון היא \"$3\". עליכם להיכנס ולשנות עכשיו את הסיסמה.\n\nבאפשרותכם להתעלם מהודעה זו, אם החשבון נוצר בטעות.",
        "login-throttled": "ביצעתם לאחרונה ניסיונות רבים מדי להיכנס לחשבון זה.\nאנא המתינו $1 לפני שתנסו שוב.",
-       "login-abort-generic": "×\94×\9b× ×\99ס×\94 לחשבון לא הצליחה - היא הופסקה",
+       "login-abort-generic": "×\9b× ×\99סת×\9a לחשבון לא הצליחה - היא הופסקה",
        "login-migrated-generic": "חשבון המשתמש שלך הועבר, ושם המשתמש שלך כבר לא קיים באתר ויקי זה.",
        "loginlanguagelabel": "שפה: $1",
        "suspicious-userlogout": "בקשתך לצאת מהחשבון נדחתה כיוון שנראה שהיא נשלחה על־ידי דפדפן שבור או שרת פרוקסי עם זיכרון מטמון.",
        "newpassword": "סיסמה חדשה:",
        "retypenew": "חזרה על הסיסמה החדשה:",
        "resetpass_submit": "הגדרת הסיסמה וכניסה לחשבון",
-       "changepassword-success": "סיסמתך שונתה בהצלחה!",
+       "changepassword-success": "סיסמתך שונתה!",
        "changepassword-throttled": "ביצעתם לאחרונה ניסיונות רבים מדי להיכנס לחשבון זה.\nאנא המתינו $1 לפני שתנסו שוב.",
        "botpasswords": "ססמאות בוט",
        "botpasswords-summary": "<em>ססמאות בוט</em> מאפשרות כניסה לחשבון משתמש באמצעות API, ללא שימוש בנתוני ההזדהות הראשיים של החשבון. ניתן להגביל את הרשאות המשתמש הזמינות כאשר נכנסים עם ססמת בוט.",
        "botpasswords-insert-failed": "הוספת שם הבוט \"$1\" נכשלה. האם הוא כבר נוסף?",
        "botpasswords-update-failed": "לא היה אפשר לעדכן את שם הבוט \"$1\". האם הוא נמחק?",
        "botpasswords-created-title": "ססמת הבוט נוצרה",
-       "botpasswords-created-body": "ססמת הבוט \"$1\" נוצרה בהצלחה.",
+       "botpasswords-created-body": "ססמת הבוט עבור בוט בשם \"$1\" של המשתמש \"$2\" נוצרה.",
        "botpasswords-updated-title": "ססמת הבוט עודכנה",
-       "botpasswords-updated-body": "ססמת הבוט \"$1\" עודכנה בהצלחה.",
+       "botpasswords-updated-body": "ססמת הבוט עבור בוט בשם \"$1\" של המשתמש \"$2\" עודכנה.",
        "botpasswords-deleted-title": "ססמת הבוט נמחקה",
-       "botpasswords-deleted-body": "ססמת הבוט \"$1\" נמחקה.",
+       "botpasswords-deleted-body": "ססמת הבוט עבור בוט בשם \"$1\" של המשתמש \"$2\" נמחקה.",
        "botpasswords-newpassword": "הססמה החדשה לכניסה <strong>$1</strong> היא <strong>$2</strong>. <em>נא לשמור מידע זה לצורך עיון עתידי.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider אינו זמין.",
        "botpasswords-restriction-failed": "כניסה זו נמנעה בשל הגבלות על ססמאות בוט.",
        "revdelete-unsuppress": "הסרת הגבלות בגרסאות המשוחזרות",
        "revdelete-log": "סיבה:",
        "revdelete-submit": "ביצוע על {{PLURAL:$1|הגרסה שנבחרה|הגרסאות שנבחרו}}",
-       "revdelete-success": "'''מצב הסתרת הגרסה עודכן בהצלחה.'''",
-       "revdelete-failure": "'''לא ניתן היה לעדכן את מצב הסתרת הגרסה:'''\n$1",
-       "logdelete-success": "'''הסתרת פעולת היומן הושלמה בהצלחה.'''",
-       "logdelete-failure": "'''לא ניתן היה לבצע את הסתרת פעולת היומן:'''\n$1",
+       "revdelete-success": "מצב הצגת הגרסה עודכן.",
+       "revdelete-failure": "לא ניתן היה לעדכן את מצב הצגת הגרסה:\n$1",
+       "logdelete-success": "מצב הצגת פעולת היומן עודכן.",
+       "logdelete-failure": "לא ניתן היה לעדכן את מצב הצגת פעולת היומן:\n$1",
        "revdel-restore": "שינוי ההצגה",
        "pagehist": "היסטוריית הדף",
        "deletedhist": "הגרסאות המחוקות",
        "userrights-changeable-col": "קבוצות שבאפשרותכם לשנות",
        "userrights-unchangeable-col": "קבוצות שאין באפשרותכם לשנות",
        "userrights-conflict": "התנגשות בין שינויי הרשאות משתמש! אנא בדקו את השינויים שלכם ואשרו אותם.",
-       "userrights-removed-self": "×\94סרת ×\91×\94צ×\9c×\97×\94 ×\90ת ×\94רש×\90×\95ת ×\94×\9eשת×\9eש ×©×\9cך. לכן אין לך כעת אפשרות לגשת לדף זה.",
+       "userrights-removed-self": "×\94סרת ×\90ת ×\94רש×\90×\95ת ×\94×\9eשת×\9eש ×©×\9c ×¢×¦×\9eך. לכן אין לך כעת אפשרות לגשת לדף זה.",
        "group": "קבוצה:",
        "group-user": "משתמשים",
        "group-autoconfirmed": "משתמשים ותיקים",
        "uploadstash-summary": "דף זה מאפשר גישה לקבצים שהועלו (או נמצאים בתהליך העלאה), אך טרם פורסמו באתר הוויקי. קבצים אלה אינם גלויים לאיש מלבד המשתמש שהעלה אותם.",
        "uploadstash-clear": "מחיקת הקבצים בסליק",
        "uploadstash-nofiles": "אין לכם קבצים בסליק.",
-       "uploadstash-badtoken": "×\91×\99צ×\95×¢ ×\94פע×\95×\9c×\94 × ×\9bש×\9c, ×\90×\95×\9c×\99 ×\91×\92×\9c×\9c ×¤×§×\99עת ×ª×\95קפ×\95 ×©×\9c ×\90ס×\99×\9e×\95×\9f ×\94ער×\99×\9b×\94 ×©×\9c×\9b×\9d. × ×¡×\95 שוב.",
+       "uploadstash-badtoken": "×\91×\99צ×\95×¢ ×\94פע×\95×\9c×\94 × ×\9bש×\9c, ×\90×\95×\9c×\99 ×\91×\92×\9c×\9c ×¤×§×\99עת ×ª×\95קפ×\95 ×©×\9c ×\90ס×\99×\9e×\95×\9f ×\94ער×\99×\9b×\94 ×©×\9c×\9b×\9d. × ×\90 ×\9cנס×\95ת שוב.",
        "uploadstash-errclear": "מחיקת הקבצים נכשלה.",
        "uploadstash-refresh": "רענון רשימת הקבצים",
        "invalid-chunk-offset": "היסט גוש לא תקין",
        "changecontentmodel-title-label": "כותרת הדף",
        "changecontentmodel-model-label": "מודל התוכן החדש",
        "changecontentmodel-reason-label": "סיבה:",
+       "changecontentmodel-submit": "שינוי",
        "changecontentmodel-success-title": "מודל התוכן שוּנה",
        "changecontentmodel-success-text": "מודל התוכן של [[:$1]] שוּנה.",
        "changecontentmodel-cannot-convert": "התוכן בדף [[:$1]] אינו יכול להיות מומר לסוג של $2.",
        "tags-delete-not-allowed": "תגיות שהוגדרו על־ידי הרחבה אינן ניתנות למחיקה אלא אם כן ההרחבה מתירה זאת במיוחד.",
        "tags-delete-not-found": "התגית \"$1\" אינה קיימת.",
        "tags-delete-too-many-uses": "התגית \"$1\" מוחלת על יותר {{PLURAL:$2|מגרסה אחת|מ־$2 גרסאות}}, ולכן לא ניתן למחוק אותה.",
-       "tags-delete-warnings-after-delete": "התגית \"$1\" נמחקה בהצלחה, אבל {{PLURAL:$2|התקבלה האזהרה הבאה|התקבלו האזהרות הבאות}}:",
+       "tags-delete-warnings-after-delete": "התגית \"$1\" נמחקה, אבל {{PLURAL:$2|התקבלה האזהרה הבאה|התקבלו האזהרות הבאות}}:",
        "tags-activate-title": "הפעלת תגית",
        "tags-activate-question": "אתם עומדים להפעיל את התגית \"$1\".",
        "tags-activate-reason": "הסבר:",
        "tags-edit-reason": "סיבה:",
        "tags-edit-revision-submit": "החלת שינויים {{PLURAL:$1|לגרסה הזאת|ל־$1 גרסאות}}",
        "tags-edit-logentry-submit": "החלת שינויים {{PLURAL:$1|לרשומת היומן הזאת|ל־$1 רשומת היומן}}",
-       "tags-edit-success": "השינויים הוחלו בהצלחה.",
+       "tags-edit-success": "השינויים הוחלו.",
        "tags-edit-failure": "החלת השינויים נכשלה:\n$1",
        "tags-edit-nooldid-title": "גרסת היעד אינה תקינה",
        "tags-edit-nooldid-text": "או שלא ציינת שום גרסה שהפעולה תבוצע עליה, או שהגרסה שציינת אינה קיימת.",
index cb49872..509503b 100644 (file)
        "moredotdotdot": "और...",
        "morenotlisted": "यह सूची पूर्ण नहीं है।",
        "mypage": "पृष्ठ",
+       "anonuserpage": "अज्ञात सदस्य",
        "mytalk": "वार्ता",
        "anontalk": "वार्ता",
        "navigation": "भ्रमण",
        "nocookieslogin": "{{SITENAME}} पर लॉग इन करने के लिये कुकीज़ का प्रयोग होता है।\nआपने कुकीज़ अक्षम कर रखी हैं।\nकृपया अपने ब्राउज़र में कुकीज़ सक्षम करें और फिर पुनः कोशिश करें।",
        "nocookiesfornew": "स्रोत की पुष्टि ना हो पाने के कारण यह खाता निर्मित नहीं किया गया। \nसुनिश्चित करें कि आपने कुकीज़ सक्षम की हैं, पृष्ठ को पुनः लोड करें और पुनः प्रयास करें।",
        "noname": "आपने वैध सदस्यनाम नहीं दिया है।",
-       "loginsuccesstitle": "लà¥\89à¤\97 à¤\87न à¤¹à¥\8b à¤\97या à¤¹à¥\88",
+       "loginsuccesstitle": "पà¥\8dरवà¥\87श à¤¹à¥\81à¤\86",
        "loginsuccess": "'''आप {{SITENAME}} में \"$1\" सदस्यनाम से लॉग इन हो {{GENDER:$1|चुके|चुकी|चुके}} हैं।'''",
        "nosuchuser": "\"$1\" नाम का कोई सदस्य नहीं है।\nसदस्यनाम में लघु और दीर्घ अक्षरों से फ़र्क पड़ता है।\nअपनी वर्तनी जाँचें, या [[Special:UserLogin/signup|नया खाता खोलें]]।",
        "nosuchusershort": "\"$1\" नाम का कोई सदस्य नहीं है।\nकृपया अपनी दी हुई वर्तनी जाँचें।",
        "createaccount-title": "{{SITENAME}} के लिये खाता बनाएँ",
        "createaccount-text": "आपके ई-मेल पते के लिये किसी ने {{SITENAME}} ($4) पर \"$2\" सदस्य नाम से \"$3\" कूटशब्द (पासवर्ड) सहित खाता खोला है।\nआपको लॉग इन कर के अपना कूटशब्द (पासवर्ड) तुरंत बदल लेना चाहिये।\n\nयदि यह खाता गलती से खोला गया है, तो आप इस मेसेज को नज़रंदाज़ कर सकते हैं।",
        "login-throttled": "आपने हाल ही में कई बार लॉग इन करने के प्रयास किये हैं।\nपुनः प्रयास करने से पहले कृपया $1 प्रतीक्षा करें।",
-       "login-abort-generic": "à¤\86पà¤\95ा à¤¸à¤¤à¥\8dरारमà¥\8dभ à¤\85सफल à¤°à¤¹à¤¾ - à¤¨à¤¿à¤·à¥\8dफलित",
+       "login-abort-generic": "à¤\86पà¤\95ा à¤ªà¥\8dरवà¥\87श à¤\85सफल à¤¹à¥\81à¤\86 - à¤°à¥\8bà¤\95ा à¤\97या",
        "login-migrated-generic": "आपका खाता माइग्रेट हो गया है और आपका सदस्यनाम इस विकी पर अब मौजूद नहीं है।",
        "loginlanguagelabel": "भाषा: $1",
        "suspicious-userlogout": "अपका लॉग आउट करने का अनुरोध अस्वीकृत कर दिया गया है क्योंकि ऐसा प्रतीत होता है कि यह किसी खराब ब्राउज़र या कैश करने वाली प्रॉक्सी द्वारा भेजा गया था।",
        "botpasswords-updated-body": "बॉट पासवर्ड \"$1\" सफलतापूर्वक अद्यतन हुआ।",
        "botpasswords-deleted-title": "बॉट पासवर्ड हट गया",
        "botpasswords-deleted-body": "बॉट पासवर्ड \"$1\" हट गया।",
+       "botpasswords-not-exist": "सदस्य \"$1\" के आप बॉट पासवर्ड नहीं है, जिसका नाम \"$2\" है।",
        "resetpass_forbidden": "कूटशब्द बदले नहीं जा सकते",
        "resetpass-no-info": "इस पृष्ठ का सीधे प्रयोग करने के लिए आपको लॉग इन करना होगा।",
        "resetpass-submit-loggedin": "कूटशब्द बदलें",
        "right-changetags": "जमा करो और हटाओ स्वतंत्र [[Special:Tags|टैग]] व्यक्तिगत अवतरणों और लॉग प्रविक्तियों पर",
        "grant-group-email": "ई-मेल भेजें",
        "grant-createaccount": "खाता बनाएँ",
+       "grant-editmycssjs": "अपने सदस्य सीएसएस/जेएस को संपादित करें",
+       "grant-editmyoptions": "अपने सदस्य पसंद को संपादित करें",
        "grant-editmywatchlist": "ध्यानसूची संपादित करें",
+       "grant-editpage": "बने पृष्ठ संपादित करें",
+       "grant-editprotected": "सुरक्षित पृष्ठ संपादित करें",
+       "grant-sendemail": "अन्य सदस्यों को ई-मेल भेजें",
+       "grant-uploadfile": "नए फ़ाइल डालें",
        "grant-basic": "सामान्य अधिकार",
+       "grant-viewdeleted": "हटाये गए फ़ाइल व पृष्ठ देखें",
        "grant-viewmywatchlist": "अपनी ध्यानसूची देखें",
        "newuserlogpage": "सदस्य खाता निर्माण लॉग",
        "newuserlogpagetext": "यह सदस्य खातों के निर्माण का लॉग है।",
        "action-createpage": "पृष्ठ बनाने",
        "action-createtalk": "वार्ता पृष्ठ बनाने",
        "action-createaccount": "यह सदस्य खाता खोलने",
+       "action-autocreateaccount": "स्वतः ही बाहरी सदस्य खाता बनायें",
        "action-history": "इस पृष्ठ का इतिहास देखने",
        "action-minoredit": "इस बदलाव को छोटा बदलाव चिन्हित करने",
        "action-move": "इस पृष्ठ को स्थानांतरित करने",
        "recentchanges-label-bot": "यह संपादन एक बॉट द्वारा किया गया था",
        "recentchanges-label-unpatrolled": "यह संपादन अभी जाँचा नहीं गया है",
        "recentchanges-label-plusminus": "पृष्ठ आकार इस बाइट संख्या से बदला",
-       "recentchanges-legend-heading": "'''कुंजी:'''",
+       "recentchanges-legend-heading": "<strong>कुंजी:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नए पन्नों की सूची]] को भी देखें)",
        "recentchanges-submit": "दिखाएँ",
        "rcnotefrom": "नीचे <strong>$2</strong> के बाद से (<strong>$1</strong> तक) {{PLURAL:$5|हुआ बदलाव दर्शाया गया है|हुए बदलाव दर्शाए गये हैं}}।",
        "protectedpages-performer": "सुरक्षित करने वाला सदस्य",
        "protectedpages-params": "सुरक्षा प्राचल",
        "protectedpages-reason": "कारण",
+       "protectedpages-submit": "पृष्ठों को दिखाओ",
        "protectedpages-unknown-timestamp": "अज्ञात",
        "protectedpages-unknown-performer": "अज्ञात सदस्य",
        "protectedtitles": "सुरक्षित शीर्षक",
        "protectedtitles-summary": "यह पृष्ठ उन पृष्ठ शीर्षकों की सूची देता है जिन्हें अभी बनाने से सुरक्षित किया गया है। सुरक्षित मौजूदा पृष्ठों की सूची देखने के लिए [[{{#special:ProtectedPages}}|{{int:protectedpages}}]] देखें।",
        "protectedtitlesempty": "इन नियमों द्वारा कोई भी शीर्षक सुरक्षित नहीं हैं।",
+       "protectedtitles-submit": "शीर्षकों को दिखाओ",
        "listusers": "सदस्यसूची",
        "listusers-editsonly": "केवल संपादन कर चुके सदस्य दिखाएँ",
        "listusers-creationsort": "निर्माण तिथि के आधार पर क्रमांकन करें",
        "apisandbox-submit": "अनुरोध करें",
        "apisandbox-reset": "स्पष्ट",
        "apisandbox-retry": "दुबारा प्रयास करें",
-       "apisandbox-examples": "Example",
+       "apisandbox-examples": "उदाहरण",
        "apisandbox-results": "परिणाम",
        "apisandbox-request-url-label": "अनुरोध URL:",
        "apisandbox-request-time": "अनुरोध समय: $1",
        "listgrouprights-namespaceprotection-header": "नामस्थान की बंदिशें",
        "listgrouprights-namespaceprotection-namespace": "नामस्थान",
        "listgrouprights-namespaceprotection-restrictedto": "उपयोगकर्ता को सम्पादन करने में सक्षम करने वाले अधिकार",
+       "listgrants-rights": "अधिकार",
        "trackingcategories": "चिह्नित श्रेणियाँ",
        "trackingcategories-summary": "इस पृष्ठ पर उन जोड़ने वाली श्रेणियों की सूची मिलती है जो स्वतः रूप से मीडियाविकि सॉफ़्टवेयर द्वारा बनते हैं। उनके नाम सम्बंधित प्रणालि सन्देश को बदलने से {{ns:8}} नामस्थान में बदले जा सकते हैं।",
        "trackingcategories-msg": "चिह्नित श्रेणी",
        "wlshowhideanons": "अनाम प्रयोक्ता",
        "wlshowhidepatr": "परीक्षित सम्पादन",
        "wlshowhidemine": "मेरा संपादन",
+       "wlshowhidecategorization": "पृष्ठ श्रेणीकरण",
        "watchlist-options": "ध्यानसूची विकल्प",
        "watching": "ध्यान दे रहे हैं...",
        "unwatching": "ध्यान हटा रहे हैं...",
        "deletepage": "पृष्ठ हटाएँ",
        "confirm": "सुनिश्चित करें",
        "excontent": "पाठ था: '$1'",
-       "excontentauthor": "पाठ था: '$1' (और सिर्फ '[[Special:Contributions/$2|$2]]' का योगदान था।)",
+       "excontentauthor": "पाठ था: '$1' (और सिर्फ '[[Special:Contributions/$2|$2]]' का योगदान था। ([[User talk:$2|वार्ता]])",
        "exbeforeblank": "खाली करने से पहले पाठ था: '$1'",
        "delete-confirm": "\"$1\" को हटाएँ",
        "delete-legend": "हटाएँ",
        "changecontentmodel-title-label": "पृष्ठ शीर्षक",
        "changecontentmodel-model-label": "नयि सामग्री का नमूना",
        "changecontentmodel-reason-label": "कारण:",
+       "changecontentmodel-submit": "परिवर्तन",
        "changecontentmodel-success-title": "सामगरि का नामुने मे बदलाव हुुुाा हेेे",
        "changecontentmodel-success-text": "[[:$1]] के सामग्री का प्रकार परिवर्तित हुआ।",
        "changecontentmodel-cannot-convert": "[[:$1]] की सामग्री का प्रकार $2 में नहीं बदल सकता है।",
        "whatlinkshere-hidelinks": "$1 कड़ियाँ",
        "whatlinkshere-hideimages": "$1 फ़ाइल लिंक",
        "whatlinkshere-filters": "छन्ने",
+       "whatlinkshere-submit": "जायें",
        "autoblockid": "स्वतः अवरोध #$1",
        "block": "उपयोक्ता को अवरोधित करें।",
        "unblock": "उपयोक्ता पर अवरोधण हटाएँ",
        "cant-move-to-user-page": "आपको किसी पन्नो को सदस्य पृष्ठ पर ले जाने की अनुमति नहीं है (सिवाय सदस्य उप पृष्ठ के)",
        "cant-move-category-page": "आपको श्रेणी प्रष्ठों को स्थानांतरित करने की अनुमति नहीं है।",
        "cant-move-to-category-page": "आपको किसी पृष्ठ को श्रेणी पृष्ठ पर स्थानांतरित करने की अनुमति नहीं है।",
-       "newtitle": "नयà¥\87 à¤¶à¥\80रà¥\8dषà¤\95 à¤\95à¥\80 à¤\93र:",
+       "newtitle": "नया à¤¶à¥\80रà¥\8dषà¤\95:",
        "move-watch": "ध्यान रखें",
        "movepagebtn": "नाम बदलें",
        "pagemovedsub": "नाम बदल दिया गया है",
        "export-download": "फ़ाईलके रुपमें सेव करें",
        "export-templates": "टेम्प्लेटस भी जोडें",
        "export-pagelinks": "जिन पन्नों के हवाले यहाँ हैं, उन्हें भी इस गहराई तक शामिल करें:",
+       "export-manual": "स्वयं से पृष्ठ जोड़ें:",
        "allmessages": "व्यवस्था संदेश",
        "allmessagesname": "नाम",
        "allmessagesdefault": "डिफॉल्ट पाठ",
        "tooltip-pt-preferences": "{{GENDER:|आपकी}} वरीयताएँ",
        "tooltip-pt-watchlist": "आपने ध्यान दिये हुए पन्नोंकी सूची",
        "tooltip-pt-mycontris": "आपके योगदानों की सूची",
+       "tooltip-pt-anoncontribs": "इस आईपी पते से संपादन की सूची",
        "tooltip-pt-login": "आपको सत्रारम्भ करने के लिए प्रोत्साहित किया जाता है; लेकिन यह अनिवार्य नहीं है",
        "tooltip-pt-logout": "सत्रांत",
        "tooltip-pt-createaccount": "हमारा सुझाव है की आप खाता बनाएँ और लॉगिन करें, परन्तु यह अनिवार्य नहीं है",
index a6c3263..e18aa14 100644 (file)
        "recentchanges-label-bot": "Ii badlao ke ek bot karis hae",
        "recentchanges-label-unpatrolled": "Ii badlao pe abhi pahraa nai dewa gais hae.",
        "recentchanges-label-plusminus": "Panna ke size etna bytes se badla",
-       "recentchanges-legend-heading": "'''Legend:'''",
+       "recentchanges-legend-heading": "<strong>Legend:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (aur dekho [[Special:NewPages|nawaa panna ke suchi]])",
        "recentchanges-submit": "Dekhao",
        "rcnotefrom": "Niche {{PLURAL:$5|badlao hae|badlao hae}} <strong>$3, $4</strong> (<strong>$1</strong> talak dekhawa gais) talak.",
index 623b81b..dbe4fcb 100644 (file)
        "recentchanges-label-bot": "Izmjenu napravio bot",
        "recentchanges-label-unpatrolled": "Nepregledana izmjena",
        "recentchanges-label-plusminus": "Promjena veličine stranice (u bajtovima)",
-       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "Nova stranica",
        "recentchanges-submit": "Prikaži",
        "rcnotefrom": "Slijede promjene od <b>$2</b> (prikazano ih je do <b>$1</b>).",
index e32fdc3..160e2b6 100644 (file)
        "recentchanges-label-bot": "Ännrung doorich en Bot",
        "recentchanges-label-unpatrolled": "Nicht-kontrollierte Ännrung",
        "recentchanges-label-plusminus": "Die Ännrung von der Seitengröss in Bytes",
-       "recentchanges-legend-heading": "'''Legende:'''",
+       "recentchanges-legend-heading": "<strong>Legende:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sieh ooch die [[Special:NewPages|List von neier Seite]])",
        "rcnotefrom": "Oongezeicht sin die Ännrunge seit <strong>$2</strong> (max. <strong>$1</strong> Einträch).",
        "rclistfrom": "Nuar Ännrunge seit $3, $2 Uhr zeiche.",
index 3b36673..6e8b482 100644 (file)
        "recentchanges-label-bot": "Tuta změna bu přez roboćik přewjedźena",
        "recentchanges-label-unpatrolled": "Tuta změnu hišće njebu přepruwowana",
        "recentchanges-label-plusminus": "Změnjena wulkosć strony (w bajtach)",
-       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (hlej tež [[Special:NewPages|lisćinu nowych stronow]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Deleka so {{PLURAL:$5|změna|změnje|změny}} wot <strong>$3, $4</strong> {{PLURAL:$5|pokazuje|pokazujetej|pokazuja}} (hač k <strong>$1</strong>).",
index 26631f5..0a51bcd 100644 (file)
        "recentchanges-label-newpage": "Modifikasyon sa a kreye yon lòt paj",
        "recentchanges-label-minor": "Sa se yon ti chanjman",
        "recentchanges-label-bot": "Se yon wobo ki fè chanjman sa a.",
-       "recentchanges-legend-heading": "'''Lejann:'''",
+       "recentchanges-legend-heading": "<strong>Lejann:</strong>",
        "rcnotefrom": "Men modifikasyon yo ki fèt depi '''$2''' ('''$1''' dènye).",
        "rclistfrom": "Afiche nouvo modifikasyon yo depi $3 $2",
        "rcshowhideminor": "$1 modifiksayon yo ki tou piti",
index 0afb861..e656523 100644 (file)
        "newarticle": "(Új)",
        "newarticletext": "Egy olyan lapra mutató hivatkozást követtél, ami még nem létezik.\nA lap létrehozásához csak gépeld be a szövegét a lenti szövegdobozba. Ha kész vagy, az „Előnézet megtekintése” gombbal ellenőrizheted, hogy úgy fog-e kinézni, ahogy szeretnéd, és a „Lap mentése” gombbal tudod elmenteni. (További információkat a [$1 súgólapon] találsz).\nHa tévedésből jutottál ide, kattints a böngésződ '''vissza''' vagy '''back''' gombjára.",
        "anontalkpagetext": "----''Ez egy olyan anonim szerkesztő vitalapja, aki még nem regisztrált, vagy csak nem jelentkezett be.\nEzért az IP-címét használjuk az azonosítására.\nUgyanazon az IP-címen számos szerkesztő osztozhat az idők folyamán.\nHa úgy látod, hogy az üzenetek, amiket ide kapsz, nem neked szólnak, [[Special:UserLogin/signup|regisztrálj]] vagy ha már regisztráltál, [[Special:UserLogin|jelentkezz be]], hogy ne keverjenek össze másokkal.''",
-       "noarticletext": "Ez a lap jelenleg nem tartalmaz szöveget.\n[[Special:Search/{{PAGENAME}}|Rákereshetsz erre a címszóra]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} megtekintheted a kapcsolódó naplókat],\nvagy [{{fullurl:{{FULLPAGENAME}}|action=edit}} szerkesztheted a lapot].</span>",
+       "noarticletext": "Ez a lap jelenleg nem tartalmaz szöveget.\n[[Special:Search/{{PAGENAME}}|Rákereshetsz erre a címszóra]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} megtekintheted a kapcsolódó naplókat],\nvagy [{{fullurl:{{FULLPAGENAME}}|action=edit}} létrehozhatod a lapot].</span>",
        "noarticletext-nopermission": "Ez a lap jelenleg nem tartalmaz szöveget.\n[[Special:Search/{{PAGENAME}}|Rákereshetsz a lap címére]] más lapok tartalmában, vagy <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} megtekintheted a kapcsolódó naplófájlokat]</span>.",
        "missing-revision": "A(z) \"{{FULLPAGENAME}}\" nevű oldal #$1 változata nem létezik.\n\nEzt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás használata okozza. Részletek a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} törlési naplóban] találhatóak.",
        "userpage-userdoesnotexist": "Nincs „<nowiki>$1</nowiki>” nevű regisztrált felhasználónk.\nNézd meg, hogy valóban ezt a lapot szeretnéd-e létrehozni vagy szerkeszteni.",
        "recentchanges-label-bot": "Ezt a szerkesztést egy bot hajtotta végre",
        "recentchanges-label-unpatrolled": "Ezt a szerkesztést még nem ellenőrizték",
        "recentchanges-label-plusminus": "Az oldal mérete ennyi bájttal módosult",
-       "recentchanges-legend-heading": "'''Jelmagyarázat:'''",
+       "recentchanges-legend-heading": "<strong>Jelmagyarázat:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lásd még: [[Special:NewPages|új lapok listája]])",
        "recentchanges-submit": "Megjelenítés",
        "rcnotefrom": "Alább a <strong>$3 $4</strong> óta történt változtatások láthatóak (legfeljebb <b>$1</b> db).",
index 3a44e1c..7b0dd88 100644 (file)
        "category-article-count-limited": "Այս կատեգորիան պարունակում է հետևյալ {{PLURAL:$1|էջը|$1 էջերը}}։",
        "category-file-count": "{{PLURAL:$2|Այս կատեգորիան պարունակում է միայն հետևյալ նիշքը։|Ստորև {{PLURAL:$1|բերված է այս կատեգորիայի $1 նիշքը|բերված է այս կատեգորիայի $1 նիշք}}՝ $2-ից։}}",
        "category-file-count-limited": "Այս կատեգորիան պարունակում է հետևյալ {{PLURAL:$1|նիշքը|$1 նիշքերը}}։",
-       "listingcontinuesabbrev": "շարունակ.",
+       "listingcontinuesabbrev": "շարունակելի",
        "index-category": "Ինդեքսավորված էջեր",
        "noindex-category": "Չինդեքսավորված էջեր",
        "broken-file-category": "Կոտրված ֆայլի հղումով էջեր",
        "mainpage": "Գլխավոր էջ",
        "mainpage-description": "Գլխավոր էջ",
        "policy-url": "Project:Կանոնակարգ",
-       "portal": "Համայնքային պորտալ",
+       "portal": "Խորհրդարան",
        "portal-url": "Project:Համայնքային պորտալ",
        "privacy": "Գաղտնիության քաղաքականություն",
        "privacypage": "Project:Գաղտնիության քաղաքականություն",
        "recentchanges-label-bot": "Այս խմբագրումը կատարվել է բոտի կողմից",
        "recentchanges-label-unpatrolled": "Այս խմբագրումը դեռ չի պարեկվել",
        "recentchanges-label-plusminus": "Էջի չափսը փոփոխվեց այսքան բայթով",
-       "recentchanges-legend-heading": "'''Լեգենդ՝'''",
+       "recentchanges-legend-heading": "<strong>Լեգենդ՝</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (տես նաև՝  [[Special:NewPages|նոր էջերի ցանկ]])",
        "recentchanges-submit": "Ցույց տալ",
        "rcnotefrom": "Ստորև բերված են փոփոխությունները սկսած՝ '''$2''' (մինչև՝ '''$1''')։",
        "emaillink": "ուղարկել էլ. նամակ",
        "autoblocker": "Դուք ավտոմատիկ արգելափակվել եք «$1» մասնակցի հետ ձեր IP-հասցեի համընկնելու պատճառով։ Նրա արգելափակման պատճառն է՝ «$2»։",
        "blocklogpage": "Արգելափակման տեղեկամատյան",
-       "blocklogentry": "արգելափակվել է  [[$1]]. արգելափակման ժամկետն է՝  $2 $3",
-       "reblock-logentry": "փոխեց [[$1]] արգելափակումը ժամկետը դարձնելով $2 $3",
+       "blocklogentry": "[[$1]] արգելափակվել է $2 տևողությամբ $3",
+       "reblock-logentry": "փոխեց [[$1]]ի արգելափակումը՝ դարձնելով $2 տևողությամբ $3",
        "blocklogtext": "Սա մասնակիցների արգելափակման և արգելափակումից հանման տեղեկամատյանն է։\nԱվտոմատ կերպով արգելափակված IP-հասցեներն այստեղ ընդգրկված չեն։\nՏես [[Special:BlockList|այս պահին ակտիվ արգելափակումների ցանկը]]։",
        "unblocklogentry": "արգելափակումից հանված է $1",
        "block-log-flags-anononly": "միայն անանուն մասնակիցներ",
index a318921..922803a 100644 (file)
        "moredotdotdot": "Plus...",
        "morenotlisted": "Iste lista non es complete.",
        "mypage": "Pagina",
+       "anonuserpage": "Usator incognite",
        "mytalk": "Discussion",
        "anontalk": "Discussion",
        "navigation": "Navigation",
        "resetpass_submit": "Definir contrasigno e aperir un session",
        "changepassword-success": "Tu contrasigno ha essite cambiate!",
        "changepassword-throttled": "Tu ha recentemente facite troppo de tentativas de aperir session.\nPer favor attende $1 ante de probar lo novemente.",
+       "botpasswords-created-body": "Le contrasigno pro le robot \"$1\" del usator \"$2\" ha essite create.",
+       "botpasswords-updated-body": "Le contrasigno pro le robot \"$1\" del usator \"$2\" ha essite actualisate.",
+       "botpasswords-deleted-body": "Le contrasigno pro le robot \"$1\" del usator \"$2\" ha essite delite.",
        "resetpass_forbidden": "Le contrasignos non pote esser cambiate",
        "resetpass-no-info": "Tu debe aperir un session pro poter acceder directemente a iste pagina.",
        "resetpass-submit-loggedin": "Cambiar contrasigno",
        "newarticle": "(Nove)",
        "newarticletext": "Tu ha sequite un ligamine verso un pagina que non existe ancora.\nPro crear iste pagina, comencia a scriber in le quadro infra (consulta le [$1 pagina de adjuta] pro plus informationes).\nSi tu ha arrivate a iste pagina per error, clicca le button '''Retornar''' de tu navigator.",
        "anontalkpagetext": "---- ''Isto es le pagina de discussion pro un usator anonyme qui non ha ancora create un conto, o qui non lo usa. Consequentemente nos debe usar le adresse IP numeric pro identificar le/la.\nUn tal adresse IP pote esser usate in commun per varie personas.\nSi tu es un usator anonyme e pensa que commentos irrelevante ha essite dirigite a te, per favor [[Special:UserLogin/signup|crea un conto]] o [[Special:UserLogin|aperi un session]] pro evitar futur confusiones con altere usatores anonyme.''",
-       "noarticletext": "Al momento il non ha texto in iste pagina.\nTu pote [[Special:Search/{{PAGENAME}}|cercar le titulo de iste pagina]] in altere paginas,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar in le registros pertinente],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} modificar iste pagina]</span>.",
+       "noarticletext": "Al momento il non ha texto in iste pagina.\nTu pote [[Special:Search/{{PAGENAME}}|cercar le titulo de iste pagina]] in altere paginas,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar in le registros pertinente],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear iste pagina]</span>.",
        "noarticletext-nopermission": "In iste momento il non ha texto in iste pagina.\nTu pote [[Special:Search/{{PAGENAME}}|cercar le titulo de iste pagina]] in altere paginas,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar in le registros pertinente], ma tu non ha le permission de crear iste pagina.</span>",
        "missing-revision": "Le version №$1 del pagina nominate \"{{FULLPAGENAME}}\" non existe.\n\nIsto es generalmente causate per sequer un ligamine de historia obsolete a un pagina que ha essite delite.\nDetalios se trova in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de deletiones].",
        "userpage-userdoesnotexist": "Le conto de usator \"<nowiki>$1</nowiki>\" non es registrate. Per favor verifica que tu vole crear/modificar iste pagina.",
        "revdelete-submit": "Applicar al {{PLURAL:$1|version|versiones}} seligite",
        "revdelete-success": "'''Le visibilitate del version ha essite actualisate con successo.'''",
        "revdelete-failure": "'''Le visibilitate del version non poteva esser actualisate:'''\n$1",
-       "logdelete-success": "'''Le visibilitate del registro ha essite definite con successo.'''",
+       "logdelete-success": "Le visibilitate del registro ha essite definite.",
        "logdelete-failure": "'''Le visibilitate del registro non poteva esser cambiate:'''\n$1",
        "revdel-restore": "Cambiar visibilitate",
        "pagehist": "Historia del pagina",
        "userrights-changeable-col": "Gruppos que tu pote modificar",
        "userrights-unchangeable-col": "Gruppos que tu non pote modificar",
        "userrights-conflict": "Conflicto inter cambiamentos de derectos de usator! Per favor revide e confirma tu cambiamentos.",
-       "userrights-removed-self": "Tu ha removite con successo tu proprie derectos. In consequentia, tu non plus pote acceder a iste pagina.",
+       "userrights-removed-self": "Tu ha removite tu proprie derectos. In consequentia, tu non plus pote acceder a iste pagina.",
        "group": "Gruppo:",
        "group-user": "Usatores",
        "group-autoconfirmed": "Usatores autoconfirmate",
        "recentchanges-label-bot": "Iste modification ha essite effectuate per un robot",
        "recentchanges-label-unpatrolled": "Iste modification non ha ancora essite patruliate",
        "recentchanges-label-plusminus": "Le dimension del pagina ha cambiate de iste numero de bytes",
-       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vide etiam le [[Special:NewPages|lista de nove paginas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Monstrar",
        "uploadstash-summary": "Iste pagina forni accesso al files que ha essite incargate (o que es in le processo de incargamento) ma non es ancora publicate in le wiki. Iste files es solmente visibile pro le usator qui los incargava.",
        "uploadstash-clear": "Rader le pila de files incargate",
        "uploadstash-nofiles": "Il non ha files in le pila.",
-       "uploadstash-badtoken": "Le execution de iste action non succedeva, forsan proque le datos del session expirava. Tenta lo de novo.",
-       "uploadstash-errclear": "Le radimento del files non succedeva.",
+       "uploadstash-badtoken": "Le execution de iste action ha fallite, forsan perque le datos del session ha expirate. Tenta lo de novo.",
+       "uploadstash-errclear": "Le radimento del files ha fallite.",
        "uploadstash-refresh": "Refrescar le lista de files",
        "invalid-chunk-offset": "Position de segmento invalide",
        "img-auth-accessdenied": "Accesso refusate",
        "changecontentmodel-title-label": "Titulo del pagina",
        "changecontentmodel-model-label": "Nove modello de contento",
        "changecontentmodel-reason-label": "Motivo:",
+       "changecontentmodel-submit": "Cambiar",
        "changecontentmodel-success-title": "Le modello de contento ha essite cambiate",
        "changecontentmodel-success-text": "Le typo de contento de [[:$1]] ha essite cambiate.",
        "changecontentmodel-cannot-convert": "Le contento de [[:$1]] non pote esser convertite a un typo de $2.",
        "javascripttest-pagetext-frameworks": "Per favor selige un del sequente structuras de test: $1",
        "javascripttest-pagetext-skins": "Selige un apparentia con le qual executar le tests:",
        "javascripttest-qunit-intro": "Vide [$1 documentation de tests] sur mediawiki.org.",
-       "tooltip-pt-userpage": "Tu pagina de usator",
+       "tooltip-pt-userpage": "{{GENDER:|Tu}} pagina de usator",
        "tooltip-pt-anonuserpage": "Le pagina de usator pro le adresse IP desde le qual tu face modificationes",
-       "tooltip-pt-mytalk": "Tu pagina de discussion",
+       "tooltip-pt-mytalk": "{{GENDER:|Tu}} pagina de discussion",
        "tooltip-pt-anontalk": "Discussion super le modificationes facite desde iste adresse IP",
-       "tooltip-pt-preferences": "Mi preferentias",
+       "tooltip-pt-preferences": "{{GENDER:|Tu}} preferentias",
        "tooltip-pt-watchlist": "Le lista de paginas del quales tu seque le modificationes",
-       "tooltip-pt-mycontris": "Lista de tu contributiones",
+       "tooltip-pt-mycontris": "Lista de {{GENDER:|tu}} contributiones",
        "tooltip-pt-anoncontribs": "Un lista de modificationes facite per iste adresse IP",
        "tooltip-pt-login": "Nos recommenda que tu te authentica, ma non es obligatori.",
        "tooltip-pt-logout": "Clauder session",
        "tooltip-t-recentchangeslinked": "Modificationes recente in le paginas al quales iste pagina contine ligamines",
        "tooltip-feed-rss": "Syndication RSS pro iste pagina",
        "tooltip-feed-atom": "Syndication Atom pro iste pagina",
-       "tooltip-t-contributions": "Vider le lista de contributiones de iste usator",
+       "tooltip-t-contributions": "Un lista de contributiones de {{GENDER:$1|iste usator}}",
        "tooltip-t-emailuser": "Inviar un e-mail a iste usator",
        "tooltip-t-info": "Plus information super iste pagina",
        "tooltip-t-upload": "Incargar files",
        "tags-edit-reason": "Motivo:",
        "tags-edit-revision-submit": "Applicar cambiamentos a {{PLURAL:$1|iste version|$1 versiones}}",
        "tags-edit-logentry-submit": "Applicar cambiamentos a {{PLURAL:$1|iste entrata|$1 entratas}} de registro",
-       "tags-edit-success": "Le cambiamentos ha essite applicate con successo.",
+       "tags-edit-success": "Le cambiamentos ha essite applicate.",
        "tags-edit-failure": "Le cambiamentos non ha potite esser applicate:\n$1",
        "tags-edit-nooldid-title": "Le version de destination es invalide",
        "tags-edit-nooldid-text": "O tu non ha specificate un version de destination sur le qual exequer iste function, o le version specificate non existe.",
index 6512608..1f80e01 100644 (file)
        "resetpass-no-info": "Masapul a nakastrekka tapno dagus a makapanka iti daytoy a panid.",
        "resetpass-submit-loggedin": "Sukatan ti kontrasenias",
        "resetpass-submit-cancel": "Ukasen",
-       "resetpass-wrong-oldpass": "Imbalido ti temporario wenno agdama a kontrasenias.\nMabalin a nagballigi ti panagsukatmo ti kontrasenias wenno nagkiddaw ti baro a temporario a kontrasenias.",
+       "resetpass-wrong-oldpass": "Imbalido ti temporario wenno agdama a kontrasenias.\nMabalin a nasukatamon ti kontrasenias wenno nagkiddaw ti baro a temporario a kontrasenias.",
        "resetpass-recycled": "Pangngaasi nga isaad manen ti kontrasenias iti sabali ngem ti agdama a kontraseniasmo.",
        "resetpass-temp-emailed": "Simrekka a nagusar ti temporario a naipatulod a kodigo.\nTapno malpas ti panagserrek, nasken a mangisaadka ti baro a kontrasenias ditoy:",
        "resetpass-temp-password": "Temporario a kontrasenias:",
        "revdelete-unsuppress": "Ikkaten dagiti panangigawid kadagiti naipulang a rebision",
        "revdelete-log": "Rason:",
        "revdelete-submit": "Ipakat {{PLURAL:$1|ti napili a rebision|dagiti napili a rebision}}",
-       "revdelete-success": "Balligi ti panagpabaro ti panagkita ti rebision.",
+       "revdelete-success": "Napabaro ti panagkita ti rebision.",
        "revdelete-failure": "Saan a napabaro ti panagkita ti rebision.\n$1",
-       "logdelete-success": "Balligi ti pannakaisaad ti listaan ti panagkita.",
+       "logdelete-success": "Naisaad ti listaan ti panagkita.",
        "logdelete-failure": "Napaay ti pannakaisaad ti listaan ti panagkita:\n$1",
        "revdel-restore": "sukatan ti panagkita",
        "pagehist": "Pakasaritaan ti panid",
        "userrights-changeable-col": "Dagiti grupo a mabalinmo a baliwan",
        "userrights-unchangeable-col": "Dagiti grupo a dimo mabalin a baliwan",
        "userrights-conflict": "Suppiat dagiti panagbaliw kadagiti karbengan ti agar-aramat! Pangngaasi nga irepasom ken pasingkedam dagiti sinuksukatam.",
-       "userrights-removed-self": "Nagballigika a nagikkat kadagiti bukodmo a karbengan. Iti kastoyen, saankan a mabalin a mangserrek iti daytoy a panid.",
+       "userrights-removed-self": "Inikkatmo kadagiti bukodmo a karbengan. Iti kastoyen, saankan a mabalin a mangserrek iti daytoy a panid.",
        "group": "Grupo:",
        "group-user": "Dagiti agar-aramat",
        "group-autoconfirmed": "Dagiti automatiko a napasingkedan nga agar-aramat",
        "tags-edit-revision-legend": "Aginayon wenno agikkat kadagiti etiketa manipud {{PLURAL:$1|ti daytoy a rebision|kadagiti amin a $1 a rebision}}",
        "tags-edit-logentry-legend": "Aginayon wenno agikkat kadagiti etiketa manipud {{PLURAL:$1|ti daytoy a listaan ti naikabil|kadagiti amin a $1 a listaan ti naikabkabil}}",
        "tags-edit-existing-tags": "Dagiti adda nga etiketa:",
-       "tags-edit-existing-tags-none": "''Awan''",
+       "tags-edit-existing-tags-none": "<em>Awan</em>",
        "tags-edit-new-tags": "Dagiti baro nga etiketa:",
        "tags-edit-add": "Inayon dagitoy nga etiketa:",
        "tags-edit-remove": "Ikkaten dagitoy nga etiketa:",
        "tags-edit-reason": "Rason:",
        "tags-edit-revision-submit": "Ipakat dagiti binaliwan {{PLURAL:$1|iti daytoy a rebision|kadagiti $1 a rebision}}",
        "tags-edit-logentry-submit": "Ipakat dagiti panagbaliw {{PLURAL:$1|iti daytoy a listaan ti naikabil|kadagiti $1 a listaan ti naikabkabil}}",
-       "tags-edit-success": "Balligi a naipakat dagiti binaliwan.",
+       "tags-edit-success": "Naipakat dagiti binaliwan.",
        "tags-edit-failure": "Saan a maipakat dagiti binaliwan:\n$1",
        "tags-edit-nooldid-title": "Imbalido a rebision ti puntaan",
        "tags-edit-nooldid-text": "Saanka a nanginagan ti ania man a rebision a puntaan a pagaramidan daytoy nga annong, wenno awan ti nainaganan a rebision.",
index 2241d06..7feb6b3 100644 (file)
@@ -57,6 +57,8 @@
        "editfont-style": "Нийсдара меттига чу йола зарба б|армат:",
        "editfont-default": "Браузерен гӀирса чура шрифт",
        "editfont-monospace": "Башхалон зарба",
+       "editfont-sansserif": "Белгало йоаца шрифт",
+       "editfont-serif": "Белгало йола шрифт",
        "sunday": "К|иранди",
        "monday": "Оршот",
        "tuesday": "Шинара",
        "october-date": "Тов $1",
        "november-date": "Лайчил $1",
        "december-date": "Чантар $1",
+       "period-am": "ДЦ",
+       "period-pm": "ДТ",
        "pagecategories": "{{PLURAL:$1|1=Катаг|Катагаш}}",
        "category_header": "\"$1\" Катага чура оаг|онаш",
        "subcategories": "Чуракатагаш",
        "moredotdotdot": "Д|ахо",
        "morenotlisted": "Ер |ояздар хьалдиззанз да.",
        "mypage": "Oаг|ув",
+       "anonuserpage": "Вовзаш воаца доакъашхо",
        "mytalk": "Дувцам",
-       "anontalk": "УкÑ\85 IP-меÑ\82Ñ\82ига Ð´Ñ\83вÑ\86ам",
+       "anontalk": "Ð\94Ñ\83вÑ\86аÑ\80",
        "navigation": "Наькъатохкарг",
        "and": "&#32;кхы",
        "qbfind": "Лахар",
        "view": "Б|аргтассам",
        "view-foreign": "Мазаоаг|он чу $1 хьажа",
        "edit": "Хувца",
+       "edit-local": "Хувца локальни йоазонца сурт оттадар",
        "create": "Хьаде",
+       "create-local": "ТIатоха локальни йоазонца сурт оттадар",
        "editthispage": "Ер оаг|ув хувца",
        "create-this-page": "Ep oаг|ув хьае",
        "delete": "Д|аяккха",
        "virus-unknownscanner": "довзашдоаца мазаундохьалург:",
        "welcomeuser": "Маьрша доаг|алд, $1!",
        "yourname": "Дакъалаьцархочунна цӀи:",
+       "userlogin-yourname": "Доакъашхочунна цӀи",
+       "userlogin-yourname-ph": "Чуйоалае доакъашхочун цӀи",
+       "createacct-another-username-ph": "Чуйоалае доакъашхочун цӀи",
        "yourpassword": "КъайладIоагӀа:",
        "yourpasswordagain": "КъайладIоагӀа юха Ӏоязаде:",
        "remembermypassword": "(укх $1 {{PLURAL:$1|1=ден|деношкахь}}) мара са чувалара/чуялара дагалоаца дезаш дац",
        "searchprofile-images-tooltip": "Паьлий лахар",
        "searchprofile-everything-tooltip": "Массадола оагIувний лахар (дувцама оагIувнаш чулоацаш)",
        "searchprofile-advanced-tooltip": "Iочуязаяь цIераренашках лаха",
-       "search-result-size": " $1 ({{PLURAL:$2|1=1 дош|$2 дешаш}})",
+       "search-result-size": "$1 ({{PLURAL:$2|$2 дош|$2 дешаш}})",
        "search-result-category-size": "{{PLURAL:$1|1=$1 дакъа|$1 дакъаш}} ({{PLURAL:$2|1=$2 кIалцатег|$2 кIалцатегаш}}, {{PLURAL:$3|1=$3 паьла|$3 паьлий}})",
        "search-redirect": "($1 дехьачуяьккхар)",
        "search-section": " (дакъа $1)",
        "newpageletter": "Н",
        "boteditletter": "б",
        "rc_categories_any": "МоллагIа а",
+       "rc-change-size-new": "Хувцам баьнначул тӀехьагIа бола боарам: $1 {{PLURAL:$1|байт}}",
        "rc-enhanced-expand": "Ма дарра чулоацамаш хьахьокха (JavaScriptаца)",
        "rc-enhanced-hide": "Ма дарра чулоацамаш къайладаккха",
        "recentchangeslinked": "Гаргалон хувцамаш",
        "tooltip-pt-mycontris": "Шун хувцамаш",
        "tooltip-pt-login": "Укхаза хьай цIи аьле чувала/яла йиша я, амма чуцаваьлача/ялача хIама а дац",
        "tooltip-pt-logout": "Аравала/яла",
+       "tooltip-pt-createaccount": "Хьа бокъо я лоархIама яздар кхелла система чу вала, амма декхар долаш дац из.",
        "tooltip-ca-talk": "ОагIувна чулоацаме дувцам",
        "tooltip-ca-edit": "Хувца ер оагIув",
        "tooltip-ca-addsection": "Керда декъам хьаде",
        "tooltip-rollback": "ГIалaтнийсадаро тIехьара яь йола хувцамаш, пIелг тоIобе дIаяьккха.",
        "tooltip-undo": "Баь хувцам дIабаьккхe, бIаргатассам хьахьокха, кара дале, дIаяьккха бахьан Iочуязаде моттигаца.",
        "tooltip-summary": "Лоаца чулоацам Iочуязаде",
+       "pageinfo-toolboxlink": "ОагIонах бола хоам",
        "previousdiff": "← Хьалхара хувцам",
        "nextdiff": "ТIайоагIа хувцам",
        "file-info-size": "$1 × $2 фихсам, паьла дустам: $3, MIME-тайп: $4",
index 25786f6..98bf2e5 100644 (file)
        "filecopyerror": "Mistókst að afrita skjal \"$1\" á \"$2\".",
        "filerenameerror": "Gat ekki endurnefnt skrána „$1“ í „$2“.",
        "filedeleteerror": "Gat ekki eytt skránni „$1“.",
-       "directorycreateerror": "Gat ekki búið til efnisskrána \"$1\".",
+       "directorycreateerror": "Gat ekki búið til möppuna \"$1\".",
        "directoryreadonlyerror": "Mappan \"$1\" er skrifvarin.",
        "directorynotreadableerror": "Mappan \"$1\" er ekki lesanleg.",
        "filenotfound": "Gat ekki fundið skrána „$1“.",
        "virus-unknownscanner": "óþekktur veiruskanni:",
        "logouttext": "'''Þú hefur verið skráð(ur) út.'''\n\nAthugaðu að sumar síður kunna að birtast líkt og þú sért ennþá skráð(ur) inn, þangað til að þú hreinsar skyndiminnið í vafranum þínum.",
        "cannotlogoutnow-title": "Get ekki skráð út núna",
+       "cannotlogoutnow-text": "Útskráning er ekki möguleg þegar verið er að nota $1.",
        "welcomeuser": "Velkomin(n), $1!",
        "welcomecreation-msg": "Aðgangurinn þinn hefur verið búinn til.\nEkki gleyma að breyta [[Special:Preferences|{{SITENAME}} stillingunum]] þínum.",
        "yourname": "Notandanafn:",
        "userlogin-remembermypassword": "Muna innskráningu mína",
        "userlogin-signwithsecure": "Nota örugga tengingu",
        "cannotloginnow-title": "Get ekki skráð inn núna",
+       "cannotloginnow-text": "Innskráning er ekki möguleg þegar verið er að nota $1.",
        "yourdomainname": "Þitt lén:",
        "password-change-forbidden": "Þú getur ekki breytt lykilorðum á þessum wiki.",
        "externaldberror": "Uppfærsla mistókst. Annaðhvort varð villa í gagnasafninu eða að þér sé óheimilt að uppfæra aðra aðganga.",
        "loginerror": "Innskráningarvilla",
        "createacct-error": "Stofnun aðgangs mistókst",
        "createaccounterror": "Gat ekki búið til notanda: $1",
-       "nocookiesnew": "Innskráningin var búin til, en þú ert ekki skráð(ur) inn.\n{{SITENAME}} notar vefkökur til að skrá inn notendur.\nÞú hefur lokað fyrir vefkökur.\nGjörðu svo vel og opnaðu fyrir þær, skráðu þig svo inn með notandanafni og lykilorði.",
+       "nocookiesnew": "Notandaaðgangur var búin til, en þú ert ekki skráð(ur) inn.\n{{SITENAME}} notar vefkökur til að skrá inn notendur.\nÞú hefur lokað fyrir vefkökur.\nEndilega opnaðu fyrir þær, skráðu þig svo inn með notandanafni og lykilorði.",
        "nocookieslogin": "{{SITENAME}} notar vefkökur til innskráningar. Vafrinn þinn er ekki að taka á móti þeim. Virkjaðu móttöku á vefkökum í vafranum þínum til að geta skráð þig inn.",
-       "nocookiesfornew": "Notenda aðgangurinn var ekki stofnaður, því ekki fannst uppruni beiðnarinnar.\nGakktu úr skugga um að vefkökur séu virkar, endurhladdu þessari síðu og reyndu aftur.",
+       "nocookiesfornew": "Notandaaðgangurinn var ekki stofnaður, því ekki var hægt að staðfesta uppruna beiðnarinnar.\nGakktu úr skugga um að vefkökur séu virkar, endurlestu þessa síðu og reyndu aftur.",
        "noname": "Þú hefur ekki tilgreint gilt notandanafn.",
        "loginsuccesstitle": "Innskráning tókst",
        "loginsuccess": "'''Þú ert nú innskráð(ur) á {{SITENAME}} sem „$1“.'''",
        "wrongpassword": "Uppgefið lykilorð er rangt. Reyndu aftur.",
        "wrongpasswordempty": "Lykilorðsreiturinn var auður. Reyndu aftur.",
        "passwordtooshort": "Lykilorð skal vera að minnsta kosti $1 {{PLURAL:$1|stafur|stafir}}.",
+       "passwordtoolong": "Lykilorð geta ekki verið lengri en $1 {{PLURAL:$1|stafur|stafir}}.",
+       "passwordtoopopular": "Ekki má nota algeng lykilorð. Veldu eitthvað alveg sérstakt lykilorð.",
        "password-name-match": "Þarf að lykilorð þitt sé öðruvísi notandanafni þínu",
        "password-login-forbidden": "Notkun þessa notandanafns og lykilorðs er ekki leyfileg.",
        "mailmypassword": "Endurstilla lykilorð",
        "previewnote": "'''Það sem sést hér er aðeins forskoðun og hefur ekki enn verið vistað!'''",
        "continue-editing": "Fara á breytingasvæði",
        "previewconflict": "Þessi forskoðun endurspeglar textann í efra breytingarsvæði eins og hann myndi líta út ef þú vistar.",
-       "session_fail_preview": "Því miður! Við gátum ekki unnið úr breytingu þinni vegna týndra setugagna.\n\nÞú hefur kannski verið skráð/ur út. <strong>Sannreyndu hvort þú sért ennþá skráð/ur inn og reyndu aftur</strong>.\nEf það virkar ekki, reyndu að [[Special:UserLogout|skrá þig út]], skrá þig aftur inn og athugaðu hvort vafrinn þinn leyfikökur frá þessu vefsvæði.",
-       "session_fail_preview_html": "Afsakaðu! Við gátum ekki unnið úr breytingunni þinni vegna týndra lotugagna.\n\n<em>Þar sem {{SITENAME}} styður hráan HTML kóða, þá hefur forskoðunin verið falin sem vörn gegn JavaScript árásum.</em>\n\n<strong>Ef þetta er vingjarnleg breyting, reyndu þá aftur.</strong>\nEf það virkar ekki, reyndu að [[Special:UserLogout|skrá þig út]], skrá þig aftur inn og athugaðu hvort vafrinn þinn leyfir kökur frá þessu vefsvæði.",
+       "session_fail_preview": "Því miður! Við gátum ekki unnið úr breytingu þinni vegna týndra setugagna.\n\nÞú hefur kannski verið skráð/ur út. <strong>Sannreyndu hvort þú sért ennþá skráð/ur inn og reyndu aftur</strong>.\nEf það virkar ekki, reyndu að [[Special:UserLogout|skrá þig út]], skrá þig aftur inn og athugaðu hvort vafrinn þinn leyfi vefkökur frá þessu vefsvæði.",
+       "session_fail_preview_html": "Afsakaðu! Við gátum ekki unnið úr breytingunni þinni vegna týndra setugagna.\n\n<em>Þar sem {{SITENAME}} styður hráan HTML kóða, þá hefur forskoðunin verið falin sem vörn gegn JavaScript árásum.</em>\n\n<strong>Ef þetta er lögleg breyting, reyndu þá aftur.</strong>\nEf það virkar ekki, reyndu að [[Special:UserLogout|skrá þig út]], skrá þig aftur inn og athugaðu hvort vafrinn þinn leyfi vefkökur frá þessu vefsvæði.",
        "token_suffix_mismatch": "'''Breytingu þinni hefur verið hafnað því að biðlarinn þinn ruglaði greinarmerkingum í breytingar tókanum.\"\nÞetta er gert til að hindra spillingu texta síðunnar.\nÞetta getur gerst þegar þú notar bilaðan vafra eða ónafngreinda vefsels þjónustu.",
        "edit_form_incomplete": "'''Sumir hlutar breytingarinnar bárust ekki til vefþjónsins; athugaðu hvort breytingin þín er óbreytt og reyndu aftur.'''",
        "editing": "Breyti $1",
        "template-protected": "(vernduð)",
        "template-semiprotected": "(hálfvernduð)",
        "hiddencategories": "Þessi síða er meðlimur í $1 {{PLURAL:$1|földum flokki|földum flokkum}}:",
-       "edittools": "<!-- Þessi texti verður sýndur undir breytingar og upphölunar eyðublöðum. -->",
+       "edittools": "<!-- Þessi texti verður sýndur undir breytinga- og innhleðslueyðublöðum. -->",
        "edittools-upload": "-",
        "nocreatetext": "{{SITENAME}} hefur takmarkað eiginleikann að gera nýjar síður.\nÞú getur farið til baka og breytt núverandi síðum, eða [[Special:UserLogin|skráð þið inn eða búið til aðgang]].",
        "nocreate-loggedin": "Þú hefur ekki leyfi til að búa til nýjar síður.",
        "mergehistory-from": "Upprunaleg síða:",
        "mergehistory-into": "Áætlunarsíða:",
        "mergehistory-list": "Breytingaskrár sem hægt er að sameina",
-       "mergehistory-merge": "Eftirtaldar útgáfur [[:$1]] má sameina [[:$2]].\nNotaðu valtakkadálkinn til þess að sameina aðeins þær útgáfur sem stofnaðar voru fyrir uppgefið tímamark.\nAthugaðu að með því að nota flakktenglana er þessi dálkur endurstilltur.",
+       "mergehistory-merge": "Eftirtaldar útgáfur [[:$1]] má sameina [[:$2]].\nNotaðu valreitadálkinn til þess að sameina aðeins þær útgáfur sem stofnaðar voru fyrir uppgefið tímamark.\nAthugaðu að með því að nota flakktenglana er þessi dálkur endurstilltur.",
        "mergehistory-go": "Sýna breytingar sem hægt er að sameina",
        "mergehistory-submit": "Sameina útgáfur",
        "mergehistory-empty": "Engar útgáfur sem hægt er að sameina.",
        "prefs-rendering": "Útlit",
        "saveprefs": "Vista",
        "restoreprefs": "Endurstilla allar sjálfgefnar stillingar (í öllum hlutum)",
-       "prefs-editing": "Breytingarflipinn",
+       "prefs-editing": "Breytingaflipinn",
        "rows": "Raðir",
        "columns": "Dálkar",
        "searchresultshead": "Leit",
        "right-suppressredirect": "Ekki búa til tilvísun frá gamla nafninu þegar síða er færð",
        "right-upload": "Hlaða inn skrám",
        "right-reupload": "Yfirrita núverandi skrá",
-       "right-reupload-own": "Yfirrita núverandi skrá sem að ég hlóð inn sjálf(ur)",
+       "right-reupload-own": "Yfirrita fyrirliggjandi skrár sem að ég hlóð inn sjálf(ur)",
        "right-reupload-shared": "Hunsa skrár á sameiginlegu myndasafni staðbundið",
-       "right-upload_by_url": "Hlaða inn skrám frá vefslóð",
+       "right-upload_by_url": "Hlaða inn skrám af vefslóð",
        "right-purge": "Hreinsa skyndiminni síðu án staðfestingar",
        "right-autoconfirmed": "Sneiða hjá takmörkunum vistfanga",
        "right-bot": "Eru meðhöndlaðir eins og sjálfvirk aðgerð",
        "action-upload": "hlaða inn þessari skrá",
        "action-reupload": "yfirrita þessa skrá",
        "action-reupload-shared": "Hunsa þessa skrá á sameiginlega myndasafninu",
-       "action-upload_by_url": "hlaða inn þessari skrá frá vefslóð",
+       "action-upload_by_url": "hlaða inn þessari skrá af vefslóð",
        "action-writeapi": "Nota API skrifun",
        "action-delete": "eyða þessari síðu",
        "action-deleterevision": "eyða þessari breytingu",
        "action-protect": "breyta verndunarstigum fyrir þessa síðu",
        "action-rollback": "Taka snögglega aftur breytingar síðasta notanda sem breytti ákveðinni síðu",
        "action-import": "flytja inn síður frá öðrum wiki",
-       "action-importupload": "flytja inn síður frá skráarupphali",
+       "action-importupload": "flytja inn síður úr innsendri skrá",
        "action-patrol": "Merkja breytingar annara sem yfirfarnar",
        "action-autopatrol": "Merkja eigin breytingu sem yfirfarna",
        "action-unwatchedpages": "Skoða lista yfir óvaktaðar síður",
        "autochange-username": "Sjálfvirk MediaWiki-breyting",
        "upload": "Hlaða inn skrá",
        "uploadbtn": "Hlaða inn skrá",
-       "reuploaddesc": "Aftur á innhlaðningarformið.",
+       "reuploaddesc": "Hætta við og fara aftur á innhleðsluformið.",
        "upload-tryagain": "Sendu breytta myndlýsingu",
        "uploadnologin": "Óinnskráð(ur)",
-       "uploadnologintext": "Þú verður $1 til að hala upp skrár.",
-       "upload_directory_missing": "Mappa upphlaða ($1) er týnd og vefþjónninn gat ekki búið hana til.",
-       "upload_directory_read_only": "Mistókst að skrifa í möppu upphlaða ($1) á vefþjóni.",
-       "uploaderror": "Villa í innhlaðningu",
+       "uploadnologintext": "Þú verður $1 til að hlaða inn skrám.",
+       "upload_directory_missing": "Innhleðslumappan ($1) er týnd og vefþjónninn gat ekki búið hana til.",
+       "upload_directory_read_only": "Mistókst að skrifa í innhleðslumöppu ($1) á vefþjóninum.",
+       "uploaderror": "Villa í innhleðslu",
        "upload-recreate-warning": "<strong>Viðvörun: Skrá með þessu nafni hefur verið eytt eða færð.</strong>\n\nAnnáll varðandi eyðingu og færslu þessarar síðu er birtur hér fyrir neðan til skýringar: \\",
-       "uploadtext": "Notaðu eyðublaðið hér fyrir neðan til að hlaða inn skrám.\nTil að skoða eða leita í áður innhlöðnum skrám ferðu á [[Special:FileList|skráarlistann]], (endur)innhlaðnar skrár eru skráðar í [[Special:Log/upload|innhlaðningarskránni]], eyðingar í [[Special:Log/delete|eyðingaskránni]].\n\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Skrá.jpg]]</nowiki></code>''' til að sýna skrána í fullri upplausn.\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Skrá.png|200px|thumb|left|alt-texti]]</nowiki></code>''' til að nota 200 mynddíla upplausn, í ramma á vinstri spássíu með 'alt text' sem myndlýsingu.\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Skrá.ogg]]</nowiki></code>''' til að tengja í myndina án þess að sýna hana.",
+       "uploadtext": "Notaðu eyðublaðið hér fyrir neðan til að hlaða inn skrám.\nTil að skoða eða leita í áður innhlöðnum skrám ferðu á [[Special:FileList|skráarlistann]], (endur)innhlaðnar skrár eru skráðar í [[Special:Log/upload|innhleðsluskránni]], eyðingar í [[Special:Log/delete|eyðingaskránni]].\n\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Skrá.jpg]]</nowiki></code>''' til að sýna skrána í fullri upplausn.\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Skrá.png|200px|thumb|left|alt-texti]]</nowiki></code>''' til að nota 200 mynddíla upplausn, í ramma á vinstri spássíu með 'alt text' sem myndlýsingu.\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Skrá.ogg]]</nowiki></code>''' til að tengja í myndina án þess að sýna hana.",
        "upload-permitted": "{{PLURAL:$2|Heimiluð skráargerð|Heimilaðar skráargerðir}}: $1.",
        "upload-preferred": "{{PLURAL:$2|Ákjósanleg skrárgerð|Ákjósanlegar skrárgerðir}}: $1.",
        "upload-prohibited": "{{PLURAL:$2|Óheimiluð skrárgerð|Óheimilaðar skrárgerðir}}: $1.",
-       "uploadlogpage": "Innhlaðningarskrá",
+       "uploadlogpage": "Innhleðsluskráning",
        "uploadlogpagetext": "Fyrir neðan er listi yfir nýlegast innsendu skrárnar.\nSjá [[Special:NewFiles|myndasafn nýrra mynda]] til að sjá myndrænna yfirlit.",
        "filename": "Skráarheiti",
        "filedesc": "Lýsing",
        "fileexists-forbidden": "Skrá með þessu nafni er þegar til og ekki er hægt að skrifa yfir hana.\nEf þú vilt hlaða skránni þinni inn engu að síður, farðu þá til baka og veldu annað skráarheiti.\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Skrá með þessu nafni er þegar til í sameiginlega myndasafninu.\nEf þú vilt hlaða skránni þinni inn engu að síður, farðu þá til baka og veldu annað skráarheiti.\n[[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Þessi skrá er afrit eftirfarandi {{PLURAL:$1|skráar|skráa}}:",
-       "file-deleted-duplicate": "Afriti þessarar skráar ([[:$1]]) hefur verið eytt.\nÞú ættir að fara yfir eyðingarsögu skráarinnar áður en þú velur að hlaða skránni aftur inn.",
+       "file-deleted-duplicate": "Afriti þessarar skrár ([[:$1]]) hefur verið eytt.\nÞú ættir að fara yfir eyðingarsögu skrárinnar áður en þú velur að hlaða skránni aftur inn.",
        "file-deleted-duplicate-notitle": "Skrá sem er eins og þessi skrá hefur verið hlaðið inn áður og titill hennar hefur verið falinn.\nÞú ættir að spyrja einhvern með réttindi til að skoða falin skráagögn til að fara yfir málið áður en þú hleður skránni inn.",
-       "uploadwarning": "Aðvörun",
+       "uploadwarning": "Aðvörun vegna innsendingar",
        "uploadwarning-text": "Breyttu myndalýsingunni hér fyrir neðan og reyndu aftur.",
        "savefile": "Vista",
        "uploaddisabled": "Lokað er fyrir að hlaða inn myndum.",
        "copyuploaddisabled": "Lokað er fyrir að hlaða inn myndum frá vefslóð.",
        "uploaddisabledtext": "Lokað er fyrir að hlaða inn skrám.",
-       "php-uploaddisabledtext": "Upphleðsla skráa er óvirk í PHP.\nAthugaðu file_uploads stillinguna.",
+       "php-uploaddisabledtext": "Innhleðsla skráa er óvirk í PHP.\nAthugaðu file_uploads stillinguna.",
        "uploadscripted": "Þetta skjal inniheldur (X)HTML eða forskriftu sem gæti valdið villum í vöfrum.",
        "uploadscriptednamespace": "Þessi SVG-skrá inniheldur ógilt nafnrými \"$1\".",
        "uploadvirus": "Skráin inniheldur veiru! Nánari upplýsingar: $1",
-       "uploadjava": "Þessi skrá er ZIP skrá sem inniheldur Java .class skráasnið.\nUpphleðsla Java skráa er óheimil, því þær geta farið framhjá öryggiskröfum.",
+       "uploadjava": "Þessi skrá er ZIP skrá sem inniheldur Java .class skráasnið.\nInnhleðsla Java skráa er óheimil, því þær geta farið framhjá öryggiskröfum.",
        "upload-source": "Upprunaleg skrá",
        "sourcefilename": "Upprunalegt skráarheiti:",
        "sourceurl": "Uppruni:",
        "destfilename": "Móttökuskráarheiti:",
        "upload-maxfilesize": "Hámarks skráarstærð: $1",
        "upload-description": "Myndlýsing",
-       "upload-options": "Valmöguleikar fyrir upphöl",
+       "upload-options": "Valmöguleikar fyrir innsendingar",
        "watchthisupload": "Vakta þessa skrá",
        "filewasdeleted": "Skrá af sama nafni hefur áður verið hlaðið inn og síðan eytt. Þú ættir að athuga $1 áður en þú hleður skránni inn.",
+       "filename-thumb-name": "Titillinn bendir til þess að myndin sé smámynd. Vinsamlegast ekki hlaða inn smámyndum aftur á sama wiki og þær komu frá. Annars, ef það er ekki tilfellið, lagaðu skráarnafnið svo það hafi merkingu og hafi ekki forskeyti smámynda.",
        "filename-bad-prefix": "Skráarheitið byrjar á <strong>\"$1\"</strong> og er ekki lýsandi fyrir skrána, sem bendir til þess að það hafi verið það búið til af stafrænni myndavél.\nVeldu lýsandi nafn fyrir skrána og reyndu aftur.",
        "upload-proto-error": "Vitlaus samskiptaregla",
-       "upload-proto-error-text": "Upphleðsla frá öðrum vefþjóni þarfnast vefslóðar sem byrjar á <code>http://</code> eða <code>ftp://</code>.",
+       "upload-proto-error-text": "Innhleðsla frá öðrum vefþjóni þarfnast vefslóðar sem byrjar á <code>http://</code> eða <code>ftp://</code>.",
        "upload-file-error": "Innri villa",
        "upload-file-error-text": "Innri villa: Gat ekki búið til bráðabirgðaskrá á vefþjóni.\nEndilega hafðu samband við [[Special:ListUsers/sysop|stjórnanda]].",
        "upload-misc-error": "Óþekkt innhleðsluvilla",
-       "upload-misc-error-text": "Upphal þitt mistókst vegna óþekktrar villu.\nAthugaðu hvort vefslóðin sé rétt og aðgengileg og að því loknu reyndu aftur.\nEf vandamálið lagast ekki, hafðu samband við [[Special:ListUsers/sysop|stjórnanda]].",
+       "upload-misc-error-text": "Innsending þín mistókst vegna óþekktrar villu.\nAthugaðu hvort vefslóðin sé rétt og aðgengileg og að því loknu reyndu aftur.\nEf vandamálið lagast ekki, hafðu samband við [[Special:ListUsers/sysop|stjórnanda]].",
        "upload-too-many-redirects": "Vefslóðin inniheldur of margar tilvísanir.",
        "upload-http-error": "HTTP villa kom upp: $1",
-       "upload-copy-upload-invalid-domain": "Lokað er fyrir afritun skráa frá öðrum vefþjón á þessu vefsvæði.",
+       "upload-copy-upload-invalid-domain": "Lokað er fyrir afritun skráa frá öðrum vefþjónum á þessu vefsvæði.",
        "upload-dialog-title": "Hlaða inn skrá",
        "upload-dialog-button-cancel": "Hætta við",
        "upload-dialog-button-done": "Lokið",
        "foreign-structured-upload-form-label-infoform-date": "Dagsetning",
        "foreign-structured-upload-form-label-own-work-message-local": "Ég skil að ég sé að hlaða inn skrá samkvæmt notkunarskilmálum og leyfisskilmálum {{SITENAME}}.",
        "foreign-structured-upload-form-label-not-own-work-message-local": "Ef þú getur ekki hlaðið inn þessari skrá samkvæmt reglum {{SITENAME}}, lokaðu þá þessum glugga og reyndu aðra aðferð.",
-       "foreign-structured-upload-form-label-not-own-work-local-local": "Þú gætir einnig prófað að nota [[Special:Upload|sjálfgefnu upphleðslusíðuna]].",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Þú gætir einnig prófað að nota [[Special:Upload|sjálfgefnu innhleðslusíðuna]].",
        "foreign-structured-upload-form-label-own-work-message-default": "Ég skil að ég sé að hlaða inn skrá á sameiginlegt vefsvæði. Ég staðfesti að ég sé að gera það samkvæmt notkunarskilmálum og leyfisskilmálum þess.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Ef þú getur ekki hlaðið inn þessari skrá samkvæmt reglum sameiginlega vefsvæðisins, lokaðu þá þessum glugga og reyndu aðra aðferð.",
-       "foreign-structured-upload-form-label-not-own-work-local-default": "Þú gætir einnig prófað að nota [[Special:Upload|upphleðslusíðuna á {{SITENAME}}]], ef það má hlaða þessari skrá inn samkvæmt reglum þeirra.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Þú gætir einnig prófað að nota [[Special:Upload|innhleðslusíðuna á {{SITENAME}}]], ef það má hlaða þessari skrá inn samkvæmt reglum þeirra.",
        "foreign-structured-upload-form-label-own-work-message-shared": "Ég staðfesti að ég eigi höfundarréttinn að þessari skrá og samþykki óafturkræft að gefa þessa skrá til Wikimedia Commons undir  [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] leyfi. Ég samþykki [https://wikimediafoundation.org/wiki/Terms_of_Use notendaskilmálana].",
-       "foreign-structured-upload-form-label-not-own-work-message-shared": "Ef þú átt ekki höfundarréttinn að þessari skrá, eða þú vilt gefa það út undir öðru leyfi, prófaðu  [https://commons.wikimedia.org/wiki/Special:UploadWizard Upphleðsluálfinn á Commons].",
-       "foreign-structured-upload-form-label-not-own-work-local-shared": "Þú gætir einnig prófað að nota [[Special:Upload|upphleðslusíðuna á {{SITENAME}}]], ef það má hlaða þessari skrá inn samkvæmt reglum þeirra.",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Ef þú átt ekki höfundarréttinn að þessari skrá, eða þú vilt gefa það út undir öðru leyfi, prófaðu  [https://commons.wikimedia.org/wiki/Special:UploadWizard Innsendingaálfinn á Commons].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Þú gætir einnig prófað að nota [[Special:Upload|innhleðslusíðuna á {{SITENAME}}]], ef það má hlaða þessari skrá inn samkvæmt reglum þeirra.",
        "backend-fail-stream": "Gat ekki streymt skránni „$1“.",
        "backend-fail-backup": "Öryggisafritun skrárinnar $1 mistókst.",
        "backend-fail-notexists": "Skráin $1 er ekki til.",
        "invalid-chunk-offset": "Ógild raðbreyting bunka",
        "img-auth-accessdenied": "Aðgangur óheimill",
        "img-auth-nopathinfo": "PATH_INFO vantar.\nBiðlarinn þínn er ekki stilltur til að gefa upp þessar upplýsingar.\nÞær mega vera CGI-byggðar og mega ekki styðja img_auth.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
-       "img-auth-notindir": "Umbeðin slóð var ekki í stilltri upphlaðsmöppu.",
+       "img-auth-notindir": "Umbeðin slóð var ekki í stilltri innhleðslumöppu.",
        "img-auth-badtitle": "Mistókst að búa til gildan titil útfrá „$1”.",
        "img-auth-nologinnWL": "Þú ert ekki skráð(ur) inn og „$1“ er ekki á hvítlista.",
        "img-auth-nofile": "Skráin \"$1\" er ekki til.",
        "upload_source_url": "(skrá sem þú velur frá gildri og aðgengilegri vefslóð)",
        "upload_source_file": "(skrá sem þú velur á tölvunni þinni)",
        "listfiles-delete": "eyða",
-       "listfiles-summary": "Þessi kerfissíða sýnir allar upphlaðnar skrár.",
+       "listfiles-summary": "Þessi kerfissíða sýnir allar innsendar skrár.",
        "listfiles_search_for": "Leita að heiti gagnamiðils:",
        "listfiles-userdoesnotexist": "Notandinn \"$1\" er ekki skráður.",
        "imgfile": "skrá",
        "shared-repo-from": "frá $1",
        "shared-repo": "sameiginlegu myndasafni",
        "shared-repo-name-wikimediacommons": "Wikimedia Commons",
+       "filepage.css": "/* Allt CSS sem sett er hér er haft með á lýsingarsíðunni, en einnig á utanaðkomandi tilvísandi wiki-um (foreign client wikis). */",
        "upload-disallowed-here": "Þú getur ekki yfirskrifað þessa skrá.",
        "filerevert": "Taka aftur $1",
        "filerevert-legend": "Taka aftur skrá",
        "mimesearch": "MIME-leit",
        "mimesearch-summary": "Þessi síða gerir þér kleift að leita eftir skrám eftir MIME-gerð þeirra.\n\nLeitarstrengurinn á að vera á þessu formi: efnistag/myndasnið eða efnismerki/*, t.d. <code>image/jpeg</code>.",
        "mimetype": "MIME-tegund:",
-       "download": "Hlaða niður",
+       "download": "sækja",
        "unwatchedpages": "Óvaktaðar síður",
        "listredirects": "Endurbeiningar",
        "listduplicatedfiles": "Listi yfir afritaðar skrár",
        "statistics-articles": "Greinar alls",
        "statistics-pages": "Síður",
        "statistics-pages-desc": "Allar síður wiki-verkefnisins, þar á meðal spjallsíður, tilvísanir o.fl.",
-       "statistics-files": "Skráafjöldi",
+       "statistics-files": "Innsendar skrár",
        "statistics-edits": "Síðubreytingar frá því {{SITENAME}} byrjaði",
        "statistics-edits-average": "Meðal breytingafjöldi á síðu",
        "statistics-users": "Skráðir  [[Special:ListUsers|notendur]]",
        "apisandbox-submit": "Gera fyrirspurn",
        "apisandbox-reset": "Hreinsa",
        "apisandbox-retry": "Reyna aftur",
+       "apisandbox-loading": "Hleð inn upplýsingum fyrir API-eininguna \"$1\"...",
+       "apisandbox-no-parameters": "Þessi API-eining hefur engin viðföng.",
        "apisandbox-helpurls": "Hjálpartenglar",
        "apisandbox-examples": "Dæmi",
        "apisandbox-dynamic-parameters": "Auka viðföng",
        "sp-contributions-blocklog": "fyrri bönn",
        "sp-contributions-suppresslog": "bæld framlög notanda",
        "sp-contributions-deleted": "eyddar breytingar notanda",
-       "sp-contributions-uploads": "upphlaðið",
+       "sp-contributions-uploads": "innsendingar",
        "sp-contributions-logs": "aðgerðaskrá",
        "sp-contributions-talk": "spjall",
        "sp-contributions-userrights": "Breyta notandaréttindum",
        "importsuccess": "Innflutningi lokið!",
        "importnosources": "Engin wiki sem á að flytja inn frá hafa verið skilgreind og beinar innsendingar breytingaskráa eru óvirkar.",
        "importnofile": "Engri skrá var hlaðið inn.",
-       "importuploaderrorsize": "Upphleðsla skrárinnar mistókst.\nSkráin er stærri en leyfð hámarksstærð.",
-       "importuploaderrorpartial": "Upphleðsla skráarinnar mistókst.\nSkráinni var eingöngu hlaðið inn að hluta.",
-       "importuploaderrortemp": "Upphleðsla skrárinnar mistókst.\nBráðabirgðamappa fannst ekki.",
+       "importuploaderrorsize": "Innsending skrárinnar mistókst.\nSkráin er stærri en leyfð hámarksstærð.",
+       "importuploaderrorpartial": "Innsending skráarinnar mistókst.\nSkráinni var eingöngu hlaðið inn að hluta.",
+       "importuploaderrortemp": "Innsending skrárinnar mistókst.\nBráðabirgðamappa fannst ekki.",
        "import-parse-failure": "Þáttunarvilla við innflutning XML skjals",
        "import-noarticle": "Engin síða til innflutnings!",
        "import-nonewrevisions": "Engar breytingar voru fluttar inn (þær voru allar annaðhvort þegar til eða sleppt vegna villna).",
        "xml-error-string": "$1 í línu $2, dálki $3 ($4 bæt): $5",
        "import-upload": "Hlaða inn XML-gögnum",
-       "import-token-mismatch": "Týnd setugögn.\n\nÞú hefur kannski verið skráð/ur út. <strong>Athugaðu hvort þú sért ennþá skráð/ur inn og reyndu aftur</strong>.\nEf það virkar ekki, reyndu að [[Special:UserLogout|skrá þig út]], skrá þig aftur inn og gakktu úr skugga um að vafrinn þinn leyfi smákökur frá þessu vefsvæði.",
+       "import-token-mismatch": "Týnd setugögn.\n\nÞú hefur kannski verið skráð/ur út. <strong>Athugaðu hvort þú sért ennþá skráð/ur inn og reyndu aftur</strong>.\nEf það virkar ekki, reyndu að [[Special:UserLogout|skrá þig út]], skrá þig aftur inn og gakktu úr skugga um að vafrinn þinn leyfi vefkökur frá þessu vefsvæði.",
        "import-invalid-interwiki": "Get ekki flutt inn frá þessum wiki.",
        "import-error-edit": "Síðan \"$1\" var ekki flutt inn því þú hefur ekki réttindi til að breyta henni.",
        "import-error-create": "Síðan \"$1\" var ekki flutt inn því þú hefur ekki réttindi til að stofna hana.",
        "tags-edit-chosen-placeholder": "Veldu einhver merki",
        "tags-edit-chosen-no-results": "Engin merki fundust sem samsvara",
        "tags-edit-reason": "Ástæða:",
+       "tags-edit-nooldid-title": "Ógild markútgáfa",
        "tags-edit-none-selected": "Vinsamlega veldu a.m.k. eitt merki til að bæta við eða fjarlægja.",
        "comparepages": "Bera saman síður",
        "compare-page1": "Síða 1",
        "htmlform-chosen-placeholder": "Veldu valmöguleika",
        "htmlform-cloner-create": "Bæta við meiru",
        "htmlform-cloner-delete": "Fjarlægja",
+       "htmlform-cloner-required": "Það þarf allavega eitt gildi.",
        "htmlform-title-badnamespace": "[[:$1]] er ekki í \"{{ns:$2}}\" nafnrýminu.",
+       "htmlform-title-not-creatable": "\"$1\" er ekki hægt að nota við að búa til titil á síðu",
        "htmlform-title-not-exists": "$1 er ekki til",
        "htmlform-user-not-exists": "<strong>$1</strong> er ekki til.",
        "htmlform-user-not-valid": "<strong>$1</strong> er ekki gilt notandanafn.",
        "logentry-block-unblock": "$1 {{GENDER:$2|afbannaði}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|breytti}} bann stillingum fyrir {{GENDER:$4|$3}}, rennur út $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|bannaði}} {{GENDER:$4|$3}}, rennur út eftir $5 $6",
-       "logentry-merge-merge": "$1 {{GENDER:$2|sameinaði}} $3 inn í $4 (útgáfur til $5)",
+       "logentry-import-upload": "$1 {{GENDER:$2|flutti inn}} $3 úr innsendri skrá",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|flutti}} $3 inn úr innsendri skrá ($4 {{PLURAL:$4|útgáfa|útgáfur}})",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|flutti inn}} $3 frá öðru wiki",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|flutti}} $3 inn frá $5 ($4 {{PLURAL:$4|útgáfa|útgáfur}})",
+       "logentry-merge-merge": "$1 {{GENDER:$2|sameinaði}} $3 inn í $4 (útgáfur upp að $5)",
        "logentry-move-move": "$1 {{GENDER:$2|færði}} $3 á $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|færði}} $3 á $4 án þess að skilja eftir tilvísun",
        "logentry-move-move_redir": "$1 {{GENDER:$2|færði}} $3 á $4 yfir tilvísun",
        "logentry-newusers-create2": "$1 {{GENDER:$2|stofnaði}} notandaaðganginn $3",
        "logentry-newusers-byemail": "Notandaaðgangurinn $3 var {{GENDER:$2|búinn til}} af $1 og lykilorðið var sent með tölvupósti",
        "logentry-newusers-autocreate": "Aðgangurinn $1 var {{GENDER:$2|stofnaður}} sjálfvirkt",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|flutti}} verndunarstillingu úr $4 í $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|fjarlægði}} verndun af $3",
        "logentry-protect-protect": "$1 {{GENDER:$2|verndaði}} $3 $4",
+       "logentry-protect-modify": "$1 {{GENDER:$2|breytti}} verndunarstigi fyrir $3 $4",
        "logentry-rights-rights": "$1 {{GENDER:$2|breytti}} réttindum $3 frá $4 í $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|breytti}} réttindum $3",
        "logentry-rights-autopromote": "$1 fékk sjálfvirkt {{GENDER:$2|aukin}} réttindi frá $4 til $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|hlóð inn}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|hlóð inn}} nýrri útgáfu af $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|hlóð inn}} $3",
        "log-name-managetags": "Breytingaskrá yfir sýsl með merki",
        "logentry-managetags-create": "$1 {{GENDER:$2|bjó til}} merkið \"$4\"",
        "rightsnone": "(engum)",
        "searchsuggest-containing": "sem innihalda ...",
        "api-error-badaccess-groups": "Þú hefur ekki leyfi til að hlaða inn skrám.",
        "api-error-badtoken": "Innri villa: Skemmdur tóki.",
-       "api-error-copyuploaddisabled": "Ekki er hægt að hlaða upp með vefslóð á þessum vefþjón.",
+       "api-error-copyuploaddisabled": "Ekki er hægt að hlaða inn með vefslóð á þessum vefþjóni.",
        "api-error-duplicate": "Það {{PLURAL:$1|er önnur skrá|eru aðrar skrár}} þegar til á vefsvæðinu sem hafa sama innihald.",
        "api-error-duplicate-archive": "Það {{PLURAL:$1|var önnur skrá|voru aðrar skrár}} þegar á síðunni með sama innihald, en {{PLURAL:$1|henni|þeim}} var eytt.",
        "api-error-empty-file": "Skráin sem þú valdir er tóm.",
        "api-error-hookaborted": "Hætt var við breytinguna sem þú reyndir að gera með viðbót.",
        "api-error-http": "Innri villa: Get ekki tengst vefþjón.",
        "api-error-illegal-filename": "Þetta skráarheiti er ekki leyft.",
-       "api-error-internal-error": "Innri villa: Mistókst að vinna úr upphali þínu.",
+       "api-error-internal-error": "Innri villa: Mistókst að vinna úr innsendingunni þinni.",
        "api-error-invalid-file-key": "Innri villa: Skrá fannst ekki í bráðabirgðageymslu.",
        "api-error-missingparam": "Innri villa: Breytur vantar í beiðni.",
        "api-error-missingresult": "Innri villa: Gat ekki ákvarðað hvort tókst að afrita.",
        "api-error-mustbeloggedin": "Þú verður að vera skráður inn til að hlaða inn skrám.",
        "api-error-mustbeposted": "Innri villa: Beiðnin þarfnast HTTP POST.",
-       "api-error-noimageinfo": "Upphleðsla skrárinnar tókst, en vefþjónninn gaf okkur engar upplýsingar um skrána.",
-       "api-error-nomodule": "Innri villa: Engin upphlaðs eining valin.",
+       "api-error-noimageinfo": "Innsending skrárinnar tókst, en vefþjónninn gaf okkur engar upplýsingar um skrána.",
+       "api-error-nomodule": "Innri villa: Engin innsendingareining valin.",
        "api-error-ok-but-empty": "Innri villa: ekkert svar frá vefþjón.",
        "api-error-overwrite": "Óheimilt er að skrifa yfir skrá sem er þegar til.",
        "api-error-stashfailed": "Innri villa: Vefþjónninn gat ekki geymt bráðabirgðaskrá.",
        "expand_templates_generate_xml": "Birta XML-þáttunargreinar",
        "expand_templates_generate_rawhtml": "Birta hrátt HTML",
        "expand_templates_preview": "Forskoðun",
+       "expand_templates_preview_fail_html": "<em>Þar sem {{SITENAME}} styður hráan HTML kóða, þá hefur forskoðunin verið falin sem vörn gegn JavaScript árásum.</em>\n\n<strong>Ef þetta er lögleg breyting, reyndu þá aftur.</strong>\nEf það virkar ekki, reyndu að [[Special:UserLogout|skrá þig út]], skrá þig aftur inn og athugaðu hvort vafrinn þinn leyfi vefkökur frá þessu vefsvæði.",
+       "expand_templates_preview_fail_html_anon": "<em>Þar sem {{SITENAME}} styður hráan HTML kóða og þú ert ekki skráð/ur inn, þá hefur forskoðunin verið falin sem vörn gegn JavaScript árásum.</em>\n\n<strong>Ef þetta er lögleg breyting, reyndu að [[Special:UserLogin|skrá þig inn]], og prófa aftur.</strong>",
        "expand_templates_input_missing": "Þú verður að skrifa inn einhvern inntakstexta.",
        "pagelanguage": "Breyta tungumáli síðu",
        "pagelang-name": "Síða",
        "right-pagelang": "Breyta tungumáli síðu",
        "action-pagelang": "breyta tungumáli síðunnar",
        "log-name-pagelang": "Annáll yfir breytingar á tungumáli",
+       "log-description-pagelang": "Þetta er skráning yfir breytingar á tungumáli síðna.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|breytti}} tungumáli $3 úr $4 yfir í $5",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (virkt)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>óvirkt</strong>)",
        "api-error-blacklisted": "Veldu annan lýsandi titil",
        "sessionmanager-tie": "Get ekki sameinað margar gerðir auðkenningarbeiðna: $1.",
        "sessionprovider-generic": "$1 setur",
-       "sessionprovider-mediawiki-session-cookiesessionprovider": "setur með smákökum",
-       "sessionprovider-nocookies": "Smákökur gætu verið óvirkar. Gakktu úr skugga um að smákökur séu virkar og byrjaðu svo aftur.",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "setur með vefkökum",
+       "sessionprovider-nocookies": "Vefkökur gætu verið óvirkar. Gakktu úr skugga um að smákökur séu virkar og byrjaðu svo aftur.",
        "randomrootpage": "Handahófsvalin rótarsíða"
 }
index 990669d..9c61c24 100644 (file)
        "moredotdotdot": "Altro...",
        "morenotlisted": "Questo elenco non è completo.",
        "mypage": "Pagina",
+       "anonuserpage": "Utente sconosciuto",
        "mytalk": "discussioni",
        "anontalk": "discussioni",
        "navigation": "Navigazione",
        "createaccount-title": "Creazione di un accesso a {{SITENAME}}",
        "createaccount-text": "Qualcuno ha creato un accesso a {{SITENAME}} ($4) a nome di $2, associato a questo indirizzo di posta elettronica. La password per l'utente \"$2\" è impostata a \"$3\".\nÈ opportuno eseguire un accesso quanto prima e cambiare la password immediatamente.\n\nSe l'accesso è stato creato per errore, si può ignorare questo messaggio.",
        "login-throttled": "Sono stati effettuati troppi tentativi di accesso in breve tempo.\nAttendi $1 e riprova in seguito.",
-       "login-abort-generic": "Il tuo login non ha avuto successo - Annullato",
+       "login-abort-generic": "Il tuo accesso non è riuscito - Annullato",
        "login-migrated-generic": "La tua utenza è stata migrata, e il tuo nome utente non esiste più su questo wiki.",
        "loginlanguagelabel": "Lingua: $1",
        "suspicious-userlogout": "La tua richiesta di disconnessione è stata negata perché sembra inviata da un browser non funzionante o un proxy di caching.",
        "newpassword": "Nuova password:",
        "retypenew": "Riscrivi la nuova password:",
        "resetpass_submit": "Imposta la password e accedi al sito",
-       "changepassword-success": "La password è stata modificata correttamente!",
+       "changepassword-success": "La tua password è stata modificata!",
        "changepassword-throttled": "Sono stati effettuati troppi tentativi di accesso in breve tempo.\nAttendi $1 e riprova in seguito.",
        "botpasswords": "Password bot",
        "botpasswords-summary": "<em>Password bot</em> consente l'accesso ad un'utenza tramite API senza usare le credenziali di accesso principali dell'utenza. I diritti utente disponibili quando si è effettuato l'accesso con una password bot possono essere limitati.\n\nSe non conosci il motivo per cui potresti farlo, allora probabilmente non dovresti farlo. Nessuno dovrebbe mai chiederti di generare uno di questi e darli a loro.",
        "botpasswords-insert-failed": "Impossibile aggiungere il nome bot \"$1\". È stato già aggiunto?",
        "botpasswords-update-failed": "Impossibile aggiornare il nome bot \"$1\". È stato cancellato?",
        "botpasswords-created-title": "Password bot creata",
-       "botpasswords-created-body": "La password bot \"$1\" è stata creata con successo.",
+       "botpasswords-created-body": "La password per il bot di nome \"$1\" dell'utente \"$2\" è stata creata.",
        "botpasswords-updated-title": "Password bot aggiornata",
-       "botpasswords-updated-body": "La password bot \"$1\" è stata aggiornata con successo.",
+       "botpasswords-updated-body": "La password per il bot di nome \"$1\" dell'utente \"$2\" è stata aggiornata.",
        "botpasswords-deleted-title": "Password bot cancellata",
-       "botpasswords-deleted-body": "La password bot \"$1\" è stata cancellata.",
+       "botpasswords-deleted-body": "La password per il bot di nome \"$1\" dell'utente \"$2\" è stata cancellata.",
        "botpasswords-newpassword": "La nuova password per accedere con <strong>$1</strong> è <strong>$2</strong>. <em>Registratelo per consultazioni future.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider non è disponibile.",
        "botpasswords-restriction-failed": "Le restrizioni di password bot impediscono questo accesso.",
        "resetpass-no-info": "Devi aver effettuato l'accesso per accedere a questa pagina direttamente.",
        "resetpass-submit-loggedin": "Cambia password",
        "resetpass-submit-cancel": "Annulla",
-       "resetpass-wrong-oldpass": "Password temporanea o attuale non valida.\nLa password potrebbe essere stata già cambiata, oppure potrebbe essere stata richiesta una nuova password temporanea.",
+       "resetpass-wrong-oldpass": "Password temporanea o attuale non valida.\nLa password potrebbe essere stata già modificata, 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 qui:",
        "resetpass-temp-password": "Password temporanea:",
        "revdelete-unsuppress": "Elimina le limitazioni sulle versioni ripristinate",
        "revdelete-log": "Motivo:",
        "revdelete-submit": "Applica {{PLURAL:$1|alla versione selezionata|alle versioni selezionate}}",
-       "revdelete-success": "'''Visibilità della versione aggiornata correttamente.'''",
+       "revdelete-success": "Visibilità della versione aggiornata.",
        "revdelete-failure": "'''La visibilità della versione non può essere aggiornata:'''\n$1",
-       "logdelete-success": "'''Visibilità dell'evento impostata correttamente.'''",
+       "logdelete-success": "Impostata visibilità dell'evento.",
        "logdelete-failure": "'''La visibilità dell'evento non può essere impostata:'''\n$1",
        "revdel-restore": "cambia la visibilità",
        "pagehist": "Cronologia della pagina",
        "userrights-changeable-col": "Gruppi modificabili",
        "userrights-unchangeable-col": "Gruppi non modificabili",
        "userrights-conflict": "Conflitto di modifica dei diritti utente! Controlla e conferma le tue modifiche.",
-       "userrights-removed-self": "Hai rimosso con successo i tuoi diritti. E quindi, non sarai più in grado di accedere a questa pagina.",
+       "userrights-removed-self": "Hai rimosso i tuoi diritti. E quindi, non sarai più in grado di accedere a questa pagina.",
        "group": "Gruppo:",
        "group-user": "Utenti",
        "group-autoconfirmed": "Utenti autoconvalidati",
        "uploadstash-summary": "Questa pagina consente l'accesso ai file che sono stati caricati (o sono in fase di caricamento) ma che non sono stati ancora pubblicati sul wiki. Questi file sono visibili solo all'utente che li ha caricati.",
        "uploadstash-clear": "Elimina i file in stash",
        "uploadstash-nofiles": "Non hai file in stash.",
-       "uploadstash-badtoken": "Questa azione non ha avuto successo, forse perché le tue credenziali di modifica sono scadute. Prova ancora.",
-       "uploadstash-errclear": "La cancellazione dei file non ha avuto successo.",
+       "uploadstash-badtoken": "Esecuzione dell'azione non riuscita, forse perché le tue credenziali di modifica sono scadute. Prova ancora.",
+       "uploadstash-errclear": "La pulizia dei file non è riuscita.",
        "uploadstash-refresh": "Aggiorna l'elenco dei file",
        "invalid-chunk-offset": "Offset della parte non valido.",
        "img-auth-accessdenied": "Accesso negato",
        "changecontentmodel-title-label": "Titolo della pagina",
        "changecontentmodel-model-label": "Nuovo modello di contenuto",
        "changecontentmodel-reason-label": "Motivo:",
+       "changecontentmodel-submit": "Modifica",
        "changecontentmodel-success-title": "Il modello di contenuto è stato modificato",
        "changecontentmodel-success-text": "Il tipo di contenuto di [[:$1]] è stato modificato.",
        "changecontentmodel-cannot-convert": "Il contenuto di [[:$1]] non può essere convertito in tipo $2.",
        "confirmrecreate": "L'utente [[User:$1|$1]] ([[User talk:$1|discussioni]]) ha cancellato questa pagina dopo che hai iniziato a modificarla, per il seguente motivo: ''$2''\nPer favore, conferma che vuoi veramente ricreare questa pagina.",
        "confirmrecreate-noreason": "L'utente [[User:$1|$1]] ([[User talk:$1|discussioni]]) {{GENDER:$1|ha cancellato}} questa pagina dopo che hai iniziato a modificarla. Per favore, conferma che vuoi veramente ricreare questa pagina.",
        "recreate": "Ricrea",
-       "confirm_purge_button": "Conferma",
+       "confirm_purge_button": "OK",
        "confirm-purge-top": "Vuoi pulire la cache di questa pagina?",
        "confirm-purge-bottom": "Ripulire la cache di una pagina consente di mostrare la sua versione più aggiornata.",
        "confirm-watch-button": "OK",
        "tags-delete-not-allowed": "I tag definiti da un'estensione non possono essere eliminati a meno che ciò non sia specificamente permesso dall'estensione.",
        "tags-delete-not-found": "Il tag \"$1\" non esiste.",
        "tags-delete-too-many-uses": "Il tag \"$1\" è applicato a più di $2 {{PLURAL:$2|revisione|revisioni}}, il che significa che non può essere eliminato.",
-       "tags-delete-warnings-after-delete": "Il tag \"$1\" è stato eliminato con successo, ma fai attenzione {{PLURAL:$2|al seguente avviso|ai seguenti avvisi}}:",
+       "tags-delete-warnings-after-delete": "L'etichetta \"$1\" è stata cancellata, ma fai attenzione {{PLURAL:$2|al seguente avviso|ai seguenti avvisi}}:",
        "tags-activate-title": "Attiva tag",
        "tags-activate-question": "Stai per attivare il tag \"$1\".",
        "tags-activate-reason": "Motivo:",
        "tags-edit-reason": "Motivo:",
        "tags-edit-revision-submit": "Applica le modifiche a {{PLURAL:$1|questa versione|$1 versioni}}",
        "tags-edit-logentry-submit": "Applica le modifiche a {{PLURAL:$1|questa voce di registro|$1 voci di registro}}",
-       "tags-edit-success": "Le modifiche sono state applicate correttamente.",
+       "tags-edit-success": "Le modifiche sono state applicate.",
        "tags-edit-failure": "Non è stato possibile effettuare le seguenti modifiche:\n$1",
        "tags-edit-nooldid-title": "Versione specificata non valida",
        "tags-edit-nooldid-text": "Non è stata specificata alcuna versione della pagina su cui eseguire questa funzione, oppure la versione specificata non esiste.",
index fdd3c47..34bd816 100644 (file)
        "recentchanges-label-bot": "Dis edit pofaam bai bot",
        "recentchanges-label-unpatrolled": "Dis edit no get pachuol yet",
        "recentchanges-label-plusminus": "Di piej saiz chienj bai dis nomba a bait",
-       "recentchanges-legend-heading": "'''Lejen:'''",
+       "recentchanges-legend-heading": "<strong>Lejen:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (azwel si [[Special:NewPages|lis a nyuu piej]])",
        "rclistfrom": "Shuo nyuu chienjdem we taat frahn $3 $2",
        "rcshowhideminor": "$1 maina editdem",
index 37e963d..264a219 100644 (file)
        "recentchanges-label-bot": "Denn redigiireng bløw utförtj å i robott",
        "recentchanges-label-unpatrolled": "Redigiireng ä ennu ett bløwen patruljiirtj.",
        "recentchanges-label-plusminus": "Störrelsen på siden bløw øndan mä detj åntal bytes",
-       "recentchanges-legend-heading": "'''Forklareng:'''",
+       "recentchanges-legend-heading": "<strong>Forklareng:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sie åsså [[Special:NewPages|listen öwe nyj side]])",
        "rcnotefrom": "Nierfor ä op te '''$1''' {{PLURAL:$5|øndreng|øndrenge}} sien '''$2''' wisen.",
        "rclistfrom": "Wis nyj øndrenge startenje fra $3 kl. $2",
        "unwatch": "Fjän öwewågneng",
        "watchlist-details": "Du har $1 {{PLURAL:$1|side|sider}} på din åvervågnengsliste (øn diskusjesider).",
        "wlshowlast": "Ves de seneste $1 têmer $2 dåg",
-       "watchlistall2": "åle",
        "watching": "Tilfye öwewågneng...",
        "unwatching": "Fjäne öwewågneng...",
        "deletepage": "Slett siid",
index 69eae9f..8a4924e 100644 (file)
        "recentchanges-label-bot": "Suntingan iki diayahi déning bot",
        "recentchanges-label-unpatrolled": "Suntingan iki durung dipatroli",
        "recentchanges-label-plusminus": "Agengipun kaca sampun dipunowahi samekaten.",
-       "recentchanges-legend-heading": "'''Katrangan:'''",
+       "recentchanges-legend-heading": "<strong>Katrangan:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (dhelengen uga: [[Special:NewPages|daftar kaca anyar]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Ing ngisor iki owah-owahan wiwit <strong>$2</strong> (kapacak nganti <strong>$1</strong> owah-owahan).",
index 267ba5a..482b11e 100644 (file)
@@ -25,7 +25,8 @@
                        "Macofe",
                        "SHOTHA",
                        "Gi777ga",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Sopopruidze"
                ]
        },
        "tog-underline": "ბმულების ხაზგასმა:",
        "myprivateinfoprotected": "თქვენ არ გაქვთ თქვენი პირადი ინფორმაციის შეცვლის ნებართვა.",
        "mypreferencesprotected": "თქვენ არ გაქვთ თქვენი კონფიგურაციის შეცვლის ნებართვა.",
        "ns-specialprotected": "გვერდების რედაქტირება სახელთა სივრცეში {{ns:special}} შეუძლებელია.",
-       "titleprotected": "á\83¨á\83\94á\83\9bá\83\93á\83\94á\83\92á\83\98 á\83\92á\83\95á\83\94á\83 á\83\93á\83\98á\83¡ á\83¨á\83\94á\83¥á\83\9bá\83\9cá\83\90 á\83\90á\83\99á\83 á\83«á\83\90á\83\9aá\83£á\83\9aá\83\98á\83\90 á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\94á\83\9a [[User:$1|$1]]-ს მიერ.\nმოცემულია შემდეგი ახსნა: <em>$2</em>.",
+       "titleprotected": "á\83¨á\83\94á\83\9bá\83\93á\83\94á\83\92á\83\98 á\83¡á\83\90á\83\97á\83\90á\83£á\83 á\83\98á\83¡ á\83¨á\83\94á\83¥á\83\9bá\83\9cá\83\90 á\83\90á\83\99á\83 á\83«á\83\90á\83\9aá\83£á\83\9aá\83\98á\83\90 á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\94á\83\9a [[User:$1|$1]]-á\83\98ს მიერ.\nმოცემულია შემდეგი ახსნა: <em>$2</em>.",
        "filereadonlyerror": "ფაილის \"$1\" შეცვლა ვერ ხერხდება, რადგანაც ფაილის საცავი \"$2\" მხოლოდ კითხვის რეჟიმშია.\n\nსისტემურმა ადმინისტრატორმა, რომელმაც ის დაბლოკა, მოიყვანა შემდეგი მიზეზი: \"$3\".",
        "invalidtitle-knownnamespace": "დაუშვებელი სათაური სახელთა სივრცე \"$2\" და ტექსტი \"$3\"-თან",
        "invalidtitle-unknownnamespace": "დაუშვებელი სათაური უცნობი სახელთა სივრცის ნომერი $1 და ტექსტი \"$2\"-ით",
        "badretype": "თქვენს მიერ შეყვანილი პაროლები ერთმანეთს არ ემთხვევა.",
        "usernameinprogress": "ამ მომხმარებლისათვის ანგარიში იქმნება. გთხოვთ, დაიცადეთ.",
        "userexists": "ეს სახელი უკვე გამოყენებულია.\nგთხოვთ, აირჩიეთ სხვა.",
-       "loginerror": "á\83¨á\83\94á\83ªá\83\93á\83\9dá\83\9bá\83\90 á\83\90á\83\95á\83¢á\83\9dá\83 á\83\98á\83\96á\83\90á\83ªá\83\98á\83\98á\83¡á\83\90á\83¡",
+       "loginerror": "á\83\90á\83\95á\83¢á\83\9dá\83 á\83\98á\83\96á\83\90á\83ªá\83\98á\83\98á\83¡ á\83¨á\83\94á\83ªá\83\93á\83\9dá\83\9bá\83\90",
        "createacct-error": "ანგარიშის შექმნის შეცდომა",
        "createaccounterror": "$1 ანგარიშის შექმნა ვერ მოხერხდა.",
        "nocookiesnew": "მომხმარებლის ჩანაწერი შექმნილია, მაგრამ თქვენ არ გაგივლიათ რეგისტრაცია. {{SITENAME}} იყენებს cookies, რომლებიც თქვენს ბრაუზერში გათიშულია. გთხოვთ, აამოქმედოთ ისინი და შემდგომ ხელახლა გაიარეთ რეგისტრაცია.",
        "nocookiesfornew": "მომხმარებლის ანგარიში არ შექმნილა, რადგან მისი წყარო ვერ დადასტურდა.\nუზრუნველყოფილი უნდა იყოს ჭდეების აქტიურობა. შემდეგ განაახლეთ გვერდი და სცადეთ ხელახლა",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
        "noname": "თქვენს მიერ მითითებული მომხმარებლის სახელი ქმედითი არ არის.",
-       "loginsuccesstitle": "სისტემაში შესვლა განხორციელდა.",
+       "loginsuccesstitle": "სისტემაში შესვლა განხორციელდა",
        "loginsuccess": "'''ამჟამად შესული ხართ {{SITENAME}}-ში როგორც „$1“.'''",
        "nosuchuser": "მომხმარებელი სახელად $1 არ არსებობს.\nმომხმარებელთა სახელები გრძნობადია ასოების რეგისტრამდე..\nშეამოწმეთ სახელის დაწერა ან[[Special:UserLogin/signup|შექმენით ახალი ანგარიში]].",
        "nosuchusershort": "მომხმარებელი სახელით „$1“ არ არსებობს. შეამოწმეთ მართლწერა.",
        "createaccount-title": "ანგარიშის შექმნა {{SITENAME}}-თვის",
        "createaccount-text": "ვიღაცამ შექმნა ანგარიში სახელით „$2“ და პაროლით „$3“ თქვენი ელექტრონული ფოსტისთვის {{SITENAME}}-ში ($4). გთხოვთ დარეგისტრირდეთ და შეცვალოთ პაროლი.\n\nშეგიძლიათ ყურადღება არ მიაქციოთ ამ შეტყობინებას, თუ ანგარიში შეცდომით შეიქმნა.",
        "login-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.",
-       "login-abort-generic": "á\83\97á\83¥á\83\95á\83\94á\83\9cá\83\98 á\83\90á\83\95á\83¢á\83\9dá\83 á\83\98á\83\96á\83\90á\83ªá\83\98á\83\90 á\83¬á\83\90á\83 á\83£á\83\9bá\83\90á\83¢á\83\94á\83\91á\83\94á\83\9aá\83\98ა – გაუქმდა",
+       "login-abort-generic": "á\83\97á\83¥á\83\95á\83\94á\83\9cá\83\98 á\83\90á\83\95á\83¢á\83\9dá\83 á\83\98á\83\96á\83\90á\83ªá\83\98á\83\90 á\83\95á\83\94á\83  á\83\92á\83\90á\83\9cá\83®á\83\9dá\83 á\83ªá\83\98á\83\94á\83\9aá\83\93ა – გაუქმდა",
        "login-migrated-generic": "თქვენი ანგარიში გადატანილი იქნა, და თქვენი მომხმარებლის სახელი ამ ვიკიში აღარ არსებობს.",
        "loginlanguagelabel": "ენა: $1",
        "suspicious-userlogout": "თქვენი მოთხოვნა გასვლის შესახებ გაუქმებულია, რადგანაც იგი გავს ქეშირებადი პროქსის ან არაკორექტული ბრაუზერის მოთხოვნას.",
        "newpassword": "ახალი პაროლი:",
        "retypenew": "ახალი პაროლი განმეორებით:",
        "resetpass_submit": "მიუთითეთ პაროლი და დარეგისტრირდით",
-       "changepassword-success": "á\83\97á\83¥á\83\95á\83\94á\83\9cá\83\98 á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98 á\83¬á\83\90á\83 á\83\9bá\83\90á\83¢á\83\94á\83\91á\83\98á\83\97 á\83¨á\83\94á\83\98á\83ªá\83\95á\83\90á\83\9aá\83\90!",
+       "changepassword-success": "თქვენი პაროლი შეიცვალა!",
        "changepassword-throttled": "თქვენ განახორციელეთ ანგარიშში შესვლის ზედმეტად ბევრი მცდელობა. გამორებით შეყვანამდე გთხოვთ დაიცადოთ $1.",
        "botpasswords": "ბოტის პაროლები",
        "botpasswords-summary": "<em>ბოტების კოდები</em> საშუალებას იძლევა მომხმარებლის ანგარიშთან დაკავშირების API-ის გამოყენებით ანგარიშის ძირითადი შესვლის მონაცემების გამოყენების გარეშე. მომხმარებლის უფლებები ასეთი შესვლისას შესაძლოა შეზღუდული იყოს.\n\nთუ არ იცით ეს რატომ უნდა გააკეთოთ, ალბათ არც უნდა გააკეთოთ. ასეთი კოდის წამოქმნა და სხვისთვის გადაცემა არაა რეკომენდირებული.",
        "botpasswords-insert-failed": "ბოტის სახელის $1\" დამატება შეუძლებელია. უკვე დამატებულია?",
        "botpasswords-update-failed": "ბოტის სახელის \"$1\" განახლება შეუძლებელია. წაშლილია?",
        "botpasswords-created-title": "ბოტის პაროლი შექმნილია",
-       "botpasswords-created-body": "á\83\91á\83\9dá\83¢á\83\98á\83¡ á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98 \"$1\" á\83¬á\83\90á\83 á\83\9bá\83\90á\83¢á\83\94á\83\91á\83\98á\83\97 á\83¨á\83\94á\83\98á\83¥á\83\9bá\83\9cá\83\90.",
+       "botpasswords-created-body": "ბოტის პაროლი \"$1\" შეიქმნა.",
        "botpasswords-updated-title": "ბოტის პაროლი განახლდა",
-       "botpasswords-updated-body": "á\83\91á\83\9dá\83¢á\83\98á\83¡ á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98 \"$1\" á\83¬á\83\90á\83 á\83\9bá\83\90á\83¢á\83\94á\83\91á\83\98á\83\97 á\83\92á\83\90á\83\9cá\83\90á\83®á\83\9aá\83\93á\83\90.",
+       "botpasswords-updated-body": "ბოტის პაროლი \"$1\" განახლდა.",
        "botpasswords-deleted-title": "ბოტის პაროლი წაშლილია",
        "botpasswords-deleted-body": "ბოტის პაროლი \"$1\" წაიშალა.",
        "botpasswords-newpassword": "ახალი პაროლი <strong>$1</strong>-ით შესასვლელად არის <strong>$2</strong>. <em>გთხოვთ დაიმახსოვრეთ ან ჩაიწერეთ.</em>",
        "resetpass-no-info": "კონკრეტულად ამ გვერდთან სამუშაოდ თქვენ უნდა წარადგინოთ თავი სისტემისადმი.",
        "resetpass-submit-loggedin": "პაროლის შეცვლა",
        "resetpass-submit-cancel": "გაუქმება",
-       "resetpass-wrong-oldpass": "á\83\90á\83 á\83\90á\83¡á\83¬á\83\9dá\83 á\83\98 á\83\93á\83 á\83\9dá\83\94á\83\91á\83\98á\83\97á\83\98 á\83\90á\83\9c á\83\9bá\83\9dá\83¥á\83\9bá\83\94á\83\93á\83\98 á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98.\ná\83¨á\83\94á\83¡á\83\90á\83«á\83\9aá\83\9dá\83\90 á\83\97á\83¥á\83\95á\83\94á\83\9c á\83¬á\83\90á\83 á\83\9bá\83\90á\83¢á\83\94á\83\91á\83\98á\83\97 á\83¨á\83\94á\83ªá\83\95á\83\90á\83\9aá\83\94á\83\97 á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98 á\83\90á\83\9c á\83\9bá\83\9dá\83\98á\83\97á\83®á\83\9dá\83\95á\83\94á\83\97 á\83\90á\83®á\83\90ლი.",
+       "resetpass-wrong-oldpass": "á\83\90á\83 á\83\90á\83¡á\83¬á\83\9dá\83 á\83\98 á\83\93á\83 á\83\9dá\83\94á\83\91á\83\98á\83\97á\83\98 á\83\90á\83\9c á\83\9bá\83\9dá\83¥á\83\9bá\83\94á\83\93á\83\98 á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98.\ná\83¨á\83\94á\83¡á\83\90á\83«á\83\9aá\83\9dá\83\90 á\83\97á\83¥á\83\95á\83\94á\83\9c á\83£á\83\99á\83\95á\83\94 á\83¨á\83\94á\83ªá\83\95á\83\90á\83\9aá\83\94á\83\97 á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98 á\83\90á\83\9c á\83\9bá\83\9dá\83\98á\83\97á\83®á\83\9dá\83\95á\83\94á\83\97 á\83\90á\83®á\83\90á\83\9aá\83\98 á\83\93á\83 á\83\9dá\83\94á\83\91á\83\98á\83\97á\83\98 á\83\9eá\83\90á\83 á\83\9dლი.",
        "resetpass-recycled": "გთხოვთ, შეცვალეთ პაროლი იმაზე, რომელიც განსხვავდება თქვენი მიმდინარე პაროლისაგან.",
        "resetpass-temp-emailed": "თქვენ წარდგენილი ხართ დროებითი პაროლის დახმარებით, რომელიც მიღებულია ელექტრონული ფოსტით. სისტემაში შესვლის დასრულებისთვის, აუცილებელია ახალი პაროლის წარდგენა:",
        "resetpass-temp-password": "დროებითი პაროლი:",
        "revdelete-unsuppress": "მოხსენით შეზღუდვა ვერსიების აღდგენისგან",
        "revdelete-log": "მიზეზი:",
        "revdelete-submit": "{{PLURAL:$1|არჩეული ვერსიის|არჩეული ვერსიების}} განხორციელება",
-       "revdelete-success": "'''ვერსიის ხილვადობა შეიცვალა.'''",
+       "revdelete-success": "გადახედვის ხილვადობა განახლებულია.",
        "revdelete-failure": "'''ვერსიის ხილვადობა არ შეიძლება დაყენებული იქნას:'''\n$1",
-       "logdelete-success": "á\83\9bá\83\9dá\83\95á\83\9aá\83\94á\83\9cá\83\98á\83¡ á\83®á\83\98á\83\9aá\83\95á\83\90á\83\93á\83\9dá\83\91á\83\90 á\83¬á\83\90á\83 á\83\9bá\83\90á\83¢á\83\94á\83\91á\83\98á\83\97 á\83¨á\83\94á\83\98á\83ªá\83\95á\83\90á\83\9aá\83\90.",
+       "logdelete-success": "á\83\9bá\83\9dá\83\95á\83\9aá\83\94á\83\9cá\83\98á\83¡ á\83®á\83\98á\83\9aá\83\95á\83\90á\83\93á\83\9dá\83\91á\83\98á\83¡ á\83®á\83\94á\83\9aá\83¡á\83\90á\83¬á\83§á\83\9d.",
        "logdelete-failure": "'''ჟურნალის ხილვადობა არ არის დაყენებული:'''\n$1",
        "revdel-restore": "ხილვადობის შეცვლა",
        "pagehist": "გვერდის ისტორია",
        "userrights-unchangeable-col": "ჯგუფები, რომლებიც არ შეგიძლიათ შეცვალოთ",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "მომხმარებელთა უფლებების კონფლიქტი! გთხოვთ ხელმეორედ შეინახოთ თქვენი ცვლილებები.",
-       "userrights-removed-self": "á\83\97á\83¥á\83\95á\83\94á\83\9c á\83¬á\83\90á\83 á\83\9bá\83\90á\83¢á\83\94á\83\91á\83\98á\83\97 á\83¬á\83\90á\83¨á\83\90á\83\9aá\83\94á\83\97 á\83¡á\83\90á\83\99á\83£á\83\97á\83\90á\83 á\83\98 á\83£á\83¤á\83\9aá\83\94á\83\91á\83\90. á\83¨á\83\94á\83¡á\83\90á\83\91á\83\90á\83\9bá\83\98á\83¡á\83\90á\83\93, á\83\97á\83¥á\83\95á\83\94á\83\9c á\83\90á\83¦á\83\90á\83  á\83\92á\83\94á\83¥á\83\9cá\83\94á\83\91á\83\90á\83\97 á\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93á\83\97á\83\90á\83\9c á\83¬á\83\95á\83\93á\83\9dá\83\9bá\83\98á\83¡ á\83¡á\83\90á\83¨á\83£á\83\90á\83\9aá\83\94á\83\91á\83\90",
+       "userrights-removed-self": "თქვენ წაშალეთ საკუთარი უფლება. შესაბამისად, თქვენ აღარ გექნებათ ამ გვერდთან წვდომის საშუალება",
        "group": "ჯგუფი:",
        "group-user": "მომხმარებლები",
        "group-autoconfirmed": "ავტომატურად დადასტურებული მომხმარებლები",
        "recentchanges-label-bot": "ეს არის ბოტის რედაქტირება",
        "recentchanges-label-unpatrolled": "ეს რედაქტირება გადაუმოწმებელია",
        "recentchanges-label-plusminus": "ცვლილებების ზომა ბაიტებში",
-       "recentchanges-legend-heading": "'''ლეგენდა:'''",
+       "recentchanges-legend-heading": "<strong>ლეგენდა:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (იხ. აგრეთვე [[Special:NewPages|ახალი გვერდების სია]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "ჩვენება",
        "backend-fail-read": "ფაილი $1-ის წაკითხვა ვერ მოხერხდა.",
        "backend-fail-create": "ფაილი $1-ის ჩაწერა ვერ მოხერხდა.",
        "backend-fail-maxsize": "ფაილი $1-ის ჩაწერა ვერ მოხერხდა, რადგანაც მისი ზომა აჭარბებს {{PLURAL:$2|ერთ ბაიტს|$2 ბაიტს}}.",
-       "backend-fail-readonly": "საცავი \"$1\" ამჟამად ხელმისაწვდომია მხოლოდ წაკითხვის რეჟიმში. მიზეზი: \"$2\"",
+       "backend-fail-readonly": "საცავი \"$1\" ამჟამად ხელმისაწვდომია მხოლოდ წაკითხვის რეჟიმში. მიზეზი: <em>$2</em>",
        "backend-fail-synced": "ფაილი \"$1\" იმყოფება შიდა საცავის შეუთანხმებელ მდგომარეობაში",
        "backend-fail-connect": "\"$1\" საცავთან დაკავშირება ვერ მოხერხდა.",
        "backend-fail-internal": "\"$1\" საცავში მოხდა დაუდგენელი შეცდომა.",
        "uploadstash-summary": "ამ გვერდზე შესაძლებელია იმ ფაილთა მოძიება, რომლებიც უკვე აიტვირთნენ ან ახლა იტვირთებინ, მაგრამ ჯერ ვიკიში არ გამოქვეყნებულან. ეს ფაილები, გარდა ამტვირთავი მომხმარებლისა, ჯერ საჯაროდ არავის უნახავს.",
        "uploadstash-clear": "დაფარული ფაილების გასუფთავება",
        "uploadstash-nofiles": "თქვენ არ გაქვთ დაფარული ფაილები.",
-       "uploadstash-badtoken": "á\83\9bá\83\98á\83\97á\83\98á\83\97á\83\94á\83\91á\83£á\83\9aá\83\98 á\83\9bá\83\9dá\83¥á\83\9bá\83\94á\83\93á\83\94á\83\91á\83\90 á\83\95á\83\94á\83  á\83¨á\83\94á\83¡á\83 á\83£á\83\9aá\83\93á\83\90. á\83¨á\83\94á\83¡á\83\90á\83«á\83\9aá\83\9dá\83\90, á\83\97á\83¥á\83\95á\83\94á\83\9cá\83\98 á\83£á\83¡á\83\90á\83¤á\83 á\83\97á\83®á\83\9dá\83\94á\83\91á\83\98á\83¡ á\83\9bá\83\90á\83\9cá\83\93á\83\90á\83¢á\83\98á\83¡ á\83\9bá\83\9dá\83¥á\83\9bá\83\94á\83\93á\83\94á\83\91á\83\98á\83¡ á\83\95á\83\90á\83\93á\83\90 á\83\90á\83\9bá\83\9dá\83\98á\83¬á\83£á\83 á\83\90. á\83\99á\83\98á\83\93á\83\94á\83\95 á\83¡á\83ªá\83\90á\83\93á\83\94á\83\97.",
+       "uploadstash-badtoken": "á\83\9bá\83\98á\83\97á\83\98á\83\97á\83\94á\83\91á\83£á\83\9aá\83\98 á\83\9bá\83\9dá\83¥á\83\9bá\83\94á\83\93á\83\94á\83\91á\83\90 á\83\95á\83\94á\83  á\83¨á\83\94á\83¡á\83 á\83£á\83\9aá\83\93á\83\90. á\83¨á\83\94á\83¡á\83\90á\83«á\83\9aá\83\9dá\83\90, á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\98á\83¡ á\83£á\83¤á\83\9aá\83\94á\83\91á\83\90á\83\9bá\83\9dá\83¡á\83\98á\83\9aá\83\94á\83\91á\83\98á\83¡ á\83\9bá\83\9dá\83¥á\83\9bá\83\94á\83\93á\83\94á\83\91á\83\98á\83¡ á\83\95á\83\90á\83\93á\83\90 á\83\90á\83\9bá\83\9dá\83\98á\83¬á\83£á\83 á\83\90. á\83\92á\83\97á\83®á\83\9dá\83\95á\83\97, á\83¡á\83ªá\83\90á\83\93á\83\94á\83\97 á\83\97á\83\90á\83\95á\83\98á\83\93á\83\90á\83\9c.",
        "uploadstash-errclear": "ფაილების გასუფთავება ვერ მოხერხდა.",
        "uploadstash-refresh": "ფაილების სიის განახლება",
        "invalid-chunk-offset": "არასწორი საწყისი წერტილი",
        "delete-toobig": "ამ გვერდს ძალიან გრძელი ისტორია გააჩნია,  $1 {{PLURAL:$1|ვერსიაზე|ვერსიიებზე|ვერსიებზე}} მეტი. მისი წაშლა აიკრძალა {{SITENAME}}-ის კორექტურად მუშაობის უზრუნველყოფისთვის.",
        "delete-warning-toobig": "ამ გვერდს ძალიან გრძელი ისტორია გააჩნია,  $1 {{PLURAL:$1|ვერსიაზე|ვერსიიებზე|ვერსიებზე}} მეტი.\nმისმა წაშლამ შესაძლოა გამოიწვიოს საიტის მონაცემთა ბაზის  {{SITENAME}} არაკორექტული მუშაობა;\nიმოქმედეთ სიფრთხილით.",
        "deleteprotected": "თქვენ არ შეგიძლიათ ამ გვერდის წაშლა, რადგან ის დაცულია.",
-       "deleting-backlinks-warning": "'''გაფრთხილება:'''  [[Special:WhatLinksHere/{{FULLPAGENAME}}|სხვა გვერდები]] დაკავშირებულია ამ წასაშლელ გვერდთან.",
+       "deleting-backlinks-warning": "<strong>გაფრთხილება:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|სხვა გვერდები]] დაკავშირებულია ამ წასაშლელ გვერდთან.",
        "rollback": "ცვლილებების გაუქმება",
        "rollbacklink": "სწრაფი გაუქმება",
        "rollbacklinkcount": "$1 {{PLURAL:$1|ცვლილების|ცვლილების}} გაუქმება",
        "changecontentmodel-nodirectediting": "$1 შინაარსის მოდელს არ აქვს პირდაპირი რედაქტირების მხარდაჭერა",
        "log-name-contentmodel": "შინაარსის მოდელის შეცვლის ჟურნალი",
        "log-description-contentmodel": "გვერდის შინაარსის მოდელთან დაკავშირებული მოვლენები",
+       "logentry-contentmodel-new": "$1-მ {{GENDER:$2|შექმნა}} გვერდი $3, არა-სტანდარტული მოდელით \"$5\"",
        "logentry-contentmodel-change": "$1-მა {{GENDER:$2|შეცვალა}} $3-ის გვერდის შინაარსის მოდელი \"$4\"-დან \"$5\"-ზე",
        "logentry-contentmodel-change-revertlink": "დაბრუნება",
        "logentry-contentmodel-change-revert": "დაბრუნება",
        "tags-delete-not-allowed": "გაფართოებით განსაზღვრული ტეგები, არ შეიძლება იყოს წაშლილი, თუკი გაფართოება აშკარად არ იძლევა ამის გაკეთების შესაძლებლობას",
        "tags-delete-not-found": "აღნიშვნა „$1“ არ არსებობს.",
        "tags-delete-too-many-uses": "ტეგი \"$1\" მიღებულია $2 ვერსიებთან, რაც იმას ნიშნავს, რომ იგი არ შეიძლება იყოს წაშლილი",
-       "tags-delete-warnings-after-delete": "á\83¢á\83\94á\83\92á\83\98 â\80\9e$1â\80\9c á\83¬á\83\90á\83 á\83\9bá\83\90á\83¢á\83\94á\83\91á\83\98á\83\97 á\83\98á\83¥á\83\9cá\83\90 á\83¬á\83\90á\83¨á\83\9aá\83\98á\83\9aá\83\98, á\83\97á\83£á\83\9bá\83ªá\83\90 á\83\90á\83¦á\83\9bá\83\9dá\83©á\83\94á\83\9cá\83\98á\83\9aá\83\98 á\83\98á\83§á\83\9d á\83¨á\83\94á\83\9bá\83\93á\83\94á\83\92á\83\98 á\83¨á\83\94á\83¢á\83§á\83\9dá\83\91á\83\98á\83\9cá\83\94á\83\91á\83\90: $2",
+       "tags-delete-warnings-after-delete": "á\83¢á\83\94á\83\92á\83\98 â\80\9e$1â\80\9c á\83¬á\83\90á\83\98á\83¨á\83\90á\83\9aá\83\90, á\83\97á\83£á\83\9bá\83ªá\83\90 á\83\90á\83¦á\83\9bá\83\9dá\83©á\83\94á\83\9cá\83\98á\83\9aá\83\98á\83\90 á\83¨á\83\94á\83\9bá\83\93á\83\94á\83\92á\83\98 {{PLURAL:$2|á\83¨á\83\94á\83¢á\83§á\83\9dá\83\91á\83\98á\83\9cá\83\94á\83\91á\83\90\83¨á\83\94á\83¢á\83§á\83\9dá\83\91á\83\98á\83\9cá\83\94á\83\91á\83\94á\83\91á\83\98}}:",
        "tags-activate-title": "ტეგის გააქტიურება",
        "tags-activate-question": "თქვენ ცდილობთ დასათაურების გააქტიურებას „$1“.",
        "tags-activate-reason": "მიზეზი:",
        "tags-edit-revision-legend": "ტეგების დამატება ან წაშლა {{PLURAL:$1|ეს გადასინჯვა|ყველა $1 გადასინჯვა}}",
        "tags-edit-logentry-legend": "ტეგების დამატება ან წაშლა {{PLURAL:$1|ეს ჩანაწერი ჟურნალში|ყველა $1 ჟურნალის ჩანაწერი}}",
        "tags-edit-existing-tags": "არსებული დასათაურებები:",
-       "tags-edit-existing-tags-none": "''არა''",
+       "tags-edit-existing-tags-none": "<em>არცერთი</em>",
        "tags-edit-new-tags": "ახალი აღნიშვნა:",
        "tags-edit-add": "ამ აღნიშვნის დამატება:",
        "tags-edit-remove": "ამ აღნიშვნის წაშლა:",
        "tags-edit-reason": "მიზეზი:",
        "tags-edit-revision-submit": "ცვლილებების მიღება {{PLURAL:$1|ეს გადასინჯვა|$1 გადასინჯვები}}",
        "tags-edit-logentry-submit": "მიღებული ცვლილებები {{PLURAL:$1|ეს ჩანაწერია ჟურნალში|$1 ჩანაწერების ჟურნალი}}",
-       "tags-edit-success": "á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98 á\83¬á\83\90á\83 á\83\9bá\83\90á\83¢á\83\94á\83\91á\83£á\83\9aá\83\90á\83\93 á\83\98á\83¥á\83\9cá\83\90 á\83\9bá\83\98á\83¦á\83\94á\83\91á\83£á\83\9aá\83\98",
+       "tags-edit-success": "á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98 á\83\9bá\83\98á\83¦á\83\94á\83\91á\83£á\83\9aá\83\98á\83\90.",
        "tags-edit-failure": "ცვლილებები არ იქნა შენახული: $1",
        "tags-edit-nooldid-title": "არ არის მოცემული სამიზნე ვერსია",
        "tags-edit-nooldid-text": "ამ ფუნქციის შესასრულებლად თქვენ არ გაქვთ გაცემული სამიზნე ვერსია, ან მითითებული ვერსია არ არსებობს",
index d3db536..c9039a1 100644 (file)
        "recentchanges-label-bot": "D-arubut id yeseqdacen abeddel agi",
        "recentchanges-label-unpatrolled": "Abeddel agi mazal yesɛa aselken.",
        "recentchanges-label-plusminus": "Tiddi n usebtar tetwebeddel s umḍan agi n itamḍanen.",
-       "recentchanges-legend-heading": "'''Aglam :'''",
+       "recentchanges-legend-heading": "<strong>Aglam :</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zeṛ daɣen [[Special:NewPages|umuɣ n isebtar imaynuten]]).",
        "recentchanges-legend-plusminus": "(''± 123'')",
        "rcnotefrom": "Deg ukessar llan ibeddlen seg wasmi '''$2''' (ar '''$1''').",
index e76e78f..8d9a6ad 100644 (file)
        "recentchanges-label-bot": "ھیہ ایڈیٹو خود کار بوٹو زریعا انجام دیونو ہوئے",
        "recentchanges-label-unpatrolled": "ھیہ ترمیمو ھمونیہ پت مراجعت(Patrolled) کورونو نو بیتی شیر",
        "recentchanges-label-plusminus": "صفحو سائز تبدیل شدہ بلحاظ بائٹ مقدار",
-       "recentchanges-legend-heading": "'''لیجنڈ:'''",
+       "recentchanges-legend-heading": "<strong>لیجنڈ:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ھمو دی لوڑے [[Special:NewPages|list of new pages]])",
        "rcnotefrom": "ھیہ موڑا '''$2''' کورونو بیرو تبدیلیان تفصیلات شینی ('''$1''' تبدیلیان پشینو بونیان)۔",
        "rclistfrom": "$3 $2 نوغ تبدیلیاں پشیک شروع کورے",
        "filemissing": "فائل نیکی",
        "thumbnail_error": "$1 څیق سایزو ھوٹو ساوزیکا مسئلہ",
        "tooltip-pt-userpage": "تہ صارفی صفحہ",
-       "tooltip-pt-mytalk": "تہ صفحۂ مشقولگی",
+       "tooltip-pt-mytalk": "{{GENDER:|تہ}} صفحۂ مشقولگی",
        "tooltip-pt-preferences": " تہ ترجیحات",
        "tooltip-pt-watchlist": "ھتے صفحاتن فہرست کہ ھتیتان تبدیلی تہ زیرِنظر شینی",
-       "tooltip-pt-mycontris": "تہ کاردو کورمان فہرست",
+       "tooltip-pt-mycontris": "{{GENDER:|تہ}} کاردو کورمان فہرست",
        "tooltip-pt-login": "تہ بچے داخلِ نوشتہ بیک جم شیر، لیکن ھیہ ضروری نو",
        "tooltip-pt-logout": "خارج بوس",
        "tooltip-pt-createaccount": "تتے دعوت دیونو بویان کہ کھاتہ ساوزاوے۔لیکن کھاتہ ساوزیک لازمی نو-",
        "tooltip-t-recentchangeslinked": "ھیہ صفحہو سوم مربوط صفحاتہ بیرو حالیہ تبدیلی",
        "tooltip-feed-rss": "ھیہ صفحو بچے اسس خورد",
        "tooltip-feed-atom": "ھیہ صفحو بچے آٹوم فیڈ",
-       "tooltip-t-contributions": "Ù\86Ù\88غ ØªØ¯Ù\88Û\8cÙ\86",
+       "tooltip-t-contributions": "Ù\85ضÙ\85Ù\88Ù\86Ù\86 Ù\84سٹ {{GENDER:$1|Ú¾Û\8cÛ\81 ØµØ§Ø±Ù\81}}Ù\88",
        "tooltip-t-emailuser": "ھیہ ممباروت بشلی کغاز(ای میل) انڅاوے",
        "tooltip-t-upload": "فائلو اپلوڈ کورے",
        "tooltip-t-specialpages": "سف خاص صفحاتن فہرست",
index baedef7..a4a679f 100644 (file)
        "nocookieslogin": "Қатысушы кіру үшін {{SITENAME}} торабында «cookies» деген қолданылады.\nСізде «cookies» өшірілген.\nСоны қосыңыз да кіруді қайта байқап көріңіз.",
        "nocookiesfornew": "Оның қайнарын растай алмағандықтан қатысушының аккаунты тіркелмеді. «Cookies» қосылып тұрғанына көз жеткізіңіз, бетті қайта жаңартыңыз және тағы байқап көріңіз.",
        "noname": "Сізде жарамды қатысушы аты анықталмаған.",
-       "loginsuccesstitle": "Кіруіңіз сәтті болды.",
+       "loginsuccesstitle": "Кірдіңіз.",
        "loginsuccess": "<strong>Сіз енді {{SITENAME}} жобасына «$1» ретінде кірдіңіз.</strong>",
        "nosuchuser": "Мұнда «$1» деп аталған қатысушы тіркелмеген.\nҚатысушы аттары кіші әріптерден тұру керек.\nЕмлеңізді тексеріңіз немесе [[Special:UserLogin/signup|жаңа тіркелгі жасаңыз]].",
        "nosuchusershort": "Мұнда «$1» деп аталған қатысушы тіркелмеген.\nЕмлеңізді тексеріңіз.",
        "newpassword": "Жаңа құпия сөзіңіз:",
        "retypenew": "Жаңа құпия сөзіңізді қайталаңыз:",
        "resetpass_submit": "Құпия сөзді қойыңыз да кіріңіз",
-       "changepassword-success": "Құпия сөзіңіз сәтті өзгертілді!",
+       "changepassword-success": "Құпия сөзіңіз өзгертілді!",
        "changepassword-throttled": "Сіз жақында кіруге тым көп әрекет жасадыңыз.\nҚайта байқап көру үшін $1 уақыт күте тұрыңыз.",
+       "botpasswords-label-update": "Жаңарту",
+       "botpasswords-label-cancel": "Болдырмау",
+       "botpasswords-label-delete": "Жою",
+       "botpasswords-label-resetpassword": "Құпия сөзді қалпына кеттіру",
        "resetpass_forbidden": "Құпия сөз өзгертілмейді",
        "resetpass-no-info": "Бұл бетке тікелей ену үшін жүйеге кіруіңіз керек.",
        "resetpass-submit-loggedin": "Құпия сөзді өзгерту",
        "revdelete-unsuppress": "Қалпына келтірілген түзетулерден тиымдарды аластау",
        "revdelete-log": "Себебі:",
        "revdelete-submit": "Бөлектенген {{PLURAL:$1|түзетуге|түзетулерге}} қолдану",
-       "revdelete-success": "'''Түзету көрінісі сәтті жаңартылды.'''",
+       "revdelete-success": "Түзету көрінісі жаңартылды.",
        "revdelete-failure": "'''Түзету көрінісі жаңартылмады:'''\n$1",
-       "logdelete-success": "'''Журнал көрінісі сәтті қойылды.'''",
+       "logdelete-success": "Журнал көрінісі қойылды.",
        "logdelete-failure": "Журнал көрінулігі орнатылмады:\n$1",
        "revdel-restore": "көрінісін өзгерту",
        "pagehist": "Бет тарихы",
        "recentchanges-label-bot": "Бұл өңдемені бот жасады.",
        "recentchanges-label-unpatrolled": "Бұл өңдеме әлі тексеруден өтпеді.",
        "recentchanges-label-plusminus": "Байт бойынша беттің өзгеріс өлшемі",
-       "recentchanges-legend-heading": "'''Шартты белгілер:'''",
+       "recentchanges-legend-heading": "<strong>Шартты белгілер:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (қ: [[Special:NewPages|бөлек бетте]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "Көрсету",
        "apihelp-no-such-module": "«$1» модулі табылмады.",
        "apisandbox-submit": "Сұраныс жасау",
        "apisandbox-reset": "Тазарту",
-       "apisandbox-examples": "Мысалы",
-       "apisandbox-results": "Нәтижесі",
+       "apisandbox-examples": "Мысалдар",
+       "apisandbox-results": "Нәтижелер",
        "apisandbox-request-url-label": "URL сұранысы",
-       "apisandbox-request-time": "Сұраныс уақыты: $1",
+       "apisandbox-request-time": "Сұраныс уақыты: {{PLURAL:$1|$1 мс}}",
        "booksources": "Кітап қайнарлары",
        "booksources-search-legend": "Кітап қайнарларын іздеу",
        "booksources-search": "Іздеу",
        "log-title-wildcard": "Мына мәтіннен басталытын тақырып аттарын іздеу",
        "showhideselectedlogentries": "Таңдалған журнал енгізілімдерін көрсету/жасыру",
        "log-edit-tags": "Таңдалған журнал жазбаларының өңдеу белгілері",
+       "checkbox-select": "Таңдау: $1",
+       "checkbox-all": "Барлығы",
+       "checkbox-none": "Ешқандай",
+       "checkbox-invert": "Керісінше",
        "allpages": "Барлық беттер",
        "nextpage": "Келесі бетке ($1)",
        "prevpage": "Алдыңғы бетке ($1)",
        "listgrouprights-namespaceprotection-header": "Есім кеңістігі шектелімдері",
        "listgrouprights-namespaceprotection-namespace": "Атау кеңістігі",
        "listgrouprights-namespaceprotection-restrictedto": "Қатысушыға өңдеу үшін берілген құқық(тар)",
+       "listgrants-rights": "Құқықтар",
        "trackingcategories": "Санаттарды қадағалау",
        "trackingcategories-summary": "Бұл бет МедиаУики бағдарламалық жасақтамасынан автоматты түрде толтырылатын санаттарды есептеп тізеді. Олардың есімдерін {{ns:8}} есім кеңістігіндегі сәйкес жүйе хабарлары  арқылы өзгертуге болады.",
        "trackingcategories-msg": "Санатты қадағалау",
        "wlshowhideanons": "анонимді қатысушылар",
        "wlshowhidepatr": "тексерілген өңдемелер",
        "wlshowhidemine": "өңдемелерім",
+       "wlshowhidecategorization": "Бет санаттаулары",
        "watchlist-options": "Бақылау тізімінің баптаулары",
        "watching": "Бақылауда…",
        "unwatching": "Бақыламауда…",
        "size-bytes": "$1 байт",
        "size-kilobytes": "$1 КБ",
        "lag-warn-normal": "{{PLURAL:$1|секунтта|секунтта}} $1 жаңалау өзгерістер бұл тізімде көрсетілмеуі мүмкін.",
-       "lag-warn-high": "Дерекқор сервері көп кешігуі себебінен, $1 {{PLURAL:$1|секунтта|сеунтта}} жаңалау өзгерістер бұл тізімде көрсетілмеуі мүмкін.",
+       "lag-warn-high": "Дерекқор сервері көп кешігуі себебінен, $1 {{PLURAL:$1|секундтан|секундтан}} жаңалау өзгерістер бұл тізімде көрсетілмеуі мүмкін.",
        "watchlistedit-normal-title": "Бақылау тізімді өңдеу",
        "watchlistedit-normal-legend": "Бақылау тізімінен тақырып аттарын аластау",
        "watchlistedit-normal-explain": "Бақылау тізіміңіздегі тақырып аттар төменде көрсетіледі.\nТақырып атын аластау үшін, бүйір көзге құсбелгі салыңыз, және \"{{int:Watchlistedit-normal-submit}}\" дегенді нұқыңыз.\nТағы да [[Special:EditWatchlist/raw|қам тізімді өңдей]] аласыз.",
index fffcfa3..e298a98 100644 (file)
        "recentchanges-label-bot": "ការកែប្រែនេះត្រូវបានធ្វើឡើងដោយរូបយន្ត",
        "recentchanges-label-unpatrolled": "ការកែប្រែនេះមិនទាន់ត្រូវបានល្បាតទេ",
        "recentchanges-label-plusminus": "ទំហំទំព័រត្រូវបានផ្លាស់ប្ដូរគិតជាចំនួនបៃ",
-       "recentchanges-legend-heading": "''កំណត់សម្គាល់៖'''",
+       "recentchanges-legend-heading": "<strong>កំណត់សម្គាល់៖</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (មើលផងដែរនូវ [[Special:NewPages|បញ្ជីទំព័រថ្មី]])",
        "rcnotefrom": "ខាងក្រោមនេះជាបន្លាស់ប្ដូរនានាគិតចាប់តាំងពី <strong>$4 $3</strong> (បង្ហាញអតិបរមាចំនួន <strong>$1</strong>)។",
        "rclistfrom": "បង្ហាញបន្លាស់ប្ដូរថ្មីៗចាប់តាំងពី $3 $2",
index 5f40f33..a090015 100644 (file)
        "yourname": "ನಿಮ್ಮ ಬಳಕೆಯ ಹೆಸರು",
        "userlogin-yourname": "ಬಳಕೆದಾರ ಹೆಸರು",
        "userlogin-yourname-ph": "ನಿಮ್ಮ ಸದಸ್ಯನಾಮ ಬರೆಯಿರಿ",
-       "createacct-another-username-ph": "ಸದಸà³\8dಯನಾಮ (\"ಯà³\8bಸರà³\8dನà³\87ಮà³\8d\") à²¬à²°ಿರಿ",
+       "createacct-another-username-ph": "ಬಳà²\95à³\86ದಾರರ à²¹à³\86ಸರà³\81 à²¬à²°à³\86ಯಿರಿ",
        "yourpassword": "ನಿಮ್ಮ ಪ್ರವೇಶಪದ",
        "userlogin-yourpassword": "ಪ್ರವೇಶಪದ",
        "userlogin-yourpassword-ph": "ನಿಮ್ಮ ಪ್ರವೇಶಪದ ನಮೂದಿಸಿ",
        "createacct-realname": "ನಿಜವಾದ ಹೆಸರು (ಐಚ್ಛಿಕ)",
        "createaccountreason": "ಕಾರಣ:",
        "createacct-reason": "ಕಾರಣ",
-       "createacct-reason-ph": "ನà³\80ವà³\81 à²¯à²¾à²\95à³\86 à²\87ನà³\8dನà³\81 à²\92à²\82ದà³\81 à²\96ಾತ à²®à²¾à²¡à³\81ತ à²\87ದà³\8dದà³\80ರಿ ?",
+       "createacct-reason-ph": "ನà³\80ವà³\81 à²¯à²¾à²\95à³\86 à²\87ನà³\8dನà³\8aà²\82ದà³\81 à²\96ಾತà³\86 à²¤à³\86ರà³\86ಯà³\81ತà³\8dತಿದà³\8dದà³\80ರಿ",
        "createacct-submit": "ಖಾತೆಯನ್ನು ಸೃಷ್ಟಿಸಿ",
        "createacct-another-submit": "ಇನ್ನು ಒಂದು ಖಾತ ಮಾಡಿ",
-       "createacct-benefit-heading": "{{SITENAME}} à²¨à²¿à²®à³\8dಮನà³\8dತವà³\86 à²\9cನರಿà²\82ದ à²®à²¾à²¡à²¿à²¦à³\81",
+       "createacct-benefit-heading": "{{SITENAME}} à²¨à²¿à²®à³\8dಮà²\82ತಹ à²\9cನರಿà²\82ದಲà³\87 à²®à²¾à²¡à²¿à²¦à³\8dದà³\81.",
        "createacct-benefit-body1": "{{PLURAL:$1|ಸಂಪಾದನೆ|ಸಂಪಾದನೆಗಳು}}",
        "createacct-benefit-body2": "{{PLURAL:$1|ಪುಟ|ಪುಟಗಳು}}",
        "createacct-benefit-body3": "{{PLURAL:$1|ಕೊಡುಗೆ|ಕೊಡುಗೆಗಳು}}",
        "recentchanges-label-bot": "ಈ ಸಂಪಾದನೆಯನ್ನು ಒಂದು ಬಾಟ್ ಮಾಡಿದೆ",
        "recentchanges-label-unpatrolled": "ಈ ಸಂಪಾದನೆಯನ್ನು ಇನ್ನೂ ಪರೀಕ್ಷೆಗೆ ಒಳಪಡಿಸಿಲ್ಲ",
        "recentchanges-label-plusminus": "ಪುಟದ ಗಾತ್ರವು ಇಷ್ಟು ಸಂಖ್ಯೆಯ ಬೈಟ್‍ಗಳಿಂದ ಬದಲಾಯಿಸಲ್ಪಟ್ಟಿದೆ",
-       "recentchanges-legend-heading": "'''ಪರಿವಿಡಿ:'''",
+       "recentchanges-legend-heading": "<strong>ಪರಿವಿಡಿ:</strong>",
        "rcnotefrom": "'''$2''' ಇಂದ ಆಗಿರುವ ಬದಲಾವಣೆಗಳು ಕೆಳಗಿವೆ (ಕೊನೆಯ '''$1'''ರವರೆಗೆ ತೋರಿಸಲಾಗಿದೆ).",
        "rclistfrom": "$3 $2 ಇಂದ ಪ್ರಾರಂಭಿಸಿ ಮಾಡಲಾದ ಬದಲಾವಣೆಗಳನ್ನು ನೋಡಿ",
        "rcshowhideminor": "ಚಿಕ್ಕಪುಟ್ಟ ಬದಲಾವಣೆಗಳನ್ನು $1",
index 757d4b0..7ab3abb 100644 (file)
        "recentchanges-label-bot": "봇이 수행한 편집",
        "recentchanges-label-unpatrolled": "아직 점검하지 않은 편집",
        "recentchanges-label-plusminus": "바이트로 표기된 바뀐 문서 크기",
-       "recentchanges-legend-heading": "'''범례:'''",
+       "recentchanges-legend-heading": "<strong>범례:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|새 문서 목록]]도 보세요)",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "보기",
index 0a39946..dd0a5b2 100644 (file)
        "recentchanges-label-bot": "Бу тюрлендириуню бот этгенди",
        "recentchanges-label-unpatrolled": "Бу тюрлендириу алкъын патруль этилинмегенди",
        "recentchanges-label-plusminus": "Бетни ёлчеми быллай бир байтха тюрленнгенди",
-       "recentchanges-legend-heading": "'''Легенда:&nbsp;'''",
+       "recentchanges-legend-heading": "<strong>Легенда:&nbsp;</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (къарагъыз: [[Special:NewPages|джангы бетлени тизмеси]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Тюбюрекде <strong>$2</strong> башлаб (<strong>$1</strong> дери) тюрлендириуле кёрюнедиле",
index 22f884c..bb5bf6d 100644 (file)
        "june": "Juni",
        "july": "Juli",
        "august": "Aujuss",
-       "september": "September",
+       "september": "Septämber",
        "october": "Oktober",
-       "november": "November",
-       "december": "Dezember",
+       "november": "Novämber",
+       "december": "Dezämber",
        "january-gen": "Janewar",
        "february-gen": "Febrewar",
        "march-gen": "Määz",
        "june-gen": "Juni",
        "july-gen": "Juli",
        "august-gen": "Aujuss",
-       "september-gen": "September",
+       "september-gen": "Septämber",
        "october-gen": "Oktober",
-       "november-gen": "November",
-       "december-gen": "Dezember",
+       "november-gen": "Novämber",
+       "december-gen": "Dezämber",
        "jan": "Jan",
        "feb": "Feb",
        "mar": "Mäz",
        "moredotdotdot": "Mih&nbsp;…",
        "morenotlisted": "Et jeiht noch wigger&nbsp;…",
        "mypage": "Metmaachersigg",
+       "anonuserpage": "Onbikannte Metmaacher",
        "mytalk": "Klaafsigg",
        "anontalk": "Klaaf för ene nahmelohse Metmaacher",
        "navigation": "Jangk noh de",
        "virus-scanfailed": "Dat Söhke eß donevve jejange, dä Kood för dä Fähler es „$1“.",
        "virus-unknownscanner": "Dat Projamm fö noh Komjuterviere ze sööke kenne mer nit:",
        "logouttext": "'''Jäz bes de usjelogg'''\n\nKünnt sin, dat De de ein udder andere Sigg noch wigger aanjezeich kriß, wie wann de noch enjelogg wörs. Dun Dingem Brauser singe <i lang=\"en\">Cache</i> fottschmieße udder läddesch maache, öm uß dä Nommer erus ze kumme!",
+       "cannotlogoutnow-title": "Ußlogge jeiht jrahd nit",
+       "cannotlogoutnow-text": "Ußlogge jeiht jrahd nit wam_mer $1 bruch.",
        "welcomeuser": "Wellkumme $1!",
        "welcomecreation-msg": "Dinge Zohjang es enjerescht.\nWann De wells, künnts De Ding [[Special:Preferences|Enschtällonge aanpaße]].",
        "yourname": "Metmaacher_Naame:",
        "remembermypassword": "Op Duur aanmelde (hält {{PLURAL:$1|för eine Daach|bes op $1 Dääsch|bloß för hück}})",
        "userlogin-remembermypassword": "Op Duur enlogge",
        "userlogin-signwithsecure": "Verschlößeld enlogge",
+       "cannotloginnow-title": "Ennlogge jeiht jrahd nit",
+       "cannotloginnow-text": "Ennlogge jeiht jrahd nit wam_mer $1 bruche well.",
        "yourdomainname": "Ding Domain",
        "password-change-forbidden": "Do kanns en heh däm Wiki kein Paßwööter ändere.",
        "externaldberror": "Do wor ene Fähler en de externe Daatebank, oder Do darfs Ding extern Daate nit ändere. Dat Aanmelde jingk jedenfalls donevve.",
        "nocookieslogin": "{{ucfirst:{{GRAMMAR:Nominativ|{{SITENAME}}}}}} bruch <i lang=\"en\">cookies</i> för et Enlogge. Et süht esu us, als hätts De de <i lang=\"en\">cookies</i> avjeschalt. Dun se aanschalte un dann versök et noch ens. Odder söök Der ene Brauser, dä et kann.",
        "nocookiesfornew": "Et wood keine Zohjang opjemaat, weil mer nit jeweß sin künne, woh de Daate her kohme.\nDinge Brauser moß <i lang=\"en\">cookies</i> enjeschalldt han.\nDonn dat prööfe, donn heh di Sigg norr_ens neu laade, un dann versöhk et norr_ens.",
        "noname": "Dat jeiht nit als ene Metmaacher Name. Jetz muss De et noch ens versöke.",
-       "loginsuccesstitle": "Dat Enlogge hät jeflupp.",
+       "loginsuccesstitle": "Enjelogg",
        "loginsuccess": "'''Do bes jetz enjelogg {{GRAMMAR:en|{{SITENAME}}}}, un Dinge Name als ene Metmaacher es „$1“.'''",
        "nosuchuser": "Dä Metmaacher Name „$1“ wor verkihrt.\nJroß- un Kleinboochshtabe maache ene Ungerscheid!\n<br />\nJetz muss De et noch ens versöke.\nUdder donn_[[Special:UserLogin/signup|ene neue Metmaacher aanmelde]].",
        "nosuchusershort": "Dä Metmaacher Name „$1“ wor verkihrt. Jetz muss De et noch ens versöke.",
        "resetpass_submit": "E neu Zweschepasswood övvermeddele un aanmellde",
        "changepassword-success": "Et Paßwood es jeändert.",
        "changepassword-throttled": "Do häs zoh öff versöhk, enzelogge. Waat $1 Ih dat De es widder probeers.",
+       "botpasswords": "Bot-Paßwööter",
+       "botpasswords-disabled": "Bot-Paßwööter sin ußjeschallt",
+       "botpasswords-no-central-id": "Öm Bot-Paßwööter bruche ze künne, moß De övve en jemeinsamme Aanmälldong ennjelogg sin.",
+       "botpasswords-existing": "Vörhande Bot-Paßwööter",
+       "botpasswords-createnew": "Lääsch e neu Bot-Paßwööter aan",
+       "botpasswords-editexisting": "Verännder a Bot-Paßwööter",
+       "botpasswords-label-appid": "Däm Bot singe Nahme",
        "botpasswords-label-create": "Neu maache",
        "botpasswords-label-update": "Änndere",
        "botpasswords-label-cancel": "Ophüre",
        "botpasswords-label-delete": "Fottschmiiße",
        "botpasswords-label-resetpassword": "Paßwoot neu säze",
+       "botpasswords-label-restrictions": "Beschränkonge:",
+       "botpasswords-bad-appid": "„$1“ es keine jölltejje Nahme för ene Bot.",
+       "botpasswords-insert-failed": "Kunnt keine Bot mem Nahme „$1“ derbei donn. Wohr velleijsch ald doh.",
+       "botpasswords-update-failed": "Kunnt keine Bot mem Nahme „$1“ veränndere. Es velleijsch fottjeschmeße?",
+       "botpasswords-created-title": "Dat Bot-Paßwood es aanjelaat",
+       "botpasswords-created-body": "Dat Bot-Paßwoot för dä Bot „$1“ {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} „$2“ wood ennjerescht.",
+       "botpasswords-updated-title": "Dat Bot-Paßwood es veränndert",
+       "botpasswords-updated-body": "Dat Bot-Paßwoot för dä Bot „$1“ {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} „$2“ wood veränndert.",
+       "botpasswords-deleted-title": "Dat Bot-Paßwood es fott",
+       "botpasswords-deleted-body": "Dat Bot-Paßwoot för dä Bot „$1“ {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} „$2“ wood fott jeschmeße.",
        "resetpass_forbidden": "E Passwoot kann nit jeändert wääde.",
        "resetpass-no-info": "Do mööts ad enjelogg sin, öm tiräk op di Sigg jonn ze dörve",
        "resetpass-submit-loggedin": "Passwood tuusche",
        "revdelete-unsuppress": "De Beschrängkonge för der widderjehollte Versione ophevve",
        "revdelete-log": "Aanlaß odder Jrund:",
        "revdelete-submit": "Op de aanjekrützte {{PLURAL:$1|Version|Versione|-nix-}} aanwende",
-       "revdelete-success": "'''De Väsjohn wood verschtoche udder seeschba jemaat.'''",
+       "revdelete-success": "De Väsjohn wood verschtoche udder seeschba jemaat.",
        "revdelete-failure": "'''Dä Version ier Seeschbaakeit kunnte mer nit ändere:'''\n$1",
-       "logdelete-success": "'''Dä Enndraach em Logbohch wood verschtoche udder seeschbaa jemaat.'''",
+       "logdelete-success": "Dä Enndraach em Logbohch wood verschtoche udder seeschbaa jemaat.",
        "logdelete-failure": "'''Däm Enndraach em Logbohch sing Seeschbaakeit kunnte mer nit ändere:''' $1",
        "revdel-restore": "Verschteische udder seeschba maache",
        "pagehist": "Älldere Väsjohne",
        "mergehistory-empty": "Mer han kei Versione för zesammezeläje",
        "mergehistory-done": "{{PLURAL:$3|Ein Väsjohn es|$3 Väsjohn sen|Kei Väsjohn wood}} fun „$1“ noh „[[:$2]]“ övverdraare un domet zosamme jelaat.",
        "mergehistory-fail": "Dat Versione zesamme läje is nit müjjelisch. Don ens di Sigge un de Zigge pröfe!",
+       "mergehistory-fail-self-merge": "De Quell-Sigg un de Ziel-Sigg sin deselve Sigg.",
        "mergehistory-fail-toobig": "Mih wi {{PLURAL:$1|ein Väsjohn|$1 Väsjohne|kein Väsjohne}} wöödte zesamme jelaat. Esu vill künne mer nit, un maache mer nit.",
        "mergehistory-no-source": "En Ursprungssigg „$1“ jidd_et nit.",
        "mergehistory-no-destination": "En Zielsigg „$1“ jidd_et nit.",
        "mostrevisions": "Atikkele met de mihste Änderonge",
        "prefixindex": "Alle Sigge, dänne ehr Nahme med enem beschtemmpte Wood udder Täx aanfängk",
        "prefixindex-namespace": "Alle Sigge med enem beschtemmpte Aanfang em Appachtemang „$1“",
+       "prefixindex-submit": "Lohß jonn!",
        "prefixindex-strip": "Donn der jemeinsamme Aanfang vun dä Tetelle en dä Leß fottlohße.",
        "shortpages": "Atikele zoteet vun koot noh lang",
        "longpages": "Atikele zoteet vun lang noh koot",
        "protectedpages-performer": "Jeschöz vum Metmaacher",
        "protectedpages-params": "De Zoot Schpär",
        "protectedpages-reason": "Der Jrond",
+       "protectedpages-submit": "Lohß jonn!",
        "protectedpages-unknown-timestamp": "Onbikannt",
        "protectedpages-unknown-performer": "Onbikannte Metmaacher",
        "protectedtitles": "Verbodde Titele för Sigge",
        "protectedtitles-summary": "Hee sin verbodde Sigge-Tittele opjeleß. Onger dä Name ka_mer kein neu Sigge aanläje.\nEn Leß met dä Sigge, di jäje et Verändere udder jäje et Ömnenne jeschötz sin, fengk mer op dä Sigg [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Op di Aat sin jrad kein Sigge jäje et neu Aanlääje jeschötz.",
+       "protectedtitles-submit": "Lohß jonn!",
        "listusers": "De Metmaacherleß",
        "listusers-editsonly": "Donn nor Metmaacher zeije, di och ens jät jeschrevve han.",
        "listusers-creationsort": "Noh em Dattum vum Aanmellde zoteere",
        "usereditcount": "{{PLURAL:$1|Ein Änderong|$1 Änderonge|Nix jedonn}}",
        "usercreated": "{{GENDER:$3|}}Aanjemelldt aam $1 öm $2 Uhr",
        "newpages": "Neu Sigge",
+       "newpages-submit": "Lohß jonn!",
        "newpages-username": "Metmaacher_Naame:",
        "ancientpages": "Atikele zoteet vun Ahl noh Neu",
        "move": "Ömnenne",
        "apihelp": "Hölp för de <i lang=\"en\" xml:lang=\"en\" title=\"Application Programmers Interface\">API</i>",
        "apihelp-no-such-module": "Et Moduhl „$1“ wood nit jefonge.",
        "apisandbox": "De <i lang=\"en\">API</i> ußprobeere",
+       "apisandbox-jsonly": "Der ohne JavaSkrepp kam_mer de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> för zom erömprobehre nit bruche.",
        "apisandbox-api-disabled": "Dat <i lang=\"en\">API</i> es en heh dämm Wiki afjeschalldt.",
-       "apisandbox-intro": "Op heh dä Sigg kanns De met dä '''MediaWiki web service <i lang=\"en\">API</i>''' eröm schpelle.\nBeloor Der de Einzelheite, wi di jebruch weed, op dä iere [//www.mediawiki.org/wiki/API:Main_page Sigg met de Verklieronge].\nE Beiscpell: [//www.mediawiki.org/wiki/API#A_simple_example De Houpsigg holle].\nSöhk ene {{int:Apisb-label-action}} uß, öm mieh Beishpell aanjezeisch ze krijje.\nOch wann dat heh nor zom Ußprobeere es, kann dat, wat De heh mähß, et Wiki verändere.",
+       "apisandbox-intro": "Op heh dä Sigg kanns De met dä <strong>MediaWiki web service <i lang=\"en\">API</i></strong> eröm schpelle.\nBeloor Der de Einzelheite, wi di jebruch weed, op dä iere [[mw:API:Main_page Sigg met de Verklieronge]].\nE Beiscpell: [//www.mediawiki.org/wiki/API#A_simple_example De Houpsigg holle].\nSöhk ene {{int:Apisb-label-action}} uß, öm mieh Beishpell aanjezeisch ze krijje.\nOch wann dat heh nor zom Ußprobeere es, kann dat, wat De heh mähß, et Wiki verändere.",
        "apisandbox-submit": "Lohß jonn!",
        "apisandbox-reset": "Läddesch maache",
-       "apisandbox-examples": "Bäijshpell",
+       "apisandbox-retry": "Norr_ens versöhke",
+       "apisandbox-examples": "Bäijshpelle",
        "apisandbox-dynamic-parameters": "Zohsäzlejje Parrameetere",
        "apisandbox-results": "Erus jekumme es",
        "apisandbox-request-url-label": "Dä <i lang=\"en\">URL</i> vun dä Aanfrooch:",
        "log-title-wildcard": "Sök noh Titelle, di aanfange met …",
        "showhideselectedlogentries": "Ußjesöhk Endrääsch verschteische udder zeije",
        "log-edit-tags": "Donn de Makehronge vun de ußjesöhk Enndrähsch em Logbohch beärbeide",
+       "checkbox-all": "Alle",
+       "checkbox-none": "Keine",
+       "checkbox-invert": "Ußwahl ömdrihje",
        "allpages": "Alle Sigge",
        "nextpage": "De nächste Sigg: „$1“",
        "prevpage": "Vörijje Sigg ($1)",
        "changecontentmodel-title-label": "Dä Sigg ier Övverschreff",
        "changecontentmodel-model-label": "Et neuje Modäll för der Enhalld",
        "changecontentmodel-reason-label": "Der Jrond:",
+       "changecontentmodel-submit": "Lohß jonn!",
        "changecontentmodel-success-title": "Et Modäll för der Enhalld wohd veränndert",
        "changecontentmodel-success-text": "Et Modäll för der Enhalld vun dä Sigg „[[:$1]]“ wohd veränndert",
        "logentry-contentmodel-change-revertlink": "retuhr_nämme",
        "whatlinkshere-hidelinks": "de nommahle Lengks $1",
        "whatlinkshere-hideimages": "$1 de Lengks op Datteihje",
        "whatlinkshere-filters": "Ußsööke",
+       "whatlinkshere-submit": "Lohß jonn!",
        "autoblockid": "Automattesche Sperr Nommer $1",
        "block": "Metmaacher udder en <i lang=\"en\">IP</i>-Addräß sperre",
        "unblock": "Don en Sperr för ene Metmaacher udder en <i lang=\"en\">IP</i>-Addräß ophävve",
        "tags-delete-not-allowed": "Kännzeijsche, di övver Zohsazprojramme faßjelaat wääde, kam_mer blß fottschmiiße, wann dat Zohsazprojramm et zohlöht.",
        "tags-delete-not-found": "E Kännzeijsche „$1“ jidd_et nit.",
        "tags-delete-too-many-uses": "Dat Kännzeijsche „$1“ es för {{PLURAL:$2|mih wi ein Väsjohn|övver $2 Väsjohn|kein Väsjohn}} em jebruch, dröm kam_mer et nit fottschmiiße.",
-       "tags-delete-warnings-after-delete": "Dat Kännzeijsche „$1“ es fottjeschmeße, ävver {{PLURAL:$2|ei Problem|$2 Probleme|kein Problem}} es opjevalle:",
+       "tags-delete-warnings-after-delete": "Dat Kännzeijsche „$1“ es fottjeschmeße, ävver {{PLURAL:$2|ei Problehm|$2 Problehme|kein Problhem}} es opjevalle:",
        "tags-activate-title": "Kännzeijsche aanschallde",
        "tags-activate-question": "Do bes om bäßte Wähsch, et Kännzeijsche „$1“ aanzeschallde.",
        "tags-activate-reason": "Jrond:",
index 59f5172..9499c11 100644 (file)
        "recentchanges-label-bot": "Ev guherîn ji aliyê botekê ve hate çêkirin",
        "recentchanges-label-unpatrolled": "Ev gotar hêjî nehatiye sererastkirin",
        "recentchanges-label-plusminus": "Qebareya vê rûpelê bi ev qas biteyan hate guherandin",
-       "recentchanges-legend-heading": "'''Ravekirina kurtenavan:'''",
+       "recentchanges-legend-heading": "<strong>Ravekirina kurtenavan:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (here [[Special:NewPages|lîsteya rûpelên nû]])",
        "rclistfrom": "Guherandinên ji $3 $2 şûnde nîşan bide",
        "rcshowhideminor": "Guherandinên biçûk $1",
index a40a73e..6b316da 100644 (file)
        "createaccountreason": "Acheson:",
        "createacct-reason": "Acheson",
        "createacct-reason-ph": "Prag yth esowgh ow kwruthyl akont aral",
-       "createacct-captcha": "Gwiryans sekerder",
-       "createacct-imgcaptcha-ph": "Entrewgh an tekst a welowgh a-ugh",
        "createacct-submit": "Gwruthyl agas akont",
        "createacct-benefit-heading": "Gwrys yw {{SITENAME}} gans tus kepar ha hwi.",
        "createacct-benefit-body1": "{{PLURAL:$1|janj|chanj}}",
        "passwordreset-domain": "Tiredh:",
        "passwordreset-email": "Trigva ebost:",
        "passwordreset-emailtitle": "Manylyon agas akont war {{SITENAME}}",
-       "passwordreset-emailsent": "Ebost dassettya ger tremena re beu danvenys.",
+       "passwordreset-emailsentemail": "Ebost dassettya ger tremena re beu danvenys.",
        "passwordreset-emailsent-capture": "Ebost dassettya ger tremena re beu danvenys, hag y hyllir y weles a-woles.",
        "changeemail": "Chanjya trigva ebost",
-       "changeemail-text": "Lenwewgh an furvlen-ma rag chanjya agas trigva ebost. Y fydh res dhywgh entra agas ger tremena rag afydhya an chanj-ma.",
+       "changeemail-header": "Chanjya trigva ebost an akont",
        "changeemail-oldemail": "Agas trigva ebost a-lemmyn:",
        "changeemail-newemail": "Agas trigva ebost nowyth:",
        "changeemail-none": "(nagonan)",
        "recentchanges-label-minor": "Chanj byghan yw hemma",
        "recentchanges-label-bot": "Gwrys veu an chanj ma gans bott",
        "recentchanges-label-unpatrolled": "Ny veu an chanj ma patrolyes hwath",
-       "recentchanges-legend-heading": "'''Alhwedh:'''",
+       "recentchanges-legend-heading": "<strong>Alhwedh:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (gweler ynwedh an [[Special:NewPages|rol a folennow nowydh]])",
        "rclistfrom": "Diskwedhes chanjyow nowydh yn unn dhalleth dhyworth $3 $2",
        "rcshowhideminor": "$1 chanjyow byghan",
        "activeusers-hidesysops": "Kudha menystroryon",
        "listgrouprights-members": "(rol eseli)",
        "emailuser": "Ebostya an devnydhyer-ma",
-       "emailpage": "Ebostya devnydhyer",
        "defemailsubject": "Ebost danvenys dre {{SITENAME}} gans an devnydhyer \"$1\"",
        "emailfrom": "Dhyworth:",
        "emailto": "Dhe:",
        "move-page": "Gwaya $1",
        "move-page-legend": "Gwaya folen",
        "movepagetext": "Devnydhya an furvlen a-woles a dhashenow folen, yn unn waya oll y istori dhe'n hanow nowyth.\nAn titel koth a vydh folen dhaskedyans dhe'n titel nowyth.\nHwi a yll nowedhi daskedyansow a boynt dhe'n titel derowel yn awtomatek.\nMar ny wrewgh, surhewgh hwi dhe jeckya rag [[Special:DoubleRedirects|daskedyansow dobyl]] po [[Special:BrokenRedirects|terrys]].\nOmgemeryansek owgh rag surhe y pes kevrennow poyntya dhe'n tyller ewn.\n\nNotyewgh '''na wayir''' an folen mars eus folen orth an titel nowyth seulabrys, marnas bos an pyth kampollys diwettha daskedyans ha ny'n jeves istori chanjya kyns vyth.\nHemm a styr y hyllowgh diswul dashenwel folen mar kwrewgh kammwrians, ha ny yllowgh gorskrifa folen eus ena seulabrys.\n\n'''Gwarnyans!'''\nHemm a yll bos chanj tromm ha bras dres ehen rag folen gerys-da;\nSurhewgh mar pleg hwi dhe gonvedhes sewyansow an gwrians-ma kyns mos yn-rag.",
-       "movearticle": "Gwaya an folen:",
        "moveuserpage-warning": "'''Gwarnyans''': Yth esowgh ow mos dhe waya folen dhevnydhyer. Notyewgh mar pleg ny vydh marnas an folen gwayys ha ''ny vydh'' an devnydhyer dashenwys.",
        "newtitle": "Dhe ditel nowyth:",
        "move-watch": "Golya an folen-ma",
index 0d9010e..3e2c5f1 100644 (file)
        "tog-hideminor": "Recensiones minores in indice nuper mutatorum supprimere",
        "tog-hidepatrolled": "Redactiones censae inter nuper mutatas celandae",
        "tog-newpageshidepatrolled": "Paginae censae inter nouissime creatas celandae",
+       "tog-hidecategorization": "Classificationes paginarum supprimere",
        "tog-extendwatchlist": "In indice paginarum observandarum non solum recentissimas, verum omnes mutationes ostendere",
        "tog-usenewrc": "Indices per paginas redigere",
        "tog-numberheadings": "Subtituli numeris adornandi",
-       "tog-showtoolbar": "Affigere trabem redigentem",
+       "tog-showtoolbar": "Trabem editoriam affigere",
        "tog-editondblclick": "Duplici ictu liceat paginam recensere",
        "tog-editsectiononrightclick": "Titulis a dextra tactis liceat paginarum partes recensere",
        "tog-watchcreations": "Paginas, quas creavero, et fasciculos, quos imposuero, observare",
        "tog-watchdefault": "Paginas et fasciculos, quos recensuero, observare",
        "tog-watchmoves": "Paginas et fasciculos, quos movero, observare",
        "tog-watchdeletion": "Paginas et fasciculos, quos delevero, paginarum observandarum indici addere",
-       "tog-minordefault": "Notare omnes recensiones quasi minores",
+       "tog-minordefault": "Omnes recensiones per se ut minores notare",
        "tog-previewontop": "Prospectum supra capsam recensoriam ostendere",
        "tog-previewonfirst": "Prospectum novae paginae perhibere",
        "tog-enotifwatchlistpages": "Mutata vel pagina vel fasciculo observando certior fiam",
@@ -54,7 +55,7 @@
        "tog-oldsig": "Subscriptio, qua nunc uteris:",
        "tog-fancysig": "Subscriptio vicitext (sine nexu automatico)",
        "tog-uselivepreview": "Prospectum viventem perhibere",
-       "tog-forceeditsummary": "Si recensionem non summatim descripsero, me roga si continuare velim",
+       "tog-forceeditsummary": "Cavere, ut recensionem summatim describam",
        "tog-watchlisthideown": "Recensiones meas in paginarum observandarum indice supprimere",
        "tog-watchlisthidebots": "Recensiones per automaton factas in paginarum observandarum indice supprimere",
        "tog-watchlisthideminor": "Minores recensiones in paginarum observandarum indice supprimere",
        "tog-diffonly": "Nihil nisi differentia in pagina facta ostendatur",
        "tog-showhiddencats": "Categorias celatas monstrare",
        "tog-norollbackdiff": "Post reversionem paginae differentia neglegatur",
+       "tog-useeditwarning": "Prohibere, ne paginam nondum servatam relinquam",
        "underline-always": "Semper",
        "underline-never": "Numquam",
        "underline-default": "Defalta navigatri interretialis",
+       "editfont-style": "Stilus:",
+       "editfont-default": "iuxta navigatrum",
        "sunday": "dies Solis",
        "monday": "dies Lunae",
        "tuesday": "dies Martis",
        "delete": "Delere",
        "deletethispage": "Delere hanc paginam",
        "undeletethispage": "Hanc paginam restituere",
-       "undelete_short": "Restituere {{PLURAL:$1|unam emendationem|$1 emendationes}}",
-       "viewdeleted_short": "Inspicere {{PLURAL:$1|unam emendationem deletam|$1 emendationes deletas}}",
+       "undelete_short": "{{PLURAL:$1|Unam recensionem|$1 recensiones}} restituere",
+       "viewdeleted_short": "{{PLURAL:$1|unam redactionem deletam|$1 redactiones deletas}} inspicere",
        "protect": "Protegere",
        "protect_change": "mutare",
        "protectthispage": "Protegere hanc paginam",
        "collapsible-expand": "Dilatare",
        "thisisdeleted": "Videre aut restituere $1?",
        "viewdeleted": "Visne conspicere $1?",
-       "restorelink": "{{PLURAL:$1|unam emendationem deletam|$1 emendationes deletas}}",
+       "restorelink": "{{PLURAL:$1|unam redactionem deletam|$1 redactiones deletas}}",
        "feedlinks": "Fluxus:",
        "feed-invalid": "Typus subscriptionis fluxus invalidus.",
        "feed-unavailable": "Fluxus syndicationis non praestiti",
        "error": "Erratum",
        "databaseerror": "Erratum in basi datorum",
        "readonly": "Basis datorum obstructa",
-       "missingarticle-rev": "(numerus emendationis: $1)",
+       "missingarticle-rev": "(ID numerus redactionis: $1)",
        "missingarticle-diff": "(Diss: $1, $2)",
        "internalerror": "Erratum internum",
        "internalerror_info": "Erratum internum: $1",
        "viewsource": "Fontem inspicere",
        "viewsource-title": "Fontem paginae $1 inspicere",
        "actionthrottled": "Actio strangulata",
-       "protectedpagetext": "Haec pagina protecta est, ut emendationes prohibeantur.",
+       "protectedpagetext": "Huic paginae protectio data est, ne redigatur neu aliter tractetur.",
        "viewsourcetext": "Fontem videas et exscribeas:",
        "protectedinterface": "Haec pagina dat textum interfaciei pro logiciali, et est protecta ad vandalismum vetandum.",
        "editinginterface": "'''Caveat censor:''' Emendas iam paginam quae textum interfaciei logicialem dat. Mutationes vultum {{grammar:genitive|{{SITENAME}}}} omnibus usoribus afficient. In nuntia MediaWiki vertendo, quaesumus te uti [//translatewiki.net/wiki/Main_Page?setlang=la translatewiki.net].",
        "editingcomment": "Recensens $1 (nova pars)",
        "editconflict": "Contentio recensionis: $1",
        "explainconflict": "Alius hanc paginam mutavit postquam eadem recensere incipiebas.\nCapsa superior paginae verba recentissima continet.\nMutationes tuae in capsa inferiore monstrantur.\nMutationes tuae in verba superiora adiungare debes.\n'''Solum''' verba capsae superioris servabuntur quando \"{{int:savearticle}}\" premes.",
-       "yourtext": "Sententia tua",
-       "storedversion": "Versio ante recensionem tuam novissime facta",
+       "yourtext": "Tua redactio",
+       "storedversion": "Redactio modo servata",
        "nonunicodebrowser": "'''CAVETO: Navigatorium retiale tuum systemati UNICODE morem non gerit. Modum habemus quo commentationes sine damno recenseas: litterae non-ASCII in capsa sub veste hexadecimali ostendentur.'''",
-       "editingold": "'''MONITIO: Emendationem obsoletam huius paginae mutas.\nSi eam servaveris, omnes mutationes recentiores obrogatae peribunt!'''",
+       "editingold": "'''CAVE, ne huius paginae redactionem recenses obsoletam!\nQua servata omnes recensiones abhinc factas peribunt.'''",
        "yourdiff": "Differentia",
        "copyrightwarning": "Nota bene omnia contributa divulgari sub ''$2'' (vide singula apud $1).\nNisi vis verba tua crudelissime recenseri, mutari, et ad libidinem redistribui, noli ea submittere.<br />\nNobis etiam spondes te esse ipsum horum verborum scriptorem primum, aut ex opere in \"dominio publico\" exscripsisse.\n'''NOLI OPERIBUS SUB IURE DIVULGANDI UTI SINE POTESTATE!'''",
        "copyrightwarning2": "Nota bene omnia contributa apud {{grammar:accusative|{{SITENAME}}}} ab aliis recenseri, mutari vel removi posse.\nNisi vis verba tua crudelissime recenseri, noli ea submittere.<br />\nNobis etiam spondes te esse ipsum horum verborum scriptorem primum, aut ex opere in \"dominio publico\" vel ex libere fonte simili exscripsisse (vide singula apud $1).\n'''NOLI OPERIBUS SUB IURE DIVULGANDI UTI SINE POTESTATE!'''",
        "cantcreateaccount-text": "Ex hoc loco IP ('''$1''') nomen sibi imponere ab usore [[User:$3|$3]] interdicitur.\nQui hanc causam dedit: ''$2''",
        "viewpagelogs": "Vide acta huius paginae",
        "nohistory": "Huic paginae non est historia.",
-       "currentrev": "Versio novissime facta",
-       "currentrev-asof": "Versio novissime (die $2, hora $3) facta",
-       "revisionasof": "Emendatio ex $1",
-       "revision-info": "Emendatio ex $1 ab $2$7",
-       "previousrevision": "← Emendatio senior",
-       "nextrevision": "Emendatio novior →",
-       "currentrevisionlink": "Emendatio currens",
+       "currentrev": "Redactio novissima",
+       "currentrev-asof": "Redactio novissime (die $2, hora $3) facta",
+       "revisionasof": "Redactio $1 facta",
+       "revision-info": "Redactio $1 a conlatore $2 facta$7",
+       "previousrevision": "← Redactio superior",
+       "nextrevision": "Redactio recentior →",
+       "currentrevisionlink": "Redactio novissima",
        "cur": "nov",
        "next": "seq",
        "last": "prox",
        "historysize": "({{PLURAL:$1|1 octetus|$1 octeti}})",
        "historyempty": "(vacua)",
        "history-feed-title": "Historia",
-       "history-feed-description": "Historia emendationum huius paginae",
+       "history-feed-description": "Historia recensionum huius paginae",
        "history-feed-item-nocomment": "$1 ad $2",
        "rev-deleted-comment": "(summarium celatum)",
        "rev-deleted-user": "(nomen usoris celatum est)",
        "rev-deleted-event": "(perscriptio celata)",
        "rev-delundel": "monstrare/celare",
        "rev-showdeleted": "monstrare",
-       "revisiondelete": "Emendationem delere",
-       "revdelete-nooldid-title": "Emendatio-scopus invalida",
+       "revisiondelete": "Redactiones delere vel restituere",
+       "revdelete-nooldid-title": "Redactio scopo invalida",
        "revdelete-show-file-submit": "Sic",
-       "revdelete-selected-text": "{{PLURAL:$1|Emendatio selecta|Emendationes selectae}} paginae [[:$2]]:",
-       "revdelete-selected-file": "{{PLURAL:$1|Emendatio selecta|Emendationes selectae}} fasciculi [[:$2]]:",
+       "revdelete-selected-text": "{{PLURAL:$1|Redactio selecta|Redactiones selectae}} paginae [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Redactio selecta|Redactiones selectae}} fasciculi [[:$2]]:",
        "revdelete-legend": "Modificare cohibitiones visibilitatis",
-       "revdelete-hide-text": "Textus emendationis",
+       "revdelete-hide-text": "Textus redactionis",
        "revdelete-hide-image": "Celare contentum fasciculi",
-       "revdelete-hide-comment": "Summarium emendationis",
+       "revdelete-hide-comment": "Summarium recensionis",
        "revdelete-hide-user": "Nomen usoris/locus IP",
        "revdelete-radio-same": "non mutare",
        "revdelete-radio-set": "Celare",
        "revdelete-otherreason": "Causa alia vel explicatio:",
        "revdelete-reasonotherlist": "Causa alia",
        "revdelete-edit-reasonlist": "Causas deletionum recensere",
-       "revdelete-offender": "Auctor emendationis:",
+       "revdelete-offender": "Redegit:",
        "suppressionlog": "Acta suppressionum",
        "mergehistory": "Historias paginarum confundere",
-       "mergehistory-box": "Emendationes duarum paginarum confundere:",
+       "mergehistory-box": "Redactiones duarum paginarum conflare:",
        "mergehistory-from": "Pagina imponenda:",
        "mergehistory-into": "Pagina petita:",
        "mergehistory-list": "Historia recensionum confusibilis",
        "mergehistory-go": "Monstrare recensiones confusibiles",
-       "mergehistory-submit": "Confundere emendationes",
-       "mergehistory-empty": "Nullae emendationes confusibiles.",
+       "mergehistory-submit": "Redactiones conflare",
+       "mergehistory-empty": "Nullae redactiones, quae conflari possint.",
        "mergehistory-autocomment": "confundavit [[:$1]] cum [[:$2]]",
        "mergehistory-comment": "confundavit [[:$1]] cum [[:$2]]: $3",
        "mergehistory-reason": "Causa:",
        "history-title": "Historia paginae \"$1\"",
        "lineno": "Linea $1:",
        "compareselectedversions": "Redactiones selectas conferre",
-       "showhideselectedversions": "Monstrare/celare emendationes selectas",
+       "showhideselectedversions": "Redactiones selectas vel ostendi vel celari iubere",
        "editundo": "abrogare",
        "diff-empty": "(eadem)",
        "searchresults": "Eventum investigationis",
        "search-suggest": "Nonne dicere voluisti: $1",
        "search-rewritten": "Ostenduntur, quae per \"$1\" inveniuntur. Profecto scrutinari, ubi \"$2\" contineatur!",
        "search-interwiki-caption": "Alia incepta",
-       "search-interwiki-default": "$1 eventus:",
+       "search-interwiki-default": "Inventa apud $1:",
        "search-interwiki-more": "(plus)",
        "search-relatedarticle": "Relata",
        "searchrelated": "relata",
        "prefs-rc": "Nuper mutata",
        "prefs-watchlist": "Paginae observandae",
        "prefs-watchlist-days": "Quot dies index respiciat:",
-       "prefs-watchlist-days-max": "Numerus maximus: $1 {{PLURAL:$1|dies|dies}}",
+       "prefs-watchlist-days-max": "Maximum spatium: $1 {{PLURAL:$1|dies|dies}}",
        "prefs-watchlist-edits": "Quot mutationes index summum respiciat:",
-       "prefs-watchlist-edits-max": "Numerus maximus: 1000",
+       "prefs-watchlist-edits-max": "Maximus numerus: 1000",
        "prefs-misc": "Misc",
        "prefs-resetpass": "Tesseram mutare",
        "prefs-email": "Modi ad litteras electronicas spectantes",
        "prefs-rendering": "Conspectus",
        "saveprefs": "Hos modos servare",
        "restoreprefs": "Omnes (diversi) modi in integrum restituantur",
-       "prefs-editing": "Mensura capsae verbi",
+       "prefs-editing": "Recensere",
        "rows": "Lineae:",
        "columns": "Columnae:",
        "searchresultshead": "Figuratio eventorum investigationis",
        "recentchangesdays": "Quot dies index respiciat:",
+       "recentchangesdays-max": "$1 maxime {{PLURAL:$1|diem|dies}}",
        "recentchangescount": "Quot mutationes index respiciat:",
+       "prefs-help-recentchangescount": "Inclusis nuper mutatis, paginarum historiis, actis",
        "savedprefs": "Modi tui servati sunt.",
        "timezonelegend": "Zona temporis:",
        "localtime": "Hora indigena:",
        "prefs-info": "Generalia",
        "prefs-i18n": "Sermonis delectus",
        "prefs-signature": "Subscriptio",
+       "prefs-advancedediting": "Generalia",
+       "prefs-editor": "Capsa editoria",
        "prefs-preview": "Prospectus",
        "prefs-advancedrc": "Modi speciales",
        "prefs-advancedwatchlist": "Indicis modi speciales",
        "right-autoconfirmed": "Paginas semiprotectas recensere",
        "right-delete": "Paginas delere",
        "right-bigdelete": "Paginas magnarum historiarum delere",
-       "right-deleterevision": "Emendationes paginarum delere vel restituere",
+       "right-deleterevision": "Quasdam paginarum redactiones delere vel restituere",
        "right-browsearchive": "Paginas deletas quaerere",
        "right-undelete": "Paginam restituere",
-       "right-suppressrevision": "Emendationes magistratus celatas inspicere vel restituere",
+       "right-suppressrevision": "Quasvis redactiones cuiuscumque conlatoris inspicere nec non celare vel visibiles reddere",
        "right-suppressionlog": "Acta privata inspicere",
        "right-block": "Usores alios obstruere ne recensere possunt",
        "right-blockemail": "Usorem obstruere ne litteras electronicas mittere potest",
        "action-upload_by_url": "hunc fasciculum imponere ex inscriptione URL",
        "action-writeapi": "API scripturae usere",
        "action-delete": "hanc paginam delere",
-       "action-deleterevision": "hanc emendationem delere",
+       "action-deleterevision": "hanc redactionem delere",
        "action-browsearchive": "paginas deletas quaerere",
        "action-undelete": "hanc paginam restituere",
-       "action-suppressrevision": "hanc emendationem magistratus celatam inspicere vel restituere",
+       "action-suppressrevision": "hanc redactionem celatam inspicere neu restituere",
        "action-suppressionlog": "haec acta privata inspicere",
        "action-block": "hunc usorem obstruere ne recensere potest",
        "action-protect": "protectionem huius paginae mutare",
        "recentchanges-label-bot": "Hanc recensionem automaton fecit",
        "recentchanges-label-unpatrolled": "Haec recensio nondum est examinata",
        "recentchanges-label-plusminus": "Tot octetis magnitudo paginae mutata est",
-       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vide etiam [[Special:NewPages|indicem paginarum novarum]])",
        "rcnotefrom": "Subter sunt '''$1''' nuperrime mutata in proxima '''$2''' die.",
        "rclistfrom": "Monstrare mutata nova incipiens ab $3 $2",
        "rcshowhidemine": "$1 conlationes meas",
        "rcshowhidemine-show": "Monstrare",
        "rcshowhidemine-hide": "Celare",
+       "rcshowhidecategorization": "$1 classificationes",
+       "rcshowhidecategorization-show": "Ostendere",
+       "rcshowhidecategorization-hide": "Supprimere",
        "rclinks": "Monstrare $1 nuperrime mutata in $2 diebus proximis.<br />$3",
        "diff": "diss",
        "hist": "hist",
        "listfiles_user": "Usor",
        "listfiles_size": "Magnitudo",
        "listfiles_description": "Descriptio",
-       "listfiles_count": "Emendationes",
+       "listfiles_count": "Redactiones",
        "file-anchor-link": "Fasciculus",
        "filehist": "Historia fasciculi",
-       "filehist-help": "Ad emendationem fasciculi inspiciendum, preme in diem/tempus.",
-       "filehist-deleteall": "delere omnes emendationes",
+       "filehist-help": "Presso die vel tempore fasciculum videbis, sicut tunc temporis apparuit.",
+       "filehist-deleteall": "omnes redactiones delere",
        "filehist-deleteone": "delere",
        "filehist-revert": "revertere",
        "filehist-current": "recentissima",
        "filehist-datetime": "Dies/Tempus",
        "filehist-thumb": "Minutio",
-       "filehist-thumbtext": "Minutio emendationis ex $1",
+       "filehist-thumbtext": "Minutum speculum redactionis $1 factae",
        "filehist-nothumb": "Nulla minutio",
        "filehist-user": "Usor",
        "filehist-dimensions": "Dimensiones",
        "sharedupload-desc-create": "Hic fasciculus apud {{grammar:accusative|$1}} iacet; in aliis inceptis adhiberi potest.\nFortasse [$2 paginam descriptionis fasciculi] ibi sitam recensere vis.",
        "filepage-nofile": "Fasciculus huius nominis non est.",
        "filepage-nofile-link": "Fasciculus huius nominis non est, sed [$1 fasciculum imponere] potes.",
-       "uploadnewversion-linktext": "Emendationem novam huius fasciculi imponere",
+       "uploadnewversion-linktext": "Novam huius fasciculi redactionem imponere",
        "shared-repo-from": "apud {{grammar:accusative|$1}}",
        "shared-repo": "repositorium commune",
        "shared-repo-name-wikimediacommons": "Vicimedia Communia",
        "filerevert": "Revertere $1",
        "filerevert-legend": "Reverti fasciculum",
-       "filerevert-intro": "Reverteris '''[[Media:$1|$1]]''' ad [emendationem $4 ex $3, $2].",
+       "filerevert-intro": "Reversurus es '''[[Media:$1|$1]]''' ad [redactionem $4, sicut $2, $3 facta erat].",
        "filerevert-comment": "Causa:",
-       "filerevert-defaultcomment": "Reverti ad emendationem ex $2, $1 ($3)",
+       "filerevert-defaultcomment": "Reverti ad redactionem die $1, hora $2 ($3) factam",
        "filerevert-submit": "Revertere",
-       "filerevert-success": "'''[[Media:$1|$1]]''' reversum est ad [emendationem $4 ex $3, $2].",
+       "filerevert-success": "'''[[Media:$1|$1]]''' reversum est ad redactionem [$4, quae $2, $3 facta erat].",
        "filedelete": "Delere $1",
        "filedelete-legend": "Fasciculum delere",
        "filedelete-intro": "Deles fasciculum '''[[Media:$1|$1]]''' una cum tota eius historia.",
-       "filedelete-intro-old": "Deles fasciculi '''[[Media:$1|$1]]''' emendationem [$4 ex $3, $2].",
+       "filedelete-intro-old": "Delebis fasciculi '''[[Media:$1|$1]]''' redactionem [$4 die $2, hora $3 factam].",
        "filedelete-comment": "Causa:",
        "filedelete-submit": "Delere",
-       "filedelete-success": "'''$1''' deletum est.",
-       "filedelete-success-old": "Emendatio fasciculi '''[[Media:$1|$1]]''' ex $3, $2 deletum est.",
+       "filedelete-success": "Fasciculus '''$1''' deletus est.",
+       "filedelete-success-old": "Redactio fasciculi '''[[Media:$1|$1]]''', sicut $2, $3 facta erat, deleta est.",
        "filedelete-nofile": "'''$1''' non existit.",
        "filedelete-otherreason": "Causa alia vel explicatio:",
        "filedelete-reason-otherlist": "Causa alia",
        "ncategories": "$1 {{PLURAL:$1|categoria|categoriae}}",
        "nlinks": "$1 {{PLURAL:$1|nexus|nexus}}",
        "nmembers": "$1 {{PLURAL:$1|inest|insunt}}",
-       "nrevisions": "$1 {{PLURAL:$1|emendatio|emendationes}}",
+       "nrevisions": "$1 {{PLURAL:$1|redactio|redactiones}}",
        "lonelypages": "Paginae non annexae",
        "uncategorizedpages": "Paginae sine categoriis",
        "uncategorizedcategories": "Categoriae sine categoriis",
        "listusers-noresult": "Nullus usor inventus.",
        "listusers-blocked": "(obstructus)",
        "activeusers": "Index usorum activorum",
-       "activeusers-count": "{{PLURAL:$1|una recensio recens|$1 recensiones recentes}} {{PLURAL:$3|die proximo|in diebus $3 proximis}}",
+       "activeusers-count": "{{PLURAL:$1|una recensio {{PLURAL:$3|hodie|his $3 diebus}} facta|$1 recensiones {{PLURAL:$3|hodie|his $3 diebus}} factae}}",
        "activeusers-hidebots": "Celare automata",
        "activeusers-hidesysops": "Celare magistratus",
        "activeusers-noresult": "Nullus usor inventus.",
        "unwatch": "Non iam observare",
        "unwatchthispage": "Non iam observare",
        "notanarticle": "Res non est",
-       "notvisiblerev": "Emendatio deleta est",
+       "notvisiblerev": "Superior redactio ab alio conlatore facta deleta est",
        "watchlist-details": "{{PLURAL:$1|$1 paginam|$1 paginas}} observas.",
        "wlheader-enotif": "Mutationes si quae factae erunt, electronice tibi nuntiabuntur.",
        "wlheader-showupdated": "Paginae nondum a te inspectae <strong>typis crassioribus</strong> ostenduntur.",
        "wlnote": "{{PLURAL:$1|Indicatur mutatio novissima|Indicantur '''$1''' mutationes novissimae}} abhinc {{PLURAL:$2|superiorem horam|superiores '''$2''' horas}} (ab $3, $4) factae.",
        "wlshowlast": "Monstrare proximas $1 horas $2 dies",
        "watchlist-hide": "Supprimere recensiones",
-       "watchlist-submit": "Porrige",
-       "wlshowtime": "Temporis spatium porrigendum:",
+       "watchlist-submit": "Ostendere",
+       "wlshowtime": "Index respiciat:",
        "wlshowhideminor": "minores",
        "wlshowhidebots": "automatice factas",
        "wlshowhideliu": "a conlatoribus notis factas",
        "wlshowhideanons": "sine nomine factas",
        "wlshowhidemine": "meas",
+       "wlshowhidecategorization": "classificationes",
        "watchlist-options": "Huius indicis modi",
        "watching": "Custodiens...",
        "unwatching": "Decustodiens...",
        "enotif_impersonal_salutation": "Usor {{grammar:genitive|{{SITENAME}}}}",
        "enotif_lastdiff": "Vide $1 ad hanc recensionem inspiciendum.",
        "enotif_anon_editor": "usor ignotus $1",
-       "enotif_body": "\nSalve $WATCHINGUSERNAME,\n\nPagina {{grammar:genitive|{{SITENAME}}}} $PAGETITLE ab $PAGEEDITOR die $PAGEEDITDATE $CHANGEDORCREATED est, vide emendationem currentem apud $PAGETITLE_URL\n\n$NEWPAGE\n\nAuctor hunc summarium dedit: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nlitterae electronicae: $PAGEEDITOR_EMAIL\nvici: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further changes unless you visit this page.\nYou could also reset the notification flags for all your watched pages on your watchlist.\n\n             Your friendly {{SITENAME}} notification system\n\n--\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFeedback and further assistance:\n$HELPPAGE",
+       "enotif_body": "\nSalve $WATCHINGUSERNAME,\n\nPagina {{grammar:genitive|{{SITENAME}}}} $PAGETITLE ab $PAGEEDITOR die $PAGEEDITDATE $CHANGEDORCREATED est. Vide redactionem currentem apud $PAGETITLE_URL\n\n$NEWPAGE\n\nCuius auctor hoc summarium dedit: $PAGESUMMARY $PAGEMINOREDIT\n\nUt conlatorem adloquaris:\nlitterae electronicae: $PAGEEDITOR_EMAIL\nvici: $PAGEEDITOR_WIKI\n\nDe futuris recensionibus non certior fies nisi nomine dato paginam ipsam inspexeris. Praeterea licet omnes paginas non iam observandas notare.\n\n             Your friendly {{SITENAME}} notification system\n\n--\nUt paginarum observandarum modos spectes, ito ad\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFeedback and further assistance:\n$HELPPAGE",
        "created": "creata",
        "changed": "mutata",
        "deletepage": "Delere paginam",
        "confirm": "Adfirmare",
-       "excontent": "contenta erant: '$1'",
-       "excontentauthor": "contenta erant: '$1' (et contributor unicus erat '[[Special:Contributions/$2|$2]]')",
-       "exbeforeblank": "contenta priusquam pagina facta vacua erant: '$1'",
+       "excontent": "contenta fuerant: \"$1\"",
+       "excontentauthor": "contenta fuerant: \"$1\", conlata a solo \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|Disputatio]])",
+       "exbeforeblank": "pagina rasa continuerat: \"$1\"",
        "delete-confirm": "Delere \"$1\"",
        "delete-legend": "Delere",
-       "historywarning": "'''Monitio:''' Pagina quam delere vis historiam {{PLURAL:$1|unius fere emendationis|$1 fere emendationum}} habet:",
+       "historywarning": "'''Cave:''' Paginae, quam deleturus es, historia est {{PLURAL:$1|unius redactionis|$1 redactionum}}:",
        "confirmdeletetext": "Paginam cum tota historia eius delebis.\nAdfirma quaesumus te paginam re vera delere velle, te consequentias intellere, et actionem tuam [[{{MediaWiki:Policy-url}}|consilio]] congruere.",
        "actioncomplete": "Actum perfectum",
        "actionfailed": "Actum non feliciter evenit",
        "dellogpage": "Index deletionum",
        "dellogpagetext": "Subter est index deletionum recentissimarum.",
        "deletionlog": "index deletionum",
-       "reverted": "Reversum ad emendationem proximam",
+       "reverted": "Reversa in superiorem redactionem",
        "deletecomment": "Causa:",
        "deleteotherreason": "Causa alia vel explicatio:",
        "deletereasonotherlist": "Causa alia",
        "rollbacklinkcount": "reverti {{PLURAL:$1|unam recensionem|$1 recensiones}}",
        "rollbacklinkcount-morethan": "reverti plus quam {{PLURAL:$1|unam recensionem|$1 recensiones}}",
        "rollbackfailed": "Reversum defecit",
-       "cantrollback": "Haec non potest reverti; conlator proximus solus auctor huius rei est.",
-       "alreadyrolled": "Ad emendationem proximam paginae [[:$1]] ab usore [[User:$2|$2]] ([[User talk:$2|Disputatio]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) reverti non potest; alius paginam iam recensuit vel revertit.\n\nEmendatio proxima ab usore [[User:$3|$3]] ([[User talk:$3|Disputatio]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) effecta est.",
+       "cantrollback": "Haec reverti non potest;\nhic conlator solus auctor huius paginae est.",
+       "alreadyrolled": "Ad superiorem redactionem paginae [[:$1]] a conlatore [[User:$2|$2]] ([[User talk:$2|Disputatio]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) facta reverti non potest;\nalius quisquam paginam iam recensuit vel revertit.\n\nQuae novissima redactio effecta est a conlatore [[User:$3|$3]] ([[User talk:$3|Disputatio]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Summarium erat: <em>$1</em>.",
-       "revertpage": "Reverti recensiones ab usore [[Special:Contributions/$2|$2]] ([[User talk:$2|Disputatio]]) ad emendationem proximam ab [[User:$1|$1]]",
-       "rollback-success": "Reverti recensiones ab usore $1\nad emendationem proximam ab $2.",
+       "revertpage": "Recensiones a conlatore [[Special:Contributions/$2|$2]] ([[User talk:$2|Disputatio]]) factas in superiorem redactionem a conlatore [[User:$1|$1]] factam restitui",
+       "rollback-success": "Redactiones a conlatore $1 factae reversae sunt;\nrestitutae in superiorem redactionem a conlatore $2 factam.",
        "protectlogpage": "Index protectionum",
        "protectlogtext": "Subter est index protectionum et deprotectionum paginarum. Vide [[Special:ProtectedPages|indicem paginarum nunc protectarum]].",
        "protectedarticle": "protegit \"[[$1]]\"",
        "undeletepage": "Videre et restituere paginas deletas",
        "viewdeletedpage": "Paginas deletas inspicere",
        "undeletepagetext": "{{PLURAL:$1|Pagina sequens deleta est sed tabulis manens restitui potest.|Paginae $1 sequentes deletae sunt sed tabulis manentes restitui possunt.}}\nTabulae nonnumquam deletae sunt.",
-       "undelete-fieldset-title": "Emendationes restituere",
-       "undeleterevisions": "$1 {{PLURAL:$1|emendatio servata|emendationes servatae}}",
-       "undeletehistory": "Si paginam restituis, omnes emendationes restituentur ad historiam.\nSi pagina nova cum ipso nomine post deletionem creata est, emendationes restitutae in historia priori apparebunt.",
-       "undelete-revision": "Emendatio deleta paginae $1 (ex $5, $4) ab usore $3:",
-       "undelete-nodiff": "Nulla emendatio prior inventa.",
+       "undelete-fieldset-title": "Redactiones restituere",
+       "undeleterevisions": "$1 {{PLURAL:$1|redactio deleta|redactiones deletae}}",
+       "undeletehistory": "Si paginam restitueris, omnes redactiones restituentur ad historiam.\nSi pagina nova eiusdem nominis post deletionem creata est, redactiones restitutae in historia priori apparebunt.",
+       "undelete-revision": "Redactio deletae paginae $1 (sicut $4, $5 a conlatore $3 facta erat):",
+       "undelete-nodiff": "Redactio prior non est.",
        "undeletebtn": "Restituere",
        "undeletelink": "inspicere/restituere",
        "undeleteviewlink": "inspicere",
        "undeleteinvert": "Selectionem invertere",
        "undeletecomment": "Causa:",
-       "undeletedrevisions": "{{PLURAL:$1|1 emendatio recuperata|$1 emendationes recuperatae}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 emendatio recuperata|$1 emendationes recuperatae}} et {{PLURAL:1 fasciculus recuperatus|$2 fasciculi recuperati}}",
-       "undeletedfiles": "{{PLURAL:$1|1 fasciculus recuperatus|$1 fasciculi recuperati}}",
+       "undeletedrevisions": "{{PLURAL:$1|1 redactio restituta est|$1 redactiones restitutae sunt}}",
+       "undeletedrevisions-files": "{{PLURAL:$1|1 redactio restituta est|$1 redactiones restitutae sunt}} et {{PLURAL:1 fasciculus restitutus est|$2 fasciculi restituti sunt}}",
+       "undeletedfiles": "{{PLURAL:$1|1 fasciculus restitutus est|$1 fasciculi restituti sunt}}",
        "cannotundelete": "Abrogatio deletionis fefellit; fortasse aliquis iam paginam restituit.",
        "undelete-header": "Pro paginis nuper deletis, vide [[Special:Log/delete|indicem deletionum]].",
        "undelete-search-box": "Quaerere inter paginas iam deletas",
        "import-upload-filename": "Nomen fasciculi:",
        "import-comment": "Sententia:",
        "importstart": "Adportare paginas...",
-       "import-revision-count": "$1 {{PLURAL:$1|emendatio|emendationes}}",
+       "import-revision-count": "$1 {{PLURAL:$1|redactio|redactiones}}",
        "importbadinterwiki": "Nexus intervicius malus",
        "importsuccess": "Adportatio finita!",
        "import-noarticle": "Nulla pagina importanda!",
        "xml-error-string": "$1 in linea $2 et columna $3 (octetus $4): $5",
        "import-upload": "XML imponere et importare",
        "importlogpage": "Acta adportationum",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|emendatio|emendationes}}",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|emendatio|emendationes}} ex $2",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|redactio importata est|redactiones importatae sunt}}",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|redactio ex $2 importata est|redactiones ex $2 importatae sunt}}",
        "tooltip-pt-userpage": "Pagina usoris tua",
        "tooltip-pt-mytalk": "Pagina disputationis tuae",
        "tooltip-pt-anontalk": "Disputatio de recensionibus ex hoc loco IP factis",
        "tooltip-ca-history": "Superiores huius paginae versiones",
        "tooltip-ca-protect": "Protegere hanc paginam",
        "tooltip-ca-delete": "Delere hanc paginam",
-       "tooltip-ca-undelete": "Restituere emendationes huic paginae conlatas antequam haec pagina deleta esset",
+       "tooltip-ca-undelete": "Restituere recensiones ante paginam deletam factas",
        "tooltip-ca-move": "Movere hanc paginam",
        "tooltip-ca-watch": "Hanc paginam observandam habere",
        "tooltip-ca-unwatch": "Hanc paginam non iam observandam habere",
        "tooltip-t-upload": "Fasciculos imponere",
        "tooltip-t-specialpages": "Index paginarum specialium",
        "tooltip-t-print": "Forma impressibilis huius paginae",
-       "tooltip-t-permalink": "Nexus perpetuus ad hanc emendationem paginae",
+       "tooltip-t-permalink": "Nexus perpetuus ad hanc paginae redactionem",
        "tooltip-ca-nstab-main": "Videre paginam",
        "tooltip-ca-nstab-user": "Videre paginam usoris",
        "tooltip-ca-nstab-special": "Haec est pagina specialis. Pagina ipsa recenseri non potest.",
        "pageinfo-firstuser": "Creator paginae",
        "pageinfo-firsttime": "Dies et tempus creationis paginae",
        "pageinfo-lastuser": "Usor qui ultimam recensionem fecit",
-       "pageinfo-lasttime": "Dies ultimae emendationis",
+       "pageinfo-lasttime": "Quando novissime recensita sit",
        "pageinfo-recent-edits": "Praesens numerus recensionum (intra praeterita $1)",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Categoria celata|Categoriae celatae}} ($1)",
        "pageinfo-toolboxlink": "De hac pagina",
        "markedaspatrolled": "Indicare hanc paginam qua circumita",
        "patrol-log-page": "Acta emendationum circumitarum",
        "log-show-hide-patrol": "$1 acta emendationum circumitarum",
-       "deletedrevision": "Delevit emendationem $1 veterem",
+       "deletedrevision": "Abolita redactio imaginis $1",
        "previousdiff": "← Differentia superior",
        "nextdiff": "Differentia proxima →",
        "imagemaxsize": "Magnitudo maxima fasciculorum:<br />\n''(in pagina descriptionis fasciculi)''",
        "file-info-size": "$1 × $2 elementa imaginalia, magnitudo fasciculi: $3, typus MIME: $4",
        "file-nohires": "Nulla maior resolutio exstat.",
        "svg-long-desc": "fasciculus SVG, nominale $1 × $2 elementa imaginalia, magnitudo fasciculi: $3",
-       "show-big-image": "Resolutio completa",
+       "show-big-image": "Sua resolutio",
        "show-big-image-size": "$1 × $2 elementa imaginalia",
        "file-info-gif-frames": "$1 {{PLURAL:$1|replum|repla}}",
        "newimages": "Fasciculi novi",
        "noimages": "Nullum videndum.",
        "ilsubmit": "Quaerere",
        "bydate": "ex die",
+       "hours": "{{PLURAL:$1|hanc horam|has $1 horas}}",
+       "days": "{{PLURAL:$1|hunc diem|hos $1 dies}}",
+       "hours-ago": "abhinc $1 {{PLURAL:$1|horam|horas}}",
        "metadata": "Metadata",
        "metadata-help": "Hic fasciculus alias res continet, saepius a machina originatore additas, et (si fasciculus postea recensus sit) fortasse corrigendas.",
        "metadata-expand": "Plura ostende",
        "exif-imagedescription": "Descriptio imaginis",
        "exif-model": "Typus photomachinae",
        "exif-artist": "Auctor",
-       "exif-exifversion": "Emendatio Exif",
+       "exif-exifversion": "Redactio modi \"Exif\"",
        "exif-colorspace": "Spatium colorimetricum",
        "exif-pixelydimension": "Amplitudo imaginis",
        "exif-pixelxdimension": "Altitudo imaginis",
        "tags-hitcount": "$1 {{PLURAL:$1|mutatum|mutata}}",
        "compare-page1": "Pagina 1",
        "compare-page2": "Pagina 2",
-       "compare-rev1": "Emendatio 1",
-       "compare-rev2": "Emendatio 2",
+       "compare-rev1": "Redactio una",
+       "compare-rev2": "Redactio altera",
        "htmlform-submit": "Submittere",
        "htmlform-reset": "Mutationes abrogare",
        "htmlform-selectorother-other": "Aliud",
index a992d35..7986c9f 100644 (file)
        "moredotdotdot": "Méi …",
        "morenotlisted": "Dës Lëscht ass net komplett.",
        "mypage": "Säit",
+       "anonuserpage": "Onbekannte Benotzer",
        "mytalk": "Diskussioun",
        "anontalk": "Diskussioun",
        "navigation": "Navigatioun",
        "nocookieslogin": "{{SITENAME}} benotzt Cookië beim Umelle vun de Benotzer.\nDir hutt Cookien ausgeschalt.\nAktivéiert d'Cookien w.e.g. a versicht et nach eng Kéier.",
        "nocookiesfornew": "De Benotzerkont gouf net ugeluecht, well mir seng Quell net bestëmme konnten.\nVergewëssert Iech datt Dir Cookien zouloosst, luet dës Säit nei a probéiert nach emol.",
        "noname": "Dir hutt kee gëltege Benotzernumm uginn.",
-       "loginsuccesstitle": "Umeldung huet geklappt",
+       "loginsuccesstitle": "Ageloggt",
        "loginsuccess": "'''Dir sidd elo als \"$1\" op {{SITENAME}} ugemellt.'''",
        "nosuchuser": "Et gëtt kee Benotzernumm mam Numm \"$1\".\nBeim Benotzernumm gëtt tëscht groussen a klenge Buschtawen ënnerscheet (casesensitive).\nKuckt w.e.g. op d'Schreifweis richteg ass, oder [[Special:UserLogin/signup|maacht en neie Benotzerkont op]].",
        "nosuchusershort": "De Benotzernumm \"$1\" gëtt et net.\nKuckt w.e.g. op d'Schreifweis richteg ass.",
        "botpasswords-label-resetpassword": "D'Passwuert zrécksetzen",
        "botpasswords-label-grants-column": "Accordéiert",
        "botpasswords-bad-appid": "Den Numm vum Bot \"$1\" ass net valabel.",
+       "botpasswords-created-body": "D'Botpasswuert fir de Bot-Numm \"$1\" vum Benotzer ''$2'' gouf ugeluecht.",
        "botpasswords-updated-title": "Botpasswuert aktualiséiert",
-       "botpasswords-updated-body": "D'Botpasswuert \"$1\" gouf aktualiséiert.",
+       "botpasswords-updated-body": "D'Botpasswuert fir de Bot-Numm \"$1\" vum Benotzer ''$2'' gouf aktualiséiert.",
        "botpasswords-deleted-title": "Botpasswuert geläscht",
-       "botpasswords-deleted-body": "D'Botpasswuert \"$1\" gouf geläscht.",
+       "botpasswords-deleted-body": "D'Botpasswuert fir de Bot-Numm \"$1\" vum Benotzer ''$2'' gouf geläscht.",
        "botpasswords-not-exist": "De Benotzer \"$1\" huet kee Botpasswuert mam Numm \"$2\".",
        "resetpass_forbidden": "Passwierder kënnen net geännert ginn.",
        "resetpass-no-info": "Dir musst ageloggt sinn, fir direkt op dës Säit ze kommen.",
        "rev-delundel": "weisen/verstoppen",
        "rev-showdeleted": "Weisen",
        "revisiondelete": "Versioune läschen/restauréieren",
-       "revdelete-nooldid-title": "Ongülteg Zilversioun",
+       "revdelete-nooldid-title": "Ongëlteg Zilversioun",
        "revdelete-nooldid-text": "Dir hutt entweder keng Versioun ugi fir dës Funktioun ze benotzen, oder déi Versioun déi Dir uginn hutt gëtt et net, oder Dir versicht déi aktuell Versioun ze verstoppen.",
        "revdelete-no-file": "De Fichier deen ugi war gëtt et net.",
        "revdelete-show-file-confirm": "Sidd Dir sécher datt Dir déi geläschte Versioun vum Fichier \"<nowiki>$1</nowiki>\" vum $2 ëm $3 gesi wëllt?",
        "revdelete-submit": "Op déi gewielt {{PLURAL:$1|Versioun|Versiounen}} uwenden",
        "revdelete-success": "'''Sichtbarkeet vun de Versioune gouf aktualiséiert.''''",
        "revdelete-failure": "'''Sichtbarkeet vun der Versioun konnt net aktualiséiert ginn:'''\n$1",
-       "logdelete-success": "'''Sichbarkeet vum Logbuch geännert.'''",
+       "logdelete-success": "'''Sichbarkeet vum Logbuch agestallt.'''",
        "logdelete-failure": "'''D'Sichtbarkeet vum Logbuch konnt net agestllt ginn:'''\n$1",
        "revdel-restore": "Sichtbarkeet änneren",
        "pagehist": "Versioune vun dëser Säit",
        "uploadstash-summary": "Op dëser Säit huet en Zougrëff op Fichieren déi eropgeluede sinn (oder am Gaang sinn eropgelueden ze ginn) déi awer nach net op der Wiki publizéiert sinn. Dës Fichier kënnen eenzeg an eleng vun deem Benotzer deen se eropgelueden huet gesi ginn.",
        "uploadstash-clear": "Um Server gespäichert Fichieren déi nach net eropgeluede si läschen",
        "uploadstash-nofiles": "Dir hutt keng gespäichert Fichieren déi Dir nach net eropgelueden hutt.",
-       "uploadstash-badtoken": "D'Ausféiere vun dëser Aktioun huet net funktionéiert, vläicht well d'Informatiounen iwwer Är Rechter ofgelaf sinn. Probéiert et nach emol.",
+       "uploadstash-badtoken": "D'Ausféiere vun dëser Aktioun huet net funktionéiert, vläicht well d'Informatiounen iwwer Är Rechter ofgelaf sinn. Probéiert et w.e.g. nach emol.",
        "uploadstash-errclear": "D'Läsche vun de Fichieren huet net funktionéiert.",
        "uploadstash-refresh": "Lëscht vun de Fichieren aktualiséieren",
        "img-auth-accessdenied": "Zougang refuséiert",
        "alllogstext": "Dëst ass eng kombinéiert Lëscht vu Logbicher op {{SITENAME}}.\nDir kënnt d'Siche limitéieren wann Dir e Log-Typ, e Benotzernumm (case-senisitive) oder déi gefrote Säit (och case-senisitive) agitt.",
        "logempty": "Näischt fonnt.",
        "log-title-wildcard": "Titel fänkt mat dësem Text un",
-       "showhideselectedlogentries": "Déi erausgesichte Entréeën am Logbuch weisen/verstoppen",
+       "showhideselectedlogentries": "Déi erausgesicht Entréeën am Logbuch weisen/verstoppen",
        "checkbox-select": "Eraussichen:$1",
        "checkbox-all": "All",
        "checkbox-none": "Keen",
        "changecontentmodel-title-label": "Titel vun der Säit",
        "changecontentmodel-model-label": "Neie Modell vun enger Säit mat Inhalt",
        "changecontentmodel-reason-label": "Grond:",
+       "changecontentmodel-submit": "Änneren",
        "changecontentmodel-success-title": "De Modell vum Inhalt gouf geännert",
        "changecontentmodel-success-text": "Den Typ vum Inhalt vu(n) [[:$1]] gouf geännert.",
        "logentry-contentmodel-change-revertlink": "zrécksetzen",
index 2b790e5..483b3a7 100644 (file)
        "recentchanges-label-bot": "Sto cangiaménto o l'à fæto in bot",
        "recentchanges-label-unpatrolled": "Sto cangiaménto o no l'é stæto ancón verificòu",
        "recentchanges-label-plusminus": "Variassion da paggina in nummero de byte",
-       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veddi e [[Special:NewPages|neuve paggine]])",
        "rcnotefrom": "Chì sotta gh'è i cangiamenti fæti comensando da '''$2''' (scin a '''$1''').",
        "rclistfrom": "Fanni vedde e modiffiche apportæ partindo da $3 $2",
index 8d489f0..3026652 100644 (file)
        "recentchanges-label-bot": "اێ دەسکاریە رباتێ انجۆم دائه",
        "recentchanges-label-unpatrolled": "این ویرایش هنوز گشت‌زنی نشده است",
        "recentchanges-label-plusminus": "حجم وۀلگۀ به اندازه این مقدار بایت تغییر یافته است",
-       "recentchanges-legend-heading": "'''اختصارۀل:'''",
+       "recentchanges-legend-heading": "<strong>اختصارۀل:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنین به [[Special:NewPages|فهرست صفحات تازه]] نگاه کنید)",
        "recentchanges-submit": "نیشان دائن",
        "rcnotefrom": "در زیر تغییرات از <strong>$3, $4</strong> (تا <strong>$1</strong> {{PLURAL:$5|نشان داده شده‌است|نشان داده شده‌اند}}).",
index 633b887..1582bb3 100644 (file)
        "recentchanges-label-bot": "ای ويرايشت نه يه بوت انجوم دئه",
        "recentchanges-label-unpatrolled": "ای ويرايشت هنی تيه واداشت نبيه",
        "recentchanges-label-plusminus": "انازه بلگه وه شمار ای بایتیا آلشت کرده.",
-       "recentchanges-legend-heading": "'''میراث:'''",
+       "recentchanges-legend-heading": "<strong>میراث:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنو بوینیت [[ویجه:بلگیا تازه|نوم گه بلگیا تازه]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "د هار آلشتیا د $2 هیئن(د بال د $1 نشون دئه بیه)",
index 4b89335..2f1a6df 100644 (file)
        "moredotdotdot": "Daugiau...",
        "morenotlisted": "Šis sąrašas nėra išsamus.",
        "mypage": "Puslapis",
+       "anonuserpage": "Nežinomas naudotojas",
        "mytalk": "Aptarimas",
        "anontalk": "Aptarimas",
        "navigation": "Naršymas",
        "botpasswords-insert-failed": "Nepavyko pridėti boto vardo \"$1\". Gal jis jau pridėtas?",
        "botpasswords-update-failed": "Nepavyko atnaujinti boto vardo \"$1\". Gal jis buvo ištrintas?",
        "botpasswords-created-title": "Boto slaptažodis sukurtas",
-       "botpasswords-created-body": "Boto slaptažodis \"$1\" buvo sukurtas sėkmingai.",
+       "botpasswords-created-body": "Naudotojo $2 boto „$1“ slaptažodis buvo sukurtas.",
        "botpasswords-updated-title": "Boto slaptažodis atnaujintas",
-       "botpasswords-updated-body": "Boto slaptažodis \"$1\" buvo atnaujintas sėkmingai.",
+       "botpasswords-updated-body": "Naudotojo $2 boto „$1“ slaptažodis buvo atnaujintas.",
        "botpasswords-deleted-title": "Boto slaptažodis ištrintas",
-       "botpasswords-deleted-body": "Boto slaptažodis \"$1\" buvo ištrintas.",
+       "botpasswords-deleted-body": "Naudotojo $2 boto „$1“ slaptažodis buvo ištrintas.",
        "botpasswords-newpassword": "Naujas slaptažodis prisijungimui su <strong>$1</strong> yra <strong>$2</strong>. <em>Prašome įsiminti jį naudojimui ateityje.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider nėra prieinamas.",
        "botpasswords-restriction-failed": "Boto slaptažodžio apribojimai draudžia šį prisijungimą.",
        "group-all": "(visi)",
        "group-user-member": "{{GENDER:$1|naudotojas|naudotoja}}",
        "group-autoconfirmed-member": "{{GENDER:$1|automatiškai patvirtintas naudotojas|automatiškai patvirtinta naudotoja}}",
-       "group-bot-member": "Botas",
+       "group-bot-member": "Robotas",
        "group-sysop-member": "Administratorius",
        "group-bureaucrat-member": "Biurokratas",
        "group-suppress-member": "{{GENDER:$1|slopintojas|slopintoja}}",
        "recentchanges-label-bot": "Šį keitimą atliko automatinė programa",
        "recentchanges-label-unpatrolled": "Šis keitimas dar nebuvo patikrintas",
        "recentchanges-label-plusminus": "Šiuo baitų skaičiumi pakeista puslapio apimtis",
-       "recentchanges-legend-heading": "'''Paaiškinimai:'''",
+       "recentchanges-legend-heading": "<strong>Paaiškinimai:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (taip pat žiūrėkite [[Special:NewPages|naujausių straipsnių sąrašą]])",
        "recentchanges-submit": "Rodyti",
        "rcnotefrom": "Žemiau yra {{PLURAL:$5|pakeitimas|pakeitimai}} pradedant <strong>$3, $4</strong> (rodoma iki <strong>$1</strong> pakeitimų).",
        "rcshowhidemine": "$1 mano keitimus",
        "rcshowhidemine-show": "Rodyti",
        "rcshowhidemine-hide": "Slėpti",
-       "rcshowhidecategorization": "$1 puslapio kategorizavimas",
+       "rcshowhidecategorization": "$1 puslapių kategorizavimus",
        "rcshowhidecategorization-show": "Rodyti",
        "rcshowhidecategorization-hide": "Slėpti",
        "rclinks": "Rodyti paskutinius $1 pakeitimų per paskutiniąsias $2 dienų<br />$3",
        "changecontentmodel-title-label": "Puslapio pavadinimas",
        "changecontentmodel-model-label": "Naujas turinio modelis",
        "changecontentmodel-reason-label": "Priežastis:",
+       "changecontentmodel-submit": "Keisti",
        "changecontentmodel-success-title": "Turinio modelis buvo atnaujintas",
        "changecontentmodel-success-text": "Turinys, kurio tipas [[:$1]], buvo atnaujintas.",
        "changecontentmodel-cannot-convert": "Turinys [[:$1]] negali būti konvertuotas į $2 tipą.",
index 5c0bf4b..0adbac6 100644 (file)
        "recentchanges-label-bot": "ئی ئیصلاح تأڤأسۉط یە روٙبات انجام ڤابیە",
        "recentchanges-label-unpatrolled": "ئی ئیصلاح هۉنۉ گأشت نأڤابیدھ",
        "recentchanges-label-plusminus": "أندازھ بألگە ڤا ئی تیعداد بایت تأغییر دادھ بیە",
-       "recentchanges-legend-heading": "'''تأغییرل نۉ :'''",
+       "recentchanges-legend-heading": "<strong>تأغییرل نۉ :</strong>",
        "recentchanges-legend-newpage": "{{عۉضڤل أنجوٙمأن:تأغییرل أخیر-بأرچأسب-بألگە نۉ}} (هأنی سل کۉ [[Special:NewPages|لیست بألگل نۉ]])",
        "rclistfrom": "نیشۉ دائن تأغییرل نۉ ڤا شۉرۉ زھ $3 $2",
        "rcshowhideminor": "ئیصلاحل کچک $1",
index 7437611..2c27943 100644 (file)
        "moredotdotdot": "Vairāk...",
        "morenotlisted": "Šis saraksts nav pilnīgs.",
        "mypage": "Lapa",
+       "anonuserpage": "Nezināms lietotājs",
        "mytalk": "Diskusijas",
        "anontalk": "Diskusijas",
        "navigation": "Navigācija",
        "sessionfailure-title": "sesijas kļūda",
        "sessionfailure": "Ir radusies problēma ar sesijas autentifikāciju;\nšī darbība ir atcelta, lai novērstu lietotājvārda iespējami ļaunprātīgu izmantošanu.\nLūdzu, spied \"''back''\" un atjaunini iepriekšējo lapu. Tad mēģini vēlreiz.",
        "changecontentmodel-reason-label": "Iemesls:",
+       "changecontentmodel-submit": "Mainīt",
        "protectlogpage": "Aizsargāšanas reģistrs",
        "protectedarticle": "aizsargāja \"[[$1]]\"",
        "modifiedarticleprotection": "izmainīja aizsardzības līmeni \"[[$1]]\"",
index 08b5740..5ca407e 100644 (file)
@@ -19,7 +19,8 @@
                        "Davidzdh",
                        "Nemo bis",
                        "飞舞回堂前",
-                       "Macofe"
+                       "Macofe",
+                       "Bowleerin"
                ]
        },
        "tog-underline": "鏈墊線:",
        "october-date": "十月$1日",
        "november-date": "十一月$1日",
        "december-date": "十二月$1日",
+       "period-am": "晨",
+       "period-pm": "午後",
        "pagecategories": "$1類",
        "category_header": "「$1」中之頁",
        "subcategories": "次類",
        "moredotdotdot": "見逾",
        "morenotlisted": "列未成。",
        "mypage": "寒舍",
+       "anonuserpage": "無名氏",
        "mytalk": "書房",
-       "anontalk": "è\88\87ï¼\88IPï¼\89ç§\81è­°",
+       "anontalk": "議",
        "navigation": "導",
        "and": "與",
        "qbfind": "尋",
        "disclaimers": "免責宣",
        "disclaimerpage": "Project:免責宣",
        "edithelp": "助纂塾",
+       "helppage-top-gethelp": "助",
        "mainpage": "卷首",
        "mainpage-description": "卷首",
        "policy-url": "Project:策",
        "gotaccount": "已有簿矣?惠往$1。",
        "gotaccountlink": "登簿",
        "userlogin-resetlink": "汝忘登簿所需?",
-       "userlogin-resetpassword-link": "輸子符節",
+       "userlogin-resetpassword-link": "亡子符節?",
        "userlogin-helplink2": "助以登簿",
+       "userlogin-createanother": "增另一簿",
        "createacct-emailrequired": "電郵",
        "createacct-emailoptional": "電郵(可選)",
+       "createacct-email-ph": "書君郵址",
        "createaccountmail": "同郵",
        "createacct-realname": "實名(可選)",
        "createaccountreason": "因:",
        "createacct-reason": "因:",
        "createacct-reason-ph": "汝另立一簿者何哉?",
        "createacct-submit": "增簿",
-       "createacct-another-submit": "復ç«\8bä¸\80簿",
+       "createacct-another-submit": "å¢\9e簿",
        "createacct-benefit-heading": "吾等立{{SITENAME}}者,或黔首,或專戶。",
        "createacct-benefit-body1": "纂",
        "createacct-benefit-body2": "頁",
        "noname": "缺簿名,或不格也。",
        "loginsuccesstitle": "登簿成矣",
        "loginsuccess": "'''$1'''登{{SITENAME}}矣",
-       "nosuchuser": "查無此人。惠請更名,查大小寫或立此簿。",
+       "nosuchuser": "查無此人。惠請更名,查大小寫或[[Special:UserLogin/signup|立此簿]]。",
        "nosuchusershort": "查無\"$1\",惠核之。",
        "nouserspecified": "簿名必須",
        "login-userblocked": "此簿見錮矣。是之登未見許可。",
        "resetpass_submit": "設符再登",
        "changepassword-success": "汝之符節已改!",
        "changepassword-throttled": "爾嘗登簿甚矣。\n請候 $1 再試之。",
+       "botpasswords": "僕之符節",
+       "botpasswords-label-appid": "僕名:",
+       "botpasswords-label-create": "立",
+       "botpasswords-label-update": "更",
+       "botpasswords-label-cancel": "棄",
+       "botpasswords-label-delete": "刪",
+       "botpasswords-label-resetpassword": "重設符節",
+       "botpasswords-deleted-title": "僕之符節已刪",
+       "botpasswords-deleted-body": "\"$2\"所執之僕\"$1\"之符節已刪也。",
        "resetpass_forbidden": "符節之更也不可。",
        "resetpass-no-info": "欲入此頁,爾須登簿。",
        "resetpass-submit-loggedin": "改符節",
        "resetpass-submit-cancel": "消",
        "resetpass-wrong-oldpass": "無效之臨符或現符。\n爾或改符,或求新臨符。",
+       "resetpass-recycled": "請君更至與原符節相異之符節。",
        "resetpass-temp-password": "臨時符節:",
        "resetpass-abort-generic": "符節不可更",
        "passwordreset": "重設符節",
        "passwordreset-username": "簿名:",
        "passwordreset-domain": "域:",
        "passwordreset-email": "電郵址",
-       "changeemail": "更郵址",
+       "changeemail": "更或刪郵址",
        "changeemail-oldemail": "當前郵驛:",
        "changeemail-newemail": "添新郵驛:",
        "changeemail-none": "(無)",
        "changeemail-password": "汝 {{SITENAME}} 之符節",
+       "changeemail-submit": "更郵址",
        "changeemail-throttled": "汝嘗登簿甚矣。\n請候 $1 而試之。",
        "bold_sample": "粗體",
        "bold_tip": "粗體",
        "edit-gone-missing": "無更頁。\n刪之也。",
        "edit-conflict": "纂突。",
        "edit-no-change": "爾之纂已略,由字無改也。",
+       "postedit-confirmation-created": "其頁已建。",
        "postedit-confirmation-saved": "汝之纂已成",
        "edit-already-exists": "不建新頁。\n已存也。",
        "defaultmessagetext": "慣話文",
        "revdelete-confirm": "爾確作之,解之果焉,合之[[{{MediaWiki:Policy-url}}|策]]矣。",
        "revdelete-suppress-text": "'''限'''於此壓:\n* 無適之個訊\n*: ''地、號、保等之。''",
        "revdelete-legend": "見,規之以",
-       "revdelete-hide-text": "審文",
+       "revdelete-hide-text": "審文",
        "revdelete-hide-image": "藏檔容",
-       "revdelete-hide-comment": "摘",
+       "revdelete-hide-comment": "摘",
        "revdelete-hide-user": "簿、IP址以藏",
        "revdelete-hide-restricted": "廢有秩與簿之事",
        "revdelete-radio-same": "(無改)",
        "compareselectedversions": "辨二擇",
        "showhideselectedversions": "示/藏之擇",
        "editundo": "悔",
+       "diff-empty": "(無異)",
        "diff-multi-manyusers": "($2多作未示之審有$1)",
        "searchresults": "得尋",
        "searchresults-title": "\"$1\"得尋",
        "notextmatches": "無文合",
        "prevn": "前{{PLURAL:$1|$1}}",
        "nextn": "次{{PLURAL:$1|$1}}",
+       "prev-page": "前頁",
+       "next-page": "次頁",
        "prevn-title": "前$1之尋",
        "nextn-title": "後$1之尋",
        "shown-title": "每頁示 $1",
        "prefs-personal": "概簿",
        "prefs-rc": "近易",
        "prefs-watchlist": "哨站",
+       "prefs-editwatchlist": "治哨站",
+       "prefs-editwatchlist-clear": "清哨站",
        "prefs-watchlist-days": "哨報有日",
        "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}",
        "prefs-watchlist-edits": "哨站有易",
        "prefs-misc": "雜",
        "prefs-resetpass": "更符節",
        "prefs-changeemail": "更郵址",
+       "prefs-setemail": "設電郵址",
        "prefs-email": "傳書",
        "prefs-rendering": "觀",
        "saveprefs": "儲",
        "columns": "列數:",
        "searchresultshead": "尋",
        "stub-threshold": "<a href=\"#\" class=\"stub\">短頁連</a>格式門檻(位元組):",
+       "stub-threshold-sample-link": "例",
        "stub-threshold-disabled": "禁",
        "recentchangesdays": "近易示日:",
        "recentchangesdays-max": "最大有$1",
        "right-siteadmin": "鎖與解鎖資料庫",
        "right-override-export-depth": "出有五層深之頁",
        "right-sendemail": "擬書傳予他簿",
+       "grant-group-email": "遞電郵",
+       "grant-createaccount": "立簿",
+       "grant-editmywatchlist": "纂哨站",
+       "grant-viewmywatchlist": "閱哨站",
        "newuserlogpage": "誌簿",
        "newuserlogpagetext": "此為誌簿之記也",
        "rightslog": "職權志",
        "action-userrights": "纂全權",
        "action-userrights-interwiki": "纂他wiki上之權",
        "action-siteadmin": "鎖及解鎖其庫",
+       "action-editmywatchlist": "纂爾哨站",
+       "action-viewmywatchlist": "閱爾哨站",
        "nchanges": "$1易",
        "enhancedrc-since-last-visit": "$1未示",
        "enhancedrc-history": "誌",
        "recentchanges-label-bot": "此乃機纂",
        "recentchanges-label-unpatrolled": "是纂未巡",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}([[Special:NewPages|新灶]])",
+       "recentchanges-submit": "示",
        "rcnotefrom": "下為自'''$2'''至'''$1'''之易也。",
        "rclistfrom": "自$3 $2起之易也",
        "rcshowhideminor": "$1校",
        "upload-proto-error": "協訂錯誤",
        "upload-too-many-redirects": "網址含多轉",
        "upload-http-error": "發一HTTP之錯:$1",
+       "upload-dialog-button-cancel": "捨",
+       "upload-dialog-button-done": "成",
+       "upload-dialog-button-save": "存",
+       "upload-dialog-button-upload": "貢",
+       "upload-form-label-infoform-title": "細事",
+       "upload-form-label-infoform-name": "名",
+       "upload-form-label-infoform-description": "述",
        "backend-fail-notexists": "無檔 $1 。",
        "backend-fail-alreadyexists": "$1 已含。",
        "backend-fail-read": "\"$1\"不可見。",
index f7da241..965be18 100644 (file)
                        "Macofe"
                ]
        },
-       "tog-underline": "लिंककेँ रेखांकित करू:",
-       "tog-hideminor": "सन्निकट परिवर्त्तनमे छोट परिवर्त्तन नुकाऊ",
-       "tog-hidepatrolled": "सन्निकट परिवर्त्तनमे छोट परिवर्त्तन नुकाऊ",
-       "tog-newpageshidepatrolled": "नियंत्रित सम्पादनकेँ नव पन्ना सूचीसँ नुकाऊ",
-       "tog-extendwatchlist": "सन्निकट परिवर्तन नै,अखन ध्यानसूचीमे रहल सभ परिवर्तन देखाऊ",
-       "tog-usenewrc": "नीक सन्निकट परिवर्तन प्रयोग करू (जावास्क्रिप्ट चाही)",
-       "tog-numberheadings": "शीर्षक स्वयं-क्रमांकित करू",
-       "tog-showtoolbar": "संपादन ओजारपेटी देखाऊ (जावास्क्रीप्ट)",
-       "tog-editondblclick": "दू बेर क्लीक कए पन्ना संपादित करू (जावास्क्रीप्ट)",
-       "tog-editsectiononrightclick": "ऐ खण्डक सम्पादन खण्डक शीर्षकेँ दहिन क्लिक कऽ सम्भव (जावास्क्रिप्ट चाही)",
-       "tog-watchcreations": "हमर बनाओल पृष्ठ हमर साकांक्ष सूचीमे राखू",
-       "tog-watchdefault": "हमर संपादित पृष्ठ हमर साकांक्ष सूचीमे देखाऊ",
-       "tog-watchmoves": "हमरा द्वारा हटाओल पृष्ठ हमर साकांक्ष सूचीमे राखू",
-       "tog-watchdeletion": "हमरा द्वारा हटाओल पृष्ठ हमर साकांक्ष सूचीमे राखू",
+       "tog-underline": "लिङ्कके रेखाङ्कित करी:",
+       "tog-hideminor": "सन्निकट परिवर्तनमे छोट परिवर्तन नुकाबी",
+       "tog-hidepatrolled": "सन्निकट परिवर्तनमे नियन्त्रित कएल सम्पादन नुकाबी",
+       "tog-newpageshidepatrolled": "नियन्त्रित सम्पादनके नव पन्ना सूचीसँ नुकाबी",
+       "tog-hidecategorization": "पृष्ठसभक श्रेणीकरण हटाबी",
+       "tog-extendwatchlist": "सन्निकट परिवर्तन नै,अखन ध्यानसूचीमे रहल सभ परिवर्तन देखाबी",
+       "tog-usenewrc": "नीक सन्निकट परिवर्तन प्रयोग करी (जावास्क्रिप्ट चाही)",
+       "tog-numberheadings": "शीर्षक स्वयं-क्रमांकित करी",
+       "tog-showtoolbar": "सम्पादन ओजारपेटी देखाबी",
+       "tog-editondblclick": "दू बेर क्लीक कए पन्ना सम्पादित करी",
+       "tog-editsectiononrightclick": "अनुभाग शीर्षक पर दाहिन क्लिक करै पर अनुभाग सम्पादित करी",
+       "tog-watchcreations": "हमर बनाओल पृष्ठ हमर साकांक्ष सूचीमे राखी",
+       "tog-watchdefault": "हमर सम्पादित पृष्ठ हमर साकांक्ष सूचीमे देखाबी",
+       "tog-watchmoves": "हमराद्वारा घस्काओल पृष्ठ हमर साकांक्ष सूचीमे राखी",
+       "tog-watchdeletion": "हमराद्वारा मेटाओल पृष्ठ हमर साकांक्ष सूचीमे राखी",
        "tog-watchrollback": "हमरा द्वारा जोडलगेल पृष्ठ हमार सांकक्ष सूचीमे राखू",
        "tog-minordefault": "हमर सभ सम्पादन पूर्वन्यस्त रूपेँ मामूली कहू",
-       "tog-previewontop": "सà¤\82पादन à¤ªà¥\87à¤\9fà¥\80à¤\95 à¤\8aपर à¤¦à¥\83शà¥\8dय à¤¦à¥\87à¤\96ाà¤\8a",
-       "tog-previewonfirst": "पहिल à¤¸à¤\82पादनà¤\95 à¤¬à¤¾à¤¦ à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न à¤¦à¥\87à¤\96ाà¤\89",
+       "tog-previewontop": "समà¥\8dपादन à¤ªà¥\87à¤\9fà¥\80à¤\95 à¤\8aपर à¤¦à¥\83शà¥\8dय à¤¦à¥\87à¤\96ाबà¥\80",
+       "tog-previewonfirst": "पहिल à¤¸à¤®à¥\8dपादनà¤\95 à¤¬à¤¾à¤¦ à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न à¤¦à¥\87à¤\96ाबà¥\80",
        "tog-enotifwatchlistpages": "जौं हमर ध्यानसूचीक कोनो पन्नामे परिवर्तन हुअए तँ हमरा ई-पत्र पठाउ",
        "tog-enotifusertalkpages": "हमर सदस्य वार्ता पृष्ठ पर भेल परिवर्त्तनक हेतु हमरा ई-मेल करथि",
        "tog-enotifminoredits": "छोट परिवर्त्तनक हेतु सेहो हमरा ई-मेल पठाऊ",
        "virus-unknownscanner": "अज्ञात विषविधि निरोधक",
        "logouttext": "'''अहाँ निष्क्रमण कऽ गेल छी।'''\n\nअहाँ {{अन्तर्जाल}} प्रयोग अनाम भऽ कऽ सकै छी, वा अहाँ <span class='plainlinks'>[$1 log in again]</span> वएह आकि कोनो आन प्रयोक्ताक रूपमे सेहू प्रयोक कऽ सकै छी।\nई मोन राखू जे किछु पन्ना एना देखा पड़ि सकैए जेना अहाँ अखनो सम्प्रवेशित होइ, जावत अहाँ अपन गवेषकक उपस्मृति मेटा नै दै छी।",
        "welcomeuser": "अहाके स्वागत अछि, $1!",
-       "welcomecreation-msg": "à¤\85हाà¤\95à¥\87 à¤\96ाता à¤¬à¤¨à¤¾à¤µà¥\8bल à¤\97à¥\87ल à¤\85à¤\9bि à¥¤\nà¤\85पन [[Special:Preferences|{{SITENAME}} à¤ªà¥\8dराथमिà¤\95तासभ]] à¤¬à¤¦à¤²à¥\88ल नै बिसरब।",
+       "welcomecreation-msg": "à¤\85हाà¤\81à¤\95 à¤\96ाता à¤¬à¤¨à¤¾à¤\8fल à¤\97à¥\87ल à¤\85à¤\9bि।\nà¤\85पन [[Special:Preferences|{{SITENAME}} à¤ªà¤¸à¤¨à¥\8dद]] à¤¬à¤¦à¤²à¥\88 à¤²à¥\87ल नै बिसरब।",
        "yourname": "प्रयोक्ता:",
        "userlogin-yourname": "प्रयोक्ता:",
        "userlogin-yourname-ph": "अपन प्रयोक्तानाम लिखु",
        "recentchanges-label-bot": "ई सम्पादन यांत्रिक छल।",
        "recentchanges-label-unpatrolled": "ऐ सम्पादनक पुनरीक्षण अखन धरि नै कएल गेल अछि।",
        "recentchanges-label-plusminus": "पन्नाके आकार इ बाइट संख्यासे बदलल गेल",
-       "recentchanges-legend-heading": "'''कुंजी:'''",
+       "recentchanges-legend-heading": "<strong>कुंजी:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नयाँ पन्नसभके सूची]] सहो देखु)",
        "rcnotefrom": "नीचाँमे '''$2''' सँ भेल परिवर्तन अछि ('''$1''' धरि देखाएल)।",
        "rclistfrom": "$3 $2 सँ शुरू भेल नव परिवर्तन देखू",
index affe36a..73f03b0 100644 (file)
        "moredotdotdot": "Tohiny...",
        "morenotlisted": "Tsy feno ity lisitra ity.",
        "mypage": "Pejy",
+       "anonuserpage": "Mpikambana tsy fantatra",
        "mytalk": "Dinika",
        "anontalk": "Pejin-dresaka",
        "navigation": "Fikarohana",
        "laggedslavemode": "Fampitandremana: Mety ho tsy nisy fanovana vao haingana angamba io pejy io",
        "readonly": "Mihidy ny banky angona",
        "enterlockreason": "Manomeza antony hanidiana ny pejy, ahitana ny fotoana tokony hamahana izay fihidiana izay",
-       "readonlytext": "\nMihidy vonjimaika aloha ny banky angona ka tsy afaka anaovana fanovana na fanampiana vaovao. Azo inoana fa asa fikolokoloana mahazatra ihany io ka rehefa vita izay asa izay dia hverina amin'ny laoniny izy.\n\nNy mpitantana nanidy azy dia nametraka ito fanazavana ito: $1",
+       "readonlytext": "Mihidy ny banky angona ka tsy afaka anaovana fanovana na fanampiana vaovao. Azo inoana fa asa fikolokoloana mahazatra ihany io ka rehefa vita izay asa izay dia hverina amin'ny laoniny izy.\n\nNy mpitantana nanidy azy dia nametraka ito fanazavana ito: $1",
        "missing-article": "Tsy hitan'ny banky angona ilay lahatsoratra pejy iray tokony ho hitany, mitondra ny lohateny  « $1 » $2.\n\nMatetika, izany no mitranga rehefa manaraka rohy makany amina diff efa lany andro na efa makany amin'ny pejy tantaran'ny pejy voafafa iray.\n\nRaha tsy izany, mety misy olana ao amin'ny rindrankajin'ny lohamilina.\nLazao any amin'ny  [[Special:ListUsers/sysop|mpandrindra]] io olana io ary aza adino no manome azy ny URL an'ilay rohy.",
        "missingarticle-rev": "(famerenana faha : $1)",
        "missingarticle-diff": "(diff : $1 ; $2)",
        "viewsource": "Hijery fango",
        "viewsource-title": "Hijery ny fangon'i $1",
        "actionthrottled": "Tao voafetra",
-       "actionthrottledtext": "Mba hiady amin'ny spam, ny hatetika momba ny fanaovana io otao io dia ferana ho foifoy, ary niaotra io fetra io ianao.\nAndramo indray afaka minitra vitsivitsy.",
+       "actionthrottledtext": "Mba hiady amin'ny fanararaotana dia voafetra ara-katetika ny fanaovana ity zavatra ity, ary nihoatra izany fetra izany ianao.\n\nAndramo indray afaka minitra vitsivitsy.",
        "protectedpagetext": "Narovana mba tsy hisiana fanovana na tao hafa ity pejy ity.",
        "viewsourcetext": "Azonao atao no mijery sy mandrika ny votoatin'ity pejy ity.",
        "viewyourtext": "Azonao atao ny mijery ary mandika ny fangon'ny <strong>fanovanao</strong> tamin'ity pejy ity.",
        "mypreferencesprotected": "Tsy manana alalana ahafahana manova ny safidinao ianao.",
        "ns-specialprotected": "Tsy afaka ovaina ny pejy anatin'ny toeran'anarana « {{ns:special}} » .",
        "titleprotected": "Voaaron'i [[User:$1|$1]] ity lohateny ity mba tsy hamorona pejy mitondra ity anarana ity.\nNy antony napetraka dia : <em>$2</em>.",
-       "filereadonlyerror": "Tsy afaka manova ny rakitra \"$1\" satria famakiana ihany no tao azo atao amin'i \"$2\".\n\nNy antony nomen'ny mpandrindra nanidy azy: \"$3\".",
+       "filereadonlyerror": "Tsy afaka manova ny rakitra \"$1\" satria famakiana ihany no azo atao amin'i \"$2\".\n\nNy antony nomen'ny mpandrindra nanidy azy: \"$3\".",
        "invalidtitle-knownnamespace": "Lohateny tsy miady amin'ny fepetra miaraka amin'ny anaram-balam-pejy \"$2\" ary soratra \"$3\"",
        "invalidtitle-unknownnamespace": "Lohateny tsy ekena miaraka amin'ny laharana anaran-tsehatra $1 ary soratra \"$2\"",
        "exception-nologin": "Tsy tafiditra",
        "createaccount-title": "Fanokafana kaonty ho an'ny/i {{SITENAME}}",
        "createaccount-text": "Nisy olona nanokatra kaonty ho an'ny adiresy imailakao eo amin'ny {{SITENAME}} ($4) mitondra anarana « $2 » miaraka amin'ny tenimiafina « $3 ».<br />\nTokony miditra na manokatra kaonty ianao, ary ovay ny tenimiafinao dien-izao.\n\nAza mijery ity hafatra ity ianao raha voaforona an-tsifetezana ilay kaonty io.",
        "login-throttled": "Betsaka loatra ny andram-pidirana nataonao.\n\nAndraso $1 alohan'ny mamerina.",
-       "login-abort-generic": "Tsy nahomby ny fanandramanao niditra",
+       "login-abort-generic": "Tsy nahomby ny fanandramanao niditra - najanona",
        "login-migrated-generic": "Efa nafindra ny kaontinao, ary efa tsy misy eto amin'ity wiki ity intsony ny anaram-pikamnbanao",
        "loginlanguagelabel": "fiteny : $1",
        "suspicious-userlogout": "Ny fangataham-pialanao dia tsy nekena satria ohatry ny nalfan'ny mpizahan-tsehatra simba izy na kasy ny proxy.",
        "botpasswords": "Tenimiafin-drôbô",
        "botpasswords-disabled": "Tsy ampiasaina ny tenimiafin-drôbô.",
        "botpasswords-existing": "Tenimiafin-drôbô efa misy",
+       "botpasswords-createnew": "Hamorona tenimiafina rôbô vaovao",
+       "botpasswords-editexisting": "Hanova tenimiafina rôbô efa misy",
        "botpasswords-label-appid": "Anarana rôbô:",
        "botpasswords-label-create": "Foronina",
        "botpasswords-label-update": "Vaozina",
        "botpasswords-label-delete": "Fafàna",
        "botpasswords-label-resetpassword": "Hamerina ny tenimiafina",
        "botpasswords-label-grants": "Zo mihatra:",
+       "botpasswords-label-restrictions": "Fetran'ny fampiasana:",
        "botpasswords-label-grants-column": "Nomena",
        "botpasswords-bad-appid": "Tsy azo raisina ny anarana rôbô \"$1\".",
        "botpasswords-insert-failed": "Tsy afaka nanampy ny anarana rôbô \"$1\". Tsy efa nampiana ve ilay izy?",
+       "botpasswords-update-failed": "Tsy afaka nanavao ny anarana rôbô \"$1\". Nofafàna ve ilay izy?",
+       "botpasswords-created-title": "Noforonina ilay tenimiafina rôbô",
+       "botpasswords-created-body": "Noforonina ny tenimiafina rôbô \"$1\".",
+       "botpasswords-updated-title": "Nohavaozina ny tenimiafina rôbô",
+       "botpasswords-updated-body": "Nohavaozina ny tenimiafina rôbô \"$1\".",
+       "botpasswords-deleted-title": "Nofafàna ny tenimiafina rôbô",
+       "botpasswords-deleted-body": "Nofafàna ny tenimiafina rôbô \"$1\".",
+       "botpasswords-newpassword": "Ny tenimiafina idirana amin'i <strong>$1</strong> dia <strong>$2</strong>. <em>Raiketo ilay izy ho an'ny fampiasàna any aoriana any.</em>",
+       "botpasswords-no-provider": "Tsy afaka antsoina ny BotPasswordsSessionProvider.",
+       "botpasswords-restriction-failed": "Manakana ity fidirana ity ny fepetra mifehy ny tenimiafina rôbô.",
        "resetpass_forbidden": "Tsy afaka ovaina ny tenimiafina",
        "resetpass-no-info": "Tsy maintsy tafiditra ao amin'ny kaontinao ianao vao afaka mijery ity pejy ity.",
        "resetpass-submit-loggedin": "Ovay ny tenimiafina",
        "resetpass-submit-cancel": "Aoka ihany",
-       "resetpass-wrong-oldpass": "Tsy izy ny tenimiafinao (tsotra na miserana)\nMety efa nanova tenimiafina na nanontany tenimiafina miserana angamba ianao.",
+       "resetpass-wrong-oldpass": "Tsy izy ny tenimiafinao (ankehitriny na vonjimaika)\nMety efa nanova tenimiafina na nangataka hahazo tenimiafina vonjimaika angamba ianao.",
        "resetpass-recycled": "Avereno amy zavatra hafa nohon'ny tenimiafinao ankehitriny ny tenimiafinao.",
        "resetpass-temp-emailed": "Niditra tamin'ny alalan'ny tenimiafina vonjimaika nalefa mailaka ianao.\nMba hamaranana ny fidirana, dia tsy maintsy mampiditra tenimiafina vaovao eto ianao :",
        "resetpass-temp-password": "Tenimiafina miserana :",
        "missingcommentheader": "'''Fampahatsiahivana :''' Tsy nampiditra lohateny amin'ity resaka ity ianao.\nRaha tsindrianao indray eo amin'ny « {{MediaWiki:Savearticle}} » ho voatahiry tsy misy lohateny ny fanovananao.",
        "summary-preview": "Topi-maso n'ilay ambangovangony :",
        "subject-preview": "Topi maso ny lazaina :",
+       "previewerrortext": "Nisy hadisoana nitranga tamin'ny fanandramana namoaka topi-mason'ny fanovanao",
        "blockedtitle": "Mpikambana voasakana",
        "blockedtext": "'''Voasakana ny solonanaranao na ny adiresy IP anao.'''\n\nNataon'i $1 ny fisakanana.\nNy antony : ''$2''.\n\n* Fanombohan'ilay fisakanana : $8\n* Farany : $6\n* Kaonty voasakana : $7.\n\nAfaka antsoinao i $1 na [[{{MediaWiki:Grouppage-sysop}}|ny mpandrindra]] mba hiresaka mombamomba n'izany.\nAfaka andefasanao imailaka ra nampiditra ny adiresy imailakanao ianao ao anatin'ny [[Special:Preferences|mombamombanao]].\n'''$3''' ny adiresy IP-nao ary ny ''identifiant de blocage''-nao dia #$5.\nAsio ao anaty ny fangatahanao io adiresy io.",
        "autoblockedtext": "Voasakana ny adiresy IP anareo satria nampiasain'ny olon-kafa io adiresy ampiasainao io. Ary voasakan'i $1 ilay olona nampiasa ny adiresinao.<br />\nIty ny antony navoakany\n\n:''$2''\n\n* nanomboka tamin'ny $8 ilay fisakanana\n* Amin'ny $6 ilay fisakanana no mijanona\n* $7 no anaran'ilay kaonty voasakana\n\nAfaka antsoinao i $1 na miantso ny [[{{MediaWiki:Grouppage-sysop}}|mpandrindra]] mba hiresaka momba ny fanakananao.\n\nJereo koa fa tsy afaka mampiasa ny asa ''emailuser'' ianao ra tsy nanometraka ny adiresy imailakao anatin'ny [[Special:Preferences|safidinao]]. Jereo koa ra tsy nesorinao ny asa ''emailuser''.\n\n$3 izao ny adiresinao, ary ny isa ny fisakananai dia $5.\nSoraty ireo fanoroana ireo anatin'ny fangatahana ataonao.",
        "previewnote": "'''Fantaro fa topi-maso fotsiny ity.'''\nMbola tsy voatahiry ny fanovanao !",
        "continue-editing": "Hanohy ny fanovàna",
        "previewconflict": "\nIty topi-maso ity no mifanaraka amin'ny lahatsoratra ao amin'ny faritra eo ambony,\nary toy izao no ho fisehon'ny pejy raha misafidy ny hitahiry azy ianao.",
-       "session_fail_preview": "'''Tsy afaka tahirizina ny fanovanao noho ny haverezan'ny fampahalalàna mikasikan'ny fidiranao. Andramo fanindroany azafady.\nRaha mbola tsy mandeha foana dia [[Special:UserLogout|mivoaha]] amin'ny kaontinao ary miverena miditra.'''",
+       "session_fail_preview": "Miala tsiny indrindra fa tsy afaka nandraikitra ny fiovanao izahay noho ny fahaverezana fampahalalana mikasika ny fidiranao teto.\n\nMety nivoaka ianao. <strong>Jereo raha mbola tafiditra ianao, ary avereno indray</strong>\nRaha tsy mbola mandeha izany, dia [[special:Userlogout|mivoaha]] amin'ny kaontinao ary midira indray, ary jereo raha manaiky cookies avy amin'ity tranonkala ity ny mpitety tranonkalanao.",
        "session_fail_preview_html": "'''Tsy afaka tehirizinay ny fanovanao noho ny haverezan'ny fampahalalàna momba ny session-nao.\n\n'''Satria nalefan'i {{SITENAME}} HTML tsotra, nasitrika ny topi-paso mba tsy hisy fanafihana atao amin'ny Javascript.\n\n'''Raha ara-dalàna ny fanovanao, avereno.'''\nRaha mbola tsy mandeha foana ilay izy, [[Special:UserLogout|mivoaha]] ary midira",
        "token_suffix_mismatch": "'''Tsy nekena ny fanovanao satria tsy voakaodin'ny rindrankajinao tsara ny soratra tao anatin'ny identifiant de modification.'''\nNilaina io tsy fanekena io mba tsy hikatso ilay pejy.\nMisy io olana io rehefa mamppiasa serveur mandataire tsy manana anarana sy manan-olana eo amin'ny tranonkala ianao.",
        "edit_form_incomplete": "'''Misy tsy tonga tany amin'ny lohamilina ny singan'ity pejy fenoina ity. Azonao ampiana ny mpandika hafa amin'ny famoronana ny fanazavana ity pejy ity.",
        "mergehistory-empty": "tsy misy version azo hatambarana",
        "mergehistory-done": "{{PLURAL:$3|}}Versiona $3 an'i $1 no natsonika tamin'ny [[:$2]]",
        "mergehistory-fail": "Tsy afaka manatambatra ny tantara(n'asa). Avereno checheo ny pejy sy ny daty.",
+       "mergehistory-fail-bad-timestamp": "Tsy ekena ny daty sy ora.",
+       "mergehistory-fail-invalid-source": "Tsy ekena ny pejy loharano.",
+       "mergehistory-fail-invalid-dest": "Tsy ekena ny pejy tanjona.",
+       "mergehistory-fail-permission": "Zo tsy ampy amin'ny fampiraisana tantaram-pejy.",
+       "mergehistory-fail-self-merge": "Mitovy ny pejy loharano sy tanjona.",
        "mergehistory-no-source": "Tsy misy ny pejy avy amin'ny $1.",
        "mergehistory-no-destination": "Tsy misy ilay pejy tanjona $1.",
        "mergehistory-invalid-source": "Tokony manana lohateny azo ampiasaina ny pejy fiavina",
        "columns": "Tsanganana/Tioba :",
        "searchresultshead": "Fikarohana",
        "stub-threshold": "Fetra ambony ho an'i <a href=\"#\" class=\"stub\">rohim-bangovango</a> (oktety):",
+       "stub-threshold-sample-link": "santiôna",
        "stub-threshold-disabled": "Tsy alefa",
        "recentchangesdays": "Isan'ny andro ho aseho amin'ny fiovana farany:",
        "recentchangesdays-max": "($1 andro{{PLURAL:$1||}} fara-faha betsany)",
        "prefs-help-recentchangescount": "Misy ny fiovana farany, ny tantaram-pejy ary ny laogy",
        "prefs-help-watchlist-token2": "Ity ny lakilen'ny topaka Web ny lisitra arahanao. Afaka mamangy ny lisitra arahanao izay mahalala io lakileo io, ka aza zarazaraina ilay izy. Raha ilainao izany dia afaka [[Special:ResetTokens|manavao izy io ianao]]",
        "savedprefs": "Voatahiry ny mombamomba anao.",
+       "savedrights": "Voatahiry soa aman-tsara ny zom-pikambana ho an'i {{GENDER:$1|$1}}.",
        "timezonelegend": "Faritr'ora :",
        "localtime": "Ora an-toerana",
        "timezoneuseserverdefault": "Sanda tsipalotry ny wiki ($1)",
        "userrights": "Fandrindràna ny fahefahan'ny mpikambana",
        "userrights-lookup-user": "Handrindra vondrom-pikambana",
        "userrights-user-editname": "Manomeza solonanarana:",
-       "editusergroup": "Hanova satan'ny mpikambana",
-       "editinguser": "Fanovana ny zon'ny mpikambana '''[[User:$1|$1]]''' $2",
+       "editusergroup": "Hanova satan'ny {{GENDER:$1|}}mpikambana",
+       "editinguser": "Fanovana ny zon'ny mpikambana <strong>{{GENDER:$1|}}[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Hanova vondrom-pikambana",
-       "saveusergroups": "Tehirizo ny vondrom-pikambana",
+       "saveusergroups": "{{GENDER:$1|}}Tehirizo ny vondrom-pikambana",
        "userrights-groupsmember": "Mpikambana amin'ny vondrona:",
        "userrights-groupsmember-auto": "Mpikambana tsy dia voalazan'i :",
        "userrights-groups-help": "Azonao atao ny manova ny vondrona isian'ity mpikambana ity.\n* Ny boaty voa-\"check\" dia midika fa ao amin'io vondrona io ilay mpikambana.\n* Ny boaty tsy voa-\"check\" dia midika fa tsy ao amin'io vondrona io ilay mpikambana.\n* Ny * dia fa tsy azonao esorina amin'ilay vondrona nampianao/nesorinao ilay mpikambana.",
        "userrights-changeable-col": "Ny gropy azonao ovaina",
        "userrights-unchangeable-col": "Ny gropy tsy azonao ovaina",
        "userrights-conflict": "Fifandonana fanovana zom-pikambana! Avereno vakiana ary marino ny fanovanao.",
-       "userrights-removed-self": "Afakao soa aman-tsara ny zonao. Noho izany, tsy afaka mijery amin'ilay pejy intsony ianao.",
+       "userrights-removed-self": "Nanala ny zonao ianao. Noho izany dia tsy afaka mitsidika ity pejy ity intsony ianao.",
        "group": "Gropy :",
        "group-user": "Mpikambana",
        "group-autoconfirmed": "Mpikambana voamarina",
        "group-bot": "Mpikambana rôbô",
        "group-sysop": "Mpandrindra",
        "group-bureaucrat": "Borôkraty",
-       "group-suppress": "Mpitondra",
+       "group-suppress": "Mpametra",
        "group-all": "(izy rehetra)",
        "group-user-member": "{{GENDER:$1|mpikambana}}",
        "group-autoconfirmed-member": "{{GENDER:$1|Mpikambana voamarina ho azy}}",
        "group-bot-member": "{{GENDER:$1|Mpikambana rôbô}}",
        "group-sysop-member": "{{GENDER:$1|Mpandrindra}}",
        "group-bureaucrat-member": "{{GENDER:$1|Borôkraty}}",
-       "group-suppress-member": "{{GENDER:$1|Mpitondra}}",
+       "group-suppress-member": "{{GENDER:$1|mpamafa}}",
        "grouppage-user": "{{ns:project}}:Mpikambana",
        "grouppage-autoconfirmed": "{{ns:project}}:Mpikambana Voamafy",
        "grouppage-bot": "{{ns:project}}:Mpikambana rôbô",
        "grouppage-sysop": "{{ns:project}}:Mpandrindra",
        "grouppage-bureaucrat": "{{ns:project}}:Borôkraty",
-       "grouppage-suppress": "{{ns:project}}:Oversight",
+       "grouppage-suppress": "{{ns:project}}:Mpamafa",
        "right-read": "Mamaky ny pejy",
        "right-edit": "Manova ny pejy",
        "right-createpage": "Manamboatra pejy (tsy pejin-dresaka)",
        "right-createtalk": "Mamorona pejin-dresaka",
        "right-createaccount": "Manamboatra kaonty",
+       "right-autocreateaccount": "Hiditra ho azy miaraka amina kaontim-pikambana ivelany",
        "right-minoredit": "Marihana ho fanovana madinika",
        "right-move": "Manakisaka pejy",
        "right-move-subpages": "Manakisaka pejy miarak'amin'ny zana-pejiny",
        "right-sendemail": "Mandefa imailaka any amin'ny mpikambana hafa",
        "right-passwordreset": "Hijery ny imailaka famerenana ny tenimiafina",
        "right-managechangetags": "Mamorona ary mamafa [[Special:Tags|balizy]] ao amin'ny banky angona",
+       "grant-generic": "\"$1\" vondron-jo",
+       "grant-group-page-interaction": "Mifanakalo amin'ny pejy",
+       "grant-group-file-interaction": "Mifanakalo amin'ny hainoamanjery",
+       "grant-group-watchlist-interaction": "Mifanakalo amin'ny lisitry ny pejy arahanao",
+       "grant-group-email": "Mandefa mailaka",
+       "grant-group-high-volume": "Manao zavatra haingana",
+       "grant-group-administration": "Hanao asam-pandrindrana",
+       "grant-group-other": "Manao hetsika maro samihafa",
+       "grant-blockusers": "Manakana sy manala sakan'ny mpikambana",
+       "grant-createaccount": "Hamorona kaonty",
+       "grant-createeditmovepage": "Mamorona, manova, ary manisaka pejy",
+       "grant-delete": "Mamafa pejy, versiona ary iditry ny laogy",
+       "grant-editinterface": "Manova ny CSS/Javascript an'ny mpikambana ary anaran-tsehatra MediaWiki",
+       "grant-editmycssjs": "Manova CSS/Javascript anao",
+       "grant-editmyoptions": "Hanova ny safidim-pikambanao",
+       "grant-editmywatchlist": "Manova ny lisitry ny pejy arahana",
+       "grant-editpage": "Manova ny pejy efa misy",
+       "grant-editprotected": "Manova ny pejy voaaro",
+       "grant-highvolume": "Manova pejy ambongadiny",
+       "grant-oversight": "Manafina mpikambana ary mamafa versiona",
+       "grant-patrol": "Manamarika ireo fiovam-pejy ho voatsidika",
+       "grant-protect": "Miaro ary manala ny fiavoram-pejy",
+       "grant-rollback": "Mamafa fiovana amin'ny pejy",
+       "grant-sendemail": "Mandefa mailaka amin'ny mpikambana hafa",
+       "grant-uploadeditmovefile": "Manondrana, manova ary manisaka rakitra",
+       "grant-uploadfile": "Mampiditra rakitra vaovao",
+       "grant-basic": "Zo fototra",
+       "grant-viewdeleted": "Mitsidika ireo rakitra ary pejy voafafa",
+       "grant-viewmywatchlist": "Hijery ny lisitry ny pejy arahanao",
        "newuserlogpage": "Laogim-panokafana kaontim-pikambana",
        "newuserlogpagetext": "Ity pejy ity dia maneho ny tantaran'asan'ny fampidirana mpikambana vaovao.",
        "rightslog": "Laogim-piovan'ny zom-pikambana",
        "action-createpage": "hanao pejy",
        "action-createtalk": "hanao pejin-dresaka",
        "action-createaccount": "amboary io kaontim-pikambana io",
+       "action-autocreateaccount": "foronina ho azy io kaontim-pikambana ivelany io",
        "action-history": "hijery ny tantaran'ity pejy ity",
        "action-minoredit": "Mariho ho kely ity fanovana ity",
        "action-move": "hamindra io pejy io",
        "recentchanges-label-plusminus": "IO ny isan'ny oktety niova tamin'ilay pejy",
        "recentchanges-legend-heading": "<strong>Maribolana:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (jereo koa ny [[Special:NewPage|lisitry ny pejy vaovao]])",
+       "recentchanges-submit": "Aseho",
        "rcnotefrom": "Eo ambany dia ahitana ireo fiovana{{PLURAL:$5}} hatry ny <strong>$3, $4</strong> (naseho hatramin'ny <strong>$1</strong>).",
        "rclistfrom": "Asehoy izay vao niova manomboka ny $3 $2",
        "rcshowhideminor": "$1 ny fanovàna kely",
        "rcshowhidemine": "$1 ny fanovàko",
        "rcshowhidemine-show": "Haneho",
        "rcshowhidemine-hide": "Hanafina",
+       "rcshowhidecategorization": "$1 ny fisokajiam-pejy",
+       "rcshowhidecategorization-show": "Aseho",
+       "rcshowhidecategorization-hide": "Afenina",
        "rclinks": "Asehoy ny $1 niova farany tato anatin'ny $2 andro<br />$3",
        "diff": "Fampitahana",
        "hist": "tant.",
        "recentchangeslinked-summary": "Mampiseho ny fanovàna vao haingana ity pejy manokana ity. Voasoratra amin'ny '''sora-matavy''' ny lohaten'ny [[Special:Watchlist|pejy arahinao-maso]].",
        "recentchangeslinked-page": "anaram-pejy :",
        "recentchangeslinked-to": "Ampisehoy ny fanovàn'ny pejy misy rohy makany amin'ny pejy fa tsy atao mivadika",
+       "recentchanges-page-added-to-category": "Nampiana tamin'ny sokajy [[:$1]]",
+       "recentchanges-page-removed-from-category": "Nesorina tamin'ny sokajy i [[:$1]]",
+       "autochange-username": "Fiovàna vita ho azy MediaWiki",
        "upload": "Handefa rakitra",
        "uploadbtn": "Alefaso ny rakitra",
        "reuploaddesc": "Miverena any amin'ny fisy fandefasan-drakitra.",
        "upload-form-label-infoform-description": "Famisavisana",
        "upload-form-label-usage-title": "Fampiasana",
        "upload-form-label-usage-filename": "Anaran-drakitra",
+       "foreign-structured-upload-form-label-own-work": "Asako ity",
+       "foreign-structured-upload-form-label-infoform-categories": "Sokajy",
+       "foreign-structured-upload-form-label-infoform-date": "Daty",
        "backend-fail-stream": "Tsy afaka mamaky ilay rakitra $1.",
        "backend-fail-backup": "Tsy afaka mitahiry ilay rakitra $1.",
        "backend-fail-notexists": "Tsy misy ilay rakitra $1.",
        "mostrevisions": "Lahatsoratra niova im-betsaka indrindra",
        "prefixindex": "Pejy manomboka amin'ny...",
        "prefixindex-namespace": "Ny pejy rehetra mitondra ny tovona (anaran-tsehatra $1)",
+       "prefixindex-submit": "Aseho",
+       "prefixindex-strip": "Hanala ny tovona anaty lisitra",
        "shortpages": "Pejy fohy",
        "longpages": "Pejy lavabe",
        "deadendpages": "Pejy tsy mirohy",
        "protectedpages-performer": "Fiarovana ny mpikambana",
        "protectedpages-params": "Parametatry ny fiavorana",
        "protectedpages-reason": "Antony",
+       "protectedpages-submit": "Haneho pejy",
        "protectedpages-unknown-timestamp": "Tsy fantatra",
        "protectedpages-unknown-performer": "Mpikambana tsy fantatra",
        "protectedtitles": "Lohateny voaaro",
        "protectedtitlesempty": "Tsy misy lohateny voaaro miaraka amin'ireo mpihazaka ireo.",
+       "protectedtitles-submit": "Lohateny aseho",
        "listusers": "Lisitry ny mpikambana",
        "listusers-editsonly": "Ny mpikambana manam-pandraisan'anjara ihany no aseho",
        "listusers-creationsort": "Afantina amin'ny daty fanokafana",
        "usereditcount": "fanovana $1 {{PLURAL:}}",
        "usercreated": "Noforonina ny {{GENDER:$3}} $1 tamin'ny $2",
        "newpages": "Pejy vaovao",
+       "newpages-submit": "Aseho",
        "newpages-username": "Solonanarana:",
        "ancientpages": "Ireo pejy tranainy indrindra",
        "move": "Hamindra azy toerana",
        "nopagetext": "Tsy misy ny pejy tanjona nolazainareo.",
        "pager-newer-n": "$1 {{PLURAL:$1|vao haingana|vao haingana}}",
        "pager-older-n": "$1 {{PLURAL:$1|taloha|taloha}}",
-       "suppress": "Hitondra",
+       "suppress": "Fafàna",
        "querypage-disabled": "Tsy ampiasaina ity pejy manokana ity mba hitsitsy ny solosaina",
        "apihelp": "Fanoroana API",
        "apihelp-no-such-module": "Tsy hita ny joro \"$1\".",
+       "apisandbox": "Kianjam-pasika API",
+       "apisandbox-jsonly": "Ilaina amin'ny fampiasana kianjam-pasika API ny JavaScript.",
+       "apisandbox-api-disabled": "Tsy alefa amin'ity tranonkala ity ny API.",
+       "apisandbox-fullscreen": "Hanitatra solaitra",
+       "apisandbox-unfullscreen": "Haneho pejy",
+       "apisandbox-submit": "Hanao hataka",
+       "apisandbox-reset": "Diovina",
+       "apisandbox-retry": "Andramana indray",
+       "apisandbox-helpurls": "Rohim-panoroana",
+       "apisandbox-examples": "Ohatra",
+       "apisandbox-dynamic-parameters": "Parametatra miampy",
+       "apisandbox-dynamic-parameters-add-label": "Hanampy parametatra:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Anaram-parametatra",
+       "apisandbox-dynamic-error-exists": "Efa misy parametatra mitondra ny anarana \"$1\".",
+       "apisandbox-deprecated-parameters": "Parametatra tola",
+       "apisandbox-fetch-token": "Fenoina ho azy ny token",
+       "apisandbox-submit-invalid-fields-title": "Misy saha tsy azo raisina",
+       "apisandbox-results": "Valiny",
+       "apisandbox-sending-request": "Mandefa hataka API...",
+       "apisandbox-loading-results": "Mandray valiny API...",
+       "apisandbox-results-error": "Nisy hadisoana tamin'ny fakàna ny valin-kataka API: $1.",
+       "apisandbox-request-url-label": "Hataka URL:",
+       "apisandbox-request-time": "Fotoana nangatahana{{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "Ahitsio ny token ary alefaso indray",
+       "apisandbox-results-fixtoken-fail": "Tsy afaka naka ny token \"$1\".",
+       "apisandbox-alert-page": "Tsy ekena ny votoatin'ny saha ato amin'ity pejy ity.",
        "booksources": "boky tsiahy",
        "booksources-search-legend": "hikaroka anatin'ny boky todika",
        "booksources-search": "Fikarohana",
        "specialloguserlabel": "Mpikambana nanao :",
        "speciallogtitlelabel": "Tanjona (lohateny na mpikambana) :",
        "log": "Tatitr’asa",
+       "logeventslist-submit": "Aseho",
        "all-logs-page": "Laogy rehetra",
        "alllogstext": "Seho nakambana ho an'ny laogy rehetra azo jerena eto amin'ny {{SITENAME}}.\nAzonao ferana ny fahitana ny tao amin'ny fisafidianana karazana laogy iray, anaram-pikambana iray na pejy iray (samihafa ny sorabaventy sy soramadinika).",
        "logempty": "Tsy nahitana.",
        "log-title-wildcard": "Hitady amin'ny lohateny manomboka amin'io soratra io",
        "showhideselectedlogentries": "Haneho/Hanafina ny iditry ny laogy nofidiana",
+       "checkbox-all": "Rehetra",
+       "checkbox-none": "Tsy misy",
+       "checkbox-invert": "Avadika",
        "allpages": "Pejy rehetra",
        "nextpage": "Pejy manaraka ($1)",
        "prevpage": "Pejy taloha ($1)",
        "cachedspecial-viewing-cached-ttl": "Mijery pejy anaty takona ianao, izay namboarina $1 taona lasa.",
        "cachedspecial-refresh-now": "Hijery ny farany indrindra",
        "categories": "Sokajy",
+       "categories-submit": "Aseho",
        "categoriespagetext": "{{PLURAL:$1}}Ampiasain'ny rakitra na pejy ireo sokajy manaraka ireo.\nTsy hiseho eto ny [[Special:UnusedCategories|sokajy tsy miasa]].\nVangio koa ny [[Special:WantedCategories|sokajy ilaina]].",
        "categoriesfrom": "Haneho ny sokajy manomboka amin'ny :",
        "special-categories-sort-count": "afantina amin'ny isan-javatra",
        "activeusers-hidebots": "Asitriho ny robo",
        "activeusers-hidesysops": "Asitriho ny mpandrindra",
        "activeusers-noresult": "Tsy nahitana mpikambana.",
+       "activeusers-submit": "Hanseho ny mpikambana mavitrika",
        "listgrouprights": "Fahefan'ny vondrom-pikambana",
        "listgrouprights-summary": "Ity pejy ity dia ahitana ny lisitry ny vondrom-pikambana voafaritra ato amin'ity wiki ity ary ny zo ananany. Mety misy [[{{MediaWiki:Listgrouprights-helppage}}|fampahalalana fanampiny]] mikasika ny zo manokana.",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Zo nomena</span>\n* <span class=\"listgrouprights-revoked\">Zo nofoanana</span>",
        "listgrouprights-namespaceprotection-header": "Fifehezana amin'ny valan'anarana",
        "listgrouprights-namespaceprotection-namespace": "Valan'anarana",
        "listgrouprights-namespaceprotection-restrictedto": "Zo ahafahan'ny mpikambana manova",
+       "listgrants": "Fahazoan-dalana",
+       "listgrants-grant": "Omena alalana",
+       "listgrants-rights": "Zo",
        "trackingcategories": "Sokajy fanarahana",
        "trackingcategories-msg": "Sokajy fanarahana",
        "trackingcategories-name": "Anaran-kafatra",
        "wlheader-showupdated": "Aseho '''sorabaventy''' ny pejy niova taorian'ny famangianao azy farany.",
        "wlnote": "Eo ambany dia ahitana ny {{PLURAL:$1|fiovana farany indrindra|ny fiovana ''$1'' farany}} natao tanatin'ny adin'ny {{PLURAL:$2|iray|'''$2'''}}, nanomboka ny $3, $4.",
        "wlshowlast": "Haneho ny $1 ora farany, ny $2 andro farany na",
+       "watchlist-hide": "Afenina",
+       "watchlist-submit": "Aseho",
+       "wlshowtime": "Vanim-potoana aseho:",
+       "wlshowhideminor": "fiovana madinika",
+       "wlshowhidebots": "rôbô",
+       "wlshowhideliu": "mpikambana nisoratra anarana",
+       "wlshowhideanons": "mpikambana tsy nisoratra anarana",
+       "wlshowhidepatr": "fiovana voavaky",
+       "wlshowhidemine": "fiovako",
+       "wlshowhidecategorization": "fanasokajiam-pejy",
        "watchlist-options": "Safidy ny lisitry ny pejy arahana",
        "watching": "Fanarahana...",
        "unwatching": "Fanalana ny fanarahana...",
        "watcherrortext": "Nisy hadisoana nitranga teo ampanovana ny safidy ny lisitry ny pejy arahanao ho an'i « $1 ».",
        "enotif_reset": "Marihana ho efa voavaky ny pejy rehetra",
        "enotif_impersonal_salutation": "Mpikamban'i {{SITENAME}}",
+       "enotif_subject_deleted": "Nofaran'i $2{{GENDER:$2|}} ny pejy $1 an'i {{SITENAME}}",
+       "enotif_subject_created": "Noforonin'i $2 ny pejy $1 tao amin'i {{SITENAME}}",
+       "enotif_subject_moved": "Nahetsik'i $2 ny pejy $1 tao amin'i {{SITENAME}}",
+       "enotif_subject_restored": "Naverin'i $2 ny pejy $1 tao amin'i {{SITENAME}}",
+       "enotif_subject_changed": "Novain'i $2 ny pejy $1 tao amin'i {{SITENAME}}",
+       "enotif_body_intro_deleted": "Nofafàn'i $2 ny pejy $1 an'i {{SITENAME}} tamin'ny $PAGEEDITDATE, jereo $3",
+       "enotif_body_intro_created": "Noforonin'i $2 ny pejy $1 an'i {{SITENAME}} tamin'ny $PAGEEDITDATE, jereo $3 ho an'ny versiona ankehitriny.",
+       "enotif_body_intro_moved": "Nahetsik'i $2 ny pejy $1 an'i {{SITENAME}} tamin'ny $PAGEEDITDATE, jereo $3 ho an'ny versiona ankehitriny.",
+       "enotif_body_intro_restored": "Naverin'i $2 ny pejy $1 an'i {{SITENAME}} tamin'ny $PAGEEDITDATE, jereo $3 ho an'ny versiona ankehitriny.",
+       "enotif_body_intro_changed": "Novain'i $2 ny pejy $1 an'i {{SITENAME}} tamin'ny $PAGEEDITDATE, jereo $3 ho an'ny versiona ankehitriny.",
        "enotif_lastvisited": "Jereo eto $1 ny niova rehetra hatramin'ny fitsidihanao farany.",
        "enotif_lastdiff": "Jereo $1 mba ahitana ireo fanovana ireo.",
        "enotif_anon_editor": "mpikambana tsy nisoratra anarana $1",
        "delete-confirm": "Hamafa ny « $1 »",
        "delete-legend": "Fafao",
        "historywarning": "'''Tandremo :''' Ny pejy hofafanao io dia manana tantaram-pejy misy famerenana $1{{PLURAL:}}",
+       "historyaction-submit": "Aseho",
        "confirmdeletetext": "Handeha hamafa tanteraka ny pejy na sary miaraka amin'ny tantarany rehetra\nao anatin'ny toby ianao. Azafady mba hamafiso fa irinao tokoa izany,\nfantatrao ny vokany ary mahalala ianao fa tsy mifanipaka amin'ny\n[[{{MediaWiki:Policy-url}}|fepetra]] izao ataonao izany.",
        "actioncomplete": "Vita ny asa",
        "actionfailed": "Tsy nandeha ny tao",
        "rollback-success": "Fanesorana ny fiovana nataon'i $1 ;\nfiverenana amin'ny fiovana farany nataon'i $2.",
        "sessionfailure-title": "Tsi-fetezaka mikasika ny kaonty idirana",
        "sessionfailure": "Ohatry ny misy olana ny fidirana amin'ny kaontinao ; \nnofoanana ilay tao mba tsy hisy fanodinana fotaom-pidirana (session).\nTsindrio \"Mialoha\" ary vaozy ilay pejy niavianao ary andramo fanindroany.",
+       "changecontentmodel-legend": "Môdelim-botoatim-pejy",
        "changecontentmodel-title-label": "Lohatenim-pejy",
        "changecontentmodel-model-label": "Môdelim-botoatiny",
        "changecontentmodel-reason-label": "Antony :",
+       "changecontentmodel-submit": "Ovaina",
        "changecontentmodel-success-title": "Niova ny môdelim-botoatiny",
        "logentry-contentmodel-change-revertlink": "mamerina",
        "logentry-contentmodel-change-revert": "mamerina",
        "movenotallowedfile": "Tsy mahazo ovainao anarana ny rakitra.",
        "cant-move-user-page": "Tsy azo ovainao anarana ny renipejim-pikambana (any ivelan'ny zana-pejiny).",
        "cant-move-to-user-page": "Tsy azo ovainao ny manova anarana pejy makany amina pejim-pikambana (afatsy zana-pejy iray).",
-       "newtitle": "Lohateny vaovao",
+       "newtitle": "Lohateny vaovao:",
        "move-watch": "araho-maso ity pejy ity",
        "movepagebtn": "Afindrao",
        "pagemovedsub": "Voafindra ny pejy",
        "export-download": "Hitahiry azy anaty rakitra",
        "export-templates": "Ataovy ao ny endrika",
        "export-pagelinks": "Ataovy ao any pejy mmirohy amin'y halalina :",
+       "export-manual": "Ampiana amin'ny alalan'ny tanana ilay pejy:",
        "allmessages": "Hafatry ny rindrankajy",
        "allmessagesname": "Anarana",
        "allmessagesdefault": "Dikan-teny tany am-boalohany",
        "thumbnail-temp-create": "Tsy afaka namorona ilay thumbnail miserana",
        "thumbnail-dest-create": "Tsy nahatahiry ilay thumbnail tany amin'ny tanjona",
        "thumbnail_invalid_params": "Parametatry ny saritapaka tsy mety",
+       "thumbnail_toobigimagearea": "Rakitra manana habe mihoatra ny $1",
        "thumbnail_dest_directory": "Tsy mety amboarina ilay petra-drakitra tanjona",
        "thumbnail_image-type": "Karazan-drakitra tsy zaka",
        "thumbnail_image-missing": "Rakitra ohatran'ny tsy ao : $1",
        "import-interwiki-history": "Handika ny santiônan'ny tantaran'ity pejy ity",
        "import-interwiki-templates": "Ataovy ao ny endrika rehetra",
        "import-interwiki-submit": "Hampiditra",
+       "import-mapping-namespace": "Ampidirina amin'ny anaran-tsehatra:",
+       "import-mapping-subpage": "Ampidirina ho zana-pejin'ny pejy manaraka:",
        "import-upload-filename": "Anaran-drakitra :",
        "import-comment": "Resaka :",
        "importstart": "Am-pampidirana ny pejy…",
        "importlogpage": "laogin'ny fampidirana",
        "importlogpagetext": "Fampidirana ara-pandraharahana ny pejy miaraka amin'ny tantaram-panvany avy any amin'ny wiki hafa.",
        "javascripttest": "Fanandramana JavaScript",
+       "javascripttest-pagetext-unknownaction": "Asa tsy fantatra \"$1\".",
        "javascripttest-pagetext-skins": "Mifidia skin hanaovana ny fanandramana:",
        "javascripttest-qunit-intro": "Jereo ny [$1 fanoroana mikasika ny andrana] eo amin'i mediawiki.org.",
        "tooltip-pt-userpage": "Ny pejim-pikambanao",
        "duplicate-defaultsort": "'''Tandremo''' : manitsaka ny sort key taloha \"$1\" ilay sort key ankehitriny \"$2\".",
        "version": "Versiona",
        "version-extensions": "Fanitarana nampidirina",
+       "version-skins": "Fitafy efa napetraka",
        "version-specialpages": "Pejy manokana",
        "version-variables": "Miova",
+       "version-antispam": "Fisorohana maila-pako",
        "version-other": "Samihafa",
        "version-hook-subscribedby": "Nalefan'i",
        "version-version": "($1)",
        "version-license": "Lisansa Mediawiki",
+       "version-ext-license": "Fahazoan-dalana",
+       "version-ext-colheader-name": "Fanitarana",
+       "version-skin-colheader-name": "Fiseho",
+       "version-ext-colheader-version": "Versiona",
+       "version-ext-colheader-license": "Fahazoan-dalana",
+       "version-ext-colheader-description": "Famaritana",
+       "version-ext-colheader-credits": "Mpamorona",
+       "version-license-title": "Fahazoan-dalana ho an'i $1",
+       "version-credits-title": "Fisaorana ho an'i $1",
        "version-poweredby-others": "hafa",
        "version-software": "Rindrankahy voapetraka",
        "version-software-product": "Vokatra",
        "version-software-version": "Versiona",
+       "version-entrypoints": "URL ny toeram-pidirana",
+       "version-entrypoints-header-entrypoint": "Toeram-pidirana",
+       "version-entrypoints-header-url": "URL",
+       "version-libraries": "Librery napetraka",
+       "version-libraries-library": "Librery",
+       "version-libraries-version": "Versiona",
+       "version-libraries-license": "Fahazoan-dalana",
+       "version-libraries-description": "Visavisa",
+       "version-libraries-authors": "Mpamorona",
+       "redirect-submit": "Alefa",
+       "redirect-lookup": "Karohana:",
+       "redirect-value": "Sanda:",
+       "redirect-user": "ID mpikambana",
+       "redirect-page": "ID ny pejy",
+       "redirect-revision": "Versiom-pejy",
+       "redirect-file": "Anaran-drakitra",
+       "redirect-logid": "ID laogy",
+       "redirect-not-exists": "Sanda tsy hita",
        "fileduplicatesearch": "Hitady rakitra mitovy endrika",
        "fileduplicatesearch-legend": "Hitady mitovy endrika",
        "fileduplicatesearch-filename": "Anaran-drakitra :",
        "fileduplicatesearch-result-1": "Tsy misy rakitra mitovy amin'ny « $1 ».",
        "fileduplicatesearch-result-n": "Misy rakitra {{PLURAL:}}$2 mitovy amin'i « $1 ».",
        "specialpages": "Pejy manokana",
-       "specialpages-note": "* Pejy manokana tsotra\n* <strong class=\"mw-specialpagerestricted\">Pejy manokana voafetra.</strong>",
+       "specialpages-note-top": "Maribolana",
+       "specialpages-note": "* Pejy manokana tsotra\n* <span class=\"mw-specialpagerestricted\">Pejy manokana voafetra ara-pijey.</span>",
        "specialpages-group-maintenance": "laogy hikojakojana",
        "specialpages-group-other": "Pejy manokana hafa",
        "specialpages-group-login": "Hiditra / hisoratra anarana",
        "specialpages-group-wiki": "Data sy fitaovana",
        "specialpages-group-redirects": "Pejy manokana voaodina",
        "specialpages-group-spam": "Fitaovana fanalana spam",
+       "specialpages-group-developer": "Fitaovam-panitatra",
        "blankpage": "Pejy fotsy",
        "intentionallyblankpage": "Avela fananiana ho fotsy ity pejy ity.",
        "external_image_whitelist": "#Avelao tahaka izao ity andalana ity.<pre>\n#Lazao ny singana REGEX (ny singa voalaza eo anelanelan'ny //) eo ambany.\n#Miady amin'ny URL ny sary ivelany izy ireo.\n#Hiseho sahala sary izay miady, raha tsy izany dia rohy mankany amin'ilay sary ihany no haseho.\n#Ho resaka ny andalana manomboka amin'ny #.\n#Tsy miraharaha ny zanatsoratra sy ny renisoratra ity lisitra ity.\n\n#Ataovy eo ambonin'ity andalana ity ny singana REGEX. Avelao tahaka izao ity andalana farany ity.</pre>",
        "tags-tag": "Anaran'ny balizy",
        "tags-display-header": "Seho anatin'ny lisitry ny fanovana",
        "tags-description-header": "Famisavisana tanteraka an'ilay balizy",
+       "tags-source-header": "Loharano",
+       "tags-active-header": "Mandeha?",
        "tags-hitcount-header": "Fanovana voabalizy",
+       "tags-actions-header": "Tao",
+       "tags-active-yes": "Eny",
+       "tags-active-no": "Tsia",
+       "tags-source-extension": "Voafaritr'itatra",
+       "tags-source-manual": "Ampiharin'ny mpikambana sy rôbô tanana",
+       "tags-source-none": "Tsy ampiasaina intsony",
        "tags-edit": "hanova",
+       "tags-delete": "fafao",
+       "tags-activate": "alefa",
+       "tags-deactivate": "aza alefa",
        "tags-hitcount": "{{PLURAL:$1|fanovana|fanovana}} $1",
+       "tags-manage-no-permission": "Tsy manana zo mikirakira ny balizy ianao.",
+       "tags-manage-blocked": "Tsy afaka manova balizy ianao rehefa voasakana.",
+       "tags-create-heading": "Hamorona balizy vaovao",
+       "tags-create-tag-name": "Anaram-balizy:",
+       "tags-create-reason": "Antony :",
+       "tags-create-submit": "Foronona",
+       "tags-create-no-name": "Tsy maintsy manisy anaram-balizy ianao.",
+       "tags-delete-title": "Hamafa balizy",
+       "tags-delete-explanation-initial": "Mby hamafa ny balizy \"$1\" amin'ny banky angona ianao.",
+       "tags-delete-reason": "Antony:",
+       "tags-delete-submit": "Hamafa ity balizy ity mandrakizay",
+       "tags-delete-not-allowed": "Tsy afaka fafana ny balizy voafatr'itatra raha tsy mamela hanao izany ilay itatra.",
+       "tags-delete-not-found": "Tsy misy ny balizy \"$1\".",
+       "tags-activate-title": "Alefa ilay balizy",
+       "tags-activate-question": "Mby handefa balizy \"$1\" ianao.",
+       "tags-activate-reason": "Antony:",
+       "tags-activate-not-allowed": "Tsy mety atao ny mandefa balizy \"$1\".",
+       "tags-activate-not-found": "Tsy misy ny balizy \"$1\".",
+       "tags-activate-submit": "Alefa",
+       "tags-deactivate-title": "Aza alefa ny balizy",
+       "tags-deactivate-question": "Mby tsy hampandefa ny balizy \"$1\" ianao.",
+       "tags-deactivate-reason": "Antony:",
+       "tags-deactivate-not-allowed": "Tsy afaka atao ny manajanona ny balizy \"$1\".",
+       "tags-deactivate-submit": "Aza alefa",
+       "tags-edit-title": "Hanova balizy",
+       "tags-edit-manage-link": "Hikirakira balizy",
+       "tags-edit-new-tags": "Balizy vaovao:",
+       "tags-edit-add": "Ampiana ireo balizy ireo:",
+       "tags-edit-remove": "Hanala ireo balizy ireo:",
+       "tags-edit-remove-all-tags": "(hanala ny balizy rehetra)",
+       "tags-edit-chosen-placeholder": "Hifidy balizy sasany",
+       "tags-edit-chosen-no-results": "Tsy nisy balizy niady",
+       "tags-edit-reason": "Antony:",
+       "tags-edit-success": "Efa mihatra ny fiovana.",
+       "tags-edit-failure": "Tsy tafahatra ireto fiovana ireto:\n$1",
+       "tags-edit-nooldid-title": "Versiona tanjona tsy ekena",
        "comparepages": "Hampitaha pejy",
        "compare-page1": "Pejy 1",
        "compare-page2": "Pejy 2",
        "compare-rev1": "Versiona 1",
        "compare-rev2": "Versiona 2",
        "compare-submit": "Ampitahao",
+       "compare-invalid-title": "Tsy ekena ny lohateny nosoratanao.",
+       "compare-title-not-exists": "Tsy misy ny lohateny nosoratanao.",
+       "compare-revision-not-exists": "Tsy misy ny versiona nosoratanao.",
        "dberr-problems": "Azafady Tompoko ! Manana olana ara-teknika ny sehatra.",
        "dberr-again": "Miandrasa minitra vitsivitsy ary alefaso fanindroany",
-       "dberr-info": "(Tsy afaka mifandray amin'ny lohamilin'ny database : $1)",
+       "dberr-info": "(Tsy afaka mifandray amin'ny banky angona: $1)",
+       "dberr-info-hidden": "(Tsy afaka mifandray amin'ny banky angona)",
        "dberr-usegoogle": "Afaka manandrana mikaroka eo amin'ny Google ianao mandritra izay.",
+       "dberr-outofdate": "Fantaro fa mety efa lany andro ny index-n'ny votoatinay",
        "dberr-cachederror": "Izy io dia dika nasitriky ny pejy nangatahana ary mety efa tola.",
        "htmlform-invalid-input": "Nisy olana nitranga tamin'ny sanda sasany",
        "htmlform-select-badoption": "Tsy azo ekena ny sanda nambaranao.",
        "htmlform-float-invalid": "Tsy isa ny sanda nambaranao.",
        "htmlform-int-toolow": "Ny sanda nambaranao dia kely nohon'ny fetra iva indrindra $1",
        "htmlform-int-toohigh": "Ny sanda nambaranao dia ngeza nohon'ny fetra avo indrindra $1",
+       "htmlform-required": "Ilaina ny sandany.",
        "htmlform-submit": "Alefa",
        "htmlform-reset": "Hanala ny fanovana",
        "htmlform-selectorother-other": "Hafa",
+       "htmlform-no": "Tsia",
+       "htmlform-yes": "Eny",
+       "htmlform-chosen-placeholder": "Makà safidy",
+       "htmlform-cloner-create": "Hanampy be kokoa",
+       "htmlform-cloner-delete": "Esorina",
+       "htmlform-cloner-required": "Sanda iray farafahakeliny no ilaina",
+       "htmlform-title-badnamespace": "Tsy ao amin'i anaran-tsehatra \"{{ns:$2}}\" i [[:$1]].",
+       "htmlform-title-not-creatable": "Lohatenim-pejy tsy azo foronina \"$1\"",
+       "htmlform-title-not-exists": "Tsy misy $1.",
+       "htmlform-user-not-exists": "Tsy misy ny <strong>$1</strong>.",
+       "htmlform-user-not-valid": "Tsy anaram-pikambana azo raisina <strong>$1</strong>.",
+       "sqlite-has-fts": "$1 misy fikarohan-dahatsoratra tanteraka",
+       "sqlite-no-fts": "$1 tsy misy fikarohan-dahatsoratra tanteraka",
        "logentry-delete-delete": "nofafan'i $1 ny pejy $3",
+       "logentry-delete-restore": "Namerina ny pejy $3 i $1{{GENDER:$2|}}",
+       "logentry-delete-event": "Nanova ny fahitana {{PLURAL:$5|laogy iray|laogy $5}} tamin'i $3 i $1: $4",
+       "logentry-delete-revision": "Nanova ny fahitana {{GENDER:$2|}}{{PLURAL:$5|versiona $5}} tamin'ny pejy $3 i $1: $4",
+       "logentry-delete-event-legacy": "{{GENDER:$2|}}Nanova ny fahitana ny zava-mitranga amin'ny laogy momba an'i $3 i $1",
+       "logentry-delete-revision-legacy": "Nanova ny fahitana ny versiona amin'ny pejy $3 i $1",
        "logentry-suppress-delete": "{{GENDER:$2|nofafan'i}} $1 ny pejy $3",
+       "logentry-suppress-event": "Nanova{{GENDER:$2|}} antsokosoko ny fahitana amin'ny {{PLURAL:$5|zava-mitranga amin'ny laogy $5}} amin'i $3 i $1: $4",
+       "logentry-suppress-revision": "Nanova{{GENDER:$2|}} antsokosoko ny fahitana amin'ny {{PLURAL:$5|versiona $5}} amin'i $3 i $1: $4",
+       "logentry-suppress-event-legacy": "Nanova antsokosoko ny fahitana ny zava-mitranga amin'ny laogy momba an'i $3 i $1",
        "revdelete-content-hid": "votoatiny nafenina",
        "revdelete-summary-hid": "ambangovangom-panovana nafenina",
        "revdelete-uname-hid": "anaram-pikambana nafenina",
        "feedback-subject": "Lohahevitra:",
        "feedback-submit": "Alefa",
        "feedback-thanks": "Misaotra! lanefa tany amin'ilay pejy ''[$2 $1]'' ilay fanehoan-kevitrao.",
+       "feedback-useragent": "User agent:",
        "searchsuggest-search": "Karohy",
        "searchsuggest-containing": "misy...",
        "api-error-badaccess-groups": "Tsy afaka mampiditra rakitra eto amin'ity wiki ity ianao.",
index 080a3dc..5df7821 100644 (file)
        "recentchanges-label-minor": "Тиде изи тӧрлатымаш",
        "recentchanges-label-bot": "Тиде тӧрлатымашым бот ыштен",
        "recentchanges-label-unpatrolled": "Тиде тӧрлатымашым нигӧ терген огыл",
-       "recentchanges-legend-heading": "'''Легенде:'''",
+       "recentchanges-legend-heading": "<strong>Легенде:</strong>",
        "recentchanges-legend-newpage": "$1 - у лаштык",
        "rcnotefrom": "Ниже перечислены изменения с '''$2''' (не более '''$1''').",
        "rclistfrom": "$3 $2 гыч тӱҥалын у вашталтымашым ончыкташ",
        "withoutinterwiki-submit": "ончыкташ",
        "nbytes": "$1 {{PLURAL:$1|байт|байт}}",
        "nmembers": "$1 {{PLURAL:$1|1=лаштык|лаштык-влак}}",
-       "nviews": "$1 {{PLURAL:$1|1=ончымо|ончымо-влак}}",
        "lonelypages": "Тулык лаштык-влак",
        "wantedcategories": "Ыштыман категорий-влак",
        "wantedpages": "Ыштышаш лаштык-влак",
        "activeusers-count": "Пытартыш $3 {{PLURAL:$3|1=кечыште|кечылаште}} $1 {{PLURAL:$1|1=тӧрлатымаш|тӧрлатымаш-влак}}",
        "activeusers-hidebots": "Бот-влакым шылташ",
        "activeusers-hidesysops": "Сайтвиктарыше-влакым шылташ",
+       "activeusers-submit": "ончыкташ",
        "listgrouprights-members": "(тӱшкаште улшо-влак)",
        "emailuser": "Пайдаланыше дек серыш",
        "watchlist": "Эскерымаш лӱмер",
        "move-page-legend": "Лаштыкын лӱмжым вашталтымаш",
        "movepagetext": "Ӱлыл формо дене пайдаланен, тый лаштыкын лӱмым вашталтен кертат, тудын вашталтыме эртымгорныже у верыш кусарыме.\nТошто лӱмыштӧ у лӱмыш колтымо лаштык кодеш.\nТый тошто лӱмыш колтымо лаштык-влакым шке семын вашталтке кертат.\nТый тидым ынет ыште гын, [[Special:DoubleRedirects|кокытан]] да [[Special:BrokenRedirects|пудыргышо вес вере колтымашым]] терге.\nТый палемдыме верыш кылвер-влаклан шуйнымылан да тушко ончыктымылан вуйын шогет.\n\nШотыш нал: кунам у лӱман лаштык уло, тудо '''ок''' кусаралт. Тыге огыл, кунам лаштык вес вере кусаралтеш але тудо яра да вашталтымаш эртымгорныже уке.\nТый лаштыкым йонгылыш кусаренат гын менгешла тудым тошто лӱмыш кусарен кертат, но тый уже улшо лаштыкым ӱштын от керт, манын ончыкта.\n\n'''Тӱтко лий!'''\nЧӱчкыдын кучылтмо лаштыклан тиде кугу вашталтышым ыштен кертеш;\nУмбаке кайыме деч ончыч шоналте, тый тидын деч вара лиймым умылет.",
        "movepagetalktext": "Тиде лаштыкын каҥашымаш лаштык шке семын огеш кусно, '''тидлан амалже:'''\n*Тыгай лӱман яра огыл каҥашымаш лаштык уло ала\n*Ӱлыч кайыкым от корангде.\n\nТыгай годым тылат лаштыкым шке кидет дене кусараш але иктеш ушнаш кӱлеш.",
-       "movearticle": "Тиде лаштыкын лӱмжым вашталташ:",
        "newtitle": "У лӱм:",
        "move-watch": "Тиде лаштыкым эскераш",
        "movepagebtn": "Лаштыкын лӱмжым вашталташ",
index 04ca1ca..421bb62 100644 (file)
        "moredotdotdot": "Повеќе...",
        "morenotlisted": "Овој список не е целосен.",
        "mypage": "Страница",
+       "anonuserpage": "Непознат корисник",
        "mytalk": "разговор",
        "anontalk": "Разговор",
        "navigation": "Навигација",
        "userlogin-remembermypassword": "Запомни ме",
        "userlogin-signwithsecure": "Користи безбеден опслужувач",
        "cannotloginnow-title": "Во моментов не можам да ве најавм",
+       "cannotloginnow-text": "Не можам да ве најавам кога се користи $1.",
        "yourdomainname": "Вашиот домен:",
        "password-change-forbidden": "Не можете да ја менувате лозинката на ова вики.",
        "externaldberror": "Настана грешка при надворешното најавување на базата или пак немате дозвола да ја подновите вашата надворешна сметка.",
        "nocookiesfornew": "Корисничката сметка не е создадена бидејќи не можеше да се потврди нејзиниот извор.\nЗа оваа цел ќе ви требаат колачиња. Проверете дали се овозможени, превчитајте ја страницава и обидете се повторно.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
        "noname": "Внесовте погрешно корисничко име.",
-       "loginsuccesstitle": "Ð\9dаÑ\98аваÑ\82а Ðµ Ñ\83Ñ\81пеÑ\88на",
+       "loginsuccesstitle": "Ð\9dаÑ\98авени Ñ\81Ñ\82е",
        "loginsuccess": "Сега сте најавени на {{SITENAME}} како „$1“.",
        "nosuchuser": "Нема корисник со името „$1“.\nКорисничките имиња разликуваат мали и големи букви.\nПроверете да не сте направиле грешка во пишувањето, или [[Special:UserLogin/signup|создајте нова корисничка сметка]].",
        "nosuchusershort": "Нема корисник со името „$1“.\nПроверете дали правилно сте напишале.",
        "createaccount-title": "Создавање на сметка за {{SITENAME}}",
        "createaccount-text": "Некој направил сметка со вашата е-поштенска адреса на {{SITENAME}} ($4) со име „$2“ и  лозинка „$3“.\nБи требало сега да се пријавите и да ја промените вашата лозинка.\n\nМожете да ја занемарите оваа порака ако сметката била направена по грешка.",
        "login-throttled": "Имате премногу обиди за најава за кратко време.\nПочекајте $1 пред да се обидете повторно.",
-       "login-abort-generic": "Најавата е неуспешна - Прекинато",
+       "login-abort-generic": "Најавата е неуспешна — Откажано",
        "login-migrated-generic": "Вашата сметка е пренесена и корисничкото име веќе не постои на ова вики.",
        "loginlanguagelabel": "Јазик: $1",
        "suspicious-userlogout": "Вашето барање за одјава е одбиено бидејќи се чини дека е испратено од расипан прелистувач или кеширачки застапник (proxy).",
        "newpassword": "Нова лозинка:",
        "retypenew": "Повторете ја новата лозинка:",
        "resetpass_submit": "Поставете лозинка и најавете се",
-       "changepassword-success": "Ð\92аÑ\88аÑ\82а Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ðµ Ñ\83Ñ\81пеÑ\88но Ñ\81менеÑ\82а!",
+       "changepassword-success": "Вашата лозинка е сменета!",
        "changepassword-throttled": "Имате премногу обиди за најава за кратко време.\nПочекајте $1 пред да се обидете повторно.",
+       "botpasswords": "Ботовски лозинки",
        "botpasswords-label-appid": "Име на ботот:",
        "botpasswords-label-create": "Создај",
        "botpasswords-label-update": "Поднови",
        "recentchanges-label-bot": "Ова уредување е направено од бот",
        "recentchanges-label-unpatrolled": "Ова уредување сè уште не е испатролирано",
        "recentchanges-label-plusminus": "Големинска промена на страницата во бајти",
-       "recentchanges-legend-heading": "'''Легенда:'''",
+       "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (погл. и [[Special:NewPages|списокот на нови страници]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Прикажи",
index 136a642..e313abe 100644 (file)
        "recentchanges-label-bot": "ഇത് യന്ത്രം ചെയ്ത തിരുത്താണ്",
        "recentchanges-label-unpatrolled": "ഇതുവരെ റോന്തുചുറ്റപ്പെടാത്ത തിരുത്ത്",
        "recentchanges-label-plusminus": "താളിന്റെ വലിപ്പം ഇത്രയും ബൈറ്റുകൾ മാറിയിരിക്കുന്നു",
-       "recentchanges-legend-heading": "'''സൂചന:'''",
+       "recentchanges-legend-heading": "<strong>സൂചന:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|പുതിയ താളുകളുടെ പട്ടികയും]] കാണുക)",
        "recentchanges-submit": "പ്രദർശിപ്പിക്കുക",
        "rcnotefrom": "<strong>$3, $4</strong> മുതലുള്ള {{PLURAL:$5|മാറ്റം|മാറ്റങ്ങൾ}} ആണ് താഴെയുള്ളത്  (<strong>$1</strong> എണ്ണം വരെ കൊടുക്കുന്നതാണ്).",
index 90cf7d9..89929c0 100644 (file)
        "recentchanges-label-bot": "Робот гүйцэтгэсэн засвар",
        "recentchanges-label-unpatrolled": "Энэ засварыг манаж амжаагүй",
        "recentchanges-label-plusminus": "Өөрчлөгдсөн байт хэмжээ",
-       "recentchanges-legend-heading": "'''Таних үсэг:'''",
+       "recentchanges-legend-heading": "<strong>Таних үсэг:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|жагсааж харах]])",
        "rcnotefrom": "Доорх нь '''$2'''-с хойших өөрчлөлтүүд ('''$1''' хүртэлхийг харуулав) юм.",
        "rclistfrom": "$3 $2-с хойших шинэ засваруудыг үзүүлэх",
index d2fbdba..1f7e833 100644 (file)
        "recentchanges-label-bot": "हे संपादन एका सांगकाम्याकडून केले गेले आहे",
        "recentchanges-label-unpatrolled": "हे संपादन अजून तपासल्या गेले नाही",
        "recentchanges-label-plusminus": "या पानाचा आकार इतक्या बाइटस् ने बदलला",
-       "recentchanges-legend-heading": "'''विवरण:'''",
+       "recentchanges-legend-heading": "<strong>विवरण:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नविन पानांची यादी]] हेही पाहा)",
        "recentchanges-legend-plusminus": "(''±१२३'')",
        "recentchanges-submit": "दाखवा",
index 74eb97d..aa44e04 100644 (file)
        "recentchanges-label-bot": "Suntingan ini dilakukan oleh bot",
        "recentchanges-label-unpatrolled": "Suntingan ini belum dirondai",
        "recentchanges-label-plusminus": "Saiz laman telah berubah sebanyak jumlah bait ini",
-       "recentchanges-legend-heading": "'''Petunjuk:'''",
+       "recentchanges-legend-heading": "<strong>Petunjuk:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lihat juga [[Special:NewPages|senarai laman baru]])",
        "rcnotefrom": "Yang berikut adalah {{PLURAL:$5|suntingan|suntingan-suntingan}} sejak <strong>$3, $4</strong> (selebihi <strong>$1</strong> dipaparkan).",
        "rclistfrom": "Paparkan perubahan sejak $3 $2",
index 7417f87..f09f565 100644 (file)
        "recentchanges-label-bot": "Din il-modifika ġiet effettwata minn bot",
        "recentchanges-label-unpatrolled": "Din il-modifika għadha ma ġietx verifikata",
        "recentchanges-label-plusminus": "Id-daqs tal-paġna nbidel b'dan in-numru ta' bytes",
-       "recentchanges-legend-heading": "'''Leġenda:'''",
+       "recentchanges-legend-heading": "<strong>Leġenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ara wkoll il-[[Special:NewPages|lista tal-paġni l-ġodda]])",
        "rcnotefrom": "Ħawn taħt jinsabu l-modifiki minn '''$2''' (sa '''$1''').",
        "rclistfrom": "Uri l-modifiki ġodda li jibdew minn $3 $2",
index cd21621..7e30340 100644 (file)
        "createacct-error": "အကောင့်ဖန်တီးမှု အမှား",
        "createaccounterror": "ဤအကောင့်ကို မဖန်တီးနိုင်ပါ - $1",
        "noname": "တရားဝင် အသုံးပြုသူအမည်ကို မသတ်မှတ်ရသေးပါ။",
-       "loginsuccesstitle": "Login ဝင်​ခြင်း အောင်မြင်သည်။",
+       "loginsuccesstitle": "လော့ဂ်အင်ဝင်ပြီးပြီ",
        "loginsuccess": "'''သင်သည် {{SITENAME}} သို့ \"$1\" အဖြစ် Login ဝင်ပြီးဖြစ်သည်။'''",
        "nosuchusershort": "\"$1\" အမည်ဖြင့် အသုံးပြုသူမရှိပါ။\nစာလုံးပေါင်း ပြန်စစ်ပေးပါရန်။",
        "nouserspecified": "အသုံးပြုသူအမည်ကို ဖော်ပြရမည်ဖြစ်သည်။",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|ဆွေးနွေး]]) အတွက် အကောင့်ကို ဖန်တီးပြီး ဖြစ်သည်။",
        "createaccount-title": "{{SITENAME}} အတွက် အကောင့်ပြုလုပ်ခြင်း",
        "login-throttled": "သင်သည် login ဝင်ရန် အကြိမ်မြောက်မြားစွာ အားထုတ်ခဲ့ပြီးဖြစ်သည်။\nကျေးဇူးပြု၍ ထပ်မဝင်ခင် $1 စောင့်ပေးပါ။",
-       "login-abort-generic": "Login ဝင်ခြင်း မအောင်မြင်ပါ - ထွက်သွားပြီ",
+       "login-abort-generic": "လော့ဂ်အင်ဝင်ခြင်း မအောင်မြင်ပါ - ဖျက်သိမ်းပြီး",
        "loginlanguagelabel": "ဘာသာ: $1",
        "pt-login": "အကောင့်ဝင်ရန်",
        "pt-login-button": "အကောင့်ဝင်ရန်",
        "newpassword": "စကားဝှက် အသစ် -",
        "retypenew": "စကားဝှက် အသစ်ကို ထပ်ရိုက်ပါ -",
        "resetpass_submit": "စကားဝှက်ကို သတ်မှတ်ပြီးနောက် Log in ဝင်ရန်",
-       "changepassword-success": "á\80\9eá\80\84á\80·á\80ºá\80\85á\80\80á\80¬á\80¸á\80\9dá\80¾á\80\80á\80ºá\80\80á\80­á\80¯ á\80¡á\80±á\80¬á\80\84á\80ºá\80\99á\80¼á\80\84á\80ºá\80\85á\80½á\80¬ á\80\95á\80¼á\80±á\80¬á\80\84á\80ºá\80¸á\80\9cá\80²á\80\95á\80¼á\80®á\80¸á\80\95á\80«á\80\95á\80¼á\80®á\81\8b",
+       "changepassword-success": "á\80\9eá\80\84á\80·á\80ºá\80\85á\80\80á\80¬á\80¸á\80\9dá\80¾á\80\80á\80ºá\80\80á\80­á\80¯ á\80\95á\80¼á\80±á\80¬á\80\84á\80ºá\80¸á\80\9cá\80²á\80\95á\80¼á\80®á\80¸á\80\95á\80«á\80\95á\80¼á\80®!",
        "botpasswords-label-appid": "ဘော့အမည်-",
        "botpasswords-label-create": "ဖန်တီး",
        "botpasswords-label-cancel": "မလုပ်တော့ပါ",
        "revdelete-unsuppress": "ပြန်လည်ထိန်းသိမ်းထားသော မူများမှ ကန့်သတ်ချက်များကို ဖယ်ရှားရန်",
        "revdelete-log": "အ​ကြောင်း​ပြ​ချက်:",
        "revdelete-submit": "ရွေးချယ်ထားသော {{PLURAL:$1|မူ|မူများ}}ကို သက်ရောက်စေရန်",
-       "revdelete-success": "'''မူမြင်နိုင်စွမ်းရှိမှုကို အောင်မြင်စွာ update လုပ်ပြီးပါပြီ။'''",
+       "revdelete-success": "မူမြင်နိုင်စွမ်းရှိမှုကို update လုပ်ပြီးပါပြီ။",
        "revdel-restore": "မည်မျှ ရှုမြင်နိုင်သည်ကို ပြောင်းရန်",
        "pagehist": "စာမျက်နှာ မှတ်တမ်း",
        "deletedhist": "ဖျက်ပစ်လိုက်သော မှတ်တမ်း",
        "mergehistory-reason": "​ကြောင်း​ပြ​ချက် -",
        "mergelog": "ပေါင်းလိုက်သော မှတ်တမ်း",
        "revertmerge": "ပြန်ခွဲထုတ်ရန်",
+       "mergelogpagetext": "အောက်ပါတို့သည် စာမျက်နှာ ရာဇဝင်ကို အခြားတစ်ခုသို့  မကြာမီက ပေါင်းလိုက်သော စာရင်းဖြစ်သည်။",
        "history-title": "\"$1\"၏ တည်းဖြတ်မှု ရာဇဝင်",
        "difference-title": "\"$1\" ၏ တည်းဖြတ်မှု မူကွဲများ",
        "difference-title-multipage": "စာမျက်နှာ \"$1\" နှင့် \"$2\" အကြား ကွဲပြားမှု",
        "right-sendemail": "အခြားအသုံးပြုသူများကို အီးမေးပို့ရန်",
        "grant-editmywatchlist": "သင့် စောင့်ကြည့်စာရင်းကို တည်းဖြတ်ရန်",
        "newuserlogpage": "အသုံးပြုသူအသစ်ရောက်လာခြင်း မှတ်တမ်း",
-       "newuserlogpagetext": "á\80¤á\80\9eá\80\8aá\80ºá\80\99á\80¾á\80¬ á\80¡á\80\9eá\80¯á\80¶á\80¸á\80\95á\80¼á\80¯á\80\9eá\80°á\80¡á\80\9eá\80\85á\80º á\80\96á\80\90်တီးမှု မှတ်တမ်း ဖြစ်သည်။",
+       "newuserlogpagetext": "á\80¤á\80\9eá\80\8aá\80ºá\80\99á\80¾á\80¬ á\80¡á\80\9eá\80¯á\80¶á\80¸á\80\95á\80¼á\80¯á\80\9eá\80°á\80¡á\80\9eá\80\85á\80º á\80\96á\80\94်တီးမှု မှတ်တမ်း ဖြစ်သည်။",
        "rightslog": "အသုံးပြုသူ၏ အခွင့်အရေးများ မှတ်တမ်း",
        "rightslogtext": "ဤသည်မှာ အသုံးပြုသူအခွင့်အရေးများ၏ ပြောင်းလဲမှုများမှတ်တမ်းဖြစ်သည်။",
        "action-read": "ဤစာမျက်နှာကို ဖတ်ရန်",
        "upload-preferred": "အလေးပေးထားသော ဖိုင် {{PLURAL:$2|အမျိုးအစား|အမျိုးအစားများ}}: $1။",
        "upload-prohibited": "တားမြစ်ထားသော ဖိုင် {{PLURAL:$2|အမျိုးအစား|အမျိုးအစားများ}}: $1။",
        "uploadlogpage": "Upload တင်သည့် မှတ်တမ်း",
+       "uploadlogpagetext": "အောက်ပါတို့သည် မကြာမီက upload လုပ်ထားသော ဖိုင်စာရင်း ဖြစ်သည်။\nပိုမို၍ ခြုံငုံသုံးသပ်ကြည့်ရှုနိုင်ရန် [[Special:NewFiles|ဖိုင်အသစ်များ ပြခန်း]]ကို ကြည့်ပါ။",
        "filename": "ဖိုင်အမည်",
        "filedesc": "အ​ကျဉ်း​ချုပ်​",
        "fileuploadsummary": "အ​ကျဉ်း​ချုပ်​ -",
        "statistics-edits-average": "စာတစ်မျက်နှာလျှင် ပျမ်းမျှတည်းဖြတ်မှုနှုန်း",
        "statistics-users": "မှတ်ပုံတင်ထားသော [[Special:ListUsers|အသုံးပြုသူများ]]",
        "statistics-users-active": "လက်ရှိလုပ်ကိုင်နေသော အသုံးပြုသူများ",
+       "statistics-users-active-desc": "နောက်ဆုံး {{PLURAL:$1|ရက်|$1 ရက်}}အတွင်း ဆောင်ရွက်ချက်ရှိသည့် အသုံးပြုသူများ",
        "doubleredirects": "နှစ်ဆင့်ပြန် ပြန်ညွှန်းများ",
        "double-redirect-fixed-move": "[[$1]] ကို ရွှေ့ပြောင်းပြီးဖြစ်သည်။ ၎င်းအား အလိုအလျောက် ပြင်ဆင်ပြီး [[$2]] သို့ ပြန်ညွှန်းထားသည်။",
        "brokenredirects": "ကျိုးပျက်နေသော ပြန်ညွှန်းများ",
        "log": "မှတ်​တမ်း​များ​",
        "logeventslist-submit": "ပြသရန်",
        "all-logs-page": "အများနှင့်ဆိုင်သောမှတ်တမ်းအားလုံး",
+       "alllogstext": "{{SITENAME}}၏ ရရှိနိုင်သော မှတ်တမ်းများအားလုံး ပေါင်းစည်းပြသခြင်း ဖြစ်သည်။\nမှတ်တမ်းအမျိုးအစား၊ အသုံးပြုသူအမည် (စာလုံးအကြီးအသေး)၊ သို့မဟုတ် သက်ဆိုင်ရာ စာမျက်နှာ (စာလုံးအကြီးအသေး) ကို ရွေးချယ်ခြင်းဖြင့် ကြည့်ရှုမှုကို အကျဉ်းချုံးနိုင်ပါသည်။",
+       "logempty": "မှတ်တမ်းထဲတွင် ကိုက်ညီသော အရာများ မရှိပါ။",
        "allpages": "စာမျက်နှာအားလုံး",
        "nextpage": "နောက်ထပ်စာမျက်နှာ ($1)",
        "prevpage": "ယခင် စာမျက်နှာ ($1)",
        "listusers-noresult": "အသုံးပြုသူ မတွေ့ပါ။",
        "listusers-blocked": "(ပိတ်ပင်ထားသည်)",
        "activeusers": "တက်ကြွလှုပ်ရှားသည့် အသုံးပြုသူစာရင်း",
+       "activeusers-intro": "ဤသည်မှာ နောက်ဆုံး $1 {{PLURAL:$1|ရက်|ရက်}}အတွင်း တက်ကြွလှုပ်ရှားသည့် အသုံးပြုသူများ စာရင်း ဖြစ်သည်။",
        "activeusers-from": "ဤမှစသော အသုံးပြုသူများကို ပြရန် -",
        "activeusers-hidebots": "ဘော့များကို ဝှက်ရန်",
        "activeusers-hidesysops": "အက်ဒမင်များကို ဝှက်ရန်",
        "excontentauthor": "ပါဝင်အကြောင်းအရာမှာ - \"$1\"၊ ဖြစ်ပြီး တစ်ဦးတည်းသော အကူအညီပေးအပ်သူမှာ \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|ဆွေးနွေး]])  ဖြစ်သည်",
        "delete-confirm": "\"$1\"ကို ဖျက်ပါ",
        "delete-legend": "ဖျက်",
+       "historywarning": "<strong>သတိပေးချက်။</strong> သင်ဖျက်ပစ်တော့မည့် စာမျက်နှာတွင် {{PLURAL:$1|တည်းဖြတ်မူ|တည်းဖြတ်မူများ}} $1 ခု ရှိနေသည်-",
        "historyaction-submit": "ပြသရန်",
        "confirmdeletetext": "သင်သည် စာမျက်နှာတစ်ခုကို ယင်း၏ မှတ်တမ်းများနှင့်တကွ ဖျက်ပစ်တော့မည် ဖြစ်သည်။\nဤသို့ ဖျက်ပစ်ရန် သင် အမှန်တကယ် ရည်ရွယ်လျက်  နောက်ဆက်တွဲ အကျိုးဆက်များကို သိရှိနားလည်ပြီး [[{{MediaWiki:Policy-url}}|မူဝါဒ]] အတိုင်းလုပ်ဆောင်နေခြင်းဖြစ်ကြောင်းကို အတည်ပြုပေးပါ။",
        "actioncomplete": "လုပ်ဆောင်ချက် ပြီးပြီ",
        "actionfailed": "ဆောင်ရွက်မှုမအောင်မြင်ပါ",
        "deletedtext": "\"$1\" ကို ဖျက်ပစ်လိုက်ပြီးဖြစ်သည်။\nလတ်တလောဖျက်ထားသည်များ၏ မှတ်တမ်းကို $2 တွင် ကြည့်ပါ။",
        "dellogpage": "ဖျက်ထားသည်များ မှတ်တမ်း",
+       "dellogpagetext": "အောက်ပါတို့သည် မကြာမီက ဖျက်ထားမှုများ စာရင်း ဖြစ်သည်။",
        "deletionlog": "ဖျက်ပစ်သည့်မှတ်တမ်း",
        "deletecomment": "အ​ကြောင်း​ပြ​ချက် -",
        "deleteotherreason": "အခြားသော/နောက်ထပ် အကြောင်းပြချက် -",
        "rollbacklink": "နောက်ပြန် ပြန်သွားရန်",
        "rollbacklinkcount": "{{PLURAL:$1|တည်းဖြတ်မှု|တည်းဖြတ်မှုများ}} $1 ကို နောက်ပြန်ပြင်ရန်",
        "protectlogpage": "ကာကွယ်မှုများ၏ မှတ်တမ်း",
+       "protectlogtext": "အောက်ပါတို့သည် စာမျက်နှာ ကာကွယ်မှုများအတွက် အပြောင်းအလဲ စာရင်း ဖြစ်သည်။\nလက်ရှိ စာမျက်နှာ ကာကွယ်မှုများ စာရင်းအတွက် [[Special:ProtectedPages|ကာကွယ်ထားသော စာမျက်နှာများ စာရင်း]]ကို ကြည့်ပါ။",
        "protectedarticle": "\"[[$1]]\" ကို ကာကွယ်ထားသည်",
        "modifiedarticleprotection": "\"[[$1]]\" ၏ ကာကွယ်မှု အဆင့်ကို ပြောင်းရန်",
        "protect-title": "\"$1\" ၏ ကာကွယ်မှုအဆင့်ကို ပြောင်းလဲရန်",
        "prot_1movedto2": "[[$1]]  မှ​ [[$2]] သို့​",
+       "protect-legend": "ကာကွယ်မှု အတည်ပြုရန်",
        "protectcomment": "အ​ကြောင်း​ပြ​ချက်:",
        "protectexpiry": "သက်တမ်းကုန်လွန်မည် -",
        "protect_expiry_invalid": "သက်တမ်းကုန်လွန်မည့် အချိန်သည် တရားမဝင်ပါ။",
        "protect_expiry_old": "သက်တမ်းသည် အတိတ်ကာလတွင် ကုန်လွန်ခဲ့ပြီး ဖြစ်သည်။",
+       "protect-unchain-permissions": "နောက်ထပ် ကာကွယ်မှု ရွေးချယ်စရာများ ဖော်ပြရန်",
        "protect-text": "'''$1''' စာမျက်နှာအတွက် ကာကွယ်မှုအဆင့်ကို ဤနေရာတွင် ကြည့်ရှုပြောင်းလဲနိုင်သည်။",
        "protect-locked-access": "သင့်အကောင့်သည် စာမျက်နှာ၏ ကာကွယ်မှုအဆင့်ကို ပြောင်းလဲနိုင်ရန် ခွင့်ပြုချက် မရှိပါ။\nဤသည်မှာ '''$1''' စာမျက်နှာအတွက် လက်ရှိ settings သတ်မှတ်ချက်များ ဖြစ်သည်။",
        "protect-cascadeon": "ပြန်စီစဉ်ခြင်း cascading ကို ကာကွယ်ထားသော အောက်ပါ{{PLURAL:$1|စာမျက်နှာ|စာမျက်နှာများ}} ပါဝင်နေသောကြောင့် ဤစာမျက်နှာကို လက်ရှိတွင် ကာကွယ်ထားသည်။\nဤစာမျက်နှာ၏ ကာကွယ်မှုအဆင့်ကို ပြောင်းလဲသော်လည်း ပြန်စီစဉ်ခြင်းကို အကျိုးသက်ရောက်လိမ့်မည် မဟုတ်။",
        "protect-level-sysop": "စီမံခန့်ခွဲသူများသာ",
        "protect-summary-cascade": "အစီအစဉ်ကျအောင် စီနေသည်",
        "protect-expiring": "$1 (UTC) တွင် သက်တမ်းကုန်မည်",
+       "protect-expiry-indefinite": "အနန္တ",
        "protect-cascade": "ဤစာမျက်နှာအတွင်း ပါဝင်သော စာမျက်နှာများကို ထိန်းသိမ်းကာကွယ်ပါ (အများခွင့်ပြုချက်ဖြင့်သာ ပြင်ဆင်သင့်သည်)",
        "protect-cantedit": "ကာကွယ်ထားသောစာမျက်နှာဖြစ်သည့်အတွက် ပြင်ဆင်၍ မရနိုင်ပါ။ အဘယ့်ကြောင့်ဆိုသော် သင့်မှာ တည်းဖြတ်ပိုင်ခွင့် မရှိ၍ ဖြစ်ပါသည်။",
        "protect-otherreason": "အခြားသော/နောက်ထပ် အကြောင်းပြချက် -",
        "contribslink": "ပံ့ပိုး",
        "blocklogpage": "ပိတ်ပင်တားဆီးမှု မှတ်တမ်း",
        "blocklogentry": "[[$1]] ကို $2 ကြာအောင် ပိတ်ပင် တားဆီးလိုက်သည် $3",
+       "blocklogtext": "ဤသည်မှာ အသုံးပြုသူအား ပိတ်ပင်ခြင်းနှင့် ပိတ်ပင်မှုဖယ်ရှားခြင်း ဆောင်ရွက်မှု မှတ်တမ်း ဖြစ်သည်။\nအလိုအလျောက် ပိတ်ပင်ထားသည့် အိုင်ပီလိပ်စာများအား မထည့်သွင်းထားပါ။\nလက်ရှိ တားမြစ်မှုများနှင့် ပိတ်ပင်မှုများ စာရင်းအတွက် [[Special:BlockList|ပိတ်ပင်စာရင်း]]ကို ကြည့်ပါ။",
        "unblocklogentry": "$1 ကို ပိတ်ထားရာမှ ပြန်ဖွင့်ရန်",
        "block-log-flags-anononly": "အမည်မသိ အသုံးပြုသူများသာ",
        "block-log-flags-nocreate": "အကောင့်ဖန်တီးခြင်းကို ပိတ်ထားသည်",
        "ipb_already_blocked": "\"$1\" ကို အစကတည်းက ပိတ်ထားသည်",
        "move-page": "$1 ကို ရွှေ့ရန်",
        "move-page-legend": "စာ​မျက်​နှာ​ကို ရွှေ့ပြောင်းရန်",
-       "movepagetext": "အောက်ပါပုံစံကို အသုံးပြုခြင်းသည် စာမျက်နှာကို အမည်ပြောင်းလဲပေးမည် ဖြစ်ပြီး အမည်သစ်သို့ ယင်း၏ မှတ်တမ်းနှင့်တကွ ရွှေ့ပေးမည် ဖြစ်သည်။\nအမည်ဟောင်းသည် အမည်သစ်သို့ ပြန်ညွှန်းစာမျက်နှာ ဖြစ်လာမည်။\nသင်သည် မူလခေါင်းစဉ်သို့ ပြန်ညွှန်းများကို အလိုအလျောက် အပ်ဒိတ် update လုပ်နိုင်သည်။\nအကယ်၍ မပြုလုပ်လိုပါက [[Special:DoubleRedirects|နှစ်ခါထပ်]][[Special:BrokenRedirects|ပြန်ညွှန်း အပျက်များ]] ကို မှတ်သားရန် မမေ့ပါနှင့်။\nလင့်များ ညွှန်းလိုသည့် နေရာသို့ ညွှန်ပြနေရန် သင့်တွင် တာဝန် ရှိသည်။\n\nအကယ်၍ ခေါင်းစဉ်အသစ်တွင် စာမျက်နှာတစ်ခု ရှိနှင့်ပြီး ဖြစ်ပါက (သို့) ယင်းစာမျက်နှာသည် အလွတ်မဖြစ်ပါက (သို့) ပြန်ညွှန်းတစ်ခု မရှိပါက (သို့) ယခင်က ပြုပြင်ထားသော မှတ်တမ်း မရှိပါက စာမျက်နှာသည် <strong>ရွေ့မည်မဟုတ်</strong> သည်ကို သတိပြုပါ။ \nဆိုလိုသည်မှာ သင်သည် အမှားတစ်ခု ပြုလုပ်မိပါက စာမျက်နှာကို ယခင်အမည်ကို ပြန်လည် ပြောင်းလဲပေးနိုင်သည်။ ရှိပြီသားစာမျက်နှာတစ်ခုကို စာမျက်နှာ အသစ်နှင့် ပြန်အုပ် overwrite ခြင်း မပြုနိုင်။\n\n<strong>မှတ်ချက်။</strong>\nဤသည်မှာ လူဖတ်များသော စာမျက်နှာတစ်ခုဖြစ်ပါက မမျှော်လင့်ထားသော၊ ကြီးမားသော အပြောင်းအလဲတစ်ခု ဖြစ်ပေါ်လာနိုင်သည်။\nထို့ကြောင့် ဆက်လက် မဆောင်ရွက်မီ သင်သည် နောက်ဆက်တွဲ အကျိုးဆက်များကို နားလည်ကြောင်း ကျေးဇူးပြု၍ သေချာပါစေ။",
+       "movepagetext": "အောက်ပါပုံစံကို အသုံးပြုခြင်းသည် စာမျက်နှာကို အမည်ပြောင်းလဲပေးမည် ဖြစ်ပြီး အမည်သစ်သို့ ယင်း၏ မှတ်တမ်းနှင့်တကွ ရွှေ့ပေးမည် ဖြစ်သည်။\nအမည်ဟောင်းသည် အမည်သစ်သို့ ပြန်ညွှန်းစာမျက်နှာ ဖြစ်လာမည်။\nသင်သည် မူလခေါင်းစဉ်သို့ ပြန်ညွှန်းများကို အလိုအလျောက် အပ်ဒိတ် update လုပ်နိုင်သည်။\nအကယ်၍ မပြုလုပ်လိုပါက [[Special:DoubleRedirects|နှစ်ဆင့်ပြန်ညွှန်းများ]] သို့မဟုတ် [[Special:BrokenRedirects|ပြန်ညွှန်း အပျက်များ]] ကို မှတ်သားရန် မမေ့ပါနှင့်။\nလင့်များ ညွှန်းလိုသည့် နေရာသို့ ညွှန်ပြနေရန် သင့်တွင် တာဝန် ရှိသည်။\n\nအကယ်၍ ခေါင်းစဉ်အသစ်တွင် စာမျက်နှာတစ်ခု ရှိနှင့်ပြီး ဖြစ်ပါက (သို့) ယင်းစာမျက်နှာသည် အလွတ်မဖြစ်ပါက (သို့) ပြန်ညွှန်းတစ်ခု မရှိပါက (သို့) ယခင်က ပြုပြင်ထားသော မှတ်တမ်း မရှိပါက စာမျက်နှာသည် <strong>ရွေ့မည်မဟုတ်</strong> သည်ကို သတိပြုပါ။ \nဆိုလိုသည်မှာ သင်သည် အမှားတစ်ခု ပြုလုပ်မိပါက စာမျက်နှာကို ယခင်အမည်ကို ပြန်လည် ပြောင်းလဲပေးနိုင်သည်။ ရှိပြီသားစာမျက်နှာတစ်ခုကို စာမျက်နှာ အသစ်နှင့် ပြန်အုပ် overwrite ခြင်း မပြုနိုင်။\n\n<strong>မှတ်ချက်။</strong>\nဤသည်မှာ လူဖတ်များသော စာမျက်နှာတစ်ခုဖြစ်ပါက မမျှော်လင့်ထားသော၊ ကြီးမားသော အပြောင်းအလဲတစ်ခု ဖြစ်ပေါ်လာနိုင်သည်။\nထို့ကြောင့် ဆက်လက် မဆောင်ရွက်မီ သင်သည် နောက်ဆက်တွဲ အကျိုးဆက်များကို နားလည်ကြောင်း ကျေးဇူးပြု၍ သေချာပါစေ။",
+       "movepagetext-noredirectfixer": "အောက်ပါပုံစံကို အသုံးပြုခြင်းသည် စာမျက်နှာကို အမည်ပြောင်းလဲပေးမည် ဖြစ်ပြီး အမည်သစ်သို့ ယင်း၏ မှတ်တမ်းနှင့်တကွ ရွှေ့ပေးမည် ဖြစ်သည်။\n[[Special:DoubleRedirects|နှစ်ဆင့်ပြန်ညွှန်းများ]] သို့မဟုတ် [[Special:BrokenRedirects|ပြန်ညွှန်း အပျက်များ]] ကို စစ်ဆေးရန် မမေ့ပါနှင့်။\nလင့်ခ်များ ညွှန်းလိုသည့် နေရာသို့ ညွှန်ပြနေရန် သင့်တွင် တာဝန် ရှိသည်။\n\nအကယ်၍ ခေါင်းစဉ်အသစ်တွင် စာမျက်နှာတစ်ခု ရှိနေနှင့်ပြီး ပြန်ညွှန်းတစ်ခု မရှိပါက သို့မဟုတ် ယခင်က ပြုပြင်ထားသော မှတ်တမ်း ရှိနေပါက စာမျက်နှာသည် <strong>ရွေ့မည်မဟုတ်</strong> သည်ကို သတိပြုပါ။ \nဆိုလိုသည်မှာ သင်သည် အမှားတစ်ခု ပြုလုပ်မိပါက စာမျက်နှာကို ယခင်အမည်ကို ပြန်လည် ပြောင်းလဲပေးနိုင်သည်။ ရှိပြီသားစာမျက်နှာတစ်ခုကို စာမျက်နှာ အသစ်နှင့် ပြန်အုပ် overwrite ခြင်း မပြုနိုင်။\n\n<strong>မှတ်ချက်။</strong>\nဤသည်မှာ လူဖတ်များသော စာမျက်နှာတစ်ခုဖြစ်ပါက မမျှော်လင့်ထားသော၊ ကြီးမားသော အပြောင်းအလဲတစ်ခု ဖြစ်ပေါ်လာနိုင်သည်။\nထို့ကြောင့် ဆက်လက် မဆောင်ရွက်မီ သင်သည် နောက်ဆက်တွဲ အကျိုးဆက်များကို နားလည်ကြောင်း ကျေးဇူးပြု၍ သေချာပါစေ။",
        "movepagetalktext": "ဤအကွက်ကို အမှန်ခြစ်လိုက်ခြင်းဖြင့် ဗလာမဟုတ်သော ဆွေးနွေးချက်စာမျက်နှာသည် ရှိနှင့်ပြီး မဟုတ်လျှင် ဆက်နွယ်နေသော ဆွေးနွေးချက် စာမျက်နှာကို ခေါင်းစဉ်အသစ်သို့  အလိုအလျောက် ရွှေ့ပစ်မည် ဖြစ်သည်။\n\nဤကိစ္စရပ်တွင် သင် ဆန္ဒရှိလျှင် စာမျက်နှာကို မိမိကိုယ်တိုင် သွားရောက်ရွှေ့ပြောင်း ပေါင်းစပ်နိုင်သည်။",
        "newtitle": "ခေါင်းစဉ်အသစ်:",
        "move-watch": "မူရင်းစာမျက်နှာနှင့် ဦးတည်ထားသော စာမျက်နှာတို့ကို စောင့်ကြည့်ရန်",
        "pagemovedsub": "ပြောင်းရွှေ့ခြင်းအောင်မြင်သည်",
        "movepage-moved": "'''\"$1\" ကို \"$2\" သို့ ရွှေ့ပြီးဖြစ်သည်'''",
        "movepage-moved-redirect": "ပြန်ညွှန်းတစ်ခုကို ဖန်တီးပြီးဖြစ်သည်။",
+       "movepage-moved-noredirect": "ပြန်ညွှန်းဖန်တီးခြင်းအား ချေဖျက်ပြီး ဖြစ်သည်။",
        "articleexists": "ထိုအမည်ဖြင့် စာမျက်နှာတစ်ခု ရှိနှင့်ပြီးဖြစ်သည် (သို့) သင်ရွေးလိုက်သော အမည်သည် တရားမဝင်ပါ။\nကျေးဇူးပြု၍ အခြားအမည်တစ်ခုကို ရွေးပေးပါ။",
        "movetalk": "ယှက်နွယ်နေသော ဆွေးနွေးချက်စာမျက်နှာများကို ရွှေ့ရန်",
        "movepage-page-moved": "စာမျက်နှာ $1 ကို $2 သို့ ရွှေ့ပြီးပြီ ဖြစ်သည်။",
        "movepage-page-unmoved": "စာမျက်နှာ $1 ကို $2 သို့ ရွှေ့မရနိုင်ပါ။",
        "movelogpage": "ရွှေ့ပြောင်းခြင်း မှတ်တမ်း",
+       "movelogpagetext": "အောက်ပါတို့သည် စာမျက်နှာ ရွေ့ပြောင်းမှုများ အားလုံး စာရင်း ဖြစ်သည်။",
        "movereason": "အ​ကြောင်း​ပြ​ချက် -",
        "revertmove": "ပြောင်းရန်",
        "delete_and_move_confirm": "ဟုတ်ပါသည်။ စာမျက်နှာကို ဖျက်ပါ။",
        "immobile-source-page": "ဤစာမျက်နှာကို ရွှေ့မရပါ။",
+       "move-leave-redirect": "ပြန်ညွှန်းတစ်ခု ချန်ထားရန်",
        "export": "စာမျက်နှာများကို Export ထုတ်ရန်",
        "export-submit": "Export ထုတ်ရန်",
        "export-addcattext": "ကဏ္ဍမှ စာမျက်နှာများကို ပေါင်းထည့်ရန် -",
        "revdelete-restricted": "အက်ဒမင်များသို့ ကန့်သတ်ချက်များ သက်ရောက်ရန်",
        "revdelete-unrestricted": "အက်ဒမင်များအတွက် ကန့်သတ်ချက်များကို ဖယ်ရှားရန်",
        "logentry-move-move": "$3 စာမျက်နှာကို $4 သို့ $1က {{GENDER:$2|ရွှေ့ခဲ့သည်}}",
+       "logentry-move-move-noredirect": "$3 မှ $4 သို့ စာမျက်နှာကို ပြန်ညွှန်းချန်မထားပဲ $1 {{GENDER:$2|က ရွှေ့ခဲ့သည်}}",
        "logentry-newusers-create": "အသုံးပြုသူအကောင့် $1 ကို {{GENDER:$2|ဖန်တီးခဲ့သည်}}",
        "logentry-upload-upload": "$1 သည် $3 ကို {{GENDER:$2|upload တင်ခဲ့သည်}}",
        "rightsnone": "(ဘာမှမရှိ)",
index 6728fed..dc66e13 100644 (file)
        "createacct-email-ph": "شه ایمیل ره باوّین",
        "createaccountmail": "ایمیل جه",
        "createaccountreason": "دلیل:",
-       "createacct-captcha": "امنیتی چک",
-       "createacct-imgcaptcha-ph": "این بنویشته‌یی که بالا وینّی ره بنویسین",
        "createacct-submit": "شه اکانت ره بسازین",
        "createacct-benefit-heading": "{{SITENAME}} ره شِمه واری آدِمون بِساتنه",
        "createacct-benefit-body1": "{{PLURAL:$1|دچی‌ین}}",
        "recentchanges-label-bot": "اینتا ویرایش‌ره اته ربات انجام هدائه",
        "recentchanges-label-unpatrolled": "این دَچی‌یه ره هَنتا بررسی نَکاردنه.",
        "recentchanges-label-plusminus": "صفحه‌ی ِقایده انده بایت تغییر هاکرده",
-       "recentchanges-legend-heading": "'''اختصارون:'''",
+       "recentchanges-legend-heading": "<strong>اختصارون:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|تازه بساته صفحه‌ئون]] ره هم هارشین)",
        "rclistfrom": "نِمایش تازه‌دگاردسته‌ئون با شروع از $3 $2",
        "rcshowhideminor": "پچیک دچی‌یه‌ئون $1",
index ac1f680..69be88a 100644 (file)
        "tagline": "Ùi {{SITENAME}}",
        "help": "Soat-bêng-su",
        "search": "Chhiau-chhoē",
-       "searchbutton": "Chhiau",
+       "searchbutton": "Chh",
        "go": "Lâi-khì",
        "searcharticle": "Lâi-khì",
        "history": "Ia̍h le̍k-sú",
        "disclaimers": "Bô-hū-chek seng-bêng",
        "disclaimerpage": "Project:It-poaⁿ ê seng-bêng",
        "edithelp": "Án-choáⁿ siu-kái",
+       "helppage-top-gethelp": "soat-bêng",
        "mainpage": "Thâu-ia̍h",
        "mainpage-description": "Thâu-ia̍h",
        "policy-url": "Project:Chèng-chhek",
        "toc": "Bo̍k-lo̍k",
        "showtoc": "khui",
        "hidetoc": "siu",
-       "collapsible-collapse": "Siu",
-       "collapsible-expand": "Khui",
+       "collapsible-collapse": "Am",
+       "collapsible-expand": "Hiàn",
        "confirmable-confirm": "{{GENDER:$1|你}}敢確定唅?",
        "confirmable-yes": "著啦",
        "confirmable-no": "無啦!毋是!",
        "searchprofile-advanced": "chìn-chi̍t-pō͘",
        "searchprofile-articles-tooltip": "Tī $1 chhoé",
        "searchprofile-images-tooltip": "Chhoé tóng-àn",
-       "searchprofile-everything-tooltip": "Chhiau choân-pō͘ (pau-koat thó-lūn-ia̍h)",
+       "searchprofile-everything-tooltip": "Chh choân-pō͘ (pau-koat thó-lūn-ia̍h)",
        "searchprofile-advanced-tooltip": "佇你家己設的名空間內底揣",
        "search-result-size": "$1 ({{PLURAL:$2|1 jī-goân|$2 jī-goân}})",
        "search-redirect": "(轉去 $1)",
        "search-section": "(toān-lo̍h $1)",
        "searchall": "choân-pō·",
        "showingresults": "Ē-kha tùi #<b>$2</b> khai-sí hián-sī <b>$1</b> hāng kiat-kó.",
-       "search-nonefound": "揣無",
+       "search-nonefound": "Chhoē m̄ tio̍h",
        "powersearch-legend": "Kiám-sek",
        "preferences": "Siat-tēng",
        "mypreferences": "Góa ê siat-tēng",
        "grouppage-sysop": "{{ns:project}}:Hêng-chèng jîn-oân",
        "grouppage-bureaucrat": "{{ns:project}}:Koaⁿ-liâu",
        "right-writeapi": "用API寫",
-       "newuserlogpage": "開賬戶日誌",
+       "newuserlogpage": "khui kháu-chō ji̍t-chì",
        "rightslogtext": "Chit-ê log lia̍t-chhut kái-piàn iōng-chiá koân-lī ê tōng-chok.",
        "action-edit": "Siu-kái chit ia̍h",
        "nchanges": "$1 {{PLURAL:$1|kái|kái}}",
        "recentchanges-label-minor": "Che sī sió siu-kái",
        "recentchanges-label-bot": "Che sī ki-khì-lâng kái--ê",
        "recentchanges-label-unpatrolled": "這个編輯抑無巡視過",
-       "recentchanges-label-plusminus": "彼頁改了;精差的位元組",
-       "recentchanges-legend-heading": "'''Ké-soeh:'''",
+       "recentchanges-label-plusminus": "Hit ia̍h kái liáu; cheng-chha ê ūi-goân-cho͘",
+       "recentchanges-legend-heading": "<strong>Ké-soeh:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (請參考[[Special:NewPages|新頁清單]])",
        "rcnotefrom": "Ē-kha sī <b>$2</b> kàu taⁿ ê kái-piàn (ke̍k-ke hián-sī <b>$1</b> hāng).",
        "rclistfrom": "Hián-sī tùi $3 $2 kàu taⁿ ê sin kái-piàn",
        "rcshowhideminor": "$1 sió siu-kái",
-       "rcshowhideminor-hide": "藏起來",
+       "rcshowhideminor-show": "hiàn",
+       "rcshowhideminor-hide": "am",
        "rcshowhidebots": "$1 機器儂",
-       "rcshowhidebots-show": "",
+       "rcshowhidebots-show": "hiàn",
        "rcshowhideliu": "$1 teng-ji̍p ê iōng-chiá",
-       "rcshowhideliu-hide": "藏起來",
+       "rcshowhideliu-show": "hiàn",
+       "rcshowhideliu-hide": "am",
        "rcshowhideanons": "$1 bû-bêng-sī",
-       "rcshowhideanons-hide": "藏起來",
+       "rcshowhideanons-show": "hiàn",
+       "rcshowhideanons-hide": "am",
        "rcshowhidemine": "$1 góa ê pian-chi̍p",
-       "rcshowhidemine-hide": "藏起來",
+       "rcshowhidemine-show": "hiàn",
+       "rcshowhidemine-hide": "am",
        "rclinks": "Hían-sī $2 ji̍t lāi siōng sin ê $1 hāng kái-piàn<br />$3",
        "diff": "Cheng-chha",
        "hist": "ls",
        "minoreditletter": "~",
        "newpageletter": "!",
        "boteditletter": "b",
-       "rc-change-size-new": "改了後;變做$1{{PLURAL:$1|位元}}",
+       "rc-change-size-new": "Kái liáu āu, piàn-choè $1 {{PLURAL:$1|ūi-goân}}",
        "recentchangeslinked": "Siong-koan ê kái-piàn",
        "recentchangeslinked-feed": "Siong-koan ê kái-piàn",
        "recentchangeslinked-toolbox": "Siong-koan ê kái-piàn",
-       "recentchangeslinked-title": "佮 \"$1\" 相關的改變",
+       "recentchangeslinked-title": "kap \"$1\" siong-koan ê kái-piàn",
        "recentchangeslinked-summary": "這是有相接到指定頁(抑是指定分類的所有成員),而且最近家己頁的內容有改過的清單。\n遐的頁[[Special:Watchlist|佇你的監視清單]]會用<strong>粗體</strong> 標示。",
        "recentchangeslinked-page": "Ia̍h ê miâ:",
        "upload": "Kā tóng-àn chiūⁿ-bāng",
        "filehist-thumbtext": "$1版本的細圖",
        "filehist-user": "Iōng-chiá",
        "filehist-dimensions": "寸尺",
-       "filehist-comment": "說明",
+       "filehist-comment": "soat-bêng",
        "imagelinks": "tóng-àn sù-iōng ê chōng-hòng",
        "linkstoimage": "ē-kha {{PLURAL:$1|ê ia̍h}} ū iōng tio̍h chit ê iáⁿ-siōng:",
        "nolinkstoimage": "Bô poàⁿ ia̍h liân kàu chit tiuⁿ iáⁿ-siōng.",
        "version": "Pán-pún",
        "specialpages": "Te̍k-sû-ia̍h",
        "tag-filter": "[[Special:Tags|Piau-chhiam]] chhoē mi̍h:",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|个標籤}}]]:$2)",
+       "tag-list-wrapper": "([[Special:Tags|$1 ê piau-chhiam]]: $2)",
        "logentry-move-move": "$1 {{GENDER:$2|sóa}} $3 chit ia̍h khì $4",
        "logentry-newusers-create": "已經{{GENDER:$2|開好}}用者口座 $1",
-       "searchsuggest-search": "Chhiau",
+       "searchsuggest-search": "Chh",
        "expandtemplates": "Khok-chhiong pang-bô͘",
        "expand_templates_input": "Su-ji̍p bûn-jī:",
        "expand_templates_output": "Kiat-kó:",
index cc7d313..d1b54bd 100644 (file)
        "moredotdotdot": "Cchiù...",
        "morenotlisted": "Chisto elenco nun è cumpreto.",
        "mypage": "Paggena",
+       "anonuserpage": "Utente scanusciuto",
        "mytalk": "'E chiàcchieriate mmie",
        "anontalk": "Chiacchierate",
        "navigation": "Navigazzione",
        "createaccount-title": "Criazione 'e nu cunto pe' {{SITENAME}}",
        "createaccount-text": "Coccherun ave fatto nu cunto ncoppa {{SITENAME}} ($4) a nomme 'e $2, associato a st'indirizzo 'e posta elettronica. 'A password pe l'utente \"$2\" è abbiàta a comme \"$3\".\nFosse buono 'e trasì ampressa e cagnà 'a password subbeto.\n\nSi 'a criazione d' 'o cunto è stata nu sbaglio, allora putite lassà perde sta mmasciata.",
        "login-throttled": "Songo state fatte troppe tentative 'a trasì dint'a nu periodo troppo curto.\nAspetta nu $1 e prova aròppo.",
-       "login-abort-generic": "'O login tujo nun ha avuto succiesso - Annullato",
+       "login-abort-generic": "'O login vuosto scassaje - Annullato",
        "login-migrated-generic": "'O cunto tuo nun sè mmigrato, e l'username d' 'o tuojo nun esiste cchiù dint'a sta wiki.",
        "loginlanguagelabel": "Lengua: $1",
        "suspicious-userlogout": "'A richiesta 'e disconnessione d' 'a toja è stata negate pecché pare ca fosse mannata 'a nu navigatóre rutto o nu proxy 'e \"caching\".",
        "newpassword": "Password nova:",
        "retypenew": "Ripete 'a password:",
        "resetpass_submit": "Stabbelite 'a password e trasite",
-       "changepassword-success": "'A password è stata cagnata currettamente!",
+       "changepassword-success": "'A password è stata cagnata!",
        "changepassword-throttled": "Songo state fatte troppe tentative 'a trasì.\nAspetta nu $1 apprimma 'e pruvà n'ata vota.",
        "botpasswords": "Password bot",
        "botpasswords-summary": "<em>Password bot</em> premmettesse 'e trasì a n'utente pe' bbìa d'API senza ausà 'e credenziale d'acciesso prencepale 'e ll'utenza. 'E deritte utente disponibbele quanno s'affettuasse l'accesso cu na password 'e bot se ponn'apprisentà lemmetate.\n\nSi nun canuscite 'o mutivo p' 'o quale 'o putite fà, allora può darse ca nun l'avissev'a ffà. Nisciuno avesse maje 'addimannà 'e crià una 'e chiste p' 'e ddà a chille.",
        "botpasswords-insert-failed": "Nun se pò azzeccà 'o nomme bot \"$1\". Fosse stato già azzeccato?",
        "botpasswords-update-failed": "Se scassaje a carrecà 'o nomme bot \"$1\". È stato scancellato?",
        "botpasswords-created-title": "Password bot criata",
-       "botpasswords-created-body": "'A password bot \"$1\" fuje criata cu' succiesso.",
+       "botpasswords-created-body": "'A password bot \"$1\" 'a ll'utente \"$2\" fuje criata.",
        "botpasswords-updated-title": "Password bot agghiurnata",
-       "botpasswords-updated-body": "'A password bot \"$1\" è fuje agghiurnata cu' succiesso.",
+       "botpasswords-updated-body": "'A password bot \"$1\" 'a ll'utente \"$2\" fuje agghiurnata.",
        "botpasswords-deleted-title": "Password bot scancellata",
-       "botpasswords-deleted-body": "'A password bot \"$1\" è stata scancellata.",
+       "botpasswords-deleted-body": "'A password bot \"$1\" 'a ll'utente \"$2\" è stata scancellata.",
        "botpasswords-newpassword": "'A password nòva pe' puté trasì cu <strong>$1</strong> è <strong>$2</strong>. <em>Pe' piacere signatevello chesto pe' ve ffà conzurtaziune future.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider nun è disponibbele.",
        "botpasswords-restriction-failed": "'E restriziune 'e password bot nun ve permettessero st'acciesso.",
        "revdelete-unsuppress": "Scancella 'e limmete ncopp' 'e verziune arripigliate",
        "revdelete-log": "Mutivo:",
        "revdelete-submit": "Applica {{PLURAL:$1|â virziona scigliuta|a 'e virziune scigliute}}",
-       "revdelete-success": "'''Visibbelità d' 'a verziona agghiurnata e apposto.'''",
+       "revdelete-success": "Visibbelità d' 'a verziona agghiurnata e apposto.",
        "revdelete-failure": "'''Int'a sta virziona 'a visibbelità nun se può agghiurnà:'''\n$1",
-       "logdelete-success": "'''Int'a stu riggistro 'a visibbelità è stata scigliuta currettamente.'''",
+       "logdelete-success": "Visebbiletà d' 'o riggistro mpustata.",
        "logdelete-failure": "'''Int'a stu riggistro 'a visibbelità nun se può scegliere:'''\n$1",
        "revdel-restore": "càgna visiblità",
        "pagehist": "Verziune 'e primma",
        "userrights-changeable-col": "Gruppe ca putite cagnà",
        "userrights-unchangeable-col": "Gruppe ca nun putite cagnà",
        "userrights-conflict": "Conflitto 'e cagnamiento 'e deritte utente! Cuntrullate e cunfermate 'e cagnamiente vuoste.",
-       "userrights-removed-self": "Avete rimosso buono 'e deritte vuoste. Picciò nun putite trasì cchiù dint'a sta paggena.",
+       "userrights-removed-self": "Avite rimosso 'e deritte vuoste. Picciò nun putite trasì cchiù dint'a sta paggena.",
        "group": "Gruppo:",
        "group-user": "Utente",
        "group-autoconfirmed": "Utente autocunfermate",
        "uploadstash-summary": "Sta paggena dà l'accesso a 'e file ca songo carrecate o ca stanno pe' se carrecà, ma nun songo pubbrecat'ancora ncopp'a sta wiki. Sti file nun songo visibbele a nisciuno, sulamente a chill'utente ca l'ha carrecato.",
        "uploadstash-clear": "Pulezza 'e file annascunnute",
        "uploadstash-nofiles": "Nun tenite file annascunnute.",
-       "uploadstash-badtoken": "L'esecuzione 'e sta azione nun ha avuto successo, forse pecché 'e credenziale 'e cagnamiento so' mmaturate. Prova n'ata vota.",
-       "uploadstash-errclear": "'A pulezzia d' 'e file nun ha avuto successo.",
+       "uploadstash-badtoken": "L'esecuzione 'e sta azione scassaje.\nForse pecché 'e credenziale 'e cagnamiento so' mmaturate.\nPruvate n'ata vota.",
+       "uploadstash-errclear": "'A pulezzia d' 'e file scassaje.",
        "uploadstash-refresh": "Agghiuorna l'elenco d' 'e file",
        "invalid-chunk-offset": "Distanza d' 'a parte nun valida",
        "img-auth-accessdenied": "Acciesso negato",
        "changecontentmodel-title-label": "Titulo d\"a paggena",
        "changecontentmodel-model-label": "Mudello 'e cuntenute nuovo",
        "changecontentmodel-reason-label": "Mutivo:",
+       "changecontentmodel-submit": "Cagnato",
        "changecontentmodel-success-title": "'O mudello 'e cuntenuto fuje cagnato",
        "changecontentmodel-success-text": "'O tipo 'e cuntenut 'e [[:$1]] è stato cagnato.",
        "changecontentmodel-cannot-convert": "'E cuntenute dint'a [[:$1]] nun se ponno scagnà a nu tipo 'e $2.",
        "changecontentmodel-nodirectediting": "'O mudello 'e cuntenute $1 nun suppurtasse 'o cagnamiento diretto",
        "log-name-contentmodel": "Riggistro 'e cagnamiente d' 'o mudello 'e cuntenute",
        "log-description-contentmodel": "Evvente azzeccate c' 'o mudello 'e cuntenute 'e na paggena",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|criaje}} 'a paggena $3 ausanno nu mudell' 'e cuntenute nun-predefinito \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|cagnaje}} 'o mudello 'e cuntenute 'e na paggena $3 'a \"$4\" a \"$5\"",
        "logentry-contentmodel-change-revertlink": "arrepiglia",
        "logentry-contentmodel-change-revert": "arrepiglia",
        "tags-delete-not-allowed": "'E tag ca se so' definite 'a na stensiona nun se ponno scancellà si nun è c' 'a stensiona 'o premmettesse.",
        "tags-delete-not-found": "'O tag $1 nun esiste.",
        "tags-delete-too-many-uses": "'O tag \"$1\" è apprecato a cchiù 'e $2 {{PLURAL:$2|verziona|verziune}}, cosa ca vulesse dicere ca nun se ò scancellà.",
-       "tags-delete-warnings-after-delete": "'O tag \"$1\" s'è scancellato buono, ma {{PLURAL:$2|s'è ncuntrato ll'avviso|se songhe ncuntrate ll'avise}} ccà:",
+       "tags-delete-warnings-after-delete": "'O tag \"$1\" s'è scancellato, ma {{PLURAL:$2|s'è ncuntrato ll'avviso|se songhe ncuntrate ll'avise}} ccà:",
        "tags-activate-title": "Appiccia 'o tag",
        "tags-activate-question": "Vuje state p'appiccià 'o tag \"$1\".",
        "tags-activate-reason": "Mutivo:",
index 0a57320..4bdecee 100644 (file)
        "recentchanges-label-bot": "Denne redigeringen ble gjort av en bot",
        "recentchanges-label-unpatrolled": "Denne redigeringen har ikke blitt patruljert ennå",
        "recentchanges-label-plusminus": "Sidestørrelsen ble endret med dette antallet byte",
-       "recentchanges-legend-heading": "'''Tegnforklaring:'''",
+       "recentchanges-legend-heading": "<strong>Tegnforklaring:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se også [[Special:NewPages|liste over nye sider]])",
        "recentchanges-legend-plusminus": "«(±123)»",
        "recentchanges-submit": "Vis",
index 86f1b2c..e122c0e 100644 (file)
        "recentchanges-label-bot": "Disse bewarking is uutevoerd deur n bot",
        "recentchanges-label-unpatrolled": "Disse bewarking is nog niet nao-ekeken",
        "recentchanges-label-plusminus": "Disse ziedgrootte is mit dit antal bytes ewiezigd",
-       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zie oek de [[Special:NewPages|lieste mit nieje ziejen]])",
        "rcnotefrom": "Dit bin de wiezigingen sinds <strong>$2</strong> (maximum van <strong>$1</strong> wiezigingen).",
        "rclistfrom": "Bekiek wiezigingen vanaof $3 $2",
index d3aae35..ac0d25c 100644 (file)
        "recentchanges-label-bot": "यो सम्पादन बोटद्वारा गरिएको थियो",
        "recentchanges-label-unpatrolled": "यो सम्पादन अहिले सम्म गस्ती गरिएको छैन",
        "recentchanges-label-plusminus": "यति बाइटहरू संख्याले पृष्ठको आकार परिवर्तन भएको छ",
-       "recentchanges-legend-heading": "'''आदर्श वाक्य:'''",
+       "recentchanges-legend-heading": "<strong>आदर्श वाक्य:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नयाँ पृष्ठहरूको सूची]] यो पनि हेर्नुहोस्)",
        "recentchanges-legend-plusminus": "(''±१२३'')",
        "recentchanges-submit": "देखाउनुहोस्",
index b7e4d5b..a3b815b 100644 (file)
        "moredotdotdot": "Meer…",
        "morenotlisted": "Deze lijst is niet compleet.",
        "mypage": "Gebruikerspagina",
+       "anonuserpage": "Onbekende gebruiker",
        "mytalk": "Overleg",
        "anontalk": "Overleg",
        "navigation": "Navigatie",
        "nocookieslogin": "{{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.\nCookies zijn uitgeschakeld in uw browser.\nSchakel deze optie in en probeer het opnieuw.",
        "nocookiesfornew": "De gebruiker is niet gemaakt omdat de bron niet bevestigd kon worden.\nZorg ervoor dat u cookies hebt ingeschakeld, herlaad deze pagina en probeer het opnieuw.",
        "noname": "U hebt geen geldige gebruikersnaam opgegeven.",
-       "loginsuccesstitle": "Aanmelden geslaagd",
+       "loginsuccesstitle": "Aangemeld",
        "loginsuccess": "<strong>U bent nu aangemeld bij {{SITENAME}} als \"$1\".</strong>",
        "nosuchuser": "De gebruiker \"$1\" bestaat niet.\nGebruikersnamen zijn hoofdlettergevoelig.\nControleer de schrijfwijze of [[Special:UserLogin/signup|maak een nieuw gebruiker aan]].",
        "nosuchusershort": "De gebruiker \"$1\" bestaat niet.\nControleer de schrijfwijze.",
        "changecontentmodel-title-label": "Paginanaam",
        "changecontentmodel-model-label": "Nieuw inhoudsmodel",
        "changecontentmodel-reason-label": "Reden:",
+       "changecontentmodel-submit": "Wijzigen",
        "changecontentmodel-success-title": "Het inhoudsmodel is gewijzigd",
        "changecontentmodel-success-text": "Het inhoudstype van [[:$1]] is gewijzigd.",
        "changecontentmodel-cannot-convert": "De inhoud van [[:$1]] kan niet worden omgezet in een type van $2.",
index 6aec91c..d751514 100644 (file)
        "recentchanges-label-bot": "Endringa vart gjord av ein robot",
        "recentchanges-label-unpatrolled": "Endringa er ikkje patruljert enno",
        "recentchanges-label-plusminus": "Storleiken til sida vart endra med så mange byte",
-       "recentchanges-legend-heading": "'''Tyding:'''",
+       "recentchanges-legend-heading": "<strong>Tyding:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sjå dessutan [[Special:NewPages|lista over nye sider]])",
        "recentchanges-submit": "Vis",
        "rcnotefrom": "Nedanfor er endringane gjorde sidan <strong>$2</strong> viste (opp til <strong>$1</strong> stykke)",
index 92ff581..3a68073 100644 (file)
        "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 pagina a cambiat d'aqueste nombre d’octets.",
-       "recentchanges-legend-heading": "'''Legenda :'''",
+       "recentchanges-legend-heading": "<strong>Legenda :</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veire tanben la [[Special:NewPages|lista de las paginas novèlas]]).",
        "rcnotefrom": "Çaijós {{PLURAL:$5|la modificacion efectuada|las modificacions efectuadas}} dempuèi lo <strong>$3, $4</strong> (afichadas fins a <strong>$1</strong>).",
        "rclistfrom": "Afichar las modificacions novèlas dempuèi lo $3 $2",
        "licenses-edit": "Modificar las opcions de licéncia",
        "license-nopreview": "(Previsualizacion impossibla)",
        "upload_source_url": "(lo fichièr qu'avètz causit dempuèi una URL valida e accessibla publicament)",
-       "upload_source_file": "(vòstre fichièr causit dempuèi vòstre ordenador)",
+       "upload_source_file": "(vòstre fichièr causit dempuèi vòstre ordinator)",
        "listfiles-delete": "suprimir",
        "listfiles-summary": "Aquesta pagina especiala permet de far la lista de totes los fichièrs importats.",
        "listfiles_search_for": "Recèrca del mèdia nomenat :",
index da3e1a3..486d5e9 100644 (file)
        "recentchanges-label-bot": "Tämän kohenduksen on luadinuh bot",
        "recentchanges-label-unpatrolled": "Tädä korjuandua vie ei ole tarkistettu",
        "recentchanges-label-plusminus": "Sivu on kazvanuh [] baital",
-       "recentchanges-legend-heading": "'''Legendu:'''",
+       "recentchanges-legend-heading": "<strong>Legendu:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kačo sežo [[Special:NewPages|uuzien sivuloin listu]])",
        "rclistfrom": "Ozuta jälgimäzet muutokset algajen $2, $3",
        "rcshowhideminor": "$1 pienet kohendukset",
index c203837..b728295 100644 (file)
        "showpreview": "ଦେଖଣା [Preview]",
        "showdiff": "ବଦଳଗୁଡ଼ିକ ଦେଖାଇବେ",
        "blankarticle": "<strong>ଚେତାବନୀ:</strong> ଆପଣ ସମ୍ପାଦନା କରୁଥିବା ଏହି ପୃଷ୍ଠାଟି ଫାଙ୍କା ଅଛି ।\nଯଦି ଆପଣ \"{{int:savearticle}}\" ଉପରେ ଆଉଥରେ କ୍ଲିକ କରନ୍ତି, ପୃଷ୍ଠାଟି କୌଣସି ବିଷୟବସ୍ତୁ ନଥାଇ ତିଆରି ହୋଇଯିବ ।",
-       "anoneditwarning": "<strong>ସାବଧାନ:</strong> ଆପଣ ଲଗ-ଇନ କରିନାହାନ୍ତି । ଅଧିକ ସମ୍ପାଦନା କଲେ ଆପଣଙ୍କ IP Address ଟି ସମସ୍ତଙ୍କୁ ଦେଖାଯିବ । <strong>[$1ଲଗ ଇନ କଲେ]</strong> କିମ୍ବା <strong>[$2 ନୂଆ ଖାତାଟିଏ ତିଆରି କଲେ]</strong>, ଆପଣଙ୍କ ସମ୍ପାଦନାର ଶ୍ରେୟ ଅନ୍ୟାନ୍ୟ ସୁବିଧା ସହିତ ଆପଣଙ୍କ ଇଉଜର ନାମରେ ଦିଆହେବ ।",
+       "anoneditwarning": "<strong>ସାବଧାନ:</strong> ଆପଣ ଲଗ-ଇନ କରିନାହାନ୍ତି । ଅଧିକ ସମ୍ପାଦନା କଲେ ଆପଣଙ୍କ IP Address ଟି ସମସ୍ତଙ୍କୁ ଦେଖାଯିବ । <strong>[$1 ଲଗ ଇନ କଲେ]</strong> କିମ୍ବା <strong>[$2 ନୂଆ ଖାତାଟିଏ ତିଆରି କଲେ]</strong>, ଆପଣଙ୍କ ସମ୍ପାଦନାର ଶ୍ରେୟ ଅନ୍ୟାନ୍ୟ ସୁବିଧା ସହିତ ଆପଣଙ୍କ ଇଉଜର ନାମରେ ଦିଆହେବ ।",
        "anonpreviewwarning": "''ଆପଣ ଲଗ ଇନ କରି ନାହାନ୍ତି । ବଦଳକରି ସାଇତିଲେ ଆପଣଙ୍କର IP ଠିକଣା ଏହି ପୃଷ୍ଠାର ଇତିହାସରେ ସାଇତା ହୋଇଯିବ ।''",
        "missingsummary": "'''ଚେତାବନୀ:''' ଆପଣ ଏକ ସମ୍ପାଦନା ସାରକଥା ଦେଇନାହାନ୍ତି ।\nଯଦି ଆପଣ \"{{int:savearticle}}\"ରେ ଆଉଥରେ କ୍ଲିକ କରନ୍ତି, ତେବେ ଆପଣଙ୍କ ବଦଳ ସାରକଥା ବିନା ସାଇତା ହୋଇଯିବ ।",
        "selfredirect": "<strong>ସାବଧନ :</strong> ଆପଣ ଏହି ପୃଷ୍ଠାଟିକୁ ତା ମଧ୍ୟକୁ ଲେଇଟାଉଛନ୍ତି । ଆପଣ ବୋଧ ହୁଏ ଭୁଲ ଲକ୍ଷସ୍ଥଳ ଦେଇଛନ୍ତି କିମ୍ବା ଭୁଲ ପୃଷ୍ଠଟିକୁ ବଦଳାଉଛନ୍ତି । \nଆପଣ ଯଦି \"{{int:savearticle}}\"ରେ ଆଉଥରେ କ୍ଲିକ କରିବେ ତେବେ ଲେଉଟାଣିଟି ଯାହା ହେଲେ ସାଇତା ହେଇଯିବା ।",
        "recentchanges-label-bot": "ଏହି ବଦଳଟି ଜଣେ '''ବଟ'''ଙ୍କ ଦେଇ କରାଯାଇଥିଲା",
        "recentchanges-label-unpatrolled": "ଏହି ବଦଳଟିକୁ ଏ ଯାଏଁ ପରଖା ଯାଇନାହିଁ",
        "recentchanges-label-plusminus": "ଏହି ବାଇଟ ତଥ୍ୟରୁ ଏଇ ପୃଷ୍ଠାର ଆକାର ବଦଳ",
-       "recentchanges-legend-heading": "'''ଆକଳନ:'''",
+       "recentchanges-legend-heading": "<strong>ଆକଳନ:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}  (ଆହୁରି ଦେଖନ୍ତୁ: [[Special:NewPages|ନୂଆ ପୃଷ୍ଠାମାନଙ୍କ ତାଲିକା]])",
        "rcnotefrom": "<strong>$3, $4</strong> ପରଠାରୁ {{PLURAL:$5|ବଦଳଟି|ବଦଳଗୁଡ଼ିକ}} ତଳେ ଦିଆଗଲା (<strong>$1</strong> ଯାଏ ଦିଆଗଲା) ।",
        "rclistfrom": "$3 $2ରୁ ଆରମ୍ଭ କରି ନୂଆ ବଦଳଗୁଡ଼ିକ ଦେଖାଇବେ",
index 1dbdf8a..460665e 100644 (file)
        "recentchanges-label-minor": "Ай у чысыл ивд",
        "recentchanges-label-bot": "Ацы ивд бот сарæзта",
        "recentchanges-label-unpatrolled": "Ацы ивд нырмæ нæу фидар гонд",
-       "recentchanges-legend-heading": "'''Легендæ:'''",
+       "recentchanges-legend-heading": "<strong>Легендæ:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (уый йеддæмæ фен [[Special:NewPages|ног фæрсты номхыгъд]])",
        "rcnotefrom": "Бындæр сты æвдыст ивдтытæ '''$2'''-æй ('''{{grammar:genitive|$1}}''' йонг).",
        "rclistfrom": "Равдисын ивдтытæ амæй фæстæ: $3 $2",
index 0363c07..407e9b9 100644 (file)
        "recentchanges-label-bot": "ਇਹ ਸੋਧ ਇੱਕ ਬੋਟ ਦੁਆਰਾ ਕੀਤੀ ਗਈ ਸੀ",
        "recentchanges-label-unpatrolled": "ਇਹ ਫੇਰ-ਬਦਲ ਹਾਲੇ ਵੇਖਿਆ ਨਹੀਂ ਗਿਆ",
        "recentchanges-label-plusminus": "ਸਫ਼ੇ ਵਿੱਚ ਇੰਨੀਆਂ ਬਾਈਟਾਂ ਦੀ ਤਬਦੀਲੀ ਹੋਈ",
-       "recentchanges-legend-heading": "'''ਟੀਕਾ:'''",
+       "recentchanges-legend-heading": "<strong>ਟੀਕਾ:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|ਨਵੇਂ ਸਫ਼ਿਆਂ ਦੀ ਸੂਚੀ]] ਵੀ ਵੇਖੋ)",
        "recentchanges-legend-plusminus": "(''±੧੨੩'')",
        "recentchanges-submit": "ਦਿਖਾਓ",
index c39ce4c..5c0ab95 100644 (file)
        "createacct-realname": "Wie heschd (mugschds awwa nedd)",
        "createaccountreason": "Grund:",
        "createacct-reason": "Bgrindung",
-       "createacct-captcha": "Sischahaidsbriefung",
-       "createacct-imgcaptcha-ph": "Gebbde Tegschd oi, wu owwe seje duschd",
        "createacct-submit": "Leschda ä Kondo oa",
        "createacct-another-submit": "Leschda ä onnares Kondo oa",
        "createacct-benefit-heading": "{{SITENAME}} wead vun Laid wie dia gmachd.",
        "recentchanges-label-bot": "Ännarunge duaschn Bod",
        "recentchanges-label-unpatrolled": "Die Ännarung isch noch nedd iwwabriefd worre",
        "recentchanges-label-plusminus": "Ännarung vunde Saidegreeß in Bytes",
-       "recentchanges-legend-heading": "'''Bildtegschd:'''",
+       "recentchanges-legend-heading": "<strong>Bildtegschd:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (gugg a uff [[Special:NewPages|Lischd vun naije Saide]])",
        "rcnotefrom": "Unne sinn Ännarunge said <strong>$2<-strong> (bis <strong>$1<-strong>).",
        "rclistfrom": "Zaisch die ledschde Ännarunge ab $3 $2",
        "unusedcategoriestext": "Die Sachgrubb hodds, a wonnse vun känna onnare Said odda Sachgrubb gnumme werd.",
        "pager-newer-n": "{{PLURAL:$1|negschd 1|negschd $1}}",
        "pager-older-n": "{{PLURAL:$1|vorisch 1|vorische $1}}",
+       "apisandbox-api-disabled": "Die API isch uffm Wiki abgschdelld worre.",
        "booksources": "Buchgwelle",
        "booksources-search-legend": "Noch Buchgwelle gugge",
        "booksources-search": "Gugg",
        "movepagetext": "Midm Formad konnschd ä Said en naije Nome gewwe, debai werrem alli alde Ausgawe uffde nai Nome vaschowe.\nAusm alde Nome werd e Waidalaidungssaid zum naije Nome.\nWaidalaidungssaide, wu uffde ald Nome umlaide dun, konnschd vun allä uffde naischde Schdond bringe.\nWonndes ned willschd, guggschd uff [[Special:DoubleRedirects|dobbldi]] odda [[Special:BrokenRedirects|kabuddi Waidalaidunge]].\nSoasch dfia, dass Linggs waida uffdie rischdische Saide fiehan.\n\nGebb Achd, dass die Said '''ned''' vaschowe werd, wonns schunä Said midm naije Nome hod, außa wonnse lea isch odda e Waidalaidung.\nDes heeßd, Du konnschd ke Said, wus schun gibbd, iwwaschraiwe.\n\n'''BAßMAUFF!'''\nDes isch e wischdischi Ännarung fa e Said un konn zimlisch uuerwaaded soi fa wischdischi Saide;\nmach des bloß, wonn die Folsche vunde Maßnohm a abschedze konnschd.",
        "movepagetext-noredirectfixer": "Middm Foamula unne koschd die Said nai bnenne, wonnse midde gonse Gschischd uffn naije Noame bwesche duschd.\nDe ald Tidl weadä Said midd änna Waidalaidung uff die Said werre.\nBass uff unn gugg uff [[Special:DoubleRedirects|dobbelde]] odda [[Special:BrokenRedirects|kabudde Waidalaidunge]]. Du bischd dvoa vaondwoadlisch, dass Ling'gs uffs rischdische zaische dun.\n\nBass uff, die Said wead <strong>nedd</strong> vaschowe, wonns schun ä Said gewwe dud, wude selwe Noame hodd, aussa, s'isch ä Waidalaidung ohne Gschischd.\nDes heesd, wonnän Fehla gmschd hoschd, konschd ä Said zrigg. Awwa konschd kä Said iwwaschraiwe, wus schun hodd.\n\n<strong>Bassma uff, Beaschl!</strong>\nDes konn schlimme Folsche fa b'liewde Saide hawwe. Saida wiaglisch sischa, dass a alles was do due wilschd, a vaschdonne hoschd. Odda losses sunschd bessa soi.",
        "movepagetalktext": "D Dischbediersaid werd ach mid verschowe, '''ausser:'''\n* Du verschiebsch die Saide in e annere Namensraum, odder\n* s gebbt schun e Dischbediersaid mi dem Name, orrer\n* Du wählsch unne d Option, se nid z verschiewe.\n\nIn denne Fäll misst mer d Dischbediersaid vun Hand kopiere.",
-       "movearticle": "Said vaschiewe:",
        "newtitle": "Zum naije Didl:",
        "move-watch": "Die Said beowachde",
        "movepagebtn": "Said vaschiewe",
        "movelogpage": "Vaschiewungs-Logbuch",
        "movereason": "Grund:",
        "revertmove": "Zurigg vaschiewe",
-       "delete_and_move": "Lesche un Verschiewe",
        "delete_and_move_confirm": "Ja, Said lesche",
        "export": "Saide rausgewwe",
        "exportcuronly": "Bloß die ledschd Ännarung vunde Said exboadiere",
index 8fb4001..cb6bd27 100644 (file)
@@ -81,7 +81,8 @@
                        "Doctore",
                        "PiotrAntosz",
                        "The Polish",
-                       "Expert3222"
+                       "Expert3222",
+                       "Mateuszek045"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "moredotdotdot": "Więcej...",
        "morenotlisted": "Nie jest to kompletna lista.",
        "mypage": "Strona",
+       "anonuserpage": "Użytkownik anonimowy",
        "mytalk": "Dyskusja",
        "anontalk": "Dyskusja",
        "navigation": "Nawigacja",
        "nocookieslogin": "{{SITENAME}} wykorzystuje ciasteczka do przechowywania informacji o zalogowaniu się przez użytkownika.\nMasz obecnie w przeglądarce wyłączoną obsługę ciasteczek.\nSpróbuj ponownie po jej włączeniu.",
        "nocookiesfornew": "Konto użytkownika nie zostało utworzone, ponieważ nie można było potwierdzić jego źródła.\nUpewnij się, że masz włączoną obsługę ciasteczek, przeładuj stronę i spróbuj ponownie.",
        "noname": "To nie jest poprawna nazwa użytkownika.",
-       "loginsuccesstitle": "Zalogowano pomyślnie",
+       "loginsuccesstitle": "Zalogowano",
        "loginsuccess": "'''{{GENDER:|Zalogowałeś się|Zalogowałaś się|Zalogowano}} do {{GRAMMAR:D.lp|{{SITENAME}}}} jako „$1”.'''",
        "nosuchuser": "Brak użytkownika o nazwie „$1”.\nW nazwie użytkownika ma znaczenie wielkość znaków.\nSprawdź pisownię lub [[Special:UserLogin/signup|utwórz nowe konto]].",
        "nosuchusershort": "Brak użytkownika o nazwie „$1”.\nSprawdź poprawność pisowni.",
        "newpassword": "Nowe hasło:",
        "retypenew": "Powtórz nowe hasło:",
        "resetpass_submit": "Ustaw hasło i zaloguj się",
-       "changepassword-success": "Twoje hasło zostało pomyślnie zmienione!",
+       "changepassword-success": "Twoje hasło zostało zmienione!",
        "changepassword-throttled": "Ostatnio zbyt wiele razy próbowałeś zalogować się na to konto.\nOdczekaj $1, zanim ponowisz próbę.",
+       "botpasswords": "Hasła bota",
        "botpasswords-label-appid": "Nazwa bota:",
        "botpasswords-label-create": "Utwórz",
        "botpasswords-label-update": "Aktualizuj",
        "botpasswords-label-cancel": "Anuluj",
        "botpasswords-label-delete": "Usuń",
        "botpasswords-label-resetpassword": "Zresetuj hasło",
+       "botpasswords-label-grants-column": "Przyznane",
        "resetpass_forbidden": "Hasła nie mogą zostać zmienione",
        "resetpass-no-info": "Musisz być zalogowany, by uzyskać bezpośredni dostęp do tej strony.",
        "resetpass-submit-loggedin": "Zmień hasło",
        "revdelete-unsuppress": "Wyłącz utajnianie dla odtwarzanej historii zmian",
        "revdelete-log": "Powód:",
        "revdelete-submit": "Zaakceptuj dla {{PLURAL:$1|wybranej|wybranych}} wersji",
-       "revdelete-success": "'''Uaktualniono widoczność wersji.'''",
+       "revdelete-success": "Uaktualniono widoczność wersji.",
        "revdelete-failure": "'''Widoczność wersji nie może zostać uaktualniona – '''\n$1",
-       "logdelete-success": "'''Zmieniono widoczność zdarzeń.'''",
+       "logdelete-success": "Zmieniono widoczność zdarzeń.",
        "logdelete-failure": "'''Widoczność rejestru nie może zostać ustawiona – '''\n$1",
        "revdel-restore": "zmień widoczność",
        "pagehist": "Historia edycji strony",
        "gender-female": "kobieta",
        "prefs-help-gender": "Podanie płci nie jest obowiązkowe. Jeśli zdecydujesz się ją określić, oprogramowanie dostosuje do niej interfejs. Informacja o Twojej płci będzie widoczna dla wszystkich.",
        "email": "E‐mail",
-       "prefs-help-realname": "Imię i nazwisko jest opcjonalne.\nJeśli je podasz, to może być stosowane w celu przypisania Twojej pracy.",
+       "prefs-help-realname": "Imię i nazwisko jest opcjonalne.\nJeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje autorstwo.",
        "prefs-help-email": "Podanie adresu e‐mail nie jest obowiązkowe, lecz jest konieczne do zresetowania zapomnianego hasła.",
        "prefs-help-email-others": "Możesz również umożliwić innym użytkownikom wysłanie do Ciebie e‐maila poprzez Twoją stronę użytkownika lub stronę dyskusji (bez ujawniania Twojego adresu).",
        "prefs-help-email-required": "Wymagany jest adres e‐mail.",
        "userrights-changeable-col": "Grupy, które możesz wybrać",
        "userrights-unchangeable-col": "Grupy, których nie możesz wybrać",
        "userrights-conflict": "Konflikt zmiany uprawnień użytkownika! Proszę sprawdzić i potwierdzić swoje zmiany.",
-       "userrights-removed-self": "Pomyślnie odebrałeś sobie uprawnienia. W związku z tym nie masz już dostępu do tej strony.",
+       "userrights-removed-self": "Odebrałeś sobie uprawnienia. W związku z tym nie masz już dostępu do tej strony.",
        "group": "Grupa:",
        "group-user": "Użytkownicy",
        "group-autoconfirmed": "Automatycznie zatwierdzeni użytkownicy",
        "uploadstash-summary": "Ta strona umożliwia dostęp do przesłanych lub właśnie przesyłanych plików, ale jeszcze nie opublikowanych na wiki. Pliki widzi wyłącznie użytkownik, które je przesłał.",
        "uploadstash-clear": "Wyczyść schowek z plikami",
        "uploadstash-nofiles": "Nie masz żadnych ukrytych plików.",
-       "uploadstash-badtoken": "Operacja nie powiodła się. Możliwą przyczyną jest, że Twoje upoważnienie do edytowania wygasło. Spróbuj ponownie.",
+       "uploadstash-badtoken": "Operacja nie powiodła się. Być może Twoje upoważnienie do edytowania wygasło. Spróbuj ponownie.",
        "uploadstash-errclear": "Czyszczenie plików nie powiodło się.",
        "uploadstash-refresh": "Odśwież listę plików",
        "invalid-chunk-offset": "Nieprawidłowe przesunięcie fragmentu",
        "apisandbox-jsonly": "Do korzystania z brudnopisu API wymagany jest JavaScript.",
        "apisandbox-api-disabled": "API jest wyłączone na tej stronie.",
        "apisandbox-intro": "Użyj tej strony do eksperymentowania z <strong>serwisem API MediaWiki</strong>.\nWięcej szczegółów na temat wykorzystywania API można znaleźć w [[mw:API:Main page|dokumentacji API]]. Przykład: [//www.mediawiki.org/wiki/API#A_simple_example pobranie zawartości strony głównej]. Wybierz akcję, by zobaczyć więcej przykładów.\n\nZwróć uwagę, że chociaż jest to brudnopis, to działania, które można przeprowadzać na tej stronie, mogą zmienić wiki.",
+       "apisandbox-fullscreen": "Rozszerz panel",
+       "apisandbox-fullscreen-tooltip": "Rozszerz panel środowiska testowego, aby zajmował całe okno przeglądarki.",
        "apisandbox-unfullscreen": "Pokaż stronę",
+       "apisandbox-unfullscreen-tooltip": "Zmniejsz pasek środowiska testowego, aby linki nawigacyjne MediaWiki stały się dostępne.",
        "apisandbox-submit": "Wykonaj zapytanie",
        "apisandbox-reset": "Wyczyść",
        "apisandbox-retry": "Ponów próbę",
+       "apisandbox-loading": "Ładowanie informacji o module API „$1”…",
        "apisandbox-no-parameters": "Ten moduł API nie posiada parametrów.",
        "apisandbox-helpurls": "Linki pomocy",
        "apisandbox-examples": "Przykłady",
        "apisandbox-dynamic-parameters-add-label": "Dodaj parametr:",
        "apisandbox-dynamic-parameters-add-placeholder": "Nazwa parametru",
        "apisandbox-dynamic-error-exists": "Parametr o nazwie „$1” już istnieje.",
+       "apisandbox-deprecated-parameters": "Przestarzałe parametry",
+       "apisandbox-fetch-token": "Automatycznie uzupełnij token",
        "apisandbox-submit-invalid-fields-title": "Niektóre pola są nieprawidłowe",
        "apisandbox-submit-invalid-fields-message": "Popraw zaznaczone pola i spróbuj ponownie.",
        "apisandbox-results": "Wyniki",
+       "apisandbox-sending-request": "Wysyłanie zapytania API…",
        "apisandbox-loading-results": "Pobieranie wyników API...",
        "apisandbox-request-url-label": "URL zapytania:",
        "apisandbox-request-time": "Czas przetwarzania zapytania: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "Popraw token i wyślij ponownie",
        "apisandbox-alert-page": "Pola na tej stronie są nieprawidłowe.",
        "apisandbox-alert-field": "Wartość tego pola jest nieprawidłowa.",
        "booksources": "Książki",
        "changecontentmodel-title-label": "Tytuł strony",
        "changecontentmodel-model-label": "Nowy model zawartości",
        "changecontentmodel-reason-label": "Powód:",
+       "changecontentmodel-submit": "Zmień",
        "changecontentmodel-success-title": "Model zawartości został zmieniony",
        "changecontentmodel-success-text": "Typ zawartości [[:$1]] został zmieniony.",
        "changecontentmodel-cannot-convert": "Zawartość [[:$1]] nie może być przekształcona do typu $2.",
        "move-leave-redirect": "Pozostaw przekierowanie pod dotychczasowym tytułem.",
        "protectedpagemovewarning": "'''UWAGA!''' Ponieważ strona została zabezpieczona, tylko użytkownicy z uprawnieniami administratora mogą zmienić jej nazwę.\nOstatni wpis z rejestru jest pokazany poniżej.",
        "semiprotectedpagemovewarning": "'''Uwaga!''' Ponieważ strona została zabezpieczona, tylko zarejestrowani użytkownicy mogą zmienić jej nazwę.\nOstatni wpis z rejestru jest pokazany poniżej.",
-       "move-over-sharedrepo": "== Plik istnieje ==\n[[:$1]] istnieje we wspólnym repozytorium. Zmiana nazwy pliku na tę spowoduje przesłonięcie współdzielonego pliku.",
+       "move-over-sharedrepo": "[[:$1]] istnieje we wspólnym repozytorium. Zmiana nazwy pliku na tę spowoduje przesłonięcie współdzielonego pliku.",
        "file-exists-sharedrepo": "Plik o wybranej nazwie istnieje we wspólnym repozytorium.\nWybierz inną nazwę.",
        "export": "Eksport stron",
        "exporttext": "Możesz wyeksportować treść i historię edycji jednej strony lub zestawu stron w formacie XML.\nWyeksportowane informacje można później zaimportować do innej wiki, działającej na oprogramowaniu MediaWiki, korzystając ze [[Special:Import|strony importu]].\n\nWyeksportowanie wielu stron wymaga wpisania poniżej tytułów stron po jednym tytule w wierszu oraz określenia, czy ma zostać wyeksportowana bieżąca czy wszystkie wersje strony z opisami edycji lub też tylko bieżąca wersja z opisem ostatniej edycji.\n\nMożesz również użyć linku, np. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] dla strony „[[{{MediaWiki:Mainpage}}]]”.",
        "export-download": "Zapisz do pliku",
        "export-templates": "Dołącz szablony",
        "export-pagelinks": "Dołącz linkowane strony na głębokości:",
+       "export-manual": "Dodaj strony ręcznie:",
        "allmessages": "Komunikaty systemowe",
        "allmessagesname": "Nazwa",
        "allmessagesdefault": "Tekst domyślny",
        "pageinfo-category-files": "Liczba plików",
        "markaspatrolleddiff": "oznacz edycję jako „sprawdzoną”",
        "markaspatrolledtext": "Oznacz tę stronę jako „sprawdzoną”",
+       "markaspatrolledtext-file": "Oznacz tę wersję pliku jako „sprawdzoną”",
        "markedaspatrolled": "Sprawdzone",
        "markedaspatrolledtext": "Wybrana wersja [[:$1]] została oznaczona jako „sprawdzona”.",
        "rcpatroldisabled": "Wyłączono funkcję patrolowania na stronie ostatnich zmian",
        "newimages-legend": "Filtruj",
        "newimages-label": "Nazwa pliku (lub jej fragment):",
        "newimages-showbots": "Pokaż pliki przesłane przez boty",
+       "newimages-hidepatrolled": "Ukryj sprawdzone pliki",
        "noimages": "Brak plików do pokazania.",
        "ilsubmit": "Szukaj",
        "bydate": "według daty",
        "tags-delete-not-allowed": "Znaczniki określone przez rozszerzenie nie mogą zostać usunięte, chyba że dane rozszerzenie jawnie na to zezwala.",
        "tags-delete-not-found": "Znacznik „$1” nie istnieje.",
        "tags-delete-too-many-uses": "Znacznik „$1” jest stosowany w więcej niż {{PLURAL:$2|jednej wersji|$2 wersjach}}, co oznacza, że nie może być usunięty.",
-       "tags-delete-warnings-after-delete": "Znacznik „$1” został pomyślnie usunięty, ale {{PLURAL:$2|otrzymano następujące ostrzeżenie|otrzymano następujące ostrzeżenia}}:",
+       "tags-delete-warnings-after-delete": "Znacznik „$1” został usunięty, ale {{PLURAL:$2|otrzymano następujące ostrzeżenie|otrzymano następujące ostrzeżenia}}:",
        "tags-activate-title": "Aktywacja znacznika",
        "tags-activate-question": "Zamierzasz aktywować znacznik „$1”.",
        "tags-activate-reason": "Powód:",
        "mw-widgets-titleinput-description-new-page": "strona jeszcze nie istnieje",
        "mw-widgets-titleinput-description-redirect": "przekierowanie do $1",
        "api-error-blacklisted": "Wybierz inny, opisowy tytuł.",
-       "randomrootpage": "Losowa strona tytułowa"
+       "randomrootpage": "Losowa strona (bez podstron)"
 }
index 8a90128..305806f 100644 (file)
        "recentchanges-label-bot": "Sa modìfica a l'é stàita fàita da un trigomiro",
        "recentchanges-label-unpatrolled": "Sta modìfica-sì a l'é pa ancó stàita verificà",
        "recentchanges-label-plusminus": "La taja dla pàgina a l'é cangià d'un nùmer ëd bytes",
-       "recentchanges-legend-heading": "'''Legend:'''",
+       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vëdde ëdcò la [[Special:NewPages|lista dle pàgine neuve]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Ambelessì sota a-i é {{PLURAL:$5|la modìfica|le modìfiche}} da <strong>$3, $4</strong> (mostrà fin-a a <strong>$1</strong>).",
index 94146bd..57c0b42 100644 (file)
        "recentchanges-label-bot": "ایس تبدیلی نوں بوٹ نے کیتا اے۔",
        "recentchanges-label-unpatrolled": "ایس تبدیلی تے ہلے گشت نئیں ہوئی۔",
        "recentchanges-label-plusminus": "صفے دا ناپ اینے بائٹاں نال بدلیا گیا",
-       "recentchanges-legend-heading": "'''وات:'''",
+       "recentchanges-legend-heading": "<strong>وات:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ایہ وی ویکھو [[Special:NewPages|نویں صفیاں دی لسٹ]])",
        "rcnotefrom": "ہلے تک '''$2''' توں '''$1''' تبدیلیاں تھلے دتیاں گئیاں نیں۔",
        "rclistfrom": "$3 $2 توں ہونے آلیاں نویاں تبدیلیاں وکھاؤ",
index 563d685..adb63dc 100644 (file)
        "recentchanges-label-bot": "دا سمون يو روباټ ترسره کړی",
        "recentchanges-label-unpatrolled": "دغه سمون تر اوسه پورې نه دی څارل شوی",
        "recentchanges-label-plusminus": "د بايټونو د شمېر له مخې د مخ د بدلون کچه",
-       "recentchanges-legend-heading": "'''لنډونونه:'''",
+       "recentchanges-legend-heading": "<strong>لنډونونه:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|د نويو مخونو لړليک]] هم وگورئ)",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "ښکاره کول",
index 1a68edc..398ef62 100644 (file)
@@ -90,7 +90,9 @@
                        "Eduardo Addad de Oliveira",
                        "Raphaelras",
                        "Arthurteb303",
-                       "Rffontenelle"
+                       "Rffontenelle",
+                       "HenriqueCrang",
+                       "Caçador de Palavras"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "moredotdotdot": "Mais...",
        "morenotlisted": "Esta lista não está completa.",
        "mypage": "Página",
+       "anonuserpage": "Usuário desconhecido",
        "mytalk": "Discussão",
        "anontalk": "Discussão",
        "navigation": "Navegação",
        "nocookieslogin": "Você tem os <i>cookies</i> desativados no seu navegador, e a {{SITENAME}} utiliza <i>cookies</i> para ligar os usuários às suas contas. Por favor os ative e tente novamente.",
        "nocookiesfornew": "A conta de usuário não foi criada porque não foi possível confirmar a sua origem.\nCertifique-se de que tem os cookies ativados, recarregue esta página e tente novamente.",
        "noname": "Você não colocou um nome de usuário válido.",
-       "loginsuccesstitle": "Login bem sucedido",
+       "loginsuccesstitle": "Autenticado",
        "loginsuccess": "'''Agora você está {{GENDER:autenticado|autenticada}} ao wiki {{SITENAME}} como \"$1\"'''.",
        "nosuchuser": "Não existe nenhum usuário com o nome \"$1\".\nOs nomes de usuário são sensíveis a letras maiúsculas.\nVerifique o que foi digitado ou [[Special:UserLogin/signup|crie uma nova conta]].",
        "nosuchusershort": "Não existe um usuário com o nome \"$1\". Verifique o nome que introduziu.",
        "recentchanges-label-bot": "Esta edição foi feita por um robô",
        "recentchanges-label-unpatrolled": "Esta edição ainda não foi patrulhada",
        "recentchanges-label-plusminus": "Alteração no tamanho da página, em bytes",
-       "recentchanges-legend-heading": "'''Legenda''':",
+       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veja também a [[Special:NewPages|lista de páginas novas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Exibir",
        "logentry-protect-protect": "$1 {{GENDER:$2|protegeu}} $3 $4",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protegeu}} $3 $4 [em cascata]",
        "logentry-protect-modify": "$1 {{GENDER:$2|alterou}} o nível de proteção para $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|alterou}} o nível de proteção para $3 $4 [em cascata]",
        "logentry-rights-rights": "$1 alterou os grupos de usuário de $3 de $4 para $5",
        "logentry-rights-rights-legacy": "$1 alterou os grupos de $3",
        "logentry-rights-autopromote": "$1 foi promovido automaticamente de $4 para $5",
-       "logentry-upload-upload": "$1 {{GENDER:$2|carregado}} $3",
+       "logentry-upload-upload": "$1 {{GENDER:$2|carregou}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|carregada}} uma nova versão de $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|carregado}} $3",
        "log-name-managetags": "Registo de gestão de etiquetas",
index 304fd47..84bd3ad 100644 (file)
@@ -66,7 +66,9 @@
                        "He7d3r",
                        "Ti4goc",
                        "Jkb8",
-                       "Önni"
+                       "Önni",
+                       "Diniscoelho",
+                       "Josep Maria Roca Peña"
                ]
        },
        "tog-underline": "Sublinhar ligações:",
        "moredotdotdot": "Mais...",
        "morenotlisted": "Esta lista não está completa.",
        "mypage": "Página",
+       "anonuserpage": "Utilizador desconhecido",
        "mytalk": "Discussão",
        "anontalk": "Discussão",
        "navigation": "Navegação",
        "nocookieslogin": "A {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu navegador.\nAtive-os e tente novamente, por favor.",
        "nocookiesfornew": "A conta de utilizador não foi criada, porque não foi possível confirmar a sua origem.\nCertifique-se de que tem os ''cookies'' ativados, recarregue esta página e tente novamente.",
        "noname": "Não especificou um nome de utilizador válido.",
-       "loginsuccesstitle": "Início de sessão bem sucedido",
+       "loginsuccesstitle": "Autenticação bem sucedida",
        "loginsuccess": "'''Encontra-se agora ligado à {{SITENAME}} como \"$1\"'''.",
        "nosuchuser": "Não existe nenhum utilizador com o nome \"$1\".\nOs nomes de utilizador são sensíveis à capitalização.\nVerifique a ortografia, ou [[Special:UserLogin/signup|crie uma nova conta]].",
        "nosuchusershort": "Não existe um utilizador com o nome \"$1\". Verifique o nome que introduziu.",
        "createaccount-title": "Criação de conta na {{SITENAME}}",
        "createaccount-text": "Alguém criou uma conta com o nome $2 para o seu endereço de correio eletrónico, na wiki {{SITENAME}} ($4), com a palavra-passe \"$3\".\nDeve agora iniciar sessão e alterar a sua palavra-passe.\n\nSe a conta foi criada por engano, pode ignorar esta mensagem.",
        "login-throttled": "Realizou demasiadas tentativas de início de sessão com esta conta.\nAguarde $1 antes de tentar novamente, por favor.",
-       "login-abort-generic": "O início de sessão não teve êxito - Cancelado",
+       "login-abort-generic": "O início de sessão falhou - Cancelado",
        "login-migrated-generic": "A sua conta foi migrada e o seu nome de utilizador já não existe nesta wiki.",
        "loginlanguagelabel": "Idioma: $1",
        "suspicious-userlogout": "O seu pedido para sair foi negado porque parece ter sido enviado por um navegador danificado ou por um proxy com cache.",
        "botpasswords-insert-failed": "Falhou ao adicionar o nome do robô \"$1\". Já foi adicionado?",
        "botpasswords-update-failed": "Falha ao atualizar o nome do robô \"$1\". Será que foi eliminado?",
        "botpasswords-created-title": "Criada palavra-passe para o robô",
-       "botpasswords-created-body": "A palavra-passe para o robô \"$1\" foi criada com sucesso.",
+       "botpasswords-created-body": "O robô palavra-passe para o nome do robô \"$1\" do utilizador \"$2\" foi criado.",
        "botpasswords-updated-title": "A palavra-passe de robô foi actualizada.",
-       "botpasswords-updated-body": "A palavra-passe de robô \"$1\" foi actualizada com sucesso.",
+       "botpasswords-updated-body": "O robô palavra-passe para o nome do robô \"$1\" do utilizador \"$2\" foi atualizado.",
        "botpasswords-deleted-title": "Palavra-passe de robô eliminada",
-       "botpasswords-deleted-body": "A palavra-passe de robô \"$1\" foi eliminada.",
+       "botpasswords-deleted-body": "O robô palavra-passe para o nome do robô \"$1\"do utilizador \"$2\" foi eliminado.",
        "botpasswords-newpassword": "A nova palavra-passe para iniciar sessão com <strong>$1</strong> é <strong>$2</strong>. Por favor, recorde-se dela para futura referência.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider não está disponível.",
        "resetpass_forbidden": "Não é possível alterar palavras-passe",
        "resetpass-no-info": "Precisa de iniciar sessão para aceder diretamente a esta página.",
        "resetpass-submit-loggedin": "Alterar palavra-passe",
        "resetpass-submit-cancel": "Cancelar",
-       "resetpass-wrong-oldpass": "Palavra-passe temporária ou atual inválida.\nPode ter já alterado com sucesso a sua palavra-passe ou solicitado uma nova palavra-passe temporária.",
+       "resetpass-wrong-oldpass": "Palavra-passe temporária ou atual inválida.\nPode ter já alterado a sua palavra-passe ou solicitado uma nova palavra-passe temporária.",
        "resetpass-recycled": "Redefina a sua palavra-passe para uma diferente da atual, por favor.",
        "resetpass-temp-emailed": "Iniciou a sessão com um código temporário.\nPara completar a autenticação, tem de definir uma palavra-passe nova aqui:",
        "resetpass-temp-password": "Palavra-passe temporária:",
        "revdelete-unsuppress": "Remover restrições das revisões restauradas",
        "revdelete-log": "Motivo:",
        "revdelete-submit": "Aplicar {{PLURAL:$1|à revisão selecionada|às revisões selecionadas}}",
-       "revdelete-success": "'''A visibilidade da revisão foi atualizada.'''",
+       "revdelete-success": "Visibilidade da revisão atualizada.",
        "revdelete-failure": "'''A visibilidade da revisão não foi atualizada:'''\n$1",
-       "logdelete-success": "'''A visibilidade da entrada do registo foi definida.'''",
+       "logdelete-success": "Visibilidade da entrada do registo definida.",
        "logdelete-failure": "'''Não foi possível definir a visibilidade da entrada do registo:'''\n$1",
        "revdel-restore": "Alterar visibilidade",
        "pagehist": "Histórico da página",
        "userrights-changeable-col": "Grupos que pode alterar",
        "userrights-unchangeable-col": "Grupos que não pode alterar",
        "userrights-conflict": "Conflito entre alterações de privilégios de utilizador! Por favor, reveja e confirme as suas mudanças.",
-       "userrights-removed-self": "Removeu com sucesso os seus privilégios. Como resultado disso, já não consegue aceder a esta página.",
+       "userrights-removed-self": "Removeu os seus privilégios. Como resultado disto, já não consegue aceder a esta página.",
        "group": "Grupo:",
        "group-user": "Utilizadores",
        "group-autoconfirmed": "Utilizadores autoconfirmados",
        "uploadstash-summary": "Esta página dá acesso aos ficheiros enviados (ou que estão no processo de envio) mas que ainda não foram publicados na wiki. Estes ficheiros não são visíveis para ninguém, exceto para o utilizador que os enviou.",
        "uploadstash-clear": "Apagar os ficheiros escondidos",
        "uploadstash-nofiles": "Não tem ficheiros escondidos.",
-       "uploadstash-badtoken": "Não foi possível executar essa operação, talvez porque as suas credenciais de edição expiraram. Tente novamente.",
+       "uploadstash-badtoken": "Não foi possível executar a operação. Talvez as suas credenciais de edição tenham expirado. Tente novamente.",
        "uploadstash-errclear": "Não foi possível apagar os ficheiros.",
        "uploadstash-refresh": "Atualizar a lista de ficheiros",
        "invalid-chunk-offset": "Deslocamento de fragmento inválido",
        "changecontentmodel-title-label": "Título da página",
        "changecontentmodel-model-label": "Novo modelo de conteúdo",
        "changecontentmodel-reason-label": "Motivo:",
+       "changecontentmodel-submit": "Alterar",
        "changecontentmodel-success-title": "O modelo de conteúdo foi alterado",
        "changecontentmodel-success-text": "O tipo de conteúdo de [[:$1]] foi alterado.",
        "logentry-contentmodel-change-revertlink": "reverter",
        "tags-delete-not-allowed": "Etiquetas definidas por uma extensão não podem ser eliminadas, a menos que a extensão, especificamente, o permita.",
        "tags-delete-not-found": "A etiqueta \"$1\" não existe.",
        "tags-delete-too-many-uses": "A etiqueta \"$1\" está aplicada em mais que $2 {{PLURAL:$2|edição|edições}}, o que significa que não pode ser eliminada.",
-       "tags-delete-warnings-after-delete": "A etiqueta \"$1\" foi eliminada com sucesso, mas {{PLURAL:$2|o seguinte aviso foi encontrado|os seguintes avisos foram encontrados}}:",
+       "tags-delete-warnings-after-delete": "A etiqueta \"$1\" foi eliminada, mas {{PLURAL:$2|o seguinte aviso foi encontrado|os seguintes avisos foram encontrados}}:",
        "tags-activate-title": "Ativar etiqueta",
        "tags-activate-question": "Está prestes a ativar a etiqueta \"$1\".",
        "tags-activate-reason": "Motivo:",
        "tags-edit-reason": "Motivo:",
        "tags-edit-revision-submit": "Aplicar alterações a {{PLURAL:$1|esta revisões|$1 revisões}}",
        "tags-edit-logentry-submit": "Aplicar alterações a {{PLURAL:$1|esta entrada de registo|$1 entradas de registo}}",
-       "tags-edit-success": "As alterações foram aplicadas com sucesso.",
+       "tags-edit-success": "As alterações foram aplicadas.",
        "tags-edit-failure": "As alterações não puderam ser aplicadas:\n$1",
        "tags-edit-nooldid-title": "Revisão de página inválida",
        "tags-edit-nooldid-text": "Não foi especificada nenhuma revisão na qual será realizada esta ação, ou a revisão especificada não existe.",
        "logentry-protect-protect": "$1 {{GENDER:$2|protegeu}} $3 $4",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protegeu}} $3 $4 [em cascata]",
        "logentry-protect-modify": "$1 {{GENDER:$2|alterou}} o nível de proteção para $3 $4",
-       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|alterado}} nível de proteção para us$3 $4 [cascading]",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|alterou}} o nível de proteção para $3 $4 [em cascata]",
        "logentry-rights-rights": "$1 modificou os privilégios do utilizador $3 de $4 para $5",
        "logentry-rights-rights-legacy": "$1 alterou os grupos de $3",
        "logentry-rights-autopromote": "$1 foi automaticamente {{GENDER:$2|promovido|promovida}} de $4 a $5",
index b388053..ae2eca4 100644 (file)
        "moredotdotdot": "Used as \"More...\" link for {{msg-mw|pageinfo-transclusions}} field, in the \"templates used on this page\" list.\n\nSimilar to {{msg-mw|morenotlisted}}.\n{{Identical|More...}}",
        "morenotlisted": "An indication that more of a templates list is not shown.\n\nUsed as \"More...\" link for {{msg-mw|pageinfo-templates}} field.\n\nSimilar to {{msg-mw|moredotdotdot}}.",
        "mypage": "A text for the link to the user's user page in the links at the top of the page.\n{{Identical|Page}}",
+       "anonuserpage": "Same as {{msg-mw|mypage}} but used for non-logged-in users.\nA text for the link to the IP user page in the links at the top of the page.\n\nSee also:\n* {{msg-mw|Accesskey-pt-anonuserpage}}\n* {{msg-mw|Tooltip-pt-anonuserpage}}",
        "mytalk": "In the personal URLs page section - right upper corner.\n\nUsed as link title in your personal toolbox.\n\nSee also:\n* {{msg-mw|Mytalk}}\n* {{msg-mw|Accesskey-pt-mytalk}}\n* {{msg-mw|Tooltip-pt-mytalk}}\n{{Identical|Talk}}",
        "anontalk": "Same as {{msg-mw|mytalk}} but used for non-logged-in users.\n{{Identical|Talk}}\n\nSee also:\n* {{msg-mw|Accesskey-pt-anontalk}}\n* {{msg-mw|Tooltip-pt-anontalk}}",
        "navigation": "This is shown as a section header in the sidebar of most skins.\n\n{{Identical|Navigation}}",
        "nocookiesfornew": "This message is displayed when the user tried to create a new account, but it failed the cross-site request forgery (CSRF) check. It could be blocking an attack, but most likely, the browser isn't  accepting cookies.",
        "nocookiesforlogin": "{{optional}}\nThis message is displayed when someone tried to login and the CSRF failed (most likely, the browser doesn't accept cookies).\n\nDefault:\n* {{msg-mw|Nocookieslogin}}",
        "noname": "Error message.",
-       "loginsuccesstitle": "The title of the page saying that you are logged in. The content of the page is the message {{msg-mw|Loginsuccess}}.\n{{Identical|Login successful}}",
+       "loginsuccesstitle": "The title of the page saying that you are logged in. The content of the page is the message {{msg-mw|Loginsuccess}}.\n{{Identical|Log in}}",
        "loginsuccess": "The content of the page saying that you are logged in. The title of the page is {{msg-mw|Loginsuccesstitle}}.\n\nParameters:\n* $1 - the name of the logged in user\n{{Gender}}",
        "nosuchuser": "Displayed when trying to log in with an unexisting username.\n\nWhen you are not allowed to create an account, the following message is displayed:\n* {{msg-mw|Nosuchusershort}}\nParameters:\n* $1 - username",
        "nosuchusershort": "Displayed when trying to log in with a non-existent username.\n\nThis message is only shown when you can't create an account, otherwise the following message is displayed:\n* {{msg-mw|Nosuchusershort}}\n\nParameters:\n* $1 - username",
        "botpasswords-insert-failed": "Error message when saving a new bot password failed. It's likely that the failure was because the user resubmitted the form after a previous successful save. Parameters:\n* $1 - Bot name",
        "botpasswords-update-failed": "Error message when saving changes to an existing bot password failed. It's likely that the failure was because the user deleted the bot password in another browser window. Parameters:\n* $1 - Bot name",
        "botpasswords-created-title": "Title of the success page when a new bot password is created.",
-       "botpasswords-created-body": "Success message when a new bot password is created. Parameters:\n* $1 - Bot name",
+       "botpasswords-created-body": "Success message when a new bot password is created. Parameters:\n* $1 - Bot name\n* $2 - User name",
        "botpasswords-updated-title": "Title of the success page when a bot password is updated.",
-       "botpasswords-updated-body": "Success message when a bot password is updated. Parameters:\n* $1 - Bot name",
+       "botpasswords-updated-body": "Success message when a bot password is updated. Parameters:\n* $1 - Bot name\n* $2 - User name",
        "botpasswords-deleted-title": "Title of the success page when a bot password is deleted.",
-       "botpasswords-deleted-body": "Success message when a bot password is deleted. Parameters:\n* $1 - Bot name",
+       "botpasswords-deleted-body": "Success message when a bot password is deleted. Parameters:\n* $1 - Bot name\n* $2 - User name",
        "botpasswords-newpassword": "Success message to display the new password when a bot password is created or updated. Parameters:\n* $1 - User name to be used for login.\n* $2 - Password to be used for login.",
        "botpasswords-no-provider": "Error message when login is attempted but the BotPasswordsSessionProvider is not included in <code>$wgSessionProviders</code>.",
        "botpasswords-restriction-failed": "Error message when login is rejected because the configured restrictions were not satisfied.",
        "changecontentmodel-title-label": "Label for the input field where the target page title should be entered\n{{Identical|Page title}}",
        "changecontentmodel-model-label": "Label of the dropdown listing available content model types the user can change a page to",
        "changecontentmodel-reason-label": "{{Identical|Reason}}",
+       "changecontentmodel-submit": "Label of the form \"submit\" button for [[Special:ChangeContentModel]]\n{{Identical|Change}}",
        "changecontentmodel-success-title": "Title of the success page of the change content model special page",
        "changecontentmodel-success-text": "Message telling user that their change has been successfully done.\n* $1 - Target page title",
        "changecontentmodel-cannot-convert": "Error message shown if the content model cannot be changed to the specified type. $1 is the page title, $2 is the localized content model name.",
index 884f82e..134328a 100644 (file)
        "recentchanges-label-bot": "Kayqa rurana antachap llamk'apusqanmi",
        "recentchanges-label-unpatrolled": "Kay llamk'apusqaqa manaraqmi patrullasqachu",
        "recentchanges-label-plusminus": "P'anqap chhikan, kay byte yupaywan wakinchasqa",
-       "recentchanges-legend-heading": "'''Sut'ichana:'''",
+       "recentchanges-legend-heading": "<strong>Sut'ichana:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|musuq p'anqakunatapas]] qhaway)",
        "rcnotefrom": "Kay qatiqpiqa <strong>$2</strong>-mantapacha (<strong>$1</strong>-kama) hukchasqakunatam rikunki.",
        "rclistfrom": "$3 $2-manta musuq hukchasqakunata rikuchiy",
index cfb22ec..be52e15 100644 (file)
        "recentchanges-label-minor": "Quai è ina pitschna modificaziun",
        "recentchanges-label-bot": "Questa modificaziun è vegnida exequida dad in bot",
        "recentchanges-label-unpatrolled": "Questa midada n'è anc betg vegnida controllada",
-       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vesair era la [[Special:NewPages|glista da novas paginas]])",
        "rcnotefrom": "I vegnan mussadas las midadas a partir da las <strong>$4</strong> dals <strong>$3</strong> (maximalmain <strong>$1</strong>).",
        "rclistfrom": "Mussar las novas midadas a partir da las $2 dals $3",
index 1e281fe..c1137ba 100644 (file)
        "recentchanges-label-bot": "Această modificare a fost efectuată de un robot",
        "recentchanges-label-unpatrolled": "Această modificare nu a fost încă verificată",
        "recentchanges-label-plusminus": "Dimensiunea paginii s-a modificat corespunzător acestui număr de octeți",
-       "recentchanges-legend-heading": "'''Legendă:'''",
+       "recentchanges-legend-heading": "<strong>Legendă:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vedeți și [[Special:NewPages|lista cu pagini noi]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Afișează",
index 7d4dc42..5e2559e 100644 (file)
        "recentchanges-label-bot": "Stu cangiamende ha state fatte da 'nu bot",
        "recentchanges-label-unpatrolled": "Stu cangiamende non g'à state angore condrollate",
        "recentchanges-label-plusminus": "'A dimenzione d'a pàgene ave cangiate da stu numere de byte",
-       "recentchanges-legend-heading": "'''Leggende:'''",
+       "recentchanges-legend-heading": "<strong>Leggende:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ('ndruche pure [[Special:NewPages|elenghe de le pàggene nuève]])",
        "rcnotefrom": "Sotte {{PLURAL:$5|ste 'u cangiamende|stonne le cangiaminde}} da <strong>$3, $4</strong> ('nzigne a <strong>$1</strong> fatte vedè).",
        "rclistfrom": "Fà vedè le urteme cangiaminde partenne da $3 $2",
index 6e3b946..95f4999 100644 (file)
        "moredotdotdot": "Далее…",
        "morenotlisted": "Этот список неполон.",
        "mypage": "Страница",
+       "anonuserpage": "Неизвестный участник",
        "mytalk": "Обсуждение",
        "anontalk": "Обсуждение",
        "navigation": "Навигация",
        "nocookieslogin": "{{SITENAME}} использует «cookies» для представления участников. Вы их отключили. Пожалуйста, включите их и попробуйте снова.",
        "nocookiesfornew": "Учётная запись участника не была создана из-за невозможности проверить её источник. \nУбедитесь, что включены «cookies», обновите страницу и попробуйте ещё раз.",
        "noname": "Вы не указали допустимого имени участника.",
-       "loginsuccesstitle": "Ð\9eпознание Ð¿Ñ\80оÑ\88ло Ñ\83Ñ\81пеÑ\88но",
+       "loginsuccesstitle": "Ð\92Ñ\85од Ð¿Ñ\80оизведÑ\91н",
        "loginsuccess": "Теперь вы работаете под именем $1.",
        "nosuchuser": "Участника с именем «$1» не существует.\nИмена участников чувствительны к регистру букв.\nПроверьте правильность написания имени или [[Special:UserLogin/signup|создайте новую учётную запись]].",
        "nosuchusershort": "Не существует участника с именем «$1». Проверьте написание имени.",
        "createaccount-title": "{{SITENAME}}: создание учётной записи",
        "createaccount-text": "Кто-то создал учётную запись «$2» на сервере проекта {{SITENAME}} ($4), указав ваш адрес электронной почты. \n\nПароль учётной записи — «$3». Вам следует авторизоваться на сайте и изменить пароль.\n\nПроигнорируйте данное сообщение, если учётная запись была создана по ошибке.",
        "login-throttled": "Вы сделали слишком много попыток представиться системе.\nПожалуйста, подождите $1 перед тем, как попробовать снова.",
-       "login-abort-generic": "Неудачная попытка представиться системе",
+       "login-abort-generic": "Не удалось представиться системе — отменено",
        "login-migrated-generic": "Ваша учётная запись была перенесена, и ваше имя участника больше не существует в этой вики.",
        "loginlanguagelabel": "Язык: $1",
        "suspicious-userlogout": "Ваш запрос на завершение сеанса отклонён, так как он похож на запрос, отправленный некорректным браузером или кэширующим прокси.",
        "newpassword": "Новый пароль:",
        "retypenew": "Повторите ввод нового пароля:",
        "resetpass_submit": "Установить пароль и представиться",
-       "changepassword-success": "Ваш пароль был успешно изменён!",
+       "changepassword-success": "Ваш пароль был изменён!",
        "changepassword-throttled": "Вы сделали слишком много попыток представиться системе.\nПожалуйста, подождите $1 перед тем, как попробовать снова.",
        "botpasswords": "Пароли ботов",
        "botpasswords-summary": "<em>Пароли бота</em> позволяют получить доступ к учётной записи пользователя через API без использования логина и пароля главной учётной записи. Права участника при входе с паролем бота могут быть ограничены.\n\nЕсли Вы не знаете, зачем вам это, вероятно, лучше этого не делайте. Никто никогда не должен просить вас, чтобы вы создали и сообщили его.",
        "botpasswords-insert-failed": "Не удалось добавить бота с именем «$1». Возможно, он был уже добавлен?",
        "botpasswords-update-failed": "Не удалось обновить бота с именем «$1». Возможно, он был удалён?",
        "botpasswords-created-title": "Пароль бота создан",
-       "botpasswords-created-body": "Пароль бота «$1» был успешно создан.",
+       "botpasswords-created-body": "Пароль бота для бота «$1» участника «$2» был создан.",
        "botpasswords-updated-title": "Пароль бота обновлён",
-       "botpasswords-updated-body": "Пароль бота «$1» был успешно обновлён.",
+       "botpasswords-updated-body": "Пароль бота для бота «$1» участника «$2» был обновлён.",
        "botpasswords-deleted-title": "Пароль бота удалён",
-       "botpasswords-deleted-body": "Пароль бота «$1» был удалён.",
+       "botpasswords-deleted-body": "Пароль бота для бота «$1» участника «$2» был удалён.",
        "botpasswords-newpassword": "Новый пароль для входа под <strong>$1</strong> — <strong>$2</strong>. <em>Запишите его для последующего использования.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider недоступен.",
        "botpasswords-restriction-failed": "Из-за ограничений, связанных с паролем бота, вход не произведён.",
        "resetpass-no-info": "Чтобы обращаться непосредственно к этой странице, вам следует представиться системе.",
        "resetpass-submit-loggedin": "Изменить пароль",
        "resetpass-submit-cancel": "Отмена",
-       "resetpass-wrong-oldpass": "Неправильный временный или текущий пароль.\nВозможно, вы уже успешно изменили пароль, или запросили новый временный пароль.",
+       "resetpass-wrong-oldpass": "Неправильный временный или текущий пароль.\nВозможно, вы уже изменили пароль или запросили новый временный пароль.",
        "resetpass-recycled": "Пожалуйста, измените пароль на что-то, отличное от вашего текущего пароля.",
        "resetpass-temp-emailed": "Вы представились с помощью временного пароля, полученного по электронной почте.\nДля завершения входа в систему, необходимо задать новый пароль:",
        "resetpass-temp-password": "Временный пароль:",
        "revdelete-unsuppress": "Снять ограничения с восстановленных версий",
        "revdelete-log": "Причина:",
        "revdelete-submit": "Применить к {{PLURAL:$1|1=выбранной версии|выбранным версиям}}",
-       "revdelete-success": "'''Видимость версии успешно изменена.'''",
+       "revdelete-success": "Видимость версии обновлена.",
        "revdelete-failure": "'''Видимость версии не может быть изменена:'''\n$1",
        "logdelete-success": "Видимость события изменена.",
        "logdelete-failure": "'''Видимость журнала не установлена:'''\n$1",
        "userrights-changeable-col": "Группы, которые вы можете изменять",
        "userrights-unchangeable-col": "Группы, которые вы не можете изменять",
        "userrights-conflict": "Конфликт изменения прав участника! Пожалуйста, проверьте и примените изменения заново.",
-       "userrights-removed-self": "Вы успешно удалили собственные права. Таким образом, вы больше не сможете получить доступ к этой странице.",
+       "userrights-removed-self": "Вы удалили собственные права. Таким образом, вы больше не сможете получить доступ к этой странице.",
        "group": "Группа:",
        "group-user": "Участники",
        "group-autoconfirmed": "Автоподтверждённые участники",
        "uploadstash-summary": "Данная страница предоставляет доступ к файлам, которые были загружены (или находятся в процессе загрузки), но ещё не были опубликованы в вики. Эти файлы никому не видны, кроме загрузившего их участника.",
        "uploadstash-clear": "Очистить скрытые файлы",
        "uploadstash-nofiles": "У вас нет скрытых файлов.",
-       "uploadstash-badtoken": "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð²Ñ\8bполниÑ\82Ñ\8c Ñ\83казаннÑ\8bе Ð´ÐµÐ¹Ñ\81Ñ\82виÑ\8f. Ð\92озможно, Ð¸Ñ\81Ñ\82Ñ\91к Ñ\81Ñ\80ок Ð´ÐµÐ¹Ñ\81Ñ\82виÑ\8f Ð²Ð°Ñ\88его Ð¶ÐµÑ\82она Ð±ÐµÐ·Ð¾Ð¿Ð°Ñ\81ноÑ\81Ñ\82и. Ð\9fопробуйте ещё раз.",
+       "uploadstash-badtoken": "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð²Ñ\8bполниÑ\82Ñ\8c Ñ\83казаннÑ\8bе Ð´ÐµÐ¹Ñ\81Ñ\82виÑ\8f. Ð\92озможно, Ð¸Ñ\81Ñ\82Ñ\91к Ñ\81Ñ\80ок Ð´ÐµÐ¹Ñ\81Ñ\82виÑ\8f Ð²Ð°Ñ\88иÑ\85 Ñ\83Ñ\87Ñ\91Ñ\82нÑ\8bÑ\85 Ð´Ð°Ð½Ð½Ñ\8bÑ\85. Ð\9fожалÑ\83йÑ\81Ñ\82а, пробуйте ещё раз.",
        "uploadstash-errclear": "Очистка файлов не удалась.",
        "uploadstash-refresh": "Обновить список файлов",
        "invalid-chunk-offset": "Недопустимое смещение фрагмента",
        "changecontentmodel-title-label": "Заголовок страницы",
        "changecontentmodel-model-label": "Новая модель содержимого",
        "changecontentmodel-reason-label": "Причина:",
+       "changecontentmodel-submit": "Изменить",
        "changecontentmodel-success-title": "Модель содержимого была изменена",
        "changecontentmodel-success-text": "Модель содержимого [[:$1]] была изменена.",
        "changecontentmodel-cannot-convert": "Содержимое [[:$1]] не может быть преобразовано к типу $2.",
        "changecontentmodel-nodirectediting": "Модель содержимого $1 не поддерживает прямое редактирование",
        "log-name-contentmodel": "Журнал изменения моделей содержимого",
        "log-description-contentmodel": "События, связанные с моделями содержимого страниц",
+       "logentry-contentmodel-new": "$1 создал{{GENDER:$2||а}} страницу $3 с использованием нестандартной модели содержимого «$5»",
        "logentry-contentmodel-change": "$1 изменил{{GENDER:$2||а}} модель содержимого страницы $3 с «$4» на «$5»",
        "logentry-contentmodel-change-revertlink": "откат",
        "logentry-contentmodel-change-revert": "Откат",
        "tags-delete-not-allowed": "Метки, определённые расширением, не могут быть удалены, если только расширения явно не даёт возможности этого делать.",
        "tags-delete-not-found": "Метка «$1» не существует.",
        "tags-delete-too-many-uses": "Метка «$1» применяется в более чем $2 {{PLURAL:$2|версии|версиям}}, что означает, что она не может быть удалена.",
-       "tags-delete-warnings-after-delete": "Метка «$1» была удалена успешно, но {{PLURAL:$2|было обнаружено следующее предупреждение|были обнаружены следующие предупреждения}}:",
+       "tags-delete-warnings-after-delete": "Метка «$1» была удалена, но {{PLURAL:$2|было обнаружено следующее предупреждение|были обнаружены следующие предупреждения}}:",
        "tags-activate-title": "Активировать метку",
        "tags-activate-question": "Вы собираетесь активировать метку «$1».",
        "tags-activate-reason": "Причина:",
        "tags-edit-reason": "Причина:",
        "tags-edit-revision-submit": "Применить изменения к {{PLURAL:$1|этой версии|$1 версиям}}",
        "tags-edit-logentry-submit": "Применить изменения к {{PLURAL:$1|этой записи журнала|$1 записям журнала}}",
-       "tags-edit-success": "Изменения были успешно применены.",
+       "tags-edit-success": "Изменения были применены.",
        "tags-edit-failure": "Изменения не удалось применить.\n$1",
        "tags-edit-nooldid-title": "Не задана целевая версия",
        "tags-edit-nooldid-text": "Вы не задали целевую версию (версии) для выполнения этой функции, или указанная версия не существует.",
index 60a2a23..1c1c7ce 100644 (file)
        "recentchanges-label-minor": "Тото є мала зміна",
        "recentchanges-label-bot": "Тото едітованя зроблене ботом",
        "recentchanges-label-unpatrolled": "Тота зміна дотеперь не была патролёвана.",
-       "recentchanges-legend-heading": "'''Леґенда:'''",
+       "recentchanges-legend-heading": "<strong>Леґенда:</strong>",
        "recentchanges-legend-newpage": "$1 — нова сторінка",
        "rcnotefrom": "Долов суть вказаны зміны од <strong>$2</strong> (до <strong>$1</strong>).",
        "rclistfrom": "Вказати едітованя почінаючі з $3 $2.",
index adbfaf7..1c1d534 100644 (file)
        "newarticle": "(नूतनम्)",
        "newarticletext": "भवान्/भवती अनिर्मिते पृष्ठे अस्ति । \nपृष्ठं स्रष्टुम् अधः प्रदत्तायां पेटिकायां टङ्कनं प्रारभताम् (साहाय्यार्थं [$1 अत्र]) नुदतु ।\nभवान्/भवती यदि क्षतिकारणात् एतत् पृष्ठं प्रति आगच्छत्, तर्हि अस्य गवेषकस्य (browser) Back नुदतु ।",
        "anontalkpagetext": "----\n<em>एतत् सम्भाषणपृष्ठम् अनामकसदस्येभ्यः अस्ति । एतत् तेभ्यः अनामकसदस्येभ्यः रचितमस्ति, यैः सदस्यता न प्राप्ता अस्ति तथा च अस्य पृष्ठस्य उपयोगं न कुर्वन्तः सन्ति ।</em>\nतेषां व्यक्तिगतसूचनां प्राप्तुमेव वयं तस्य/तस्याः अन्तर्जालसंविदः उपयोगं कुर्मः । केचन सदस्याः स्वस्य अन्तर्जालसंविदम् अन्यान् सदस्यान् कथयन्ति । \nयद्यपि अनामकसदस्यः अहं नास्मि, तथापि अयोग्यसूचनाः मम पार्श्वे आगच्छन्त्यः सन्ति इति यदि भवान्/भवती शङ्कते, तर्हि एतत् [[Special:UserLogin/signup|create an account]] एतत् [[Special:UserLogin|log in]] वा कृत्वा भविष्यस्य अनामकसदस्यानां सन्देशेभ्यः स्वस्य रक्षणं करोतु ।",
-       "noarticletext": "à¤\85सà¥\8dमिनà¥\8d à¤ªà¥\83षà¥\8dठà¥\87 à¤\85धà¥\81ना à¤\95िमपि à¤¨ à¤µà¤¿à¤¦à¥\8dयतà¥\87 à¥¤ [[Special:Search/{{PAGENAME}}|à¤\8fषà¤\83 à¤¶à¤¬à¥\8dदà¤\83]] à¤¯à¥\87षà¥\81 à¤ªà¥\83षà¥\8dठà¥\87षà¥\81 à¤\85नà¥\8dतरà¥\8dभवति, à¤¤à¤¾à¤¨à¤¿ à¤ªà¥\83षà¥\8dठानि à¤\85नà¥\8dवà¥\87षà¥\8dà¤\9fà¥\81à¤\82 à¤¶à¤\95à¥\8dयनà¥\8dतà¥\87 à¥¤ \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}  à¤¸à¤®à¥\8dबदà¥\8dधà¥\87षà¥\81 à¤ªà¥\83षà¥\8dठà¥\87षà¥\81 à¤\85नà¥\8dवà¥\87षणà¤\82]\n[{{fullurl:{{FULLPAGENAME}}|action=edit}} à¤\85सà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤¸à¤®à¥\8dपादनं] वा  शक्यम्</span>.",
+       "noarticletext": "à¤\85सà¥\8dमिनà¥\8d à¤ªà¥\83षà¥\8dठà¥\87 à¤\85धà¥\81ना à¤\95िमपि à¤¨ à¤µà¤¿à¤¦à¥\8dयतà¥\87 à¥¤ [[Special:Search/{{PAGENAME}}|à¤\8fषà¤\83 à¤¶à¤¬à¥\8dदà¤\83]] à¤¯à¥\87षà¥\81 à¤ªà¥\83षà¥\8dठà¥\87षà¥\81 à¤\85नà¥\8dतरà¥\8dभवति, à¤¤à¤¾à¤¨à¤¿ à¤ªà¥\83षà¥\8dठानि à¤\85नà¥\8dवà¥\87षà¥\8dà¤\9fà¥\81à¤\82 à¤¶à¤\95à¥\8dयनà¥\8dतà¥\87 à¥¤ \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}  à¤¸à¤®à¥\8dबदà¥\8dधà¥\87षà¥\81 à¤ªà¥\83षà¥\8dठà¥\87षà¥\81 à¤\85नà¥\8dवà¥\87षणà¤\82]\n[{{fullurl:{{FULLPAGENAME}}|action=edit}} à¤\85सà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤¨à¤¿à¤°à¥\8dमाणं] वा  शक्यम्</span>.",
        "noarticletext-nopermission": "अस्मिन् पृष्ठे अधुना किमपि न विद्यते । [[Special:Search/{{PAGENAME}}|एषः शब्दः]] येषु पृष्ठेषु अन्तर्भवति, तानि पृष्ठानि अन्वेष्टुं शक्यन्ते । \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}  सम्बद्धेषु पृष्ठेषु अन्वेषणं]\n[{{fullurl:{{FULLPAGENAME}}|action=edit}} अस्य पृष्ठस्य सम्पादनं] वा  शक्यम्</span>.",
        "missing-revision": "\"{{FULLPAGENAME}}\" पृष्ठस्य संस्करणं #$1 नोपलभ्यम् ।\nयस्य पृष्ठस्य इतिहासे परिसन्धयः कालातीताः सन्ति, तेषु पृष्ठेषु एवं भवति ।\nअधिकसूचनाः अत्र प्राप्तुं शक्यते [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} अपाकृतानाम् आवलिः].",
        "userpage-userdoesnotexist": "\"$1\" इति सदस्यनाम पञ्जीकृतं न विद्यते । अस्य\nनवरचनायै/सम्पादनाय तत् पश्यतु ।",
        "recentchanges-label-bot": "बोट्-द्वारा कृतं सम्पादनमेतत्",
        "recentchanges-label-unpatrolled": "एतावता अस्य सम्पादनस्य परिशीलिनं नाभूत् ।",
        "recentchanges-label-plusminus": "पृष्ठस्य आकारः एतावद्भिः बैट्स्-संख्याभिः परिवर्तितः",
-       "recentchanges-legend-heading": "'''विकल्पविषयकम्'''",
+       "recentchanges-legend-heading": "<strong>विकल्पविषयकम्</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|अत्र नूतनपृष्ठानाम् आवलिः]] अपि दृश्यताम्)",
        "rcnotefrom": "<strong>$3, $4</strong> तः आरभ्य (<strong>$1</strong> पर्यन्तं) जातानि {{PLURAL:$5|परिवर्तनानि}} अधः प्रदर्शितानि ।",
        "rclistfrom": "$3 $2 पश्चात् जातानि नूतनानि परिवर्तनानि दृश्यन्ताम्",
        "javascripttest-pagetext-frameworks": "अधो दत्तेषु कञ्चिदेकां परीक्षाप्रक्रियां चिनोतु : $1",
        "javascripttest-pagetext-skins": "अनेन सह परीक्षां सञ्चालयितुं  काचित् त्वक् चिनोतु ।",
        "javascripttest-qunit-intro": "mediawiki.org. [$1 अभिलेखपरीक्षा] इत्यत्र पश्यतु ।",
-       "tooltip-pt-userpage": "भवतः/भवत्याः सदस्यपृष्ठम्",
+       "tooltip-pt-userpage": "{{GENDER:|भवतः/भवत्याः सदस्यपृष्ठम्}}",
        "tooltip-pt-anonuserpage": "ऐपिसङ्केतार्थं योजकपुटं भवान् सम्पादयति एवम्..",
-       "tooltip-pt-mytalk": "भवतः/भवत्याः सम्भाषणपृष्ठम्",
+       "tooltip-pt-mytalk": "{{GENDER:|भवतः/भवत्याः}} सम्भाषणपृष्ठम्",
        "tooltip-pt-anontalk": "एतस्मात् ऐपिसङ्केतात् सम्पादनस्य परिचर्चा ।",
-       "tooltip-pt-preferences": "भवतः/भवत्याः इष्टतमानि",
+       "tooltip-pt-preferences": "{{GENDER:|भवतः/भवत्याः}} इष्टतमानि",
        "tooltip-pt-watchlist": "भवतः/भवत्याः निरीक्षासूच्यां विद्यमानानां पृष्ठानाम् आवलिः",
-       "tooltip-pt-mycontris": "भवतः/भवत्याः योगदानानाम् आवलिः",
+       "tooltip-pt-mycontris": "{{GENDER:|भवतः/भवत्याः}} योगदानानाम् आवलिः",
        "tooltip-pt-login": "प्रवेशाय प्रोत्सहामहे । परन्तु प्रवेशः ऐच्छिकः ।",
        "tooltip-pt-logout": "निर्गम्यताम्",
        "tooltip-pt-createaccount": "नूतनसदस्यतां प्राप्य प्रविश्यताम् इति सूच्यते किन्तु न एतद् अनिवार्यम्",
        "tooltip-t-recentchangeslinked": "एतत्पृष्ठसम्बद्धेषु पृष्ठेषु जातानि नवीनपरिवर्तनानि",
        "tooltip-feed-rss": "अस्मै पृष्ठाय आर-एस-एस-पूरणम्",
        "tooltip-feed-atom": "अस्मै पृष्ठाय अणुपूरणम्",
-       "tooltip-t-contributions": "अनेन सदस्येन कृतानां योगदानानाम् आवलिः",
+       "tooltip-t-contributions": "{{GENDER:$1|अनेन सदस्येन}} कृतानां योगदानानाम् आवलिः",
        "tooltip-t-emailuser": "एतस्मै योजकाय वि-पत्रं प्रेष्यताम्",
        "tooltip-t-info": "एतस्य पृष्ठस्य विषये अधिकं विवरणम्",
        "tooltip-t-upload": "सञ्चिकाः उपारोप्यन्ताम्",
index f8c424b..ffbdea6 100644 (file)
        "recentchanges-label-bot": "Бу уларытыыны робот оҥорбут",
        "recentchanges-label-unpatrolled": "Бу уларытыы өссө ботурууллана илик",
        "recentchanges-label-plusminus": "Сирэй кээмэйэ бачча баайтынан уларыйбыт",
-       "recentchanges-legend-heading": "'''Легендата:'''",
+       "recentchanges-legend-heading": "<strong>Легендата:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (өссө көр: [[Special:NewPages|Саҥа сирэйдэр тиһиктэрэ]])",
        "recentchanges-submit": "Көрдөр",
        "rcnotefrom": "Манна {{PLURAL:$5|уларытыы көрдөрүлүннэ|уларытыылар көһүннүлэр}} баччаттан <strong>$3, $4</strong> (баччаттан элбэх көстүбэт <strong>$1</strong>).",
index dc12474..332e9f6 100644 (file)
        "recentchanges-label-bot": "Custa modìfica l'at fata unu bot",
        "recentchanges-label-unpatrolled": "Custu càmbiu no est istadu cumprobadu",
        "recentchanges-label-plusminus": "Su càmbiu de sa mannària de sa pàgina dae su nùmeru de bytes",
-       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (càstia [[Special:NewPages|is pàginas noas]])",
        "rcnotefrom": "{{PLURAL:$5|Sa chi sighit est sa mudàntzia|Is chi sighint sunt is mudàntzias}} dae <strong>$3, $4</strong> (ammustradas fintzas a <strong>$1</strong>).",
        "rclistfrom": "Ammustra càmbios dae $3 $2",
index 71fb83b..e7363e1 100644 (file)
        "recentchanges-label-bot": "Stu canciamentu fu fattu di nu bot",
        "recentchanges-label-unpatrolled": "Stu canciamentu ancora nun fu virificatu",
        "recentchanges-label-plusminus": "La grannizza dâ pàggina canciau di stu nùmmiru di byte",
-       "recentchanges-legend-heading": "'''Ligenda:'''",
+       "recentchanges-legend-heading": "<strong>Ligenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (talìa puru [[Special:NewPages|la lista dî pàggini novi]])",
        "rcnotefrom": "Ccassutta {{PLURAL:$5|c'è lu canciamentu|ci sù li canciamenti}} a pàrtiri dû <strong>$3, $4</strong> (nn'havi ammustrati nfina a <strong>$1</strong>).",
        "rclistfrom": "Ammustra li canciamenti novi a pàrtiri dû $3 $2",
index 0c09fc9..bcba1a5 100644 (file)
        "recentchanges-label-bot": "This eedit wis performed bi ae bot",
        "recentchanges-label-unpatrolled": "This eedit haes no bin patrolled yet",
        "recentchanges-label-plusminus": "The page size chynged bi this nummer o bytes",
-       "recentchanges-legend-heading": "'''Legend:'''",
+       "recentchanges-legend-heading": "<strong>Legend:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (see [[Special:NewPages|leet o new pages]] n aw)",
        "rcnotefrom": "Ablo {{PLURAL:$5|is the chynge|ar the chynges}} sin <strong>$3, $4</strong> (up tae <strong>$1</strong> shawn).",
        "rclistfrom": "Shaw new chynges stertin fae $3 $2",
index 8b02a36..c6e6e6d 100644 (file)
        "recentchanges-label-minor": "هيءُ هڪ معمولي ترميم آهي.",
        "recentchanges-label-bot": "هيءُ ترميم بوٽ عمل ۾ آندي.",
        "recentchanges-label-plusminus": "هن صفحي جي ماپ ۾ هيترين ٻاٺڻين جو ڦير آيو آهي",
-       "recentchanges-legend-heading": "\"ڪنجي.\"",
+       "recentchanges-legend-heading": "<strong>\"ڪنجي.</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (پڻ ڏسو [[Special:NewPages|نون صفحن جي فهرست]])",
        "recentchanges-submit": "ڏيکاريو",
        "rcnotefrom": "هيٺ {{PLURAL:$5|تبديلي آهي|تبديليون آهن}} کان <strong>$3, $4</strong> (تائين <strong>$1</strong> ) ڏيکاريل آهن.",
index f8f18e0..2c92aab 100644 (file)
        "recentchanges-label-bot": "Maršin no ka barmaa woo tee",
        "recentchanges-label-unpatrolled": "Barmaa woo mana kurandi jina",
        "recentchanges-label-plusminus": "Moɲoo azzaatoo barmay nda cebsi hinnaa woo",
-       "recentchanges-legend-heading": "'''Maana:'''",
+       "recentchanges-legend-heading": "<strong>Maana:</strong>",
        "recentchanges-legend-newpage": "{{int:barmay kokorantey-šilbay-moo taaga}} (guna da [[Special:NewPages|moo taagey maašeede]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "Ne ganda {{PLURAL:$5|ti barmay|barmawey}} za <strong>$3, $4</strong> (hala <strong>$1</strong> kaŋ ga cebandi).",
index c8b338e..ec538b1 100644 (file)
        "recentchanges-label-bot": "Šėta keitėma padėrba autuomatėnė pruograma",
        "recentchanges-label-unpatrolled": "Ons pakeitėms dā nabova oždabuots",
        "recentchanges-label-plusminus": "Anuo baitu skaitliom pakeists straipsnė apmiers",
-       "recentchanges-legend-heading": "'''Pāiškėnėmā:'''",
+       "recentchanges-legend-heading": "<strong>Pāiškėnėmā:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (dā veiziekat [[Special:NewPages|vielībūju straipsniu sāroša]])",
        "rcnotefrom": "Apatiuo {{PLURAL:$5|ruodoms pakeitėms|ruodomė pakeitėmā}} nug <strong>$3, $4</strong> (ne daugiau kāp <strong>$1</strong> ruodoma īr).",
        "rclistfrom": "Ruodītė vielībus pakeitėmus pradedont nug $3 $2",
index af9f6f8..754df97 100644 (file)
        "recentchanges-label-bot": "Ovu je izmjenu učinio bot",
        "recentchanges-label-unpatrolled": "Ova izmjena još nije patrolirana",
        "recentchanges-label-plusminus": "Veličina stranice promijenila se za ovoliko bajtova",
-       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (također pogledajte [[Special:NewPages|spisak novih stranica]])",
        "rcnotefrom": "Ispod {{PLURAL:$5|je izmjena|su izmjene}} od <strong>$3, $4</strong> (do <strong>$1</strong> prikazano).",
        "rclistfrom": "Prikaži nove poruke od / Прикажи нове поруке од $3 $2",
index 78a1ce7..0874070 100644 (file)
        "recentchanges-label-bot": "මෙය රොබෝවක් විසින් කරන ලද සංස්කරණයකි",
        "recentchanges-label-unpatrolled": "මෙම සංස්කරණය තවම විමර්ශනය කර නොමැත",
        "recentchanges-label-plusminus": "පිටුවේ බයිට ගණන මෙපමණකින් වෙනස් වී ඇත",
-       "recentchanges-legend-heading": "'''විස්තරය:'''",
+       "recentchanges-legend-heading": "<strong>විස්තරය:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|නව පිටු ලැයිස්තුව]] ද බලන්න)",
        "recentchanges-submit": "පෙන්වන්න",
        "rcnotefrom": "{{PLURAL:$5|වෙනස්කම|වෙනස්කම්}} න් පසු සිදුවී ඇති <strong>$3, $4</strong> මෙහි පහත දැක්වේ (<strong>$1</strong> ක ප්‍රමාණයක උපරිමයක් පෙන්වා ඇත).",
index 0396d43..9b85e15 100644 (file)
        "accmailtitle": "Heslo bolo odoslané.",
        "accmailtext": "Náhodne vytvorené heslo pre používateľa [[User talk:$1|$1]] bolo poslané na $2. Je možné ho zmeniť na stránke ''[[Special:ChangePassword|zmena hesla]]'' po prihlásení.",
        "newarticle": "(Nový)",
-       "newarticletext": "Sledovali ste odkaz na stránku, ktorá zatiaľ neexistuje.\nStránku vytvoríte tak, že začnete písať do dolného poľa a potom stlačíte tlačidlo „Uložiť stránku“.\n(Viac informácií nájdete na stránkach [$1 Pomocníka]).\nAk ste sa sem dostali nechtiac, iba kliknite na tlačidlo '''späť''' vo svojom prehliadači.",
+       "newarticletext": "Sledovali ste odkaz na stránku, ktorá zatiaľ neexistuje.\nStránku vytvoríte tak, že začnete písať do poľa nižšie (viac informácií nájdete na stránkach [$1 nápovedy]).\nAk ste sa sem dostali nechtiac, kliknite na tlačidlo <strong>späť</strong> vo svojom prehliadači.",
        "anontalkpagetext": "----''Toto je diskusná stránka anonymného používateľa, ktorý nemá vytvorené svoje konto alebo ho nepoužíva.\nPreto musíme na jeho identifikáciu použiť numerickú IP adresu. Je možné, že takúto IP adresu používajú viacerí používatelia.\nAk ste anonymný používateľ a máte pocit, že vám boli adresované irelevantné diskusné príspevky, [[Special:UserLogin/signup|vytvorte si konto]] alebo sa [[Special:UserLogin|prihláste]], aby sa zamedzilo budúcim zámenám s inými anonymnými používateľmi.''",
        "noarticletext": "Na tejto stránke sa momentálne nenachádza žiadny text.\nMôžete [[Special:Search/{{PAGENAME}}|vyhľadávať názov tejto stránky]] v obsahu iných stránok,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} vyhľadávať v súvisiacich záznamoch] alebo [{{fullurl:{{FULLPAGENAME}}|action=edit}} upravovať túto stránku]</span>.",
        "noarticletext-nopermission": "Táto stránka momentálne neobsahuje žiadny text.\nMôžete [[Special:Search/{{PAGENAME}}|hľadať názov tejto stránky]] v texte iných stránok\nalebo <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hľadať v súvisiacich záznamoch]</span>, ale nemáte oprávnenie túto stránku vytvoriť.",
        "recentchanges-label-bot": "Túto úpravu vykonal bot",
        "recentchanges-label-unpatrolled": "Táto úprava zatiaľ nebola strážená",
        "recentchanges-label-plusminus": "Veľkosť stránky sa zmenila o toľkoto bajtov",
-       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (pozri tiež [[Special:NewPages|zoznam nových stránok]])",
        "recentchanges-submit": "Zobraziť",
        "rcnotefrom": "Nižšie {{PLURAL:$5|je zobrazená úprava|sú zobrazené úpravy}} od <strong>$2</strong> (do <strong>$1</strong>).",
index 4274b07..226ec88 100644 (file)
        "moredotdotdot": "Več ...",
        "morenotlisted": "Seznam ni popoln.",
        "mypage": "Stran",
+       "anonuserpage": "Neznani uporabnik",
        "mytalk": "Pogovor",
        "anontalk": "Pogovorna stran",
        "navigation": "Navigacija",
        "nocookieslogin": "{{SITENAME}} za prijavljanje uporabnikov uporablja piškotke.\nKer jih imate onemogočene, vas prosimo, da jih omogočite in se ponovno prijavite.",
        "nocookiesfornew": "Uporabniški račun ni bil ustvarjen, ker nismo mogli potrditi njegovega izvora.\nPoskrbite, da imate omogočene piškotke, osvežite to stran in poskusite znova.",
        "noname": "Niste vnesli veljavnega uporabniškega imena.",
-       "loginsuccesstitle": "Uspešno ste se prijavili",
+       "loginsuccesstitle": "Sedaj ste prijavljeni",
        "loginsuccess": "'''Zdaj ste prijavljeni v {{GRAMMAR:tožilnik|{{SITENAME}}}} kot »$1«.'''",
        "nosuchuser": "Uporabnik z imenom »$1« ne obstaja.\nUporabniška imena so občutljiva na velikost črk.\nPreverite črkovanje ali pa si [[Special:UserLogin/signup|ustvarite nov uporabniški račun]].",
        "nosuchusershort": "Uporabnik z imenom »$1« ne obstaja.\nPreverite črkovanje.",
        "createaccount-title": "Ustvarjanje računa za {{GRAMMAR:tožilnik|{{SITENAME}}}}",
        "createaccount-text": "Nekdo je ustvaril račun $2 na {{GRAMMAR:dajalnik|{{SITENAME}}}} ($4). Geslo za »$2« je »$3«. Priporočljivo je, da se prijavite in spremenite svoje geslo sedaj.\n\nTo sporočilo lahko prezrete, če je bil račun ustvarjen pomotoma.",
        "login-throttled": "Nedavno ste izvedli preveč poskusov prijave.\nProsimo, počakajte $1, preden poskusite znova.",
-       "login-abort-generic": "Vaša prijava ni bila uspešna – Prekinjeno",
+       "login-abort-generic": "Vaša prijava je spodletela – Prekinjeno",
        "login-migrated-generic": "Vaš račun smo preselili in vaše uporabniško ime na tem wikiju ne obstaja več.",
        "loginlanguagelabel": "Jezik: $1",
        "suspicious-userlogout": "Vaša zahteva za odjavo je bila zavrnjena, saj kaže, da je bila poslana iz pokvarjenega brskalnika ali proxyja s predpomnilnikom.",
        "newpassword": "Novo geslo:",
        "retypenew": "Ponovno vpišite geslo:",
        "resetpass_submit": "Nastavi geslo in se prijavi",
-       "changepassword-success": "Vaše geslo je bilo uspešno spremenjeno!",
+       "changepassword-success": "Vaše geslo smo spremenili!",
        "changepassword-throttled": "Nedavno ste izvedli preveč poskusov prijave.\nProsimo, počakajte $1, preden poskusite znova.",
        "botpasswords": "Gesla botov",
        "botpasswords-summary": "<em>Gesla botov</em> omogočajo dostop do uporabniškega računa z API-jem brez uporabe glavnih poverilnic računa za prijavo. Omejite lahko uporabniške pravice, ki so na voljo pri prijavi z geslom bota.\n\nČe ne veste, zakaj bi to morda uporabljali, tega najverjetneje ne potrebujete. Nihče vas ne sme prositi, da mu zgenerirate in daste geslo bota.",
        "botpasswords-insert-failed": "Dodajanje imena bota »$1« ni uspelo. Ste ga že dodali?",
        "botpasswords-update-failed": "Posodobitev imena bota »$1« je spodletelo. Ste ga izbrisali?",
        "botpasswords-created-title": "Ustvarili smo geslo bota",
-       "botpasswords-created-body": "Uspešno smo ustvarili geslo bota »$1«.",
+       "botpasswords-created-body": "Ustvarili smo geslo bota »$1« uporabnika »$2«.",
        "botpasswords-updated-title": "Posodobili smo geslo bota",
-       "botpasswords-updated-body": "Uspešno smo posodobili geslo bota »$1«.",
+       "botpasswords-updated-body": "Posodobili smo geslo bota »$1« uporabnika »$2«.",
        "botpasswords-deleted-title": "Izbrisali smo geslo bota",
-       "botpasswords-deleted-body": "Uspešno smo izbrisali geslo bota »$1«.",
+       "botpasswords-deleted-body": "Izbrisali smo geslo bota »$1« uporabnika »$2«.",
        "botpasswords-newpassword": "Novo geslo za prijavo z imenom <strong>$1</strong> je <strong>$2</strong>. <em>Prosimo, zabeležite si to za uporabo v prihodnje.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider ni na voljo.",
        "botpasswords-restriction-failed": "Omejitve gesla bota preprečujejo to prijavo.",
        "resetpass-no-info": "Za neposreden dostop do te strani morate biti prijavljeni.",
        "resetpass-submit-loggedin": "Spremenite geslo",
        "resetpass-submit-cancel": "Prekliči",
-       "resetpass-wrong-oldpass": "Neveljavno začano ali trenutno geslo.\nMorda ste že uspešno spremenili geslo ali pa ste zahtevali novo začasno geslo.",
+       "resetpass-wrong-oldpass": "Neveljavno začasno ali trenutno geslo.\nMorda ste že spremenili geslo ali pa ste zahtevali novo začasno geslo.",
        "resetpass-recycled": "Prosimo, ponastavite svoje geslo na nekaj drugega kot svoje trenutno geslo.",
        "resetpass-temp-emailed": "Trenutno ste prijavljeni z začasno kodo, poslano z e-pošto. Za zaključitev prijave morate tukaj nastaviti novo geslo:",
        "resetpass-temp-password": "Začasno geslo:",
        "revdelete-unsuppress": "Odpraviti omejitve na obnovljenih redakcijah.",
        "revdelete-log": "Razlog:",
        "revdelete-submit": "Uporabi za {{PLURAL:$1|izbrano redakcijo|izbrani redakciji|izbrane redakcije}}",
-       "revdelete-success": "'''Vidnost redakcije je bila uspešno nastavljena.'''",
+       "revdelete-success": "Vidnost redakcije smo posodobili.",
        "revdelete-failure": "'''Vidnost redakcije ni bilo mogoče nastaviti:'''\n$1",
-       "logdelete-success": "'''Vidnost dnevnika je bila uspešno nastavljena.'''",
+       "logdelete-success": "Vidnost dnevnika smo nastavili.",
        "logdelete-failure": "'''Vidnost dnevnika ne more biti nastavljena!:'''\n$1",
        "revdel-restore": "Spremeni vidnost",
        "pagehist": "Zgodovina strani",
        "userrights-changeable-col": "Skupine, ki jih lahko spremenite",
        "userrights-unchangeable-col": "Skupine, ki jih ne morete spremeniti",
        "userrights-conflict": "Spor sprememb uporabniških pravic! Prosimo, da pregledate in potrdite svoje spremembe.",
-       "userrights-removed-self": "Uspešno ste odstranili svoje pravice. Tako sedaj ne morete več dostopati do te strani.",
+       "userrights-removed-self": "Odstranili ste svoje pravice. Tako sedaj ne morete več dostopati do te strani.",
        "group": "Skupina:",
        "group-user": "Uporabniki",
        "group-autoconfirmed": "Samodejno potrjeni uporabniki",
        "uploadstash-summary": "Ta stran omogoča dostop do datotek, ki so naložene (oziroma v postopku nalaganja), vendar še niso objavljene na wikiju. Te datoteke so vidne samo uporabniku, ki jih je naložil, in nikomur drugemu.",
        "uploadstash-clear": "Počisti skrite datoteke",
        "uploadstash-nofiles": "Nimate skritih datotek.",
-       "uploadstash-badtoken": "Izvedba dejanja ni bila uspešna, morda zaradi izteklih poverilnic za urejanje. Poskusite znova.",
-       "uploadstash-errclear": "Čiščenje datotek ni bilo uspešno.",
+       "uploadstash-badtoken": "Izvedba dejanja je spodletela. Morda zaradi izteklih poverilnic za urejanje. Prosimo, poskusite znova.",
+       "uploadstash-errclear": "Čiščenje datotek je spodletelo.",
        "uploadstash-refresh": "Osveži seznam datotek",
        "invalid-chunk-offset": "Neveljaven odmik delčka",
        "img-auth-accessdenied": "Dostop zavrnjen",
        "changecontentmodel-title-label": "Naslov strani",
        "changecontentmodel-model-label": "Novi model vsebine",
        "changecontentmodel-reason-label": "Razlog:",
+       "changecontentmodel-submit": "Spremeni",
        "changecontentmodel-success-title": "Spremenili smo model vsebine",
        "changecontentmodel-success-text": "Spremenili smo vrsto vsebine [[:$1]].",
        "changecontentmodel-cannot-convert": "Vsebine na [[:$1]] ni mogoče pretvoriti v vrsto $2.",
        "tags-delete-not-allowed": "Oznak, ki jih določijo razširitve, ni mogoče izbrisati, razen če razširitve to izrecno dovolijo.",
        "tags-delete-not-found": "Oznaka »$1« ne obstaja.",
        "tags-delete-too-many-uses": "Oznaka »$1« je uporabljena pri več kot $2 {{PLURAL:$2|redakciji|redakcijah}}, kar pomeni, da je ni mogoče izbrisati.",
-       "tags-delete-warnings-after-delete": "Oznako »$1« smo uspešno izbrisali, vendar smo naleteli na {{PLURAL:$2|naslednjo težavo|naslednji težavi|naslednje težave}}:",
+       "tags-delete-warnings-after-delete": "Oznako »$1« smo izbrisali, vendar smo naleteli na {{PLURAL:$2|naslednjo težavo|naslednji težavi|naslednje težave}}:",
        "tags-activate-title": "Aktiviraj oznako",
        "tags-activate-question": "Aktivirali boste oznako »$1«.",
        "tags-activate-reason": "Razlog:",
        "tags-edit-reason": "Razlog:",
        "tags-edit-revision-submit": "Uveljavi spremembe na {{PLURAL:$1|redakciji|$1 redakcijah}}",
        "tags-edit-logentry-submit": "Uveljavi spremembe na {{PLURAL:$1|dnevniškem vnosu|$1 dnevniških vnosih}}",
-       "tags-edit-success": "Spremembe smo uspešno uveljavili.",
+       "tags-edit-success": "Spremembe smo uveljavili.",
        "tags-edit-failure": "Sprememb nismo mogli uveljaviti:\n$1",
        "tags-edit-nooldid-title": "Neveljavna ciljna redakcija",
        "tags-edit-nooldid-text": "Bodisi niste navedli ciljne redakcije, na kateri želite izvesti dejanje, bodisi navedena redakcija ne obstaja.",
index 4cf2d10..e9782f0 100644 (file)
        "recentchanges-label-bot": "Badalkaan waxaa sameeyay bot",
        "recentchanges-label-unpatrolled": "bedelkaan hadda wali lama waardiyeen",
        "recentchanges-label-plusminus": "Qaadka bogga wuxuu ku bedelmay tirada halbeega baytka",
-       "recentchanges-legend-heading": "'''Sharaxaad:'''",
+       "recentchanges-legend-heading": "<strong>Sharaxaad:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sidoo kale eeg [[Special:NewPages|liiska bogagga cusub]])",
        "rcnotefrom": "Hoostaan waa isbedaladii dhacay  '''$2''' (waxaad arkoosaa ilaa '''$1''' ).",
        "rclistfrom": "Itusi isbedelada cusub oo ka bilaabaneyso $3 $2",
index 8daf40d..552431f 100644 (file)
        "recentchanges-label-bot": "Ky redaktim u krye nga një robot",
        "recentchanges-label-unpatrolled": "Ky editim ende nuk është patrolluar",
        "recentchanges-label-plusminus": "Madhësia e faqes ndryshoi me këtë numër bajtësh",
-       "recentchanges-legend-heading": "'''Legjenda:'''",
+       "recentchanges-legend-heading": "<strong>Legjenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (shiko gjithashtu [[Special:NewPages|listën e faqeve të reja]])",
        "rcnotefrom": "Më poshtë {{PLURAL:$5|është shfaqur ndryshimi|janë shfaqur ndryshimet}} që nga <strong>$3, $4</strong> (deri në <strong>$1</strong>).",
        "rclistfrom": "Tregon ndryshime së fundmi duke filluar nga $3 $2",
index acc660b..4596598 100644 (file)
        "october-date": "$1 окотобар",
        "november-date": "$1 новембар",
        "december-date": "$1 децембар",
+       "period-am": "преподне",
+       "period-pm": "поподне",
        "pagecategories": "{{PLURAL:$1|Категорија|Категорије}}",
        "category_header": "Странице у категорији „$1“",
        "subcategories": "Поткатегорије",
        "newarticle": "(нови)",
        "newarticletext": "Дошли сте на страницу која још не постоји.\nДа бисте је направили, почните да куцате у прозор испод овог текста (погледајте [$1 страницу за помоћ]).\nАко сте овде дошли грешком, вратите се на претходну страницу.",
        "anontalkpagetext": "---- Ово је страница за разговор с анонимним корисником који још нема налог или га не користи.\nЗбог тога морамо да користимо бројчану ИП адресу како бисмо га препознали.\nТакву адресу може делити више корисника.\nАко сте анонимни корисник и мислите да су вам упућене примедбе, [[Special:UserLogin/signup|отворите налог]] или се [[Special:UserLogin|пријавите]] да бисте избегли будућу забуну с осталим анонимним корисницима.",
-       "noarticletext": "На овој страници тренутно нема садржаја.\nМожете [[Special:Search/{{PAGENAME}}|потражити овај наслов]] на другим страницама,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражити сродне извештаје] или [{{fullurl:{{FULLPAGENAME}}|action=edit}} уредити страницу]</span>.",
+       "noarticletext": "На овој страници тренутно нема садржаја.\nМожете [[Special:Search/{{PAGENAME}}|потражити овај наслов]] на другим страницама,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражити сродне извештаје] или [{{fullurl:{{FULLPAGENAME}}|action=edit}} направити ову страницу]</span>.",
        "noarticletext-nopermission": "На овој страници тренутно нема садржаја.\nМожете [[Special:Search/{{PAGENAME}}|потражити овај наслов]] на другим страницама или <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражити сродне дневнике]</span>, али немате дозволу да направите ову страницу.",
        "missing-revision": "Не могу да пронађем измену бр. $1 на страници под називом „{{FULLPAGENAME}}“.\n\nОво се обично дешава када пратите застарелу везу до странице која је обрисана.\nВише информација можете пронаћи у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневнику брисања].",
        "userpage-userdoesnotexist": "Кориснички налог „<nowiki>$1</nowiki>“ није отворен.\nРазмислите да ли заиста желите да направите/уредите ову страницу.",
        "recentchanges-label-bot": "Ову измену је направио бот",
        "recentchanges-label-unpatrolled": "Ова измена још није патролирана",
        "recentchanges-label-plusminus": "Промена величине странице у бајтовима",
-       "recentchanges-legend-heading": "'''Легенда:'''",
+       "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|списак нових страница]])",
        "recentchanges-submit": "Прикажи",
        "rcnotefrom": "Испод {{PLURAL:$5|је измена|су измене}} од <strong>$3, $4</strong> (до <strong>$1</strong> приказано).",
        "delete-toobig": "Ова страница има велику историју, преко $1 {{PLURAL:$1|измене|измене|измена}}.\nБрисање таквих страница је ограничено да би се спречило случајно оптерећење сервера.",
        "delete-warning-toobig": "Ова страница има велику историју, преко $1 {{PLURAL:$1|измене|изменe|измена}}.\nЊено брисање може пореметити базу података, стога поступајте с опрезом.",
        "deleteprotected": "Не можете обрисати ову страницу зато што је заштићена.",
-       "deleting-backlinks-warning": "'''Упозорење:''' бришете страницу која је укључена у [[Special:WhatLinksHere/{{FULLPAGENAME}}|друге странице]] или друге странице воде на њу.",
+       "deleting-backlinks-warning": "<strong>Упозорење:</strong> бришете страницу која је укључена у [[Special:WhatLinksHere/{{FULLPAGENAME}}|друге странице]] или друге странице воде на њу.",
        "rollback": "Врати измене",
        "rollbacklink": "врати",
        "rollbacklinkcount": "врати $1 {{PLURAL:$1|измену|измене|измена}}",
        "move-leave-redirect": "Остави преусмерење",
        "protectedpagemovewarning": "'''Упозорење:''' ова страница је заштићена, тако да само корисници с администраторским овлашћењима могу да је преместе.\nЗа више информација, последњи запис у дневнику измена је приказан испод:",
        "semiprotectedpagemovewarning": "'''Напомена:''' ова страница је заштићена, тако да само регистровани корисници могу да је преместе.\nЗа више информација, последњи запис у дневнику измена је приказан испод:",
-       "move-over-sharedrepo": "== Датотека постоји ==\n[[:$1]] се налази на дељеном складишту. Ако преместите датотеку на овај наслов, то ће заменити дељену датотеку.",
+       "move-over-sharedrepo": "[[:$1]] се налази на дељеном складишту. Ако преместите датотеку на овај наслов, то ће заменити дељену датотеку.",
        "file-exists-sharedrepo": "Наведени назив датотеке се већ користи у дељеном складишту.\nИзаберите други назив.",
        "export": "Извоз страница",
        "exporttext": "Можете извести текст и историју измена одређене странице или групе страница у формату XML.\nОво онда може бити увезено у други вики који користи Медијавики софтвер преко [[Special:Import|странице за увоз]].\n\nДа бисте извезли странице, унесите називе у оквиру испод, с једним насловом по реду, и изаберите да ли желите текућу измену и све остале, или само текућу измену с подацима о последњој измени.\n\nУ другом случају, можете користити и везу, на пример [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] за страницу [[{{MediaWiki:Mainpage}}]].",
        "javascripttest-pagetext-frameworks": "Изаберите један од следећих радних оквира: $1",
        "javascripttest-pagetext-skins": "Изаберите с којом темом желите да покренете пробу:",
        "javascripttest-qunit-intro": "Погледајте [$1 документацију за тестирање] на mediawiki.org.",
-       "tooltip-pt-userpage": "Ваша корисничка страница",
+       "tooltip-pt-userpage": "{{GENDER:|Ваша}} корисничка страница",
        "tooltip-pt-anonuserpage": "Корисничка страница за ИП адресу с које уређујете",
-       "tooltip-pt-mytalk": "Ваша страница за разговор",
+       "tooltip-pt-mytalk": "{{GENDER:|Ваша}} страница за разговор",
        "tooltip-pt-anontalk": "Разговор о изменама с ове ИП адресе",
-       "tooltip-pt-preferences": "Ваша подешавања",
+       "tooltip-pt-preferences": "{{GENDER:|Ваша}} подешавања",
        "tooltip-pt-watchlist": "Списак страница које надгледате",
-       "tooltip-pt-mycontris": "Списак ваших доприноса",
+       "tooltip-pt-mycontris": "Списак {{GENDER:|ваших}} доприноса",
        "tooltip-pt-anoncontribs": "Списак измена направљених са ове IP адресе",
        "tooltip-pt-login": "Препоручујемо вам да се пријавите, иако то није обавезно.",
        "tooltip-pt-logout": "Одјавите се",
        "tooltip-t-recentchangeslinked": "Скорашње измене на страницама које су повезана с овом страницом",
        "tooltip-feed-rss": "RSS довод ове странице",
        "tooltip-feed-atom": "Атом довод ове странице",
-       "tooltip-t-contributions": "Ð\9fогледаÑ\98Ñ\82е Ñ\81пиÑ\81ак Ð´Ð¾Ð¿Ñ\80иноÑ\81а Ð¾Ð²Ð¾Ð³ ÐºÐ¾Ñ\80иÑ\81ника",
-       "tooltip-t-emailuser": "Пошаљите имејл овом кориснику",
+       "tooltip-t-contributions": "СпиÑ\81ак Ð´Ð¾Ð¿Ñ\80иноÑ\81а {{GENDER:$1|овог ÐºÐ¾Ñ\80иÑ\81ника|ове ÐºÐ¾Ñ\80иÑ\81ниÑ\86е}}",
+       "tooltip-t-emailuser": "Пошаљите имејл {{GENDER:$1|овом кориснику|овој корисници}}",
        "tooltip-t-info": "Више информација о овој страници",
        "tooltip-t-upload": "Пошаљите датотеке",
        "tooltip-t-specialpages": "Списак свих посебних страница",
index e42fc1a..60e6c3a 100644 (file)
        "newarticle": "(novi)",
        "newarticletext": "Došli ste na stranicu koja još ne postoji.\nDa biste je napravili, počnite da kucate u prozor ispod ovog teksta (pogledajte [$1 stranicu za pomoć]).\nAko ste ovde došli greškom, vratite se na prethodnu stranicu.",
        "anontalkpagetext": "---- Ovo je stranica za razgovor s anonimnim korisnikom koji još nema nalog ili ga ne koristi.\nZbog toga moramo da koristimo brojčanu IP adresu kako bismo ga prepoznali.\nTakvu adresu može deliti više korisnika.\nAko ste anonimni korisnik i mislite da su vam upućene primedbe, [[Special:UserLogin/signup|otvorite nalog]] ili se [[Special:UserLogin|prijavite]] da biste izbegli buduću zabunu s ostalim anonimnim korisnicima.",
-       "noarticletext": "Na ovoj stranici trenutno nema sadržaja.\nMožete [[Special:Search/{{PAGENAME}}|potražiti ovaj naslov]] na drugim stranicama,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti srodne izveštaje] ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} urediti stranicu]</span>.",
+       "noarticletext": "Na ovoj stranici trenutno nema sadržaja.\nMožete [[Special:Search/{{PAGENAME}}|potražiti ovaj naslov]] na drugim stranicama,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti srodne izveštaje] ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} napraviti ovu stranicu]</span>.",
        "noarticletext-nopermission": "Na ovoj stranici trenutno nema sadržaja.\nMožete [[Special:Search/{{PAGENAME}}|potražiti ovaj naslov]] na drugim stranicama ili <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti srodne dnevnike]</span>, ali nemate dozvolu da napravite ovu stranicu.",
        "missing-revision": "Ne mogu da pronađem izmenu br. $1 na stranici pod nazivom „{{FULLPAGENAME}}“.\n\nOvo se obično dešava kada pratite zastarelu vezu do stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].",
        "userpage-userdoesnotexist": "Korisnički nalog „<nowiki>$1</nowiki>“ nije otvoren.\nRazmislite da li zaista želite da napravite/uredite ovu stranicu.",
        "recentchanges-label-bot": "Ovu izmenu je napravio bot",
        "recentchanges-label-unpatrolled": "Ova izmena još nije patrolirana",
        "recentchanges-label-plusminus": "Promena veličine stranice u bajtovima",
-       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|spisak novih stranica]])",
        "recentchanges-submit": "Prikaži",
        "rcnotefrom": "Ispod {{PLURAL:$5|je izmena|su izmene}} od <strong>$3, $4</strong> (do <strong>$1</strong> prikazano).",
        "delete-toobig": "Ova stranica ima veliku istoriju, preko $1 {{PLURAL:$1|izmene|izmene|izmena}}.\nBrisanje takvih stranica je ograničeno da bi se sprečilo slučajno opterećenje servera.",
        "delete-warning-toobig": "Ova stranica ima veliku istoriju, preko $1 {{PLURAL:$1|izmene|izmene|izmena}}.\nNjeno brisanje može poremetiti bazu podataka, stoga postupajte s oprezom.",
        "deleteprotected": "Ne možete obrisati ovu stranicu zato što je zaštićena.",
-       "deleting-backlinks-warning": "'''Upozorenje:''' brišete stranicu koja je uključena u [[Special:WhatLinksHere/{{FULLPAGENAME}}|druge stranice]] ili druge stranice vode na nju.",
+       "deleting-backlinks-warning": "<strong>Upozorenje:</strong> brišete stranicu koja je uključena u [[Special:WhatLinksHere/{{FULLPAGENAME}}|druge stranice]] ili druge stranice vode na nju.",
        "rollback": "Vrati izmene",
        "rollbacklink": "vrati",
        "rollbacklinkcount": "vrati $1 {{PLURAL:$1|izmenu|izmene|izmena}}",
        "move-leave-redirect": "Ostavi preusmerenje",
        "protectedpagemovewarning": "'''Upozorenje:''' ova stranica je zaštićena, tako da samo korisnici s administratorskim ovlašćenjima mogu da je premeste.\nZa više informacija, poslednji zapis u dnevniku izmena je prikazan ispod:",
        "semiprotectedpagemovewarning": "'''Napomena:''' ova stranica je zaštićena, tako da samo registrovani korisnici mogu da je premeste.\nZa više informacija, poslednji zapis u dnevniku izmena je prikazan ispod:",
-       "move-over-sharedrepo": "== Datoteka postoji ==\n[[:$1]] se nalazi na deljenom skladištu. Ako premestite datoteku na ovaj naslov, to će zameniti deljenu datoteku.",
+       "move-over-sharedrepo": "[[:$1]] se nalazi na deljenom skladištu. Ako premestite datoteku na ovaj naslov, to će zameniti deljenu datoteku.",
        "file-exists-sharedrepo": "Navedeni naziv datoteke se već koristi u deljenom skladištu.\nIzaberite drugi naziv.",
        "export": "Izvoz stranica",
        "exporttext": "Možete izvesti tekst i istoriju izmena određene stranice ili grupe stranica u formatu XML.\nOvo onda može biti uvezeno u drugi viki koji koristi Medijaviki softver preko [[Special:Import|stranice za uvoz]].\n\nDa biste izvezli stranice, unesite nazive u okviru ispod, s jednim naslovom po redu, i izaberite da li želite tekuću izmenu i sve ostale, ili samo tekuću izmenu s podacima o poslednjoj izmeni.\n\nU drugom slučaju, možete koristiti i vezu, na primer [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] za stranicu [[{{MediaWiki:Mainpage}}]].",
        "javascripttest-pagetext-frameworks": "Izaberite jedan od sledećih radnih okvira: $1",
        "javascripttest-pagetext-skins": "Izaberite s kojom temom želite da pokrenete probu:",
        "javascripttest-qunit-intro": "Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.",
-       "tooltip-pt-userpage": "Vaša korisnička stranica",
+       "tooltip-pt-userpage": "{{GENDER:|Vaša}} korisnička stranica",
        "tooltip-pt-anonuserpage": "Korisnička stranica za IP adresu s koje uređujete",
-       "tooltip-pt-mytalk": "Vaša stranica za razgovor",
+       "tooltip-pt-mytalk": "{{GENDER:|Vaša}} stranica za razgovor",
        "tooltip-pt-anontalk": "Razgovor o izmenama s ove IP adrese",
-       "tooltip-pt-preferences": "Vaša podešavanja",
+       "tooltip-pt-preferences": "{{GENDER:|Vaša}} podešavanja",
        "tooltip-pt-watchlist": "Spisak stranica koje nadgledate",
-       "tooltip-pt-mycontris": "Spisak vaših doprinosa",
+       "tooltip-pt-mycontris": "Spisak {{GENDER:|vaših}} doprinosa",
        "tooltip-pt-anoncontribs": "Spisak izmena napravljenih sa ove IP adrese",
        "tooltip-pt-login": "Preporučujemo vam da se prijavite, iako to nije obavezno.",
        "tooltip-pt-logout": "Odjavite se",
        "tooltip-t-recentchangeslinked": "Skorašnje izmene na stranicama koje su povezana s ovom stranicom",
        "tooltip-feed-rss": "RSS dovod ove stranice",
        "tooltip-feed-atom": "Atom dovod ove stranice",
-       "tooltip-t-contributions": "Pogledajte spisak doprinosa ovog korisnika",
-       "tooltip-t-emailuser": "Pošaljite e-poruku ovom korisniku",
+       "tooltip-t-contributions": "Spisak doprinosa {{GENDER:$1|ovog korisnika|ove korisnice}}",
+       "tooltip-t-emailuser": "Pošaljite imejl {{GENDER:$1|ovom korisniku|ovoj korisnici}}",
        "tooltip-t-info": "Više informacija o ovoj stranici",
        "tooltip-t-upload": "Pošaljite datoteke",
        "tooltip-t-specialpages": "Spisak svih posebnih stranica",
index a399644..520f3b3 100644 (file)
        "recentchanges-label-bot": "Ieu parobahan dijieun ku bot",
        "recentchanges-label-unpatrolled": "Ieu éditan can karoris",
        "recentchanges-label-plusminus": "Ukuran kaca robah sajumlah ieu bit",
-       "recentchanges-legend-heading": "'''Pedaran:'''",
+       "recentchanges-legend-heading": "<strong>Pedaran:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (tempo ogé [[Special:NewPages|béréndélan kaca anyar]])",
        "rcnotefrom": "Di handap ieu parobahan saprak <b>$2</b> (nu ditémbongkeun nepi ka <b>$1</b>).",
        "rclistfrom": "Témbongkeun nu anyar robah nepi ka $3 $2",
index e856378..e3a6a1e 100644 (file)
        "moredotdotdot": "Mer...",
        "morenotlisted": "Denna lista är inte fullständig.",
        "mypage": "Sida",
+       "anonuserpage": "Okänd användare",
        "mytalk": "Diskussion",
        "anontalk": "Diskussion",
        "navigation": "Navigering",
        "nocookieslogin": "{{SITENAME}} använder kakor för att logga in användare. Du har stängt av kakor i din webbläsare. Försök igen med stöd för kakor aktiverat.",
        "nocookiesfornew": "Användarkontot skapades inte, eftersom vi inte kunde bekräfta dess källa.\nSe till att du har aktiverat kakor, ladda om denna sida och försök igen.",
        "noname": "Du har angett ett ogiltigt användarnamn.",
-       "loginsuccesstitle": "Inloggningen lyckades",
+       "loginsuccesstitle": "Inloggad",
        "loginsuccess": "'''Du är nu inloggad på {{SITENAME}} som \"$1\".'''",
        "nosuchuser": "Det finns ingen användare med namnet \"$1\".\nAnvändarnamn är skiftlägeskänsliga.\nKontrollera din stavning, eller [[Special:UserLogin/signup|skapa ett nytt konto]].",
        "nosuchusershort": "Det finns ingen användare som heter \"$1\". Kontrollera att du stavat rätt.",
        "botpasswords-insert-failed": "Kunde inte lägga till botnamnet \"$1\". Har det redan lagts till?",
        "botpasswords-update-failed": "Kunde inte uppdatera botnamnet \"$1\". Har det raderats?",
        "botpasswords-created-title": "Botlösenord skapades",
-       "botpasswords-created-body": "Botlösenordet \"$1\" skapades.",
+       "botpasswords-created-body": "Botlösenordet för botnamnet \"$1\" till användaren \"$2\" skapades.",
        "botpasswords-updated-title": "Botlösenordet uppdaterades",
-       "botpasswords-updated-body": "Botlösenordet \"$1\" uppdaterades.",
+       "botpasswords-updated-body": "Botlösenordet för botnamnet \"$1\" till användaren \"$2\" uppdaterades.",
        "botpasswords-deleted-title": "Botlösenord raderades",
-       "botpasswords-deleted-body": "Botlösenordet \"$1\" raderades.",
+       "botpasswords-deleted-body": "Botlösenordet för botnamnet \"$1\" till användaren \"$2\" raderades.",
        "botpasswords-newpassword": "Det nya lösenordet att logga in för <strong>$1</strong> är <strong>$2</strong>. <em>Spara detta som framtida referens.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider är inte tillgänglig.",
        "botpasswords-restriction-failed": "Begränsningar av botlösenord tillåter inte denna inloggning.",
        "revdelete-unsuppress": "Ta bort begränsningar på återställda versioner",
        "revdelete-log": "Anledning:",
        "revdelete-submit": "Tillämpa på {{PLURAL:$1|vald version|valda versioner}}",
-       "revdelete-success": "'''Sidversionssynlighet har uppdaterats.'''",
+       "revdelete-success": "Sidversionssynlighet har uppdaterats.",
        "revdelete-failure": "'''Sidversionssynlighet kunde inte uppdateras:'''\n$1",
-       "logdelete-success": "'''Loggens synlighet har ställts in.'''",
+       "logdelete-success": "Loggens synlighet har ställts in.",
        "logdelete-failure": "'''Loggens synlighet kunde inte ställas in:'''\n$1",
        "revdel-restore": "ändra synlighet",
        "pagehist": "Sidhistorik",
        "uploadstash-summary": "Denna sida ger tillgång till filer som är uppladdade (eller håller på att laddas upp) men som ännu inte är publicerade till wikin. Dessa filer är inte synliga för någon annan än den användare som laddade upp dem.",
        "uploadstash-clear": "Rensa temporärt lagrade filer",
        "uploadstash-nofiles": "Du har inga temporärt lagrade filer.",
-       "uploadstash-badtoken": "Utförandet av den åtgärden misslyckades, kanske för att din redigeringsrättigheter löpt ut. Försök igen.",
+       "uploadstash-badtoken": "Misslyckades att utföra åtgärden. Dina redigeringsrättigheter har kanske löpt ut. Försök igen.",
        "uploadstash-errclear": "Rensning av filerna misslyckades.",
        "uploadstash-refresh": "Uppdatera listan över filer",
        "invalid-chunk-offset": "Ogiltig segmentsförskjutning",
        "changecontentmodel-title-label": "Sidtitel",
        "changecontentmodel-model-label": "Ny innehållsmodell",
        "changecontentmodel-reason-label": "Orsak:",
+       "changecontentmodel-submit": "Ändra",
        "changecontentmodel-success-title": "Innehållsmodellen ändrades",
        "changecontentmodel-success-text": "Innehållstypen för [[:$1]] har ändrats.",
        "changecontentmodel-cannot-convert": "Innehållet på [[:$1]] kan inte konverteras till typen $2.",
index aca80f4..532f1ab 100644 (file)
        "recentchanges-label-bot": "Sahihisho hili lilitekelezwa na bot",
        "recentchanges-label-unpatrolled": "Haririo hili bado halijafanyiwa doria",
        "recentchanges-label-plusminus": "Ukubwa ukurasa kubadilishwa na hii idadi ya baiti",
-       "recentchanges-legend-heading": "'''Simulizi:'''",
+       "recentchanges-legend-heading": "<strong>Simulizi:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (pia tazama [[Special:NewPages|orodha ya kurasa mpya]])",
        "rcnotefrom": "Hapo chini {{PLURAL:$5|is the change|yaonekana mabadiliko}} tangu <strong>$3,$4</strong> (hadi <strong>$1</strong>tunaonyesha).",
        "rclistfrom": "Onyesha mabadiliko mapya kuanzia $3 $2",
index 55974d3..ee91968 100644 (file)
        "recentchanges-label-bot": "To sprowjyńy bůło zrobjůne uod bota",
        "recentchanges-label-unpatrolled": "To sprowjyńy ńy bůło jeszcze uowjerzůne",
        "recentchanges-label-plusminus": "Půmjyńono mjara zajty we bajtach",
-       "recentchanges-legend-heading": "'''Legynda:'''",
+       "recentchanges-legend-heading": "<strong>Legynda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (uobejrzij tyż [[Special:NewPages|lista nowych zajt]])",
        "rcnotefrom": "Půńiżej pokazano půmjyńańo zrobjůne pů <b>$2</b> (ńy wjyncyj kej <b>$1</b> pozycji).",
        "rclistfrom": "Ukoż půmjyńańa uod $3 $2",
index 512fb5d..37ab024 100644 (file)
@@ -45,7 +45,8 @@
                        "Anj.balaji",
                        "Dineshkumar Ponnusamy",
                        "Sharanrajindia",
-                       "Maathavan"
+                       "Maathavan",
+                       "தமிழ்க்குரிசில்"
                ]
        },
        "tog-underline": "இணைப்புகளுக்கு அடிக்கோடிடு",
        "loginlanguagelabel": "மொழி: $1",
        "suspicious-userlogout": "உங்கள் விடுபதிகை கோரிக்கை மறுக்கப்பட்டது ஏனென்றால் அது அறுபட்ட உலாவி அல்லது மாற்று இடைக்கிடங்கியால் அனுப்பப்பட்டுள்ளது.",
        "createacct-another-realname-tip": "உண்மையான பெயர் கட்டாயமற்றது.\nநீங்கள் இதை கொடுத்தால் உங்கள் ஆக்கங்களுக்கான உரிமையளிப்புகளின் போது இது பயன்படும்.",
-       "pt-login": "பà¯\81à®\95à¯\81பதிà®\95ை",
+       "pt-login": "à®\89ளà¯\8dநà¯\81à®´ை",
        "pt-login-button": "புகுபதிகை",
        "pt-createaccount": "புதிய கணக்கை உருவாக்கவும்",
        "pt-userlogout": "விடுபதிகை",
        "recentchanges-label-bot": "இந்த தொகுப்பானது ஒரு தானியங்கியால் செய்யப்பட்டதாகும்",
        "recentchanges-label-unpatrolled": "இந்த  தொகுப்பு  இன்னும் ரோந்திடப்படவில்லை",
        "recentchanges-label-plusminus": "இத்தனை பைட்டுகளுக்கு பக்கத்தின் அளவு மாற்றப்பட்டுள்ளது",
-       "recentchanges-legend-heading": "'''குறியீட்டு விளக்கம்:'''",
+       "recentchanges-legend-heading": "<strong>குறியீட்டு விளக்கம்:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|புதிய பக்கங்கள் பட்டியலையும்]] காணவும்)",
        "recentchanges-submit": "காட்டு",
        "rcnotefrom": "கீழே காணப்படுவது <strong>$3, $4</strong> இலிருந்து செய்யப்பட்ட (<strong>$1</strong> வரைக் காட்டப்பட்டுள்ளது) {{PLURAL:$5|மாற்றமாகும்.|மாற்றங்களாகும்.}}",
        "listfiles-latestversion-yes": "ஆம்",
        "listfiles-latestversion-no": "இல்லை",
        "file-anchor-link": "கோப்பு",
-       "filehist": "à®\95à¯\8bபà¯\8dபà¯\81 வரலாறு",
+       "filehist": "à®\95à¯\8bபà¯\8dபினà¯\8d வரலாறு",
        "filehist-help": "குறித்த நேரத்தில் இருந்த படிமத்தைப் பார்க்க அந்நேரத்தின் மீது சொடுக்கவும்.",
        "filehist-deleteall": "சகலத்தையும் நீக்கு",
        "filehist-deleteone": "நீக்குக",
index f183f40..11736b1 100644 (file)
        "recentchanges-label-bot": "ಈ ಸಂಪದನೆ ಒಂಜಿ ಬಾಟ್‍ಡ್ ಆತ್ಂಡ್",
        "recentchanges-label-unpatrolled": "ಈ ಸಂಪಾದನೆನ್ ನನಲಾ ಪರೀಕ್ಷೆ ಮಲ್ತ್‌ಜಿ.",
        "recentchanges-label-plusminus": "ಬೈಟ್ಸ್‌ದ ಲೆಕ್ಕೊಡು ಈ ಪಾಲೆದ ಗಾತ್ರೊ ಬದಲಾತ್ಂಡ್",
-       "recentchanges-legend-heading": "'''ಲೆಜೆಂಡ್:'''",
+       "recentchanges-legend-heading": "<strong>ಲೆಜೆಂಡ್:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ಬೊಕ್ಕೊಲಾ ತೂಲೆ [[Special:NewPages|ಪೊಸ ಪುಟೊದ ಪಟ್ಟಿ]])",
        "rclistfrom": "$3 $2 ರ್ದ್ ಸುರುವಾತಿನ ಪೊಸ ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾವು",
        "rcshowhideminor": "$1 ಎಲ್ಯೆಲ್ಯ ಬದಲಾವಣೆಲು",
index 583245c..5c3ad1c 100644 (file)
        "recentchanges-label-bot": "ఈ మార్పును ఒక బాటు చేసింది",
        "recentchanges-label-unpatrolled": "ఈ దిద్దుబాటు మీద నిఘా లేదు",
        "recentchanges-label-plusminus": "ఈ పేజి పరిమాణంలో  జరిగిన మార్పుల  బైట్ల సంఖ్య",
-       "recentchanges-legend-heading": "'''సూచిక :'''",
+       "recentchanges-legend-heading": "<strong>సూచిక :</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|కొత్త పేజీల జాబితా]]ను కూడా చూడండి)",
        "recentchanges-submit": "చూపించు",
        "rcnotefrom": "<strong>$2</strong> నుండి జరిగిన మార్పులు (<strong>$1</strong> వరకు) కింద చూపబడ్డాయి.",
index 5d2f881..453be28 100644 (file)
        "recentchanges-label-bot": "บอตกระทำการแก้ไขนี้",
        "recentchanges-label-unpatrolled": "การแก้ไขนี้ยังไม่ได้ตรวจสอบ",
        "recentchanges-label-plusminus": "ขนาดของหน้าเปลี่ยนไปจำนวนไบต์เท่านี้",
-       "recentchanges-legend-heading": "'''คำอธิบายสัญลักษณ์:'''",
+       "recentchanges-legend-heading": "<strong>คำอธิบายสัญลักษณ์:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ดูเพิ่มที่ [[Special:NewPages|รายชื่อหน้าใหม่]])",
        "recentchanges-submit": "แสดง",
        "rcnotefrom": "ด้านล่างเป็นการเปลี่ยนแปลงตั้งแต่ <strong>$3, $4</strong> (แสดงมากสุด <strong>$1</strong>)",
index 655d5ae..44ff623 100644 (file)
        "recentchanges-label-minor": "Isa itong munting pagbabago",
        "recentchanges-label-bot": "Gawa ng isang bot ang pagbabagong ito",
        "recentchanges-label-unpatrolled": "Hindi pa napapatrulyahan ang pagbabagong ito",
-       "recentchanges-legend-heading": "'''Gabay:'''",
+       "recentchanges-legend-heading": "<strong>Gabay:</strong>",
        "recentchanges-legend-newpage": "$1 - bagong pahina",
        "rcnotefrom": "Nasa ibaba ang mga pagbabago mula pa noong '''$2''' (ipinapakita ang magpahanggang sa '''$1''').",
        "rclistfrom": "Ipakita ang bagong mga pagbabago simula sa $3 $2",
index e5f2d1d..f214131 100644 (file)
        "newpassword": "Yeni parola",
        "retypenew": "Yeni parolayı tekrar girin",
        "resetpass_submit": "Şifreyi ayarlayın ve oturum açın",
-       "changepassword-success": "Parolanız başarıyla değiştirildi!",
+       "changepassword-success": "Parolanız değiştirildi!",
        "changepassword-throttled": "Çok fazla yeni oturum açma girişiminde bulundunuz.\nLütfen tekrar denemeden önce $1 bekleyin.",
        "botpasswords": "Bot şifreleri",
        "botpasswords-disabled": "Bot şifreleri devre dışı.",
        "revdelete-submit": "Seçilen {{PLURAL:$1|sürüme|sürümlere}} uygula",
        "revdelete-success": "'''Revizyon görünürlüğü başarıyla güncellendi.'''",
        "revdelete-failure": "'''Revizyon görünürlüğü güncellenemiyor:'''\n$1",
-       "logdelete-success": "'''Günlük görünürlüğü başarıyla ayarlandı.'''",
+       "logdelete-success": "Günlük görünürlüğü ayarlandı.",
        "logdelete-failure": "'''Günlük görünürlüğü ayarlanamadı:'''\n$1",
        "revdel-restore": "görünürlüğü değiştir",
        "pagehist": "Sayfa geçmişi",
        "recentchanges-label-bot": "Bu değişiklik bir bot tarafından yapıldı",
        "recentchanges-label-unpatrolled": "Bu değişiklik henüz gözlenmemiş",
        "recentchanges-label-plusminus": "Sayfa boyutundaki değişikliğin bayt bazında değeri",
-       "recentchanges-legend-heading": "'''Gösterge:'''",
+       "recentchanges-legend-heading": "<strong>Gösterge:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ayrıca [[Special:NewPages|yeni sayfalar listesine]] bakınız)",
        "recentchanges-submit": "Göster",
        "rcnotefrom": "<strong>$3, $4</strong> tarihinden itibaren yapılan {{PLURAL:$5|değişiklik|değişiklik}} aşağıdadır (<strong>$1</strong> tarhine kadar olanlar gösterilmektedir).",
index 49be8ce..ed1576b 100644 (file)
        "createaccount-title": "{{SITENAME}}: теркәлү",
        "createaccount-text": "Кемдер, электрон почта адресыгызны күрсәтеп, {{SITENAME}} ($4) проектында «$3» серсүзе белән «$2» исемле хисап язмасы теркәде. Сез керергә һәм серсүзегезне үзгәртергә тиеш.\n\nХисап язмасы төзү хата булса, бу хатны онытыгыз.",
        "login-throttled": "Сез артык күп тапкыр керергә тырыштыгыз.\nЗинһар, яңадан кабатлаганчы, $1 көтүегез сорала.",
-       "login-abort-generic": "Системага уңышсыз керү очрагы",
+       "login-abort-generic": "Системага керү килеп чыкмады",
        "loginlanguagelabel": "Тел: $1",
        "suspicious-userlogout": "Сезнең эшчәнлекне бетерү соравыгыз кире кагылды, чөнки ул ялгыш браузер яисә кэшлаучы прокси аша җибәрелергэ мөмкин.",
        "pt-login": "Керү",
        "newpassword": "Яңа серсүз:",
        "retypenew": "Яңа серсүзне кабатлагыз:",
        "resetpass_submit": "Серсүз куеп керү",
-       "changepassword-success": "Серсүзегез уңышлы үзгәртелде!",
+       "changepassword-success": "Серсүзегез үзгәртелде!",
        "botpasswords": "Ботларның серсүзләре",
        "botpasswords-label-appid": "Бот исеме:",
        "botpasswords-label-create": "Төзү",
        "resetpass-no-info": "Бу битне карау өчен сез системага үз хисап язмагыз ярдәмендә керергә тиеш.",
        "resetpass-submit-loggedin": "Серсүзне үзгәртү",
        "resetpass-submit-cancel": "Кире кагу",
-       "resetpass-wrong-oldpass": "ЯлгÑ\8bÑ\88 Ñ\81еÑ\80Ñ\81үз.\nСез серсүзегезне үзгәрткән яисә яңа вакытлы серсүз сораткан булырга мөмкинсез.",
+       "resetpass-wrong-oldpass": "Ð¥Ó\99зеÑ\80ге Ñ\8fиÑ\81Ó\99 Ð²Ð°ÐºÑ\8bÑ\82лÑ\8b Ñ\81еÑ\80Ñ\81үз Ð´Ó©Ñ\80еÑ\81 Ñ\82үгел.\nСез серсүзегезне үзгәрткән яисә яңа вакытлы серсүз сораткан булырга мөмкинсез.",
        "resetpass-temp-password": "Вакытлы серсүз:",
        "passwordreset": "Серсүзне бетерү",
        "passwordreset-disabled": "Бу викида серсүз бетереп булмый",
        "continue-editing": "Үзгәртүне дәвам итү",
        "previewconflict": "Әлеге алдан карау битендә сакланачак текстның ничек күренәчәге күрсәтелә.",
        "session_fail_preview": "Кызганычка каршы сессия барышы югалы, шуңа  күрә без сезнең төзәтмәләрнегезне кабул итә алмадык.\n\nБәлки сез хисап язмагыздан чыккансыздыр. <strong>Зинһар, керүегез турында инаныгыз һәм тагын бер тапкыр кабатлап карагыз.</strong>\nӘгәрдә бу ысул ярдәм итмәсәс, системадан [[Special:UserLogout|чыгыгыз]] һәм яңадан керегез. Шулай ук сезгә браузерыгызның  cookies файлларын кабул итүне тикшерүне карап чыгуны тәкъдим итәбез.",
-       "session_fail_preview_html": "'''Кызганычка, сезнең сессия турында мәгълүматлар югалды. Нәтиҗәдә сервер үзгәртүләрегезне кабул итә алмый.'''\n\n''{{SITENAME}} чиста HTML кулланырга рөхсәт итә, ә бу үз чиратында JavaScript-атакалар оештыру өчен кулланылырга мөмкин. Шул сәбәпле сезнең өчен алдан карау мөмкинлеге ябык.''\n\n'''Әгәр сез үзгәртүне яхшы ният белән башкарасыз икән, тагын бер тапкыр кабатлап карагыз. Хата кабатланса, сайттан [[Special:UserLogout|чыгыгыз]] һәм яңадан керегез.'''",
+       "session_fail_preview_html": "<strong>Кызганычка каршы сервер сезнең төзәтмәләрне сессия югалу аркасында кабул итә алмады.</strong>\n\n<em>{{SITENAME}} чиста HTML кулланырга рөхсәт итә, ә бу үз чиратында JavaScript-хөҗүмнәр оештыру өчен кулланылырга мөмкин. Шул сәбәпле сезнең өчен алдан карау мөмкинлеге ябык.</em>\n\n<strong>Әгәр сез үзгәртүне яхшы ният белән башкарасыз икән, тагын бер тапкыр кабатлап карагыз. Хата кабатланса, сайттан [[Special:UserLogout|чыгыгыз]] һәм яңадан керегез.</strong>",
        "token_suffix_mismatch": "'''Сезнең үзгәртү кабул ителмәде.'''\nСәбәбе: браузерыгыз үзгәртү өлкәсендәге пунктуацияне дөрес күрсәтми, нәтиҗәдә текст бозылырга мөмкин.\nМондый хаталар аноним web-проксилар кулланганда килеп чыгарга мөмкин.",
        "edit_form_incomplete": "'''Төзәтү кырларының кайбер өлешләре серверга барып ирешмәде. Сезнең үзгәртүләр бозылмаганмы - игътибар белән тикшерегез һәм яңадан җибәреп карагыз.'''",
        "editing": "«$1» битен үзгәртү",
        "revdelete-suppress": "Мәгълүматлар идарәчеләрдән дә яшерелсен",
        "revdelete-log": "Сәбәп:",
        "revdelete-submit": "{{PLURAL:$1|1=сайланылган юрамага|сайланылган юрамаларга}} кулланырга",
-       "revdelete-success": "'''Версиянең күренүчәнлеге уңышлы рәвештә үзгәртелде'''",
+       "revdelete-success": "Юраманың күренүчәнлеге яңартылды.",
        "revdelete-failure": "'''Версиянең күренүчәнлеге үзгәртелә алмый:'''\n$1",
        "logdelete-success": "Вакыйганың күренүчәнлеге үзгәртелде.",
        "logdelete-failure": "'''Көндәлекнең күренүчәнлеге  куелмады:'''\n$1",
        "recentchanges-label-bot": "Бу үзгәртү бот белән эшләнгән",
        "recentchanges-label-unpatrolled": "Үзгәртүне әлегә тикшермәгәннәр",
        "recentchanges-label-plusminus": "Битнең зурлыгы шуның кадәрле байтка үзгәрде",
-       "recentchanges-legend-heading": "'''Аңлатма:&nbsp;'''",
+       "recentchanges-legend-heading": "<strong>Аңлатма:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (шулай ук [[Special:NewPages|яңа битләр исемлеген]] карагыз)",
        "recentchanges-submit": "Күрсәт",
        "rcnotefrom": "Астарак <strong>$3, $4</strong> өчен {{PLURAL:$5|үзгәртүләр күрсәтелгән}} (<strong>$1</strong> артык түгел).",
        "delete-edit-reasonlist": "Сәбәпләр исемлеген үзгәртү",
        "rollbacklink": "кире кайтару",
        "rollbacklinkcount": "$1 {{PLURAL:$1|төзәтмәне}} кире кагу",
-       "editcomment": "Үзгәртү өчен тасвир: <em>$1</em>.",
+       "editcomment": "Үзгәртүләр тасвирламасы: <em>$1</em>.",
        "revertpage": "[[Special:Contributions/$2|$2]] үзгәртүләре ([[User talk:$2|бәхәс]])  [[User:$1|$1]] юрамасына кадәр кире кайтарылды",
        "changecontentmodel-title-label": "Битнең исеме",
        "changecontentmodel-reason-label": "Сәбәп:",
        "years": "{{PLURAL:$1|$1 ел}}",
        "ago": "$1 элек",
        "just-now": "яңа гына",
-       "hours-ago": "$1 cәгать элек",
-       "minutes-ago": "$1 минут элек",
+       "hours-ago": "$1 {{PLURAL:$1|cәгать}} элек",
+       "minutes-ago": "$1 {{PLURAL:$1|минут}} элек",
        "seconds-ago": "$1 {{PLURAL:$1|секунд}} элек",
        "monday-at": "дүшәмбе $1",
        "tuesday-at": "сишәмбе $1",
index ee4a7fc..a78db9e 100644 (file)
        "recentchanges-label-bot": "Bu üzgärtmä bot tarafınnan yasaldı",
        "recentchanges-label-unpatrolled": "Bu üzgärtmä älegä raslanmağan",
        "recentchanges-label-plusminus": "Bit zurlığınıñ baytlardağı üzgäreş",
-       "recentchanges-legend-heading": "'''Añlatma:'''",
+       "recentchanges-legend-heading": "<strong>Añlatma:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (şulay uq [[Special:NewPages|yaña bitlär isemlegen]] qarap alığız)",
        "rcnotefrom": "Astaraq '''$2''' başlap ('''$1''' qädär) üzgärtülär kürsätelgän.",
        "rclistfrom": "$3 $2 başlap yaña üzgärtülärne kürsät",
index 2d33eb1..4d6231b 100644 (file)
        "moredotdotdot": "Більше…",
        "morenotlisted": "Цей список неповний.",
        "mypage": "Сторінка",
+       "anonuserpage": "Невідомий користувач",
        "mytalk": "Обговорення",
        "anontalk": "Обговорення",
        "navigation": "Навігація",
        "nocookiesfornew": "Обліковий запис користувача не був створений через неможливість перевірити походження даних.\nПереконайтеся, що куки ввімкнено, оновіть сторінку і спробуйте ще раз.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
        "noname": "Ви зазначили неправильне ім'я користувача.",
-       "loginsuccesstitle": "УÑ\81пÑ\96Ñ\88ний Ð²Ñ\85Ñ\96д Ð´Ð¾ Ñ\81иÑ\81Ñ\82еми",
+       "loginsuccesstitle": "Ð\92Ñ\85Ñ\96д Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð¾",
        "loginsuccess": "'''Тепер ви працюєте в {{grammar:locative|{{SITENAME}}}} під іменем $1.'''",
        "nosuchuser": "Користувача з іменем «$1» не існує.\nВ іменах користувачів розрізняються великі й малі символи.\nПеревірте правильність написання або скористайтеся формою нижче, щоб [[Special:UserLogin/signup|створити новий обліковий запис]].",
        "nosuchusershort": "Користувача з іменем «$1» не існує.\nПеревірте правильність написання імені.",
        "createaccount-title": "Створення облікового запису для {{SITENAME}}",
        "createaccount-text": "Хтось створив обліковий запис «$2» на сервері проекту {{SITENAME}} ($4) з паролем «$3», зазначивши вашу адресу електронної пошти. Вам слід зайти і змінити пароль.\n\nІгноруйте дане повідомлення, якщо обліковий запис було створено помилково.",
        "login-throttled": "Ви зробили надто багато спроб ввійти до системи.\nБудь ласка, зачекайте $1 перед повторною спробою.",
-       "login-abort-generic": "Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ð²Ð²Ñ\96йÑ\82и Ð´Ð¾ Ñ\81иÑ\81Ñ\82еми",
+       "login-abort-generic": "Ð\92Ñ\85Ñ\96д Ñ\83 Ñ\81иÑ\81Ñ\82емÑ\83 Ð·Ð°Ð·Ð½Ð°Ð² Ð½ÐµÐ²Ð´Ð°Ñ\87Ñ\96 â\80\94 Ñ\81каÑ\81овано",
        "login-migrated-generic": "Ваш обліковий запис було перенесено і ваше ім'я користувача більше не існує на цій вікі.",
        "loginlanguagelabel": "Мова: $1",
        "suspicious-userlogout": "Ваш запит на завершення сеансу відхилений, оскільки він схожий на запит, відправлений зіпсованим веб-оглядачем або кешуючим проксі-сервером.",
        "newpassword": "Новий пароль:",
        "retypenew": "Ще раз введіть новий пароль:",
        "resetpass_submit": "Встановити пароль і ввійти",
-       "changepassword-success": "Ваш пароль успішно змінено!",
+       "changepassword-success": "Ваш пароль було змінено!",
        "changepassword-throttled": "Ви нещодавно зробили надто багато спроб ввійти до системи.\nБудь ласка, зачекайте $1 перед повторною спробою.",
        "botpasswords": "Паролі ботів",
        "botpasswords-summary": "<em>Паролі бота</em> дозволяють отримати доступ до облікового запису користувача через API без використання логіну і пароля головного облікового запису. Права користувача при вході з паролем бота можуть бути обмеженні.\n\nЯкщо ви не знаєте, навіщо воно вам, імовірно, краще цього не робіть. Ніхто ніколи не повинен просити вас, щоб ви створили чи повідомили цей пароль.",
        "botpasswords-insert-failed": "Не вдалось додати бота з іменем «$1». Можливо, він вже був доданий?",
        "botpasswords-update-failed": "Не вдалось оновити бота з іменем «$1». Можливо, він був видалений?",
        "botpasswords-created-title": "Пароль бота створено",
-       "botpasswords-created-body": "Пароль бота «$1» був успішно створений.",
+       "botpasswords-created-body": "Пароль бота з ім'ям «$1» користувача «$2» було створено.",
        "botpasswords-updated-title": "Пароль бота оновлено",
-       "botpasswords-updated-body": "Пароль бота «$1» був успішно оновлений.",
+       "botpasswords-updated-body": "Пароль бота з ім'ям «$1» користувача «$2» було оновлено.",
        "botpasswords-deleted-title": "Пароль бота видалено",
-       "botpasswords-deleted-body": "Пароль бота «$1» було видалено",
+       "botpasswords-deleted-body": "Пароль бота з ім'ям «$1» користувача «$2» було видалено",
        "botpasswords-newpassword": "Новий пароль для входу під <strong>$1</strong> — <strong>$2</strong>. <em>Запишіть його для подальшого використання.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider не доступний.",
        "botpasswords-restriction-failed": "Вхід не було здійснено через обмеження для паролю бота.",
        "resetpass-no-info": "Щоб звертатися безпосередньо до цієї сторінки, вам слід увійти до системи.",
        "resetpass-submit-loggedin": "Змінити пароль",
        "resetpass-submit-cancel": "Скасувати",
-       "resetpass-wrong-oldpass": "Ð\9dепÑ\80авилÑ\8cний Ñ\82имÑ\87аÑ\81овий Ð°Ð±Ð¾ Ð¿Ð¾Ñ\82оÑ\87ний Ð¿Ð°Ñ\80олÑ\8c.\nÐ\9cожливо, Ð²Ð¸ Ð²Ð¶Ðµ Ñ\83Ñ\81пÑ\96Ñ\88но змінили пароль або зробили запит на новий тимчасовий пароль.",
+       "resetpass-wrong-oldpass": "Ð\9dепÑ\80авилÑ\8cний Ñ\82имÑ\87аÑ\81овий Ð°Ð±Ð¾ Ð¿Ð¾Ñ\82оÑ\87ний Ð¿Ð°Ñ\80олÑ\8c.\nÐ\9cожливо, Ð\92и Ð²Ð¶Ðµ змінили пароль або зробили запит на новий тимчасовий пароль.",
        "resetpass-recycled": "Змініть свій пароль на щось інше, ніж ваш поточний пароль.",
        "resetpass-temp-emailed": "Ви ввійшли, використовуючи тимчасовий пароль, який отримали електронною поштою. \nДля завершення входу в систему необхідно задати новий пароль:",
        "resetpass-temp-password": "Тимчасовий пароль:",
        "revdelete-unsuppress": "Зняти обмеження з відновлених версій",
        "revdelete-log": "Причина:",
        "revdelete-submit": "Застосувати до {{PLURAL:$1|1=обраної версії|обраних версій}}",
-       "revdelete-success": "'''Видимість версії успішно змінена.'''",
+       "revdelete-success": "Видимість версії оновлено.",
        "revdelete-failure": "'''Видимість версії неможливо змінити:'''\n$1",
-       "logdelete-success": "'''Видимість події успішно змінена.'''",
+       "logdelete-success": "Видимість події встановлено.",
        "logdelete-failure": "'''Не вдалося встановити видимість журналу:'''\n$1",
        "revdel-restore": "Змінити видимість",
        "pagehist": "Історія сторінки",
        "prefs-watchlist": "Список спостереження",
        "prefs-editwatchlist": "Редагування списку спостереження",
        "prefs-editwatchlist-label": "Редагування елементів Вашого списку спостереження:",
-       "prefs-editwatchlist-edit": "Ð\9fеÑ\80еглÑ\8fд Ñ\96 Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ\8f Ð½Ð°Ð·Ð² Ð· Ð²ашого списку спостереження",
+       "prefs-editwatchlist-edit": "Ð\9fеÑ\80еглÑ\8fд Ñ\96 Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ\8f Ð½Ð°Ð·Ð² Ð· Ð\92ашого списку спостереження",
        "prefs-editwatchlist-raw": "Редагувати список спостереження як текст",
        "prefs-editwatchlist-clear": "Очистити список спостереження",
        "prefs-watchlist-days": "Кількість днів, що відображаються у списку спостережень:",
        "userrights-unchangeable-col": "Групи, які ви не можете змінити",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Конфлікт зміни прав користувача! Будь ласка, перевірте та  підтвердіть зміни знову.",
-       "userrights-removed-self": "Ви успішно позбавили себе власних прав. Через це Ви більше не маєте доступу до цієї сторінки.",
+       "userrights-removed-self": "Ви позбавили себе власних прав. Через це Ви більше не маєте доступу до цієї сторінки.",
        "group": "Група:",
        "group-user": "Користувачі",
        "group-autoconfirmed": "Автопідтверджені користувачі",
        "uploadstash-summary": "Ця сторінка надає доступ до файлів, що були завантажені (або завантажуються зараз), але ще не були опубліковані в вікі. Ці файли не відображаються нікому, крім користувача, що їх завантажив.",
        "uploadstash-clear": "Очистити сховані файли",
        "uploadstash-nofiles": "У вас немає схованих файлів.",
-       "uploadstash-badtoken": "Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ\82и Ð²ÐºÐ°Ð·Ð°Ð½Ñ\96 Ð´Ñ\96Ñ\97. Ð\9cожливо, Ð²Ð¸Ñ\87еÑ\80паний Ñ\82еÑ\80мÑ\96н Ð´Ñ\96Ñ\97 Ñ\81еÑ\81Ñ\96Ñ\97 Ñ\80едагÑ\83ваннÑ\8f. Ð¡пробуйте ще раз.",
-       "uploadstash-errclear": "Ð\9eÑ\87иÑ\89еннÑ\8f Ñ\84айлÑ\96в Ð½Ðµ Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f.",
+       "uploadstash-badtoken": "Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ\82и Ð²ÐºÐ°Ð·Ð°Ð½Ñ\83 Ð´Ñ\96Ñ\8e. Ð\9cожливо, Ð²Ð¸Ñ\87еÑ\80паний Ñ\82еÑ\80мÑ\96н Ð´Ñ\96Ñ\97 Ñ\81еÑ\81Ñ\96Ñ\97 Ñ\80едагÑ\83ваннÑ\8f. Ð\91Ñ\83дÑ\8c Ð»Ð°Ñ\81ка, Ñ\81пробуйте ще раз.",
+       "uploadstash-errclear": "Ð\9eÑ\87иÑ\89еннÑ\8f Ñ\84айлÑ\96в Ð·Ð°Ð·Ð½Ð°Ð»Ð¾ Ð½ÐµÐ²Ð´Ð°Ñ\87Ñ\96.",
        "uploadstash-refresh": "Оновити список файлів",
        "invalid-chunk-offset": "Неприпустимий зсув фрагмента",
        "img-auth-accessdenied": "Відмовлено в доступі",
        "changecontentmodel-title-label": "Назва сторінки",
        "changecontentmodel-model-label": "Нова модель вмісту",
        "changecontentmodel-reason-label": "Причина:",
+       "changecontentmodel-submit": "Змінити",
        "changecontentmodel-success-title": "Модель вмісту було змінено",
        "changecontentmodel-success-text": "Тип вмісту сторінки [[:$1]] було змінено.",
        "changecontentmodel-cannot-convert": "Вміст сторінки [[:$1]] не можна перетворити на вміст типу $2.",
        "tags-delete-not-allowed": "Мітки, визначені розширенням, не можуть бути вилучені, якщо тільки розширення не дозволяє це окремо.",
        "tags-delete-not-found": "Мітка «$1» не існує.",
        "tags-delete-too-many-uses": "Міткою «$1» понад $2 {{PLURAL:$2|редагування|редагування|редагувань}}, і це означає, що її не можна вилучити.",
-       "tags-delete-warnings-after-delete": "Мітку «$1» було успішно вилучено, але {{PLURAL:$2|з'явились такі|1=з'явилось таке}} попередження:",
+       "tags-delete-warnings-after-delete": "Мітку «$1» було вилучено, але {{PLURAL:$2|з'явилось таке|з'явились такі}} попередження:",
        "tags-activate-title": "Активувати мітку",
        "tags-activate-question": "Ви збираєтеся активувати мітку «$1».",
        "tags-activate-reason": "Причина:",
        "tags-edit-reason": "Причина:",
        "tags-edit-revision-submit": "Застосувати зміни до {{PLURAL:$1|цієї версії|$1 версій}}",
        "tags-edit-logentry-submit": "Застосувати зміни до {{PLURAL:$1|цього журнального запису|$1 журнальних записів}}",
-       "tags-edit-success": "Зміни успішно застосовано",
+       "tags-edit-success": "Зміни застосовано.",
        "tags-edit-failure": "Не вдалося застосувати зміни:\n$1",
        "tags-edit-nooldid-title": "Некоректна цільова версія",
        "tags-edit-nooldid-text": "Ви або не вказали цільову версію, до якої задіяти функцію, або вказали неіснуючу версію.",
index 3ce29fc..abceeb0 100644 (file)
        "recentchanges-label-bot": "اس ترمیم کو ایک روبہ نے انجام دیا ہے",
        "recentchanges-label-unpatrolled": "اس ترمیم کی اب تک مراجعت نہیں کی گئی",
        "recentchanges-label-plusminus": "صفحہ کا حجم تبدیل شدہ بلحاظ بائٹ مقدار",
-       "recentchanges-legend-heading": "'''اختیارات'''",
+       "recentchanges-legend-heading": "<strong>اختیارات</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (نیز [[Special:NewPages|جدید صفحات کی فہرست]]) ملاحظہ فرمائیں",
        "recentchanges-submit": "دکھائیں",
        "rcnotefrom": "ذیل میں <strong>$3, $4</strong> سے کی گئی {{PLURAL:$5|تبدیلی|تبدیلیاں}} <strong>$1</strong> تک دکھائی جا رہی ہیں۔",
index 40d6018..2a3c48f 100644 (file)
        "recentchanges-label-bot": "Bu tahrirni bot bajargan",
        "recentchanges-label-unpatrolled": "Bu tahrir hali tekshirilmagan",
        "recentchanges-label-plusminus": "Sahifa vazni qanchaga oʻzgargani (bayt)",
-       "recentchanges-legend-heading": "'''Izoh:'''",
+       "recentchanges-legend-heading": "<strong>Izoh:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|alohida roʻyxat]])",
        "rcnotefrom": "Quyida <strong>$3, $4</strong> dan keyin sodir boʻlgan oʻzgarishlar koʻrsatilgan (oxirgi <strong>$1</strong> tasi).",
        "rclistfrom": "$3, $2 dan keyin sodir boʻlgan oʻzgarishlarni koʻrsat",
index cabec16..6358cec 100644 (file)
        "recentchanges-label-bot": "Sta modifica el la ga fata un bot",
        "recentchanges-label-unpatrolled": "Sta modifica no la xe stà gnancora verificà",
        "recentchanges-label-plusminus": "La dimension de la pagina la xe canbià de sto nùmaro de byte",
-       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (varda anca [[Special:NewPages|l'elenco de le pagine nove]])",
        "rcnotefrom": "Qui di seguito sono elencate le modifiche da '''$2''' (fino a '''$1''').",
        "rclistfrom": "Mostra i canbiamenti fati da ƚe $2 del $3",
index 3ac8d05..d25b622 100644 (file)
        "moredotdotdot": "Thêm nữa…",
        "morenotlisted": "Danh sách này không có đầy đủ.",
        "mypage": "Trang cá nhân",
+       "anonuserpage": "Người dùng không rõ",
        "mytalk": "Tin nhắn",
        "anontalk": "Thảo luận",
        "navigation": "Xem nhanh",
        "nocookieslogin": "{{SITENAME}} sử dụng cookie để đăng nhập thành viên. Bạn đã tắt cookie. Xin hãy kích hoạt rồi thử lại.",
        "nocookiesfornew": "Không thể mở tài khoản vì không thể xác nhận nguồn yêu cầu nó.\nHãy chắc chắn bạn đã bật lên cookie, làm mới trang này, và thử lại.",
        "noname": "Chưa nhập tên.",
-       "loginsuccesstitle": "Đăng nhập thành công",
+       "loginsuccesstitle": "Đã đăng nhập",
        "loginsuccess": "'''Bạn đã đăng nhập vào {{SITENAME}} với tên “$1”.'''",
        "nosuchuser": "Không có thành viên nào có tên “$1”.\nTên người dùng có phân biệt chữ hoa chữ thường.\nHãy kiểm tra lại chính tả, hoặc [[Special:UserLogin/signup|mở tài khoản mới]].",
        "nosuchusershort": "Không có thành viên nào có tên “$1”. Xin hãy kiểm tra lại chính tả.",
        "createaccount-title": "Tài khoản mới tại {{SITENAME}}",
        "createaccount-text": "Ai đó đã tạo một tài khoản với tên $2 tại {{SITENAME}} ($4). Mật khẩu của “$2” là “$3”. Bạn nên đăng nhập và đổi mật khẩu ngay bây giờ.\n\nXin 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 tạo ra.",
        "login-throttled": "Bạn đã hết quyền thử mật khẩu tài khoản này vì bạn đã nhập sai quá nhiều. Xin hãy đợi $1 rồi hãy thử lại.",
-       "login-abort-generic": "Thất bại khi đăng nhập",
+       "login-abort-generic": "Đăng nhập của bạn không thành công – bị hủy bỏ",
        "login-migrated-generic": "Tài khoản của bạn đã được hợp nhất, và tên đăng nhập của bạn không còn tồn tại trên wiki này.",
        "loginlanguagelabel": "Ngôn ngữ: $1",
        "suspicious-userlogout": "Đã bỏ qua yêu cầu đăng xuất bạn, hình như được gửi từ trình duyệt hoặc máy proxy nhớ đệm hư.",
        "newpassword": "Mật khẩu mới:",
        "retypenew": "Gõ lại:",
        "resetpass_submit": "Chọn mật khẩu và đăng nhập",
-       "changepassword-success": "Đã đổi mật khẩu thành công!",
+       "changepassword-success": "Mật khẩu của bạn đã được thay đổi.",
        "changepassword-throttled": "Bạn đã thử đăng nhập gần đây nhiều lần quá. Xin chờ $1 trước khi bạn thử lần nữa.",
        "botpasswords": "Mật khẩu Bot",
        "botpasswords-disabled": "Mật khẩu Bot bị vô hiệu hoá.",
        "revdelete-unsuppress": "Bỏ các hạn chế trên các phiên bản được phục hồi",
        "revdelete-log": "Lý do:",
        "revdelete-submit": "Áp dụng vào {{PLURAL:$1|phiên bản|các phiên bản}} được chọn",
-       "revdelete-success": "'''Đã cập nhật thành công độ khả kiến của phiên bản.'''",
+       "revdelete-success": "Phiên bản Hiển thị đã cập nhật.",
        "revdelete-failure": "'''Không thể cập nhật khả năng hiển thị của phiên bản:'''\n$1",
        "logdelete-success": "'''Khả năng nhìn thấy của sự kiện đã được thiết lập thành công.'''",
        "logdelete-failure": "'''Không thể thiết lập khả năng hiện thị của nhật trình:'''\n$1",
        "mergehistory-fail": "Không thể thực hiện được việc trộn lịch sử sửa đổi, vui lòng chọn lại trang cũng như thông số ngày giờ.",
        "mergehistory-fail-invalid-source": "Trang nguồn không hợp lệ.",
        "mergehistory-fail-invalid-dest": "Trang đích không hợp lệ.",
+       "mergehistory-fail-no-change": "Kết hợp lịch sử đã không hợp nhất bất kỳ sửa đổi nào. Xin vui lòng kiểm tra lại trang và các thông số thời gian.",
        "mergehistory-fail-permission": "Không đủ quyền để hợp nhất lịch sử.",
        "mergehistory-fail-self-merge": "Trang nguồn và đích là giống nhau.",
        "mergehistory-fail-toobig": "Không thể trộn lịch sử vì phải di chuyển $1 phiên bản và vượt quá giới hạn cho phép.",
        "uploaded-script-svg": "Tìm thấy phần tử “$1” có khả năng chạy kịch bản trong tập tin SVG được tải lên.",
        "uploaded-hostile-svg": "Tìm thấy CSS nguy hiểm trong phần tử style của tập tin SVG được tải lên.",
        "uploaded-event-handler-on-svg": "Không cho phép đặt thuộc tính xử lý sự kiện <code>$1=\"$2\"</code> trong tập tin SVG.",
-       "uploaded-href-unsafe-target-svg": "Tìm thấy href đến đích data: URI không an toàn <code>&lt;$1 $2=\"$3\"&gt;</code> trong tập tin SVG được tải lên.",
+       "uploaded-href-unsafe-target-svg": "Tìm thấy href đến đích URI data: không an toàn <code>&lt;$1 $2=\"$3\"&gt;</code> trong tập tin SVG được tải lên.",
        "uploaded-animate-svg": "Tìm thấy thẻ “animate” có thể thay đổi href qua thuộc tính “from” <code>&lt;$1 $2=\"$3\"&gt;</code> trong tập tin SVG được tải lên.",
        "uploaded-setting-event-handler-svg": "Đã ngăn cản việc đặt thuộc tính xử lý sự kiện khi tìm thấy <code>&lt;$1 $2=\"$3\"&gt;</code> trong tập tin SVG được tải lên.",
        "uploaded-setting-href-svg": "Cấm sử dụng thẻ “set” để thêm thuộc tính “href” vào phần tử mẹ.",
        "upload-dialog-button-upload": "Tải lên",
        "upload-form-label-infoform-title": "Chi tiết",
        "upload-form-label-infoform-name": "Tên",
+       "upload-form-label-infoform-name-tooltip": "Một tiêu đề mô tả duy nhất cho tập tin, mà sẽ được dùng để làm một tên file. Bạn có thể sử dụng ngôn ngữ đơn giản với các dấu cách. Không bao gồm phần mở rộng của file.",
        "upload-form-label-infoform-description": "Miêu tả",
        "upload-form-label-usage-title": "Sử dụng",
        "upload-form-label-usage-filename": "Tên tập tin",
        "apisandbox-fullscreen": "Mở rộng bảng điều khiển",
        "apisandbox-fullscreen-tooltip": "Mở rộng bảng sandbox để điền vào cửa sổ trình duyệt.",
        "apisandbox-unfullscreen": "Hiển thị trang",
+       "apisandbox-unfullscreen-tooltip": "Thu nhỏ bảng điều khiển sandbox, do đó các linh kiện chuyển hướng MediaWiki sẽ được kích hoạt.",
        "apisandbox-submit": "Yêu cầu",
        "apisandbox-reset": "Tẩy trống",
        "apisandbox-retry": "Thử lại",
        "apisandbox-loading": "Đang tải thông tin cho mô-đun API \"$1\"...",
+       "apisandbox-load-error": "Một lỗi xuất hiện khi tải thông tin cho mô-đun API \"$1\": $2",
        "apisandbox-no-parameters": "Mô-đun API này không có thông số.",
        "apisandbox-helpurls": "Các đường dẫn trợ giúp",
        "apisandbox-examples": "Các ví dụ",
        "apisandbox-dynamic-error-exists": "Một tham số có tên \"$1\" đã tồn tại.",
        "apisandbox-fetch-token": "Tự động điền token này",
        "apisandbox-submit-invalid-fields-title": "Một số field là không hợp lệ",
+       "apisandbox-submit-invalid-fields-message": "Xin vui lòng sửa các miền được đánh dấu và thử lại.",
        "apisandbox-results": "Kết quả",
        "apisandbox-sending-request": "Đang gửi yêu cầu API...",
        "apisandbox-loading-results": "Nhận kết quả API...",
        "apisandbox-results-error": "Một lỗi xuất hiện khi tải các đáp ứng truy vấn API: $1.",
        "apisandbox-request-url-label": "URL của yêu cầu:",
-       "apisandbox-request-time": "Thời gian yêu cầu: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-request-time": "Thời gian yêu cầu: $1 ms",
        "apisandbox-alert-page": "Các miền trên Trang này là không hợp lệ.",
+       "apisandbox-alert-field": "Giá trị của miền này là không hợp lệ.",
        "booksources": "Nguồn sách",
        "booksources-search-legend": "Tìm kiếm nguồn sách",
        "booksources-search": "Tìm kiếm",
        "changecontentmodel-title-label": "Tên trang",
        "changecontentmodel-model-label": "Kiểu nội dung mới",
        "changecontentmodel-reason-label": "Lý do:",
+       "changecontentmodel-submit": "Thay đổi",
        "changecontentmodel-success-title": "Kiểu nội dung đã thay đổi",
        "changecontentmodel-success-text": "Kiểu nội dung của [[:$1]] đã được thay đổi.",
        "changecontentmodel-cannot-convert": "Không thể chuyển đổi nội dung [[:$1]] thành nội dung dưới dạng $2.",
        "tooltip-feed-rss": "Nguồn cấp RSS của trang này",
        "tooltip-feed-atom": "Nguồn cấp Atom của trang này",
        "tooltip-t-contributions": "Danh sách đóng góp của {{GENDER:$1|người này}}",
-       "tooltip-t-emailuser": "Gửi thư cho người này",
+       "tooltip-t-emailuser": "Gửi thư cho {{GENDER:$1|người dùng này}}",
        "tooltip-t-info": "Thêm chi tiết về trang này",
        "tooltip-t-upload": "Tải hình ảnh hoặc tập tin lên",
        "tooltip-t-specialpages": "Danh sách các trang đặc biệt",
        "lastmodifiedatby": "Trang này được $3 cập nhật lần cuối lúc $2 $1.",
        "othercontribs": "Dựa trên công trình của $1.",
        "others": "những người khác",
-       "siteusers": "{{PLURAL:$2|Thành viên|Các thành viên}} $1 của {{SITENAME}}",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|người dùng}}|users}} $1",
        "anonusers": "{{PLURAL:$2|người dùng|những người dùng}} vô danh $1 tại {{SITENAME}}",
        "creditspage": "Trang ghi nhận đóng góp",
        "nocredits": "Không có thông tin ghi nhận đóng góp cho trang này.",
        "pageinfo-category-files": "Số tập tin",
        "markaspatrolleddiff": "Đánh dấu tuần tra",
        "markaspatrolledtext": "Đánh dấu tuần tra trang này",
+       "markaspatrolledtext-file": "Đánh dấu phiên bản fiel này là đã kiểm tra",
        "markedaspatrolled": "Đã đánh dấu tuần tra",
        "markedaspatrolledtext": "Phiên bản được chọn của [[:$1]] đã được đánh dấu tuần tra.",
        "rcpatroldisabled": "“Thay đổi gần đây” của các trang tuần tra không bật",
        "tags-delete-not-allowed": "Thẻ được định nghĩa bởi một mở rộng không thể bị xóa trừ khi mở rộng đặc biệt cho phép điều đó xảy ra.",
        "tags-delete-not-found": "Thẻ “$1” không tồn tại.",
        "tags-delete-too-many-uses": "Thẻ “$1” được áp dụng cho hơn $2 phiên bản, có nghĩa là nó không thể bị xóa.",
-       "tags-delete-warnings-after-delete": "Thẻ “$1” bị xóa thành công, nhưng gặp {{PLURAL:$2|cảnh báo|các cảnh báo}} sau:",
+       "tags-delete-warnings-after-delete": "Thẻ “$1” đã được xóa thành công, nhưng gặp phải {{PLURAL:$2|cảnh báo|các cảnh báo}} sau:",
        "tags-activate-title": "Kích hoạt thẻ",
        "tags-activate-question": "Bạn sắp sửa kích hoạt thẻ “$1”.",
        "tags-activate-reason": "Lý do:",
        "mediastatistics-summary": "Thống kê về các kiểu tập tin đã tải lên. Bảng này chỉ liệt kê phiên bản mới nhất của các tập tin. Các phiên bản cũ hoặc các phiên bản bị xóa được bỏ qua.",
        "mediastatistics-nbytes": "$1 byte ($2; $3%)",
        "mediastatistics-bytespertype": "Tổng kích thước tập tin của phần này: $1 byte.",
-       "mediastatistics-allbytes": "Tổng kích thước của tất cả các tập tin: $1 byte.",
+       "mediastatistics-allbytes": "Tổng kích thước của tất cả các file: {{PLURAL:$1|$1 byte|$1 bytes}} ($2).",
        "mediastatistics-table-mimetype": "Kiểu MIME",
        "mediastatistics-table-extensions": "Phần mở rộng có thể",
        "mediastatistics-table-count": "Số tập tin",
index 1b7d1a0..afd8d8d 100644 (file)
        "recentchanges-label-bot": "Seo muutmisõ tekk' robot",
        "recentchanges-label-unpatrolled": "Seod muutmist olõ-õi viil üle kaet",
        "recentchanges-label-plusminus": "Lehe suurusõ muutus baidõn",
-       "recentchanges-legend-heading": "'''Seletüs:'''",
+       "recentchanges-legend-heading": "<strong>Seletüs:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kaeq ka [[Special:NewPages|vahtsidõ lehti nimekirjä]])",
        "rcnotefrom": "Tan ommaq muutmisõq kuupääväst '''$2''' pääle (näüdätäs kooniq '''$1''' muutmist).",
        "rclistfrom": "Näütäq muutmiisi kuupääväst $3 $2 pääle",
index 2d4673a..6125556 100644 (file)
        "recentchanges-label-bot": "Ini nga pagliwat in ginbuhat han bot",
        "recentchanges-label-unpatrolled": "Ini nga pagliwat in diri pa nakapatrol",
        "recentchanges-label-plusminus": "An kadako han pakli in nabag-o hin ini nga numero nga mga byte",
-       "recentchanges-legend-heading": "'''Leyenda:'''",
+       "recentchanges-legend-heading": "<strong>Leyenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kitaa gihapon [[Special:NewPages|talaan han mga bag-o nga pakli]])",
        "recentchanges-submit": "Pakit-a",
        "rcnotefrom": "An ha ubos in mga pagbabag-o tikang han <strong>$2</strong> (kutob ngadto ha <strong>$1</strong> nga ginpakita).",
index 3b8fbbb..36cf7d0 100644 (file)
        "recentchanges-label-bot": "Coppite bu ab bot def",
        "recentchanges-label-unpatrolled": "Coppite bii kenn fugloogu ko",
        "recentchanges-label-plusminus": "Dayoob xët wi soppeeku na ci lu ni toll ciy byte.",
-       "recentchanges-legend-heading": "'''Piri:'''",
+       "recentchanges-legend-heading": "<strong>Piri:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (wone itam [[Special:NewPages|limu xët yu bees yi]]) -",
        "rcnotefrom": "Yii ñooy coppite yi dalee '''$2''' (ba '''$1''').",
        "rclistfrom": "Wone coppite yi mujj yi dooree $3 $2",
index 65d5bdb..a397552 100644 (file)
        "perfcachedts": "下头是缓存数据,阿末一趟更新辰光是$1。缓存里最多有{{PLURAL:$4|$4条结果}}。",
        "querypage-no-updates": "当前禁止对此页面进行更新。箇搭个数据弗好立即刷新。",
        "viewsource": "望源码",
-       "viewsource-title": "望“$1”个源码",
+       "viewsource-title": "望“$1”个源码",
        "actionthrottled": "动作已压制",
        "actionthrottledtext": "基于反滥用个考量,限制垃拉短时间内多趟重复箇只操作。请过脱几分钟再试试看。",
        "protectedpagetext": "箇页锁牢定,防编搭各许操作。",
        "whitelistedittext": "请$1编辑。",
        "confirmedittext": "垃拉编辑此页之前侬必须确认侬个邮箱地址。请通过[[Special:Preferences|个人设置]]设置并验证侬个邮箱地址。",
        "nosuchsectiontitle": "寻弗着箇只段落",
-       "nosuchsectiontext": "侬尝试编辑个章节弗存在。\n作兴是垃拉侬查看页面个辰光已经移动或者畀删除。",
+       "nosuchsectiontext": "侬尝试编辑个章节弗存在。作兴是垃拉侬望页面个辰光已经畀移动或者删脱。",
        "loginreqtitle": "必须登录",
        "loginreqlink": "登录",
        "loginreqpagetext": "请$1来望其他页面。",
        "permissionserrorstext-withaction": "为仔下头个{{PLURAL:$1|原因|原因}}咾侬无权进行$2操作:",
        "recreate-moveddeleted-warn": "<strong>警告:你来上重新创建一只老早删过个页面。</strong>\n\n你应该考虑继续编辑箇只页面啊合适。为方便起见,箇只页面个删除搭移动记录提供勒下底:",
        "moveddeleted-notice": "箇页删脱哉。箇页个删除搭移动记录提供垃拉下头以便参考。",
-       "log-fulllog": "æ\9f¥ç\9c\8b完整日志",
+       "log-fulllog": "æ\9c\9b完整日志",
        "edit-hook-aborted": "编辑畀钩子取消。\n渠弗曾畀出解释。",
        "edit-gone-missing": "弗好更新页面。\n渠作兴齐巧畀删除。",
        "edit-conflict": "编辑冲突",
        "textmatches": "页面内容匹配",
        "notextmatches": "呒没匹配个页面文本",
        "prevn": "前$1个",
-       "nextn": "$1个",
+       "nextn": "$1个",
        "prev-page": "上页",
        "next-page": "下页",
        "prevn-title": "前$1个结果",
        "nextn-title": "后$1个结果",
        "shown-title": "一页显示$1个结果",
-       "viewprevnext": "æ\9f¥ç\9c\8b($1 {{int:pipe-separator}} $2)($3)",
+       "viewprevnext": "æ\9c\9b($1 {{int:pipe-separator}} $2)($3)",
        "searchmenu-exists": "'''箇wiki里有一页名字“[[:$1]]”哉'''",
        "searchmenu-new": "<strong>登箇Wiki上建“[[:$1]]”页!</strong>{{PLURAL:$2|0=|另见寻着个页面。|另见搜寻个结果。}}",
        "searchprofile-articles": "内容页",
        "recentchanges-legend": "近段辰光个改动选项",
        "recentchanges-summary": "登该个页面浪跟踪最近对维基百科个改动。",
        "recentchanges-feed-description": "跟踪此订阅垃拉 wiki 高头个最近更改。",
-       "recentchanges-label-newpage": "箇编辑建立着新页",
+       "recentchanges-label-newpage": "箇编辑建立着新页",
        "recentchanges-label-minor": "箇是小编写",
        "recentchanges-label-bot": "箇编辑由机器人执行",
-       "recentchanges-label-unpatrolled": "编辑还朆巡查",
+       "recentchanges-label-unpatrolled": "编辑还朆巡查",
        "recentchanges-label-plusminus": "箇页面字节数前后个变化",
-       "recentchanges-legend-heading": "'''说明:'''",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}(见[[Special:NewPages|新页列表]])",
+       "recentchanges-legend-heading": "<strong>说明:</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}(见[[Special:NewPages|新页列表]])",
        "rclistfrom": "显示 $3 $2 以来个新改动",
        "rcshowhideminor": "$1小编写",
        "rcshowhideminor-show": "显示",
        "fileuploadsummary": "小结:",
        "filereuploadsummary": "文件更改:",
        "filestatus": "版权状态:",
-       "filesource": "来源:",
+       "filesource": "来源",
        "ignorewarning": "弗管警告,随便哪亨要保存文件。",
        "ignorewarnings": "忽略所有警告",
        "minlength1": "文件名至少一個字。",
        "restriction-move": "捅荡",
        "undeletepage": "查看搭仔恢复删脱个页面",
        "viewdeletedpage": "望望相删脱个页面",
-       "undeletelink": "æ\9f¥ç\9c\8b/è¿\98å\8e\9f",
+       "undeletelink": "æ\9c\9b\81¢å¤\8d",
        "undeleteviewlink": "望",
        "undeletecomment": "理由:",
        "undelete-search-submit": "搜尋",
        "tooltip-ca-talk": "讨论内容页",
        "tooltip-ca-edit": "编辑箇页",
        "tooltip-ca-addsection": "开始新段",
-       "tooltip-ca-viewsource": "箇页受保护,你好望源代码",
+       "tooltip-ca-viewsource": "箇页畀保护勒上。你好望源码",
        "tooltip-ca-history": "该只页面老早个版本",
        "tooltip-ca-protect": "保护箇页",
        "tooltip-ca-delete": "删脱箇页",
        "tooltip-t-print": "箇页个打印版",
        "tooltip-t-permalink": "箇页当前版本个老世链接",
        "tooltip-ca-nstab-main": "望内容页",
-       "tooltip-ca-nstab-user": "æ\9f¥ç\9c\8b用户页",
-       "tooltip-ca-nstab-media": "æ\9f¥ç\9c\8b媒体页",
+       "tooltip-ca-nstab-user": "æ\9c\9b用户页",
+       "tooltip-ca-nstab-media": "æ\9c\9b媒体页",
        "tooltip-ca-nstab-special": "箇是特别页面,弗好编辑",
        "tooltip-ca-nstab-project": "望项目页",
        "tooltip-ca-nstab-image": "望文件页",
-       "tooltip-ca-nstab-mediawiki": "æ\9f¥ç\9c\8bç³»ç»\9f讯息",
+       "tooltip-ca-nstab-mediawiki": "æ\9c\9bç³»ç»\9fæ¶\88息",
        "tooltip-ca-nstab-template": "望模板",
-       "tooltip-ca-nstab-help": "æ\9f¥ç\9c\8b帮å¿\99页é\9d¢",
+       "tooltip-ca-nstab-help": "æ\9c\9b帮å¿\99页",
        "tooltip-ca-nstab-category": "望分类页",
        "tooltip-minoredit": "标作小编写",
        "tooltip-save": "保存侬个修改",
index 915ca6b..dbcefa4 100644 (file)
        "printableversion": "Барин бәәдл",
        "permalink": "Даңгин заалһ",
        "print": "Барлх",
+       "view": "Хәләвр",
        "edit": "Ясх",
        "create": "Бүтәх",
        "editthispage": "Эн халх ясх",
        "notextmatches": "Халхсин бичәснд ирлцән уга",
        "prevn": "урдк {{PLURAL:$1|$1}}",
        "nextn": "дарук {{PLURAL:$1|$1}}",
+       "shown-title": "Халхар $1 аш үзүлх",
        "viewprevnext": "Хәләх ($1 {{int:pipe-separator}} $2) ($3)",
        "searchprofile-articles": "Зүүлс",
        "searchprofile-images": "Үзгдл-соңсвр",
        "searchprofile-advanced": "Нәрн",
        "searchprofile-articles-tooltip": "$1 дотр хәәх",
        "searchprofile-images-tooltip": "Боомг хәәх",
+       "searchprofile-everything-tooltip": "Хамг зокъял хәәх (күүндвр халх орлцулҗ)",
+       "searchprofile-advanced-tooltip": "Заасн нердин делкәст хәәх",
        "search-result-size": "$1 ({{PLURAL:$2|$2 үг|$2 үг|$2 үг}})",
        "search-redirect": "(туудг $1)",
        "search-section": "(«$1» салвр)",
        "grouppage-bot": "{{ns:project}}:Көдлгчүд",
        "grouppage-sysop": "{{ns:project}}:Закрачуд",
        "grouppage-bureaucrat": "{{ns:project}}:Нойнчуд",
+       "right-writeapi": "API бичхин төлә кергллт",
        "newuserlogpage": "Бичгдлһнә седкүл",
        "rightslog": "Демнәчна зөвин седкүл",
        "action-edit": "эн халх ясх",
        "imagelinks": "Боомг керглән",
        "linkstoimage": "Эн $1 халх эн боомгур заана:",
        "sharedupload": "Эн боомг $1 ормас. Териг талдан төсвд олзлҗ болх.",
+       "sharedupload-desc-here": "Эн боомг $1 талас, бус төслд керглҗ болх.\nБичлһнь [$2 боомгин бичлһнә халх] доракшан үзгднә.",
        "uploadnewversion-linktext": "Тер боомгин шин һарц тәвх",
        "randompage": "Уршг зүүл",
        "statistics": "То бүрткл",
        "tooltip-pt-mycontris": "Тана демнлһнә сеткүл",
        "tooltip-pt-login": "Та орсн күцх бәәнәт, болв кергтә биш.",
        "tooltip-pt-logout": "Һарх",
+       "tooltip-pt-createaccount": "Танд бичгдлһн бүтәҗ, дигләнд орхар сәәшгднә, эн даалhврго чигн",
        "tooltip-ca-talk": "Халхин дотрин туск меткән",
-       "tooltip-ca-edit": "Та Ñ\8dн Ñ\85алÑ\85иг Ñ\87иклÒ\97 Ñ\87аднаÑ\82.\nÐ\91Ñ\83йн Ð±Ð¾Ð»Ñ\82Ñ\85а, Ñ\85адһлһна ÐºÒ¯Ñ\80Ñ\82л Ñ\85Ó\99лÓ\99вÑ\80 Ð¾Ð»Ð·Ð»Ñ\82н.",
+       "tooltip-ca-edit": "Эн Ñ\85алÑ\85 Ñ\8fÑ\81Ñ\85",
        "tooltip-ca-addsection": "Шин хүв эклх",
        "tooltip-ca-viewsource": "Эн халх харссн бәәнә.\nТа энүнә медсн үзҗ чаднат.",
        "tooltip-ca-history": "Эн халхна шидрә чикллһн",
        "tooltip-ca-nstab-main": "Халхнь",
        "tooltip-ca-nstab-user": "Демнчна халхиг үзүлх",
        "tooltip-ca-nstab-media": "Боомгин халх үзх",
-       "tooltip-ca-nstab-special": "Эн көдлхнә халх. Та эниг чиклҗ чадхшв.",
+       "tooltip-ca-nstab-special": "Эн көдлхнә халх, эн ясгдшго.",
        "tooltip-ca-nstab-project": "Төслин халх",
        "tooltip-ca-nstab-image": "Боомгин халхиг",
        "tooltip-ca-nstab-mediawiki": "MediaWiki зәңгин халх",
        "file-info-size": "$1 × $2 цегтә, боомгин кемҗән: $3, MIME янз: $4",
        "file-nohires": "Икәр чинртә янз уга.",
        "svg-long-desc": "SVG боомг, $1 × $2 мет цегтә, боомгин кемҗән: $3",
-       "show-big-image": "Күцц чинр",
+       "show-big-image": "Эк боомг",
+       "show-big-image-preview": "Хәләврин аһу: $1.",
+       "show-big-image-other": "Бус нигтрл: $1.",
+       "show-big-image-size": "$1 × $2 цегтә",
        "file-info-gif-looped": "билцгсн",
        "bad_image_list": "Эн темдглһн кергтә:\n\nБүртклин мөчүд һанцхн оньгтан авх (мөрәд * эклцта).\nТүрүн мөрәнә заалһ - тәвх хөрсн зургин заалһ.\nДарук заалһуд эн мөрәд хаҗилһн болх (халхс зургиг орулҗ болх).",
        "metadata": "Мета өггцн",
        "metadata-help": "Эн боомг дәкәд өггцтә. Тер өггцн то камерар аль сканерар немсмн. Боомг бүтәлһнә хөөн чиклсн бәәхлә, зәрм кемҗәд одахн зургд әдл биш болх.",
        "metadata-expand": "Ик тодрхасиг үзүлх",
        "metadata-collapse": "Ик тодрхасиг бултулх",
-       "metadata-fields": "Эн җигсәмҗд нерлгдсн мета өггцин аһу, дүрслгч халхд герәсләр үзүлгдх, наадкснь бултулгдх.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-fields": "Эн бүртклд нерәдсн зургин мета то-дигин теегмүд мета то-дигин көснг эвкснд зургин халхт үзгднә. Наадк теегмүд таарсар нуугдх.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "Өргн",
        "exif-imagelength": "Өндр",
        "exif-bitspersample": "Өңгин гүн",
        "specialpages-group-spam": "Спамас зевсг",
        "blankpage": "Хоосн халх",
        "intentionallyblankpage": "Тер  халх хоосн күслтә бәәнә.",
+       "tag-filter": "[[Special:Tags|Царадын]] шүр:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Царан|Царад}}]]: $2)",
        "htmlform-reset": "Сольлһиг уга кех",
        "htmlform-selectorother-other": "Талдан",
+       "logentry-newusers-create": "$1 демнәчин бичгдлһн бүтәгдв",
        "rightsnone": "(уга)",
        "searchsuggest-search": "Хәәвр"
 }
index 02024b8..bc98445 100644 (file)
        "recentchanges-label-bot": "თე რედაქტირაფა ბოტიშ ნაღოლემი რე",
        "recentchanges-label-unpatrolled": "თე რედაქტირაფა დიო ხოლო ვა რე პატრულირაფირი",
        "recentchanges-label-plusminus": "თირაფეფიშ ზჷმა ბაიტეფს",
-       "recentchanges-legend-heading": "'''ლეგენდა:'''",
+       "recentchanges-legend-heading": "<strong>ლეგენდა:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (თაშნეშე ქოძირით [[Special:NewPages|ახალ ხასჷლეფიშ ერკებული]])",
        "rcnotefrom": "ქვემოთ {{PLURAL:$5|ნაჩვენებია ცვლილება|ნაჩვენებია ცვლილებები}} <strong>$3, $4</strong>-დან (ნაჩვენებია არაუმეტეს <strong>$1</strong>).",
        "rclistfrom": "ახალ თირაფეფიშ ძირაფა დოჭყაფილ $3 $2-შე",
index 4054ec0..d5f5776 100644 (file)
        "recentchanges-label-bot": "די רעדאַקטירונג האט אויסגעפירט א באט",
        "recentchanges-label-unpatrolled": "די רעדאקטירונג איז נאך נישט נאכגעקוקט",
        "recentchanges-label-plusminus": "בלאט גרייס געענדערט מיט דער צאל בייטן",
-       "recentchanges-legend-heading": "'''לעגענדע:'''",
+       "recentchanges-legend-heading": "<strong>לעגענדע:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (זעט אויך [[Special:NewPages|די רשימה פון נייע בלעטער]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "ווייזן",
index 174f9dd..91af0ce 100644 (file)
        "recentchanges-label-bot": "Rọ́bọ́ọ̀tì ni ó ṣe àtúnṣe yìí",
        "recentchanges-label-unpatrolled": "Àtúnṣe yìí kò tí ì jẹ́ onísíṣọ́",
        "recentchanges-label-plusminus": "Iye bytes àtúnṣe sí ìtóbi ojúewé",
-       "recentchanges-legend-heading": "'''Ìtumọ̀:'''",
+       "recentchanges-legend-heading": "<strong>Ìtumọ̀:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ẹ tún wo [[Special:NewPages|àtòjọ àwọn ojúewé tuntun]])",
        "rcnotefrom": "Àwọn àtúnṣe láti ''''$2''' (títí dé '''$1''' hàn) lábẹ́.",
        "rclistfrom": "Àfihàn àwọn àtúnṣe tuntun nípa bíbẹ̀rẹ̀ láti $3 $2",
index 57c9a11..6d63e20 100644 (file)
        "recentchanges-label-bot": "呢次編輯係由機械人進行",
        "recentchanges-label-unpatrolled": "呢次編輯重未巡查過",
        "recentchanges-label-plusminus": "頁面位元組大細變化",
-       "recentchanges-legend-heading": "'''標記:'''",
+       "recentchanges-legend-heading": "<strong>標記:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (睇埋[[Special:NewPages|新開版]])",
        "recentchanges-submit": "顯示",
        "rcnotefrom": "下面嘅{{PLURAL:$5|改動}}由 <strong>$3 $4</strong> 開始(顯示到'''$1''')。",
index fdbc766..8545808 100644 (file)
        "moredotdotdot": "更多...",
        "morenotlisted": "本列表不完整。",
        "mypage": "页面",
+       "anonuserpage": "未知用户",
        "mytalk": "讨论",
        "anontalk": "讨论",
        "navigation": "导航",
        "nocookieslogin": "{{SITENAME}}使用Cookie实现用户登录。您已停用Cookie。请启用Cookie后再试。",
        "nocookiesfornew": "该用户账户未被创建,我们不能确认它的来源。请确保你已启用Cookie,刷新本页后再试。",
        "noname": "未指定有效的用户名。",
-       "loginsuccesstitle": "登录成功",
+       "loginsuccesstitle": "已登录",
        "loginsuccess": "<strong>您现在已经以\"$1\"的身份登录了{{SITENAME}}。</strong>",
        "nosuchuser": "没有名为“$1”的用户。用户名区分大小写。请检查你的拼写或[[Special:UserLogin/signup|创建新账户]]。",
        "nosuchusershort": "没有名为“$1”的用户。请检查你的拼写。",
        "createaccount-title": "在{{SITENAME}}创建新账户",
        "createaccount-text": "有人在{{SITENAME}}中利用您的邮箱创建了一个名为 \"$2\" 的新帐户($4),密码是 \"$3\" 。您应该立即登录并更改密码。\n\n如果该账户创建错误的话,您可以忽略此信息。",
        "login-throttled": "你最近尝试登录的次数过多。请等待$1后再试。",
-       "login-abort-generic": "登录失败 - 已终止",
+       "login-abort-generic": "您的登录失败 - 已终止",
        "login-migrated-generic": "您的账户已被迁移,并且您的用户名在此wiki不再存在。",
        "loginlanguagelabel": "语言:$1",
        "suspicious-userlogout": "注销请求被拒绝,因为它似乎是由有设计缺陷的浏览器或缓存代理发出的。",
        "botpasswords-insert-failed": "无法添加机器人名“$1”。它是否已添加?",
        "botpasswords-update-failed": "无法更新机器人名“$1”。它是否已删除?",
        "botpasswords-created-title": "机器人密码已创建",
-       "botpasswords-created-body": "机器人密码“$1”已成功更新。",
+       "botpasswords-created-body": "用于用户“$2”的机器人名称“$1”的机器人密码已创建。",
        "botpasswords-updated-title": "机器人密码已更新",
-       "botpasswords-updated-body": "机器人密码“$1”已成功更新。",
+       "botpasswords-updated-body": "用于用户“$2”的机器人名称“$1”的机器人密码已更新。",
        "botpasswords-deleted-title": "机器人密码已删除",
-       "botpasswords-deleted-body": "机器人密码“$1”已删除。",
+       "botpasswords-deleted-body": "用于用户“$2”的机器人名称“$1”的机器人密码已删除。",
        "botpasswords-newpassword": "用于登录<strong>$1</strong>的新密码是<strong>$2</strong>。<em>请记住它以备今后参考。</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider不可用。",
        "botpasswords-restriction-failed": "机器人密码限制阻止此次登录。",
        "revdelete-unsuppress": "在已恢复的版本中移除限制",
        "revdelete-log": "原因:",
        "revdelete-submit": "应用于选中的{{PLURAL:$1|版本}}",
-       "revdelete-success": "版本可见性更新成功。",
+       "revdelete-success": "版本可见性已更新。",
        "revdelete-failure": "版本可见性无法更新:\n$1",
-       "logdelete-success": "事件的可见性已经成功设置。",
+       "logdelete-success": "日志可见性已设置。",
        "logdelete-failure": "事件的可见性无法设置:\n$1",
        "revdel-restore": "更改可见性",
        "pagehist": "页面历史",
        "userrights-changeable-col": "您可以更改的用户组",
        "userrights-unchangeable-col": "您不能更改的用户组",
        "userrights-conflict": "用户权限的更改存在冲突!请检查并确认您的更改。",
-       "userrights-removed-self": "您已成功删除您自己的权利。因此,您不再能够访问此页。",
+       "userrights-removed-self": "您已删除您自己的权利。因此,您不再能够访问此页。",
        "group": "用户组:",
        "group-user": "用户",
        "group-autoconfirmed": "自动确认用户",
        "uploadstash-summary": "这个页面提供已经上传(或者上传中)但未发布到wiki之文件存取。这些文件除了上传的用户之外不会被其他人可见。",
        "uploadstash-clear": "清除贮藏文件",
        "uploadstash-nofiles": "您没有被隐藏的文件。",
-       "uploadstash-badtoken": "该操作执行失败,可能是因为你的编辑凭证已过期。请重试。",
-       "uploadstash-errclear": "清除文件不成功。",
+       "uploadstash-badtoken": "执行对应操作失败。可能是因为您的编辑凭证已过期。请重试。",
+       "uploadstash-errclear": "清除文件失败。",
        "uploadstash-refresh": "更新文件列表",
        "invalid-chunk-offset": "无效区块偏移量",
        "img-auth-accessdenied": "拒绝访问",
        "changecontentmodel-title-label": "页面标题",
        "changecontentmodel-model-label": "新的内容模型",
        "changecontentmodel-reason-label": "原因:",
+       "changecontentmodel-submit": "更改",
        "changecontentmodel-success-title": "内容模型已更改",
        "changecontentmodel-success-text": "[[:$1]]的内容类型被更改。",
        "changecontentmodel-cannot-convert": "[[:$1]]上的内容不能转换为$2的一个类型。",
        "changecontentmodel-nodirectediting": "$1内容模型不支持直接编辑",
        "log-name-contentmodel": "内容模型更改日志",
        "log-description-contentmodel": "与一个页面的内容模型相关的活动",
+       "logentry-contentmodel-new": "$1已使用非默认的内容模型“$5”{{GENDER:$2|创建}}页面$3",
        "logentry-contentmodel-change": "$1将页面$3的内容模型从“$4”{{GENDER:$2|更改}}为“$5”",
        "logentry-contentmodel-change-revertlink": "回退",
        "logentry-contentmodel-change-revert": "回退",
        "ipb-hardblock": "阻止登录用户使用该IP地址编辑",
        "ipbcreateaccount": "阻止创建新账号",
        "ipbemailban": "阻止用户发送电子邮件",
-       "ipbenableautoblock": "自动封禁该用户最后使用的IP地址,以及他们随后试图用于编辑的所有IP地址",
+       "ipbenableautoblock": "自动封禁该用户最后使用的IP地址,以及随后试图用于编辑的所有IP地址",
        "ipbsubmit": "封禁该用户",
        "ipbother": "其它时间:",
        "ipboptions": "2小时:2 hours,1天:1 day,3天:3 days,1周:1 week,2周:2 weeks,1个月:1 month,3个月:3 months,6个月:6 months,1年:1 year,不限期:infinite",
        "javascripttest-pagetext-skins": "选择外观来运行测试:",
        "javascripttest-qunit-intro": "请见mediawiki.org的[$1 测试说明文件]。",
        "tooltip-pt-userpage": "{{GENDER:|您的用户}}页",
-       "tooltip-pt-anonuserpage": "用于编辑的IP地址的用户页面",
+       "tooltip-pt-anonuserpage": "用于编辑的IP地址的用户页面",
        "tooltip-pt-mytalk": "{{GENDER:|您}}的讨论页面",
        "tooltip-pt-anontalk": "有关本IP地址的编辑的讨论",
        "tooltip-pt-preferences": "{{GENDER:|您}}的设置",
        "tooltip-ca-talk": "关于内容页面的讨论",
        "tooltip-ca-edit": "编辑本页",
        "tooltip-ca-addsection": "开始新段落",
-       "tooltip-ca-viewsource": "本页面受到保护。\n您可以查看其源代码",
+       "tooltip-ca-viewsource": "本页面受到保护。您可以查看其源代码",
        "tooltip-ca-history": "本页面过去的版本",
        "tooltip-ca-protect": "保护本页",
        "tooltip-ca-unprotect": "更改本页面的保护",
        "tags-delete-not-allowed": "扩展定义的标签不能被删除,除非该扩展明确允许。",
        "tags-delete-not-found": "标签“$1”不存在。",
        "tags-delete-too-many-uses": "“$1”标签已应用到超过$2个修订版本,这意味着它不能被删除。",
-       "tags-delete-warnings-after-delete": "标签“$1”已成功删除,但遇到了以下{{PLURAL:$2|警告}}:",
+       "tags-delete-warnings-after-delete": "标签“$1”已删除,但遇到了以下{{PLURAL:$2|警告}}:",
        "tags-activate-title": "激活标签",
        "tags-activate-question": "您将要激活标签“$1”。",
        "tags-activate-reason": "原因:",
        "tags-edit-reason": "原因:",
        "tags-edit-revision-submit": "将更改应用至{{PLURAL:$1|此|$1个}}修订版本",
        "tags-edit-logentry-submit": "将更改应用至{{PLURAL:$1|此日志记录|$1个日志记录}}",
-       "tags-edit-success": "更改已成功应用。",
+       "tags-edit-success": "更改已应用。",
        "tags-edit-failure": "更改无法被应用:\n$1",
        "tags-edit-nooldid-title": "无效目标版本",
        "tags-edit-nooldid-text": "您尚未指定任何要执行此功能的目标版本,或者所指定的版本不存在。",
index 3c4b6e8..04a82d9 100644 (file)
@@ -68,7 +68,8 @@
                        "范",
                        "Jasonzhuocn",
                        "Bowleerin",
-                       "飞舞回堂前"
+                       "飞舞回堂前",
+                       "Bbslam"
                ]
        },
        "tog-underline": "底線標示連結:",
        "moredotdotdot": "更多...",
        "morenotlisted": "此清單尚未讀取完畢。",
        "mypage": "頁面",
+       "anonuserpage": "不明使用者",
        "mytalk": "對話",
        "anontalk": "對話",
        "navigation": "導覽",
        "newpassword": "新密碼:",
        "retypenew": "重新輸入新密碼:",
        "resetpass_submit": "設定密碼並登入",
-       "changepassword-success": "您的密碼已變更成功!",
+       "changepassword-success": "您的密碼已經變更!",
        "changepassword-throttled": "您最近嘗試了太多次登入。\n請等待 $1 後再試。",
        "botpasswords": "機器人密碼",
        "botpasswords-summary": "<em>機器人密碼</em> 可在不需帳號的主要登入密碼情況下,允許透過 API 存取使用者帳號。 可限制使用機器人密碼登入的使用者權限。\n\n若在尚無法了解為何要設定機器人密碼之前不應使用此功能。 且不該有任何人會向您索取機器人密碼。",
        "botpasswords-insert-failed": "新增機器人名稱 \"$1\" 失敗,是否已新增過?",
        "botpasswords-update-failed": "更新機器人名稱 \"$1\" 失敗,是否已刪除過?",
        "botpasswords-created-title": "已建立機器人密碼",
-       "botpasswords-created-body": "機器人密碼 \"$1\" 已建立成功。",
+       "botpasswords-created-body": "使用者''$2\"所擁有的機器人\"$1\"之密碼已建立。",
        "botpasswords-updated-title": "已更新機器人密碼",
-       "botpasswords-updated-body": "機器人密碼 \"$1\" 已修改成功。",
+       "botpasswords-updated-body": "使用者''$2\"所擁有的機器人\"$1\"之密碼已更新。",
        "botpasswords-deleted-title": "已刪除機器人密碼",
-       "botpasswords-deleted-body": "機器人密碼 \"$1\" 已刪除。",
+       "botpasswords-deleted-body": "使用者''$2\"所擁有的機器人\"$1\"之密碼已刪除。",
        "botpasswords-newpassword": "用來登入 <strong>$1</strong> 的新密碼為 <strong>$2</strong>。 <em>請記錄此密碼以供未來參考使用。</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider 無法使用。",
        "botpasswords-restriction-failed": "機器人密碼限制已拒絕此次登入。",
        "resetpass-no-info": "您必須直接登入存取這個頁面。",
        "resetpass-submit-loggedin": "變更密碼",
        "resetpass-submit-cancel": "取消",
-       "resetpass-wrong-oldpass": "無效的臨時或現有密碼。\n您可能早已成功地變更了密碼,或者已經請求一個新的臨時密碼。",
+       "resetpass-wrong-oldpass": "無效的臨時或現有密碼。\n您可能已經變更了密碼,或者已經請求一個新的臨時密碼。",
        "resetpass-recycled": "請重設您的密碼為一個與目前不同的密碼。",
        "resetpass-temp-emailed": "您使用臨時電子郵件傳送的代碼登入。\n要完成登入,您必須在這裡設定一個新密碼:",
        "resetpass-temp-password": "臨時密碼:",
        "passwordreset-capture": "檢視電子郵件內容?",
        "passwordreset-capture-help": "若您勾選此核選方塊,電子郵件 (包含臨時密碼) 將直接顯示,並寄給使用者。",
        "passwordreset-email": "電子郵件地址:",
-       "passwordreset-emailtitle": "{{SITENAME}} 的帳號詳細資料",
+       "passwordreset-emailtitle": "在 {{SITENAME}} 的帳號詳細資料",
        "passwordreset-emailtext-ip": "不明人士 (可能是您自己,來自 IP 位址 $1) 要求重設在 {{SITENAME}} ($4) 的密碼,下列是與此電子郵件地址有關的使用者{{PLURAL:$3|帳號}}:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}將會在{{PLURAL:$5|一天|$5 天}}內到期,\n您應立即登入並更改新的密碼。如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略本訊息並且繼續使用您原本的密碼。",
        "passwordreset-emailtext-user": "使用者 $1 要求重設在 {{SITENAME}} ($4) 的密碼,下列是與此電子郵件位址有關的使用者{{PLURAL:$3|帳號}}:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}將會在{{PLURAL:$5|一天|$5 天}}內到期,\n您應立即登入並更改新的密碼。如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
        "passwordreset-emailelement": "使用者名稱:\n$1\n\n臨時密碼:\n$2",
        "newarticle": "(新)",
        "newarticletext": "您正連結至一頁不存在頁面。\n要建立該頁面,請在下方的編輯方塊中輸入內容 (詳情請參考 [$1 説明頁面]) 。\n如果您是不小心來到此頁面,請點選瀏覽器的 <strong>返回</strong> 按鈕。",
        "anontalkpagetext": "----\n<em>此討論頁面是給尚未建立帳號的匿名使用者使用</em>\n因此我們必須使用 IP 位址來辨識身份,但相同的 IP 位址可能由許多不同的使用者所共用。\n如果您是匿名使用者並且覺得評論的內容與您無關,請 [[Special:UserLogin/signup|建立新帳號]] 或 [[Special:UserLogin|登入]] 避免與其他匿名使用者混淆。",
-       "noarticletext": "此頁面目前沒有內容,您可以在其它頁面中[[Special:Search/{{PAGENAME}}|搜尋此頁面標題]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋相關日誌]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 編輯此頁]</span>。",
+       "noarticletext": "此頁面目前沒有內容,您可以在其它頁面中[[Special:Search/{{PAGENAME}}|搜尋此頁面標題]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋相關日誌]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 建立此頁]</span>。",
        "noarticletext-nopermission": "此頁面目前沒有內容,\n您可以在其它頁面中 [[Special:Search/{{PAGENAME}}|搜尋此頁面標題]],或 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋相關日誌]</span>,但您沒有權限建立此頁面。",
        "missing-revision": "頁面名稱 \"{{FULLPAGENAME}}\" 的 #$1 修訂版本不存在。\n\n通常是因連結到過期的歷史頁面,該頁面已被刪除。\n詳情請參考 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。",
        "userpage-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。\n若您要建立/編輯此頁面,請先檢查是否正確。",
        "previewnote": "<strong>您目前正在預覽,您的變更還尚未儲存!</strong>",
        "continue-editing": "前往編輯框",
        "previewconflict": "此預覽顯示了您於上方文字編輯框中的內容儲存之後將會顯示的結果。",
-       "session_fail_preview": "<strong>很抱歉!由於連線階段的資料遺失,我們無法處理您的編輯動作。</strong>\n請再試一次。\n如果仍然失敗,請 [[Special:UserLogout|登出]] 後重新登入。",
-       "session_fail_preview_html": "<strong>很抱歉!由於連線階段的資料遺失,我們無法處理您的編輯動作。</strong>\n\n<em>由於 {{SITENAME}} 開啟了原始 HTML 模式,將不會顯示預覽畫面以避免 JavaScript 攻擊。</em>\n\n<strong>若這是符合規範的編輯動作,請再試一次。</strong>\n如果仍然有問題,請 [[Special:UserLogout|登出]] 後再重新登入一次。",
+       "session_fail_preview": "很抱歉!由於連線階段的資料遺失,以至於我們無法處理您的編輯動作。\n您可能已經登出了。<strong>請您確認您仍然在登入狀態,並請再試一次<strong/>。\n請再試一次。\n如果仍然失敗,請 [[Special:UserLogout|登出]] 後重新登入,並請您確認您的瀏覽器允許此網站的Cookie。",
+       "session_fail_preview_html": "<strong>抱歉!由於是次登入時段出現資料遺失,我們無法處理您所作出的編輯。</strong>\n\n<em> {{SITENAME}} 已開啟了原始 HTML 模式,故此預覽畫面將不會顯示以避免 JavaScript 攻擊。</em>\n\n<strong>如您希望真正能夠作出這次編輯,請再試一次。</strong>\n如果仍不成功,請 [[Special:UserLogout|登出]] 後再重新登入,並確保瀏覽器設定為「允許這個網域的cookie」。",
        "token_suffix_mismatch": "<strong>因您使用的瀏覽器破壞了編輯密鑰中的特殊符號,您的編輯已被拒絕。</strong>\n為了避免破壞頁面內容,已拒絕此次編輯動作,\n會發生這個問題通常是因為您使用了有問題的匿名網頁代理伺服器。",
        "edit_form_incomplete": "<strong>部份編輯的內容未送至伺服器,請檢查您的編輯內容是否完整並再試一次。</strong>",
        "editing": "正在編輯 $1",
        "revdelete-unsuppress": "移除已還原修訂上的顯示限制",
        "revdelete-log": "原因:",
        "revdelete-submit": "套用至已選取的{{PLURAL:$1|一筆|多筆}}修訂",
-       "revdelete-success": "已成功更新修訂的顯示設定。",
+       "revdelete-success": "已成功更新檢示修訂內容的權限設定。",
        "revdelete-failure": "無法更新修訂的顯示設定:\n$1",
-       "logdelete-success": "å·²æ\88\90å\8a\9fæ\9b´æ\96°æ\97¥èª\8cç\9a\84顯示設定。",
+       "logdelete-success": "å·²æ\88\90å\8a\9fæ\9b´æ\96°æª¢è¦\96æ\97¥èª\8cç\9a\84æ¬\8aé\99\90設定。",
        "logdelete-failure": "無法更新日誌的顯示設定:\n$1",
        "revdel-restore": "變更能見度",
        "pagehist": "頁面歷史",
        "mergehistory-empty": "沒有可以合併的修訂",
        "mergehistory-done": "$1 中 $3 次修訂已合併至 [[:$2]]。",
        "mergehistory-fail": "無法進行歷史合併,請重新檢查該頁面及時間參數。",
+       "mergehistory-fail-bad-timestamp": "時間值無效。",
+       "mergehistory-fail-invalid-source": "來源頁面無效。",
+       "mergehistory-fail-invalid-dest": "目標頁面無效。",
+       "mergehistory-fail-no-change": "歷史合併尚未合併任何修訂歷史紀錄。請再次檢查頁面以及時間參數。",
+       "mergehistory-fail-self-merge": "來源頁面與目標頁面的名稱相同。",
        "mergehistory-fail-toobig": "超過 $1 個修訂移動的上限,無法進行歷史合併。",
        "mergehistory-no-source": "來源頁面 $1 不存在。",
        "mergehistory-no-destination": "目標頁面 $1 不存在。",
        "userrights-changeable-col": "您可變更的群組",
        "userrights-unchangeable-col": "您不可變更的群組",
        "userrights-conflict": "使用者權限變更發生衝突!請檢閱並確認你的變更。",
-       "userrights-removed-self": "您已成功移除自己的權限,您已無法再次存取此頁面。",
+       "userrights-removed-self": "您已移除自己的權限,故您已無法再次存取此頁面。",
        "group": "群組:",
        "group-user": "使用者",
        "group-autoconfirmed": "自動確認的使用者",
        "backend-fail-read": "無法讀取檔案 \"$1\"。",
        "backend-fail-create": "無法寫入檔案 \"$1\"。",
        "backend-fail-maxsize": "由於檔案大小超過 $2 位元組,無法寫入檔案 \"$1\"​​。",
-       "backend-fail-readonly": "儲存庫的後端 \"$1\" 目前為唯讀模式。原因為:\"<em>$2</em>\"",
+       "backend-fail-readonly": "儲存庫的後端 \"$1\" 目前為唯讀模式。原因為:<em>$2</em>",
        "backend-fail-synced": "檔案 \"$1\" 與內部儲存庫後端內的狀態不一致。",
        "backend-fail-connect": "無法連結至儲存庫後端 \"$1\"。",
        "backend-fail-internal": "儲存庫後端 \"$1\" 發生了不明的錯誤。",
        "uploadstash-summary": "此頁面可存取已上傳或還在上傳程序但尚未在 Wiki 公開的檔案,這些檔案除了上傳的使用者本身外,其他人尚無法查看。",
        "uploadstash-clear": "清除儲藏庫檔案",
        "uploadstash-nofiles": "您沒有儲藏的檔案。",
-       "uploadstash-badtoken": "執行動作失敗您的編輯資訊可能已經過期,請重新再試。",
+       "uploadstash-badtoken": "執行動作失敗您的編輯資訊可能已經過期,請重新再試。",
        "uploadstash-errclear": "清除檔案失敗。",
        "uploadstash-refresh": "更新檔案清單",
        "invalid-chunk-offset": "無效區塊位置",
        "apihelp": "API 說明",
        "apihelp-no-such-module": "查無模組 \"$1\"。",
        "apisandbox": "API 沙盒",
-       "apisandbox-api-disabled": "此網站已關閉 API 使用。",
+       "apisandbox-api-disabled": "此網站已關閉 API。",
        "apisandbox-intro": "使用此頁面可測試 '''MediaWiki Web Service API'''。\n請參考 [//www.mediawiki.org/wiki/API:Main_page API 說明文件] 以取得詳細資訊。例:[//www.mediawiki.org/wiki/API#A_simple_example 取得主頁的內容]。 請選擇動作以取得更多範例。\n\n請注意,雖然此為沙盒,您在此頁所執行的動作仍有可能會修改到 Wiki。",
        "apisandbox-fullscreen": "展開面板",
        "apisandbox-fullscreen-tooltip": "展開沙盒面板來填滿瀏覽器視窗。",
        "changecontentmodel-title-label": "頁面標題",
        "changecontentmodel-model-label": "新內容模型",
        "changecontentmodel-reason-label": "原因:",
+       "changecontentmodel-submit": "變更",
        "changecontentmodel-success-title": "已變更內容模型",
        "changecontentmodel-success-text": "已變更 [[:$1]] 的內容類型。",
        "changecontentmodel-cannot-convert": "[[:$1]] 的內容無法轉換為 $2 類型。",
        "tooltip-ca-talk": "有關頁面內容的討論",
        "tooltip-ca-edit": "編輯此頁面",
        "tooltip-ca-addsection": "開始一個新章節",
-       "tooltip-ca-viewsource": "此頁面已被保護。\n您可檢視此頁面原始碼",
+       "tooltip-ca-viewsource": "此頁面已被保護。您可檢視此頁面原始碼",
        "tooltip-ca-history": "此頁面先前的修訂",
        "tooltip-ca-protect": "保護此頁面",
        "tooltip-ca-unprotect": "變更此頁面保護",
        "tags-delete-not-allowed": "無法刪除由擴充套件定義的標籤,除非該擴充套件允許。",
        "tags-delete-not-found": "標籤 \"$1\" 不存在。",
        "tags-delete-too-many-uses": "標籤 \"$1\" 會套用至 $2 筆以上的{{PLURAL:$2|修訂|修訂}},這代表該標籤將無法刪除。",
-       "tags-delete-warnings-after-delete": "標籤 \"$1\" 已刪除成功,但發生下列{{PLURAL:$2|警告|警告}}:",
+       "tags-delete-warnings-after-delete": "標籤 \"$1\" 已刪除,但發生下列{{PLURAL:$2|警告|警告}}:",
        "tags-activate-title": "啟動標籤",
        "tags-activate-question": "您正要啟動標籤 \"$1\"。",
        "tags-activate-reason": "原因:",
        "tags-edit-reason": "原因:",
        "tags-edit-revision-submit": "套用變更至{{PLURAL:$1|此修訂|$1 筆修訂}}",
        "tags-edit-logentry-submit": "套用變更至{{PLURAL:$1|此日誌項目|$1 筆日誌項目}}",
-       "tags-edit-success": "已成功套用變更。",
+       "tags-edit-success": "已套用變更。",
        "tags-edit-failure": "變更被無法套用:\n$1",
        "tags-edit-nooldid-title": "無效的目標修訂",
        "tags-edit-nooldid-text": "您沒有指定任何要執行此功能的目標修訂或指定的修訂並不存在。",
index c020b09..adeafda 100644 (file)
@@ -13,7 +13,7 @@ $namespaceNames = [
        NS_SPECIAL          => 'Posebno',
        NS_TALK             => 'Razgovor',
        NS_USER             => 'Korisnik',
-       NS_USER_TALK        => 'Razgovor_sa_korisnikom',
+       NS_USER_TALK        => 'Razgovor_s_korisnikom',
        NS_PROJECT_TALK     => 'Razgovor_{{grammar:instrumental|$1}}',
        NS_FILE             => 'Datoteka',
        NS_FILE_TALK        => 'Razgovor_o_datoteci',
@@ -28,6 +28,7 @@ $namespaceNames = [
 ];
 
 $namespaceAliases = [
+       'Razgovor_sa_korisnikom' => NS_USER_TALK,
        'Medija' => NS_MEDIA,
        'Slika' => NS_FILE,
        'Razgovor_o_datoteci' => NS_FILE_TALK,
index d30a348..2b97f7a 100644 (file)
--- a/load.php
+++ b/load.php
@@ -36,12 +36,15 @@ if ( !$wgRequest->checkUrlExtension() ) {
        return;
 }
 
-// Respond to ResourceLoader request
+// Set up ResourceLoader
 $resourceLoader = new ResourceLoader(
        ConfigFactory::getDefaultInstance()->makeConfig( 'main' ),
        LoggerFactory::getInstance( 'resourceloader' )
 );
-$resourceLoader->respond( new ResourceLoaderContext( $resourceLoader, $wgRequest ) );
+$context = new ResourceLoaderContext( $resourceLoader, $wgRequest );
+
+// Respond to ResourceLoader request
+$resourceLoader->respond( $context );
 
 Profiler::instance()->setTemplated( true );
 
index 777eddd..a08297a 100644 (file)
@@ -752,17 +752,19 @@ abstract class Maintenance {
 
                if ( isset( $this->mParams[$option] ) ) {
                        $multi = $this->mParams[$option]['multiOccurrence'];
-                       $exists = array_key_exists( $option, $options );
-                       if ( $multi && $exists ) {
-                               $options[$option][] = $value;
-                       } elseif ( $multi ) {
-                               $options[$option] = [ $value ];
-                       } elseif ( !$exists ) {
-                               $options[$option] = $value;
-                       } else {
-                               $this->error( "\nERROR: $option parameter given twice\n" );
-                               $this->maybeHelp( true );
-                       }
+               } else {
+                       $multi = false;
+               }
+               $exists = array_key_exists( $option, $options );
+               if ( $multi && $exists ) {
+                       $options[$option][] = $value;
+               } elseif ( $multi ) {
+                       $options[$option] = [ $value ];
+               } elseif ( !$exists ) {
+                       $options[$option] = $value;
+               } else {
+                       $this->error( "\nERROR: $option parameter given twice\n" );
+                       $this->maybeHelp( true );
                }
        }
 
diff --git a/maintenance/archives/patch-watchlist-wl_id.sql b/maintenance/archives/patch-watchlist-wl_id.sql
new file mode 100644 (file)
index 0000000..a73e514
--- /dev/null
@@ -0,0 +1,5 @@
+-- Primary key in watchlist
+
+ALTER TABLE /*$wgDBprefix*/watchlist
+  ADD COLUMN wl_id int unsigned NOT NULL AUTO_INCREMENT FIRST,
+  ADD PRIMARY KEY (wl_id);
index bdb197f..62bb0fa 100644 (file)
@@ -38,7 +38,7 @@ class BenchUtf8TitleCheck extends Benchmarker {
                parent::__construct();
 
                // @codingStandardsIgnoreStart Ignore long line warnings.
-               $this->data = array(
+               $this->data = [
                        "",
                        "United States of America", // 7bit ASCII
                        "S%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e",
@@ -58,7 +58,7 @@ class BenchUtf8TitleCheck extends Benchmarker {
                        . "Saison%207%20des%20Experts%7CSaison%208%20des%20Experts%7CSaison%209%20des%20Experts%7C"
                        . "Sara%20Sidle%7CSofia%20Curtis%7CS%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e%7CWallace%20Langham%7C"
                        . "Warrick%20Brown%7CWendy%20Simms%7C%C3%89tats-Unis"
-               );
+               ];
                // @codingStandardsIgnoreEnd
 
                $this->canRun = function_exists( 'mb_check_encoding' );
index 1904325..d4255a0 100644 (file)
@@ -102,7 +102,9 @@ TEXT
                                $this->fatalError( "Unable to open file {$filename}\n" );
                        }
                        $pages = array_map( 'trim', $pages );
-                       $this->pages = array_filter( $pages, create_function( '$x', 'return $x !== "";' ) );
+                       $this->pages = array_filter( $pages, function ( $x ) {
+                               return $x !== '';
+                       } );
                }
 
                if ( $this->hasOption( 'start' ) ) {
index 999f25c..15a1cb9 100755 (executable)
@@ -417,17 +417,17 @@ def main():
 namespace MediaWiki\Languages\Data;
 
 class ZhConversion {
-public static $zh2Hant = array(\n'''
+public static $zh2Hant = [\n'''
     php += PHPArray(toHant) \
-        + '\n);\n\npublic static $zh2Hans = array(\n' \
+        + '\n];\n\npublic static $zh2Hans = [\n' \
         + PHPArray(toHans) \
-        + '\n);\n\npublic static $zh2TW = array(\n' \
+        + '\n];\n\npublic static $zh2TW = [\n' \
         + PHPArray(toTW) \
-        + '\n);\n\npublic static $zh2HK = array(\n' \
+        + '\n];\n\npublic static $zh2HK = [\n' \
         + PHPArray(toHK) \
-        + '\n);\n\npublic static $zh2CN = array(\n' \
+        + '\n];\n\npublic static $zh2CN = [\n' \
         + PHPArray(toCN) \
-        + '\n);\n}\n'
+        + '\n];\n}\n'
 
     if pyversion[:1] in ['2']:
         f = open(os.path.join('..', '..', '..', 'languages', 'data', 'ZhConversion.php'), 'wb', encoding='utf8')
index 944e20e..915c699 100644 (file)
@@ -37,6 +37,7 @@
 鹽份 盐分
 組份 组分
 成份 成分
+成份股      成份股
 本份 本分
 本本份份   本本分分
 恰如其份   恰如其分
 散佈著      散布着
 遍佈著      遍布着
 遍布著      遍布着
+記錄著      记录着
+紀錄著      纪录着
+收錄著      收录着
 三十六著   三十六着
 走為上著   走为上着
 記憶體      内存
 區域網路   局域网络
 巨集 宏
 掃瞄器      扫描仪
-寬頻 宽带
 資料庫      数据库
 母音 元音
 印表機      打印机
 寮國 老挝
 貢寮 贡寮 #分詞用
 蘇利南      苏里南
+奈洛比      内罗毕
 莫三比克   莫桑比克
 賴索托      莱索托
 尚比亞      赞比亚
 提比里西   第比利斯
 巴斯拉      巴士拉
 杜拜 迪拜
+坚杜拜      坚杜拜
+堅杜拜      坚杜拜
 賽普勒斯   塞浦路斯
 荷姆茲      霍尔木兹
 加薩走廊   加沙地带
 密西根      密歇根
 紐澤西      新泽西
 蒙特婁      蒙特利尔
-滿地可      蒙特利尔
 千里達及托巴哥  特立尼达和多巴哥
 千里達      特立尼达
 托巴哥      多巴哥
index 457457a..f76d875 100644 (file)
@@ -55,7 +55,6 @@
 布光 佈光
 布局 佈局
 布防 佈防
-布施 佈施
 布满 佈滿
 布滿 佈滿
 布告 佈告
 占整 佔整
 占局部      佔局部
 日占 日佔
+擇日占星   擇日占星
+择日占星   擇日占星
 美占 美佔
 英占 英佔
 德占 德佔
 小时里      小時裏
 体里 體裏
 柜里 櫃裏
+告里 告裏
 电影里      電影裏
 广播里      廣播裏
 电视里      電視裏
 散佈著      散佈着
 遍佈著      遍佈着
 遍布著      遍佈着
+記錄著      記錄着
+紀錄著      紀錄着
+收錄著      收錄着
 三十六著   三十六着
 走為上著   走為上着
 鬧著 鬧着
 寮國 老撾
 貢寮 貢寮 #分詞用
 肯尼亚      肯雅
+奈洛比      內羅畢
 莫三比克   莫桑比克
 賴索托      萊索托
 尚比亞      贊比亞
 爱荷华      艾奧瓦
 得克萨斯   德克薩斯
 蒙特婁      蒙特利爾
-滿地可      蒙特利爾
 紐賓士域   紐賓士域
 默多克      梅鐸
 梅鐸 梅鐸
index ddd6f9d..12431b3 100644 (file)
 字库 字型檔
 字段 欄位
 存盘 存檔
-界面 介面
 控件 控制項
 盘片 碟片
 硬盘 硬碟
 服务器      伺服器
 局域网      區域網
 局域网络   區域網路
-宽带 寬頻
 数据库      資料庫
 打印机      印表機
 打印機      印表機
 老挝 寮國
 老撾 寮國
 肯尼亚      肯亞
+内罗毕      奈洛比
+內羅畢      奈洛比
 苏里南      蘇利南
 莫桑比克   莫三比克
 莱索托      賴索托
 得克薩斯   德克薩斯
 蒙特利尔   蒙特婁
 蒙特利爾   蒙特婁
-滿地可      蒙特婁
 麦克尔      麥可
 迈克尔      麥可
 魯賓斯·巴里切羅        魯本·巴瑞切羅
index 2bc8945..5c6a70b 100644 (file)
@@ -75,7 +75,6 @@
 馬占山      馬占山
 闫怀礼      閆懷禮
 薴烯 薴烯
-后豐 后豐
 于謙 于謙
 詩云 詩云
 云為 云為
 涂澤民      涂澤民
 涂長望      涂長望
 涂敏恆      涂敏恆
+后豐 后豐
 艷后 艷后
 廢后 廢后
 后髮座      后髮座
 賢后 賢后
 呂后 呂后
 蟻后 蟻后
+陳有后      陳有后
+天神之后   天神之后
+豔后 豔后
+后綜 后綜
+葉陽后      葉陽后
+后庄 后庄
+後庄 後庄
+后蒼 后蒼
 馬格里布   馬格里布
 佳里鎮      佳里鎮
 有只採      有只採
 复苏 復甦
 苹果 蘋果
 苹果干      蘋果乾
-后庄 后庄
-後庄 後庄
 龜山庄      龜山庄
 寶山庄      寶山庄
 員山庄      員山庄
 鮮于 鮮于
 賦范 賦范
 茅于軾      茅于軾
-陳有后      陳有后
-天神之后   天神之后
-豔后 豔后
-后綜 后綜
-葉陽后      葉陽后
 壽天里      壽天里
 貴子里      貴子里
 東湖里      東湖里
 水里鳳林   水里鳳林
 水里濁水溪        水里濁水溪
 洞里薩      洞里薩
+愛河里花子        愛河里花子
 划不來      划不來
 划來划去   划來划去
 划動 划動
 升平 昇平
 升阳 昇陽
 陈升 陳昇
+尔冬升      爾冬陞
 南宮适      南宮适
 舊庄 舊庄
 拿破仑      拿破崙
 扑冬 撲鼕
 冬冬鼓      鼕鼕鼓
 苧麻 苧麻
+张柏芝      張栢芝
index 03c42d9..c9d78b7 100644 (file)
@@ -323,6 +323,7 @@ U+06ED9滙|U+06C47汇|
 U+06EDB滛|U+06DEB淫|
 U+06EF7滷|U+05364卤|
 U+06F44潄|U+06F31漱|
+U+06F55潕|U+23C98𣲘|
 U+06F59潙|U+06CA9沩|
 U+06F81澁|U+06DA9涩|
 U+06F90澐|U+06C84沄|
@@ -618,6 +619,7 @@ U+08E5F蹟|U+08FF9迹|
 U+08E60蹠|U+08DD6跖|
 U+08E67蹧|U+07CDF糟|
 U+08E75蹵|U+08E74蹴|
+U+08E98躘|U+28001𨀁|
 U+08EAD躭|U+0803D耽|
 U+08EB3躳|U+08EAC躬|
 U+08EB6躶|U+088F8裸|
index 309bd5d..492a99d 100644 (file)
 數罪併罰
 催併
 狂併潮
+合併
+併為一體
+併為一家
+併吞
+並吞下
 提摩太後書
 裏海
 不採
 髮釵
 髮飾
 髮紗
+髮簪
 髮上指冠
 髮上沖冠
 髮乳
 髮已霜白
 髮油
 髮為血之本
-髮網
+髮網
 髮踊沖冠
 髮際
 黃髮
 美髮業
 美髮沙龍
 美容美髮
+程十髮
 模范棒棒堂
 模范三軍
 模范七棒
 複分解
 複合 #因複合詞頻遠高於復合
 複方
+複穗
 撥穀
 扁擬穀盜蟲
 不穀
 鹹批
 鹹濕
 鹹豬
+甜鹹
+鹹甜
+甜、鹹
+鹹、甜
 錦綉花園
 籲天
 勃鬱
 儒略曆
 伊斯蘭曆
 酒麴
-爾冬陞
 澹臺
 拜託
 委託
 筑陽
 南筑
 悲筑
-批准
-核准
+批准
+核准
 為準
 準直
 擺鐘
 看錶
 看表面
 鐵鐘
-看下鐘
-看下錶
-瞅下鐘
-瞅下錶
-拿下鐘
-拿下錶
 鐘不敲不響
 對準鐘
 對準鐘錶
 錶慢
 響鐘
 鐘敲
-大本鐘敲
-大笨鐘敲
 世紀鐘錶
 世紀鐘
 錶王
 鐘頂
 鐘紐
 鐘座
-他鐘
 寺鐘
 座鐘
 大笨鐘
 遊牧
 遊蕩
 遊刃
+遊廊
+遊春
 遊美學務
 黑奴籲天錄
 林郁方
 挑大樑
 扛大樑
 后豐
-製得
-限制
-控制
-製取
 心臟
 肝臟
 脾臟
 于敏中
 註:# 不作“注:”
 劃為# 不作“划為”
-併為一體
-併為一家
 一個# 避免“個裡”的錯誤
 兩個
 二個
 節目裡
 場裡
 世紀裡
-亞美尼亞曆
 注釋
 月面
 路面
 體裡
 櫃裡
 片裡
+告裡
 電影裡
 廣播裡
 電視裡
 逆風後
 順風後
 大風後
+賭后
+山仔后
+甲后路
+劉芸后
+謝華后
+趙惠后
+昭惠后
+周惠后
+孝惠后
+趙威后
+聖后
+陳有后
+惠文后
+葉陽后
+后蒼
 馬格里布
 伊里布
 劃入
 黎吉雲
 代表
 水無怜奈
-賭后
-山仔后
-甲后路
-劉芸后
-謝華后
-趙惠后
-昭惠后
-周惠后
-孝惠后
-趙威后
-聖后
-陳有后
-惠文后
-葉陽后
 于冠華
 于雲鶴
 于忠肅集
 億周後
 幾周後
 多周後
-前往
 后瑞站
 帝后臺
+紅后假說
+尊后
+前往
 新井里美
 樗里子
 伊達里子
 王田里
 小井里
 西井里
-尊后
+碧河里
+愛河里花子
 叶志穗
 叶不二子
 于立成
 後天
 學家
 游離
-紅后假說
 書面
 不只
 湧水
 陽穀
 太醜
 御製
-合併
 聖人曆
 電影後
 封為后
 僱車
 僱船
 米糰
+集團
 謹愿
 瞎矇
 里舖
 電子製表
 製毒
 製販
+製得
+製取
 譯製
 遏制 #以下分詞用
 管制
 抑制
 控制
 限制
+強制
 體徵
 綜合徵
 价川
 0齣
 0出現
 0出線
-第一齣
-第二齣
-第三齣
-第四齣
-第五齣
-第六齣
-第七齣
-第八齣
-第九齣
-第一出現
-第一出線
-第二出線
-第三出局
-第四出局
-第五出局
 這齣
 這出現
 這出乎
 秀發生
 秀發起
 秀發展
+留發生
+留發行
+留發展
 縮短發
 簡短發
 短發生
+頭發現
+蛋白發
 古人有云
 昔人有云
 云敞
index 07cb389..09a41ad 100644 (file)
 六齣
 弔兒郎當
 髮小
-髮網
 修鍊
 麵線
 繫上
 防颱
 慾望
 剋星
+挂
+掛
+陸遊
+徵人
+髮針
+供製
+并吞
+併吞下
+髮網
index 46d5474..a650aa0 100644 (file)
@@ -81,7 +81,12 @@ class MergeMessageFileList extends Maintenance {
                # Now find out files in a directory
                if ( $this->hasOption( 'extensions-dir' ) ) {
                        $extdir = $this->getOption( 'extensions-dir' );
-                       $entries = scandir( $extdir );
+                       # Allow multiple directories to be passed with ":" as delimiter
+                       $extdirs = explode( ':', $extdir );
+                       $entries = [];
+                       foreach ( $extdirs as $extdir ) {
+                               $entries = array_merge( $entries, scandir( $extdir ) );
+                       }
                        foreach ( $entries as $extname ) {
                                if ( $extname == '.' || $extname == '..' || !is_dir( "$extdir/$extname" ) ) {
                                        continue;
diff --git a/maintenance/mssql/archives/patch-watchlist-wl_id.sql b/maintenance/mssql/archives/patch-watchlist-wl_id.sql
new file mode 100644 (file)
index 0000000..b71f817
--- /dev/null
@@ -0,0 +1,2 @@
+ALTER TABLE /*_*/watchlist ADD wl_id INT IDENTITY;
+ALTER TABLE /*_*/watchlist ADD CONSTRAINT pk_watchlist PRIMARY KEY(wl_id)
index 0e58563..86bd735 100644 (file)
@@ -847,6 +847,7 @@ CREATE INDEX /*i*/rc_user_text ON /*_*/recentchanges (rc_user_text, rc_timestamp
 
 
 CREATE TABLE /*_*/watchlist (
+  wl_id int NOT NULL PRIMARY KEY IDENTITY,
   -- Key to user.user_id
   wl_user int NOT NULL REFERENCES /*_*/mwuser(user_id) ON DELETE CASCADE,
 
diff --git a/maintenance/oracle/archives/patch-watchlist-wl_id.sql b/maintenance/oracle/archives/patch-watchlist-wl_id.sql
new file mode 100644 (file)
index 0000000..4f7180d
--- /dev/null
@@ -0,0 +1,6 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.watchlist ADD (
+wl_id NUMBER NOT NULL,
+);
+ALTER TABLE &mw_prefix.watchlist ADD CONSTRAINT &mw_prefix.watchlist_pk PRIMARY KEY (wl_id);
index 9a70b87..27c3030 100644 (file)
@@ -436,11 +436,13 @@ CREATE INDEX &mw_prefix.recentchanges_i06 ON &mw_prefix.recentchanges (rc_namesp
 CREATE INDEX &mw_prefix.recentchanges_i07 ON &mw_prefix.recentchanges (rc_user_text, rc_timestamp);
 
 CREATE TABLE &mw_prefix.watchlist (
+  wl_id                     NUMBER     NOT NULL,
   wl_user                   NUMBER     NOT NULL,
   wl_namespace              NUMBER    DEFAULT 0 NOT NULL,
   wl_title                  VARCHAR2(255)        NOT NULL,
   wl_notificationtimestamp  TIMESTAMP(6) WITH TIME ZONE
 );
+ALTER TABLE &mw_prefix.watchlist ADD CONSTRAINT &mw_prefix.watchlist_pk PRIMARY KEY (wl_id);
 ALTER TABLE &mw_prefix.watchlist ADD CONSTRAINT &mw_prefix.watchlist_fk1 FOREIGN KEY (wl_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
 CREATE UNIQUE INDEX &mw_prefix.watchlist_u01 ON &mw_prefix.watchlist (wl_user, wl_namespace, wl_title);
 CREATE INDEX &mw_prefix.watchlist_i01 ON &mw_prefix.watchlist (wl_namespace, wl_title);
index c9f049b..61cb198 100644 (file)
@@ -18,6 +18,7 @@ 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 watchlist_wl_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;
@@ -447,7 +448,9 @@ CREATE INDEX new_name_timestamp ON recentchanges (rc_new, rc_namespace, rc_times
 CREATE INDEX rc_ip              ON recentchanges (rc_ip);
 
 
+CREATE SEQUENCE watchlist_wl_id_seq;
 CREATE TABLE watchlist (
+  wl_id                     INTEGER     NOT NULL  PRIMARY KEY DEFAULT nextval('watchlist_wl_id_seq'),
   wl_user                   INTEGER     NOT NULL  REFERENCES mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
   wl_namespace              SMALLINT    NOT NULL  DEFAULT 0,
   wl_title                  TEXT        NOT NULL,
diff --git a/maintenance/sqlite/archives/patch-watchlist-wl_id.sql b/maintenance/sqlite/archives/patch-watchlist-wl_id.sql
new file mode 100644 (file)
index 0000000..771f9b7
--- /dev/null
@@ -0,0 +1,23 @@
+DROP TABLE IF EXISTS /*_*/watchlist_tmp;
+
+CREATE TABLE /*$wgDBprefix*/watchlist_tmp (
+  wl_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  wl_user INTEGER  NOT NULL,
+  wl_namespace INTEGER NOT NULL default 0,
+  wl_title TEXT  NOT NULL default '',
+  wl_notificationtimestamp BLOB
+);
+
+INSERT OR IGNORE INTO /*_*/watchlist_tmp (
+    wl_user, wl_namespace, wl_title, wl_notificationtimestamp )
+    SELECT
+    wl_user, wl_namespace, wl_title, wl_notificationtimestamp
+    FROM /*_*/watchlist;
+
+DROP TABLE /*_*/watchlist;
+
+ALTER TABLE /*_*/watchlist_tmp RENAME TO /*_*/watchlist;
+
+CREATE UNIQUE INDEX /*i*/wl_user ON /*_*/watchlist (wl_user, wl_namespace, wl_title);
+CREATE INDEX /*i*/namespace_title ON /*_*/watchlist (wl_namespace, wl_title);
+CREATE INDEX /*i*/wl_user_notificationtimestamp ON /*_*/watchlist (wl_user, wl_notificationtimestamp);
index 743b9be..7942687 100644 (file)
@@ -1139,6 +1139,7 @@ CREATE INDEX /*i*/rc_user_text ON /*_*/recentchanges (rc_user_text, rc_timestamp
 
 
 CREATE TABLE /*_*/watchlist (
+  wl_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
   -- Key to user.user_id
   wl_user int unsigned NOT NULL,
 
index cecfa9d..21a050b 100644 (file)
     "grunt-contrib-copy": "0.8.2",
     "grunt-contrib-jshint": "1.0.0",
     "grunt-contrib-watch": "0.6.1",
-    "grunt-jscs": "2.7.0",
+    "grunt-jscs": "2.8.0",
     "grunt-jsonlint": "1.0.7",
     "grunt-karma": "0.12.1",
     "karma": "0.13.19",
     "karma-chrome-launcher": "0.2.2",
     "karma-firefox-launcher": "0.1.7",
     "karma-qunit": "0.1.9",
-    "qunitjs": "1.18.0"
+    "qunitjs": "1.22.0"
   }
 }
index 38c7aaa..edce2ea 100644 (file)
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -26,9 +26,9 @@
        <rule ref="Generic.ControlStructures.InlineControlStructure.NotAllowed">
                <severity>0</severity>
        </rule>
-       <exclude-pattern>node_modules</exclude-pattern>
-       <exclude-pattern>vendor</exclude-pattern>
-       <exclude-pattern>extensions</exclude-pattern>
-       <exclude-pattern>skins</exclude-pattern>
+       <exclude-pattern>node_modules/</exclude-pattern>
+       <exclude-pattern>vendor/</exclude-pattern>
+       <exclude-pattern type="relative">^extensions/</exclude-pattern>
+       <exclude-pattern type="relative">^skins/</exclude-pattern>
        <exclude-pattern>.git</exclude-pattern>
 </ruleset>
index bdf95a7..07cd7b5 100644 (file)
@@ -1332,7 +1332,6 @@ return [
                        'mediawiki.RegExp',
                        'mediawiki.notify',
                ],
-               'position' => 'top', // For $wgPreloadJavaScriptMwUtil
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.viewport' => [
diff --git a/resources/lib/oojs-ui/i18n/mn.json b/resources/lib/oojs-ui/i18n/mn.json
new file mode 100644 (file)
index 0000000..500aca7
--- /dev/null
@@ -0,0 +1,20 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Munkhzaya.E"
+               ]
+       },
+       "ooui-toolbar-more": "Илүү",
+       "ooui-toolgroup-expand": "Илүү",
+       "ooui-toolgroup-collapse": "Цөөн",
+       "ooui-dialog-message-accept": "За",
+       "ooui-dialog-message-reject": "Цуцлах",
+       "ooui-dialog-process-error": "Ямар нэг алдаа гарсан",
+       "ooui-dialog-process-dismiss": "Нуух",
+       "ooui-dialog-process-retry": "Дахин оролдох",
+       "ooui-dialog-process-continue": "Цааш явах",
+       "ooui-selectfile-button-select": "Файлаа сонгох",
+       "ooui-selectfile-not-supported": "Сонгосол файл нь дэмжигдэхгүй байна",
+       "ooui-selectfile-placeholder": "Файл сонгоогүй байна",
+       "ooui-selectfile-dragdrop-placeholder": "Файлаа энд хадгалах"
+}
index 1e1b05d..1e4bb55 100644 (file)
@@ -17,6 +17,8 @@
        "ooui-dialog-process-dismiss": "Сап",
        "ooui-dialog-process-retry": "Хатылаан көр",
        "ooui-dialog-process-continue": "Салгыы",
+       "ooui-selectfile-button-select": "Билэни тал",
        "ooui-selectfile-not-supported": "Билэни талыы өйөммөт",
-       "ooui-selectfile-placeholder": "Биир да билэ талыллыбатах"
+       "ooui-selectfile-placeholder": "Биир да билэ талыллыбатах",
+       "ooui-selectfile-dragdrop-placeholder": "Билэни манна сыҕарыт"
 }
index 19725cc..00d1961 100644 (file)
@@ -5,5 +5,21 @@
                        "Tel'et",
                        "Tifinaghes"
                ]
-       }
+       },
+       "ooui-outline-control-move-down": "تۆۋەنگە يۆتكە",
+       "ooui-outline-control-move-up": "يۇقۇرىغا يۆتكە",
+       "ooui-outline-control-remove": "ئۆچۈر",
+       "ooui-toolbar-more": "تېخىمۇ كۆپ",
+       "ooui-toolgroup-expand": "تېخىمۇ كۆپ",
+       "ooui-toolgroup-collapse": "ئاز",
+       "ooui-dialog-message-accept": "تامام",
+       "ooui-dialog-message-reject": "ۋاز كەچ",
+       "ooui-dialog-process-error": "نامەلۇم خاتالىق كۆرۈلدى",
+       "ooui-dialog-process-dismiss": "چىقىرىۋەت",
+       "ooui-dialog-process-retry": "قايتا سىنا",
+       "ooui-dialog-process-continue": "داۋاملاشتۇر",
+       "ooui-selectfile-button-select": "بىر ھۆججەت تاللا",
+       "ooui-selectfile-not-supported": "تاللانغان ھۆججەتتە مەسىلە بار",
+       "ooui-selectfile-placeholder": "ھۆججەت تاللانمىدى",
+       "ooui-selectfile-dragdrop-placeholder": "ھۆججەتنى بۇ يەرگە تاشلاڭ"
 }
index d07bcf2..f4ccc33 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-03-01T21:50:12Z
+ * Date: 2016-03-16T19:20:22Z
  */
 ( function ( OO ) {
 
index 5bd560a..3b5acae 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-03-01T21:50:17Z
+ * Date: 2016-03-16T19:20:26Z
  */
 .oo-ui-element-hidden {
        display: none !important;
@@ -31,7 +31,8 @@
        cursor: default;
 }
 .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        display: inline-block;
        vertical-align: middle;
 }
        display: inline-block;
        position: relative;
 }
-.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
-}
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-       display: inline-block;
        vertical-align: top;
        text-align: center;
 }
-.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
-}
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
+.oo-ui-floatableElement-hidden {
+       display: none;
+}
 .oo-ui-iconElement .oo-ui-iconElement-icon,
 .oo-ui-iconElement.oo-ui-iconElement-icon {
        background-size: contain;
        overflow: auto;
 }
 .oo-ui-textInputWidget input[type="search"] {
-       -webkit-appearance: none;
+       -webkit-appearance: texfield;
 }
 .oo-ui-textInputWidget input[type="search"]::-ms-clear {
        display: none;
 }
-.oo-ui-textInputWidget input[type="search"]::-ms-reveal {
-       display: none;
-}
 .oo-ui-textInputWidget input[type="search"]::-webkit-search-decoration,
 .oo-ui-textInputWidget input[type="search"]::-webkit-search-cancel-button,
 .oo-ui-textInputWidget input[type="search"]::-webkit-search-results-button,
index dfb34b3..1c2abc8 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-03-01T21:50:17Z
+ * Date: 2016-03-16T19:20:26Z
  */
 .oo-ui-element-hidden {
        display: none !important;
@@ -31,7 +31,8 @@
        cursor: default;
 }
 .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        display: inline-block;
        vertical-align: middle;
 }
        display: inline-block;
        position: relative;
 }
-.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
-}
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-       display: inline-block;
        vertical-align: top;
        text-align: center;
 }
-.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
-}
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
-       color: #008064;
+       color: #2962cc;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #00af89;
+       color: #347bff;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #005946;
+       color: #1f4999;
        box-shadow: none;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
 .oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        line-height: 1.2em;
-       display: inline-block;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
        position: absolute;
 .oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        margin-left: 0.3em;
 }
-.oo-ui-buttonElement-framed.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-       display: inline-block;
-}
 .oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
 .oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-iconElement:not( .oo-ui-labelElement ) > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
        margin-left: 0.46875em;
        color: #ffffff;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
-       color: #00af89;
+       color: #347bff;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover {
-       background-color: rgba(0, 171, 137, 0.1);
-       border-color: rgba(0, 89, 70, 0.5);
+       background-color: rgba(52, 123, 255, 0.1);
+       border-color: rgba(31, 73, 153, 0.5);
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
-       box-shadow: inset 0 0 0 1px #005946;
-       border-color: #005946;
+       box-shadow: inset 0 0 0 1px #1f4999;
+       border-color: #1f4999;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       color: #005946;
-       border-color: #005946;
+       color: #1f4999;
+       border-color: #1f4999;
        box-shadow: none;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
        color: #ffffff;
-       background-color: #00af89;
-       border-color: #00af89;
+       background-color: #347bff;
+       border-color: #347bff;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover {
-       background: #008064;
-       border-color: #008064;
+       background: #2962cc;
+       border-color: #2962cc;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
        box-shadow: inset 0 0 0 1px #ffffff;
-       border-color: #00af89;
+       border-color: #347bff;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        color: #ffffff;
-       background-color: #005946;
-       border-color: #005946;
+       background-color: #1f4999;
+       border-color: #1f4999;
        box-shadow: none;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
+.oo-ui-floatableElement-hidden {
+       display: none;
+}
 .oo-ui-iconElement .oo-ui-iconElement-icon,
 .oo-ui-iconElement.oo-ui-iconElement-icon {
        background-size: contain;
        height: 1.6em;
        background-color: white;
        border: 1px solid #777777;
-       background-image: url("themes/mediawiki/images/icons/check-constructive.png");
-       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check-constructive.svg");
-       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check-constructive.svg");
-       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/check-constructive.png");
+       background-image: url("themes/mediawiki/images/icons/check-constructive-deprecated.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check-constructive-deprecated.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check-constructive-deprecated.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/check-constructive-deprecated.png");
        background-repeat: no-repeat;
        background-position: center center;
        background-origin: border-box;
        height: 1.6em;
        background: white;
        border: 1px solid #777777;
-       background-image: url("themes/mediawiki/images/icons/circle-constructive.png");
-       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/circle-constructive.svg");
-       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/circle-constructive.svg");
-       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/circle-constructive.png");
+       background-image: url("themes/mediawiki/images/icons/circle-constructive-deprecated.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/circle-constructive-deprecated.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/circle-constructive-deprecated.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/circle-constructive-deprecated.png");
        background-repeat: no-repeat;
        background-position: center center;
        background-origin: border-box;
        overflow: auto;
 }
 .oo-ui-textInputWidget input[type="search"] {
-       -webkit-appearance: none;
+       -webkit-appearance: texfield;
 }
 .oo-ui-textInputWidget input[type="search"]::-ms-clear {
        display: none;
 }
-.oo-ui-textInputWidget input[type="search"]::-ms-reveal {
-       display: none;
-}
 .oo-ui-textInputWidget input[type="search"]::-webkit-search-decoration,
 .oo-ui-textInputWidget input[type="search"]::-webkit-search-cancel-button,
 .oo-ui-textInputWidget input[type="search"]::-webkit-search-results-button,
        left: 0.25em;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
-       line-height: 1.275em;
        margin: 0 1em;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
index 9be8e3a..1b90db5 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-03-01T21:50:12Z
+ * Date: 2016-03-16T19:20:22Z
  */
 ( function ( OO ) {
 
@@ -260,6 +260,58 @@ OO.ui.debounce = function ( func, wait, immediate ) {
        };
 };
 
+/**
+ * Returns a function, that, when invoked, will only be triggered at most once
+ * during a given window of time. If called again during that window, it will
+ * wait until the window ends and then trigger itself again.
+ *
+ * As it's not knowable to the caller whether the function will actually run
+ * when the wrapper is called, return values from the function are entirely
+ * discarded.
+ *
+ * @param {Function} func
+ * @param {number} wait
+ * @return {Function}
+ */
+OO.ui.throttle = function ( func, wait ) {
+       var context, args, timeout,
+               previous = 0,
+               run = function () {
+                       timeout = null;
+                       previous = OO.ui.now();
+                       func.apply( context, args );
+               };
+       return function () {
+               // Check how long it's been since the last time the function was
+               // called, and whether it's more or less than the requested throttle
+               // period. If it's less, run the function immediately. If it's more,
+               // set a timeout for the remaining time -- but don't replace an
+               // existing timeout, since that'd indefinitely prolong the wait.
+               var remaining = wait - ( OO.ui.now() - previous );
+               context = this;
+               args = arguments;
+               if ( remaining <= 0 ) {
+                       // Note: unless wait was ridiculously large, this means we'll
+                       // automatically run the first time the function was called in a
+                       // given period. (If you provide a wait period larger than the
+                       // current Unix timestamp, you *deserve* unexpected behavior.)
+                       clearTimeout( timeout );
+                       run();
+               } else if ( !timeout ) {
+                       timeout = setTimeout( run, remaining );
+               }
+       };
+};
+
+/**
+ * A (possibly faster) way to get the current timestamp as an integer
+ *
+ * @return {number} Current timestamp
+ */
+OO.ui.now = Date.now || function () {
+       return new Date().getTime();
+};
+
 /**
  * Proxy for `node.addEventListener( eventName, handler, true )`.
  *
@@ -685,7 +737,7 @@ OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
                                infused.$element.removeData( 'ooui-infused-children' );
                                return infused;
                        }
-                       if ( value.html ) {
+                       if ( value.html !== undefined ) {
                                return new OO.ui.HtmlSnippet( value.html );
                        }
                }
@@ -3054,7 +3106,7 @@ OO.ui.mixin.TitledElement = function OoUiMixinTitledElement( config ) {
        this.title = null;
 
        // Initialization
-       this.setTitle( config.title || this.constructor.static.title );
+       this.setTitle( config.title !== undefined ? config.title : this.constructor.static.title );
        this.setTitledElement( config.$titled || this.$element );
 };
 
@@ -4052,6 +4104,9 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
                ccWidth + ccOffset.left :
                ( scOffset.left + scrollLeft + scWidth ) - ccOffset.left;
        desiredHeight = ( scOffset.top + scrollTop + scHeight ) - ccOffset.top;
+       // It should never be desirable to exceed the dimensions of the browser viewport... right?
+       desiredWidth = Math.min( desiredWidth, document.documentElement.clientWidth );
+       desiredHeight = Math.min( desiredHeight, document.documentElement.clientHeight );
        allotedWidth = Math.ceil( desiredWidth - extraWidth );
        allotedHeight = Math.ceil( desiredHeight - extraHeight );
        naturalWidth = this.$clippable.prop( 'scrollWidth' );
@@ -6563,22 +6618,19 @@ OO.ui.mixin.FloatableElement.prototype.togglePositioning = function ( positionin
 
                closestScrollableOfContainer = OO.ui.Element.static.getClosestScrollableContainer( this.$floatableContainer[ 0 ] );
                closestScrollableOfFloatable = OO.ui.Element.static.getClosestScrollableContainer( this.$floatable[ 0 ] );
-               if ( closestScrollableOfContainer !== closestScrollableOfFloatable ) {
-                       // If the scrollable is the root, we have to listen to scroll events
-                       // on the window because of browser inconsistencies (or do we? someone should verify this)
-                       if ( $( closestScrollableOfContainer ).is( 'html, body' ) ) {
-                               closestScrollableOfContainer = OO.ui.Element.static.getWindow( closestScrollableOfContainer );
-                       }
+               this.needsCustomPosition = closestScrollableOfContainer !== closestScrollableOfFloatable;
+               // If the scrollable is the root, we have to listen to scroll events
+               // on the window because of browser inconsistencies.
+               if ( $( closestScrollableOfContainer ).is( 'html, body' ) ) {
+                       closestScrollableOfContainer = OO.ui.Element.static.getWindow( closestScrollableOfContainer );
                }
 
                if ( positioning ) {
                        this.$floatableWindow = $( this.getElementWindow() );
                        this.$floatableWindow.on( 'resize', this.onFloatableWindowResizeHandler );
 
-                       if ( closestScrollableOfContainer !== closestScrollableOfFloatable ) {
-                               this.$floatableClosestScrollable = $( closestScrollableOfContainer );
-                               this.$floatableClosestScrollable.on( 'scroll', this.onFloatableScrollHandler );
-                       }
+                       this.$floatableClosestScrollable = $( closestScrollableOfContainer );
+                       this.$floatableClosestScrollable.on( 'scroll', this.onFloatableScrollHandler );
 
                        // Initial position after visible
                        this.position();
@@ -6600,6 +6652,50 @@ OO.ui.mixin.FloatableElement.prototype.togglePositioning = function ( positionin
        return this;
 };
 
+/**
+ * Check whether the bottom edge of the given element is within the viewport of the given container.
+ *
+ * @private
+ * @param {jQuery} $element
+ * @param {jQuery} $container
+ * @return {boolean}
+ */
+OO.ui.mixin.FloatableElement.prototype.isElementInViewport = function ( $element, $container ) {
+       var elemRect, contRect,
+               topEdgeInBounds = false,
+               leftEdgeInBounds = false,
+               bottomEdgeInBounds = false,
+               rightEdgeInBounds = false;
+
+       elemRect = $element[ 0 ].getBoundingClientRect();
+       if ( $container[ 0 ] === window ) {
+               contRect = {
+                       top: 0,
+                       left: 0,
+                       right: document.documentElement.clientWidth,
+                       bottom: document.documentElement.clientHeight
+               };
+       } else {
+               contRect = $container[ 0 ].getBoundingClientRect();
+       }
+
+       if ( elemRect.top >= contRect.top && elemRect.top <= contRect.bottom ) {
+               topEdgeInBounds = true;
+       }
+       if ( elemRect.left >= contRect.left && elemRect.left <= contRect.right ) {
+               leftEdgeInBounds = true;
+       }
+       if ( elemRect.bottom >= contRect.top && elemRect.bottom <= contRect.bottom ) {
+               bottomEdgeInBounds = true;
+       }
+       if ( elemRect.right >= contRect.left && elemRect.right <= contRect.right ) {
+               rightEdgeInBounds = true;
+       }
+
+       // We only care that any part of the bottom edge is visible
+       return bottomEdgeInBounds && ( leftEdgeInBounds || rightEdgeInBounds );
+};
+
 /**
  * Position the floatable below its container.
  *
@@ -6614,6 +6710,17 @@ OO.ui.mixin.FloatableElement.prototype.position = function () {
                return this;
        }
 
+       if ( !this.isElementInViewport( this.$floatableContainer, this.$floatableClosestScrollable ) ) {
+               this.$floatable.addClass( 'oo-ui-floatableElement-hidden' );
+               return;
+       } else {
+               this.$floatable.removeClass( 'oo-ui-floatableElement-hidden' );
+       }
+
+       if ( !this.needsCustomPosition ) {
+               return;
+       }
+
        pos = OO.ui.Element.static.getRelativePosition( this.$floatableContainer, this.$floatable.offsetParent() );
 
        // Position under container
@@ -6745,7 +6852,8 @@ OO.ui.InputWidget = function OoUiInputWidget( config ) {
        OO.ui.InputWidget.parent.call( this, config );
 
        // Properties
-       this.$input = this.getInputElement( config );
+       // See #reusePreInfuseDOM about config.$input
+       this.$input = config.$input || this.getInputElement( config );
        this.value = '';
        this.inputFilter = config.inputFilter;
 
@@ -6829,9 +6937,8 @@ OO.ui.InputWidget.static.gatherPreInfuseState = function ( node, config ) {
  * @param {Object} config Configuration options
  * @return {jQuery} Input element
  */
-OO.ui.InputWidget.prototype.getInputElement = function ( config ) {
-       // See #reusePreInfuseDOM about config.$input
-       return config.$input || $( '<input>' );
+OO.ui.InputWidget.prototype.getInputElement = function () {
+       return $( '<input>' );
 };
 
 /**
@@ -7020,12 +7127,17 @@ OO.ui.InputWidget.prototype.restorePreInfuseState = function ( state ) {
  * @cfg {boolean} [useInputTag=false] Use an `<input/>` tag instead of a `<button/>` tag, the default.
  *  Widgets configured to be an `<input/>` do not support {@link #icon icons} and {@link #indicator indicators},
  *  non-plaintext {@link #label labels}, or {@link #value values}. In general, useInputTag should only
- *  be set to `true` when there’s need to support IE6 in a form with multiple buttons.
+ *  be set to `true` when there’s need to support IE 6 in a form with multiple buttons.
  */
 OO.ui.ButtonInputWidget = function OoUiButtonInputWidget( config ) {
        // Configuration initialization
        config = $.extend( { type: 'button', useInputTag: false }, config );
 
+       // See InputWidget#reusePreInfuseDOM about config.$input
+       if ( config.$input ) {
+               config.$input.empty();
+       }
+
        // Properties (must be set before parent constructor, which calls #setValue)
        this.useInputTag = config.useInputTag;
 
@@ -7071,10 +7183,6 @@ OO.ui.ButtonInputWidget.static.supportsSimpleLabel = false;
  */
 OO.ui.ButtonInputWidget.prototype.getInputElement = function ( config ) {
        var type;
-       // See InputWidget#reusePreInfuseDOM about config.$input
-       if ( config.$input ) {
-               return config.$input.empty();
-       }
        type = [ 'button', 'submit', 'reset' ].indexOf( config.type ) !== -1 ? config.type : 'button';
        return $( '<' + ( config.useInputTag ? 'input' : 'button' ) + ' type="' + type + '">' );
 };
@@ -7089,22 +7197,20 @@ OO.ui.ButtonInputWidget.prototype.getInputElement = function ( config ) {
  * @chainable
  */
 OO.ui.ButtonInputWidget.prototype.setLabel = function ( label ) {
-       OO.ui.mixin.LabelElement.prototype.setLabel.call( this, label );
+       if ( typeof label === 'function' ) {
+               label = OO.ui.resolveMsg( label );
+       }
 
        if ( this.useInputTag ) {
-               if ( typeof label === 'function' ) {
-                       label = OO.ui.resolveMsg( label );
-               }
-               if ( label instanceof jQuery ) {
-                       label = label.text();
-               }
-               if ( !label ) {
+               // Discard non-plaintext labels
+               if ( typeof label !== 'string' ) {
                        label = '';
                }
+
                this.$input.val( label );
        }
 
-       return this;
+       return OO.ui.mixin.LabelElement.prototype.setLabel.call( this, label );
 };
 
 /**
@@ -7296,6 +7402,11 @@ OO.ui.DropdownInputWidget = function OoUiDropdownInputWidget( config ) {
        // Configuration initialization
        config = config || {};
 
+       // See InputWidget#reusePreInfuseDOM about config.$input
+       if ( config.$input ) {
+               config.$input.addClass( 'oo-ui-element-hidden' );
+       }
+
        // Properties (must be done before parent constructor which calls #setDisabled)
        this.dropdownWidget = new OO.ui.DropdownWidget( config.dropdown );
 
@@ -7326,11 +7437,7 @@ OO.mixinClass( OO.ui.DropdownInputWidget, OO.ui.mixin.TitledElement );
  * @inheritdoc
  * @protected
  */
-OO.ui.DropdownInputWidget.prototype.getInputElement = function ( config ) {
-       // See InputWidget#reusePreInfuseDOM about config.$input
-       if ( config.$input ) {
-               return config.$input.addClass( 'oo-ui-element-hidden' );
-       }
+OO.ui.DropdownInputWidget.prototype.getInputElement = function () {
        return $( '<input>' ).attr( 'type', 'hidden' );
 };
 
@@ -7705,7 +7812,7 @@ OO.ui.RadioSelectInputWidget.prototype.setOptions = function ( options ) {
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {string} [type='text'] The value of the HTML `type` attribute: 'text', 'password', 'search',
- *  'email' or 'url'. Ignored if `multiline` is true.
+ *  'email', 'url' or 'date'. Ignored if `multiline` is true.
  *
  *  Some values of `type` result in additional behaviors:
  *
@@ -7805,7 +7912,7 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
                .append( this.$icon, this.$indicator );
        this.setReadOnly( !!config.readOnly );
        this.updateSearchIndicator();
-       if ( config.placeholder ) {
+       if ( config.placeholder !== undefined ) {
                this.$input.attr( 'placeholder', config.placeholder );
        }
        if ( config.maxLength !== undefined ) {
@@ -8106,8 +8213,8 @@ OO.ui.TextInputWidget.prototype.adjustSize = function () {
                                .val( '' );
                        maxInnerHeight = this.$clone.innerHeight();
 
-                       // Difference between reported innerHeight and scrollHeight with no scrollbars present
-                       // Equals 1 on Blink-based browsers and 0 everywhere else
+                       // Difference between reported innerHeight and scrollHeight with no scrollbars present.
+                       // This is sometimes non-zero on Blink-based browsers, depending on zoom level.
                        measurementError = maxInnerHeight - this.$clone[ 0 ].scrollHeight;
                        idealHeight = Math.min( maxInnerHeight, scrollHeight + measurementError );
 
@@ -8161,7 +8268,7 @@ OO.ui.TextInputWidget.prototype.getInputElement = function ( config ) {
  * @private
  */
 OO.ui.TextInputWidget.prototype.getSaneType = function ( config ) {
-       var type = [ 'text', 'password', 'search', 'email', 'url' ].indexOf( config.type ) !== -1 ?
+       var type = [ 'text', 'password', 'search', 'email', 'url', 'date' ].indexOf( config.type ) !== -1 ?
                config.type :
                'text';
        return config.multiline ? 'multiline' : type;
@@ -8204,7 +8311,16 @@ OO.ui.TextInputWidget.prototype.selectRange = function ( from, to ) {
 
        this.focus();
 
-       input.setSelectionRange( start, end, isBackwards ? 'backward' : 'forward' );
+       try {
+               input.setSelectionRange( start, end, isBackwards ? 'backward' : 'forward' );
+       } catch ( e ) {
+               // IE throws an exception if you call setSelectionRange on a unattached DOM node.
+               // Rather than expensively check if the input is attached every time, just check
+               // if it was the cause of an error being thrown. If not, rethrow the error.
+               if ( this.getElementDocument().body.contains( input ) ) {
+                       throw e;
+               }
+       }
        return this;
 };
 
index 453bebe..0dac2aa 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-03-01T21:50:12Z
+ * Date: 2016-03-16T19:20:22Z
  */
 ( function ( OO ) {
 
@@ -49,11 +49,15 @@ OO.ui.MediaWikiTheme.prototype.getElementClasses = function ( element ) {
                isFramed = element.supports( [ 'isFramed' ] ) && element.isFramed();
                isActive = element.supports( [ 'isActive' ] ) && element.isActive();
                if (
-                       ( isFramed && ( isActive || element.isDisabled() || element.hasFlag( 'primary' ) ) ) ||
-                       ( !isFramed && element.hasFlag( 'primary' ) )
+                       ( isFramed && ( isActive || element.isDisabled() || element.hasFlag( 'primary' ) ) )
                ) {
+                       // Button with a dark background, use white icon
                        variants.invert = true;
+               } else if ( !isFramed && element.isDisabled() ) {
+                       // Frameless disabled button, always use black icon regardless of flags
+                       variants.invert = false;
                } else {
+                       // Any other kind of button, use the right colored icon if available
                        variants.progressive = element.hasFlag( 'progressive' );
                        variants.constructive = element.hasFlag( 'constructive' );
                        variants.destructive = element.hasFlag( 'destructive' );
index f246a93..5ff9407 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-03-01T21:50:17Z
+ * Date: 2016-03-16T19:20:26Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
index e11849e..6b964fb 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-03-01T21:50:17Z
+ * Date: 2016-03-16T19:20:26Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
index dfdabc9..ae4e38d 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-03-01T21:50:12Z
+ * Date: 2016-03-16T19:20:22Z
  */
 ( function ( OO ) {
 
index 045f55d..725e1ba 100644 (file)
@@ -1,31 +1,36 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-03-01T21:50:17Z
+ * Date: 2016-03-16T19:20:26Z
  */
-.oo-ui-draggableElement-handle.oo-ui-widget-enabled {
+.oo-ui-draggableElement-handle,
+.oo-ui-draggableElement-handle.oo-ui-widget {
        cursor: move;
        cursor: url(images/grab.cur );
        cursor: -webkit-grab;
        cursor:    -moz-grab;
        cursor:         grab;
 }
-.oo-ui-draggableElement-placeholder {
-       opacity: 0.2;
-}
-.oo-ui-draggableElement.oo-ui-widget-enabled:active {
+.oo-ui-draggableElement-handle:active {
        cursor: move;
        cursor: url(images/grabbing.cur );
        cursor: -webkit-grabbing;
        cursor:    -moz-grabbing;
        cursor:         grabbing;
 }
-.oo-ui-draggableGroupElement-horizontal .oo-ui-draggableElement.oo-ui-optionWidget {
+.oo-ui-draggableElement-handle.oo-ui-widget-disabled,
+.oo-ui-widget-disabled .oo-ui-draggableElement-handle {
+       cursor: default;
+}
+.oo-ui-draggableElement-placeholder {
+       opacity: 0.2;
+}
+.oo-ui-draggableGroupElement-horizontal .oo-ui-draggableElement {
        display: inline-block;
 }
 .oo-ui-lookupElement > .oo-ui-menuSelectWidget {
index 5726dae..1f7b9bd 100644 (file)
@@ -1,31 +1,36 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-03-01T21:50:17Z
+ * Date: 2016-03-16T19:20:26Z
  */
-.oo-ui-draggableElement-handle.oo-ui-widget-enabled {
+.oo-ui-draggableElement-handle,
+.oo-ui-draggableElement-handle.oo-ui-widget {
        cursor: move;
        cursor: url(images/grab.cur );
        cursor: -webkit-grab;
        cursor:    -moz-grab;
        cursor:         grab;
 }
-.oo-ui-draggableElement-placeholder {
-       opacity: 0.2;
-}
-.oo-ui-draggableElement.oo-ui-widget-enabled:active {
+.oo-ui-draggableElement-handle:active {
        cursor: move;
        cursor: url(images/grabbing.cur );
        cursor: -webkit-grabbing;
        cursor:    -moz-grabbing;
        cursor:         grabbing;
 }
-.oo-ui-draggableGroupElement-horizontal .oo-ui-draggableElement.oo-ui-optionWidget {
+.oo-ui-draggableElement-handle.oo-ui-widget-disabled,
+.oo-ui-widget-disabled .oo-ui-draggableElement-handle {
+       cursor: default;
+}
+.oo-ui-draggableElement-placeholder {
+       opacity: 0.2;
+}
+.oo-ui-draggableGroupElement-horizontal .oo-ui-draggableElement {
        display: inline-block;
 }
 .oo-ui-lookupElement > .oo-ui-menuSelectWidget {
        right: 2em;
 }
 .oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop .oo-ui-selectFileWidget-dropTarget {
-       background: rgba(52, 123, 255, 0.1);
+       background-color: rgba(52, 123, 255, 0.1);
 }
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
index ac4b5b4..c7a4555 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-03-01T21:50:12Z
+ * Date: 2016-03-16T19:20:22Z
  */
 ( function ( OO ) {
 
@@ -3720,6 +3720,13 @@ OO.mixinClass( OO.ui.CapsuleMultiSelectWidget, OO.ui.mixin.IconElement );
  * @param {Mixed[]} datas Data of the now-selected items
  */
 
+/**
+ * @event resize
+ *
+ * A resize event is emitted when the widget's dimensions change to accomodate newly added items or
+ * current user input.
+ */
+
 /* Methods */
 
 /**
@@ -3882,7 +3889,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.addItems = function ( items ) {
        }
        if ( !same ) {
                this.emit( 'change', this.getItemsData() );
-               this.menu.position();
+               this.updateIfHeightChanged();
        }
 
        return this;
@@ -3919,7 +3926,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.removeItems = function ( items ) {
        }
        if ( !same ) {
                this.emit( 'change', this.getItemsData() );
-               this.menu.position();
+               this.updateIfHeightChanged();
        }
 
        return this;
@@ -3932,7 +3939,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.clearItems = function () {
        if ( this.items.length ) {
                OO.ui.mixin.GroupElement.prototype.clearItems.call( this );
                this.emit( 'change', this.getItemsData() );
-               this.menu.position();
+               this.updateIfHeightChanged();
        }
        return this;
 };
@@ -4162,8 +4169,21 @@ OO.ui.CapsuleMultiSelectWidget.prototype.updateInputSize = function () {
                        bestWidth = this.$content.innerWidth() - 10;
                }
                this.$input.width( Math.floor( bestWidth ) );
+               this.updateIfHeightChanged();
+       }
+};
 
+/**
+ * Determine if widget height changed, and if so, update menu position and emit 'resize' event.
+ *
+ * @private
+ */
+OO.ui.CapsuleMultiSelectWidget.prototype.updateIfHeightChanged = function () {
+       var height = this.$element.height();
+       if ( height !== this.height ) {
+               this.height = height;
                this.menu.position();
+               this.emit( 'resize' );
        }
 };
 
index d54017c..dbb9455 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-03-01T21:50:17Z
+ * Date: 2016-03-16T19:20:26Z
  */
 .oo-ui-actionWidget.oo-ui-pendingElement-pending {
        background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
 .oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
        text-align: center;
        line-height: 3.4em;
-       padding: 0 2em;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
        background-color: rgba(0, 0, 0, 0.05);
index c2b44b4..de63268 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-03-01T21:50:17Z
+ * Date: 2016-03-16T19:20:26Z
  */
 .oo-ui-window {
        background: transparent;
 .oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
        text-align: center;
        line-height: 3.4em;
-       padding: 0 2em;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
        background-color: rgba(0, 0, 0, 0.05);
        font-weight: bold;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-       background-color: rgba(118, 171, 54, 0.05);
+       background-color: rgba(8, 126, 204, 0.05);
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-       background-color: rgba(118, 171, 54, 0.1);
+       background-color: rgba(8, 126, 204, 0.1);
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
        background-color: rgba(212, 83, 83, 0.05);
index f07f11e..56108da 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-03-01T21:50:12Z
+ * Date: 2016-03-16T19:20:22Z
  */
 ( function ( OO ) {
 
@@ -2417,10 +2417,18 @@ OO.ui.Dialog.static.escapable = true;
  * @param {jQuery.Event} e Key down event
  */
 OO.ui.Dialog.prototype.onDialogKeyDown = function ( e ) {
-       if ( e.which === OO.ui.Keys.ESCAPE ) {
+       var actions;
+       if ( e.which === OO.ui.Keys.ESCAPE && this.constructor.static.escapable ) {
                this.executeAction( '' );
                e.preventDefault();
                e.stopPropagation();
+       } else if ( e.which === OO.ui.Keys.ENTER && e.ctrlKey ) {
+               actions = this.actions.get( { flags: 'primary', visible: true, disabled: false } );
+               if ( actions.length > 0 ) {
+                       this.executeAction( actions[ 0 ].getAction() );
+                       e.preventDefault();
+                       e.stopPropagation();
+               }
        }
 };
 
@@ -2511,9 +2519,7 @@ OO.ui.Dialog.prototype.getSetupProcess = function ( data ) {
                        );
                        this.actions.add( this.getActionWidgets( actions ) );
 
-                       if ( this.constructor.static.escapable ) {
-                               this.$element.on( 'keydown', this.onDialogKeyDownHandler );
-                       }
+                       this.$element.on( 'keydown', this.onDialogKeyDownHandler );
                }, this );
 };
 
@@ -2524,9 +2530,7 @@ OO.ui.Dialog.prototype.getTeardownProcess = function ( data ) {
        // Parent method
        return OO.ui.Dialog.parent.prototype.getTeardownProcess.call( this, data )
                .first( function () {
-                       if ( this.constructor.static.escapable ) {
-                               this.$element.off( 'keydown', this.onDialogKeyDownHandler );
-                       }
+                       this.$element.off( 'keydown', this.onDialogKeyDownHandler );
 
                        this.actions.clear();
                        this.currentAction = null;
index aae5201..ec755a1 100644 (file)
@@ -13,6 +13,7 @@
                        "ltr": "images/icons/calendar-ltr.svg",
                        "rtl": "images/icons/calendar-rtl.svg"
                } },
+               "code": { "file": "images/icons/code.svg" },
                "find": { "file": {
                        "ltr": "images/icons/find-ltr.svg",
                        "rtl": "images/icons/find-rtl.svg"
@@ -25,6 +26,7 @@
                        "ltr": "images/icons/layout-ltr.svg",
                        "rtl": "images/icons/layout-rtl.svg"
                } },
+               "markup": { "file": "images/icons/markup.svg" },
                "newline": { "file": {
                        "ltr": "images/icons/newline-ltr.svg",
                        "rtl": "images/icons/newline-rtl.svg"
index ceb3199..b303071 100644 (file)
                        "ltr": "images/icons/external-link-ltr.svg",
                        "rtl": "images/icons/external-link-rtl.svg"
                } },
-               "linkSecure": { "file": "images/icons/secure-link.svg" }
+               "linkSecure": { "file": "images/icons/secure-link.svg" },
+               "redo": { "file": {
+                       "ltr": "images/icons/arched-arrow-ltr.svg",
+                       "rtl": "images/icons/arched-arrow-rtl.svg"
+               } },
+               "undo": { "file": {
+                       "ltr": "images/icons/arched-arrow-rtl.svg",
+                       "rtl": "images/icons/arched-arrow-ltr.svg"
+               } }
        }
 }
index decae86..bd26399 100644 (file)
@@ -31,7 +31,7 @@
                                "fr,it": "images/icons/bold-g.svg",
                                "hy": "images/icons/bold-armn-to.svg",
                                "ka": "images/icons/bold-geor-man.svg",
-                               "ky,ru": "images/icons/bold-cyrl-zhe.svg",
+                               "ky,ru,uk": "images/icons/bold-cyrl-zhe.svg",
                                "nl": "images/icons/bold-v.svg",
                                "os": "images/icons/bold-cyrl-be.svg"
                        }
@@ -41,7 +41,7 @@
                        "lang": {
                                        "ar": "images/icons/italic-arab-meem.svg",
                                        "cs,en,fr,he,ml,pl,pt,sco": "images/icons/italic-i.svg",
-                                       "be,da,de,fi,ky,nn,no,os,sv,ru": "images/icons/italic-k.svg",
+                                       "be,da,de,fi,ky,nn,no,os,sv,ru,uk": "images/icons/italic-k.svg",
                                        "es,gl,it,nl": "images/icons/italic-c.svg",
                                        "eu": "images/icons/italic-e.svg",
                                        "fa": "images/icons/italic-arab-keheh-jeem.svg",
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/markup.png b/resources/lib/oojs-ui/themes/apex/images/icons/markup.png
new file mode 100644 (file)
index 0000000..c78f418
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/markup.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/markup.svg b/resources/lib/oojs-ui/themes/apex/images/icons/markup.svg
new file mode 100644 (file)
index 0000000..7f8c253
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24">
+    <g id="markup">
+        <path id="left-bracket" d="M9.665 6.32l-4.259 4.274-1.406 1.406 1.406 1.406 4.259 4.274 1.406-1.438-4.259-4.243 4.259-4.243z"/>
+        <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" xlink:href="#left-bracket"/>
+    </g>
+</svg>
index b03950c..40516c0 100644 (file)
@@ -20,6 +20,7 @@
                        "ltr": "images/icons/calendar-ltr.svg",
                        "rtl": "images/icons/calendar-rtl.svg"
                } },
+               "code": { "file": "images/icons/code.svg" },
                "find": { "file": {
                        "ltr": "images/icons/find-ltr.svg",
                        "rtl": "images/icons/find-rtl.svg"
@@ -32,6 +33,7 @@
                        "ltr": "images/icons/layout-ltr.svg",
                        "rtl": "images/icons/layout-rtl.svg"
                } },
+               "markup": { "file": "images/icons/markup.svg" },
                "newline": { "file": {
                        "ltr": "images/icons/newline-ltr.svg",
                        "rtl": "images/icons/newline-rtl.svg"
index ffa8905..d70f60e 100644 (file)
@@ -11,7 +11,7 @@
                        "color": "#347bff"
                },
                "constructive": {
-                       "color": "#00af89"
+                       "color": "#347bff"
                },
                "destructive": {
                        "color": "#d11d13"
                        "ltr": "images/icons/external-link-ltr.svg",
                        "rtl":  "images/icons/external-link-rtl.svg"
                } },
-               "linkSecure": { "file": "images/icons/secure-link.svg" }
+               "linkSecure": { "file": "images/icons/secure-link.svg" },
+               "redo": { "file": {
+                       "ltr": "images/icons/arched-arrow-ltr.svg",
+                       "rtl": "images/icons/arched-arrow-rtl.svg"
+               } },
+               "undo": { "file": {
+                       "ltr": "images/icons/arched-arrow-rtl.svg",
+                       "rtl": "images/icons/arched-arrow-ltr.svg"
+               } }
        }
 }
index 28188ea..45c6a64 100644 (file)
@@ -38,7 +38,7 @@
                                "fr,it": "images/icons/bold-g.svg",
                                "hy": "images/icons/bold-armn-to.svg",
                                "ka": "images/icons/bold-geor-man.svg",
-                               "ky,ru": "images/icons/bold-cyrl-zhe.svg",
+                               "ky,ru,uk": "images/icons/bold-cyrl-zhe.svg",
                                "nl": "images/icons/bold-v.svg",
                                "os": "images/icons/bold-cyrl-be.svg"
                        }
@@ -48,7 +48,7 @@
                        "lang": {
                                        "ar": "images/icons/italic-arab-meem.svg",
                                        "cs,en,fr,he,ml,pl,pt,sco": "images/icons/italic-i.svg",
-                                       "be,da,de,fi,ky,nn,no,os,sv,ru": "images/icons/italic-k.svg",
+                                       "be,da,de,fi,ky,nn,no,os,sv,ru,uk": "images/icons/italic-k.svg",
                                        "es,gl,it,nl": "images/icons/italic-c.svg",
                                        "eu": "images/icons/italic-e.svg",
                                        "fa": "images/icons/italic-arab-keheh-jeem.svg",
index b713146..efad42e 100644 (file)
@@ -11,7 +11,7 @@
                        "color": "#347bff"
                },
                "constructive": {
-                       "color": "#00af89"
+                       "color": "#347bff"
                },
                "destructive": {
                        "color": "#d11d13"
index 7029bc2..65c7c5b 100644 (file)
@@ -11,7 +11,7 @@
                        "color": "#347bff"
                },
                "constructive": {
-                       "color": "#00af89"
+                       "color": "#347bff"
                },
                "destructive": {
                        "color": "#d11d13"
@@ -45,7 +45,7 @@
                        },
                        "variants": [ "progressive" ]
                },
-               "star": { "file": "images/icons/star.svg", "variants": [ "constructive" ] },
+               "star": { "file": "images/icons/star.svg", "variants": [ "constructive", "progressive" ] },
                "trash": { "file": "images/icons/trash.svg" },
                "trashUndo": { "file": {
                        "ltr": "images/icons/trashUndo-ltr.svg",
@@ -55,6 +55,6 @@
                        "ltr": "images/icons/unLock-ltr.svg",
                        "rtl": "images/icons/unLock-rtl.svg"
                }, "variants": [ "destructive" ] },
-               "unStar": { "file": "images/icons/unStar.svg", "variants": [ "constructive" ] }
+               "unStar": { "file": "images/icons/unStar.svg", "variants": [ "constructive", "progressive" ] }
        }
 }
index c332e3c..047bc6b 100644 (file)
@@ -11,6 +11,9 @@
                        "color": "#347bff"
                },
                "constructive": {
+                       "color": "#347bff"
+               },
+               "constructive-deprecated": {
                        "color": "#00af89"
                },
                "destructive": {
                }
        },
        "images": {
-               "add": { "file": "images/icons/add.svg", "variants": [ "constructive" ] },
+               "add": { "file": "images/icons/add.svg", "variants": [ "constructive", "progressive" ] },
                "advanced": { "file": "images/icons/advanced.svg" },
                "alert": { "file": "images/icons/alert.svg", "variants": [ "warning" ] },
                "cancel": { "file": "images/icons/cancel.svg", "variants": [ "destructive" ] },
-               "check": { "file": "images/icons/check.svg", "variants": [ "constructive", "progressive", "destructive" ] },
-               "circle": { "file": "images/icons/circle.svg", "variants": [ "constructive" ] },
+               "check": { "file": "images/icons/check.svg", "variants": [ "constructive-deprecated", "constructive", "progressive", "destructive" ] },
+               "circle": { "file": "images/icons/circle.svg", "variants": [ "constructive-deprecated", "constructive", "progressive" ] },
                "close": { "file": {
                        "ltr": "images/icons/close-ltr.svg",
                        "rtl": "images/icons/close-rtl.svg"
index 3f6b88e..02d4f12 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/add-constructive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/add-constructive.png differ
index 0bd0e73..34a4bba 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #00af89 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #347bff }</style>
     <g id="add">
         <path id="plus" d="M13 6h-2v5H6v2h5v5h2v-5h5v-2h-5z"/>
     </g>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/add-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/add-progressive.png
new file mode 100644 (file)
index 0000000..02d4f12
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/add-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/add-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/add-progressive.svg
new file mode 100644 (file)
index 0000000..34a4bba
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #347bff }</style>
+    <g id="add">
+        <path id="plus" d="M13 6h-2v5H6v2h5v5h2v-5h5v-2h-5z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive-deprecated.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive-deprecated.png
new file mode 100644 (file)
index 0000000..a0f9871
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive-deprecated.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive-deprecated.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive-deprecated.svg
new file mode 100644 (file)
index 0000000..07a5614
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #00af89 }</style>
+    <path d="M17 7.5L9.5 15 6 11.5 4.5 13l5 5L20 7.5c-.706-.706-2.294-.706-3 0z" id="check"/>
+</svg>
index a0f9871..eb72d14 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive.png differ
index 07a5614..3084e5a 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #00af89 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #347bff }</style>
     <path d="M17 7.5L9.5 15 6 11.5 4.5 13l5 5L20 7.5c-.706-.706-2.294-.706-3 0z" id="check"/>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive-deprecated.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive-deprecated.png
new file mode 100644 (file)
index 0000000..43ed482
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive-deprecated.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive-deprecated.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive-deprecated.svg
new file mode 100644 (file)
index 0000000..b96e771
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #00af89 }</style>
+    <circle cx="12" cy="12" r="6"/>
+</svg>
index 43ed482..d2e71c6 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-constructive.png differ
index b96e771..136b43e 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #00af89 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #347bff }</style>
     <circle cx="12" cy="12" r="6"/>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-progressive.png
new file mode 100644 (file)
index 0000000..d2e71c6
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/circle-progressive.svg
new file mode 100644 (file)
index 0000000..136b43e
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #347bff }</style>
+    <circle cx="12" cy="12" r="6"/>
+</svg>
index a146530..a35e9d1 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png differ
index 072276b..b90f031 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
     <g id="close">
-        <path id="cross" d="M17.4 9.1c.8-.8.8-2 0-2.8L12 11.8 7.4 7.2 6 8.6l4.6 4.6-4 4c-.8.8-.8 2 0 2.8l5.4-5.4 4.6 4.6 1.4-1.4-4.6-4.6z"/>
+        <path id="cross" d="M17.4 8.1c.8-.8.8-2 0-2.8L12 10.8 7.4 6.2 6 7.6l4.6 4.6-4 4c-.8.8-.8 2 0 2.8l5.4-5.4 4.6 4.6 1.4-1.4-4.6-4.6z"/>
     </g>
 </svg>
index d768fc3..b6a42b8 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.png differ
index 1427670..c269316 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="close">
-        <path id="cross" d="M17.4 9.1c.8-.8.8-2 0-2.8L12 11.8 7.4 7.2 6 8.6l4.6 4.6-4 4c-.8.8-.8 2 0 2.8l5.4-5.4 4.6 4.6 1.4-1.4-4.6-4.6z"/>
+        <path id="cross" d="M17.4 8.1c.8-.8.8-2 0-2.8L12 10.8 7.4 6.2 6 7.6l4.6 4.6-4 4c-.8.8-.8 2 0 2.8l5.4-5.4 4.6 4.6 1.4-1.4-4.6-4.6z"/>
     </g>
 </svg>
index f484f62..16462a2 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png differ
index 19ddef6..34afc43 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
     <g id="close">
-        <path id="cross" d="M6.6 9.1c-.8-.8-.8-2 0-2.8l5.4 5.5 4.6-4.6L18 8.6l-4.6 4.6 4 4c.8.8.8 2 0 2.8L12 14.6l-4.6 4.6L6 17.8l4.6-4.6z"/>
+        <path id="cross" d="M6.6 8.1c-.8-.8-.8-2 0-2.8l5.4 5.5 4.6-4.6L18 7.6l-4.6 4.6 4 4c.8.8.8 2 0 2.8L12 13.6l-4.6 4.6L6 16.8l4.6-4.6z"/>
     </g>
 </svg>
index 504c534..e3e2417 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.png differ
index 6e0ca93..36e58ec 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="close">
-        <path id="cross" d="M6.6 9.1c-.8-.8-.8-2 0-2.8l5.4 5.5 4.6-4.6L18 8.6l-4.6 4.6 4 4c.8.8.8 2 0 2.8L12 14.6l-4.6 4.6L6 17.8l4.6-4.6z"/>
+        <path id="cross" d="M6.6 8.1c-.8-.8-.8-2 0-2.8l5.4 5.5 4.6-4.6L18 7.6l-4.6 4.6 4 4c.8.8.8 2 0 2.8L12 13.6l-4.6 4.6L6 16.8l4.6-4.6z"/>
     </g>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/markup-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/markup-invert.png
new file mode 100644 (file)
index 0000000..0f64c02
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/markup-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/markup-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/markup-invert.svg
new file mode 100644 (file)
index 0000000..9d87725
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
+    <g id="markup">
+        <path id="left-bracket" d="M9.665 6.32l-4.259 4.274-1.406 1.406 1.406 1.406 4.259 4.274 1.406-1.438-4.259-4.243 4.259-4.243z"/>
+        <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" xlink:href="#left-bracket"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/markup.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/markup.png
new file mode 100644 (file)
index 0000000..c78f418
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/markup.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/markup.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/markup.svg
new file mode 100644 (file)
index 0000000..7f8c253
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24">
+    <g id="markup">
+        <path id="left-bracket" d="M9.665 6.32l-4.259 4.274-1.406 1.406 1.406 1.406 4.259 4.274 1.406-1.438-4.259-4.243 4.259-4.243z"/>
+        <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" xlink:href="#left-bracket"/>
+    </g>
+</svg>
index cc3a4d3..39e7978 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/star-constructive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/star-constructive.png differ
index ffe5556..4a6dae9 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #00af89 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #347bff }</style>
     <path d="M12 7.4l1.7 3.6 4 .5-2.7 2.8.5 3.9-3.5-1.7-3.6 1.7.6-3.9-2.8-2.8 3.9-.5L12 7.4M12 4L9.2 9.6l-6.2.9 4.5 4.4L6.4 21l5.6-3 5.5 3-1-6.2 4.5-4.4-6.3-.9L12 4z"/>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/star-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/star-progressive.png
new file mode 100644 (file)
index 0000000..39e7978
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/star-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/star-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/star-progressive.svg
new file mode 100644 (file)
index 0000000..4a6dae9
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #347bff }</style>
+    <path d="M12 7.4l1.7 3.6 4 .5-2.7 2.8.5 3.9-3.5-1.7-3.6 1.7.6-3.9-2.8-2.8 3.9-.5L12 7.4M12 4L9.2 9.6l-6.2.9 4.5 4.4L6.4 21l5.6-3 5.5 3-1-6.2 4.5-4.4-6.3-.9L12 4z"/>
+</svg>
index c5574ba..41e2735 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-constructive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/tag-constructive.png differ
index 9feb601..1526306 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #00af89 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #347bff }</style>
     <path d="M18.748 11.717a1 1 0 0 1 0 1.414l-4.95 4.95a1 1 0 0 1-1.413 0l-6.01-6.01c-.39-.382-.707-1.15-.707-1.7V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457a1.477 1.477 0 0 0 0 2.092 1.49 1.49 0 0 0 2.094 0 1.49 1.49 0 0 0 0-2.1 1.484 1.484 0 0 0-2.094 0z" id="tag"/>
 </svg>
index 2964300..7601951 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unStar-constructive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unStar-constructive.png differ
index 5e98ccb..131743d 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #00af89 }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #347bff }</style>
     <path d="M21 11l-6-1-3-6-3 6-6 1 4 4-1 6 6-3 6 3-1-6 4-4z"/>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unStar-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unStar-progressive.png
new file mode 100644 (file)
index 0000000..7601951
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unStar-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unStar-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unStar-progressive.svg
new file mode 100644 (file)
index 0000000..131743d
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #347bff }</style>
+    <path d="M21 11l-6-1-3-6-3 6-6 1 4 4-1 6 6-3 6 3-1-6 4-4z"/>
+</svg>
index f1dcd4e..8c78b67 100644 (file)
@@ -1,27 +1,27 @@
 /*!
- * QUnit 1.18.0
- * http://qunitjs.com/
+ * QUnit 1.22.0
+ * https://qunitjs.com/
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license
- * http://jquery.org/license
+ * https://jquery.org/license
  *
- * Date: 2015-04-03T10:23Z
+ * Date: 2016-02-23T15:57Z
  */
 
 /** Font Family and Sizes */
 
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
+#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult {
        font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
 }
 
-#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
+#qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
 #qunit-tests { font-size: smaller; }
 
 
 /** Resets */
 
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
+#qunit-tests, #qunit-header, #qunit-banner, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
        margin: 0;
        padding: 0;
 }
        overflow: hidden;
 }
 
+#qunit-filteredTest {
+       padding: 0.5em 1em 0.5em 1em;
+       background-color: #F4FF77;
+       color: #366097;
+}
+
 #qunit-userAgent {
        padding: 0.5em 1em 0.5em 1em;
        background-color: #2B81AF;
        display: list-item;
 }
 
+#qunit-tests.hidepass {
+       position: relative;
+}
+
 #qunit-tests.hidepass li.running,
 #qunit-tests.hidepass li.pass {
        visibility: hidden;
        position: absolute;
-       width:   0px;
-       height:  0px;
+       width:   0;
+       height:  0;
        padding: 0;
        border:  0;
        margin:  0;
        border-radius: 5px;
 }
 
+.qunit-source {
+       margin: 0.6em 0 0.3em;
+}
+
 .qunit-collapsed {
        display: none;
 }
index f3542ca..84873ae 100644 (file)
 /*!
- * QUnit 1.18.0
- * http://qunitjs.com/
+ * QUnit 1.22.0
+ * https://qunitjs.com/
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license
- * http://jquery.org/license
+ * https://jquery.org/license
  *
- * Date: 2015-04-03T10:23Z
+ * Date: 2016-02-23T15:57Z
  */
 
-(function( window ) {
+(function( global ) {
 
-var QUnit,
-       config,
-       onErrorFnPrev,
-       loggingCallbacks = {},
-       fileName = ( sourceFromStacktrace( 0 ) || "" ).replace( /(:\d+)+\)?/, "" ).replace( /.+\//, "" ),
-       toString = Object.prototype.toString,
-       hasOwn = Object.prototype.hasOwnProperty,
-       // Keep a local reference to Date (GH-283)
-       Date = window.Date,
-       now = Date.now || function() {
-               return new Date().getTime();
-       },
-       globalStartCalled = false,
-       runStarted = false,
-       setTimeout = window.setTimeout,
-       clearTimeout = window.clearTimeout,
-       defined = {
-               document: window.document !== undefined,
-               setTimeout: window.setTimeout !== undefined,
-               sessionStorage: (function() {
-                       var x = "qunit-test-string";
-                       try {
-                               sessionStorage.setItem( x, x );
-                               sessionStorage.removeItem( x );
-                               return true;
-                       } catch ( e ) {
-                               return false;
+var QUnit = {};
+
+var Date = global.Date;
+var now = Date.now || function() {
+       return new Date().getTime();
+};
+
+var setTimeout = global.setTimeout;
+var clearTimeout = global.clearTimeout;
+
+// Store a local window from the global to allow direct references.
+var window = global.window;
+
+var defined = {
+       document: window && window.document !== undefined,
+       setTimeout: setTimeout !== undefined,
+       sessionStorage: (function() {
+               var x = "qunit-test-string";
+               try {
+                       sessionStorage.setItem( x, x );
+                       sessionStorage.removeItem( x );
+                       return true;
+               } catch ( e ) {
+                       return false;
+               }
+       }() )
+};
+
+var fileName = ( sourceFromStacktrace( 0 ) || "" ).replace( /(:\d+)+\)?/, "" ).replace( /.+\//, "" );
+var globalStartCalled = false;
+var runStarted = false;
+
+var toString = Object.prototype.toString,
+       hasOwn = Object.prototype.hasOwnProperty;
+
+// returns a new Array with the elements that are in a but not in b
+function diff( a, b ) {
+       var i, j,
+               result = a.slice();
+
+       for ( i = 0; i < result.length; i++ ) {
+               for ( j = 0; j < b.length; j++ ) {
+                       if ( result[ i ] === b[ j ] ) {
+                               result.splice( i, 1 );
+                               i--;
+                               break;
                        }
-               }())
-       },
-       /**
-        * Provides a normalized error string, correcting an issue
-        * with IE 7 (and prior) where Error.prototype.toString is
-        * not properly implemented
-        *
-        * Based on http://es5.github.com/#x15.11.4.4
-        *
-        * @param {String|Error} error
-        * @return {String} error message
-        */
-       errorString = function( error ) {
-               var name, message,
-                       errorString = error.toString();
-               if ( errorString.substring( 0, 7 ) === "[object" ) {
-                       name = error.name ? error.name.toString() : "Error";
-                       message = error.message ? error.message.toString() : "";
-                       if ( name && message ) {
-                               return name + ": " + message;
-                       } else if ( name ) {
-                               return name;
-                       } else if ( message ) {
-                               return message;
+               }
+       }
+       return result;
+}
+
+// from jquery.js
+function inArray( elem, array ) {
+       if ( array.indexOf ) {
+               return array.indexOf( elem );
+       }
+
+       for ( var i = 0, length = array.length; i < length; i++ ) {
+               if ( array[ i ] === elem ) {
+                       return i;
+               }
+       }
+
+       return -1;
+}
+
+/**
+ * Makes a clone of an object using only Array or Object as base,
+ * and copies over the own enumerable properties.
+ *
+ * @param {Object} obj
+ * @return {Object} New object with only the own properties (recursively).
+ */
+function objectValues ( obj ) {
+       var key, val,
+               vals = QUnit.is( "array", obj ) ? [] : {};
+       for ( key in obj ) {
+               if ( hasOwn.call( obj, key ) ) {
+                       val = obj[ key ];
+                       vals[ key ] = val === Object( val ) ? objectValues( val ) : val;
+               }
+       }
+       return vals;
+}
+
+function extend( a, b, undefOnly ) {
+       for ( var prop in b ) {
+               if ( hasOwn.call( b, prop ) ) {
+
+                       // Avoid "Member not found" error in IE8 caused by messing with window.constructor
+                       // This block runs on every environment, so `global` is being used instead of `window`
+                       // to avoid errors on node.
+                       if ( prop !== "constructor" || a !== global ) {
+                               if ( b[ prop ] === undefined ) {
+                                       delete a[ prop ];
+                               } else if ( !( undefOnly && typeof a[ prop ] !== "undefined" ) ) {
+                                       a[ prop ] = b[ prop ];
+                               }
+                       }
+               }
+       }
+
+       return a;
+}
+
+function objectType( obj ) {
+       if ( typeof obj === "undefined" ) {
+               return "undefined";
+       }
+
+       // Consider: typeof null === object
+       if ( obj === null ) {
+               return "null";
+       }
+
+       var match = toString.call( obj ).match( /^\[object\s(.*)\]$/ ),
+               type = match && match[ 1 ];
+
+       switch ( type ) {
+               case "Number":
+                       if ( isNaN( obj ) ) {
+                               return "nan";
+                       }
+                       return "number";
+               case "String":
+               case "Boolean":
+               case "Array":
+               case "Set":
+               case "Map":
+               case "Date":
+               case "RegExp":
+               case "Function":
+               case "Symbol":
+                       return type.toLowerCase();
+       }
+       if ( typeof obj === "object" ) {
+               return "object";
+       }
+}
+
+// Safe object type checking
+function is( type, obj ) {
+       return QUnit.objectType( obj ) === type;
+}
+
+var getUrlParams = function() {
+       var i, param, name, value;
+       var urlParams = {};
+       var location = window.location;
+       var params = location.search.slice( 1 ).split( "&" );
+       var length = params.length;
+
+       for ( i = 0; i < length; i++ ) {
+               if ( params[ i ] ) {
+                       param = params[ i ].split( "=" );
+                       name = decodeURIComponent( param[ 0 ] );
+
+                       // allow just a key to turn on a flag, e.g., test.html?noglobals
+                       value = param.length === 1 ||
+                               decodeURIComponent( param.slice( 1 ).join( "=" ) ) ;
+                       if ( urlParams[ name ] ) {
+                               urlParams[ name ] = [].concat( urlParams[ name ], value );
                        } else {
-                               return "Error";
+                               urlParams[ name ] = value;
                        }
-               } else {
-                       return errorString;
                }
-       },
-       /**
-        * Makes a clone of an object using only Array or Object as base,
-        * and copies over the own enumerable properties.
-        *
-        * @param {Object} obj
-        * @return {Object} New object with only the own properties (recursively).
-        */
-       objectValues = function( obj ) {
-               var key, val,
-                       vals = QUnit.is( "array", obj ) ? [] : {};
-               for ( key in obj ) {
-                       if ( hasOwn.call( obj, key ) ) {
-                               val = obj[ key ];
-                               vals[ key ] = val === Object( val ) ? objectValues( val ) : val;
+       }
+
+       return urlParams;
+};
+
+// Doesn't support IE6 to IE9, it will return undefined on these browsers
+// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
+function extractStacktrace( e, offset ) {
+       offset = offset === undefined ? 4 : offset;
+
+       var stack, include, i;
+
+       if ( e.stack ) {
+               stack = e.stack.split( "\n" );
+               if ( /^error$/i.test( stack[ 0 ] ) ) {
+                       stack.shift();
+               }
+               if ( fileName ) {
+                       include = [];
+                       for ( i = offset; i < stack.length; i++ ) {
+                               if ( stack[ i ].indexOf( fileName ) !== -1 ) {
+                                       break;
+                               }
+                               include.push( stack[ i ] );
+                       }
+                       if ( include.length ) {
+                               return include.join( "\n" );
                        }
                }
-               return vals;
-       };
+               return stack[ offset ];
+
+       // Support: Safari <=6 only
+       } else if ( e.sourceURL ) {
+
+               // exclude useless self-reference for generated Error objects
+               if ( /qunit.js$/.test( e.sourceURL ) ) {
+                       return;
+               }
+
+               // for actual exceptions, this is useful
+               return e.sourceURL + ":" + e.line;
+       }
+}
+
+function sourceFromStacktrace( offset ) {
+       var error = new Error();
+
+       // Support: Safari <=7 only, IE <=10 - 11 only
+       // Not all browsers generate the `stack` property for `new Error()`, see also #636
+       if ( !error.stack ) {
+               try {
+                       throw error;
+               } catch ( err ) {
+                       error = err;
+               }
+       }
 
-QUnit = {};
+       return extractStacktrace( error, offset );
+}
 
 /**
  * Config object: Maintain internal state
  * Later exposed as QUnit.config
  * `config` initialized at top of scope
  */
-config = {
+var config = {
        // The queue of tests to run
        queue: [],
 
@@ -110,15 +257,19 @@ config = {
        // by default, modify document.title when suite is done
        altertitle: true,
 
+       // HTML Reporter: collapse every test except the first failing test
+       // If false, all failing tests will be expanded
+       collapse: true,
+
        // by default, scroll to top of the page when suite is done
        scrolltop: true,
 
-       // when enabled, all tests must call expect()
-       requireExpects: false,
-
        // depth up-to which object will be dumped
        maxDepth: 5,
 
+       // when enabled, all tests must call expect()
+       requireExpects: false,
+
        // add checkboxes that are persisted in the query-string
        // when enabled, the id is set to `true` as a `QUnit.config` property
        urlConfig: [
@@ -131,7 +282,7 @@ config = {
                        id: "noglobals",
                        label: "Check for Globals",
                        tooltip: "Enabling this will test if any test introduces new properties on the " +
-                               "`window` object. Stored as query-strings."
+                               "global object (`window` in Browsers). Stored as query-strings."
                },
                {
                        id: "notrycatch",
@@ -144,6 +295,9 @@ config = {
        // Set of all modules.
        modules: [],
 
+       // Stack of nested modules
+       moduleStack: [],
+
        // The first unnamed module
        currentModule: {
                name: "",
@@ -153,75 +307,162 @@ config = {
        callbacks: {}
 };
 
+var urlParams = defined.document ? getUrlParams() : {};
+
 // Push a loose unnamed module to the modules collection
 config.modules.push( config.currentModule );
 
-// Initialize more QUnit.config and QUnit.urlParams
-(function() {
-       var i, current,
-               location = window.location || { search: "", protocol: "file:" },
-               params = location.search.slice( 1 ).split( "&" ),
-               length = params.length,
-               urlParams = {};
+if ( urlParams.filter === true ) {
+       delete urlParams.filter;
+}
 
-       if ( params[ 0 ] ) {
-               for ( i = 0; i < length; i++ ) {
-                       current = params[ i ].split( "=" );
-                       current[ 0 ] = decodeURIComponent( current[ 0 ] );
+// String search anywhere in moduleName+testName
+config.filter = urlParams.filter;
 
-                       // allow just a key to turn on a flag, e.g., test.html?noglobals
-                       current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;
-                       if ( urlParams[ current[ 0 ] ] ) {
-                               urlParams[ current[ 0 ] ] = [].concat( urlParams[ current[ 0 ] ], current[ 1 ] );
-                       } else {
-                               urlParams[ current[ 0 ] ] = current[ 1 ];
+config.testId = [];
+if ( urlParams.testId ) {
+       // Ensure that urlParams.testId is an array
+       urlParams.testId = decodeURIComponent( urlParams.testId ).split( "," );
+       for (var i = 0; i < urlParams.testId.length; i++ ) {
+               config.testId.push( urlParams.testId[ i ] );
+       }
+}
+
+var loggingCallbacks = {};
+
+// Register logging callbacks
+function registerLoggingCallbacks( obj ) {
+       var i, l, key,
+               callbackNames = [ "begin", "done", "log", "testStart", "testDone",
+                       "moduleStart", "moduleDone" ];
+
+       function registerLoggingCallback( key ) {
+               var loggingCallback = function( callback ) {
+                       if ( objectType( callback ) !== "function" ) {
+                               throw new Error(
+                                       "QUnit logging methods require a callback function as their first parameters."
+                               );
                        }
+
+                       config.callbacks[ key ].push( callback );
+               };
+
+               // DEPRECATED: This will be removed on QUnit 2.0.0+
+               // Stores the registered functions allowing restoring
+               // at verifyLoggingCallbacks() if modified
+               loggingCallbacks[ key ] = loggingCallback;
+
+               return loggingCallback;
+       }
+
+       for ( i = 0, l = callbackNames.length; i < l; i++ ) {
+               key = callbackNames[ i ];
+
+               // Initialize key collection of logging callback
+               if ( objectType( config.callbacks[ key ] ) === "undefined" ) {
+                       config.callbacks[ key ] = [];
                }
+
+               obj[ key ] = registerLoggingCallback( key );
        }
+}
+
+function runLoggingCallbacks( key, args ) {
+       var i, l, callbacks;
 
-       if ( urlParams.filter === true ) {
-               delete urlParams.filter;
+       callbacks = config.callbacks[ key ];
+       for ( i = 0, l = callbacks.length; i < l; i++ ) {
+               callbacks[ i ]( args );
        }
+}
+
+// DEPRECATED: This will be removed on 2.0.0+
+// This function verifies if the loggingCallbacks were modified by the user
+// If so, it will restore it, assign the given callback and print a console warning
+function verifyLoggingCallbacks() {
+       var loggingCallback, userCallback;
 
-       QUnit.urlParams = urlParams;
+       for ( loggingCallback in loggingCallbacks ) {
+               if ( QUnit[ loggingCallback ] !== loggingCallbacks[ loggingCallback ] ) {
 
-       // String search anywhere in moduleName+testName
-       config.filter = urlParams.filter;
+                       userCallback = QUnit[ loggingCallback ];
 
-       if ( urlParams.maxDepth ) {
-               config.maxDepth = parseInt( urlParams.maxDepth, 10 ) === -1 ?
-                       Number.POSITIVE_INFINITY :
-                       urlParams.maxDepth;
-       }
+                       // Restore the callback function
+                       QUnit[ loggingCallback ] = loggingCallbacks[ loggingCallback ];
 
-       config.testId = [];
-       if ( urlParams.testId ) {
+                       // Assign the deprecated given callback
+                       QUnit[ loggingCallback ]( userCallback );
 
-               // Ensure that urlParams.testId is an array
-               urlParams.testId = decodeURIComponent( urlParams.testId ).split( "," );
-               for ( i = 0; i < urlParams.testId.length; i++ ) {
-                       config.testId.push( urlParams.testId[ i ] );
+                       if ( global.console && global.console.warn ) {
+                               global.console.warn(
+                                       "QUnit." + loggingCallback + " was replaced with a new value.\n" +
+                                       "Please, check out the documentation on how to apply logging callbacks.\n" +
+                                       "Reference: https://api.qunitjs.com/category/callbacks/"
+                               );
+                       }
                }
        }
+}
 
-       // Figure out if we're running the tests from a server or not
-       QUnit.isLocal = location.protocol === "file:";
+( function() {
+       if ( !defined.document ) {
+               return;
+       }
 
-       // Expose the current QUnit version
-       QUnit.version = "1.18.0";
-}());
+       // `onErrorFnPrev` initialized at top of scope
+       // Preserve other handlers
+       var onErrorFnPrev = window.onerror;
+
+       // Cover uncaught exceptions
+       // Returning true will suppress the default browser handler,
+       // returning false will let it run.
+       window.onerror = function( error, filePath, linerNr ) {
+               var ret = false;
+               if ( onErrorFnPrev ) {
+                       ret = onErrorFnPrev( error, filePath, linerNr );
+               }
+
+               // Treat return value as window.onerror itself does,
+               // Only do our handling if not suppressed.
+               if ( ret !== true ) {
+                       if ( QUnit.config.current ) {
+                               if ( QUnit.config.current.ignoreGlobalErrors ) {
+                                       return true;
+                               }
+                               QUnit.pushFailure( error, filePath + ":" + linerNr );
+                       } else {
+                               QUnit.test( "global failure", extend(function() {
+                                       QUnit.pushFailure( error, filePath + ":" + linerNr );
+                               }, { validTest: true } ) );
+                       }
+                       return false;
+               }
+
+               return ret;
+       };
+} )();
+
+QUnit.urlParams = urlParams;
+
+// Figure out if we're running the tests from a server or not
+QUnit.isLocal = !( defined.document && window.location.protocol !== "file:" );
+
+// Expose the current QUnit version
+QUnit.version = "1.22.0";
 
-// Root QUnit object.
-// `QUnit` initialized at top of scope
 extend( QUnit, {
 
        // call on start of module test to prepend name to all tests
-       module: function( name, testEnvironment ) {
-               var currentModule = {
-                       name: name,
-                       testEnvironment: testEnvironment,
-                       tests: []
-               };
+       module: function( name, testEnvironment, executeNow ) {
+               var module, moduleFns;
+               var currentModule = config.currentModule;
+
+               if ( arguments.length === 2 ) {
+                       if ( testEnvironment instanceof Function ) {
+                               executeNow = testEnvironment;
+                               testEnvironment = undefined;
+                       }
+               }
 
                // DEPRECATED: handles setup/teardown functions,
                // beforeEach and afterEach should be used instead
@@ -234,46 +475,61 @@ extend( QUnit, {
                        delete testEnvironment.teardown;
                }
 
-               config.modules.push( currentModule );
-               config.currentModule = currentModule;
-       },
+               module = createModule();
 
-       // DEPRECATED: QUnit.asyncTest() will be removed in QUnit 2.0.
-       asyncTest: function( testName, expected, callback ) {
-               if ( arguments.length === 2 ) {
-                       callback = expected;
-                       expected = null;
-               }
+               moduleFns = {
+                       beforeEach: setHook( module, "beforeEach" ),
+                       afterEach: setHook( module, "afterEach" )
+               };
 
-               QUnit.test( testName, expected, callback, true );
-       },
+               if ( executeNow instanceof Function ) {
+                       config.moduleStack.push( module );
+                       setCurrentModule( module );
+                       executeNow.call( module.testEnvironment, moduleFns );
+                       config.moduleStack.pop();
+                       module = module.parentModule || currentModule;
+               }
+
+               setCurrentModule( module );
+
+               function createModule() {
+                       var parentModule = config.moduleStack.length ?
+                               config.moduleStack.slice( -1 )[ 0 ] : null;
+                       var moduleName = parentModule !== null ?
+                               [ parentModule.name, name ].join( " > " ) : name;
+                       var module = {
+                               name: moduleName,
+                               parentModule: parentModule,
+                               tests: []
+                       };
 
-       test: function( testName, expected, callback, async ) {
-               var test;
+                       var env = {};
+                       if ( parentModule ) {
+                               extend( env, parentModule.testEnvironment );
+                               delete env.beforeEach;
+                               delete env.afterEach;
+                       }
+                       extend( env, testEnvironment );
+                       module.testEnvironment = env;
 
-               if ( arguments.length === 2 ) {
-                       callback = expected;
-                       expected = null;
+                       config.modules.push( module );
+                       return module;
                }
 
-               test = new Test({
-                       testName: testName,
-                       expected: expected,
-                       async: async,
-                       callback: callback
-               });
+               function setCurrentModule( module ) {
+                       config.currentModule = module;
+               }
 
-               test.queue();
        },
 
-       skip: function( testName ) {
-               var test = new Test({
-                       testName: testName,
-                       skip: true
-               });
+       // DEPRECATED: QUnit.asyncTest() will be removed in QUnit 2.0.
+       asyncTest: asyncTest,
 
-               test.queue();
-       },
+       test: test,
+
+       skip: skip,
+
+       only: only,
 
        // DEPRECATED: The functionality of QUnit.start() will be altered in QUnit 2.0.
        // In QUnit 2.0, invoking it will ONLY affect the `QUnit.config.autostart` blocking behavior.
@@ -301,6 +557,17 @@ extend( QUnit, {
                        // If a test is running, adjust its semaphore
                        config.current.semaphore -= count || 1;
 
+                       // If semaphore is non-numeric, throw error
+                       if ( isNaN( config.current.semaphore ) ) {
+                               config.current.semaphore = 0;
+
+                               QUnit.pushFailure(
+                                       "Called start() with a non-numeric decrement.",
+                                       sourceFromStacktrace( 2 )
+                               );
+                               return;
+                       }
+
                        // Don't start until equal number of stop-calls
                        if ( config.current.semaphore > 0 ) {
                                return;
@@ -337,43 +604,9 @@ extend( QUnit, {
 
        config: config,
 
-       // Safe object type checking
-       is: function( type, obj ) {
-               return QUnit.objectType( obj ) === type;
-       },
-
-       objectType: function( obj ) {
-               if ( typeof obj === "undefined" ) {
-                       return "undefined";
-               }
-
-               // Consider: typeof null === object
-               if ( obj === null ) {
-                       return "null";
-               }
-
-               var match = toString.call( obj ).match( /^\[object\s(.*)\]$/ ),
-                       type = match && match[ 1 ] || "";
+       is: is,
 
-               switch ( type ) {
-                       case "Number":
-                               if ( isNaN( obj ) ) {
-                                       return "nan";
-                               }
-                               return "number";
-                       case "String":
-                       case "Boolean":
-                       case "Array":
-                       case "Date":
-                       case "RegExp":
-                       case "Function":
-                               return type.toLowerCase();
-               }
-               if ( typeof obj === "object" ) {
-                       return "object";
-               }
-               return undefined;
-       },
+       objectType: objectType,
 
        extend: extend,
 
@@ -395,174 +628,50 @@ extend( QUnit, {
                if ( config.autostart ) {
                        resumeProcessing();
                }
+       },
+
+       stack: function( offset ) {
+               offset = ( offset || 0 ) + 2;
+               return sourceFromStacktrace( offset );
        }
 });
 
-// Register logging callbacks
-(function() {
-       var i, l, key,
-               callbacks = [ "begin", "done", "log", "testStart", "testDone",
-                       "moduleStart", "moduleDone" ];
-
-       function registerLoggingCallback( key ) {
-               var loggingCallback = function( callback ) {
-                       if ( QUnit.objectType( callback ) !== "function" ) {
-                               throw new Error(
-                                       "QUnit logging methods require a callback function as their first parameters."
-                               );
-                       }
+registerLoggingCallbacks( QUnit );
 
-                       config.callbacks[ key ].push( callback );
-               };
+function begin() {
+       var i, l,
+               modulesLog = [];
 
-               // DEPRECATED: This will be removed on QUnit 2.0.0+
-               // Stores the registered functions allowing restoring
-               // at verifyLoggingCallbacks() if modified
-               loggingCallbacks[ key ] = loggingCallback;
+       // If the test run hasn't officially begun yet
+       if ( !config.started ) {
 
-               return loggingCallback;
-       }
+               // Record the time of the test run's beginning
+               config.started = now();
 
-       for ( i = 0, l = callbacks.length; i < l; i++ ) {
-               key = callbacks[ i ];
+               verifyLoggingCallbacks();
 
-               // Initialize key collection of logging callback
-               if ( QUnit.objectType( config.callbacks[ key ] ) === "undefined" ) {
-                       config.callbacks[ key ] = [];
+               // Delete the loose unnamed module if unused.
+               if ( config.modules[ 0 ].name === "" && config.modules[ 0 ].tests.length === 0 ) {
+                       config.modules.shift();
                }
 
-               QUnit[ key ] = registerLoggingCallback( key );
-       }
-})();
-
-// `onErrorFnPrev` initialized at top of scope
-// Preserve other handlers
-onErrorFnPrev = window.onerror;
-
-// Cover uncaught exceptions
-// Returning true will suppress the default browser handler,
-// returning false will let it run.
-window.onerror = function( error, filePath, linerNr ) {
-       var ret = false;
-       if ( onErrorFnPrev ) {
-               ret = onErrorFnPrev( error, filePath, linerNr );
-       }
-
-       // Treat return value as window.onerror itself does,
-       // Only do our handling if not suppressed.
-       if ( ret !== true ) {
-               if ( QUnit.config.current ) {
-                       if ( QUnit.config.current.ignoreGlobalErrors ) {
-                               return true;
-                       }
-                       QUnit.pushFailure( error, filePath + ":" + linerNr );
-               } else {
-                       QUnit.test( "global failure", extend(function() {
-                               QUnit.pushFailure( error, filePath + ":" + linerNr );
-                       }, { validTest: true } ) );
+               // Avoid unnecessary information by not logging modules' test environments
+               for ( i = 0, l = config.modules.length; i < l; i++ ) {
+                       modulesLog.push({
+                               name: config.modules[ i ].name,
+                               tests: config.modules[ i ].tests
+                       });
                }
-               return false;
-       }
-
-       return ret;
-};
-
-function done() {
-       var runtime, passed;
-
-       config.autorun = true;
 
-       // Log the last module results
-       if ( config.previousModule ) {
-               runLoggingCallbacks( "moduleDone", {
-                       name: config.previousModule.name,
-                       tests: config.previousModule.tests,
-                       failed: config.moduleStats.bad,
-                       passed: config.moduleStats.all - config.moduleStats.bad,
-                       total: config.moduleStats.all,
-                       runtime: now() - config.moduleStats.started
+               // The test run is officially beginning now
+               runLoggingCallbacks( "begin", {
+                       totalTests: Test.count,
+                       modules: modulesLog
                });
        }
-       delete config.previousModule;
-
-       runtime = now() - config.started;
-       passed = config.stats.all - config.stats.bad;
-
-       runLoggingCallbacks( "done", {
-               failed: config.stats.bad,
-               passed: passed,
-               total: config.stats.all,
-               runtime: runtime
-       });
-}
-
-// Doesn't support IE6 to IE9, it will return undefined on these browsers
-// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
-function extractStacktrace( e, offset ) {
-       offset = offset === undefined ? 4 : offset;
-
-       var stack, include, i;
-
-       if ( e.stack ) {
-               stack = e.stack.split( "\n" );
-               if ( /^error$/i.test( stack[ 0 ] ) ) {
-                       stack.shift();
-               }
-               if ( fileName ) {
-                       include = [];
-                       for ( i = offset; i < stack.length; i++ ) {
-                               if ( stack[ i ].indexOf( fileName ) !== -1 ) {
-                                       break;
-                               }
-                               include.push( stack[ i ] );
-                       }
-                       if ( include.length ) {
-                               return include.join( "\n" );
-                       }
-               }
-               return stack[ offset ];
-
-       // Support: Safari <=6 only
-       } else if ( e.sourceURL ) {
-
-               // exclude useless self-reference for generated Error objects
-               if ( /qunit.js$/.test( e.sourceURL ) ) {
-                       return;
-               }
-
-               // for actual exceptions, this is useful
-               return e.sourceURL + ":" + e.line;
-       }
-}
-
-function sourceFromStacktrace( offset ) {
-       var error = new Error();
-
-       // Support: Safari <=7 only, IE <=10 - 11 only
-       // Not all browsers generate the `stack` property for `new Error()`, see also #636
-       if ( !error.stack ) {
-               try {
-                       throw error;
-               } catch ( err ) {
-                       error = err;
-               }
-       }
-
-       return extractStacktrace( error, offset );
-}
-
-function synchronize( callback, last ) {
-       if ( QUnit.objectType( callback ) === "array" ) {
-               while ( callback.length ) {
-                       synchronize( callback.shift() );
-               }
-               return;
-       }
-       config.queue.push( callback );
 
-       if ( config.autorun && !config.blocking ) {
-               process( last );
-       }
+       config.blocking = false;
+       process( true );
 }
 
 function process( last ) {
@@ -592,40 +701,21 @@ function process( last ) {
        }
 }
 
-function begin() {
-       var i, l,
-               modulesLog = [];
-
-       // If the test run hasn't officially begun yet
-       if ( !config.started ) {
-
-               // Record the time of the test run's beginning
-               config.started = now();
-
-               verifyLoggingCallbacks();
-
-               // Delete the loose unnamed module if unused.
-               if ( config.modules[ 0 ].name === "" && config.modules[ 0 ].tests.length === 0 ) {
-                       config.modules.shift();
-               }
-
-               // Avoid unnecessary information by not logging modules' test environments
-               for ( i = 0, l = config.modules.length; i < l; i++ ) {
-                       modulesLog.push({
-                               name: config.modules[ i ].name,
-                               tests: config.modules[ i ].tests
-                       });
-               }
+function pauseProcessing() {
+       config.blocking = true;
 
-               // The test run is officially beginning now
-               runLoggingCallbacks( "begin", {
-                       totalTests: Test.count,
-                       modules: modulesLog
-               });
+       if ( config.testTimeout && defined.setTimeout ) {
+               clearTimeout( config.timeout );
+               config.timeout = setTimeout(function() {
+                       if ( config.current ) {
+                               config.current.semaphore = 0;
+                               QUnit.pushFailure( "Test timed out", sourceFromStacktrace( 2 ) );
+                       } else {
+                               throw new Error( "Test timed out" );
+                       }
+                       resumeProcessing();
+               }, config.testTimeout );
        }
-
-       config.blocking = false;
-       process( true );
 }
 
 function resumeProcessing() {
@@ -648,143 +738,47 @@ function resumeProcessing() {
        }
 }
 
-function pauseProcessing() {
-       config.blocking = true;
-
-       if ( config.testTimeout && defined.setTimeout ) {
-               clearTimeout( config.timeout );
-               config.timeout = setTimeout(function() {
-                       if ( config.current ) {
-                               config.current.semaphore = 0;
-                               QUnit.pushFailure( "Test timed out", sourceFromStacktrace( 2 ) );
-                       } else {
-                               throw new Error( "Test timed out" );
-                       }
-                       resumeProcessing();
-               }, config.testTimeout );
-       }
-}
+function done() {
+       var runtime, passed;
 
-function saveGlobal() {
-       config.pollution = [];
+       config.autorun = true;
 
-       if ( config.noglobals ) {
-               for ( var key in window ) {
-                       if ( hasOwn.call( window, key ) ) {
-                               // in Opera sometimes DOM element ids show up here, ignore them
-                               if ( /^qunit-test-output/.test( key ) ) {
-                                       continue;
-                               }
-                               config.pollution.push( key );
-                       }
-               }
-       }
-}
-
-function checkPollution() {
-       var newGlobals,
-               deletedGlobals,
-               old = config.pollution;
-
-       saveGlobal();
-
-       newGlobals = diff( config.pollution, old );
-       if ( newGlobals.length > 0 ) {
-               QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join( ", " ) );
-       }
-
-       deletedGlobals = diff( old, config.pollution );
-       if ( deletedGlobals.length > 0 ) {
-               QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join( ", " ) );
-       }
-}
-
-// returns a new Array with the elements that are in a but not in b
-function diff( a, b ) {
-       var i, j,
-               result = a.slice();
-
-       for ( i = 0; i < result.length; i++ ) {
-               for ( j = 0; j < b.length; j++ ) {
-                       if ( result[ i ] === b[ j ] ) {
-                               result.splice( i, 1 );
-                               i--;
-                               break;
-                       }
-               }
+       // Log the last module results
+       if ( config.previousModule ) {
+               runLoggingCallbacks( "moduleDone", {
+                       name: config.previousModule.name,
+                       tests: config.previousModule.tests,
+                       failed: config.moduleStats.bad,
+                       passed: config.moduleStats.all - config.moduleStats.bad,
+                       total: config.moduleStats.all,
+                       runtime: now() - config.moduleStats.started
+               });
        }
-       return result;
-}
-
-function extend( a, b, undefOnly ) {
-       for ( var prop in b ) {
-               if ( hasOwn.call( b, prop ) ) {
+       delete config.previousModule;
 
-                       // Avoid "Member not found" error in IE8 caused by messing with window.constructor
-                       if ( !( prop === "constructor" && a === window ) ) {
-                               if ( b[ prop ] === undefined ) {
-                                       delete a[ prop ];
-                               } else if ( !( undefOnly && typeof a[ prop ] !== "undefined" ) ) {
-                                       a[ prop ] = b[ prop ];
-                               }
-                       }
-               }
-       }
+       runtime = now() - config.started;
+       passed = config.stats.all - config.stats.bad;
 
-       return a;
+       runLoggingCallbacks( "done", {
+               failed: config.stats.bad,
+               passed: passed,
+               total: config.stats.all,
+               runtime: runtime
+       });
 }
 
-function runLoggingCallbacks( key, args ) {
-       var i, l, callbacks;
-
-       callbacks = config.callbacks[ key ];
-       for ( i = 0, l = callbacks.length; i < l; i++ ) {
-               callbacks[ i ]( args );
+function setHook( module, hookName ) {
+       if ( module.testEnvironment === undefined ) {
+               module.testEnvironment = {};
        }
-}
-
-// DEPRECATED: This will be removed on 2.0.0+
-// This function verifies if the loggingCallbacks were modified by the user
-// If so, it will restore it, assign the given callback and print a console warning
-function verifyLoggingCallbacks() {
-       var loggingCallback, userCallback;
-
-       for ( loggingCallback in loggingCallbacks ) {
-               if ( QUnit[ loggingCallback ] !== loggingCallbacks[ loggingCallback ] ) {
-
-                       userCallback = QUnit[ loggingCallback ];
-
-                       // Restore the callback function
-                       QUnit[ loggingCallback ] = loggingCallbacks[ loggingCallback ];
 
-                       // Assign the deprecated given callback
-                       QUnit[ loggingCallback ]( userCallback );
-
-                       if ( window.console && window.console.warn ) {
-                               window.console.warn(
-                                       "QUnit." + loggingCallback + " was replaced with a new value.\n" +
-                                       "Please, check out the documentation on how to apply logging callbacks.\n" +
-                                       "Reference: http://api.qunitjs.com/category/callbacks/"
-                               );
-                       }
-               }
-       }
+       return function( callback ) {
+               module.testEnvironment[ hookName ] = callback;
+       };
 }
 
-// from jquery.js
-function inArray( elem, array ) {
-       if ( array.indexOf ) {
-               return array.indexOf( elem );
-       }
-
-       for ( var i = 0, length = array.length; i < length; i++ ) {
-               if ( array[ i ] === elem ) {
-                       return i;
-               }
-       }
-
-       return -1;
-}
+var focused = false;
+var priorityCount = 0;
 
 function Test( settings ) {
        var i, l;
@@ -858,9 +852,11 @@ Test.prototype = {
 
                config.current = this;
 
+               if ( this.module.testEnvironment ) {
+                       delete this.module.testEnvironment.beforeEach;
+                       delete this.module.testEnvironment.afterEach;
+               }
                this.testEnvironment = extend( {}, this.module.testEnvironment );
-               delete this.testEnvironment.beforeEach;
-               delete this.testEnvironment.afterEach;
 
                this.started = now();
                runLoggingCallbacks( "testStart", {
@@ -886,14 +882,12 @@ Test.prototype = {
                this.callbackStarted = now();
 
                if ( config.notrycatch ) {
-                       promise = this.callback.call( this.testEnvironment, this.assert );
-                       this.resolvePromise( promise );
+                       runTest( this );
                        return;
                }
 
                try {
-                       promise = this.callback.call( this.testEnvironment, this.assert );
-                       this.resolvePromise( promise );
+                       runTest( this );
                } catch ( e ) {
                        this.pushFailure( "Died on test #" + ( this.assertions.length + 1 ) + " " +
                                this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
@@ -906,6 +900,11 @@ Test.prototype = {
                                QUnit.start();
                        }
                }
+
+               function runTest( test ) {
+                       promise = test.callback.call( test.testEnvironment, test.assert );
+                       test.resolvePromise( promise );
+               }
        },
 
        after: function() {
@@ -918,16 +917,19 @@ Test.prototype = {
                return function runHook() {
                        config.current = test;
                        if ( config.notrycatch ) {
-                               promise = hook.call( test.testEnvironment, test.assert );
-                               test.resolvePromise( promise, hookName );
+                               callHook();
                                return;
                        }
                        try {
-                               promise = hook.call( test.testEnvironment, test.assert );
-                               test.resolvePromise( promise, hookName );
+                               callHook();
                        } catch ( error ) {
                                test.pushFailure( hookName + " failed on " + test.testName + ": " +
-                                       ( error.message || error ), extractStacktrace( error, 0 ) );
+                               ( error.message || error ), extractStacktrace( error, 0 ) );
+                       }
+
+                       function callHook() {
+                               promise = hook.call( test.testEnvironment, test.assert );
+                               test.resolvePromise( promise, hookName );
                        }
                };
        },
@@ -936,16 +938,20 @@ Test.prototype = {
        hooks: function( handler ) {
                var hooks = [];
 
-               // Hooks are ignored on skipped tests
-               if ( this.skip ) {
-                       return hooks;
+               function processHooks( test, module ) {
+                       if ( module.parentModule ) {
+                               processHooks( test, module.parentModule );
+                       }
+                       if ( module.testEnvironment &&
+                               QUnit.objectType( module.testEnvironment[ handler ] ) === "function" ) {
+                               hooks.push( test.queueHook( module.testEnvironment[ handler ], handler ) );
+                       }
                }
 
-               if ( this.module.testEnvironment &&
-                               QUnit.objectType( this.module.testEnvironment[ handler ] ) === "function" ) {
-                       hooks.push( this.queueHook( this.module.testEnvironment[ handler ], handler ) );
+               // Hooks are ignored on skipped tests
+               if ( !this.skip ) {
+                       processHooks( this, this.module );
                }
-
                return hooks;
        },
 
@@ -990,6 +996,9 @@ Test.prototype = {
                        assertions: this.assertions,
                        testId: this.testId,
 
+                       // Source of Test
+                       source: this.stack,
+
                        // DEPRECATED: this property will be removed in 2.0.0, use runtime instead
                        duration: this.runtime
                });
@@ -1003,7 +1012,7 @@ Test.prototype = {
        },
 
        queue: function() {
-               var bad,
+               var priority,
                        test = this;
 
                if ( !this.valid() ) {
@@ -1019,7 +1028,6 @@ Test.prototype = {
                                },
 
                                test.hooks( "beforeEach" ),
-
                                function() {
                                        test.run();
                                },
@@ -1035,32 +1043,30 @@ Test.prototype = {
                        ]);
                }
 
-               // `bad` initialized at top of scope
-               // defer when previous test run passed, if storage is available
-               bad = QUnit.config.reorder && defined.sessionStorage &&
+               // Prioritize previously failed tests, detected from sessionStorage
+               priority = QUnit.config.reorder && defined.sessionStorage &&
                                +sessionStorage.getItem( "qunit-test-" + this.module.name + "-" + this.testName );
 
-               if ( bad ) {
-                       run();
-               } else {
-                       synchronize( run, true );
-               }
+               return synchronize( run, priority );
        },
 
-       push: function( result, actual, expected, message ) {
+       pushResult: function( resultInfo ) {
+
+               // resultInfo = { result, actual, expected, message, negative }
                var source,
                        details = {
                                module: this.module.name,
                                name: this.testName,
-                               result: result,
-                               message: message,
-                               actual: actual,
-                               expected: expected,
+                               result: resultInfo.result,
+                               message: resultInfo.message,
+                               actual: resultInfo.actual,
+                               expected: resultInfo.expected,
                                testId: this.testId,
+                               negative: resultInfo.negative || false,
                                runtime: now() - this.started
                        };
 
-               if ( !result ) {
+               if ( !resultInfo.result ) {
                        source = sourceFromStacktrace();
 
                        if ( source ) {
@@ -1071,13 +1077,13 @@ Test.prototype = {
                runLoggingCallbacks( "log", details );
 
                this.assertions.push({
-                       result: !!result,
-                       message: message
+                       result: !!resultInfo.result,
+                       message: resultInfo.message
                });
        },
 
        pushFailure: function( message, source, actual ) {
-               if ( !this instanceof Test ) {
+               if ( !( this instanceof Test ) ) {
                        throw new Error( "pushFailure() assertion outside test context, was " +
                                sourceFromStacktrace( 2 ) );
                }
@@ -1113,7 +1119,7 @@ Test.prototype = {
                                QUnit.stop();
                                then.call(
                                        promise,
-                                       QUnit.start,
+                                       function() { QUnit.start(); },
                                        function( error ) {
                                                message = "Promise rejected " +
                                                        ( !phase ? "during" : phase.replace( /Each$/, "" ) ) +
@@ -1132,10 +1138,21 @@ Test.prototype = {
        },
 
        valid: function() {
-               var include,
-                       filter = config.filter && config.filter.toLowerCase(),
+               var filter = config.filter,
+                       regexFilter = /^(!?)\/([\w\W]*)\/(i?$)/.exec( filter ),
                        module = QUnit.urlParams.module && QUnit.urlParams.module.toLowerCase(),
-                       fullName = ( this.module.name + ": " + this.testName ).toLowerCase();
+                       fullName = ( this.module.name + ": " + this.testName );
+
+               function testInModuleChain( testModule ) {
+                       var testModuleName = testModule.name ? testModule.name.toLowerCase() : null;
+                       if ( testModuleName === module ) {
+                               return true;
+                       } else if ( testModule.parentModule ) {
+                               return testInModuleChain( testModule.parentModule );
+                       } else {
+                               return false;
+                       }
+               }
 
                // Internally-generated tests are always valid
                if ( this.callback && this.callback.validTest ) {
@@ -1146,7 +1163,7 @@ Test.prototype = {
                        return false;
                }
 
-               if ( module && ( !this.module.name || this.module.name.toLowerCase() !== module ) ) {
+               if ( module && !testInModuleChain( this.module ) ) {
                        return false;
                }
 
@@ -1154,7 +1171,23 @@ Test.prototype = {
                        return true;
                }
 
-               include = filter.charAt( 0 ) !== "!";
+               return regexFilter ?
+                       this.regexFilter( !!regexFilter[1], regexFilter[2], regexFilter[3], fullName ) :
+                       this.stringFilter( filter, fullName );
+       },
+
+       regexFilter: function( exclude, pattern, flags, fullName ) {
+               var regex = new RegExp( pattern, flags );
+               var match = regex.test( fullName );
+
+               return match !== exclude;
+       },
+
+       stringFilter: function( filter, fullName ) {
+               filter = filter.toLowerCase();
+               fullName = fullName.toLowerCase();
+
+               var include = filter.charAt( 0 ) !== "!";
                if ( !include ) {
                        filter = filter.slice( 1 );
                }
@@ -1167,7 +1200,6 @@ Test.prototype = {
                // Otherwise, do the opposite
                return !include;
        }
-
 };
 
 // Resets the test setup. Useful for tests that modify the DOM.
@@ -1180,7 +1212,7 @@ QUnit.reset = function() {
 
        // Return on non-browser environments
        // This is necessary to not break on node tests
-       if ( typeof window === "undefined" ) {
+       if ( !defined.document ) {
                return;
        }
 
@@ -1228,6 +1260,129 @@ function generateHash( module, testName ) {
        return hex.slice( -8 );
 }
 
+function synchronize( callback, priority ) {
+       var last = !priority;
+
+       if ( QUnit.objectType( callback ) === "array" ) {
+               while ( callback.length ) {
+                       synchronize( callback.shift() );
+               }
+               return;
+       }
+
+       if ( priority ) {
+               config.queue.splice( priorityCount++, 0, callback );
+       } else {
+               config.queue.push( callback );
+       }
+
+       if ( config.autorun && !config.blocking ) {
+               process( last );
+       }
+}
+
+function saveGlobal() {
+       config.pollution = [];
+
+       if ( config.noglobals ) {
+               for ( var key in global ) {
+                       if ( hasOwn.call( global, key ) ) {
+
+                               // in Opera sometimes DOM element ids show up here, ignore them
+                               if ( /^qunit-test-output/.test( key ) ) {
+                                       continue;
+                               }
+                               config.pollution.push( key );
+                       }
+               }
+       }
+}
+
+function checkPollution() {
+       var newGlobals,
+               deletedGlobals,
+               old = config.pollution;
+
+       saveGlobal();
+
+       newGlobals = diff( config.pollution, old );
+       if ( newGlobals.length > 0 ) {
+               QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join( ", " ) );
+       }
+
+       deletedGlobals = diff( old, config.pollution );
+       if ( deletedGlobals.length > 0 ) {
+               QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join( ", " ) );
+       }
+}
+
+// Will be exposed as QUnit.asyncTest
+function asyncTest( testName, expected, callback ) {
+       if ( arguments.length === 2 ) {
+               callback = expected;
+               expected = null;
+       }
+
+       QUnit.test( testName, expected, callback, true );
+}
+
+// Will be exposed as QUnit.test
+function test( testName, expected, callback, async ) {
+       if ( focused )  { return; }
+
+       var newTest;
+
+       if ( arguments.length === 2 ) {
+               callback = expected;
+               expected = null;
+       }
+
+       newTest = new Test({
+               testName: testName,
+               expected: expected,
+               async: async,
+               callback: callback
+       });
+
+       newTest.queue();
+}
+
+// Will be exposed as QUnit.skip
+function skip( testName ) {
+       if ( focused )  { return; }
+
+       var test = new Test({
+               testName: testName,
+               skip: true
+       });
+
+       test.queue();
+}
+
+// Will be exposed as QUnit.only
+function only( testName, expected, callback, async ) {
+       var newTest;
+
+       if ( focused )  { return; }
+
+       QUnit.config.queue.length = 0;
+       focused = true;
+
+       if ( arguments.length === 2 ) {
+               callback = expected;
+               expected = null;
+       }
+
+       newTest = new Test({
+               testName: testName,
+               expected: expected,
+               async: async,
+               callback: callback
+       });
+
+       newTest.queue();
+}
+
 function Assert( testContext ) {
        this.test = testContext;
 }
@@ -1245,30 +1400,55 @@ QUnit.assert = Assert.prototype = {
                }
        },
 
-       // Increment this Test's semaphore counter, then return a single-use function that
+       // Increment this Test's semaphore counter, then return a function that
        // decrements that counter a maximum of once.
-       async: function() {
+       async: function( count ) {
                var test = this.test,
-                       popped = false;
+                       popped = false,
+                       acceptCallCount = count;
+
+               if ( typeof acceptCallCount === "undefined" ) {
+                       acceptCallCount = 1;
+               }
 
                test.semaphore += 1;
                test.usedAsync = true;
                pauseProcessing();
 
                return function done() {
-                       if ( !popped ) {
-                               test.semaphore -= 1;
-                               popped = true;
-                               resumeProcessing();
-                       } else {
-                               test.pushFailure( "Called the callback returned from `assert.async` more than once",
+
+                       if ( popped ) {
+                               test.pushFailure( "Too many calls to the `assert.async` callback",
                                        sourceFromStacktrace( 2 ) );
+                               return;
+                       }
+                       acceptCallCount -= 1;
+                       if ( acceptCallCount > 0 ) {
+                               return;
                        }
+
+                       test.semaphore -= 1;
+                       popped = true;
+                       resumeProcessing();
                };
        },
 
        // Exports test.push() to the user API
-       push: function( /* result, actual, expected, message */ ) {
+       // Alias of pushResult.
+       push: function( result, actual, expected, message, negative ) {
+               var currentAssert = this instanceof Assert ? this : QUnit.config.current.assert;
+               return currentAssert.pushResult( {
+                       result: result,
+                       actual: actual,
+                       expected: expected,
+                       message: message,
+                       negative: negative
+               } );
+       },
+
+       pushResult: function( resultInfo ) {
+
+               // resultInfo = { result, actual, expected, message, negative }
                var assert = this,
                        currentTest = ( assert instanceof Assert && assert.test ) || QUnit.config.current;
 
@@ -1291,57 +1471,112 @@ QUnit.assert = Assert.prototype = {
                if ( !( assert instanceof Assert ) ) {
                        assert = currentTest.assert;
                }
-               return assert.test.push.apply( assert.test, arguments );
+
+               return assert.test.pushResult( resultInfo );
        },
 
        ok: function( result, message ) {
                message = message || ( result ? "okay" : "failed, expected argument to be truthy, was: " +
                        QUnit.dump.parse( result ) );
-               this.push( !!result, result, true, message );
+               this.pushResult( {
+                       result: !!result,
+                       actual: result,
+                       expected: true,
+                       message: message
+               } );
        },
 
        notOk: function( result, message ) {
                message = message || ( !result ? "okay" : "failed, expected argument to be falsy, was: " +
                        QUnit.dump.parse( result ) );
-               this.push( !result, result, false, message );
+               this.pushResult( {
+                       result: !result,
+                       actual: result,
+                       expected: false,
+                       message: message
+               } );
        },
 
        equal: function( actual, expected, message ) {
                /*jshint eqeqeq:false */
-               this.push( expected == actual, actual, expected, message );
+               this.pushResult( {
+                       result: expected == actual,
+                       actual: actual,
+                       expected: expected,
+                       message: message
+               } );
        },
 
        notEqual: function( actual, expected, message ) {
                /*jshint eqeqeq:false */
-               this.push( expected != actual, actual, expected, message );
+               this.pushResult( {
+                       result: expected != actual,
+                       actual: actual,
+                       expected: expected,
+                       message: message,
+                       negative: true
+               } );
        },
 
        propEqual: function( actual, expected, message ) {
                actual = objectValues( actual );
                expected = objectValues( expected );
-               this.push( QUnit.equiv( actual, expected ), actual, expected, message );
+               this.pushResult( {
+                       result: QUnit.equiv( actual, expected ),
+                       actual: actual,
+                       expected: expected,
+                       message: message
+               } );
        },
 
        notPropEqual: function( actual, expected, message ) {
                actual = objectValues( actual );
                expected = objectValues( expected );
-               this.push( !QUnit.equiv( actual, expected ), actual, expected, message );
+               this.pushResult( {
+                       result: !QUnit.equiv( actual, expected ),
+                       actual: actual,
+                       expected: expected,
+                       message: message,
+                       negative: true
+               } );
        },
 
        deepEqual: function( actual, expected, message ) {
-               this.push( QUnit.equiv( actual, expected ), actual, expected, message );
+               this.pushResult( {
+                       result: QUnit.equiv( actual, expected ),
+                       actual: actual,
+                       expected: expected,
+                       message: message
+               } );
        },
 
        notDeepEqual: function( actual, expected, message ) {
-               this.push( !QUnit.equiv( actual, expected ), actual, expected, message );
+               this.pushResult( {
+                       result: !QUnit.equiv( actual, expected ),
+                       actual: actual,
+                       expected: expected,
+                       message: message,
+                       negative: true
+               } );
        },
 
        strictEqual: function( actual, expected, message ) {
-               this.push( expected === actual, actual, expected, message );
+               this.pushResult( {
+                       result: expected === actual,
+                       actual: actual,
+                       expected: expected,
+                       message: message
+               } );
        },
 
        notStrictEqual: function( actual, expected, message ) {
-               this.push( expected !== actual, actual, expected, message );
+               this.pushResult( {
+                       result: expected !== actual,
+                       actual: actual,
+                       expected: expected,
+                       message: message,
+                       negative: true
+               } );
        },
 
        "throws": function( block, expected, message ) {
@@ -1397,233 +1632,280 @@ QUnit.assert = Assert.prototype = {
                        }
                }
 
-               currentTest.assert.push( ok, actual, expectedOutput, message );
+               currentTest.assert.pushResult( {
+                       result: ok,
+                       actual: actual,
+                       expected: expectedOutput,
+                       message: message
+               } );
        }
 };
 
-// Provide an alternative to assert.throws(), for enviroments that consider throws a reserved word
+// Provide an alternative to assert.throws(), for environments that consider throws a reserved word
 // Known to us are: Closure Compiler, Narwhal
 (function() {
        /*jshint sub:true */
        Assert.prototype.raises = Assert.prototype[ "throws" ];
 }());
 
+function errorString( error ) {
+       var name, message,
+               resultErrorString = error.toString();
+       if ( resultErrorString.substring( 0, 7 ) === "[object" ) {
+               name = error.name ? error.name.toString() : "Error";
+               message = error.message ? error.message.toString() : "";
+               if ( name && message ) {
+                       return name + ": " + message;
+               } else if ( name ) {
+                       return name;
+               } else if ( message ) {
+                       return message;
+               } else {
+                       return "Error";
+               }
+       } else {
+               return resultErrorString;
+       }
+}
+
 // Test for equality any JavaScript type.
 // Author: Philippe Rathé <prathe@gmail.com>
 QUnit.equiv = (function() {
 
-       // Call the o related callback with the given arguments.
-       function bindCallbacks( o, callbacks, args ) {
-               var prop = QUnit.objectType( o );
-               if ( prop ) {
-                       if ( QUnit.objectType( callbacks[ prop ] ) === "function" ) {
-                               return callbacks[ prop ].apply( callbacks, args );
-                       } else {
-                               return callbacks[ prop ]; // or undefined
-                       }
-               }
-       }
+       // Stack to decide between skip/abort functions
+       var callers = [];
 
-       // the real equiv function
-       var innerEquiv,
+       // Stack to avoiding loops from circular referencing
+       var parents = [];
+       var parentsB = [];
 
-               // stack to decide between skip/abort functions
-               callers = [],
+       var getProto = Object.getPrototypeOf || function( obj ) {
 
-               // stack to avoiding loops from circular referencing
-               parents = [],
-               parentsB = [],
+               /*jshint proto: true */
+               return obj.__proto__;
+       };
 
-               getProto = Object.getPrototypeOf || function( obj ) {
-                       /* jshint camelcase: false, proto: true */
-                       return obj.__proto__;
-               },
-               callbacks = (function() {
+       function useStrictEquality( b, a ) {
 
-                       // for string, boolean, number and null
-                       function useStrictEquality( b, a ) {
+               // To catch short annotation VS 'new' annotation of a declaration. e.g.:
+               // `var i = 1;`
+               // `var j = new Number(1);`
+               if ( typeof a === "object" ) {
+                       a = a.valueOf();
+               }
+               if ( typeof b === "object" ) {
+                       b = b.valueOf();
+               }
 
-                               /*jshint eqeqeq:false */
-                               if ( b instanceof a.constructor || a instanceof b.constructor ) {
+               return a === b;
+       }
 
-                                       // to catch short annotation VS 'new' annotation of a
-                                       // declaration
-                                       // e.g. var i = 1;
-                                       // var j = new Number(1);
-                                       return a == b;
-                               } else {
-                                       return a === b;
-                               }
-                       }
+       function compareConstructors( a, b ) {
+               var protoA = getProto( a );
+               var protoB = getProto( b );
+
+               // Comparing constructors is more strict than using `instanceof`
+               if ( a.constructor === b.constructor ) {
+                       return true;
+               }
 
-                       return {
-                               "string": useStrictEquality,
-                               "boolean": useStrictEquality,
-                               "number": useStrictEquality,
-                               "null": useStrictEquality,
-                               "undefined": useStrictEquality,
+               // Ref #851
+               // If the obj prototype descends from a null constructor, treat it
+               // as a null prototype.
+               if ( protoA && protoA.constructor === null ) {
+                       protoA = null;
+               }
+               if ( protoB && protoB.constructor === null ) {
+                       protoB = null;
+               }
 
-                               "nan": function( b ) {
-                                       return isNaN( b );
-                               },
+               // Allow objects with no prototype to be equivalent to
+               // objects with Object as their constructor.
+               if ( ( protoA === null && protoB === Object.prototype ) ||
+                               ( protoB === null && protoA === Object.prototype ) ) {
+                       return true;
+               }
 
-                               "date": function( b, a ) {
-                                       return QUnit.objectType( b ) === "date" && a.valueOf() === b.valueOf();
-                               },
+               return false;
+       }
 
-                               "regexp": function( b, a ) {
-                                       return QUnit.objectType( b ) === "regexp" &&
+       function getRegExpFlags( regexp ) {
+               return "flags" in regexp ? regexp.flags : regexp.toString().match( /[gimuy]*$/ )[ 0 ];
+       }
 
-                                               // the regex itself
-                                               a.source === b.source &&
+       var callbacks = {
+               "string": useStrictEquality,
+               "boolean": useStrictEquality,
+               "number": useStrictEquality,
+               "null": useStrictEquality,
+               "undefined": useStrictEquality,
+               "symbol": useStrictEquality,
+               "date": useStrictEquality,
 
-                                               // and its modifiers
-                                               a.global === b.global &&
+               "nan": function() {
+                       return true;
+               },
 
-                                               // (gmi) ...
-                                               a.ignoreCase === b.ignoreCase &&
-                                               a.multiline === b.multiline &&
-                                               a.sticky === b.sticky;
-                               },
+               "regexp": function( b, a ) {
+                       return a.source === b.source &&
 
-                               // - skip when the property is a method of an instance (OOP)
-                               // - abort otherwise,
-                               // initial === would have catch identical references anyway
-                               "function": function() {
-                                       var caller = callers[ callers.length - 1 ];
-                                       return caller !== Object && typeof caller !== "undefined";
-                               },
+                               // Include flags in the comparison
+                               getRegExpFlags( a ) === getRegExpFlags( b );
+               },
 
-                               "array": function( b, a ) {
-                                       var i, j, len, loop, aCircular, bCircular;
+               // - skip when the property is a method of an instance (OOP)
+               // - abort otherwise,
+               // initial === would have catch identical references anyway
+               "function": function() {
+                       var caller = callers[ callers.length - 1 ];
+                       return caller !== Object && typeof caller !== "undefined";
+               },
 
-                                       // b could be an object literal here
-                                       if ( QUnit.objectType( b ) !== "array" ) {
-                                               return false;
-                                       }
+               "array": function( b, a ) {
+                       var i, j, len, loop, aCircular, bCircular;
 
-                                       len = a.length;
-                                       if ( len !== b.length ) {
-                                               // safe and faster
-                                               return false;
-                                       }
+                       len = a.length;
+                       if ( len !== b.length ) {
+                               // safe and faster
+                               return false;
+                       }
 
-                                       // track reference to avoid circular references
-                                       parents.push( a );
-                                       parentsB.push( b );
-                                       for ( i = 0; i < len; i++ ) {
-                                               loop = false;
-                                               for ( j = 0; j < parents.length; j++ ) {
-                                                       aCircular = parents[ j ] === a[ i ];
-                                                       bCircular = parentsB[ j ] === b[ i ];
-                                                       if ( aCircular || bCircular ) {
-                                                               if ( a[ i ] === b[ i ] || aCircular && bCircular ) {
-                                                                       loop = true;
-                                                               } else {
-                                                                       parents.pop();
-                                                                       parentsB.pop();
-                                                                       return false;
-                                                               }
-                                                       }
-                                               }
-                                               if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {
+                       // Track reference to avoid circular references
+                       parents.push( a );
+                       parentsB.push( b );
+                       for ( i = 0; i < len; i++ ) {
+                               loop = false;
+                               for ( j = 0; j < parents.length; j++ ) {
+                                       aCircular = parents[ j ] === a[ i ];
+                                       bCircular = parentsB[ j ] === b[ i ];
+                                       if ( aCircular || bCircular ) {
+                                               if ( a[ i ] === b[ i ] || aCircular && bCircular ) {
+                                                       loop = true;
+                                               } else {
                                                        parents.pop();
                                                        parentsB.pop();
                                                        return false;
                                                }
                                        }
+                               }
+                               if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {
                                        parents.pop();
                                        parentsB.pop();
-                                       return true;
-                               },
+                                       return false;
+                               }
+                       }
+                       parents.pop();
+                       parentsB.pop();
+                       return true;
+               },
 
-                               "object": function( b, a ) {
+               "set": function( b, a ) {
+                       var aArray, bArray;
 
-                                       /*jshint forin:false */
-                                       var i, j, loop, aCircular, bCircular,
-                                               // Default to true
-                                               eq = true,
-                                               aProperties = [],
-                                               bProperties = [];
+                       aArray = [];
+                       a.forEach( function( v ) {
+                               aArray.push( v );
+                       });
+                       bArray = [];
+                       b.forEach( function( v ) {
+                               bArray.push( v );
+                       });
 
-                                       // comparing constructors is more strict than using
-                                       // instanceof
-                                       if ( a.constructor !== b.constructor ) {
+                       return innerEquiv( bArray, aArray );
+               },
 
-                                               // Allow objects with no prototype to be equivalent to
-                                               // objects with Object as their constructor.
-                                               if ( !( ( getProto( a ) === null && getProto( b ) === Object.prototype ) ||
-                                                       ( getProto( b ) === null && getProto( a ) === Object.prototype ) ) ) {
-                                                       return false;
-                                               }
-                                       }
+               "map": function( b, a ) {
+                       var aArray, bArray;
 
-                                       // stack constructor before traversing properties
-                                       callers.push( a.constructor );
-
-                                       // track reference to avoid circular references
-                                       parents.push( a );
-                                       parentsB.push( b );
-
-                                       // be strict: don't ensure hasOwnProperty and go deep
-                                       for ( i in a ) {
-                                               loop = false;
-                                               for ( j = 0; j < parents.length; j++ ) {
-                                                       aCircular = parents[ j ] === a[ i ];
-                                                       bCircular = parentsB[ j ] === b[ i ];
-                                                       if ( aCircular || bCircular ) {
-                                                               if ( a[ i ] === b[ i ] || aCircular && bCircular ) {
-                                                                       loop = true;
-                                                               } else {
-                                                                       eq = false;
-                                                                       break;
-                                                               }
-                                                       }
-                                               }
-                                               aProperties.push( i );
-                                               if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {
+                       aArray = [];
+                       a.forEach( function( v, k ) {
+                               aArray.push( [ k, v ] );
+                       });
+                       bArray = [];
+                       b.forEach( function( v, k ) {
+                               bArray.push( [ k, v ] );
+                       });
+
+                       return innerEquiv( bArray, aArray );
+               },
+
+               "object": function( b, a ) {
+                       var i, j, loop, aCircular, bCircular;
+
+                       // Default to true
+                       var eq = true;
+                       var aProperties = [];
+                       var bProperties = [];
+
+                       if ( compareConstructors( a, b ) === false ) {
+                               return false;
+                       }
+
+                       // Stack constructor before traversing properties
+                       callers.push( a.constructor );
+
+                       // Track reference to avoid circular references
+                       parents.push( a );
+                       parentsB.push( b );
+
+                       // Be strict: don't ensure hasOwnProperty and go deep
+                       for ( i in a ) {
+                               loop = false;
+                               for ( j = 0; j < parents.length; j++ ) {
+                                       aCircular = parents[ j ] === a[ i ];
+                                       bCircular = parentsB[ j ] === b[ i ];
+                                       if ( aCircular || bCircular ) {
+                                               if ( a[ i ] === b[ i ] || aCircular && bCircular ) {
+                                                       loop = true;
+                                               } else {
                                                        eq = false;
                                                        break;
                                                }
                                        }
+                               }
+                               aProperties.push( i );
+                               if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {
+                                       eq = false;
+                                       break;
+                               }
+                       }
 
-                                       parents.pop();
-                                       parentsB.pop();
-                                       callers.pop(); // unstack, we are done
+                       parents.pop();
+                       parentsB.pop();
 
-                                       for ( i in b ) {
-                                               bProperties.push( i ); // collect b's properties
-                                       }
+                       // Unstack, we are done
+                       callers.pop();
 
-                                       // Ensures identical properties name
-                                       return eq && innerEquiv( aProperties.sort(), bProperties.sort() );
-                               }
-                       };
-               }());
+                       for ( i in b ) {
 
-       innerEquiv = function() { // can take multiple arguments
-               var args = [].slice.apply( arguments );
-               if ( args.length < 2 ) {
-                       return true; // end transition
+                               // Collect b's properties
+                               bProperties.push( i );
+                       }
+
+                       // Ensures identical properties name
+                       return eq && innerEquiv( aProperties.sort(), bProperties.sort() );
                }
+       };
 
-               return ( (function( a, b ) {
-                       if ( a === b ) {
-                               return true; // catch the most you can
-                       } else if ( a === null || b === null || typeof a === "undefined" ||
-                                       typeof b === "undefined" ||
-                                       QUnit.objectType( a ) !== QUnit.objectType( b ) ) {
+       function typeEquiv( a, b ) {
+               var type = QUnit.objectType( a );
+               return QUnit.objectType( b ) === type && callbacks[ type ]( b, a );
+       }
 
-                               // don't lose time with error prone cases
-                               return false;
-                       } else {
-                               return bindCallbacks( a, callbacks, [ b, a ] );
-                       }
+       // The real equiv function
+       function innerEquiv( a, b ) {
 
-                       // apply transition with (1..n) arguments
-               }( args[ 0 ], args[ 1 ] ) ) &&
-                       innerEquiv.apply( this, args.splice( 1, args.length - 1 ) ) );
-       };
+               // We're done when there's nothing more to compare
+               if ( arguments.length < 2 ) {
+                       return true;
+               }
+
+               // Require type-specific equality
+               return ( a === b || typeEquiv( a, b ) ) &&
+
+                       // ...across all consecutive argument pairs
+                       ( arguments.length === 2 || innerEquiv.apply( this, [].slice.call( arguments, 1 ) ) );
+       }
 
        return innerEquiv;
 }());
@@ -1632,7 +1914,7 @@ QUnit.equiv = (function() {
 // http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html
 QUnit.dump = (function() {
        function quote( str ) {
-               return "\"" + str.toString().replace( /"/g, "\\\"" ) + "\"";
+               return "\"" + str.toString().replace( /\\/g, "\\\\" ).replace( /"/g, "\\\"" ) + "\"";
        }
        function literal( o ) {
                return o + "";
@@ -1839,1225 +2121,1255 @@ QUnit.dump = (function() {
                                                        }
                                                }
                                        }
-                                       ret += close;
+                                       ret += close;
+
+                                       // Show content of TextNode or CDATASection
+                                       if ( node.nodeType === 3 || node.nodeType === 4 ) {
+                                               ret += node.nodeValue;
+                                       }
+
+                                       return ret + open + "/" + tag + close;
+                               },
+
+                               // function calls it internally, it's the arguments part of the function
+                               functionArgs: function( fn ) {
+                                       var args,
+                                               l = fn.length;
+
+                                       if ( !l ) {
+                                               return "";
+                                       }
+
+                                       args = new Array( l );
+                                       while ( l-- ) {
+
+                                               // 97 is 'a'
+                                               args[ l ] = String.fromCharCode( 97 + l );
+                                       }
+                                       return " " + args.join( ", " ) + " ";
+                               },
+                               // object calls it internally, the key part of an item in a map
+                               key: quote,
+                               // function calls it internally, it's the content of the function
+                               functionCode: "[code]",
+                               // node calls it internally, it's a html attribute value
+                               attribute: quote,
+                               string: quote,
+                               date: quote,
+                               regexp: literal,
+                               number: literal,
+                               "boolean": literal
+                       },
+                       // if true, entities are escaped ( <, >, \t, space and \n )
+                       HTML: false,
+                       // indentation unit
+                       indentChar: "  ",
+                       // if true, items in a collection, are separated by a \n, else just a space.
+                       multiline: true
+               };
+
+       return dump;
+}());
+
+// back compat
+QUnit.jsDump = QUnit.dump;
+
+// Deprecated
+// Extend assert methods to QUnit for Backwards compatibility
+(function() {
+       var i,
+               assertions = Assert.prototype;
+
+       function applyCurrent( current ) {
+               return function() {
+                       var assert = new Assert( QUnit.config.current );
+                       current.apply( assert, arguments );
+               };
+       }
+
+       for ( i in assertions ) {
+               QUnit[ i ] = applyCurrent( assertions[ i ] );
+       }
+})();
+
+// For browser, export only select globals
+if ( defined.document ) {
+
+       (function() {
+               var i, l,
+                       keys = [
+                               "test",
+                               "module",
+                               "expect",
+                               "asyncTest",
+                               "start",
+                               "stop",
+                               "ok",
+                               "notOk",
+                               "equal",
+                               "notEqual",
+                               "propEqual",
+                               "notPropEqual",
+                               "deepEqual",
+                               "notDeepEqual",
+                               "strictEqual",
+                               "notStrictEqual",
+                               "throws",
+                               "raises"
+                       ];
+
+               for ( i = 0, l = keys.length; i < l; i++ ) {
+                       window[ keys[ i ] ] = QUnit[ keys[ i ] ];
+               }
+       })();
+
+       window.QUnit = QUnit;
+}
+
+// For nodejs
+if ( typeof module !== "undefined" && module && module.exports ) {
+       module.exports = QUnit;
+
+       // For consistency with CommonJS environments' exports
+       module.exports.QUnit = QUnit;
+}
+
+// For CommonJS with exports, but without module.exports, like Rhino
+if ( typeof exports !== "undefined" && exports ) {
+       exports.QUnit = QUnit;
+}
+
+if ( typeof define === "function" && define.amd ) {
+       define( function() {
+               return QUnit;
+       } );
+       QUnit.config.autostart = false;
+}
+
+/*
+ * This file is a modified version of google-diff-match-patch's JavaScript implementation
+ * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),
+ * modifications are licensed as more fully set forth in LICENSE.txt.
+ *
+ * The original source of google-diff-match-patch is attributable and licensed as follows:
+ *
+ * Copyright 2006 Google Inc.
+ * https://code.google.com/p/google-diff-match-patch/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * More Info:
+ *  https://code.google.com/p/google-diff-match-patch/
+ *
+ * Usage: QUnit.diff(expected, actual)
+ *
+ */
+QUnit.diff = ( function() {
+       function DiffMatchPatch() {
+       }
+
+       //  DIFF FUNCTIONS
+
+       /**
+        * The data structure representing a diff is an array of tuples:
+        * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]
+        * which means: delete 'Hello', add 'Goodbye' and keep ' world.'
+        */
+       var DIFF_DELETE = -1,
+               DIFF_INSERT = 1,
+               DIFF_EQUAL = 0;
+
+       /**
+        * Find the differences between two texts.  Simplifies the problem by stripping
+        * any common prefix or suffix off the texts before diffing.
+        * @param {string} text1 Old string to be diffed.
+        * @param {string} text2 New string to be diffed.
+        * @param {boolean=} optChecklines Optional speedup flag. If present and false,
+        *     then don't run a line-level diff first to identify the changed areas.
+        *     Defaults to true, which does a faster, slightly less optimal diff.
+        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+        */
+       DiffMatchPatch.prototype.DiffMain = function( text1, text2, optChecklines ) {
+               var deadline, checklines, commonlength,
+                       commonprefix, commonsuffix, diffs;
+
+               // The diff must be complete in up to 1 second.
+               deadline = ( new Date() ).getTime() + 1000;
+
+               // Check for null inputs.
+               if ( text1 === null || text2 === null ) {
+                       throw new Error( "Null input. (DiffMain)" );
+               }
+
+               // Check for equality (speedup).
+               if ( text1 === text2 ) {
+                       if ( text1 ) {
+                               return [
+                                       [ DIFF_EQUAL, text1 ]
+                               ];
+                       }
+                       return [];
+               }
+
+               if ( typeof optChecklines === "undefined" ) {
+                       optChecklines = true;
+               }
+
+               checklines = optChecklines;
+
+               // Trim off common prefix (speedup).
+               commonlength = this.diffCommonPrefix( text1, text2 );
+               commonprefix = text1.substring( 0, commonlength );
+               text1 = text1.substring( commonlength );
+               text2 = text2.substring( commonlength );
+
+               // Trim off common suffix (speedup).
+               commonlength = this.diffCommonSuffix( text1, text2 );
+               commonsuffix = text1.substring( text1.length - commonlength );
+               text1 = text1.substring( 0, text1.length - commonlength );
+               text2 = text2.substring( 0, text2.length - commonlength );
+
+               // Compute the diff on the middle block.
+               diffs = this.diffCompute( text1, text2, checklines, deadline );
+
+               // Restore the prefix and suffix.
+               if ( commonprefix ) {
+                       diffs.unshift( [ DIFF_EQUAL, commonprefix ] );
+               }
+               if ( commonsuffix ) {
+                       diffs.push( [ DIFF_EQUAL, commonsuffix ] );
+               }
+               this.diffCleanupMerge( diffs );
+               return diffs;
+       };
+
+       /**
+        * Reduce the number of edits by eliminating operationally trivial equalities.
+        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+        */
+       DiffMatchPatch.prototype.diffCleanupEfficiency = function( diffs ) {
+               var changes, equalities, equalitiesLength, lastequality,
+                       pointer, preIns, preDel, postIns, postDel;
+               changes = false;
+               equalities = []; // Stack of indices where equalities are found.
+               equalitiesLength = 0; // Keeping our own length var is faster in JS.
+               /** @type {?string} */
+               lastequality = null;
+               // Always equal to diffs[equalities[equalitiesLength - 1]][1]
+               pointer = 0; // Index of current position.
+               // Is there an insertion operation before the last equality.
+               preIns = false;
+               // Is there a deletion operation before the last equality.
+               preDel = false;
+               // Is there an insertion operation after the last equality.
+               postIns = false;
+               // Is there a deletion operation after the last equality.
+               postDel = false;
+               while ( pointer < diffs.length ) {
+
+                       // Equality found.
+                       if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) {
+                               if ( diffs[ pointer ][ 1 ].length < 4 && ( postIns || postDel ) ) {
+
+                                       // Candidate found.
+                                       equalities[ equalitiesLength++ ] = pointer;
+                                       preIns = postIns;
+                                       preDel = postDel;
+                                       lastequality = diffs[ pointer ][ 1 ];
+                               } else {
+
+                                       // Not a candidate, and can never become one.
+                                       equalitiesLength = 0;
+                                       lastequality = null;
+                               }
+                               postIns = postDel = false;
+
+                       // An insertion or deletion.
+                       } else {
+
+                               if ( diffs[ pointer ][ 0 ] === DIFF_DELETE ) {
+                                       postDel = true;
+                               } else {
+                                       postIns = true;
+                               }
+
+                               /*
+                                * Five types to be split:
+                                * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>
+                                * <ins>A</ins>X<ins>C</ins><del>D</del>
+                                * <ins>A</ins><del>B</del>X<ins>C</ins>
+                                * <ins>A</del>X<ins>C</ins><del>D</del>
+                                * <ins>A</ins><del>B</del>X<del>C</del>
+                                */
+                               if ( lastequality && ( ( preIns && preDel && postIns && postDel ) ||
+                                               ( ( lastequality.length < 2 ) &&
+                                               ( preIns + preDel + postIns + postDel ) === 3 ) ) ) {
+
+                                       // Duplicate record.
+                                       diffs.splice(
+                                               equalities[ equalitiesLength - 1 ],
+                                               0,
+                                               [ DIFF_DELETE, lastequality ]
+                                       );
+
+                                       // Change second copy to insert.
+                                       diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;
+                                       equalitiesLength--; // Throw away the equality we just deleted;
+                                       lastequality = null;
+                                       if ( preIns && preDel ) {
+                                               // No changes made which could affect previous entry, keep going.
+                                               postIns = postDel = true;
+                                               equalitiesLength = 0;
+                                       } else {
+                                               equalitiesLength--; // Throw away the previous equality.
+                                               pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;
+                                               postIns = postDel = false;
+                                       }
+                                       changes = true;
+                               }
+                       }
+                       pointer++;
+               }
+
+               if ( changes ) {
+                       this.diffCleanupMerge( diffs );
+               }
+       };
+
+       /**
+        * Convert a diff array into a pretty HTML report.
+        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+        * @param {integer} string to be beautified.
+        * @return {string} HTML representation.
+        */
+       DiffMatchPatch.prototype.diffPrettyHtml = function( diffs ) {
+               var op, data, x,
+                       html = [];
+               for ( x = 0; x < diffs.length; x++ ) {
+                       op = diffs[ x ][ 0 ]; // Operation (insert, delete, equal)
+                       data = diffs[ x ][ 1 ]; // Text of change.
+                       switch ( op ) {
+                       case DIFF_INSERT:
+                               html[ x ] = "<ins>" + data + "</ins>";
+                               break;
+                       case DIFF_DELETE:
+                               html[ x ] = "<del>" + data + "</del>";
+                               break;
+                       case DIFF_EQUAL:
+                               html[ x ] = "<span>" + data + "</span>";
+                               break;
+                       }
+               }
+               return html.join( "" );
+       };
+
+       /**
+        * Determine the common prefix of two strings.
+        * @param {string} text1 First string.
+        * @param {string} text2 Second string.
+        * @return {number} The number of characters common to the start of each
+        *     string.
+        */
+       DiffMatchPatch.prototype.diffCommonPrefix = function( text1, text2 ) {
+               var pointermid, pointermax, pointermin, pointerstart;
+               // Quick check for common null cases.
+               if ( !text1 || !text2 || text1.charAt( 0 ) !== text2.charAt( 0 ) ) {
+                       return 0;
+               }
+               // Binary search.
+               // Performance analysis: https://neil.fraser.name/news/2007/10/09/
+               pointermin = 0;
+               pointermax = Math.min( text1.length, text2.length );
+               pointermid = pointermax;
+               pointerstart = 0;
+               while ( pointermin < pointermid ) {
+                       if ( text1.substring( pointerstart, pointermid ) ===
+                                       text2.substring( pointerstart, pointermid ) ) {
+                               pointermin = pointermid;
+                               pointerstart = pointermin;
+                       } else {
+                               pointermax = pointermid;
+                       }
+                       pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
+               }
+               return pointermid;
+       };
+
+       /**
+        * Determine the common suffix of two strings.
+        * @param {string} text1 First string.
+        * @param {string} text2 Second string.
+        * @return {number} The number of characters common to the end of each string.
+        */
+       DiffMatchPatch.prototype.diffCommonSuffix = function( text1, text2 ) {
+               var pointermid, pointermax, pointermin, pointerend;
+               // Quick check for common null cases.
+               if ( !text1 ||
+                               !text2 ||
+                               text1.charAt( text1.length - 1 ) !== text2.charAt( text2.length - 1 ) ) {
+                       return 0;
+               }
+               // Binary search.
+               // Performance analysis: https://neil.fraser.name/news/2007/10/09/
+               pointermin = 0;
+               pointermax = Math.min( text1.length, text2.length );
+               pointermid = pointermax;
+               pointerend = 0;
+               while ( pointermin < pointermid ) {
+                       if ( text1.substring( text1.length - pointermid, text1.length - pointerend ) ===
+                                       text2.substring( text2.length - pointermid, text2.length - pointerend ) ) {
+                               pointermin = pointermid;
+                               pointerend = pointermin;
+                       } else {
+                               pointermax = pointermid;
+                       }
+                       pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
+               }
+               return pointermid;
+       };
+
+       /**
+        * Find the differences between two texts.  Assumes that the texts do not
+        * have any common prefix or suffix.
+        * @param {string} text1 Old string to be diffed.
+        * @param {string} text2 New string to be diffed.
+        * @param {boolean} checklines Speedup flag.  If false, then don't run a
+        *     line-level diff first to identify the changed areas.
+        *     If true, then run a faster, slightly less optimal diff.
+        * @param {number} deadline Time when the diff should be complete by.
+        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffCompute = function( text1, text2, checklines, deadline ) {
+               var diffs, longtext, shorttext, i, hm,
+                       text1A, text2A, text1B, text2B,
+                       midCommon, diffsA, diffsB;
+
+               if ( !text1 ) {
+                       // Just add some text (speedup).
+                       return [
+                               [ DIFF_INSERT, text2 ]
+                       ];
+               }
+
+               if ( !text2 ) {
+                       // Just delete some text (speedup).
+                       return [
+                               [ DIFF_DELETE, text1 ]
+                       ];
+               }
+
+               longtext = text1.length > text2.length ? text1 : text2;
+               shorttext = text1.length > text2.length ? text2 : text1;
+               i = longtext.indexOf( shorttext );
+               if ( i !== -1 ) {
+                       // Shorter text is inside the longer text (speedup).
+                       diffs = [
+                               [ DIFF_INSERT, longtext.substring( 0, i ) ],
+                               [ DIFF_EQUAL, shorttext ],
+                               [ DIFF_INSERT, longtext.substring( i + shorttext.length ) ]
+                       ];
+                       // Swap insertions for deletions if diff is reversed.
+                       if ( text1.length > text2.length ) {
+                               diffs[ 0 ][ 0 ] = diffs[ 2 ][ 0 ] = DIFF_DELETE;
+                       }
+                       return diffs;
+               }
+
+               if ( shorttext.length === 1 ) {
+                       // Single character string.
+                       // After the previous speedup, the character can't be an equality.
+                       return [
+                               [ DIFF_DELETE, text1 ],
+                               [ DIFF_INSERT, text2 ]
+                       ];
+               }
+
+               // Check to see if the problem can be split in two.
+               hm = this.diffHalfMatch( text1, text2 );
+               if ( hm ) {
+                       // A half-match was found, sort out the return data.
+                       text1A = hm[ 0 ];
+                       text1B = hm[ 1 ];
+                       text2A = hm[ 2 ];
+                       text2B = hm[ 3 ];
+                       midCommon = hm[ 4 ];
+                       // Send both pairs off for separate processing.
+                       diffsA = this.DiffMain( text1A, text2A, checklines, deadline );
+                       diffsB = this.DiffMain( text1B, text2B, checklines, deadline );
+                       // Merge the results.
+                       return diffsA.concat( [
+                               [ DIFF_EQUAL, midCommon ]
+                       ], diffsB );
+               }
+
+               if ( checklines && text1.length > 100 && text2.length > 100 ) {
+                       return this.diffLineMode( text1, text2, deadline );
+               }
+
+               return this.diffBisect( text1, text2, deadline );
+       };
+
+       /**
+        * Do the two texts share a substring which is at least half the length of the
+        * longer text?
+        * This speedup can produce non-minimal diffs.
+        * @param {string} text1 First string.
+        * @param {string} text2 Second string.
+        * @return {Array.<string>} Five element Array, containing the prefix of
+        *     text1, the suffix of text1, the prefix of text2, the suffix of
+        *     text2 and the common middle.  Or null if there was no match.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffHalfMatch = function( text1, text2 ) {
+               var longtext, shorttext, dmp,
+                       text1A, text2B, text2A, text1B, midCommon,
+                       hm1, hm2, hm;
+
+               longtext = text1.length > text2.length ? text1 : text2;
+               shorttext = text1.length > text2.length ? text2 : text1;
+               if ( longtext.length < 4 || shorttext.length * 2 < longtext.length ) {
+                       return null; // Pointless.
+               }
+               dmp = this; // 'this' becomes 'window' in a closure.
+
+               /**
+                * Does a substring of shorttext exist within longtext such that the substring
+                * is at least half the length of longtext?
+                * Closure, but does not reference any external variables.
+                * @param {string} longtext Longer string.
+                * @param {string} shorttext Shorter string.
+                * @param {number} i Start index of quarter length substring within longtext.
+                * @return {Array.<string>} Five element Array, containing the prefix of
+                *     longtext, the suffix of longtext, the prefix of shorttext, the suffix
+                *     of shorttext and the common middle.  Or null if there was no match.
+                * @private
+                */
+               function diffHalfMatchI( longtext, shorttext, i ) {
+                       var seed, j, bestCommon, prefixLength, suffixLength,
+                               bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;
+                       // Start with a 1/4 length substring at position i as a seed.
+                       seed = longtext.substring( i, i + Math.floor( longtext.length / 4 ) );
+                       j = -1;
+                       bestCommon = "";
+                       while ( ( j = shorttext.indexOf( seed, j + 1 ) ) !== -1 ) {
+                               prefixLength = dmp.diffCommonPrefix( longtext.substring( i ),
+                                       shorttext.substring( j ) );
+                               suffixLength = dmp.diffCommonSuffix( longtext.substring( 0, i ),
+                                       shorttext.substring( 0, j ) );
+                               if ( bestCommon.length < suffixLength + prefixLength ) {
+                                       bestCommon = shorttext.substring( j - suffixLength, j ) +
+                                               shorttext.substring( j, j + prefixLength );
+                                       bestLongtextA = longtext.substring( 0, i - suffixLength );
+                                       bestLongtextB = longtext.substring( i + prefixLength );
+                                       bestShorttextA = shorttext.substring( 0, j - suffixLength );
+                                       bestShorttextB = shorttext.substring( j + prefixLength );
+                               }
+                       }
+                       if ( bestCommon.length * 2 >= longtext.length ) {
+                               return [ bestLongtextA, bestLongtextB,
+                                       bestShorttextA, bestShorttextB, bestCommon
+                               ];
+                       } else {
+                               return null;
+                       }
+               }
+
+               // First check if the second quarter is the seed for a half-match.
+               hm1 = diffHalfMatchI( longtext, shorttext,
+                       Math.ceil( longtext.length / 4 ) );
+               // Check again based on the third quarter.
+               hm2 = diffHalfMatchI( longtext, shorttext,
+                       Math.ceil( longtext.length / 2 ) );
+               if ( !hm1 && !hm2 ) {
+                       return null;
+               } else if ( !hm2 ) {
+                       hm = hm1;
+               } else if ( !hm1 ) {
+                       hm = hm2;
+               } else {
+                       // Both matched.  Select the longest.
+                       hm = hm1[ 4 ].length > hm2[ 4 ].length ? hm1 : hm2;
+               }
+
+               // A half-match was found, sort out the return data.
+               text1A, text1B, text2A, text2B;
+               if ( text1.length > text2.length ) {
+                       text1A = hm[ 0 ];
+                       text1B = hm[ 1 ];
+                       text2A = hm[ 2 ];
+                       text2B = hm[ 3 ];
+               } else {
+                       text2A = hm[ 0 ];
+                       text2B = hm[ 1 ];
+                       text1A = hm[ 2 ];
+                       text1B = hm[ 3 ];
+               }
+               midCommon = hm[ 4 ];
+               return [ text1A, text1B, text2A, text2B, midCommon ];
+       };
+
+       /**
+        * Do a quick line-level diff on both strings, then rediff the parts for
+        * greater accuracy.
+        * This speedup can produce non-minimal diffs.
+        * @param {string} text1 Old string to be diffed.
+        * @param {string} text2 New string to be diffed.
+        * @param {number} deadline Time when the diff should be complete by.
+        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffLineMode = function( text1, text2, deadline ) {
+               var a, diffs, linearray, pointer, countInsert,
+                       countDelete, textInsert, textDelete, j;
+               // Scan the text on a line-by-line basis first.
+               a = this.diffLinesToChars( text1, text2 );
+               text1 = a.chars1;
+               text2 = a.chars2;
+               linearray = a.lineArray;
+
+               diffs = this.DiffMain( text1, text2, false, deadline );
+
+               // Convert the diff back to original text.
+               this.diffCharsToLines( diffs, linearray );
+               // Eliminate freak matches (e.g. blank lines)
+               this.diffCleanupSemantic( diffs );
+
+               // Rediff any replacement blocks, this time character-by-character.
+               // Add a dummy entry at the end.
+               diffs.push( [ DIFF_EQUAL, "" ] );
+               pointer = 0;
+               countDelete = 0;
+               countInsert = 0;
+               textDelete = "";
+               textInsert = "";
+               while ( pointer < diffs.length ) {
+                       switch ( diffs[ pointer ][ 0 ] ) {
+                       case DIFF_INSERT:
+                               countInsert++;
+                               textInsert += diffs[ pointer ][ 1 ];
+                               break;
+                       case DIFF_DELETE:
+                               countDelete++;
+                               textDelete += diffs[ pointer ][ 1 ];
+                               break;
+                       case DIFF_EQUAL:
+                               // Upon reaching an equality, check for prior redundancies.
+                               if ( countDelete >= 1 && countInsert >= 1 ) {
+                                       // Delete the offending records and add the merged ones.
+                                       diffs.splice( pointer - countDelete - countInsert,
+                                               countDelete + countInsert );
+                                       pointer = pointer - countDelete - countInsert;
+                                       a = this.DiffMain( textDelete, textInsert, false, deadline );
+                                       for ( j = a.length - 1; j >= 0; j-- ) {
+                                               diffs.splice( pointer, 0, a[ j ] );
+                                       }
+                                       pointer = pointer + a.length;
+                               }
+                               countInsert = 0;
+                               countDelete = 0;
+                               textDelete = "";
+                               textInsert = "";
+                               break;
+                       }
+                       pointer++;
+               }
+               diffs.pop(); // Remove the dummy entry at the end.
+
+               return diffs;
+       };
+
+       /**
+        * Find the 'middle snake' of a diff, split the problem in two
+        * and return the recursively constructed diff.
+        * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.
+        * @param {string} text1 Old string to be diffed.
+        * @param {string} text2 New string to be diffed.
+        * @param {number} deadline Time at which to bail if not yet complete.
+        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffBisect = function( text1, text2, deadline ) {
+               var text1Length, text2Length, maxD, vOffset, vLength,
+                       v1, v2, x, delta, front, k1start, k1end, k2start,
+                       k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;
+               // Cache the text lengths to prevent multiple calls.
+               text1Length = text1.length;
+               text2Length = text2.length;
+               maxD = Math.ceil( ( text1Length + text2Length ) / 2 );
+               vOffset = maxD;
+               vLength = 2 * maxD;
+               v1 = new Array( vLength );
+               v2 = new Array( vLength );
+               // Setting all elements to -1 is faster in Chrome & Firefox than mixing
+               // integers and undefined.
+               for ( x = 0; x < vLength; x++ ) {
+                       v1[ x ] = -1;
+                       v2[ x ] = -1;
+               }
+               v1[ vOffset + 1 ] = 0;
+               v2[ vOffset + 1 ] = 0;
+               delta = text1Length - text2Length;
+               // If the total number of characters is odd, then the front path will collide
+               // with the reverse path.
+               front = ( delta % 2 !== 0 );
+               // Offsets for start and end of k loop.
+               // Prevents mapping of space beyond the grid.
+               k1start = 0;
+               k1end = 0;
+               k2start = 0;
+               k2end = 0;
+               for ( d = 0; d < maxD; d++ ) {
+                       // Bail out if deadline is reached.
+                       if ( ( new Date() ).getTime() > deadline ) {
+                               break;
+                       }
+
+                       // Walk the front path one step.
+                       for ( k1 = -d + k1start; k1 <= d - k1end; k1 += 2 ) {
+                               k1Offset = vOffset + k1;
+                               if ( k1 === -d || ( k1 !== d && v1[ k1Offset - 1 ] < v1[ k1Offset + 1 ] ) ) {
+                                       x1 = v1[ k1Offset + 1 ];
+                               } else {
+                                       x1 = v1[ k1Offset - 1 ] + 1;
+                               }
+                               y1 = x1 - k1;
+                               while ( x1 < text1Length && y1 < text2Length &&
+                                       text1.charAt( x1 ) === text2.charAt( y1 ) ) {
+                                       x1++;
+                                       y1++;
+                               }
+                               v1[ k1Offset ] = x1;
+                               if ( x1 > text1Length ) {
+                                       // Ran off the right of the graph.
+                                       k1end += 2;
+                               } else if ( y1 > text2Length ) {
+                                       // Ran off the bottom of the graph.
+                                       k1start += 2;
+                               } else if ( front ) {
+                                       k2Offset = vOffset + delta - k1;
+                                       if ( k2Offset >= 0 && k2Offset < vLength && v2[ k2Offset ] !== -1 ) {
+                                               // Mirror x2 onto top-left coordinate system.
+                                               x2 = text1Length - v2[ k2Offset ];
+                                               if ( x1 >= x2 ) {
+                                                       // Overlap detected.
+                                                       return this.diffBisectSplit( text1, text2, x1, y1, deadline );
+                                               }
+                                       }
+                               }
+                       }
 
-                                       // Show content of TextNode or CDATASection
-                                       if ( node.nodeType === 3 || node.nodeType === 4 ) {
-                                               ret += node.nodeValue;
+                       // Walk the reverse path one step.
+                       for ( k2 = -d + k2start; k2 <= d - k2end; k2 += 2 ) {
+                               k2Offset = vOffset + k2;
+                               if ( k2 === -d || ( k2 !== d && v2[ k2Offset - 1 ] < v2[ k2Offset + 1 ] ) ) {
+                                       x2 = v2[ k2Offset + 1 ];
+                               } else {
+                                       x2 = v2[ k2Offset - 1 ] + 1;
+                               }
+                               y2 = x2 - k2;
+                               while ( x2 < text1Length && y2 < text2Length &&
+                                       text1.charAt( text1Length - x2 - 1 ) ===
+                                       text2.charAt( text2Length - y2 - 1 ) ) {
+                                       x2++;
+                                       y2++;
+                               }
+                               v2[ k2Offset ] = x2;
+                               if ( x2 > text1Length ) {
+                                       // Ran off the left of the graph.
+                                       k2end += 2;
+                               } else if ( y2 > text2Length ) {
+                                       // Ran off the top of the graph.
+                                       k2start += 2;
+                               } else if ( !front ) {
+                                       k1Offset = vOffset + delta - k2;
+                                       if ( k1Offset >= 0 && k1Offset < vLength && v1[ k1Offset ] !== -1 ) {
+                                               x1 = v1[ k1Offset ];
+                                               y1 = vOffset + x1 - k1Offset;
+                                               // Mirror x2 onto top-left coordinate system.
+                                               x2 = text1Length - x2;
+                                               if ( x1 >= x2 ) {
+                                                       // Overlap detected.
+                                                       return this.diffBisectSplit( text1, text2, x1, y1, deadline );
+                                               }
                                        }
+                               }
+                       }
+               }
+               // Diff took too long and hit the deadline or
+               // number of diffs equals number of characters, no commonality at all.
+               return [
+                       [ DIFF_DELETE, text1 ],
+                       [ DIFF_INSERT, text2 ]
+               ];
+       };
 
-                                       return ret + open + "/" + tag + close;
-                               },
-
-                               // function calls it internally, it's the arguments part of the function
-                               functionArgs: function( fn ) {
-                                       var args,
-                                               l = fn.length;
+       /**
+        * Given the location of the 'middle snake', split the diff in two parts
+        * and recurse.
+        * @param {string} text1 Old string to be diffed.
+        * @param {string} text2 New string to be diffed.
+        * @param {number} x Index of split point in text1.
+        * @param {number} y Index of split point in text2.
+        * @param {number} deadline Time at which to bail if not yet complete.
+        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffBisectSplit = function( text1, text2, x, y, deadline ) {
+               var text1a, text1b, text2a, text2b, diffs, diffsb;
+               text1a = text1.substring( 0, x );
+               text2a = text2.substring( 0, y );
+               text1b = text1.substring( x );
+               text2b = text2.substring( y );
+
+               // Compute both diffs serially.
+               diffs = this.DiffMain( text1a, text2a, false, deadline );
+               diffsb = this.DiffMain( text1b, text2b, false, deadline );
+
+               return diffs.concat( diffsb );
+       };
 
-                                       if ( !l ) {
-                                               return "";
-                                       }
+       /**
+        * Reduce the number of edits by eliminating semantically trivial equalities.
+        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+        */
+       DiffMatchPatch.prototype.diffCleanupSemantic = function( diffs ) {
+               var changes, equalities, equalitiesLength, lastequality,
+                       pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1,
+                       lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2;
+               changes = false;
+               equalities = []; // Stack of indices where equalities are found.
+               equalitiesLength = 0; // Keeping our own length var is faster in JS.
+               /** @type {?string} */
+               lastequality = null;
+               // Always equal to diffs[equalities[equalitiesLength - 1]][1]
+               pointer = 0; // Index of current position.
+               // Number of characters that changed prior to the equality.
+               lengthInsertions1 = 0;
+               lengthDeletions1 = 0;
+               // Number of characters that changed after the equality.
+               lengthInsertions2 = 0;
+               lengthDeletions2 = 0;
+               while ( pointer < diffs.length ) {
+                       if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) { // Equality found.
+                               equalities[ equalitiesLength++ ] = pointer;
+                               lengthInsertions1 = lengthInsertions2;
+                               lengthDeletions1 = lengthDeletions2;
+                               lengthInsertions2 = 0;
+                               lengthDeletions2 = 0;
+                               lastequality = diffs[ pointer ][ 1 ];
+                       } else { // An insertion or deletion.
+                               if ( diffs[ pointer ][ 0 ] === DIFF_INSERT ) {
+                                       lengthInsertions2 += diffs[ pointer ][ 1 ].length;
+                               } else {
+                                       lengthDeletions2 += diffs[ pointer ][ 1 ].length;
+                               }
+                               // Eliminate an equality that is smaller or equal to the edits on both
+                               // sides of it.
+                               if ( lastequality && ( lastequality.length <=
+                                               Math.max( lengthInsertions1, lengthDeletions1 ) ) &&
+                                               ( lastequality.length <= Math.max( lengthInsertions2,
+                                                       lengthDeletions2 ) ) ) {
+
+                                       // Duplicate record.
+                                       diffs.splice(
+                                               equalities[ equalitiesLength - 1 ],
+                                               0,
+                                               [ DIFF_DELETE, lastequality ]
+                                       );
+
+                                       // Change second copy to insert.
+                                       diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;
+
+                                       // Throw away the equality we just deleted.
+                                       equalitiesLength--;
+
+                                       // Throw away the previous equality (it needs to be reevaluated).
+                                       equalitiesLength--;
+                                       pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;
+
+                                       // Reset the counters.
+                                       lengthInsertions1 = 0;
+                                       lengthDeletions1 = 0;
+                                       lengthInsertions2 = 0;
+                                       lengthDeletions2 = 0;
+                                       lastequality = null;
+                                       changes = true;
+                               }
+                       }
+                       pointer++;
+               }
 
-                                       args = new Array( l );
-                                       while ( l-- ) {
+               // Normalize the diff.
+               if ( changes ) {
+                       this.diffCleanupMerge( diffs );
+               }
 
-                                               // 97 is 'a'
-                                               args[ l ] = String.fromCharCode( 97 + l );
+               // Find any overlaps between deletions and insertions.
+               // e.g: <del>abcxxx</del><ins>xxxdef</ins>
+               //   -> <del>abc</del>xxx<ins>def</ins>
+               // e.g: <del>xxxabc</del><ins>defxxx</ins>
+               //   -> <ins>def</ins>xxx<del>abc</del>
+               // Only extract an overlap if it is as big as the edit ahead or behind it.
+               pointer = 1;
+               while ( pointer < diffs.length ) {
+                       if ( diffs[ pointer - 1 ][ 0 ] === DIFF_DELETE &&
+                                       diffs[ pointer ][ 0 ] === DIFF_INSERT ) {
+                               deletion = diffs[ pointer - 1 ][ 1 ];
+                               insertion = diffs[ pointer ][ 1 ];
+                               overlapLength1 = this.diffCommonOverlap( deletion, insertion );
+                               overlapLength2 = this.diffCommonOverlap( insertion, deletion );
+                               if ( overlapLength1 >= overlapLength2 ) {
+                                       if ( overlapLength1 >= deletion.length / 2 ||
+                                                       overlapLength1 >= insertion.length / 2 ) {
+                                               // Overlap found.  Insert an equality and trim the surrounding edits.
+                                               diffs.splice(
+                                                       pointer,
+                                                       0,
+                                                       [ DIFF_EQUAL, insertion.substring( 0, overlapLength1 ) ]
+                                               );
+                                               diffs[ pointer - 1 ][ 1 ] =
+                                                       deletion.substring( 0, deletion.length - overlapLength1 );
+                                               diffs[ pointer + 1 ][ 1 ] = insertion.substring( overlapLength1 );
+                                               pointer++;
                                        }
-                                       return " " + args.join( ", " ) + " ";
-                               },
-                               // object calls it internally, the key part of an item in a map
-                               key: quote,
-                               // function calls it internally, it's the content of the function
-                               functionCode: "[code]",
-                               // node calls it internally, it's an html attribute value
-                               attribute: quote,
-                               string: quote,
-                               date: quote,
-                               regexp: literal,
-                               number: literal,
-                               "boolean": literal
-                       },
-                       // if true, entities are escaped ( <, >, \t, space and \n )
-                       HTML: false,
-                       // indentation unit
-                       indentChar: "  ",
-                       // if true, items in a collection, are separated by a \n, else just a space.
-                       multiline: true
-               };
-
-       return dump;
-}());
+                               } else {
+                                       if ( overlapLength2 >= deletion.length / 2 ||
+                                                       overlapLength2 >= insertion.length / 2 ) {
+
+                                               // Reverse overlap found.
+                                               // Insert an equality and swap and trim the surrounding edits.
+                                               diffs.splice(
+                                                       pointer,
+                                                       0,
+                                                       [ DIFF_EQUAL, deletion.substring( 0, overlapLength2 ) ]
+                                               );
+
+                                               diffs[ pointer - 1 ][ 0 ] = DIFF_INSERT;
+                                               diffs[ pointer - 1 ][ 1 ] =
+                                                       insertion.substring( 0, insertion.length - overlapLength2 );
+                                               diffs[ pointer + 1 ][ 0 ] = DIFF_DELETE;
+                                               diffs[ pointer + 1 ][ 1 ] =
+                                                       deletion.substring( overlapLength2 );
+                                               pointer++;
+                                       }
+                               }
+                               pointer++;
+                       }
+                       pointer++;
+               }
+       };
 
-// back compat
-QUnit.jsDump = QUnit.dump;
+       /**
+        * Determine if the suffix of one string is the prefix of another.
+        * @param {string} text1 First string.
+        * @param {string} text2 Second string.
+        * @return {number} The number of characters common to the end of the first
+        *     string and the start of the second string.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffCommonOverlap = function( text1, text2 ) {
+               var text1Length, text2Length, textLength,
+                       best, length, pattern, found;
+               // Cache the text lengths to prevent multiple calls.
+               text1Length = text1.length;
+               text2Length = text2.length;
+               // Eliminate the null case.
+               if ( text1Length === 0 || text2Length === 0 ) {
+                       return 0;
+               }
+               // Truncate the longer string.
+               if ( text1Length > text2Length ) {
+                       text1 = text1.substring( text1Length - text2Length );
+               } else if ( text1Length < text2Length ) {
+                       text2 = text2.substring( 0, text1Length );
+               }
+               textLength = Math.min( text1Length, text2Length );
+               // Quick check for the worst case.
+               if ( text1 === text2 ) {
+                       return textLength;
+               }
 
-// For browser, export only select globals
-if ( typeof window !== "undefined" ) {
+               // Start by looking for a single character match
+               // and increase length until no match is found.
+               // Performance analysis: https://neil.fraser.name/news/2010/11/04/
+               best = 0;
+               length = 1;
+               while ( true ) {
+                       pattern = text1.substring( textLength - length );
+                       found = text2.indexOf( pattern );
+                       if ( found === -1 ) {
+                               return best;
+                       }
+                       length += found;
+                       if ( found === 0 || text1.substring( textLength - length ) ===
+                                       text2.substring( 0, length ) ) {
+                               best = length;
+                               length++;
+                       }
+               }
+       };
 
-       // Deprecated
-       // Extend assert methods to QUnit and Global scope through Backwards compatibility
-       (function() {
-               var i,
-                       assertions = Assert.prototype;
+       /**
+        * Split two texts into an array of strings.  Reduce the texts to a string of
+        * hashes where each Unicode character represents one line.
+        * @param {string} text1 First string.
+        * @param {string} text2 Second string.
+        * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}
+        *     An object containing the encoded text1, the encoded text2 and
+        *     the array of unique strings.
+        *     The zeroth element of the array of unique strings is intentionally blank.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffLinesToChars = function( text1, text2 ) {
+               var lineArray, lineHash, chars1, chars2;
+               lineArray = []; // e.g. lineArray[4] === 'Hello\n'
+               lineHash = {}; // e.g. lineHash['Hello\n'] === 4
+
+               // '\x00' is a valid character, but various debuggers don't like it.
+               // So we'll insert a junk entry to avoid generating a null character.
+               lineArray[ 0 ] = "";
+
+               /**
+                * Split a text into an array of strings.  Reduce the texts to a string of
+                * hashes where each Unicode character represents one line.
+                * Modifies linearray and linehash through being a closure.
+                * @param {string} text String to encode.
+                * @return {string} Encoded string.
+                * @private
+                */
+               function diffLinesToCharsMunge( text ) {
+                       var chars, lineStart, lineEnd, lineArrayLength, line;
+                       chars = "";
+                       // Walk the text, pulling out a substring for each line.
+                       // text.split('\n') would would temporarily double our memory footprint.
+                       // Modifying text would create many large strings to garbage collect.
+                       lineStart = 0;
+                       lineEnd = -1;
+                       // Keeping our own length variable is faster than looking it up.
+                       lineArrayLength = lineArray.length;
+                       while ( lineEnd < text.length - 1 ) {
+                               lineEnd = text.indexOf( "\n", lineStart );
+                               if ( lineEnd === -1 ) {
+                                       lineEnd = text.length - 1;
+                               }
+                               line = text.substring( lineStart, lineEnd + 1 );
+                               lineStart = lineEnd + 1;
 
-               function applyCurrent( current ) {
-                       return function() {
-                               var assert = new Assert( QUnit.config.current );
-                               current.apply( assert, arguments );
-                       };
+                               if ( lineHash.hasOwnProperty ? lineHash.hasOwnProperty( line ) :
+                                                       ( lineHash[ line ] !== undefined ) ) {
+                                       chars += String.fromCharCode( lineHash[ line ] );
+                               } else {
+                                       chars += String.fromCharCode( lineArrayLength );
+                                       lineHash[ line ] = lineArrayLength;
+                                       lineArray[ lineArrayLength++ ] = line;
+                               }
+                       }
+                       return chars;
                }
 
-               for ( i in assertions ) {
-                       QUnit[ i ] = applyCurrent( assertions[ i ] );
+               chars1 = diffLinesToCharsMunge( text1 );
+               chars2 = diffLinesToCharsMunge( text2 );
+               return {
+                       chars1: chars1,
+                       chars2: chars2,
+                       lineArray: lineArray
+               };
+       };
+
+       /**
+        * Rehydrate the text in a diff from a string of line hashes to real lines of
+        * text.
+        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+        * @param {!Array.<string>} lineArray Array of unique strings.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffCharsToLines = function( diffs, lineArray ) {
+               var x, chars, text, y;
+               for ( x = 0; x < diffs.length; x++ ) {
+                       chars = diffs[ x ][ 1 ];
+                       text = [];
+                       for ( y = 0; y < chars.length; y++ ) {
+                               text[ y ] = lineArray[ chars.charCodeAt( y ) ];
+                       }
+                       diffs[ x ][ 1 ] = text.join( "" );
                }
-       })();
+       };
 
-       (function() {
-               var i, l,
-                       keys = [
-                               "test",
-                               "module",
-                               "expect",
-                               "asyncTest",
-                               "start",
-                               "stop",
-                               "ok",
-                               "notOk",
-                               "equal",
-                               "notEqual",
-                               "propEqual",
-                               "notPropEqual",
-                               "deepEqual",
-                               "notDeepEqual",
-                               "strictEqual",
-                               "notStrictEqual",
-                               "throws"
-                       ];
+       /**
+        * Reorder and merge like edit sections.  Merge equalities.
+        * Any edit section can move as long as it doesn't cross an equality.
+        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+        */
+       DiffMatchPatch.prototype.diffCleanupMerge = function( diffs ) {
+               var pointer, countDelete, countInsert, textInsert, textDelete,
+                       commonlength, changes, diffPointer, position;
+               diffs.push( [ DIFF_EQUAL, "" ] ); // Add a dummy entry at the end.
+               pointer = 0;
+               countDelete = 0;
+               countInsert = 0;
+               textDelete = "";
+               textInsert = "";
+               commonlength;
+               while ( pointer < diffs.length ) {
+                       switch ( diffs[ pointer ][ 0 ] ) {
+                       case DIFF_INSERT:
+                               countInsert++;
+                               textInsert += diffs[ pointer ][ 1 ];
+                               pointer++;
+                               break;
+                       case DIFF_DELETE:
+                               countDelete++;
+                               textDelete += diffs[ pointer ][ 1 ];
+                               pointer++;
+                               break;
+                       case DIFF_EQUAL:
+                               // Upon reaching an equality, check for prior redundancies.
+                               if ( countDelete + countInsert > 1 ) {
+                                       if ( countDelete !== 0 && countInsert !== 0 ) {
+                                               // Factor out any common prefixes.
+                                               commonlength = this.diffCommonPrefix( textInsert, textDelete );
+                                               if ( commonlength !== 0 ) {
+                                                       if ( ( pointer - countDelete - countInsert ) > 0 &&
+                                                                       diffs[ pointer - countDelete - countInsert - 1 ][ 0 ] ===
+                                                                       DIFF_EQUAL ) {
+                                                               diffs[ pointer - countDelete - countInsert - 1 ][ 1 ] +=
+                                                                       textInsert.substring( 0, commonlength );
+                                                       } else {
+                                                               diffs.splice( 0, 0, [ DIFF_EQUAL,
+                                                                       textInsert.substring( 0, commonlength )
+                                                               ] );
+                                                               pointer++;
+                                                       }
+                                                       textInsert = textInsert.substring( commonlength );
+                                                       textDelete = textDelete.substring( commonlength );
+                                               }
+                                               // Factor out any common suffixies.
+                                               commonlength = this.diffCommonSuffix( textInsert, textDelete );
+                                               if ( commonlength !== 0 ) {
+                                                       diffs[ pointer ][ 1 ] = textInsert.substring( textInsert.length -
+                                                                       commonlength ) + diffs[ pointer ][ 1 ];
+                                                       textInsert = textInsert.substring( 0, textInsert.length -
+                                                               commonlength );
+                                                       textDelete = textDelete.substring( 0, textDelete.length -
+                                                               commonlength );
+                                               }
+                                       }
+                                       // Delete the offending records and add the merged ones.
+                                       if ( countDelete === 0 ) {
+                                               diffs.splice( pointer - countInsert,
+                                                       countDelete + countInsert, [ DIFF_INSERT, textInsert ] );
+                                       } else if ( countInsert === 0 ) {
+                                               diffs.splice( pointer - countDelete,
+                                                       countDelete + countInsert, [ DIFF_DELETE, textDelete ] );
+                                       } else {
+                                               diffs.splice(
+                                                       pointer - countDelete - countInsert,
+                                                       countDelete + countInsert,
+                                                       [ DIFF_DELETE, textDelete ], [ DIFF_INSERT, textInsert ]
+                                               );
+                                       }
+                                       pointer = pointer - countDelete - countInsert +
+                                               ( countDelete ? 1 : 0 ) + ( countInsert ? 1 : 0 ) + 1;
+                               } else if ( pointer !== 0 && diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL ) {
 
-               for ( i = 0, l = keys.length; i < l; i++ ) {
-                       window[ keys[ i ] ] = QUnit[ keys[ i ] ];
+                                       // Merge this equality with the previous one.
+                                       diffs[ pointer - 1 ][ 1 ] += diffs[ pointer ][ 1 ];
+                                       diffs.splice( pointer, 1 );
+                               } else {
+                                       pointer++;
+                               }
+                               countInsert = 0;
+                               countDelete = 0;
+                               textDelete = "";
+                               textInsert = "";
+                               break;
+                       }
+               }
+               if ( diffs[ diffs.length - 1 ][ 1 ] === "" ) {
+                       diffs.pop(); // Remove the dummy entry at the end.
                }
-       })();
 
-       window.QUnit = QUnit;
-}
+               // Second pass: look for single edits surrounded on both sides by equalities
+               // which can be shifted sideways to eliminate an equality.
+               // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC
+               changes = false;
+               pointer = 1;
 
-// For nodejs
-if ( typeof module !== "undefined" && module && module.exports ) {
-       module.exports = QUnit;
+               // Intentionally ignore the first and last element (don't need checking).
+               while ( pointer < diffs.length - 1 ) {
+                       if ( diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL &&
+                                       diffs[ pointer + 1 ][ 0 ] === DIFF_EQUAL ) {
 
-       // For consistency with CommonJS environments' exports
-       module.exports.QUnit = QUnit;
-}
+                               diffPointer = diffs[ pointer ][ 1 ];
+                               position = diffPointer.substring(
+                                       diffPointer.length - diffs[ pointer - 1 ][ 1 ].length
+                               );
 
-// For CommonJS with exports, but without module.exports, like Rhino
-if ( typeof exports !== "undefined" && exports ) {
-       exports.QUnit = QUnit;
-}
+                               // This is a single edit surrounded by equalities.
+                               if ( position === diffs[ pointer - 1 ][ 1 ] ) {
+
+                                       // Shift the edit over the previous equality.
+                                       diffs[ pointer ][ 1 ] = diffs[ pointer - 1 ][ 1 ] +
+                                               diffs[ pointer ][ 1 ].substring( 0, diffs[ pointer ][ 1 ].length -
+                                                       diffs[ pointer - 1 ][ 1 ].length );
+                                       diffs[ pointer + 1 ][ 1 ] =
+                                               diffs[ pointer - 1 ][ 1 ] + diffs[ pointer + 1 ][ 1 ];
+                                       diffs.splice( pointer - 1, 1 );
+                                       changes = true;
+                               } else if ( diffPointer.substring( 0, diffs[ pointer + 1 ][ 1 ].length ) ===
+                                               diffs[ pointer + 1 ][ 1 ] ) {
+
+                                       // Shift the edit over the next equality.
+                                       diffs[ pointer - 1 ][ 1 ] += diffs[ pointer + 1 ][ 1 ];
+                                       diffs[ pointer ][ 1 ] =
+                                               diffs[ pointer ][ 1 ].substring( diffs[ pointer + 1 ][ 1 ].length ) +
+                                               diffs[ pointer + 1 ][ 1 ];
+                                       diffs.splice( pointer + 1, 1 );
+                                       changes = true;
+                               }
+                       }
+                       pointer++;
+               }
+               // If shifts were made, the diff needs reordering and another shift sweep.
+               if ( changes ) {
+                       this.diffCleanupMerge( diffs );
+               }
+       };
 
-if ( typeof define === "function" && define.amd ) {
-       define( function() {
-               return QUnit;
-       } );
-       QUnit.config.autostart = false;
-}
+       return function( o, n ) {
+               var diff, output, text;
+               diff = new DiffMatchPatch();
+               output = diff.DiffMain( o, n );
+               diff.diffCleanupEfficiency( output );
+               text = diff.diffPrettyHtml( output );
+
+               return text;
+       };
+}() );
 
 // Get a reference to the global object, like window in browsers
 }( (function() {
        return this;
 })() ));
 
-/*istanbul ignore next */
-// jscs:disable maximumLineLength
-/*
- * This file is a modified version of google-diff-match-patch's JavaScript implementation
- * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),
- * modifications are licensed as more fully set forth in LICENSE.txt.
- *
- * The original source of google-diff-match-patch is attributable and licensed as follows:
- *
- * Copyright 2006 Google Inc.
- * http://code.google.com/p/google-diff-match-patch/
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * More Info:
- *  https://code.google.com/p/google-diff-match-patch/
- *
- * Usage: QUnit.diff(expected, actual)
- *
- * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) === "the  quick <del>brown </del> fox jump<ins>s</ins><del>ed</del over"
- */
-QUnit.diff = (function() {
-
-    function DiffMatchPatch() {
-
-        // Defaults.
-        // Redefine these in your program to override the defaults.
-
-        // Number of seconds to map a diff before giving up (0 for infinity).
-        this.DiffTimeout = 1.0;
-        // Cost of an empty edit operation in terms of edit characters.
-        this.DiffEditCost = 4;
-    }
-
-    //  DIFF FUNCTIONS
-
-    /**
-     * The data structure representing a diff is an array of tuples:
-     * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]
-     * which means: delete 'Hello', add 'Goodbye' and keep ' world.'
-     */
-    var DIFF_DELETE = -1,
-               DIFF_INSERT = 1,
-               DIFF_EQUAL = 0;
-
-    /**
-     * Find the differences between two texts.  Simplifies the problem by stripping
-     * any common prefix or suffix off the texts before diffing.
-     * @param {string} text1 Old string to be diffed.
-     * @param {string} text2 New string to be diffed.
-     * @param {boolean=} optChecklines Optional speedup flag. If present and false,
-     *     then don't run a line-level diff first to identify the changed areas.
-     *     Defaults to true, which does a faster, slightly less optimal diff.
-     * @param {number} optDeadline Optional time when the diff should be complete
-     *     by.  Used internally for recursive calls.  Users should set DiffTimeout
-     *     instead.
-     * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-     */
-    DiffMatchPatch.prototype.DiffMain = function( text1, text2, optChecklines, optDeadline ) {
-        var deadline, checklines, commonlength,
-                       commonprefix, commonsuffix, diffs;
-        // Set a deadline by which time the diff must be complete.
-        if ( typeof optDeadline === "undefined" ) {
-            if ( this.DiffTimeout <= 0 ) {
-                optDeadline = Number.MAX_VALUE;
-            } else {
-                optDeadline = ( new Date() ).getTime() + this.DiffTimeout * 1000;
-            }
-        }
-        deadline = optDeadline;
-
-        // Check for null inputs.
-        if ( text1 === null || text2 === null ) {
-            throw new Error( "Null input. (DiffMain)" );
-        }
-
-        // Check for equality (speedup).
-        if ( text1 === text2 ) {
-            if ( text1 ) {
-                return [
-                    [ DIFF_EQUAL, text1 ]
-                ];
-            }
-            return [];
-        }
-
-        if ( typeof optChecklines === "undefined" ) {
-            optChecklines = true;
-        }
-
-        checklines = optChecklines;
-
-        // Trim off common prefix (speedup).
-        commonlength = this.diffCommonPrefix( text1, text2 );
-        commonprefix = text1.substring( 0, commonlength );
-        text1 = text1.substring( commonlength );
-        text2 = text2.substring( commonlength );
-
-        // Trim off common suffix (speedup).
-        /////////
-        commonlength = this.diffCommonSuffix( text1, text2 );
-        commonsuffix = text1.substring( text1.length - commonlength );
-        text1 = text1.substring( 0, text1.length - commonlength );
-        text2 = text2.substring( 0, text2.length - commonlength );
-
-        // Compute the diff on the middle block.
-        diffs = this.diffCompute( text1, text2, checklines, deadline );
-
-        // Restore the prefix and suffix.
-        if ( commonprefix ) {
-            diffs.unshift( [ DIFF_EQUAL, commonprefix ] );
-        }
-        if ( commonsuffix ) {
-            diffs.push( [ DIFF_EQUAL, commonsuffix ] );
-        }
-        this.diffCleanupMerge( diffs );
-        return diffs;
-    };
-
-    /**
-     * Reduce the number of edits by eliminating operationally trivial equalities.
-     * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-     */
-    DiffMatchPatch.prototype.diffCleanupEfficiency = function( diffs ) {
-        var changes, equalities, equalitiesLength, lastequality,
-                       pointer, preIns, preDel, postIns, postDel;
-        changes = false;
-        equalities = []; // Stack of indices where equalities are found.
-        equalitiesLength = 0; // Keeping our own length var is faster in JS.
-        /** @type {?string} */
-        lastequality = null;
-        // Always equal to diffs[equalities[equalitiesLength - 1]][1]
-        pointer = 0; // Index of current position.
-        // Is there an insertion operation before the last equality.
-        preIns = false;
-        // Is there a deletion operation before the last equality.
-        preDel = false;
-        // Is there an insertion operation after the last equality.
-        postIns = false;
-        // Is there a deletion operation after the last equality.
-        postDel = false;
-        while ( pointer < diffs.length ) {
-            if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) { // Equality found.
-                if ( diffs[ pointer ][ 1 ].length < this.DiffEditCost && ( postIns || postDel ) ) {
-                    // Candidate found.
-                    equalities[ equalitiesLength++ ] = pointer;
-                    preIns = postIns;
-                    preDel = postDel;
-                    lastequality = diffs[ pointer ][ 1 ];
-                } else {
-                    // Not a candidate, and can never become one.
-                    equalitiesLength = 0;
-                    lastequality = null;
-                }
-                postIns = postDel = false;
-            } else { // An insertion or deletion.
-                if ( diffs[ pointer ][ 0 ] === DIFF_DELETE ) {
-                    postDel = true;
-                } else {
-                    postIns = true;
-                }
-                /*
-                 * Five types to be split:
-                 * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>
-                 * <ins>A</ins>X<ins>C</ins><del>D</del>
-                 * <ins>A</ins><del>B</del>X<ins>C</ins>
-                 * <ins>A</del>X<ins>C</ins><del>D</del>
-                 * <ins>A</ins><del>B</del>X<del>C</del>
-                 */
-                if ( lastequality && ( ( preIns && preDel && postIns && postDel ) ||
-                        ( ( lastequality.length < this.DiffEditCost / 2 ) &&
-                            ( preIns + preDel + postIns + postDel ) === 3 ) ) ) {
-                    // Duplicate record.
-                    diffs.splice( equalities[equalitiesLength - 1], 0, [ DIFF_DELETE, lastequality ] );
-                    // Change second copy to insert.
-                    diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;
-                    equalitiesLength--; // Throw away the equality we just deleted;
-                    lastequality = null;
-                    if (preIns && preDel) {
-                        // No changes made which could affect previous entry, keep going.
-                        postIns = postDel = true;
-                        equalitiesLength = 0;
-                    } else {
-                        equalitiesLength--; // Throw away the previous equality.
-                        pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;
-                        postIns = postDel = false;
-                    }
-                    changes = true;
-                }
-            }
-            pointer++;
-        }
-
-        if ( changes ) {
-            this.diffCleanupMerge( diffs );
-        }
-    };
-
-    /**
-     * Convert a diff array into a pretty HTML report.
-     * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-     * @param {integer} string to be beautified.
-     * @return {string} HTML representation.
-     */
-    DiffMatchPatch.prototype.diffPrettyHtml = function( diffs ) {
-        var op, data, x, html = [];
-        for ( x = 0; x < diffs.length; x++ ) {
-            op = diffs[x][0]; // Operation (insert, delete, equal)
-            data = diffs[x][1]; // Text of change.
-            switch ( op ) {
-                case DIFF_INSERT:
-                    html[x] = "<ins>" + data + "</ins>";
-                    break;
-                case DIFF_DELETE:
-                    html[x] = "<del>" + data + "</del>";
-                    break;
-                case DIFF_EQUAL:
-                    html[x] = "<span>" + data + "</span>";
-                    break;
-            }
-        }
-        return html.join("");
-    };
-
-    /**
-     * Determine the common prefix of two strings.
-     * @param {string} text1 First string.
-     * @param {string} text2 Second string.
-     * @return {number} The number of characters common to the start of each
-     *     string.
-     */
-    DiffMatchPatch.prototype.diffCommonPrefix = function( text1, text2 ) {
-        var pointermid, pointermax, pointermin, pointerstart;
-        // Quick check for common null cases.
-        if ( !text1 || !text2 || text1.charAt(0) !== text2.charAt(0) ) {
-            return 0;
-        }
-        // Binary search.
-        // Performance analysis: http://neil.fraser.name/news/2007/10/09/
-        pointermin = 0;
-        pointermax = Math.min( text1.length, text2.length );
-        pointermid = pointermax;
-        pointerstart = 0;
-        while ( pointermin < pointermid ) {
-            if ( text1.substring( pointerstart, pointermid ) === text2.substring( pointerstart, pointermid ) ) {
-                pointermin = pointermid;
-                pointerstart = pointermin;
-            } else {
-                pointermax = pointermid;
-            }
-            pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
-        }
-        return pointermid;
-    };
-
-    /**
-     * Determine the common suffix of two strings.
-     * @param {string} text1 First string.
-     * @param {string} text2 Second string.
-     * @return {number} The number of characters common to the end of each string.
-     */
-    DiffMatchPatch.prototype.diffCommonSuffix = function( text1, text2 ) {
-        var pointermid, pointermax, pointermin, pointerend;
-        // Quick check for common null cases.
-        if (!text1 || !text2 || text1.charAt(text1.length - 1) !== text2.charAt(text2.length - 1)) {
-            return 0;
-        }
-        // Binary search.
-        // Performance analysis: http://neil.fraser.name/news/2007/10/09/
-        pointermin = 0;
-        pointermax = Math.min(text1.length, text2.length);
-        pointermid = pointermax;
-        pointerend = 0;
-        while ( pointermin < pointermid ) {
-            if (text1.substring( text1.length - pointermid, text1.length - pointerend ) ===
-                text2.substring( text2.length - pointermid, text2.length - pointerend ) ) {
-                pointermin = pointermid;
-                pointerend = pointermin;
-            } else {
-                pointermax = pointermid;
-            }
-            pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
-        }
-        return pointermid;
-    };
-
-    /**
-     * Find the differences between two texts.  Assumes that the texts do not
-     * have any common prefix or suffix.
-     * @param {string} text1 Old string to be diffed.
-     * @param {string} text2 New string to be diffed.
-     * @param {boolean} checklines Speedup flag.  If false, then don't run a
-     *     line-level diff first to identify the changed areas.
-     *     If true, then run a faster, slightly less optimal diff.
-     * @param {number} deadline Time when the diff should be complete by.
-     * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-     * @private
-     */
-    DiffMatchPatch.prototype.diffCompute = function( text1, text2, checklines, deadline ) {
-        var diffs, longtext, shorttext, i, hm,
-                       text1A, text2A, text1B, text2B,
-                       midCommon, diffsA, diffsB;
-
-        if ( !text1 ) {
-            // Just add some text (speedup).
-            return [
-                [ DIFF_INSERT, text2 ]
-            ];
-        }
-
-        if (!text2) {
-            // Just delete some text (speedup).
-            return [
-                [ DIFF_DELETE, text1 ]
-            ];
-        }
-
-        longtext = text1.length > text2.length ? text1 : text2;
-        shorttext = text1.length > text2.length ? text2 : text1;
-        i = longtext.indexOf( shorttext );
-        if ( i !== -1 ) {
-            // Shorter text is inside the longer text (speedup).
-            diffs = [
-                [ DIFF_INSERT, longtext.substring( 0, i ) ],
-                [ DIFF_EQUAL, shorttext ],
-                [ DIFF_INSERT, longtext.substring( i + shorttext.length ) ]
-            ];
-            // Swap insertions for deletions if diff is reversed.
-            if ( text1.length > text2.length ) {
-                diffs[0][0] = diffs[2][0] = DIFF_DELETE;
-            }
-            return diffs;
-        }
-
-        if ( shorttext.length === 1 ) {
-            // Single character string.
-            // After the previous speedup, the character can't be an equality.
-            return [
-                [ DIFF_DELETE, text1 ],
-                [ DIFF_INSERT, text2 ]
-            ];
-        }
-
-        // Check to see if the problem can be split in two.
-        hm = this.diffHalfMatch(text1, text2);
-        if (hm) {
-            // A half-match was found, sort out the return data.
-            text1A = hm[0];
-            text1B = hm[1];
-            text2A = hm[2];
-            text2B = hm[3];
-            midCommon = hm[4];
-            // Send both pairs off for separate processing.
-            diffsA = this.DiffMain(text1A, text2A, checklines, deadline);
-            diffsB = this.DiffMain(text1B, text2B, checklines, deadline);
-            // Merge the results.
-            return diffsA.concat([
-                [ DIFF_EQUAL, midCommon ]
-            ], diffsB);
-        }
-
-        if (checklines && text1.length > 100 && text2.length > 100) {
-            return this.diffLineMode(text1, text2, deadline);
-        }
-
-        return this.diffBisect(text1, text2, deadline);
-    };
-
-    /**
-     * Do the two texts share a substring which is at least half the length of the
-     * longer text?
-     * This speedup can produce non-minimal diffs.
-     * @param {string} text1 First string.
-     * @param {string} text2 Second string.
-     * @return {Array.<string>} Five element Array, containing the prefix of
-     *     text1, the suffix of text1, the prefix of text2, the suffix of
-     *     text2 and the common middle.  Or null if there was no match.
-     * @private
-     */
-    DiffMatchPatch.prototype.diffHalfMatch = function(text1, text2) {
-        var longtext, shorttext, dmp,
-                       text1A, text2B, text2A, text1B, midCommon,
-                       hm1, hm2, hm;
-        if (this.DiffTimeout <= 0) {
-            // Don't risk returning a non-optimal diff if we have unlimited time.
-            return null;
-        }
-        longtext = text1.length > text2.length ? text1 : text2;
-        shorttext = text1.length > text2.length ? text2 : text1;
-        if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {
-            return null; // Pointless.
-        }
-        dmp = this; // 'this' becomes 'window' in a closure.
-
-        /**
-         * Does a substring of shorttext exist within longtext such that the substring
-         * is at least half the length of longtext?
-         * Closure, but does not reference any external variables.
-         * @param {string} longtext Longer string.
-         * @param {string} shorttext Shorter string.
-         * @param {number} i Start index of quarter length substring within longtext.
-         * @return {Array.<string>} Five element Array, containing the prefix of
-         *     longtext, the suffix of longtext, the prefix of shorttext, the suffix
-         *     of shorttext and the common middle.  Or null if there was no match.
-         * @private
-         */
-        function diffHalfMatchI(longtext, shorttext, i) {
-            var seed, j, bestCommon, prefixLength, suffixLength,
-                               bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;
-            // Start with a 1/4 length substring at position i as a seed.
-            seed = longtext.substring(i, i + Math.floor(longtext.length / 4));
-            j = -1;
-            bestCommon = "";
-            while ((j = shorttext.indexOf(seed, j + 1)) !== -1) {
-                prefixLength = dmp.diffCommonPrefix(longtext.substring(i),
-                    shorttext.substring(j));
-                suffixLength = dmp.diffCommonSuffix(longtext.substring(0, i),
-                    shorttext.substring(0, j));
-                if (bestCommon.length < suffixLength + prefixLength) {
-                    bestCommon = shorttext.substring(j - suffixLength, j) +
-                        shorttext.substring(j, j + prefixLength);
-                    bestLongtextA = longtext.substring(0, i - suffixLength);
-                    bestLongtextB = longtext.substring(i + prefixLength);
-                    bestShorttextA = shorttext.substring(0, j - suffixLength);
-                    bestShorttextB = shorttext.substring(j + prefixLength);
-                }
-            }
-            if (bestCommon.length * 2 >= longtext.length) {
-                return [ bestLongtextA, bestLongtextB,
-                    bestShorttextA, bestShorttextB, bestCommon
-                ];
-            } else {
-                return null;
-            }
-        }
-
-        // First check if the second quarter is the seed for a half-match.
-        hm1 = diffHalfMatchI(longtext, shorttext,
-            Math.ceil(longtext.length / 4));
-        // Check again based on the third quarter.
-        hm2 = diffHalfMatchI(longtext, shorttext,
-            Math.ceil(longtext.length / 2));
-        if (!hm1 && !hm2) {
-            return null;
-        } else if (!hm2) {
-            hm = hm1;
-        } else if (!hm1) {
-            hm = hm2;
-        } else {
-            // Both matched.  Select the longest.
-            hm = hm1[4].length > hm2[4].length ? hm1 : hm2;
-        }
-
-        // A half-match was found, sort out the return data.
-        text1A, text1B, text2A, text2B;
-        if (text1.length > text2.length) {
-            text1A = hm[0];
-            text1B = hm[1];
-            text2A = hm[2];
-            text2B = hm[3];
-        } else {
-            text2A = hm[0];
-            text2B = hm[1];
-            text1A = hm[2];
-            text1B = hm[3];
-        }
-        midCommon = hm[4];
-        return [ text1A, text1B, text2A, text2B, midCommon ];
-    };
-
-    /**
-     * Do a quick line-level diff on both strings, then rediff the parts for
-     * greater accuracy.
-     * This speedup can produce non-minimal diffs.
-     * @param {string} text1 Old string to be diffed.
-     * @param {string} text2 New string to be diffed.
-     * @param {number} deadline Time when the diff should be complete by.
-     * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-     * @private
-     */
-    DiffMatchPatch.prototype.diffLineMode = function(text1, text2, deadline) {
-        var a, diffs, linearray, pointer, countInsert,
-                       countDelete, textInsert, textDelete, j;
-        // Scan the text on a line-by-line basis first.
-        a = this.diffLinesToChars(text1, text2);
-        text1 = a.chars1;
-        text2 = a.chars2;
-        linearray = a.lineArray;
-
-        diffs = this.DiffMain(text1, text2, false, deadline);
-
-        // Convert the diff back to original text.
-        this.diffCharsToLines(diffs, linearray);
-        // Eliminate freak matches (e.g. blank lines)
-        this.diffCleanupSemantic(diffs);
-
-        // Rediff any replacement blocks, this time character-by-character.
-        // Add a dummy entry at the end.
-        diffs.push( [ DIFF_EQUAL, "" ] );
-        pointer = 0;
-        countDelete = 0;
-        countInsert = 0;
-        textDelete = "";
-        textInsert = "";
-        while (pointer < diffs.length) {
-            switch ( diffs[pointer][0] ) {
-                case DIFF_INSERT:
-                    countInsert++;
-                    textInsert += diffs[pointer][1];
-                    break;
-                case DIFF_DELETE:
-                    countDelete++;
-                    textDelete += diffs[pointer][1];
-                    break;
-                case DIFF_EQUAL:
-                    // Upon reaching an equality, check for prior redundancies.
-                    if (countDelete >= 1 && countInsert >= 1) {
-                        // Delete the offending records and add the merged ones.
-                        diffs.splice(pointer - countDelete - countInsert,
-                            countDelete + countInsert);
-                        pointer = pointer - countDelete - countInsert;
-                        a = this.DiffMain(textDelete, textInsert, false, deadline);
-                        for (j = a.length - 1; j >= 0; j--) {
-                            diffs.splice( pointer, 0, a[j] );
-                        }
-                        pointer = pointer + a.length;
-                    }
-                    countInsert = 0;
-                    countDelete = 0;
-                    textDelete = "";
-                    textInsert = "";
-                    break;
-            }
-            pointer++;
-        }
-        diffs.pop(); // Remove the dummy entry at the end.
-
-        return diffs;
-    };
-
-    /**
-     * Find the 'middle snake' of a diff, split the problem in two
-     * and return the recursively constructed diff.
-     * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.
-     * @param {string} text1 Old string to be diffed.
-     * @param {string} text2 New string to be diffed.
-     * @param {number} deadline Time at which to bail if not yet complete.
-     * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-     * @private
-     */
-    DiffMatchPatch.prototype.diffBisect = function(text1, text2, deadline) {
-        var text1Length, text2Length, maxD, vOffset, vLength,
-                       v1, v2, x, delta, front, k1start, k1end, k2start,
-                       k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;
-        // Cache the text lengths to prevent multiple calls.
-        text1Length = text1.length;
-        text2Length = text2.length;
-        maxD = Math.ceil((text1Length + text2Length) / 2);
-        vOffset = maxD;
-        vLength = 2 * maxD;
-        v1 = new Array(vLength);
-        v2 = new Array(vLength);
-        // Setting all elements to -1 is faster in Chrome & Firefox than mixing
-        // integers and undefined.
-        for (x = 0; x < vLength; x++) {
-            v1[x] = -1;
-            v2[x] = -1;
-        }
-        v1[vOffset + 1] = 0;
-        v2[vOffset + 1] = 0;
-        delta = text1Length - text2Length;
-        // If the total number of characters is odd, then the front path will collide
-        // with the reverse path.
-        front = (delta % 2 !== 0);
-        // Offsets for start and end of k loop.
-        // Prevents mapping of space beyond the grid.
-        k1start = 0;
-        k1end = 0;
-        k2start = 0;
-        k2end = 0;
-        for (d = 0; d < maxD; d++) {
-            // Bail out if deadline is reached.
-            if ((new Date()).getTime() > deadline) {
-                break;
-            }
-
-            // Walk the front path one step.
-            for (k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {
-                k1Offset = vOffset + k1;
-                if ( k1 === -d || ( k1 !== d && v1[ k1Offset - 1 ] < v1[ k1Offset + 1 ] ) ) {
-                    x1 = v1[k1Offset + 1];
-                } else {
-                    x1 = v1[k1Offset - 1] + 1;
-                }
-                y1 = x1 - k1;
-                while (x1 < text1Length && y1 < text2Length &&
-                    text1.charAt(x1) === text2.charAt(y1)) {
-                    x1++;
-                    y1++;
-                }
-                v1[k1Offset] = x1;
-                if (x1 > text1Length) {
-                    // Ran off the right of the graph.
-                    k1end += 2;
-                } else if (y1 > text2Length) {
-                    // Ran off the bottom of the graph.
-                    k1start += 2;
-                } else if (front) {
-                    k2Offset = vOffset + delta - k1;
-                    if (k2Offset >= 0 && k2Offset < vLength && v2[k2Offset] !== -1) {
-                        // Mirror x2 onto top-left coordinate system.
-                        x2 = text1Length - v2[k2Offset];
-                        if (x1 >= x2) {
-                            // Overlap detected.
-                            return this.diffBisectSplit(text1, text2, x1, y1, deadline);
-                        }
-                    }
-                }
-            }
-
-            // Walk the reverse path one step.
-            for (k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {
-                k2Offset = vOffset + k2;
-                if ( k2 === -d || (k2 !== d && v2[ k2Offset - 1 ] < v2[ k2Offset + 1 ] ) ) {
-                    x2 = v2[k2Offset + 1];
-                } else {
-                    x2 = v2[k2Offset - 1] + 1;
-                }
-                y2 = x2 - k2;
-                while (x2 < text1Length && y2 < text2Length &&
-                    text1.charAt(text1Length - x2 - 1) ===
-                    text2.charAt(text2Length - y2 - 1)) {
-                    x2++;
-                    y2++;
-                }
-                v2[k2Offset] = x2;
-                if (x2 > text1Length) {
-                    // Ran off the left of the graph.
-                    k2end += 2;
-                } else if (y2 > text2Length) {
-                    // Ran off the top of the graph.
-                    k2start += 2;
-                } else if (!front) {
-                    k1Offset = vOffset + delta - k2;
-                    if (k1Offset >= 0 && k1Offset < vLength && v1[k1Offset] !== -1) {
-                        x1 = v1[k1Offset];
-                        y1 = vOffset + x1 - k1Offset;
-                        // Mirror x2 onto top-left coordinate system.
-                        x2 = text1Length - x2;
-                        if (x1 >= x2) {
-                            // Overlap detected.
-                            return this.diffBisectSplit(text1, text2, x1, y1, deadline);
-                        }
-                    }
-                }
-            }
-        }
-        // Diff took too long and hit the deadline or
-        // number of diffs equals number of characters, no commonality at all.
-        return [
-            [ DIFF_DELETE, text1 ],
-            [ DIFF_INSERT, text2 ]
-        ];
-    };
-
-    /**
-     * Given the location of the 'middle snake', split the diff in two parts
-     * and recurse.
-     * @param {string} text1 Old string to be diffed.
-     * @param {string} text2 New string to be diffed.
-     * @param {number} x Index of split point in text1.
-     * @param {number} y Index of split point in text2.
-     * @param {number} deadline Time at which to bail if not yet complete.
-     * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-     * @private
-     */
-    DiffMatchPatch.prototype.diffBisectSplit = function( text1, text2, x, y, deadline ) {
-        var text1a, text1b, text2a, text2b, diffs, diffsb;
-        text1a = text1.substring(0, x);
-        text2a = text2.substring(0, y);
-        text1b = text1.substring(x);
-        text2b = text2.substring(y);
-
-        // Compute both diffs serially.
-        diffs = this.DiffMain(text1a, text2a, false, deadline);
-        diffsb = this.DiffMain(text1b, text2b, false, deadline);
-
-        return diffs.concat(diffsb);
-    };
-
-    /**
-     * Reduce the number of edits by eliminating semantically trivial equalities.
-     * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-     */
-    DiffMatchPatch.prototype.diffCleanupSemantic = function(diffs) {
-        var changes, equalities, equalitiesLength, lastequality,
-                       pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1,
-                       lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2;
-        changes = false;
-        equalities = []; // Stack of indices where equalities are found.
-        equalitiesLength = 0; // Keeping our own length var is faster in JS.
-        /** @type {?string} */
-        lastequality = null;
-        // Always equal to diffs[equalities[equalitiesLength - 1]][1]
-        pointer = 0; // Index of current position.
-        // Number of characters that changed prior to the equality.
-        lengthInsertions1 = 0;
-        lengthDeletions1 = 0;
-        // Number of characters that changed after the equality.
-        lengthInsertions2 = 0;
-        lengthDeletions2 = 0;
-        while (pointer < diffs.length) {
-            if (diffs[pointer][0] === DIFF_EQUAL) { // Equality found.
-                equalities[equalitiesLength++] = pointer;
-                lengthInsertions1 = lengthInsertions2;
-                lengthDeletions1 = lengthDeletions2;
-                lengthInsertions2 = 0;
-                lengthDeletions2 = 0;
-                lastequality = diffs[pointer][1];
-            } else { // An insertion or deletion.
-                if (diffs[pointer][0] === DIFF_INSERT) {
-                    lengthInsertions2 += diffs[pointer][1].length;
-                } else {
-                    lengthDeletions2 += diffs[pointer][1].length;
-                }
-                // Eliminate an equality that is smaller or equal to the edits on both
-                // sides of it.
-                if (lastequality && (lastequality.length <=
-                        Math.max(lengthInsertions1, lengthDeletions1)) &&
-                    (lastequality.length <= Math.max(lengthInsertions2,
-                        lengthDeletions2))) {
-                    // Duplicate record.
-                    diffs.splice( equalities[ equalitiesLength - 1 ], 0, [ DIFF_DELETE, lastequality ] );
-                    // Change second copy to insert.
-                    diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;
-                    // Throw away the equality we just deleted.
-                    equalitiesLength--;
-                    // Throw away the previous equality (it needs to be reevaluated).
-                    equalitiesLength--;
-                    pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;
-                    lengthInsertions1 = 0; // Reset the counters.
-                    lengthDeletions1 = 0;
-                    lengthInsertions2 = 0;
-                    lengthDeletions2 = 0;
-                    lastequality = null;
-                    changes = true;
-                }
-            }
-            pointer++;
-        }
-
-        // Normalize the diff.
-        if (changes) {
-            this.diffCleanupMerge(diffs);
-        }
-
-        // Find any overlaps between deletions and insertions.
-        // e.g: <del>abcxxx</del><ins>xxxdef</ins>
-        //   -> <del>abc</del>xxx<ins>def</ins>
-        // e.g: <del>xxxabc</del><ins>defxxx</ins>
-        //   -> <ins>def</ins>xxx<del>abc</del>
-        // Only extract an overlap if it is as big as the edit ahead or behind it.
-        pointer = 1;
-        while (pointer < diffs.length) {
-            if (diffs[pointer - 1][0] === DIFF_DELETE &&
-                diffs[pointer][0] === DIFF_INSERT) {
-                deletion = diffs[pointer - 1][1];
-                insertion = diffs[pointer][1];
-                overlapLength1 = this.diffCommonOverlap(deletion, insertion);
-                overlapLength2 = this.diffCommonOverlap(insertion, deletion);
-                if (overlapLength1 >= overlapLength2) {
-                    if (overlapLength1 >= deletion.length / 2 ||
-                        overlapLength1 >= insertion.length / 2) {
-                        // Overlap found.  Insert an equality and trim the surrounding edits.
-                        diffs.splice( pointer, 0, [ DIFF_EQUAL, insertion.substring( 0, overlapLength1 ) ] );
-                        diffs[pointer - 1][1] =
-                            deletion.substring(0, deletion.length - overlapLength1);
-                        diffs[pointer + 1][1] = insertion.substring(overlapLength1);
-                        pointer++;
-                    }
-                } else {
-                    if (overlapLength2 >= deletion.length / 2 ||
-                        overlapLength2 >= insertion.length / 2) {
-                        // Reverse overlap found.
-                        // Insert an equality and swap and trim the surrounding edits.
-                        diffs.splice( pointer, 0, [ DIFF_EQUAL, deletion.substring( 0, overlapLength2 ) ] );
-                        diffs[pointer - 1][0] = DIFF_INSERT;
-                        diffs[pointer - 1][1] =
-                            insertion.substring(0, insertion.length - overlapLength2);
-                        diffs[pointer + 1][0] = DIFF_DELETE;
-                        diffs[pointer + 1][1] =
-                            deletion.substring(overlapLength2);
-                        pointer++;
-                    }
-                }
-                pointer++;
-            }
-            pointer++;
-        }
-    };
-
-    /**
-     * Determine if the suffix of one string is the prefix of another.
-     * @param {string} text1 First string.
-     * @param {string} text2 Second string.
-     * @return {number} The number of characters common to the end of the first
-     *     string and the start of the second string.
-     * @private
-     */
-    DiffMatchPatch.prototype.diffCommonOverlap = function(text1, text2) {
-        var text1Length, text2Length, textLength,
-                       best, length, pattern, found;
-        // Cache the text lengths to prevent multiple calls.
-        text1Length = text1.length;
-        text2Length = text2.length;
-        // Eliminate the null case.
-        if (text1Length === 0 || text2Length === 0) {
-            return 0;
-        }
-        // Truncate the longer string.
-        if (text1Length > text2Length) {
-            text1 = text1.substring(text1Length - text2Length);
-        } else if (text1Length < text2Length) {
-            text2 = text2.substring(0, text1Length);
-        }
-        textLength = Math.min(text1Length, text2Length);
-        // Quick check for the worst case.
-        if (text1 === text2) {
-            return textLength;
-        }
-
-        // Start by looking for a single character match
-        // and increase length until no match is found.
-        // Performance analysis: http://neil.fraser.name/news/2010/11/04/
-        best = 0;
-        length = 1;
-        while (true) {
-            pattern = text1.substring(textLength - length);
-            found = text2.indexOf(pattern);
-            if (found === -1) {
-                return best;
-            }
-            length += found;
-            if (found === 0 || text1.substring(textLength - length) ===
-                text2.substring(0, length)) {
-                best = length;
-                length++;
-            }
-        }
-    };
-
-    /**
-     * Split two texts into an array of strings.  Reduce the texts to a string of
-     * hashes where each Unicode character represents one line.
-     * @param {string} text1 First string.
-     * @param {string} text2 Second string.
-     * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}
-     *     An object containing the encoded text1, the encoded text2 and
-     *     the array of unique strings.
-     *     The zeroth element of the array of unique strings is intentionally blank.
-     * @private
-     */
-    DiffMatchPatch.prototype.diffLinesToChars = function(text1, text2) {
-        var lineArray, lineHash, chars1, chars2;
-        lineArray = []; // e.g. lineArray[4] === 'Hello\n'
-        lineHash = {}; // e.g. lineHash['Hello\n'] === 4
-
-        // '\x00' is a valid character, but various debuggers don't like it.
-        // So we'll insert a junk entry to avoid generating a null character.
-        lineArray[0] = "";
-
-        /**
-         * Split a text into an array of strings.  Reduce the texts to a string of
-         * hashes where each Unicode character represents one line.
-         * Modifies linearray and linehash through being a closure.
-         * @param {string} text String to encode.
-         * @return {string} Encoded string.
-         * @private
-         */
-        function diffLinesToCharsMunge(text) {
-            var chars, lineStart, lineEnd, lineArrayLength, line;
-            chars = "";
-            // Walk the text, pulling out a substring for each line.
-            // text.split('\n') would would temporarily double our memory footprint.
-            // Modifying text would create many large strings to garbage collect.
-            lineStart = 0;
-            lineEnd = -1;
-            // Keeping our own length variable is faster than looking it up.
-            lineArrayLength = lineArray.length;
-            while (lineEnd < text.length - 1) {
-                lineEnd = text.indexOf("\n", lineStart);
-                if (lineEnd === -1) {
-                    lineEnd = text.length - 1;
-                }
-                line = text.substring(lineStart, lineEnd + 1);
-                lineStart = lineEnd + 1;
-
-                if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) :
-                    (lineHash[line] !== undefined)) {
-                    chars += String.fromCharCode( lineHash[ line ] );
-                } else {
-                    chars += String.fromCharCode(lineArrayLength);
-                    lineHash[line] = lineArrayLength;
-                    lineArray[lineArrayLength++] = line;
-                }
-            }
-            return chars;
-        }
-
-        chars1 = diffLinesToCharsMunge(text1);
-        chars2 = diffLinesToCharsMunge(text2);
-        return {
-            chars1: chars1,
-            chars2: chars2,
-            lineArray: lineArray
-        };
-    };
-
-    /**
-     * Rehydrate the text in a diff from a string of line hashes to real lines of
-     * text.
-     * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-     * @param {!Array.<string>} lineArray Array of unique strings.
-     * @private
-     */
-    DiffMatchPatch.prototype.diffCharsToLines = function( diffs, lineArray ) {
-        var x, chars, text, y;
-        for ( x = 0; x < diffs.length; x++ ) {
-            chars = diffs[x][1];
-            text = [];
-            for ( y = 0; y < chars.length; y++ ) {
-                text[y] = lineArray[chars.charCodeAt(y)];
-            }
-            diffs[x][1] = text.join("");
-        }
-    };
-
-    /**
-     * Reorder and merge like edit sections.  Merge equalities.
-     * Any edit section can move as long as it doesn't cross an equality.
-     * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-     */
-    DiffMatchPatch.prototype.diffCleanupMerge = function(diffs) {
-        var pointer, countDelete, countInsert, textInsert, textDelete,
-                       commonlength, changes;
-        diffs.push( [ DIFF_EQUAL, "" ] ); // Add a dummy entry at the end.
-        pointer = 0;
-        countDelete = 0;
-        countInsert = 0;
-        textDelete = "";
-        textInsert = "";
-        commonlength;
-        while (pointer < diffs.length) {
-            switch ( diffs[ pointer ][ 0 ] ) {
-                case DIFF_INSERT:
-                    countInsert++;
-                    textInsert += diffs[pointer][1];
-                    pointer++;
-                    break;
-                case DIFF_DELETE:
-                    countDelete++;
-                    textDelete += diffs[pointer][1];
-                    pointer++;
-                    break;
-                case DIFF_EQUAL:
-                    // Upon reaching an equality, check for prior redundancies.
-                    if (countDelete + countInsert > 1) {
-                        if (countDelete !== 0 && countInsert !== 0) {
-                            // Factor out any common prefixies.
-                            commonlength = this.diffCommonPrefix(textInsert, textDelete);
-                            if (commonlength !== 0) {
-                                if ((pointer - countDelete - countInsert) > 0 &&
-                                    diffs[pointer - countDelete - countInsert - 1][0] ===
-                                    DIFF_EQUAL) {
-                                    diffs[pointer - countDelete - countInsert - 1][1] +=
-                                        textInsert.substring(0, commonlength);
-                                } else {
-                                    diffs.splice( 0, 0, [ DIFF_EQUAL,
-                                        textInsert.substring( 0, commonlength )
-                                     ] );
-                                    pointer++;
-                                }
-                                textInsert = textInsert.substring(commonlength);
-                                textDelete = textDelete.substring(commonlength);
-                            }
-                            // Factor out any common suffixies.
-                            commonlength = this.diffCommonSuffix(textInsert, textDelete);
-                            if (commonlength !== 0) {
-                                diffs[pointer][1] = textInsert.substring(textInsert.length -
-                                    commonlength) + diffs[pointer][1];
-                                textInsert = textInsert.substring(0, textInsert.length -
-                                    commonlength);
-                                textDelete = textDelete.substring(0, textDelete.length -
-                                    commonlength);
-                            }
-                        }
-                        // Delete the offending records and add the merged ones.
-                        if (countDelete === 0) {
-                            diffs.splice( pointer - countInsert,
-                                countDelete + countInsert, [ DIFF_INSERT, textInsert ] );
-                        } else if (countInsert === 0) {
-                            diffs.splice( pointer - countDelete,
-                                countDelete + countInsert, [ DIFF_DELETE, textDelete ] );
-                        } else {
-                            diffs.splice( pointer - countDelete - countInsert,
-                                countDelete + countInsert, [ DIFF_DELETE, textDelete ], [ DIFF_INSERT, textInsert ] );
-                        }
-                        pointer = pointer - countDelete - countInsert +
-                            (countDelete ? 1 : 0) + (countInsert ? 1 : 0) + 1;
-                    } else if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) {
-                        // Merge this equality with the previous one.
-                        diffs[pointer - 1][1] += diffs[pointer][1];
-                        diffs.splice(pointer, 1);
-                    } else {
-                        pointer++;
-                    }
-                    countInsert = 0;
-                    countDelete = 0;
-                    textDelete = "";
-                    textInsert = "";
-                    break;
-            }
-        }
-        if (diffs[diffs.length - 1][1] === "") {
-            diffs.pop(); // Remove the dummy entry at the end.
-        }
-
-        // Second pass: look for single edits surrounded on both sides by equalities
-        // which can be shifted sideways to eliminate an equality.
-        // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC
-        changes = false;
-        pointer = 1;
-        // Intentionally ignore the first and last element (don't need checking).
-        while (pointer < diffs.length - 1) {
-            if (diffs[pointer - 1][0] === DIFF_EQUAL &&
-                diffs[pointer + 1][0] === DIFF_EQUAL) {
-                // This is a single edit surrounded by equalities.
-                if ( diffs[ pointer ][ 1 ].substring( diffs[ pointer ][ 1 ].length -
-                        diffs[ pointer - 1 ][ 1 ].length ) === diffs[ pointer - 1 ][ 1 ] ) {
-                    // Shift the edit over the previous equality.
-                    diffs[pointer][1] = diffs[pointer - 1][1] +
-                        diffs[pointer][1].substring(0, diffs[pointer][1].length -
-                            diffs[pointer - 1][1].length);
-                    diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];
-                    diffs.splice(pointer - 1, 1);
-                    changes = true;
-                } else if ( diffs[ pointer ][ 1 ].substring( 0, diffs[ pointer + 1 ][ 1 ].length ) ===
-                    diffs[ pointer + 1 ][ 1 ] ) {
-                    // Shift the edit over the next equality.
-                    diffs[pointer - 1][1] += diffs[pointer + 1][1];
-                    diffs[pointer][1] =
-                        diffs[pointer][1].substring(diffs[pointer + 1][1].length) +
-                        diffs[pointer + 1][1];
-                    diffs.splice(pointer + 1, 1);
-                    changes = true;
-                }
-            }
-            pointer++;
-        }
-        // If shifts were made, the diff needs reordering and another shift sweep.
-        if (changes) {
-            this.diffCleanupMerge(diffs);
-        }
-    };
-
-    return function(o, n) {
-               var diff, output, text;
-        diff = new DiffMatchPatch();
-        output = diff.DiffMain(o, n);
-        //console.log(output);
-        diff.diffCleanupEfficiency(output);
-        text = diff.diffPrettyHtml(output);
-
-        return text;
-    };
-}());
-// jscs:enable
-
 (function() {
 
+// Don't load the HTML Reporter on non-Browser environments
+if ( typeof window === "undefined" || !window.document ) {
+       return;
+}
+
 // Deprecated QUnit.init - Ref #530
 // Re-initialize the configuration options
 QUnit.init = function() {
@@ -3115,12 +3427,8 @@ QUnit.init = function() {
        }
 };
 
-// Don't load the HTML Reporter on non-Browser environments
-if ( typeof window === "undefined" ) {
-       return;
-}
-
 var config = QUnit.config,
+       collapseNext = false,
        hasOwn = Object.prototype.hasOwnProperty,
        defined = {
                document: window.document !== undefined,
@@ -3479,7 +3787,7 @@ function appendHeader() {
 
        if ( header ) {
                header.innerHTML = "<a href='" +
-                       setUrl({ filter: undefined, module: undefined, testId: undefined }) +
+                       escapeText( setUrl( { filter: undefined, module: undefined, testId: undefined } ) ) +
                        "'>" + header.innerHTML + "</a> ";
        }
 }
@@ -3517,6 +3825,18 @@ function storeFixture() {
        }
 }
 
+function appendFilteredTest() {
+       var testId = QUnit.config.testId;
+       if ( !testId || testId.length <= 0 ) {
+               return "";
+       }
+       return "<div id='qunit-filteredTest'>Rerunning selected tests: " +
+               escapeText( testId.join(", ") ) +
+               " <a id='qunit-clearFilter' href='" +
+               escapeText( setUrl( { filter: undefined, module: undefined, testId: undefined } ) ) +
+               "'>" + "Run all tests" + "</a></div>";
+}
+
 function appendUserAgent() {
        var userAgent = id( "qunit-userAgent" );
 
@@ -3524,7 +3844,7 @@ function appendUserAgent() {
                userAgent.innerHTML = "";
                userAgent.appendChild(
                        document.createTextNode(
-                               "QUnit " + QUnit.version  + "; " + navigator.userAgent
+                               "QUnit " + QUnit.version + "; " + navigator.userAgent
                        )
                );
        }
@@ -3588,6 +3908,7 @@ QUnit.begin(function( details ) {
                        "<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
                        "<h2 id='qunit-banner'></h2>" +
                        "<div id='qunit-testrunner-toolbar'></div>" +
+                       appendFilteredTest() +
                        "<h2 id='qunit-userAgent'></h2>" +
                        "<ol id='qunit-tests'></ol>";
        }
@@ -3693,9 +4014,15 @@ QUnit.testStart(function( details ) {
 
 });
 
+function stripHtml( string ) {
+       // strip tags, html entity and whitespaces
+       return string.replace(/<\/?[^>]+(>|$)/g, "").replace(/\&quot;/g, "").replace(/\s+/g, "");
+}
+
 QUnit.log(function( details ) {
        var assertList, assertLi,
-               message, expected, actual,
+               message, expected, actual, diff,
+               showDiff = false,
                testItem = id( "qunit-test-output-" + details.testId );
 
        if ( !testItem ) {
@@ -3710,26 +4037,44 @@ QUnit.log(function( details ) {
        // when it calls, it's implicit to also not show expected and diff stuff
        // Also, we need to check details.expected existence, as it can exist and be undefined
        if ( !details.result && hasOwn.call( details, "expected" ) ) {
-               expected = escapeText( QUnit.dump.parse( details.expected ) );
+               if ( details.negative ) {
+                       expected = escapeText( "NOT " + QUnit.dump.parse( details.expected ) );
+               } else {
+                       expected = escapeText( QUnit.dump.parse( details.expected ) );
+               }
+
                actual = escapeText( QUnit.dump.parse( details.actual ) );
                message += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" +
                        expected +
                        "</pre></td></tr>";
 
                if ( actual !== expected ) {
+
                        message += "<tr class='test-actual'><th>Result: </th><td><pre>" +
-                               actual + "</pre></td></tr>" +
-                               "<tr class='test-diff'><th>Diff: </th><td><pre>" +
-                               QUnit.diff( expected, actual ) + "</pre></td></tr>";
-               } else {
-                       if ( expected.indexOf( "[object Array]" ) !== -1 ||
-                                       expected.indexOf( "[object Object]" ) !== -1 ) {
-                               message += "<tr class='test-message'><th>Message: </th><td>" +
-                                       "Diff suppressed as the depth of object is more than current max depth (" +
-                                       QUnit.config.maxDepth + ").<p>Hint: Use <code>QUnit.dump.maxDepth</code> to " +
-                                       " run with a higher max depth or <a href='" + setUrl({ maxDepth: -1 }) + "'>" +
-                                       "Rerun</a> without max depth.</p></td></tr>";
+                               actual + "</pre></td></tr>";
+
+                       // Don't show diff if actual or expected are booleans
+                       if ( !( /^(true|false)$/.test( actual ) ) &&
+                                       !( /^(true|false)$/.test( expected ) ) ) {
+                               diff = QUnit.diff( expected, actual );
+                               showDiff = stripHtml( diff ).length !==
+                                       stripHtml( expected ).length +
+                                       stripHtml( actual ).length;
+                       }
+
+                       // Don't show diff if expected and actual are totally different
+                       if ( showDiff ) {
+                               message += "<tr class='test-diff'><th>Diff: </th><td><pre>" +
+                                       diff + "</pre></td></tr>";
                        }
+               } else if ( expected.indexOf( "[object Array]" ) !== -1 ||
+                               expected.indexOf( "[object Object]" ) !== -1 ) {
+                       message += "<tr class='test-message'><th>Message: </th><td>" +
+                               "Diff suppressed as the depth of object is more than current max depth (" +
+                               QUnit.config.maxDepth + ").<p>Hint: Use <code>QUnit.dump.maxDepth</code> to " +
+                               " run with a higher max depth or <a href='" +
+                               escapeText( setUrl( { maxDepth: -1 } ) ) + "'>" +
+                               "Rerun</a> without max depth.</p></td></tr>";
                }
 
                if ( details.source ) {
@@ -3739,7 +4084,7 @@ QUnit.log(function( details ) {
 
                message += "</table>";
 
-       // this occours when pushFailure is set and we have an extracted stack trace
+       // this occurs when pushFailure is set and we have an extracted stack trace
        } else if ( !details.result && details.source ) {
                message += "<table>" +
                        "<tr class='test-source'><th>Source: </th><td><pre>" +
@@ -3757,7 +4102,7 @@ QUnit.log(function( details ) {
 
 QUnit.testDone(function( details ) {
        var testTitle, time, testItem, assertList,
-               good, bad, testCounts, skipped,
+               good, bad, testCounts, skipped, sourceName,
                tests = id( "qunit-tests" );
 
        if ( !tests ) {
@@ -3781,6 +4126,16 @@ QUnit.testDone(function( details ) {
        }
 
        if ( bad === 0 ) {
+
+               // Collapse the passing tests
+               addClass( assertList, "qunit-collapsed" );
+       } else if ( bad && config.collapse && !collapseNext ) {
+
+               // Skip collapsing the first failing test
+               collapseNext = true;
+       } else {
+
+               // Collapse remaining tests
                addClass( assertList, "qunit-collapsed" );
        }
 
@@ -3812,10 +4167,31 @@ QUnit.testDone(function( details ) {
                time.innerHTML = details.runtime + " ms";
                testItem.insertBefore( time, assertList );
        }
+
+       // Show the source of the test when showing assertions
+       if ( details.source ) {
+               sourceName = document.createElement( "p" );
+               sourceName.innerHTML = "<strong>Source: </strong>" + details.source;
+               addClass( sourceName, "qunit-source" );
+               if ( bad === 0 ) {
+                       addClass( sourceName, "qunit-collapsed" );
+               }
+               addEvent( testTitle, "click", function() {
+                       toggleClass( sourceName, "qunit-collapsed" );
+               });
+               testItem.appendChild( sourceName );
+       }
 });
 
 if ( defined.document ) {
-       if ( document.readyState === "complete" ) {
+
+       // Avoid readyState issue with phantomjs
+       // Ref: #818
+       var notPhantom = ( function( p ) {
+               return !( p && p.version && p.version.major > 0 );
+       } )( window.phantom );
+
+       if ( notPhantom && document.readyState === "complete" ) {
                QUnit.load();
        } else {
                addEvent( window, "load", QUnit.load );
diff --git a/resources/lib/sinonjs/sinon-1.15.4.js b/resources/lib/sinonjs/sinon-1.15.4.js
deleted file mode 100644 (file)
index 20bc9e2..0000000
+++ /dev/null
@@ -1,5949 +0,0 @@
-/**
- * Sinon.JS 1.15.4, 2015/06/27
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS
- *
- * (The BSD License)
- * 
- * Copyright (c) 2010-2014, Christian Johansen, christian@cjohansen.no
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice,
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice,
- *       this list of conditions and the following disclaimer in the documentation
- *       and/or other materials provided with the distribution.
- *     * Neither the name of Christian Johansen nor the names of his contributors
- *       may be used to endorse or promote products derived from this software
- *       without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-(function (root, factory) {
-  'use strict';
-  if (typeof define === 'function' && define.amd) {
-    define('sinon', [], function () {
-      return (root.sinon = factory());
-    });
-  } else if (typeof exports === 'object') {
-    module.exports = factory();
-  } else {
-    root.sinon = factory();
-  }
-}(this, function () {
-  'use strict';
-  var samsam, formatio, lolex;
-  (function () {
-                function define(mod, deps, fn) {
-                  if (mod == "samsam") {
-                    samsam = deps();
-                  } else if (typeof deps === "function" && mod.length === 0) {
-                    lolex = deps();
-                  } else if (typeof fn === "function") {
-                    formatio = fn(samsam);
-                  }
-                }
-    define.amd = {};
-((typeof define === "function" && define.amd && function (m) { define("samsam", m); }) ||
- (typeof module === "object" &&
-      function (m) { module.exports = m(); }) || // Node
- function (m) { this.samsam = m(); } // Browser globals
-)(function () {
-    var o = Object.prototype;
-    var div = typeof document !== "undefined" && document.createElement("div");
-
-    function isNaN(value) {
-        // Unlike global isNaN, this avoids type coercion
-        // typeof check avoids IE host object issues, hat tip to
-        // lodash
-        var val = value; // JsLint thinks value !== value is "weird"
-        return typeof value === "number" && value !== val;
-    }
-
-    function getClass(value) {
-        // Returns the internal [[Class]] by calling Object.prototype.toString
-        // with the provided value as this. Return value is a string, naming the
-        // internal class, e.g. "Array"
-        return o.toString.call(value).split(/[ \]]/)[1];
-    }
-
-    /**
-     * @name samsam.isArguments
-     * @param Object object
-     *
-     * Returns ``true`` if ``object`` is an ``arguments`` object,
-     * ``false`` otherwise.
-     */
-    function isArguments(object) {
-        if (getClass(object) === 'Arguments') { return true; }
-        if (typeof object !== "object" || typeof object.length !== "number" ||
-                getClass(object) === "Array") {
-            return false;
-        }
-        if (typeof object.callee == "function") { return true; }
-        try {
-            object[object.length] = 6;
-            delete object[object.length];
-        } catch (e) {
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * @name samsam.isElement
-     * @param Object object
-     *
-     * Returns ``true`` if ``object`` is a DOM element node. Unlike
-     * Underscore.js/lodash, this function will return ``false`` if ``object``
-     * is an *element-like* object, i.e. a regular object with a ``nodeType``
-     * property that holds the value ``1``.
-     */
-    function isElement(object) {
-        if (!object || object.nodeType !== 1 || !div) { return false; }
-        try {
-            object.appendChild(div);
-            object.removeChild(div);
-        } catch (e) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * @name samsam.keys
-     * @param Object object
-     *
-     * Return an array of own property names.
-     */
-    function keys(object) {
-        var ks = [], prop;
-        for (prop in object) {
-            if (o.hasOwnProperty.call(object, prop)) { ks.push(prop); }
-        }
-        return ks;
-    }
-
-    /**
-     * @name samsam.isDate
-     * @param Object value
-     *
-     * Returns true if the object is a ``Date``, or *date-like*. Duck typing
-     * of date objects work by checking that the object has a ``getTime``
-     * function whose return value equals the return value from the object's
-     * ``valueOf``.
-     */
-    function isDate(value) {
-        return typeof value.getTime == "function" &&
-            value.getTime() == value.valueOf();
-    }
-
-    /**
-     * @name samsam.isNegZero
-     * @param Object value
-     *
-     * Returns ``true`` if ``value`` is ``-0``.
-     */
-    function isNegZero(value) {
-        return value === 0 && 1 / value === -Infinity;
-    }
-
-    /**
-     * @name samsam.equal
-     * @param Object obj1
-     * @param Object obj2
-     *
-     * Returns ``true`` if two objects are strictly equal. Compared to
-     * ``===`` there are two exceptions:
-     *
-     *   - NaN is considered equal to NaN
-     *   - -0 and +0 are not considered equal
-     */
-    function identical(obj1, obj2) {
-        if (obj1 === obj2 || (isNaN(obj1) && isNaN(obj2))) {
-            return obj1 !== 0 || isNegZero(obj1) === isNegZero(obj2);
-        }
-    }
-
-
-    /**
-     * @name samsam.deepEqual
-     * @param Object obj1
-     * @param Object obj2
-     *
-     * Deep equal comparison. Two values are "deep equal" if:
-     *
-     *   - They are equal, according to samsam.identical
-     *   - They are both date objects representing the same time
-     *   - They are both arrays containing elements that are all deepEqual
-     *   - They are objects with the same set of properties, and each property
-     *     in ``obj1`` is deepEqual to the corresponding property in ``obj2``
-     *
-     * Supports cyclic objects.
-     */
-    function deepEqualCyclic(obj1, obj2) {
-
-        // used for cyclic comparison
-        // contain already visited objects
-        var objects1 = [],
-            objects2 = [],
-        // contain pathes (position in the object structure)
-        // of the already visited objects
-        // indexes same as in objects arrays
-            paths1 = [],
-            paths2 = [],
-        // contains combinations of already compared objects
-        // in the manner: { "$1['ref']$2['ref']": true }
-            compared = {};
-
-        /**
-         * used to check, if the value of a property is an object
-         * (cyclic logic is only needed for objects)
-         * only needed for cyclic logic
-         */
-        function isObject(value) {
-
-            if (typeof value === 'object' && value !== null &&
-                    !(value instanceof Boolean) &&
-                    !(value instanceof Date)    &&
-                    !(value instanceof Number)  &&
-                    !(value instanceof RegExp)  &&
-                    !(value instanceof String)) {
-
-                return true;
-            }
-
-            return false;
-        }
-
-        /**
-         * returns the index of the given object in the
-         * given objects array, -1 if not contained
-         * only needed for cyclic logic
-         */
-        function getIndex(objects, obj) {
-
-            var i;
-            for (i = 0; i < objects.length; i++) {
-                if (objects[i] === obj) {
-                    return i;
-                }
-            }
-
-            return -1;
-        }
-
-        // does the recursion for the deep equal check
-        return (function deepEqual(obj1, obj2, path1, path2) {
-            var type1 = typeof obj1;
-            var type2 = typeof obj2;
-
-            // == null also matches undefined
-            if (obj1 === obj2 ||
-                    isNaN(obj1) || isNaN(obj2) ||
-                    obj1 == null || obj2 == null ||
-                    type1 !== "object" || type2 !== "object") {
-
-                return identical(obj1, obj2);
-            }
-
-            // Elements are only equal if identical(expected, actual)
-            if (isElement(obj1) || isElement(obj2)) { return false; }
-
-            var isDate1 = isDate(obj1), isDate2 = isDate(obj2);
-            if (isDate1 || isDate2) {
-                if (!isDate1 || !isDate2 || obj1.getTime() !== obj2.getTime()) {
-                    return false;
-                }
-            }
-
-            if (obj1 instanceof RegExp && obj2 instanceof RegExp) {
-                if (obj1.toString() !== obj2.toString()) { return false; }
-            }
-
-            var class1 = getClass(obj1);
-            var class2 = getClass(obj2);
-            var keys1 = keys(obj1);
-            var keys2 = keys(obj2);
-
-            if (isArguments(obj1) || isArguments(obj2)) {
-                if (obj1.length !== obj2.length) { return false; }
-            } else {
-                if (type1 !== type2 || class1 !== class2 ||
-                        keys1.length !== keys2.length) {
-                    return false;
-                }
-            }
-
-            var key, i, l,
-                // following vars are used for the cyclic logic
-                value1, value2,
-                isObject1, isObject2,
-                index1, index2,
-                newPath1, newPath2;
-
-            for (i = 0, l = keys1.length; i < l; i++) {
-                key = keys1[i];
-                if (!o.hasOwnProperty.call(obj2, key)) {
-                    return false;
-                }
-
-                // Start of the cyclic logic
-
-                value1 = obj1[key];
-                value2 = obj2[key];
-
-                isObject1 = isObject(value1);
-                isObject2 = isObject(value2);
-
-                // determine, if the objects were already visited
-                // (it's faster to check for isObject first, than to
-                // get -1 from getIndex for non objects)
-                index1 = isObject1 ? getIndex(objects1, value1) : -1;
-                index2 = isObject2 ? getIndex(objects2, value2) : -1;
-
-                // determine the new pathes of the objects
-                // - for non cyclic objects the current path will be extended
-                //   by current property name
-                // - for cyclic objects the stored path is taken
-                newPath1 = index1 !== -1
-                    ? paths1[index1]
-                    : path1 + '[' + JSON.stringify(key) + ']';
-                newPath2 = index2 !== -1
-                    ? paths2[index2]
-                    : path2 + '[' + JSON.stringify(key) + ']';
-
-                // stop recursion if current objects are already compared
-                if (compared[newPath1 + newPath2]) {
-                    return true;
-                }
-
-                // remember the current objects and their pathes
-                if (index1 === -1 && isObject1) {
-                    objects1.push(value1);
-                    paths1.push(newPath1);
-                }
-                if (index2 === -1 && isObject2) {
-                    objects2.push(value2);
-                    paths2.push(newPath2);
-                }
-
-                // remember that the current objects are already compared
-                if (isObject1 && isObject2) {
-                    compared[newPath1 + newPath2] = true;
-                }
-
-                // End of cyclic logic
-
-                // neither value1 nor value2 is a cycle
-                // continue with next level
-                if (!deepEqual(value1, value2, newPath1, newPath2)) {
-                    return false;
-                }
-            }
-
-            return true;
-
-        }(obj1, obj2, '$1', '$2'));
-    }
-
-    var match;
-
-    function arrayContains(array, subset) {
-        if (subset.length === 0) { return true; }
-        var i, l, j, k;
-        for (i = 0, l = array.length; i < l; ++i) {
-            if (match(array[i], subset[0])) {
-                for (j = 0, k = subset.length; j < k; ++j) {
-                    if (!match(array[i + j], subset[j])) { return false; }
-                }
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * @name samsam.match
-     * @param Object object
-     * @param Object matcher
-     *
-     * Compare arbitrary value ``object`` with matcher.
-     */
-    match = function match(object, matcher) {
-        if (matcher && typeof matcher.test === "function") {
-            return matcher.test(object);
-        }
-
-        if (typeof matcher === "function") {
-            return matcher(object) === true;
-        }
-
-        if (typeof matcher === "string") {
-            matcher = matcher.toLowerCase();
-            var notNull = typeof object === "string" || !!object;
-            return notNull &&
-                (String(object)).toLowerCase().indexOf(matcher) >= 0;
-        }
-
-        if (typeof matcher === "number") {
-            return matcher === object;
-        }
-
-        if (typeof matcher === "boolean") {
-            return matcher === object;
-        }
-
-        if (typeof(matcher) === "undefined") {
-            return typeof(object) === "undefined";
-        }
-
-        if (matcher === null) {
-            return object === null;
-        }
-
-        if (getClass(object) === "Array" && getClass(matcher) === "Array") {
-            return arrayContains(object, matcher);
-        }
-
-        if (matcher && typeof matcher === "object") {
-            if (matcher === object) {
-                return true;
-            }
-            var prop;
-            for (prop in matcher) {
-                var value = object[prop];
-                if (typeof value === "undefined" &&
-                        typeof object.getAttribute === "function") {
-                    value = object.getAttribute(prop);
-                }
-                if (matcher[prop] === null || typeof matcher[prop] === 'undefined') {
-                    if (value !== matcher[prop]) {
-                        return false;
-                    }
-                } else if (typeof  value === "undefined" || !match(value, matcher[prop])) {
-                    return false;
-                }
-            }
-            return true;
-        }
-
-        throw new Error("Matcher was not a string, a number, a " +
-                        "function, a boolean or an object");
-    };
-
-    return {
-        isArguments: isArguments,
-        isElement: isElement,
-        isDate: isDate,
-        isNegZero: isNegZero,
-        identical: identical,
-        deepEqual: deepEqualCyclic,
-        match: match,
-        keys: keys
-    };
-});
-((typeof define === "function" && define.amd && function (m) {
-    define("formatio", ["samsam"], m);
-}) || (typeof module === "object" && function (m) {
-    module.exports = m(require("samsam"));
-}) || function (m) { this.formatio = m(this.samsam); }
-)(function (samsam) {
-    
-    var formatio = {
-        excludeConstructors: ["Object", /^.$/],
-        quoteStrings: true,
-        limitChildrenCount: 0
-    };
-
-    var hasOwn = Object.prototype.hasOwnProperty;
-
-    var specialObjects = [];
-    if (typeof global !== "undefined") {
-        specialObjects.push({ object: global, value: "[object global]" });
-    }
-    if (typeof document !== "undefined") {
-        specialObjects.push({
-            object: document,
-            value: "[object HTMLDocument]"
-        });
-    }
-    if (typeof window !== "undefined") {
-        specialObjects.push({ object: window, value: "[object Window]" });
-    }
-
-    function functionName(func) {
-        if (!func) { return ""; }
-        if (func.displayName) { return func.displayName; }
-        if (func.name) { return func.name; }
-        var matches = func.toString().match(/function\s+([^\(]+)/m);
-        return (matches && matches[1]) || "";
-    }
-
-    function constructorName(f, object) {
-        var name = functionName(object && object.constructor);
-        var excludes = f.excludeConstructors ||
-                formatio.excludeConstructors || [];
-
-        var i, l;
-        for (i = 0, l = excludes.length; i < l; ++i) {
-            if (typeof excludes[i] === "string" && excludes[i] === name) {
-                return "";
-            } else if (excludes[i].test && excludes[i].test(name)) {
-                return "";
-            }
-        }
-
-        return name;
-    }
-
-    function isCircular(object, objects) {
-        if (typeof object !== "object") { return false; }
-        var i, l;
-        for (i = 0, l = objects.length; i < l; ++i) {
-            if (objects[i] === object) { return true; }
-        }
-        return false;
-    }
-
-    function ascii(f, object, processed, indent) {
-        if (typeof object === "string") {
-            var qs = f.quoteStrings;
-            var quote = typeof qs !== "boolean" || qs;
-            return processed || quote ? '"' + object + '"' : object;
-        }
-
-        if (typeof object === "function" && !(object instanceof RegExp)) {
-            return ascii.func(object);
-        }
-
-        processed = processed || [];
-
-        if (isCircular(object, processed)) { return "[Circular]"; }
-
-        if (Object.prototype.toString.call(object) === "[object Array]") {
-            return ascii.array.call(f, object, processed);
-        }
-
-        if (!object) { return String((1/object) === -Infinity ? "-0" : object); }
-        if (samsam.isElement(object)) { return ascii.element(object); }
-
-        if (typeof object.toString === "function" &&
-                object.toString !== Object.prototype.toString) {
-            return object.toString();
-        }
-
-        var i, l;
-        for (i = 0, l = specialObjects.length; i < l; i++) {
-            if (object === specialObjects[i].object) {
-                return specialObjects[i].value;
-            }
-        }
-
-        return ascii.object.call(f, object, processed, indent);
-    }
-
-    ascii.func = function (func) {
-        return "function " + functionName(func) + "() {}";
-    };
-
-    ascii.array = function (array, processed) {
-        processed = processed || [];
-        processed.push(array);
-        var pieces = [];
-        var i, l;
-        l = (this.limitChildrenCount > 0) ? 
-            Math.min(this.limitChildrenCount, array.length) : array.length;
-
-        for (i = 0; i < l; ++i) {
-            pieces.push(ascii(this, array[i], processed));
-        }
-
-        if(l < array.length)
-            pieces.push("[... " + (array.length - l) + " more elements]");
-
-        return "[" + pieces.join(", ") + "]";
-    };
-
-    ascii.object = function (object, processed, indent) {
-        processed = processed || [];
-        processed.push(object);
-        indent = indent || 0;
-        var pieces = [], properties = samsam.keys(object).sort();
-        var length = 3;
-        var prop, str, obj, i, k, l;
-        l = (this.limitChildrenCount > 0) ? 
-            Math.min(this.limitChildrenCount, properties.length) : properties.length;
-
-        for (i = 0; i < l; ++i) {
-            prop = properties[i];
-            obj = object[prop];
-
-            if (isCircular(obj, processed)) {
-                str = "[Circular]";
-            } else {
-                str = ascii(this, obj, processed, indent + 2);
-            }
-
-            str = (/\s/.test(prop) ? '"' + prop + '"' : prop) + ": " + str;
-            length += str.length;
-            pieces.push(str);
-        }
-
-        var cons = constructorName(this, object);
-        var prefix = cons ? "[" + cons + "] " : "";
-        var is = "";
-        for (i = 0, k = indent; i < k; ++i) { is += " "; }
-
-        if(l < properties.length)
-            pieces.push("[... " + (properties.length - l) + " more elements]");
-
-        if (length + indent > 80) {
-            return prefix + "{\n  " + is + pieces.join(",\n  " + is) + "\n" +
-                is + "}";
-        }
-        return prefix + "{ " + pieces.join(", ") + " }";
-    };
-
-    ascii.element = function (element) {
-        var tagName = element.tagName.toLowerCase();
-        var attrs = element.attributes, attr, pairs = [], attrName, i, l, val;
-
-        for (i = 0, l = attrs.length; i < l; ++i) {
-            attr = attrs.item(i);
-            attrName = attr.nodeName.toLowerCase().replace("html:", "");
-            val = attr.nodeValue;
-            if (attrName !== "contenteditable" || val !== "inherit") {
-                if (!!val) { pairs.push(attrName + "=\"" + val + "\""); }
-            }
-        }
-
-        var formatted = "<" + tagName + (pairs.length > 0 ? " " : "");
-        var content = element.innerHTML;
-
-        if (content.length > 20) {
-            content = content.substr(0, 20) + "[...]";
-        }
-
-        var res = formatted + pairs.join(" ") + ">" + content +
-                "</" + tagName + ">";
-
-        return res.replace(/ contentEditable="inherit"/, "");
-    };
-
-    function Formatio(options) {
-        for (var opt in options) {
-            this[opt] = options[opt];
-        }
-    }
-
-    Formatio.prototype = {
-        functionName: functionName,
-
-        configure: function (options) {
-            return new Formatio(options);
-        },
-
-        constructorName: function (object) {
-            return constructorName(this, object);
-        },
-
-        ascii: function (object, processed, indent) {
-            return ascii(this, object, processed, indent);
-        }
-    };
-
-    return Formatio.prototype;
-});
-!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.lolex=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
-(function (global){
-/*jslint eqeqeq: false, plusplus: false, evil: true, onevar: false, browser: true, forin: false*/
-/*global global*/
-/**
- * @author Christian Johansen (christian@cjohansen.no) and contributors
- * @license BSD
- *
- * Copyright (c) 2010-2014 Christian Johansen
- */
-
-// node expects setTimeout/setInterval to return a fn object w/ .ref()/.unref()
-// browsers, a number.
-// see https://github.com/cjohansen/Sinon.JS/pull/436
-var timeoutResult = setTimeout(function() {}, 0);
-var addTimerReturnsObject = typeof timeoutResult === "object";
-clearTimeout(timeoutResult);
-
-var NativeDate = Date;
-var id = 1;
-
-/**
- * Parse strings like "01:10:00" (meaning 1 hour, 10 minutes, 0 seconds) into
- * number of milliseconds. This is used to support human-readable strings passed
- * to clock.tick()
- */
-function parseTime(str) {
-    if (!str) {
-        return 0;
-    }
-
-    var strings = str.split(":");
-    var l = strings.length, i = l;
-    var ms = 0, parsed;
-
-    if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) {
-        throw new Error("tick only understands numbers and 'h:m:s'");
-    }
-
-    while (i--) {
-        parsed = parseInt(strings[i], 10);
-
-        if (parsed >= 60) {
-            throw new Error("Invalid time " + str);
-        }
-
-        ms += parsed * Math.pow(60, (l - i - 1));
-    }
-
-    return ms * 1000;
-}
-
-/**
- * Used to grok the `now` parameter to createClock.
- */
-function getEpoch(epoch) {
-    if (!epoch) { return 0; }
-    if (typeof epoch.getTime === "function") { return epoch.getTime(); }
-    if (typeof epoch === "number") { return epoch; }
-    throw new TypeError("now should be milliseconds since UNIX epoch");
-}
-
-function inRange(from, to, timer) {
-    return timer && timer.callAt >= from && timer.callAt <= to;
-}
-
-function mirrorDateProperties(target, source) {
-    if (source.now) {
-        target.now = function now() {
-            return target.clock.now;
-        };
-    } else {
-        delete target.now;
-    }
-
-    if (source.toSource) {
-        target.toSource = function toSource() {
-            return source.toSource();
-        };
-    } else {
-        delete target.toSource;
-    }
-
-    target.toString = function toString() {
-        return source.toString();
-    };
-
-    target.prototype = source.prototype;
-    target.parse = source.parse;
-    target.UTC = source.UTC;
-    target.prototype.toUTCString = source.prototype.toUTCString;
-
-    for (var prop in source) {
-        if (source.hasOwnProperty(prop)) {
-            target[prop] = source[prop];
-        }
-    }
-
-    return target;
-}
-
-function createDate() {
-    function ClockDate(year, month, date, hour, minute, second, ms) {
-        // Defensive and verbose to avoid potential harm in passing
-        // explicit undefined when user does not pass argument
-        switch (arguments.length) {
-        case 0:
-            return new NativeDate(ClockDate.clock.now);
-        case 1:
-            return new NativeDate(year);
-        case 2:
-            return new NativeDate(year, month);
-        case 3:
-            return new NativeDate(year, month, date);
-        case 4:
-            return new NativeDate(year, month, date, hour);
-        case 5:
-            return new NativeDate(year, month, date, hour, minute);
-        case 6:
-            return new NativeDate(year, month, date, hour, minute, second);
-        default:
-            return new NativeDate(year, month, date, hour, minute, second, ms);
-        }
-    }
-
-    return mirrorDateProperties(ClockDate, NativeDate);
-}
-
-function addTimer(clock, timer) {
-    if (typeof timer.func === "undefined") {
-        throw new Error("Callback must be provided to timer calls");
-    }
-
-    if (!clock.timers) {
-        clock.timers = {};
-    }
-
-    timer.id = id++;
-    timer.createdAt = clock.now;
-    timer.callAt = clock.now + (timer.delay || 0);
-
-    clock.timers[timer.id] = timer;
-
-    if (addTimerReturnsObject) {
-        return {
-            id: timer.id,
-            ref: function() {},
-            unref: function() {}
-        };
-    }
-    else {
-        return timer.id;
-    }
-}
-
-function firstTimerInRange(clock, from, to) {
-    var timers = clock.timers, timer = null;
-
-    for (var id in timers) {
-        if (!inRange(from, to, timers[id])) {
-            continue;
-        }
-
-        if (!timer || ~compareTimers(timer, timers[id])) {
-            timer = timers[id];
-        }
-    }
-
-    return timer;
-}
-
-function compareTimers(a, b) {
-    // Sort first by absolute timing
-    if (a.callAt < b.callAt) {
-        return -1;
-    }
-    if (a.callAt > b.callAt) {
-        return 1;
-    }
-
-    // Sort next by immediate, immediate timers take precedence
-    if (a.immediate && !b.immediate) {
-        return -1;
-    }
-    if (!a.immediate && b.immediate) {
-        return 1;
-    }
-
-    // Sort next by creation time, earlier-created timers take precedence
-    if (a.createdAt < b.createdAt) {
-        return -1;
-    }
-    if (a.createdAt > b.createdAt) {
-        return 1;
-    }
-
-    // Sort next by id, lower-id timers take precedence
-    if (a.id < b.id) {
-        return -1;
-    }
-    if (a.id > b.id) {
-        return 1;
-    }
-
-    // As timer ids are unique, no fallback `0` is necessary
-}
-
-function callTimer(clock, timer) {
-    if (typeof timer.interval == "number") {
-        clock.timers[timer.id].callAt += timer.interval;
-    } else {
-        delete clock.timers[timer.id];
-    }
-
-    try {
-        if (typeof timer.func == "function") {
-            timer.func.apply(null, timer.args);
-        } else {
-            eval(timer.func);
-        }
-    } catch (e) {
-        var exception = e;
-    }
-
-    if (!clock.timers[timer.id]) {
-        if (exception) {
-            throw exception;
-        }
-        return;
-    }
-
-    if (exception) {
-        throw exception;
-    }
-}
-
-function uninstall(clock, target) {
-    var method;
-
-    for (var i = 0, l = clock.methods.length; i < l; i++) {
-        method = clock.methods[i];
-
-        if (target[method].hadOwnProperty) {
-            target[method] = clock["_" + method];
-        } else {
-            try {
-                delete target[method];
-            } catch (e) {}
-        }
-    }
-
-    // Prevent multiple executions which will completely remove these props
-    clock.methods = [];
-}
-
-function hijackMethod(target, method, clock) {
-    clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(target, method);
-    clock["_" + method] = target[method];
-
-    if (method == "Date") {
-        var date = mirrorDateProperties(clock[method], target[method]);
-        target[method] = date;
-    } else {
-        target[method] = function () {
-            return clock[method].apply(clock, arguments);
-        };
-
-        for (var prop in clock[method]) {
-            if (clock[method].hasOwnProperty(prop)) {
-                target[method][prop] = clock[method][prop];
-            }
-        }
-    }
-
-    target[method].clock = clock;
-}
-
-var timers = {
-    setTimeout: setTimeout,
-    clearTimeout: clearTimeout,
-    setImmediate: (typeof setImmediate !== "undefined" ? setImmediate : undefined),
-    clearImmediate: (typeof clearImmediate !== "undefined" ? clearImmediate: undefined),
-    setInterval: setInterval,
-    clearInterval: clearInterval,
-    Date: Date
-};
-
-var keys = Object.keys || function (obj) {
-    var ks = [];
-    for (var key in obj) {
-        ks.push(key);
-    }
-    return ks;
-};
-
-exports.timers = timers;
-
-var createClock = exports.createClock = function (now) {
-    var clock = {
-        now: getEpoch(now),
-        timeouts: {},
-        Date: createDate()
-    };
-
-    clock.Date.clock = clock;
-
-    clock.setTimeout = function setTimeout(func, timeout) {
-        return addTimer(clock, {
-            func: func,
-            args: Array.prototype.slice.call(arguments, 2),
-            delay: timeout
-        });
-    };
-
-    clock.clearTimeout = function clearTimeout(timerId) {
-        if (!timerId) {
-            // null appears to be allowed in most browsers, and appears to be
-            // relied upon by some libraries, like Bootstrap carousel
-            return;
-        }
-        if (!clock.timers) {
-            clock.timers = [];
-        }
-        // in Node, timerId is an object with .ref()/.unref(), and
-        // its .id field is the actual timer id.
-        if (typeof timerId === "object") {
-            timerId = timerId.id
-        }
-        if (timerId in clock.timers) {
-            delete clock.timers[timerId];
-        }
-    };
-
-    clock.setInterval = function setInterval(func, timeout) {
-        return addTimer(clock, {
-            func: func,
-            args: Array.prototype.slice.call(arguments, 2),
-            delay: timeout,
-            interval: timeout
-        });
-    };
-
-    clock.clearInterval = function clearInterval(timerId) {
-        clock.clearTimeout(timerId);
-    };
-
-    clock.setImmediate = function setImmediate(func) {
-        return addTimer(clock, {
-            func: func,
-            args: Array.prototype.slice.call(arguments, 1),
-            immediate: true
-        });
-    };
-
-    clock.clearImmediate = function clearImmediate(timerId) {
-        clock.clearTimeout(timerId);
-    };
-
-    clock.tick = function tick(ms) {
-        ms = typeof ms == "number" ? ms : parseTime(ms);
-        var tickFrom = clock.now, tickTo = clock.now + ms, previous = clock.now;
-        var timer = firstTimerInRange(clock, tickFrom, tickTo);
-
-        var firstException;
-        while (timer && tickFrom <= tickTo) {
-            if (clock.timers[timer.id]) {
-                tickFrom = clock.now = timer.callAt;
-                try {
-                    callTimer(clock, timer);
-                } catch (e) {
-                    firstException = firstException || e;
-                }
-            }
-
-            timer = firstTimerInRange(clock, previous, tickTo);
-            previous = tickFrom;
-        }
-
-        clock.now = tickTo;
-
-        if (firstException) {
-            throw firstException;
-        }
-
-        return clock.now;
-    };
-
-    clock.reset = function reset() {
-        clock.timers = {};
-    };
-
-    return clock;
-};
-
-exports.install = function install(target, now, toFake) {
-    if (typeof target === "number") {
-        toFake = now;
-        now = target;
-        target = null;
-    }
-
-    if (!target) {
-        target = global;
-    }
-
-    var clock = createClock(now);
-
-    clock.uninstall = function () {
-        uninstall(clock, target);
-    };
-
-    clock.methods = toFake || [];
-
-    if (clock.methods.length === 0) {
-        clock.methods = keys(timers);
-    }
-
-    for (var i = 0, l = clock.methods.length; i < l; i++) {
-        hijackMethod(target, clock.methods[i], clock);
-    }
-
-    return clock;
-};
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{}]},{},[1])(1)
-});
-  })();
-  var define;
-/**
- * Sinon core utilities. For internal use only.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-var sinon = (function () {
-"use strict";
-
-    var sinon;
-    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        sinon = module.exports = require("./sinon/util/core");
-        require("./sinon/extend");
-        require("./sinon/typeOf");
-        require("./sinon/times_in_words");
-        require("./sinon/spy");
-        require("./sinon/call");
-        require("./sinon/behavior");
-        require("./sinon/stub");
-        require("./sinon/mock");
-        require("./sinon/collection");
-        require("./sinon/assert");
-        require("./sinon/sandbox");
-        require("./sinon/test");
-        require("./sinon/test_case");
-        require("./sinon/match");
-        require("./sinon/format");
-        require("./sinon/log_error");
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-        sinon = module.exports;
-    } else {
-        sinon = {};
-    }
-
-    return sinon;
-}());
-
-/**
- * @depend ../../sinon.js
- */
-/**
- * Sinon core utilities. For internal use only.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    var div = typeof document != "undefined" && document.createElement("div");
-    var hasOwn = Object.prototype.hasOwnProperty;
-
-    function isDOMNode(obj) {
-        var success = false;
-
-        try {
-            obj.appendChild(div);
-            success = div.parentNode == obj;
-        } catch (e) {
-            return false;
-        } finally {
-            try {
-                obj.removeChild(div);
-            } catch (e) {
-                // Remove failed, not much we can do about that
-            }
-        }
-
-        return success;
-    }
-
-    function isElement(obj) {
-        return div && obj && obj.nodeType === 1 && isDOMNode(obj);
-    }
-
-    function isFunction(obj) {
-        return typeof obj === "function" || !!(obj && obj.constructor && obj.call && obj.apply);
-    }
-
-    function isReallyNaN(val) {
-        return typeof val === "number" && isNaN(val);
-    }
-
-    function mirrorProperties(target, source) {
-        for (var prop in source) {
-            if (!hasOwn.call(target, prop)) {
-                target[prop] = source[prop];
-            }
-        }
-    }
-
-    function isRestorable(obj) {
-        return typeof obj === "function" && typeof obj.restore === "function" && obj.restore.sinon;
-    }
-
-    // Cheap way to detect if we have ES5 support.
-    var hasES5Support = "keys" in Object;
-
-    function makeApi(sinon) {
-        sinon.wrapMethod = function wrapMethod(object, property, method) {
-            if (!object) {
-                throw new TypeError("Should wrap property of object");
-            }
-
-            if (typeof method != "function" && typeof method != "object") {
-                throw new TypeError("Method wrapper should be a function or a property descriptor");
-            }
-
-            function checkWrappedMethod(wrappedMethod) {
-                if (!isFunction(wrappedMethod)) {
-                    error = new TypeError("Attempted to wrap " + (typeof wrappedMethod) + " property " +
-                                        property + " as function");
-                } else if (wrappedMethod.restore && wrappedMethod.restore.sinon) {
-                    error = new TypeError("Attempted to wrap " + property + " which is already wrapped");
-                } else if (wrappedMethod.calledBefore) {
-                    var verb = !!wrappedMethod.returns ? "stubbed" : "spied on";
-                    error = new TypeError("Attempted to wrap " + property + " which is already " + verb);
-                }
-
-                if (error) {
-                    if (wrappedMethod && wrappedMethod.stackTrace) {
-                        error.stack += "\n--------------\n" + wrappedMethod.stackTrace;
-                    }
-                    throw error;
-                }
-            }
-
-            var error, wrappedMethod;
-
-            // IE 8 does not support hasOwnProperty on the window object and Firefox has a problem
-            // when using hasOwn.call on objects from other frames.
-            var owned = object.hasOwnProperty ? object.hasOwnProperty(property) : hasOwn.call(object, property);
-
-            if (hasES5Support) {
-                var methodDesc = (typeof method == "function") ? {value: method} : method,
-                    wrappedMethodDesc = sinon.getPropertyDescriptor(object, property),
-                    i;
-
-                if (!wrappedMethodDesc) {
-                    error = new TypeError("Attempted to wrap " + (typeof wrappedMethod) + " property " +
-                                        property + " as function");
-                } else if (wrappedMethodDesc.restore && wrappedMethodDesc.restore.sinon) {
-                    error = new TypeError("Attempted to wrap " + property + " which is already wrapped");
-                }
-                if (error) {
-                    if (wrappedMethodDesc && wrappedMethodDesc.stackTrace) {
-                        error.stack += "\n--------------\n" + wrappedMethodDesc.stackTrace;
-                    }
-                    throw error;
-                }
-
-                var types = sinon.objectKeys(methodDesc);
-                for (i = 0; i < types.length; i++) {
-                    wrappedMethod = wrappedMethodDesc[types[i]];
-                    checkWrappedMethod(wrappedMethod);
-                }
-
-                mirrorProperties(methodDesc, wrappedMethodDesc);
-                for (i = 0; i < types.length; i++) {
-                    mirrorProperties(methodDesc[types[i]], wrappedMethodDesc[types[i]]);
-                }
-                Object.defineProperty(object, property, methodDesc);
-            } else {
-                wrappedMethod = object[property];
-                checkWrappedMethod(wrappedMethod);
-                object[property] = method;
-                method.displayName = property;
-            }
-
-            method.displayName = property;
-
-            // Set up a stack trace which can be used later to find what line of
-            // code the original method was created on.
-            method.stackTrace = (new Error("Stack Trace for original")).stack;
-
-            method.restore = function () {
-                // For prototype properties try to reset by delete first.
-                // If this fails (ex: localStorage on mobile safari) then force a reset
-                // via direct assignment.
-                if (!owned) {
-                    // In some cases `delete` may throw an error
-                    try {
-                        delete object[property];
-                    } catch (e) {}
-                    // For native code functions `delete` fails without throwing an error
-                    // on Chrome < 43, PhantomJS, etc.
-                } else if (hasES5Support) {
-                    Object.defineProperty(object, property, wrappedMethodDesc);
-                }
-
-                // Use strict equality comparison to check failures then force a reset
-                // via direct assignment.
-                if (object[property] === method) {
-                    object[property] = wrappedMethod;
-                }
-            };
-
-            method.restore.sinon = true;
-
-            if (!hasES5Support) {
-                mirrorProperties(method, wrappedMethod);
-            }
-
-            return method;
-        };
-
-        sinon.create = function create(proto) {
-            var F = function () {};
-            F.prototype = proto;
-            return new F();
-        };
-
-        sinon.deepEqual = function deepEqual(a, b) {
-            if (sinon.match && sinon.match.isMatcher(a)) {
-                return a.test(b);
-            }
-
-            if (typeof a != "object" || typeof b != "object") {
-                if (isReallyNaN(a) && isReallyNaN(b)) {
-                    return true;
-                } else {
-                    return a === b;
-                }
-            }
-
-            if (isElement(a) || isElement(b)) {
-                return a === b;
-            }
-
-            if (a === b) {
-                return true;
-            }
-
-            if ((a === null && b !== null) || (a !== null && b === null)) {
-                return false;
-            }
-
-            if (a instanceof RegExp && b instanceof RegExp) {
-                return (a.source === b.source) && (a.global === b.global) &&
-                    (a.ignoreCase === b.ignoreCase) && (a.multiline === b.multiline);
-            }
-
-            var aString = Object.prototype.toString.call(a);
-            if (aString != Object.prototype.toString.call(b)) {
-                return false;
-            }
-
-            if (aString == "[object Date]") {
-                return a.valueOf() === b.valueOf();
-            }
-
-            var prop, aLength = 0, bLength = 0;
-
-            if (aString == "[object Array]" && a.length !== b.length) {
-                return false;
-            }
-
-            for (prop in a) {
-                aLength += 1;
-
-                if (!(prop in b)) {
-                    return false;
-                }
-
-                if (!deepEqual(a[prop], b[prop])) {
-                    return false;
-                }
-            }
-
-            for (prop in b) {
-                bLength += 1;
-            }
-
-            return aLength == bLength;
-        };
-
-        sinon.functionName = function functionName(func) {
-            var name = func.displayName || func.name;
-
-            // Use function decomposition as a last resort to get function
-            // name. Does not rely on function decomposition to work - if it
-            // doesn't debugging will be slightly less informative
-            // (i.e. toString will say 'spy' rather than 'myFunc').
-            if (!name) {
-                var matches = func.toString().match(/function ([^\s\(]+)/);
-                name = matches && matches[1];
-            }
-
-            return name;
-        };
-
-        sinon.functionToString = function toString() {
-            if (this.getCall && this.callCount) {
-                var thisValue, prop, i = this.callCount;
-
-                while (i--) {
-                    thisValue = this.getCall(i).thisValue;
-
-                    for (prop in thisValue) {
-                        if (thisValue[prop] === this) {
-                            return prop;
-                        }
-                    }
-                }
-            }
-
-            return this.displayName || "sinon fake";
-        };
-
-        sinon.objectKeys = function objectKeys(obj) {
-            if (obj !== Object(obj)) {
-                throw new TypeError("sinon.objectKeys called on a non-object");
-            }
-
-            var keys = [];
-            var key;
-            for (key in obj) {
-                if (hasOwn.call(obj, key)) {
-                    keys.push(key);
-                }
-            }
-
-            return keys;
-        };
-
-        sinon.getPropertyDescriptor = function getPropertyDescriptor(object, property) {
-            var proto = object, descriptor;
-            while (proto && !(descriptor = Object.getOwnPropertyDescriptor(proto, property))) {
-                proto = Object.getPrototypeOf(proto);
-            }
-            return descriptor;
-        }
-
-        sinon.getConfig = function (custom) {
-            var config = {};
-            custom = custom || {};
-            var defaults = sinon.defaultConfig;
-
-            for (var prop in defaults) {
-                if (defaults.hasOwnProperty(prop)) {
-                    config[prop] = custom.hasOwnProperty(prop) ? custom[prop] : defaults[prop];
-                }
-            }
-
-            return config;
-        };
-
-        sinon.defaultConfig = {
-            injectIntoThis: true,
-            injectInto: null,
-            properties: ["spy", "stub", "mock", "clock", "server", "requests"],
-            useFakeTimers: true,
-            useFakeServer: true
-        };
-
-        sinon.timesInWords = function timesInWords(count) {
-            return count == 1 && "once" ||
-                count == 2 && "twice" ||
-                count == 3 && "thrice" ||
-                (count || 0) + " times";
-        };
-
-        sinon.calledInOrder = function (spies) {
-            for (var i = 1, l = spies.length; i < l; i++) {
-                if (!spies[i - 1].calledBefore(spies[i]) || !spies[i].called) {
-                    return false;
-                }
-            }
-
-            return true;
-        };
-
-        sinon.orderByFirstCall = function (spies) {
-            return spies.sort(function (a, b) {
-                // uuid, won't ever be equal
-                var aCall = a.getCall(0);
-                var bCall = b.getCall(0);
-                var aId = aCall && aCall.callId || -1;
-                var bId = bCall && bCall.callId || -1;
-
-                return aId < bId ? -1 : 1;
-            });
-        };
-
-        sinon.createStubInstance = function (constructor) {
-            if (typeof constructor !== "function") {
-                throw new TypeError("The constructor should be a function.");
-            }
-            return sinon.stub(sinon.create(constructor.prototype));
-        };
-
-        sinon.restore = function (object) {
-            if (object !== null && typeof object === "object") {
-                for (var prop in object) {
-                    if (isRestorable(object[prop])) {
-                        object[prop].restore();
-                    }
-                }
-            } else if (isRestorable(object)) {
-                object.restore();
-            }
-        };
-
-        return sinon;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports) {
-        makeApi(exports);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend util/core.js
- */
-
-(function (sinon) {
-    function makeApi(sinon) {
-
-        // Adapted from https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug
-        var hasDontEnumBug = (function () {
-            var obj = {
-                constructor: function () {
-                    return "0";
-                },
-                toString: function () {
-                    return "1";
-                },
-                valueOf: function () {
-                    return "2";
-                },
-                toLocaleString: function () {
-                    return "3";
-                },
-                prototype: function () {
-                    return "4";
-                },
-                isPrototypeOf: function () {
-                    return "5";
-                },
-                propertyIsEnumerable: function () {
-                    return "6";
-                },
-                hasOwnProperty: function () {
-                    return "7";
-                },
-                length: function () {
-                    return "8";
-                },
-                unique: function () {
-                    return "9"
-                }
-            };
-
-            var result = [];
-            for (var prop in obj) {
-                result.push(obj[prop]());
-            }
-            return result.join("") !== "0123456789";
-        })();
-
-        /* Public: Extend target in place with all (own) properties from sources in-order. Thus, last source will
-         *         override properties in previous sources.
-         *
-         * target - The Object to extend
-         * sources - Objects to copy properties from.
-         *
-         * Returns the extended target
-         */
-        function extend(target /*, sources */) {
-            var sources = Array.prototype.slice.call(arguments, 1),
-                source, i, prop;
-
-            for (i = 0; i < sources.length; i++) {
-                source = sources[i];
-
-                for (prop in source) {
-                    if (source.hasOwnProperty(prop)) {
-                        target[prop] = source[prop];
-                    }
-                }
-
-                // Make sure we copy (own) toString method even when in JScript with DontEnum bug
-                // See https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug
-                if (hasDontEnumBug && source.hasOwnProperty("toString") && source.toString !== target.toString) {
-                    target.toString = source.toString;
-                }
-            }
-
-            return target;
-        };
-
-        sinon.extend = extend;
-        return sinon.extend;
-    }
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        module.exports = makeApi(sinon);
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend util/core.js
- */
-
-(function (sinon) {
-    function makeApi(sinon) {
-
-        function timesInWords(count) {
-            switch (count) {
-                case 1:
-                    return "once";
-                case 2:
-                    return "twice";
-                case 3:
-                    return "thrice";
-                default:
-                    return (count || 0) + " times";
-            }
-        }
-
-        sinon.timesInWords = timesInWords;
-        return sinon.timesInWords;
-    }
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        module.exports = makeApi(sinon);
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend util/core.js
- */
-/**
- * Format functions
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2014 Christian Johansen
- */
-
-(function (sinon, formatio) {
-    function makeApi(sinon) {
-        function typeOf(value) {
-            if (value === null) {
-                return "null";
-            } else if (value === undefined) {
-                return "undefined";
-            }
-            var string = Object.prototype.toString.call(value);
-            return string.substring(8, string.length - 1).toLowerCase();
-        };
-
-        sinon.typeOf = typeOf;
-        return sinon.typeOf;
-    }
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        module.exports = makeApi(sinon);
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(
-    (typeof sinon == "object" && sinon || null),
-    (typeof formatio == "object" && formatio)
-));
-
-/**
- * @depend util/core.js
- * @depend typeOf.js
- */
-/*jslint eqeqeq: false, onevar: false, plusplus: false*/
-/*global module, require, sinon*/
-/**
- * Match functions
- *
- * @author Maximilian Antoni (mail@maxantoni.de)
- * @license BSD
- *
- * Copyright (c) 2012 Maximilian Antoni
- */
-
-(function (sinon) {
-    function makeApi(sinon) {
-        function assertType(value, type, name) {
-            var actual = sinon.typeOf(value);
-            if (actual !== type) {
-                throw new TypeError("Expected type of " + name + " to be " +
-                    type + ", but was " + actual);
-            }
-        }
-
-        var matcher = {
-            toString: function () {
-                return this.message;
-            }
-        };
-
-        function isMatcher(object) {
-            return matcher.isPrototypeOf(object);
-        }
-
-        function matchObject(expectation, actual) {
-            if (actual === null || actual === undefined) {
-                return false;
-            }
-            for (var key in expectation) {
-                if (expectation.hasOwnProperty(key)) {
-                    var exp = expectation[key];
-                    var act = actual[key];
-                    if (match.isMatcher(exp)) {
-                        if (!exp.test(act)) {
-                            return false;
-                        }
-                    } else if (sinon.typeOf(exp) === "object") {
-                        if (!matchObject(exp, act)) {
-                            return false;
-                        }
-                    } else if (!sinon.deepEqual(exp, act)) {
-                        return false;
-                    }
-                }
-            }
-            return true;
-        }
-
-        matcher.or = function (m2) {
-            if (!arguments.length) {
-                throw new TypeError("Matcher expected");
-            } else if (!isMatcher(m2)) {
-                m2 = match(m2);
-            }
-            var m1 = this;
-            var or = sinon.create(matcher);
-            or.test = function (actual) {
-                return m1.test(actual) || m2.test(actual);
-            };
-            or.message = m1.message + ".or(" + m2.message + ")";
-            return or;
-        };
-
-        matcher.and = function (m2) {
-            if (!arguments.length) {
-                throw new TypeError("Matcher expected");
-            } else if (!isMatcher(m2)) {
-                m2 = match(m2);
-            }
-            var m1 = this;
-            var and = sinon.create(matcher);
-            and.test = function (actual) {
-                return m1.test(actual) && m2.test(actual);
-            };
-            and.message = m1.message + ".and(" + m2.message + ")";
-            return and;
-        };
-
-        var match = function (expectation, message) {
-            var m = sinon.create(matcher);
-            var type = sinon.typeOf(expectation);
-            switch (type) {
-            case "object":
-                if (typeof expectation.test === "function") {
-                    m.test = function (actual) {
-                        return expectation.test(actual) === true;
-                    };
-                    m.message = "match(" + sinon.functionName(expectation.test) + ")";
-                    return m;
-                }
-                var str = [];
-                for (var key in expectation) {
-                    if (expectation.hasOwnProperty(key)) {
-                        str.push(key + ": " + expectation[key]);
-                    }
-                }
-                m.test = function (actual) {
-                    return matchObject(expectation, actual);
-                };
-                m.message = "match(" + str.join(", ") + ")";
-                break;
-            case "number":
-                m.test = function (actual) {
-                    return expectation == actual;
-                };
-                break;
-            case "string":
-                m.test = function (actual) {
-                    if (typeof actual !== "string") {
-                        return false;
-                    }
-                    return actual.indexOf(expectation) !== -1;
-                };
-                m.message = "match(\"" + expectation + "\")";
-                break;
-            case "regexp":
-                m.test = function (actual) {
-                    if (typeof actual !== "string") {
-                        return false;
-                    }
-                    return expectation.test(actual);
-                };
-                break;
-            case "function":
-                m.test = expectation;
-                if (message) {
-                    m.message = message;
-                } else {
-                    m.message = "match(" + sinon.functionName(expectation) + ")";
-                }
-                break;
-            default:
-                m.test = function (actual) {
-                    return sinon.deepEqual(expectation, actual);
-                };
-            }
-            if (!m.message) {
-                m.message = "match(" + expectation + ")";
-            }
-            return m;
-        };
-
-        match.isMatcher = isMatcher;
-
-        match.any = match(function () {
-            return true;
-        }, "any");
-
-        match.defined = match(function (actual) {
-            return actual !== null && actual !== undefined;
-        }, "defined");
-
-        match.truthy = match(function (actual) {
-            return !!actual;
-        }, "truthy");
-
-        match.falsy = match(function (actual) {
-            return !actual;
-        }, "falsy");
-
-        match.same = function (expectation) {
-            return match(function (actual) {
-                return expectation === actual;
-            }, "same(" + expectation + ")");
-        };
-
-        match.typeOf = function (type) {
-            assertType(type, "string", "type");
-            return match(function (actual) {
-                return sinon.typeOf(actual) === type;
-            }, "typeOf(\"" + type + "\")");
-        };
-
-        match.instanceOf = function (type) {
-            assertType(type, "function", "type");
-            return match(function (actual) {
-                return actual instanceof type;
-            }, "instanceOf(" + sinon.functionName(type) + ")");
-        };
-
-        function createPropertyMatcher(propertyTest, messagePrefix) {
-            return function (property, value) {
-                assertType(property, "string", "property");
-                var onlyProperty = arguments.length === 1;
-                var message = messagePrefix + "(\"" + property + "\"";
-                if (!onlyProperty) {
-                    message += ", " + value;
-                }
-                message += ")";
-                return match(function (actual) {
-                    if (actual === undefined || actual === null ||
-                            !propertyTest(actual, property)) {
-                        return false;
-                    }
-                    return onlyProperty || sinon.deepEqual(value, actual[property]);
-                }, message);
-            };
-        }
-
-        match.has = createPropertyMatcher(function (actual, property) {
-            if (typeof actual === "object") {
-                return property in actual;
-            }
-            return actual[property] !== undefined;
-        }, "has");
-
-        match.hasOwn = createPropertyMatcher(function (actual, property) {
-            return actual.hasOwnProperty(property);
-        }, "hasOwn");
-
-        match.bool = match.typeOf("boolean");
-        match.number = match.typeOf("number");
-        match.string = match.typeOf("string");
-        match.object = match.typeOf("object");
-        match.func = match.typeOf("function");
-        match.array = match.typeOf("array");
-        match.regexp = match.typeOf("regexp");
-        match.date = match.typeOf("date");
-
-        sinon.match = match;
-        return match;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./typeOf");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend util/core.js
- */
-/**
- * Format functions
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2014 Christian Johansen
- */
-
-(function (sinon, formatio) {
-    function makeApi(sinon) {
-        function valueFormatter(value) {
-            return "" + value;
-        }
-
-        function getFormatioFormatter() {
-            var formatter = formatio.configure({
-                    quoteStrings: false,
-                    limitChildrenCount: 250
-                });
-
-            function format() {
-                return formatter.ascii.apply(formatter, arguments);
-            };
-
-            return format;
-        }
-
-        function getNodeFormatter(value) {
-            function format(value) {
-                return typeof value == "object" && value.toString === Object.prototype.toString ? util.inspect(value) : value;
-            };
-
-            try {
-                var util = require("util");
-            } catch (e) {
-                /* Node, but no util module - would be very old, but better safe than sorry */
-            }
-
-            return util ? format : valueFormatter;
-        }
-
-        var isNode = typeof module !== "undefined" && module.exports && typeof require == "function",
-            formatter;
-
-        if (isNode) {
-            try {
-                formatio = require("formatio");
-            } catch (e) {}
-        }
-
-        if (formatio) {
-            formatter = getFormatioFormatter()
-        } else if (isNode) {
-            formatter = getNodeFormatter();
-        } else {
-            formatter = valueFormatter;
-        }
-
-        sinon.format = formatter;
-        return sinon.format;
-    }
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        module.exports = makeApi(sinon);
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(
-    (typeof sinon == "object" && sinon || null),
-    (typeof formatio == "object" && formatio)
-));
-
-/**
-  * @depend util/core.js
-  * @depend match.js
-  * @depend format.js
-  */
-/**
-  * Spy calls
-  *
-  * @author Christian Johansen (christian@cjohansen.no)
-  * @author Maximilian Antoni (mail@maxantoni.de)
-  * @license BSD
-  *
-  * Copyright (c) 2010-2013 Christian Johansen
-  * Copyright (c) 2013 Maximilian Antoni
-  */
-
-(function (sinon) {
-    function makeApi(sinon) {
-        function throwYieldError(proxy, text, args) {
-            var msg = sinon.functionName(proxy) + text;
-            if (args.length) {
-                msg += " Received [" + slice.call(args).join(", ") + "]";
-            }
-            throw new Error(msg);
-        }
-
-        var slice = Array.prototype.slice;
-
-        var callProto = {
-            calledOn: function calledOn(thisValue) {
-                if (sinon.match && sinon.match.isMatcher(thisValue)) {
-                    return thisValue.test(this.thisValue);
-                }
-                return this.thisValue === thisValue;
-            },
-
-            calledWith: function calledWith() {
-                var l = arguments.length;
-                if (l > this.args.length) {
-                    return false;
-                }
-                for (var i = 0; i < l; i += 1) {
-                    if (!sinon.deepEqual(arguments[i], this.args[i])) {
-                        return false;
-                    }
-                }
-
-                return true;
-            },
-
-            calledWithMatch: function calledWithMatch() {
-                var l = arguments.length;
-                if (l > this.args.length) {
-                    return false;
-                }
-                for (var i = 0; i < l; i += 1) {
-                    var actual = this.args[i];
-                    var expectation = arguments[i];
-                    if (!sinon.match || !sinon.match(expectation).test(actual)) {
-                        return false;
-                    }
-                }
-                return true;
-            },
-
-            calledWithExactly: function calledWithExactly() {
-                return arguments.length == this.args.length &&
-                    this.calledWith.apply(this, arguments);
-            },
-
-            notCalledWith: function notCalledWith() {
-                return !this.calledWith.apply(this, arguments);
-            },
-
-            notCalledWithMatch: function notCalledWithMatch() {
-                return !this.calledWithMatch.apply(this, arguments);
-            },
-
-            returned: function returned(value) {
-                return sinon.deepEqual(value, this.returnValue);
-            },
-
-            threw: function threw(error) {
-                if (typeof error === "undefined" || !this.exception) {
-                    return !!this.exception;
-                }
-
-                return this.exception === error || this.exception.name === error;
-            },
-
-            calledWithNew: function calledWithNew() {
-                return this.proxy.prototype && this.thisValue instanceof this.proxy;
-            },
-
-            calledBefore: function (other) {
-                return this.callId < other.callId;
-            },
-
-            calledAfter: function (other) {
-                return this.callId > other.callId;
-            },
-
-            callArg: function (pos) {
-                this.args[pos]();
-            },
-
-            callArgOn: function (pos, thisValue) {
-                this.args[pos].apply(thisValue);
-            },
-
-            callArgWith: function (pos) {
-                this.callArgOnWith.apply(this, [pos, null].concat(slice.call(arguments, 1)));
-            },
-
-            callArgOnWith: function (pos, thisValue) {
-                var args = slice.call(arguments, 2);
-                this.args[pos].apply(thisValue, args);
-            },
-
-            yield: function () {
-                this.yieldOn.apply(this, [null].concat(slice.call(arguments, 0)));
-            },
-
-            yieldOn: function (thisValue) {
-                var args = this.args;
-                for (var i = 0, l = args.length; i < l; ++i) {
-                    if (typeof args[i] === "function") {
-                        args[i].apply(thisValue, slice.call(arguments, 1));
-                        return;
-                    }
-                }
-                throwYieldError(this.proxy, " cannot yield since no callback was passed.", args);
-            },
-
-            yieldTo: function (prop) {
-                this.yieldToOn.apply(this, [prop, null].concat(slice.call(arguments, 1)));
-            },
-
-            yieldToOn: function (prop, thisValue) {
-                var args = this.args;
-                for (var i = 0, l = args.length; i < l; ++i) {
-                    if (args[i] && typeof args[i][prop] === "function") {
-                        args[i][prop].apply(thisValue, slice.call(arguments, 2));
-                        return;
-                    }
-                }
-                throwYieldError(this.proxy, " cannot yield to '" + prop +
-                    "' since no callback was passed.", args);
-            },
-
-            toString: function () {
-                var callStr = this.proxy.toString() + "(";
-                var args = [];
-
-                for (var i = 0, l = this.args.length; i < l; ++i) {
-                    args.push(sinon.format(this.args[i]));
-                }
-
-                callStr = callStr + args.join(", ") + ")";
-
-                if (typeof this.returnValue != "undefined") {
-                    callStr += " => " + sinon.format(this.returnValue);
-                }
-
-                if (this.exception) {
-                    callStr += " !" + this.exception.name;
-
-                    if (this.exception.message) {
-                        callStr += "(" + this.exception.message + ")";
-                    }
-                }
-
-                return callStr;
-            }
-        };
-
-        callProto.invokeCallback = callProto.yield;
-
-        function createSpyCall(spy, thisValue, args, returnValue, exception, id) {
-            if (typeof id !== "number") {
-                throw new TypeError("Call id is not a number");
-            }
-            var proxyCall = sinon.create(callProto);
-            proxyCall.proxy = spy;
-            proxyCall.thisValue = thisValue;
-            proxyCall.args = args;
-            proxyCall.returnValue = returnValue;
-            proxyCall.exception = exception;
-            proxyCall.callId = id;
-
-            return proxyCall;
-        }
-        createSpyCall.toString = callProto.toString; // used by mocks
-
-        sinon.spyCall = createSpyCall;
-        return createSpyCall;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./match");
-        require("./format");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
-  * @depend times_in_words.js
-  * @depend util/core.js
-  * @depend extend.js
-  * @depend call.js
-  * @depend format.js
-  */
-/**
-  * Spy functions
-  *
-  * @author Christian Johansen (christian@cjohansen.no)
-  * @license BSD
-  *
-  * Copyright (c) 2010-2013 Christian Johansen
-  */
-
-(function (sinon) {
-
-    function makeApi(sinon) {
-        var push = Array.prototype.push;
-        var slice = Array.prototype.slice;
-        var callId = 0;
-
-        function spy(object, property, types) {
-            if (!property && typeof object == "function") {
-                return spy.create(object);
-            }
-
-            if (!object && !property) {
-                return spy.create(function () { });
-            }
-
-            if (types) {
-                var methodDesc = sinon.getPropertyDescriptor(object, property);
-                for (var i = 0; i < types.length; i++) {
-                    methodDesc[types[i]] = spy.create(methodDesc[types[i]]);
-                }
-                return sinon.wrapMethod(object, property, methodDesc);
-            } else {
-                var method = object[property];
-                return sinon.wrapMethod(object, property, spy.create(method));
-            }
-        }
-
-        function matchingFake(fakes, args, strict) {
-            if (!fakes) {
-                return;
-            }
-
-            for (var i = 0, l = fakes.length; i < l; i++) {
-                if (fakes[i].matches(args, strict)) {
-                    return fakes[i];
-                }
-            }
-        }
-
-        function incrementCallCount() {
-            this.called = true;
-            this.callCount += 1;
-            this.notCalled = false;
-            this.calledOnce = this.callCount == 1;
-            this.calledTwice = this.callCount == 2;
-            this.calledThrice = this.callCount == 3;
-        }
-
-        function createCallProperties() {
-            this.firstCall = this.getCall(0);
-            this.secondCall = this.getCall(1);
-            this.thirdCall = this.getCall(2);
-            this.lastCall = this.getCall(this.callCount - 1);
-        }
-
-        var vars = "a,b,c,d,e,f,g,h,i,j,k,l";
-        function createProxy(func, proxyLength) {
-            // Retain the function length:
-            var p;
-            if (proxyLength) {
-                eval("p = (function proxy(" + vars.substring(0, proxyLength * 2 - 1) +
-                    ") { return p.invoke(func, this, slice.call(arguments)); });");
-            } else {
-                p = function proxy() {
-                    return p.invoke(func, this, slice.call(arguments));
-                };
-            }
-            p.isSinonProxy = true;
-            return p;
-        }
-
-        var uuid = 0;
-
-        // Public API
-        var spyApi = {
-            reset: function () {
-                if (this.invoking) {
-                    var err = new Error("Cannot reset Sinon function while invoking it. " +
-                                        "Move the call to .reset outside of the callback.");
-                    err.name = "InvalidResetException";
-                    throw err;
-                }
-
-                this.called = false;
-                this.notCalled = true;
-                this.calledOnce = false;
-                this.calledTwice = false;
-                this.calledThrice = false;
-                this.callCount = 0;
-                this.firstCall = null;
-                this.secondCall = null;
-                this.thirdCall = null;
-                this.lastCall = null;
-                this.args = [];
-                this.returnValues = [];
-                this.thisValues = [];
-                this.exceptions = [];
-                this.callIds = [];
-                if (this.fakes) {
-                    for (var i = 0; i < this.fakes.length; i++) {
-                        this.fakes[i].reset();
-                    }
-                }
-
-                return this;
-            },
-
-            create: function create(func, spyLength) {
-                var name;
-
-                if (typeof func != "function") {
-                    func = function () { };
-                } else {
-                    name = sinon.functionName(func);
-                }
-
-                if (!spyLength) {
-                    spyLength = func.length;
-                }
-
-                var proxy = createProxy(func, spyLength);
-
-                sinon.extend(proxy, spy);
-                delete proxy.create;
-                sinon.extend(proxy, func);
-
-                proxy.reset();
-                proxy.prototype = func.prototype;
-                proxy.displayName = name || "spy";
-                proxy.toString = sinon.functionToString;
-                proxy.instantiateFake = sinon.spy.create;
-                proxy.id = "spy#" + uuid++;
-
-                return proxy;
-            },
-
-            invoke: function invoke(func, thisValue, args) {
-                var matching = matchingFake(this.fakes, args);
-                var exception, returnValue;
-
-                incrementCallCount.call(this);
-                push.call(this.thisValues, thisValue);
-                push.call(this.args, args);
-                push.call(this.callIds, callId++);
-
-                // Make call properties available from within the spied function:
-                createCallProperties.call(this);
-
-                try {
-                    this.invoking = true;
-
-                    if (matching) {
-                        returnValue = matching.invoke(func, thisValue, args);
-                    } else {
-                        returnValue = (this.func || func).apply(thisValue, args);
-                    }
-
-                    var thisCall = this.getCall(this.callCount - 1);
-                    if (thisCall.calledWithNew() && typeof returnValue !== "object") {
-                        returnValue = thisValue;
-                    }
-                } catch (e) {
-                    exception = e;
-                } finally {
-                    delete this.invoking;
-                }
-
-                push.call(this.exceptions, exception);
-                push.call(this.returnValues, returnValue);
-
-                // Make return value and exception available in the calls:
-                createCallProperties.call(this);
-
-                if (exception !== undefined) {
-                    throw exception;
-                }
-
-                return returnValue;
-            },
-
-            named: function named(name) {
-                this.displayName = name;
-                return this;
-            },
-
-            getCall: function getCall(i) {
-                if (i < 0 || i >= this.callCount) {
-                    return null;
-                }
-
-                return sinon.spyCall(this, this.thisValues[i], this.args[i],
-                                        this.returnValues[i], this.exceptions[i],
-                                        this.callIds[i]);
-            },
-
-            getCalls: function () {
-                var calls = [];
-                var i;
-
-                for (i = 0; i < this.callCount; i++) {
-                    calls.push(this.getCall(i));
-                }
-
-                return calls;
-            },
-
-            calledBefore: function calledBefore(spyFn) {
-                if (!this.called) {
-                    return false;
-                }
-
-                if (!spyFn.called) {
-                    return true;
-                }
-
-                return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1];
-            },
-
-            calledAfter: function calledAfter(spyFn) {
-                if (!this.called || !spyFn.called) {
-                    return false;
-                }
-
-                return this.callIds[this.callCount - 1] > spyFn.callIds[spyFn.callCount - 1];
-            },
-
-            withArgs: function () {
-                var args = slice.call(arguments);
-
-                if (this.fakes) {
-                    var match = matchingFake(this.fakes, args, true);
-
-                    if (match) {
-                        return match;
-                    }
-                } else {
-                    this.fakes = [];
-                }
-
-                var original = this;
-                var fake = this.instantiateFake();
-                fake.matchingAguments = args;
-                fake.parent = this;
-                push.call(this.fakes, fake);
-
-                fake.withArgs = function () {
-                    return original.withArgs.apply(original, arguments);
-                };
-
-                for (var i = 0; i < this.args.length; i++) {
-                    if (fake.matches(this.args[i])) {
-                        incrementCallCount.call(fake);
-                        push.call(fake.thisValues, this.thisValues[i]);
-                        push.call(fake.args, this.args[i]);
-                        push.call(fake.returnValues, this.returnValues[i]);
-                        push.call(fake.exceptions, this.exceptions[i]);
-                        push.call(fake.callIds, this.callIds[i]);
-                    }
-                }
-                createCallProperties.call(fake);
-
-                return fake;
-            },
-
-            matches: function (args, strict) {
-                var margs = this.matchingAguments;
-
-                if (margs.length <= args.length &&
-                    sinon.deepEqual(margs, args.slice(0, margs.length))) {
-                    return !strict || margs.length == args.length;
-                }
-            },
-
-            printf: function (format) {
-                var spy = this;
-                var args = slice.call(arguments, 1);
-                var formatter;
-
-                return (format || "").replace(/%(.)/g, function (match, specifyer) {
-                    formatter = spyApi.formatters[specifyer];
-
-                    if (typeof formatter == "function") {
-                        return formatter.call(null, spy, args);
-                    } else if (!isNaN(parseInt(specifyer, 10))) {
-                        return sinon.format(args[specifyer - 1]);
-                    }
-
-                    return "%" + specifyer;
-                });
-            }
-        };
-
-        function delegateToCalls(method, matchAny, actual, notCalled) {
-            spyApi[method] = function () {
-                if (!this.called) {
-                    if (notCalled) {
-                        return notCalled.apply(this, arguments);
-                    }
-                    return false;
-                }
-
-                var currentCall;
-                var matches = 0;
-
-                for (var i = 0, l = this.callCount; i < l; i += 1) {
-                    currentCall = this.getCall(i);
-
-                    if (currentCall[actual || method].apply(currentCall, arguments)) {
-                        matches += 1;
-
-                        if (matchAny) {
-                            return true;
-                        }
-                    }
-                }
-
-                return matches === this.callCount;
-            };
-        }
-
-        delegateToCalls("calledOn", true);
-        delegateToCalls("alwaysCalledOn", false, "calledOn");
-        delegateToCalls("calledWith", true);
-        delegateToCalls("calledWithMatch", true);
-        delegateToCalls("alwaysCalledWith", false, "calledWith");
-        delegateToCalls("alwaysCalledWithMatch", false, "calledWithMatch");
-        delegateToCalls("calledWithExactly", true);
-        delegateToCalls("alwaysCalledWithExactly", false, "calledWithExactly");
-        delegateToCalls("neverCalledWith", false, "notCalledWith", function () {
-            return true;
-        });
-        delegateToCalls("neverCalledWithMatch", false, "notCalledWithMatch", function () {
-            return true;
-        });
-        delegateToCalls("threw", true);
-        delegateToCalls("alwaysThrew", false, "threw");
-        delegateToCalls("returned", true);
-        delegateToCalls("alwaysReturned", false, "returned");
-        delegateToCalls("calledWithNew", true);
-        delegateToCalls("alwaysCalledWithNew", false, "calledWithNew");
-        delegateToCalls("callArg", false, "callArgWith", function () {
-            throw new Error(this.toString() + " cannot call arg since it was not yet invoked.");
-        });
-        spyApi.callArgWith = spyApi.callArg;
-        delegateToCalls("callArgOn", false, "callArgOnWith", function () {
-            throw new Error(this.toString() + " cannot call arg since it was not yet invoked.");
-        });
-        spyApi.callArgOnWith = spyApi.callArgOn;
-        delegateToCalls("yield", false, "yield", function () {
-            throw new Error(this.toString() + " cannot yield since it was not yet invoked.");
-        });
-        // "invokeCallback" is an alias for "yield" since "yield" is invalid in strict mode.
-        spyApi.invokeCallback = spyApi.yield;
-        delegateToCalls("yieldOn", false, "yieldOn", function () {
-            throw new Error(this.toString() + " cannot yield since it was not yet invoked.");
-        });
-        delegateToCalls("yieldTo", false, "yieldTo", function (property) {
-            throw new Error(this.toString() + " cannot yield to '" + property +
-                "' since it was not yet invoked.");
-        });
-        delegateToCalls("yieldToOn", false, "yieldToOn", function (property) {
-            throw new Error(this.toString() + " cannot yield to '" + property +
-                "' since it was not yet invoked.");
-        });
-
-        spyApi.formatters = {
-            c: function (spy) {
-                return sinon.timesInWords(spy.callCount);
-            },
-
-            n: function (spy) {
-                return spy.toString();
-            },
-
-            C: function (spy) {
-                var calls = [];
-
-                for (var i = 0, l = spy.callCount; i < l; ++i) {
-                    var stringifiedCall = "    " + spy.getCall(i).toString();
-                    if (/\n/.test(calls[i - 1])) {
-                        stringifiedCall = "\n" + stringifiedCall;
-                    }
-                    push.call(calls, stringifiedCall);
-                }
-
-                return calls.length > 0 ? "\n" + calls.join("\n") : "";
-            },
-
-            t: function (spy) {
-                var objects = [];
-
-                for (var i = 0, l = spy.callCount; i < l; ++i) {
-                    push.call(objects, sinon.format(spy.thisValues[i]));
-                }
-
-                return objects.join(", ");
-            },
-
-            "*": function (spy, args) {
-                var formatted = [];
-
-                for (var i = 0, l = args.length; i < l; ++i) {
-                    push.call(formatted, sinon.format(args[i]));
-                }
-
-                return formatted.join(", ");
-            }
-        };
-
-        sinon.extend(spy, spyApi);
-
-        spy.spyCall = sinon.spyCall;
-        sinon.spy = spy;
-
-        return spy;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./call");
-        require("./extend");
-        require("./times_in_words");
-        require("./format");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend util/core.js
- * @depend extend.js
- */
-/**
- * Stub behavior
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @author Tim Fischbach (mail@timfischbach.de)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    var slice = Array.prototype.slice;
-    var join = Array.prototype.join;
-    var useLeftMostCallback = -1;
-    var useRightMostCallback = -2;
-
-    var nextTick = (function () {
-        if (typeof process === "object" && typeof process.nextTick === "function") {
-            return process.nextTick;
-        } else if (typeof setImmediate === "function") {
-            return setImmediate;
-        } else {
-            return function (callback) {
-                setTimeout(callback, 0);
-            };
-        }
-    })();
-
-    function throwsException(error, message) {
-        if (typeof error == "string") {
-            this.exception = new Error(message || "");
-            this.exception.name = error;
-        } else if (!error) {
-            this.exception = new Error("Error");
-        } else {
-            this.exception = error;
-        }
-
-        return this;
-    }
-
-    function getCallback(behavior, args) {
-        var callArgAt = behavior.callArgAt;
-
-        if (callArgAt >= 0) {
-            return args[callArgAt];
-        }
-
-        var argumentList;
-
-        if (callArgAt === useLeftMostCallback) {
-            argumentList = args;
-        }
-
-        if (callArgAt === useRightMostCallback) {
-            argumentList = slice.call(args).reverse();
-        }
-
-        var callArgProp = behavior.callArgProp;
-
-        for (var i = 0, l = argumentList.length; i < l; ++i) {
-            if (!callArgProp && typeof argumentList[i] == "function") {
-                return argumentList[i];
-            }
-
-            if (callArgProp && argumentList[i] &&
-                typeof argumentList[i][callArgProp] == "function") {
-                return argumentList[i][callArgProp];
-            }
-        }
-
-        return null;
-    }
-
-    function makeApi(sinon) {
-        function getCallbackError(behavior, func, args) {
-            if (behavior.callArgAt < 0) {
-                var msg;
-
-                if (behavior.callArgProp) {
-                    msg = sinon.functionName(behavior.stub) +
-                        " expected to yield to '" + behavior.callArgProp +
-                        "', but no object with such a property was passed.";
-                } else {
-                    msg = sinon.functionName(behavior.stub) +
-                        " expected to yield, but no callback was passed.";
-                }
-
-                if (args.length > 0) {
-                    msg += " Received [" + join.call(args, ", ") + "]";
-                }
-
-                return msg;
-            }
-
-            return "argument at index " + behavior.callArgAt + " is not a function: " + func;
-        }
-
-        function callCallback(behavior, args) {
-            if (typeof behavior.callArgAt == "number") {
-                var func = getCallback(behavior, args);
-
-                if (typeof func != "function") {
-                    throw new TypeError(getCallbackError(behavior, func, args));
-                }
-
-                if (behavior.callbackAsync) {
-                    nextTick(function () {
-                        func.apply(behavior.callbackContext, behavior.callbackArguments);
-                    });
-                } else {
-                    func.apply(behavior.callbackContext, behavior.callbackArguments);
-                }
-            }
-        }
-
-        var proto = {
-            create: function create(stub) {
-                var behavior = sinon.extend({}, sinon.behavior);
-                delete behavior.create;
-                behavior.stub = stub;
-
-                return behavior;
-            },
-
-            isPresent: function isPresent() {
-                return (typeof this.callArgAt == "number" ||
-                        this.exception ||
-                        typeof this.returnArgAt == "number" ||
-                        this.returnThis ||
-                        this.returnValueDefined);
-            },
-
-            invoke: function invoke(context, args) {
-                callCallback(this, args);
-
-                if (this.exception) {
-                    throw this.exception;
-                } else if (typeof this.returnArgAt == "number") {
-                    return args[this.returnArgAt];
-                } else if (this.returnThis) {
-                    return context;
-                }
-
-                return this.returnValue;
-            },
-
-            onCall: function onCall(index) {
-                return this.stub.onCall(index);
-            },
-
-            onFirstCall: function onFirstCall() {
-                return this.stub.onFirstCall();
-            },
-
-            onSecondCall: function onSecondCall() {
-                return this.stub.onSecondCall();
-            },
-
-            onThirdCall: function onThirdCall() {
-                return this.stub.onThirdCall();
-            },
-
-            withArgs: function withArgs(/* arguments */) {
-                throw new Error("Defining a stub by invoking \"stub.onCall(...).withArgs(...)\" is not supported. " +
-                                "Use \"stub.withArgs(...).onCall(...)\" to define sequential behavior for calls with certain arguments.");
-            },
-
-            callsArg: function callsArg(pos) {
-                if (typeof pos != "number") {
-                    throw new TypeError("argument index is not number");
-                }
-
-                this.callArgAt = pos;
-                this.callbackArguments = [];
-                this.callbackContext = undefined;
-                this.callArgProp = undefined;
-                this.callbackAsync = false;
-
-                return this;
-            },
-
-            callsArgOn: function callsArgOn(pos, context) {
-                if (typeof pos != "number") {
-                    throw new TypeError("argument index is not number");
-                }
-                if (typeof context != "object") {
-                    throw new TypeError("argument context is not an object");
-                }
-
-                this.callArgAt = pos;
-                this.callbackArguments = [];
-                this.callbackContext = context;
-                this.callArgProp = undefined;
-                this.callbackAsync = false;
-
-                return this;
-            },
-
-            callsArgWith: function callsArgWith(pos) {
-                if (typeof pos != "number") {
-                    throw new TypeError("argument index is not number");
-                }
-
-                this.callArgAt = pos;
-                this.callbackArguments = slice.call(arguments, 1);
-                this.callbackContext = undefined;
-                this.callArgProp = undefined;
-                this.callbackAsync = false;
-
-                return this;
-            },
-
-            callsArgOnWith: function callsArgWith(pos, context) {
-                if (typeof pos != "number") {
-                    throw new TypeError("argument index is not number");
-                }
-                if (typeof context != "object") {
-                    throw new TypeError("argument context is not an object");
-                }
-
-                this.callArgAt = pos;
-                this.callbackArguments = slice.call(arguments, 2);
-                this.callbackContext = context;
-                this.callArgProp = undefined;
-                this.callbackAsync = false;
-
-                return this;
-            },
-
-            yields: function () {
-                this.callArgAt = useLeftMostCallback;
-                this.callbackArguments = slice.call(arguments, 0);
-                this.callbackContext = undefined;
-                this.callArgProp = undefined;
-                this.callbackAsync = false;
-
-                return this;
-            },
-
-            yieldsRight: function () {
-                this.callArgAt = useRightMostCallback;
-                this.callbackArguments = slice.call(arguments, 0);
-                this.callbackContext = undefined;
-                this.callArgProp = undefined;
-                this.callbackAsync = false;
-
-                return this;
-            },
-
-            yieldsOn: function (context) {
-                if (typeof context != "object") {
-                    throw new TypeError("argument context is not an object");
-                }
-
-                this.callArgAt = useLeftMostCallback;
-                this.callbackArguments = slice.call(arguments, 1);
-                this.callbackContext = context;
-                this.callArgProp = undefined;
-                this.callbackAsync = false;
-
-                return this;
-            },
-
-            yieldsTo: function (prop) {
-                this.callArgAt = useLeftMostCallback;
-                this.callbackArguments = slice.call(arguments, 1);
-                this.callbackContext = undefined;
-                this.callArgProp = prop;
-                this.callbackAsync = false;
-
-                return this;
-            },
-
-            yieldsToOn: function (prop, context) {
-                if (typeof context != "object") {
-                    throw new TypeError("argument context is not an object");
-                }
-
-                this.callArgAt = useLeftMostCallback;
-                this.callbackArguments = slice.call(arguments, 2);
-                this.callbackContext = context;
-                this.callArgProp = prop;
-                this.callbackAsync = false;
-
-                return this;
-            },
-
-            throws: throwsException,
-            throwsException: throwsException,
-
-            returns: function returns(value) {
-                this.returnValue = value;
-                this.returnValueDefined = true;
-
-                return this;
-            },
-
-            returnsArg: function returnsArg(pos) {
-                if (typeof pos != "number") {
-                    throw new TypeError("argument index is not number");
-                }
-
-                this.returnArgAt = pos;
-
-                return this;
-            },
-
-            returnsThis: function returnsThis() {
-                this.returnThis = true;
-
-                return this;
-            }
-        };
-
-        // create asynchronous versions of callsArg* and yields* methods
-        for (var method in proto) {
-            // need to avoid creating anotherasync versions of the newly added async methods
-            if (proto.hasOwnProperty(method) &&
-                method.match(/^(callsArg|yields)/) &&
-                !method.match(/Async/)) {
-                proto[method + "Async"] = (function (syncFnName) {
-                    return function () {
-                        var result = this[syncFnName].apply(this, arguments);
-                        this.callbackAsync = true;
-                        return result;
-                    };
-                })(method);
-            }
-        }
-
-        sinon.behavior = proto;
-        return proto;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./extend");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend util/core.js
- * @depend extend.js
- * @depend spy.js
- * @depend behavior.js
- */
-/**
- * Stub functions
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    function makeApi(sinon) {
-        function stub(object, property, func) {
-            if (!!func && typeof func != "function" && typeof func != "object") {
-                throw new TypeError("Custom stub should be a function or a property descriptor");
-            }
-
-            var wrapper;
-
-            if (func) {
-                if (typeof func == "function") {
-                    wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func;
-                } else {
-                    wrapper = func;
-                    if (sinon.spy && sinon.spy.create) {
-                        var types = sinon.objectKeys(wrapper);
-                        for (var i = 0; i < types.length; i++) {
-                            wrapper[types[i]] = sinon.spy.create(wrapper[types[i]]);
-                        }
-                    }
-                }
-            } else {
-                var stubLength = 0;
-                if (typeof object == "object" && typeof object[property] == "function") {
-                    stubLength = object[property].length;
-                }
-                wrapper = stub.create(stubLength);
-            }
-
-            if (!object && typeof property === "undefined") {
-                return sinon.stub.create();
-            }
-
-            if (typeof property === "undefined" && typeof object == "object") {
-                for (var prop in object) {
-                    if (typeof sinon.getPropertyDescriptor(object, prop).value === "function") {
-                        stub(object, prop);
-                    }
-                }
-
-                return object;
-            }
-
-            return sinon.wrapMethod(object, property, wrapper);
-        }
-
-        function getDefaultBehavior(stub) {
-            return stub.defaultBehavior || getParentBehaviour(stub) || sinon.behavior.create(stub);
-        }
-
-        function getParentBehaviour(stub) {
-            return (stub.parent && getCurrentBehavior(stub.parent));
-        }
-
-        function getCurrentBehavior(stub) {
-            var behavior = stub.behaviors[stub.callCount - 1];
-            return behavior && behavior.isPresent() ? behavior : getDefaultBehavior(stub);
-        }
-
-        var uuid = 0;
-
-        var proto = {
-            create: function create(stubLength) {
-                var functionStub = function () {
-                    return getCurrentBehavior(functionStub).invoke(this, arguments);
-                };
-
-                functionStub.id = "stub#" + uuid++;
-                var orig = functionStub;
-                functionStub = sinon.spy.create(functionStub, stubLength);
-                functionStub.func = orig;
-
-                sinon.extend(functionStub, stub);
-                functionStub.instantiateFake = sinon.stub.create;
-                functionStub.displayName = "stub";
-                functionStub.toString = sinon.functionToString;
-
-                functionStub.defaultBehavior = null;
-                functionStub.behaviors = [];
-
-                return functionStub;
-            },
-
-            resetBehavior: function () {
-                var i;
-
-                this.defaultBehavior = null;
-                this.behaviors = [];
-
-                delete this.returnValue;
-                delete this.returnArgAt;
-                this.returnThis = false;
-
-                if (this.fakes) {
-                    for (i = 0; i < this.fakes.length; i++) {
-                        this.fakes[i].resetBehavior();
-                    }
-                }
-            },
-
-            onCall: function onCall(index) {
-                if (!this.behaviors[index]) {
-                    this.behaviors[index] = sinon.behavior.create(this);
-                }
-
-                return this.behaviors[index];
-            },
-
-            onFirstCall: function onFirstCall() {
-                return this.onCall(0);
-            },
-
-            onSecondCall: function onSecondCall() {
-                return this.onCall(1);
-            },
-
-            onThirdCall: function onThirdCall() {
-                return this.onCall(2);
-            }
-        };
-
-        for (var method in sinon.behavior) {
-            if (sinon.behavior.hasOwnProperty(method) &&
-                !proto.hasOwnProperty(method) &&
-                method != "create" &&
-                method != "withArgs" &&
-                method != "invoke") {
-                proto[method] = (function (behaviorMethod) {
-                    return function () {
-                        this.defaultBehavior = this.defaultBehavior || sinon.behavior.create(this);
-                        this.defaultBehavior[behaviorMethod].apply(this.defaultBehavior, arguments);
-                        return this;
-                    };
-                }(method));
-            }
-        }
-
-        sinon.extend(stub, proto);
-        sinon.stub = stub;
-
-        return stub;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./behavior");
-        require("./spy");
-        require("./extend");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend times_in_words.js
- * @depend util/core.js
- * @depend call.js
- * @depend extend.js
- * @depend match.js
- * @depend spy.js
- * @depend stub.js
- * @depend format.js
- */
-/**
- * Mock functions.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    function makeApi(sinon) {
-        var push = [].push;
-        var match = sinon.match;
-
-        function mock(object) {
-            // if (typeof console !== undefined && console.warn) {
-            //     console.warn("mock will be removed from Sinon.JS v2.0");
-            // }
-
-            if (!object) {
-                return sinon.expectation.create("Anonymous mock");
-            }
-
-            return mock.create(object);
-        }
-
-        function each(collection, callback) {
-            if (!collection) {
-                return;
-            }
-
-            for (var i = 0, l = collection.length; i < l; i += 1) {
-                callback(collection[i]);
-            }
-        }
-
-        sinon.extend(mock, {
-            create: function create(object) {
-                if (!object) {
-                    throw new TypeError("object is null");
-                }
-
-                var mockObject = sinon.extend({}, mock);
-                mockObject.object = object;
-                delete mockObject.create;
-
-                return mockObject;
-            },
-
-            expects: function expects(method) {
-                if (!method) {
-                    throw new TypeError("method is falsy");
-                }
-
-                if (!this.expectations) {
-                    this.expectations = {};
-                    this.proxies = [];
-                }
-
-                if (!this.expectations[method]) {
-                    this.expectations[method] = [];
-                    var mockObject = this;
-
-                    sinon.wrapMethod(this.object, method, function () {
-                        return mockObject.invokeMethod(method, this, arguments);
-                    });
-
-                    push.call(this.proxies, method);
-                }
-
-                var expectation = sinon.expectation.create(method);
-                push.call(this.expectations[method], expectation);
-
-                return expectation;
-            },
-
-            restore: function restore() {
-                var object = this.object;
-
-                each(this.proxies, function (proxy) {
-                    if (typeof object[proxy].restore == "function") {
-                        object[proxy].restore();
-                    }
-                });
-            },
-
-            verify: function verify() {
-                var expectations = this.expectations || {};
-                var messages = [], met = [];
-
-                each(this.proxies, function (proxy) {
-                    each(expectations[proxy], function (expectation) {
-                        if (!expectation.met()) {
-                            push.call(messages, expectation.toString());
-                        } else {
-                            push.call(met, expectation.toString());
-                        }
-                    });
-                });
-
-                this.restore();
-
-                if (messages.length > 0) {
-                    sinon.expectation.fail(messages.concat(met).join("\n"));
-                } else if (met.length > 0) {
-                    sinon.expectation.pass(messages.concat(met).join("\n"));
-                }
-
-                return true;
-            },
-
-            invokeMethod: function invokeMethod(method, thisValue, args) {
-                var expectations = this.expectations && this.expectations[method];
-                var length = expectations && expectations.length || 0, i;
-
-                for (i = 0; i < length; i += 1) {
-                    if (!expectations[i].met() &&
-                        expectations[i].allowsCall(thisValue, args)) {
-                        return expectations[i].apply(thisValue, args);
-                    }
-                }
-
-                var messages = [], available, exhausted = 0;
-
-                for (i = 0; i < length; i += 1) {
-                    if (expectations[i].allowsCall(thisValue, args)) {
-                        available = available || expectations[i];
-                    } else {
-                        exhausted += 1;
-                    }
-                    push.call(messages, "    " + expectations[i].toString());
-                }
-
-                if (exhausted === 0) {
-                    return available.apply(thisValue, args);
-                }
-
-                messages.unshift("Unexpected call: " + sinon.spyCall.toString.call({
-                    proxy: method,
-                    args: args
-                }));
-
-                sinon.expectation.fail(messages.join("\n"));
-            }
-        });
-
-        var times = sinon.timesInWords;
-        var slice = Array.prototype.slice;
-
-        function callCountInWords(callCount) {
-            if (callCount == 0) {
-                return "never called";
-            } else {
-                return "called " + times(callCount);
-            }
-        }
-
-        function expectedCallCountInWords(expectation) {
-            var min = expectation.minCalls;
-            var max = expectation.maxCalls;
-
-            if (typeof min == "number" && typeof max == "number") {
-                var str = times(min);
-
-                if (min != max) {
-                    str = "at least " + str + " and at most " + times(max);
-                }
-
-                return str;
-            }
-
-            if (typeof min == "number") {
-                return "at least " + times(min);
-            }
-
-            return "at most " + times(max);
-        }
-
-        function receivedMinCalls(expectation) {
-            var hasMinLimit = typeof expectation.minCalls == "number";
-            return !hasMinLimit || expectation.callCount >= expectation.minCalls;
-        }
-
-        function receivedMaxCalls(expectation) {
-            if (typeof expectation.maxCalls != "number") {
-                return false;
-            }
-
-            return expectation.callCount == expectation.maxCalls;
-        }
-
-        function verifyMatcher(possibleMatcher, arg) {
-            if (match && match.isMatcher(possibleMatcher)) {
-                return possibleMatcher.test(arg);
-            } else {
-                return true;
-            }
-        }
-
-        sinon.expectation = {
-            minCalls: 1,
-            maxCalls: 1,
-
-            create: function create(methodName) {
-                var expectation = sinon.extend(sinon.stub.create(), sinon.expectation);
-                delete expectation.create;
-                expectation.method = methodName;
-
-                return expectation;
-            },
-
-            invoke: function invoke(func, thisValue, args) {
-                this.verifyCallAllowed(thisValue, args);
-
-                return sinon.spy.invoke.apply(this, arguments);
-            },
-
-            atLeast: function atLeast(num) {
-                if (typeof num != "number") {
-                    throw new TypeError("'" + num + "' is not number");
-                }
-
-                if (!this.limitsSet) {
-                    this.maxCalls = null;
-                    this.limitsSet = true;
-                }
-
-                this.minCalls = num;
-
-                return this;
-            },
-
-            atMost: function atMost(num) {
-                if (typeof num != "number") {
-                    throw new TypeError("'" + num + "' is not number");
-                }
-
-                if (!this.limitsSet) {
-                    this.minCalls = null;
-                    this.limitsSet = true;
-                }
-
-                this.maxCalls = num;
-
-                return this;
-            },
-
-            never: function never() {
-                return this.exactly(0);
-            },
-
-            once: function once() {
-                return this.exactly(1);
-            },
-
-            twice: function twice() {
-                return this.exactly(2);
-            },
-
-            thrice: function thrice() {
-                return this.exactly(3);
-            },
-
-            exactly: function exactly(num) {
-                if (typeof num != "number") {
-                    throw new TypeError("'" + num + "' is not a number");
-                }
-
-                this.atLeast(num);
-                return this.atMost(num);
-            },
-
-            met: function met() {
-                return !this.failed && receivedMinCalls(this);
-            },
-
-            verifyCallAllowed: function verifyCallAllowed(thisValue, args) {
-                if (receivedMaxCalls(this)) {
-                    this.failed = true;
-                    sinon.expectation.fail(this.method + " already called " + times(this.maxCalls));
-                }
-
-                if ("expectedThis" in this && this.expectedThis !== thisValue) {
-                    sinon.expectation.fail(this.method + " called with " + thisValue + " as thisValue, expected " +
-                        this.expectedThis);
-                }
-
-                if (!("expectedArguments" in this)) {
-                    return;
-                }
-
-                if (!args) {
-                    sinon.expectation.fail(this.method + " received no arguments, expected " +
-                        sinon.format(this.expectedArguments));
-                }
-
-                if (args.length < this.expectedArguments.length) {
-                    sinon.expectation.fail(this.method + " received too few arguments (" + sinon.format(args) +
-                        "), expected " + sinon.format(this.expectedArguments));
-                }
-
-                if (this.expectsExactArgCount &&
-                    args.length != this.expectedArguments.length) {
-                    sinon.expectation.fail(this.method + " received too many arguments (" + sinon.format(args) +
-                        "), expected " + sinon.format(this.expectedArguments));
-                }
-
-                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {
-
-                    if (!verifyMatcher(this.expectedArguments[i], args[i])) {
-                        sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) +
-                            ", didn't match " + this.expectedArguments.toString());
-                    }
-
-                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {
-                        sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) +
-                            ", expected " + sinon.format(this.expectedArguments));
-                    }
-                }
-            },
-
-            allowsCall: function allowsCall(thisValue, args) {
-                if (this.met() && receivedMaxCalls(this)) {
-                    return false;
-                }
-
-                if ("expectedThis" in this && this.expectedThis !== thisValue) {
-                    return false;
-                }
-
-                if (!("expectedArguments" in this)) {
-                    return true;
-                }
-
-                args = args || [];
-
-                if (args.length < this.expectedArguments.length) {
-                    return false;
-                }
-
-                if (this.expectsExactArgCount &&
-                    args.length != this.expectedArguments.length) {
-                    return false;
-                }
-
-                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {
-                    if (!verifyMatcher(this.expectedArguments[i], args[i])) {
-                        return false;
-                    }
-
-                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {
-                        return false;
-                    }
-                }
-
-                return true;
-            },
-
-            withArgs: function withArgs() {
-                this.expectedArguments = slice.call(arguments);
-                return this;
-            },
-
-            withExactArgs: function withExactArgs() {
-                this.withArgs.apply(this, arguments);
-                this.expectsExactArgCount = true;
-                return this;
-            },
-
-            on: function on(thisValue) {
-                this.expectedThis = thisValue;
-                return this;
-            },
-
-            toString: function () {
-                var args = (this.expectedArguments || []).slice();
-
-                if (!this.expectsExactArgCount) {
-                    push.call(args, "[...]");
-                }
-
-                var callStr = sinon.spyCall.toString.call({
-                    proxy: this.method || "anonymous mock expectation",
-                    args: args
-                });
-
-                var message = callStr.replace(", [...", "[, ...") + " " +
-                    expectedCallCountInWords(this);
-
-                if (this.met()) {
-                    return "Expectation met: " + message;
-                }
-
-                return "Expected " + message + " (" +
-                    callCountInWords(this.callCount) + ")";
-            },
-
-            verify: function verify() {
-                if (!this.met()) {
-                    sinon.expectation.fail(this.toString());
-                } else {
-                    sinon.expectation.pass(this.toString());
-                }
-
-                return true;
-            },
-
-            pass: function pass(message) {
-                sinon.assert.pass(message);
-            },
-
-            fail: function fail(message) {
-                var exception = new Error(message);
-                exception.name = "ExpectationError";
-
-                throw exception;
-            }
-        };
-
-        sinon.mock = mock;
-        return mock;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./times_in_words");
-        require("./call");
-        require("./extend");
-        require("./match");
-        require("./spy");
-        require("./stub");
-        require("./format");
-
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend util/core.js
- * @depend spy.js
- * @depend stub.js
- * @depend mock.js
- */
-/**
- * Collections of stubs, spies and mocks.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    var push = [].push;
-    var hasOwnProperty = Object.prototype.hasOwnProperty;
-
-    function getFakes(fakeCollection) {
-        if (!fakeCollection.fakes) {
-            fakeCollection.fakes = [];
-        }
-
-        return fakeCollection.fakes;
-    }
-
-    function each(fakeCollection, method) {
-        var fakes = getFakes(fakeCollection);
-
-        for (var i = 0, l = fakes.length; i < l; i += 1) {
-            if (typeof fakes[i][method] == "function") {
-                fakes[i][method]();
-            }
-        }
-    }
-
-    function compact(fakeCollection) {
-        var fakes = getFakes(fakeCollection);
-        var i = 0;
-        while (i < fakes.length) {
-            fakes.splice(i, 1);
-        }
-    }
-
-    function makeApi(sinon) {
-        var collection = {
-            verify: function resolve() {
-                each(this, "verify");
-            },
-
-            restore: function restore() {
-                each(this, "restore");
-                compact(this);
-            },
-
-            reset: function restore() {
-                each(this, "reset");
-            },
-
-            verifyAndRestore: function verifyAndRestore() {
-                var exception;
-
-                try {
-                    this.verify();
-                } catch (e) {
-                    exception = e;
-                }
-
-                this.restore();
-
-                if (exception) {
-                    throw exception;
-                }
-            },
-
-            add: function add(fake) {
-                push.call(getFakes(this), fake);
-                return fake;
-            },
-
-            spy: function spy() {
-                return this.add(sinon.spy.apply(sinon, arguments));
-            },
-
-            stub: function stub(object, property, value) {
-                if (property) {
-                    var original = object[property];
-
-                    if (typeof original != "function") {
-                        if (!hasOwnProperty.call(object, property)) {
-                            throw new TypeError("Cannot stub non-existent own property " + property);
-                        }
-
-                        object[property] = value;
-
-                        return this.add({
-                            restore: function () {
-                                object[property] = original;
-                            }
-                        });
-                    }
-                }
-                if (!property && !!object && typeof object == "object") {
-                    var stubbedObj = sinon.stub.apply(sinon, arguments);
-
-                    for (var prop in stubbedObj) {
-                        if (typeof stubbedObj[prop] === "function") {
-                            this.add(stubbedObj[prop]);
-                        }
-                    }
-
-                    return stubbedObj;
-                }
-
-                return this.add(sinon.stub.apply(sinon, arguments));
-            },
-
-            mock: function mock() {
-                return this.add(sinon.mock.apply(sinon, arguments));
-            },
-
-            inject: function inject(obj) {
-                var col = this;
-
-                obj.spy = function () {
-                    return col.spy.apply(col, arguments);
-                };
-
-                obj.stub = function () {
-                    return col.stub.apply(col, arguments);
-                };
-
-                obj.mock = function () {
-                    return col.mock.apply(col, arguments);
-                };
-
-                return obj;
-            }
-        };
-
-        sinon.collection = collection;
-        return collection;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./mock");
-        require("./spy");
-        require("./stub");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/*global lolex */
-
-/**
- * Fake timer API
- * setTimeout
- * setInterval
- * clearTimeout
- * clearInterval
- * tick
- * reset
- * Date
- *
- * Inspired by jsUnitMockTimeOut from JsUnit
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-if (typeof sinon == "undefined") {
-    var sinon = {};
-}
-
-(function (global) {
-    function makeApi(sinon, lol) {
-        var llx = typeof lolex !== "undefined" ? lolex : lol;
-
-        sinon.useFakeTimers = function () {
-            var now, methods = Array.prototype.slice.call(arguments);
-
-            if (typeof methods[0] === "string") {
-                now = 0;
-            } else {
-                now = methods.shift();
-            }
-
-            var clock = llx.install(now || 0, methods);
-            clock.restore = clock.uninstall;
-            return clock;
-        };
-
-        sinon.clock = {
-            create: function (now) {
-                return llx.createClock(now);
-            }
-        };
-
-        sinon.timers = {
-            setTimeout: setTimeout,
-            clearTimeout: clearTimeout,
-            setImmediate: (typeof setImmediate !== "undefined" ? setImmediate : undefined),
-            clearImmediate: (typeof clearImmediate !== "undefined" ? clearImmediate : undefined),
-            setInterval: setInterval,
-            clearInterval: clearInterval,
-            Date: Date
-        };
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, epxorts, module, lolex) {
-        var sinon = require("./core");
-        makeApi(sinon, lolex);
-        module.exports = sinon;
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module, require("lolex"));
-    } else {
-        makeApi(sinon);
-    }
-}(typeof global != "undefined" && typeof global !== "function" ? global : this));
-
-/**
- * Minimal Event interface implementation
- *
- * Original implementation by Sven Fuchs: https://gist.github.com/995028
- * Modifications and tests by Christian Johansen.
- *
- * @author Sven Fuchs (svenfuchs@artweb-design.de)
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2011 Sven Fuchs, Christian Johansen
- */
-
-if (typeof sinon == "undefined") {
-    this.sinon = {};
-}
-
-(function () {
-    var push = [].push;
-
-    function makeApi(sinon) {
-        sinon.Event = function Event(type, bubbles, cancelable, target) {
-            this.initEvent(type, bubbles, cancelable, target);
-        };
-
-        sinon.Event.prototype = {
-            initEvent: function (type, bubbles, cancelable, target) {
-                this.type = type;
-                this.bubbles = bubbles;
-                this.cancelable = cancelable;
-                this.target = target;
-            },
-
-            stopPropagation: function () {},
-
-            preventDefault: function () {
-                this.defaultPrevented = true;
-            }
-        };
-
-        sinon.ProgressEvent = function ProgressEvent(type, progressEventRaw, target) {
-            this.initEvent(type, false, false, target);
-            this.loaded = progressEventRaw.loaded || null;
-            this.total = progressEventRaw.total || null;
-            this.lengthComputable = !!progressEventRaw.total;
-        };
-
-        sinon.ProgressEvent.prototype = new sinon.Event();
-
-        sinon.ProgressEvent.prototype.constructor =  sinon.ProgressEvent;
-
-        sinon.CustomEvent = function CustomEvent(type, customData, target) {
-            this.initEvent(type, false, false, target);
-            this.detail = customData.detail || null;
-        };
-
-        sinon.CustomEvent.prototype = new sinon.Event();
-
-        sinon.CustomEvent.prototype.constructor =  sinon.CustomEvent;
-
-        sinon.EventTarget = {
-            addEventListener: function addEventListener(event, listener) {
-                this.eventListeners = this.eventListeners || {};
-                this.eventListeners[event] = this.eventListeners[event] || [];
-                push.call(this.eventListeners[event], listener);
-            },
-
-            removeEventListener: function removeEventListener(event, listener) {
-                var listeners = this.eventListeners && this.eventListeners[event] || [];
-
-                for (var i = 0, l = listeners.length; i < l; ++i) {
-                    if (listeners[i] == listener) {
-                        return listeners.splice(i, 1);
-                    }
-                }
-            },
-
-            dispatchEvent: function dispatchEvent(event) {
-                var type = event.type;
-                var listeners = this.eventListeners && this.eventListeners[type] || [];
-
-                for (var i = 0; i < listeners.length; i++) {
-                    if (typeof listeners[i] == "function") {
-                        listeners[i].call(this, event);
-                    } else {
-                        listeners[i].handleEvent(event);
-                    }
-                }
-
-                return !!event.defaultPrevented;
-            }
-        };
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require) {
-        var sinon = require("./core");
-        makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require);
-    } else {
-        makeApi(sinon);
-    }
-}());
-
-/**
- * @depend util/core.js
- */
-/**
- * Logs errors
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2014 Christian Johansen
- */
-
-(function (sinon) {
-    // cache a reference to setTimeout, so that our reference won't be stubbed out
-    // when using fake timers and errors will still get logged
-    // https://github.com/cjohansen/Sinon.JS/issues/381
-    var realSetTimeout = setTimeout;
-
-    function makeApi(sinon) {
-
-        function log() {}
-
-        function logError(label, err) {
-            var msg = label + " threw exception: ";
-
-            sinon.log(msg + "[" + err.name + "] " + err.message);
-
-            if (err.stack) {
-                sinon.log(err.stack);
-            }
-
-            logError.setTimeout(function () {
-                err.message = msg + err.message;
-                throw err;
-            }, 0);
-        };
-
-        // wrap realSetTimeout with something we can stub in tests
-        logError.setTimeout = function (func, timeout) {
-            realSetTimeout(func, timeout);
-        }
-
-        var exports = {};
-        exports.log = sinon.log = log;
-        exports.logError = sinon.logError = logError;
-
-        return exports;
-    }
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        module.exports = makeApi(sinon);
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend core.js
- * @depend ../extend.js
- * @depend event.js
- * @depend ../log_error.js
- */
-/**
- * Fake XDomainRequest object
- */
-
-if (typeof sinon == "undefined") {
-    this.sinon = {};
-}
-
-// wrapper for global
-(function (global) {
-    var xdr = { XDomainRequest: global.XDomainRequest };
-    xdr.GlobalXDomainRequest = global.XDomainRequest;
-    xdr.supportsXDR = typeof xdr.GlobalXDomainRequest != "undefined";
-    xdr.workingXDR = xdr.supportsXDR ? xdr.GlobalXDomainRequest :  false;
-
-    function makeApi(sinon) {
-        sinon.xdr = xdr;
-
-        function FakeXDomainRequest() {
-            this.readyState = FakeXDomainRequest.UNSENT;
-            this.requestBody = null;
-            this.requestHeaders = {};
-            this.status = 0;
-            this.timeout = null;
-
-            if (typeof FakeXDomainRequest.onCreate == "function") {
-                FakeXDomainRequest.onCreate(this);
-            }
-        }
-
-        function verifyState(xdr) {
-            if (xdr.readyState !== FakeXDomainRequest.OPENED) {
-                throw new Error("INVALID_STATE_ERR");
-            }
-
-            if (xdr.sendFlag) {
-                throw new Error("INVALID_STATE_ERR");
-            }
-        }
-
-        function verifyRequestSent(xdr) {
-            if (xdr.readyState == FakeXDomainRequest.UNSENT) {
-                throw new Error("Request not sent");
-            }
-            if (xdr.readyState == FakeXDomainRequest.DONE) {
-                throw new Error("Request done");
-            }
-        }
-
-        function verifyResponseBodyType(body) {
-            if (typeof body != "string") {
-                var error = new Error("Attempted to respond to fake XDomainRequest with " +
-                                    body + ", which is not a string.");
-                error.name = "InvalidBodyException";
-                throw error;
-            }
-        }
-
-        sinon.extend(FakeXDomainRequest.prototype, sinon.EventTarget, {
-            open: function open(method, url) {
-                this.method = method;
-                this.url = url;
-
-                this.responseText = null;
-                this.sendFlag = false;
-
-                this.readyStateChange(FakeXDomainRequest.OPENED);
-            },
-
-            readyStateChange: function readyStateChange(state) {
-                this.readyState = state;
-                var eventName = "";
-                switch (this.readyState) {
-                case FakeXDomainRequest.UNSENT:
-                    break;
-                case FakeXDomainRequest.OPENED:
-                    break;
-                case FakeXDomainRequest.LOADING:
-                    if (this.sendFlag) {
-                        //raise the progress event
-                        eventName = "onprogress";
-                    }
-                    break;
-                case FakeXDomainRequest.DONE:
-                    if (this.isTimeout) {
-                        eventName = "ontimeout"
-                    } else if (this.errorFlag || (this.status < 200 || this.status > 299)) {
-                        eventName = "onerror";
-                    } else {
-                        eventName = "onload"
-                    }
-                    break;
-                }
-
-                // raising event (if defined)
-                if (eventName) {
-                    if (typeof this[eventName] == "function") {
-                        try {
-                            this[eventName]();
-                        } catch (e) {
-                            sinon.logError("Fake XHR " + eventName + " handler", e);
-                        }
-                    }
-                }
-            },
-
-            send: function send(data) {
-                verifyState(this);
-
-                if (!/^(get|head)$/i.test(this.method)) {
-                    this.requestBody = data;
-                }
-                this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8";
-
-                this.errorFlag = false;
-                this.sendFlag = true;
-                this.readyStateChange(FakeXDomainRequest.OPENED);
-
-                if (typeof this.onSend == "function") {
-                    this.onSend(this);
-                }
-            },
-
-            abort: function abort() {
-                this.aborted = true;
-                this.responseText = null;
-                this.errorFlag = true;
-
-                if (this.readyState > sinon.FakeXDomainRequest.UNSENT && this.sendFlag) {
-                    this.readyStateChange(sinon.FakeXDomainRequest.DONE);
-                    this.sendFlag = false;
-                }
-            },
-
-            setResponseBody: function setResponseBody(body) {
-                verifyRequestSent(this);
-                verifyResponseBodyType(body);
-
-                var chunkSize = this.chunkSize || 10;
-                var index = 0;
-                this.responseText = "";
-
-                do {
-                    this.readyStateChange(FakeXDomainRequest.LOADING);
-                    this.responseText += body.substring(index, index + chunkSize);
-                    index += chunkSize;
-                } while (index < body.length);
-
-                this.readyStateChange(FakeXDomainRequest.DONE);
-            },
-
-            respond: function respond(status, contentType, body) {
-                // content-type ignored, since XDomainRequest does not carry this
-                // we keep the same syntax for respond(...) as for FakeXMLHttpRequest to ease
-                // test integration across browsers
-                this.status = typeof status == "number" ? status : 200;
-                this.setResponseBody(body || "");
-            },
-
-            simulatetimeout: function simulatetimeout() {
-                this.status = 0;
-                this.isTimeout = true;
-                // Access to this should actually throw an error
-                this.responseText = undefined;
-                this.readyStateChange(FakeXDomainRequest.DONE);
-            }
-        });
-
-        sinon.extend(FakeXDomainRequest, {
-            UNSENT: 0,
-            OPENED: 1,
-            LOADING: 3,
-            DONE: 4
-        });
-
-        sinon.useFakeXDomainRequest = function useFakeXDomainRequest() {
-            sinon.FakeXDomainRequest.restore = function restore(keepOnCreate) {
-                if (xdr.supportsXDR) {
-                    global.XDomainRequest = xdr.GlobalXDomainRequest;
-                }
-
-                delete sinon.FakeXDomainRequest.restore;
-
-                if (keepOnCreate !== true) {
-                    delete sinon.FakeXDomainRequest.onCreate;
-                }
-            };
-            if (xdr.supportsXDR) {
-                global.XDomainRequest = sinon.FakeXDomainRequest;
-            }
-            return sinon.FakeXDomainRequest;
-        };
-
-        sinon.FakeXDomainRequest = FakeXDomainRequest;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./core");
-        require("../extend");
-        require("./event");
-        require("../log_error");
-        makeApi(sinon);
-        module.exports = sinon;
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else {
-        makeApi(sinon);
-    }
-})(typeof global !== "undefined" ? global : self);
-
-/**
- * @depend core.js
- * @depend ../extend.js
- * @depend event.js
- * @depend ../log_error.js
- */
-/**
- * Fake XMLHttpRequest object
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (global) {
-
-    var supportsProgress = typeof ProgressEvent !== "undefined";
-    var supportsCustomEvent = typeof CustomEvent !== "undefined";
-    var supportsFormData = typeof FormData !== "undefined";
-    var sinonXhr = { XMLHttpRequest: global.XMLHttpRequest };
-    sinonXhr.GlobalXMLHttpRequest = global.XMLHttpRequest;
-    sinonXhr.GlobalActiveXObject = global.ActiveXObject;
-    sinonXhr.supportsActiveX = typeof sinonXhr.GlobalActiveXObject != "undefined";
-    sinonXhr.supportsXHR = typeof sinonXhr.GlobalXMLHttpRequest != "undefined";
-    sinonXhr.workingXHR = sinonXhr.supportsXHR ? sinonXhr.GlobalXMLHttpRequest : sinonXhr.supportsActiveX
-                                     ? function () {
-                                        return new sinonXhr.GlobalActiveXObject("MSXML2.XMLHTTP.3.0")
-                                    } : false;
-    sinonXhr.supportsCORS = sinonXhr.supportsXHR && "withCredentials" in (new sinonXhr.GlobalXMLHttpRequest());
-
-    /*jsl:ignore*/
-    var unsafeHeaders = {
-        "Accept-Charset": true,
-        "Accept-Encoding": true,
-        Connection: true,
-        "Content-Length": true,
-        Cookie: true,
-        Cookie2: true,
-        "Content-Transfer-Encoding": true,
-        Date: true,
-        Expect: true,
-        Host: true,
-        "Keep-Alive": true,
-        Referer: true,
-        TE: true,
-        Trailer: true,
-        "Transfer-Encoding": true,
-        Upgrade: true,
-        "User-Agent": true,
-        Via: true
-    };
-    /*jsl:end*/
-
-    // Note that for FakeXMLHttpRequest to work pre ES5
-    // we lose some of the alignment with the spec.
-    // To ensure as close a match as possible,
-    // set responseType before calling open, send or respond;
-    function FakeXMLHttpRequest() {
-        this.readyState = FakeXMLHttpRequest.UNSENT;
-        this.requestHeaders = {};
-        this.requestBody = null;
-        this.status = 0;
-        this.statusText = "";
-        this.upload = new UploadProgress();
-        this.responseType = "";
-        this.response = "";
-        if (sinonXhr.supportsCORS) {
-            this.withCredentials = false;
-        }
-
-        var xhr = this;
-        var events = ["loadstart", "load", "abort", "loadend"];
-
-        function addEventListener(eventName) {
-            xhr.addEventListener(eventName, function (event) {
-                var listener = xhr["on" + eventName];
-
-                if (listener && typeof listener == "function") {
-                    listener.call(this, event);
-                }
-            });
-        }
-
-        for (var i = events.length - 1; i >= 0; i--) {
-            addEventListener(events[i]);
-        }
-
-        if (typeof FakeXMLHttpRequest.onCreate == "function") {
-            FakeXMLHttpRequest.onCreate(this);
-        }
-    }
-
-    // An upload object is created for each
-    // FakeXMLHttpRequest and allows upload
-    // events to be simulated using uploadProgress
-    // and uploadError.
-    function UploadProgress() {
-        this.eventListeners = {
-            progress: [],
-            load: [],
-            abort: [],
-            error: []
-        }
-    }
-
-    UploadProgress.prototype.addEventListener = function addEventListener(event, listener) {
-        this.eventListeners[event].push(listener);
-    };
-
-    UploadProgress.prototype.removeEventListener = function removeEventListener(event, listener) {
-        var listeners = this.eventListeners[event] || [];
-
-        for (var i = 0, l = listeners.length; i < l; ++i) {
-            if (listeners[i] == listener) {
-                return listeners.splice(i, 1);
-            }
-        }
-    };
-
-    UploadProgress.prototype.dispatchEvent = function dispatchEvent(event) {
-        var listeners = this.eventListeners[event.type] || [];
-
-        for (var i = 0, listener; (listener = listeners[i]) != null; i++) {
-            listener(event);
-        }
-    };
-
-    function verifyState(xhr) {
-        if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {
-            throw new Error("INVALID_STATE_ERR");
-        }
-
-        if (xhr.sendFlag) {
-            throw new Error("INVALID_STATE_ERR");
-        }
-    }
-
-    function getHeader(headers, header) {
-        header = header.toLowerCase();
-
-        for (var h in headers) {
-            if (h.toLowerCase() == header) {
-                return h;
-            }
-        }
-
-        return null;
-    }
-
-    // filtering to enable a white-list version of Sinon FakeXhr,
-    // where whitelisted requests are passed through to real XHR
-    function each(collection, callback) {
-        if (!collection) {
-            return;
-        }
-
-        for (var i = 0, l = collection.length; i < l; i += 1) {
-            callback(collection[i]);
-        }
-    }
-    function some(collection, callback) {
-        for (var index = 0; index < collection.length; index++) {
-            if (callback(collection[index]) === true) {
-                return true;
-            }
-        }
-        return false;
-    }
-    // largest arity in XHR is 5 - XHR#open
-    var apply = function (obj, method, args) {
-        switch (args.length) {
-        case 0: return obj[method]();
-        case 1: return obj[method](args[0]);
-        case 2: return obj[method](args[0], args[1]);
-        case 3: return obj[method](args[0], args[1], args[2]);
-        case 4: return obj[method](args[0], args[1], args[2], args[3]);
-        case 5: return obj[method](args[0], args[1], args[2], args[3], args[4]);
-        }
-    };
-
-    FakeXMLHttpRequest.filters = [];
-    FakeXMLHttpRequest.addFilter = function addFilter(fn) {
-        this.filters.push(fn)
-    };
-    var IE6Re = /MSIE 6/;
-    FakeXMLHttpRequest.defake = function defake(fakeXhr, xhrArgs) {
-        var xhr = new sinonXhr.workingXHR();
-        each([
-            "open",
-            "setRequestHeader",
-            "send",
-            "abort",
-            "getResponseHeader",
-            "getAllResponseHeaders",
-            "addEventListener",
-            "overrideMimeType",
-            "removeEventListener"
-        ], function (method) {
-            fakeXhr[method] = function () {
-                return apply(xhr, method, arguments);
-            };
-        });
-
-        var copyAttrs = function (args) {
-            each(args, function (attr) {
-                try {
-                    fakeXhr[attr] = xhr[attr]
-                } catch (e) {
-                    if (!IE6Re.test(navigator.userAgent)) {
-                        throw e;
-                    }
-                }
-            });
-        };
-
-        var stateChange = function stateChange() {
-            fakeXhr.readyState = xhr.readyState;
-            if (xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) {
-                copyAttrs(["status", "statusText"]);
-            }
-            if (xhr.readyState >= FakeXMLHttpRequest.LOADING) {
-                copyAttrs(["responseText", "response"]);
-            }
-            if (xhr.readyState === FakeXMLHttpRequest.DONE) {
-                copyAttrs(["responseXML"]);
-            }
-            if (fakeXhr.onreadystatechange) {
-                fakeXhr.onreadystatechange.call(fakeXhr, { target: fakeXhr });
-            }
-        };
-
-        if (xhr.addEventListener) {
-            for (var event in fakeXhr.eventListeners) {
-                if (fakeXhr.eventListeners.hasOwnProperty(event)) {
-                    each(fakeXhr.eventListeners[event], function (handler) {
-                        xhr.addEventListener(event, handler);
-                    });
-                }
-            }
-            xhr.addEventListener("readystatechange", stateChange);
-        } else {
-            xhr.onreadystatechange = stateChange;
-        }
-        apply(xhr, "open", xhrArgs);
-    };
-    FakeXMLHttpRequest.useFilters = false;
-
-    function verifyRequestOpened(xhr) {
-        if (xhr.readyState != FakeXMLHttpRequest.OPENED) {
-            throw new Error("INVALID_STATE_ERR - " + xhr.readyState);
-        }
-    }
-
-    function verifyRequestSent(xhr) {
-        if (xhr.readyState == FakeXMLHttpRequest.DONE) {
-            throw new Error("Request done");
-        }
-    }
-
-    function verifyHeadersReceived(xhr) {
-        if (xhr.async && xhr.readyState != FakeXMLHttpRequest.HEADERS_RECEIVED) {
-            throw new Error("No headers received");
-        }
-    }
-
-    function verifyResponseBodyType(body) {
-        if (typeof body != "string") {
-            var error = new Error("Attempted to respond to fake XMLHttpRequest with " +
-                                 body + ", which is not a string.");
-            error.name = "InvalidBodyException";
-            throw error;
-        }
-    }
-
-    FakeXMLHttpRequest.parseXML = function parseXML(text) {
-        var xmlDoc;
-
-        if (typeof DOMParser != "undefined") {
-            var parser = new DOMParser();
-            xmlDoc = parser.parseFromString(text, "text/xml");
-        } else {
-            xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
-            xmlDoc.async = "false";
-            xmlDoc.loadXML(text);
-        }
-
-        return xmlDoc;
-    };
-
-    FakeXMLHttpRequest.statusCodes = {
-        100: "Continue",
-        101: "Switching Protocols",
-        200: "OK",
-        201: "Created",
-        202: "Accepted",
-        203: "Non-Authoritative Information",
-        204: "No Content",
-        205: "Reset Content",
-        206: "Partial Content",
-        207: "Multi-Status",
-        300: "Multiple Choice",
-        301: "Moved Permanently",
-        302: "Found",
-        303: "See Other",
-        304: "Not Modified",
-        305: "Use Proxy",
-        307: "Temporary Redirect",
-        400: "Bad Request",
-        401: "Unauthorized",
-        402: "Payment Required",
-        403: "Forbidden",
-        404: "Not Found",
-        405: "Method Not Allowed",
-        406: "Not Acceptable",
-        407: "Proxy Authentication Required",
-        408: "Request Timeout",
-        409: "Conflict",
-        410: "Gone",
-        411: "Length Required",
-        412: "Precondition Failed",
-        413: "Request Entity Too Large",
-        414: "Request-URI Too Long",
-        415: "Unsupported Media Type",
-        416: "Requested Range Not Satisfiable",
-        417: "Expectation Failed",
-        422: "Unprocessable Entity",
-        500: "Internal Server Error",
-        501: "Not Implemented",
-        502: "Bad Gateway",
-        503: "Service Unavailable",
-        504: "Gateway Timeout",
-        505: "HTTP Version Not Supported"
-    };
-
-    function makeApi(sinon) {
-        sinon.xhr = sinonXhr;
-
-        sinon.extend(FakeXMLHttpRequest.prototype, sinon.EventTarget, {
-            async: true,
-
-            open: function open(method, url, async, username, password) {
-                this.method = method;
-                this.url = url;
-                this.async = typeof async == "boolean" ? async : true;
-                this.username = username;
-                this.password = password;
-                this.responseText = null;
-                this.response = this.responseType === "json" ? null : "";
-                this.responseXML = null;
-                this.requestHeaders = {};
-                this.sendFlag = false;
-
-                if (FakeXMLHttpRequest.useFilters === true) {
-                    var xhrArgs = arguments;
-                    var defake = some(FakeXMLHttpRequest.filters, function (filter) {
-                        return filter.apply(this, xhrArgs)
-                    });
-                    if (defake) {
-                        return FakeXMLHttpRequest.defake(this, arguments);
-                    }
-                }
-                this.readyStateChange(FakeXMLHttpRequest.OPENED);
-            },
-
-            readyStateChange: function readyStateChange(state) {
-                this.readyState = state;
-
-                if (typeof this.onreadystatechange == "function") {
-                    try {
-                        this.onreadystatechange();
-                    } catch (e) {
-                        sinon.logError("Fake XHR onreadystatechange handler", e);
-                    }
-                }
-
-                switch (this.readyState) {
-                    case FakeXMLHttpRequest.DONE:
-                        if (supportsProgress) {
-                            this.upload.dispatchEvent(new sinon.ProgressEvent("progress", {loaded: 100, total: 100}));
-                            this.dispatchEvent(new sinon.ProgressEvent("progress", {loaded: 100, total: 100}));
-                        }
-                        this.upload.dispatchEvent(new sinon.Event("load", false, false, this));
-                        this.dispatchEvent(new sinon.Event("load", false, false, this));
-                        this.dispatchEvent(new sinon.Event("loadend", false, false, this));
-                        break;
-                }
-
-                this.dispatchEvent(new sinon.Event("readystatechange"));
-            },
-
-            setRequestHeader: function setRequestHeader(header, value) {
-                verifyState(this);
-
-                if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) {
-                    throw new Error("Refused to set unsafe header \"" + header + "\"");
-                }
-
-                if (this.requestHeaders[header]) {
-                    this.requestHeaders[header] += "," + value;
-                } else {
-                    this.requestHeaders[header] = value;
-                }
-            },
-
-            // Helps testing
-            setResponseHeaders: function setResponseHeaders(headers) {
-                verifyRequestOpened(this);
-                this.responseHeaders = {};
-
-                for (var header in headers) {
-                    if (headers.hasOwnProperty(header)) {
-                        this.responseHeaders[header] = headers[header];
-                    }
-                }
-
-                if (this.async) {
-                    this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED);
-                } else {
-                    this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED;
-                }
-            },
-
-            // Currently treats ALL data as a DOMString (i.e. no Document)
-            send: function send(data) {
-                verifyState(this);
-
-                if (!/^(get|head)$/i.test(this.method)) {
-                    var contentType = getHeader(this.requestHeaders, "Content-Type");
-                    if (this.requestHeaders[contentType]) {
-                        var value = this.requestHeaders[contentType].split(";");
-                        this.requestHeaders[contentType] = value[0] + ";charset=utf-8";
-                    } else if (supportsFormData && !(data instanceof FormData)) {
-                        this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8";
-                    }
-
-                    this.requestBody = data;
-                }
-
-                this.errorFlag = false;
-                this.sendFlag = this.async;
-                this.response = this.responseType === "json" ? null : "";
-                this.readyStateChange(FakeXMLHttpRequest.OPENED);
-
-                if (typeof this.onSend == "function") {
-                    this.onSend(this);
-                }
-
-                this.dispatchEvent(new sinon.Event("loadstart", false, false, this));
-            },
-
-            abort: function abort() {
-                this.aborted = true;
-                this.responseText = null;
-                this.response = this.responseType === "json" ? null : "";
-                this.errorFlag = true;
-                this.requestHeaders = {};
-                this.responseHeaders = {};
-
-                if (this.readyState > FakeXMLHttpRequest.UNSENT && this.sendFlag) {
-                    this.readyStateChange(FakeXMLHttpRequest.DONE);
-                    this.sendFlag = false;
-                }
-
-                this.readyState = FakeXMLHttpRequest.UNSENT;
-
-                this.dispatchEvent(new sinon.Event("abort", false, false, this));
-
-                this.upload.dispatchEvent(new sinon.Event("abort", false, false, this));
-
-                if (typeof this.onerror === "function") {
-                    this.onerror();
-                }
-            },
-
-            getResponseHeader: function getResponseHeader(header) {
-                if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {
-                    return null;
-                }
-
-                if (/^Set-Cookie2?$/i.test(header)) {
-                    return null;
-                }
-
-                header = getHeader(this.responseHeaders, header);
-
-                return this.responseHeaders[header] || null;
-            },
-
-            getAllResponseHeaders: function getAllResponseHeaders() {
-                if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {
-                    return "";
-                }
-
-                var headers = "";
-
-                for (var header in this.responseHeaders) {
-                    if (this.responseHeaders.hasOwnProperty(header) &&
-                        !/^Set-Cookie2?$/i.test(header)) {
-                        headers += header + ": " + this.responseHeaders[header] + "\r\n";
-                    }
-                }
-
-                return headers;
-            },
-
-            setResponseBody: function setResponseBody(body) {
-                verifyRequestSent(this);
-                verifyHeadersReceived(this);
-                verifyResponseBodyType(body);
-
-                var chunkSize = this.chunkSize || 10;
-                var index = 0;
-                this.responseText = "";
-
-                do {
-                    if (this.async) {
-                        this.readyStateChange(FakeXMLHttpRequest.LOADING);
-                    }
-
-                    this.responseText += body.substring(index, index + chunkSize);
-                    index += chunkSize;
-                } while (index < body.length);
-
-                var type = this.getResponseHeader("Content-Type");
-
-                if (this.responseText &&
-                    (!type || /(text\/xml)|(application\/xml)|(\+xml)/.test(type))) {
-                    try {
-                        this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText);
-                    } catch (e) {
-                        // Unable to parse XML - no biggie
-                    }
-                }
-
-                this.response = this.responseType === "json" ? JSON.parse(this.responseText) : this.responseText;
-                this.readyStateChange(FakeXMLHttpRequest.DONE);
-            },
-
-            respond: function respond(status, headers, body) {
-                this.status = typeof status == "number" ? status : 200;
-                this.statusText = FakeXMLHttpRequest.statusCodes[this.status];
-                this.setResponseHeaders(headers || {});
-                this.setResponseBody(body || "");
-            },
-
-            uploadProgress: function uploadProgress(progressEventRaw) {
-                if (supportsProgress) {
-                    this.upload.dispatchEvent(new sinon.ProgressEvent("progress", progressEventRaw));
-                }
-            },
-
-            downloadProgress: function downloadProgress(progressEventRaw) {
-                if (supportsProgress) {
-                    this.dispatchEvent(new sinon.ProgressEvent("progress", progressEventRaw));
-                }
-            },
-
-            uploadError: function uploadError(error) {
-                if (supportsCustomEvent) {
-                    this.upload.dispatchEvent(new sinon.CustomEvent("error", {detail: error}));
-                }
-            }
-        });
-
-        sinon.extend(FakeXMLHttpRequest, {
-            UNSENT: 0,
-            OPENED: 1,
-            HEADERS_RECEIVED: 2,
-            LOADING: 3,
-            DONE: 4
-        });
-
-        sinon.useFakeXMLHttpRequest = function () {
-            FakeXMLHttpRequest.restore = function restore(keepOnCreate) {
-                if (sinonXhr.supportsXHR) {
-                    global.XMLHttpRequest = sinonXhr.GlobalXMLHttpRequest;
-                }
-
-                if (sinonXhr.supportsActiveX) {
-                    global.ActiveXObject = sinonXhr.GlobalActiveXObject;
-                }
-
-                delete FakeXMLHttpRequest.restore;
-
-                if (keepOnCreate !== true) {
-                    delete FakeXMLHttpRequest.onCreate;
-                }
-            };
-            if (sinonXhr.supportsXHR) {
-                global.XMLHttpRequest = FakeXMLHttpRequest;
-            }
-
-            if (sinonXhr.supportsActiveX) {
-                global.ActiveXObject = function ActiveXObject(objId) {
-                    if (objId == "Microsoft.XMLHTTP" || /^Msxml2\.XMLHTTP/i.test(objId)) {
-
-                        return new FakeXMLHttpRequest();
-                    }
-
-                    return new sinonXhr.GlobalActiveXObject(objId);
-                };
-            }
-
-            return FakeXMLHttpRequest;
-        };
-
-        sinon.FakeXMLHttpRequest = FakeXMLHttpRequest;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./core");
-        require("../extend");
-        require("./event");
-        require("../log_error");
-        makeApi(sinon);
-        module.exports = sinon;
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (typeof sinon === "undefined") {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-
-})(typeof global !== "undefined" ? global : self);
-
-/**
- * @depend fake_xdomain_request.js
- * @depend fake_xml_http_request.js
- * @depend ../format.js
- * @depend ../log_error.js
- */
-/**
- * The Sinon "server" mimics a web server that receives requests from
- * sinon.FakeXMLHttpRequest and provides an API to respond to those requests,
- * both synchronously and asynchronously. To respond synchronuously, canned
- * answers have to be provided upfront.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-if (typeof sinon == "undefined") {
-    var sinon = {};
-}
-
-(function () {
-    var push = [].push;
-    function F() {}
-
-    function create(proto) {
-        F.prototype = proto;
-        return new F();
-    }
-
-    function responseArray(handler) {
-        var response = handler;
-
-        if (Object.prototype.toString.call(handler) != "[object Array]") {
-            response = [200, {}, handler];
-        }
-
-        if (typeof response[2] != "string") {
-            throw new TypeError("Fake server response body should be string, but was " +
-                                typeof response[2]);
-        }
-
-        return response;
-    }
-
-    var wloc = typeof window !== "undefined" ? window.location : {};
-    var rCurrLoc = new RegExp("^" + wloc.protocol + "//" + wloc.host);
-
-    function matchOne(response, reqMethod, reqUrl) {
-        var rmeth = response.method;
-        var matchMethod = !rmeth || rmeth.toLowerCase() == reqMethod.toLowerCase();
-        var url = response.url;
-        var matchUrl = !url || url == reqUrl || (typeof url.test == "function" && url.test(reqUrl));
-
-        return matchMethod && matchUrl;
-    }
-
-    function match(response, request) {
-        var requestUrl = request.url;
-
-        if (!/^https?:\/\//.test(requestUrl) || rCurrLoc.test(requestUrl)) {
-            requestUrl = requestUrl.replace(rCurrLoc, "");
-        }
-
-        if (matchOne(response, this.getHTTPMethod(request), requestUrl)) {
-            if (typeof response.response == "function") {
-                var ru = response.url;
-                var args = [request].concat(ru && typeof ru.exec == "function" ? ru.exec(requestUrl).slice(1) : []);
-                return response.response.apply(response, args);
-            }
-
-            return true;
-        }
-
-        return false;
-    }
-
-    function makeApi(sinon) {
-        sinon.fakeServer = {
-            create: function () {
-                var server = create(this);
-                if (!sinon.xhr.supportsCORS) {
-                    this.xhr = sinon.useFakeXDomainRequest();
-                } else {
-                    this.xhr = sinon.useFakeXMLHttpRequest();
-                }
-                server.requests = [];
-
-                this.xhr.onCreate = function (xhrObj) {
-                    server.addRequest(xhrObj);
-                };
-
-                return server;
-            },
-
-            addRequest: function addRequest(xhrObj) {
-                var server = this;
-                push.call(this.requests, xhrObj);
-
-                xhrObj.onSend = function () {
-                    server.handleRequest(this);
-
-                    if (server.respondImmediately) {
-                        server.respond();
-                    } else if (server.autoRespond && !server.responding) {
-                        setTimeout(function () {
-                            server.responding = false;
-                            server.respond();
-                        }, server.autoRespondAfter || 10);
-
-                        server.responding = true;
-                    }
-                };
-            },
-
-            getHTTPMethod: function getHTTPMethod(request) {
-                if (this.fakeHTTPMethods && /post/i.test(request.method)) {
-                    var matches = (request.requestBody || "").match(/_method=([^\b;]+)/);
-                    return !!matches ? matches[1] : request.method;
-                }
-
-                return request.method;
-            },
-
-            handleRequest: function handleRequest(xhr) {
-                if (xhr.async) {
-                    if (!this.queue) {
-                        this.queue = [];
-                    }
-
-                    push.call(this.queue, xhr);
-                } else {
-                    this.processRequest(xhr);
-                }
-            },
-
-            log: function log(response, request) {
-                var str;
-
-                str =  "Request:\n"  + sinon.format(request)  + "\n\n";
-                str += "Response:\n" + sinon.format(response) + "\n\n";
-
-                sinon.log(str);
-            },
-
-            respondWith: function respondWith(method, url, body) {
-                if (arguments.length == 1 && typeof method != "function") {
-                    this.response = responseArray(method);
-                    return;
-                }
-
-                if (!this.responses) {
-                    this.responses = [];
-                }
-
-                if (arguments.length == 1) {
-                    body = method;
-                    url = method = null;
-                }
-
-                if (arguments.length == 2) {
-                    body = url;
-                    url = method;
-                    method = null;
-                }
-
-                push.call(this.responses, {
-                    method: method,
-                    url: url,
-                    response: typeof body == "function" ? body : responseArray(body)
-                });
-            },
-
-            respond: function respond() {
-                if (arguments.length > 0) {
-                    this.respondWith.apply(this, arguments);
-                }
-
-                var queue = this.queue || [];
-                var requests = queue.splice(0, queue.length);
-                var request;
-
-                while (request = requests.shift()) {
-                    this.processRequest(request);
-                }
-            },
-
-            processRequest: function processRequest(request) {
-                try {
-                    if (request.aborted) {
-                        return;
-                    }
-
-                    var response = this.response || [404, {}, ""];
-
-                    if (this.responses) {
-                        for (var l = this.responses.length, i = l - 1; i >= 0; i--) {
-                            if (match.call(this, this.responses[i], request)) {
-                                response = this.responses[i].response;
-                                break;
-                            }
-                        }
-                    }
-
-                    if (request.readyState != 4) {
-                        this.log(response, request);
-
-                        request.respond(response[0], response[1], response[2]);
-                    }
-                } catch (e) {
-                    sinon.logError("Fake server request processing", e);
-                }
-            },
-
-            restore: function restore() {
-                return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments);
-            }
-        };
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./core");
-        require("./fake_xdomain_request");
-        require("./fake_xml_http_request");
-        require("../format");
-        makeApi(sinon);
-        module.exports = sinon;
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else {
-        makeApi(sinon);
-    }
-}());
-
-/**
- * @depend fake_server.js
- * @depend fake_timers.js
- */
-/**
- * Add-on for sinon.fakeServer that automatically handles a fake timer along with
- * the FakeXMLHttpRequest. The direct inspiration for this add-on is jQuery
- * 1.3.x, which does not use xhr object's onreadystatehandler at all - instead,
- * it polls the object for completion with setInterval. Dispite the direct
- * motivation, there is nothing jQuery-specific in this file, so it can be used
- * in any environment where the ajax implementation depends on setInterval or
- * setTimeout.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function () {
-    function makeApi(sinon) {
-        function Server() {}
-        Server.prototype = sinon.fakeServer;
-
-        sinon.fakeServerWithClock = new Server();
-
-        sinon.fakeServerWithClock.addRequest = function addRequest(xhr) {
-            if (xhr.async) {
-                if (typeof setTimeout.clock == "object") {
-                    this.clock = setTimeout.clock;
-                } else {
-                    this.clock = sinon.useFakeTimers();
-                    this.resetClock = true;
-                }
-
-                if (!this.longestTimeout) {
-                    var clockSetTimeout = this.clock.setTimeout;
-                    var clockSetInterval = this.clock.setInterval;
-                    var server = this;
-
-                    this.clock.setTimeout = function (fn, timeout) {
-                        server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);
-
-                        return clockSetTimeout.apply(this, arguments);
-                    };
-
-                    this.clock.setInterval = function (fn, timeout) {
-                        server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);
-
-                        return clockSetInterval.apply(this, arguments);
-                    };
-                }
-            }
-
-            return sinon.fakeServer.addRequest.call(this, xhr);
-        };
-
-        sinon.fakeServerWithClock.respond = function respond() {
-            var returnVal = sinon.fakeServer.respond.apply(this, arguments);
-
-            if (this.clock) {
-                this.clock.tick(this.longestTimeout || 0);
-                this.longestTimeout = 0;
-
-                if (this.resetClock) {
-                    this.clock.restore();
-                    this.resetClock = false;
-                }
-            }
-
-            return returnVal;
-        };
-
-        sinon.fakeServerWithClock.restore = function restore() {
-            if (this.clock) {
-                this.clock.restore();
-            }
-
-            return sinon.fakeServer.restore.apply(this, arguments);
-        };
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require) {
-        var sinon = require("./core");
-        require("./fake_server");
-        require("./fake_timers");
-        makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require);
-    } else {
-        makeApi(sinon);
-    }
-}());
-
-/**
- * @depend util/core.js
- * @depend extend.js
- * @depend collection.js
- * @depend util/fake_timers.js
- * @depend util/fake_server_with_clock.js
- */
-/**
- * Manages fake collections as well as fake utilities such as Sinon's
- * timers and fake XHR implementation in one convenient object.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function () {
-    function makeApi(sinon) {
-        var push = [].push;
-
-        function exposeValue(sandbox, config, key, value) {
-            if (!value) {
-                return;
-            }
-
-            if (config.injectInto && !(key in config.injectInto)) {
-                config.injectInto[key] = value;
-                sandbox.injectedKeys.push(key);
-            } else {
-                push.call(sandbox.args, value);
-            }
-        }
-
-        function prepareSandboxFromConfig(config) {
-            var sandbox = sinon.create(sinon.sandbox);
-
-            if (config.useFakeServer) {
-                if (typeof config.useFakeServer == "object") {
-                    sandbox.serverPrototype = config.useFakeServer;
-                }
-
-                sandbox.useFakeServer();
-            }
-
-            if (config.useFakeTimers) {
-                if (typeof config.useFakeTimers == "object") {
-                    sandbox.useFakeTimers.apply(sandbox, config.useFakeTimers);
-                } else {
-                    sandbox.useFakeTimers();
-                }
-            }
-
-            return sandbox;
-        }
-
-        sinon.sandbox = sinon.extend(sinon.create(sinon.collection), {
-            useFakeTimers: function useFakeTimers() {
-                this.clock = sinon.useFakeTimers.apply(sinon, arguments);
-
-                return this.add(this.clock);
-            },
-
-            serverPrototype: sinon.fakeServer,
-
-            useFakeServer: function useFakeServer() {
-                var proto = this.serverPrototype || sinon.fakeServer;
-
-                if (!proto || !proto.create) {
-                    return null;
-                }
-
-                this.server = proto.create();
-                return this.add(this.server);
-            },
-
-            inject: function (obj) {
-                sinon.collection.inject.call(this, obj);
-
-                if (this.clock) {
-                    obj.clock = this.clock;
-                }
-
-                if (this.server) {
-                    obj.server = this.server;
-                    obj.requests = this.server.requests;
-                }
-
-                obj.match = sinon.match;
-
-                return obj;
-            },
-
-            restore: function () {
-                sinon.collection.restore.apply(this, arguments);
-                this.restoreContext();
-            },
-
-            restoreContext: function () {
-                if (this.injectedKeys) {
-                    for (var i = 0, j = this.injectedKeys.length; i < j; i++) {
-                        delete this.injectInto[this.injectedKeys[i]];
-                    }
-                    this.injectedKeys = [];
-                }
-            },
-
-            create: function (config) {
-                if (!config) {
-                    return sinon.create(sinon.sandbox);
-                }
-
-                var sandbox = prepareSandboxFromConfig(config);
-                sandbox.args = sandbox.args || [];
-                sandbox.injectedKeys = [];
-                sandbox.injectInto = config.injectInto;
-                var prop, value, exposed = sandbox.inject({});
-
-                if (config.properties) {
-                    for (var i = 0, l = config.properties.length; i < l; i++) {
-                        prop = config.properties[i];
-                        value = exposed[prop] || prop == "sandbox" && sandbox;
-                        exposeValue(sandbox, config, prop, value);
-                    }
-                } else {
-                    exposeValue(sandbox, config, "sandbox", value);
-                }
-
-                return sandbox;
-            },
-
-            match: sinon.match
-        });
-
-        sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer;
-
-        return sinon.sandbox;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./extend");
-        require("./util/fake_server_with_clock");
-        require("./util/fake_timers");
-        require("./collection");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}());
-
-/**
- * @depend util/core.js
- * @depend sandbox.js
- */
-/**
- * Test function, sandboxes fakes
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    function makeApi(sinon) {
-        var slice = Array.prototype.slice;
-
-        function test(callback) {
-            var type = typeof callback;
-
-            if (type != "function") {
-                throw new TypeError("sinon.test needs to wrap a test function, got " + type);
-            }
-
-            function sinonSandboxedTest() {
-                var config = sinon.getConfig(sinon.config);
-                config.injectInto = config.injectIntoThis && this || config.injectInto;
-                var sandbox = sinon.sandbox.create(config);
-                var args = slice.call(arguments);
-                var oldDone = args.length && args[args.length - 1];
-                var exception, result;
-
-                if (typeof oldDone == "function") {
-                    args[args.length - 1] = function sinonDone(result) {
-                        if (result) {
-                            sandbox.restore();
-                            throw exception;
-                        } else {
-                            sandbox.verifyAndRestore();
-                        }
-                        oldDone(result);
-                    };
-                }
-
-                try {
-                    result = callback.apply(this, args.concat(sandbox.args));
-                } catch (e) {
-                    exception = e;
-                }
-
-                if (typeof oldDone != "function") {
-                    if (typeof exception !== "undefined") {
-                        sandbox.restore();
-                        throw exception;
-                    } else {
-                        sandbox.verifyAndRestore();
-                    }
-                }
-
-                return result;
-            }
-
-            if (callback.length) {
-                return function sinonAsyncSandboxedTest(callback) {
-                    return sinonSandboxedTest.apply(this, arguments);
-                };
-            }
-
-            return sinonSandboxedTest;
-        }
-
-        test.config = {
-            injectIntoThis: true,
-            injectInto: null,
-            properties: ["spy", "stub", "mock", "clock", "server", "requests"],
-            useFakeTimers: true,
-            useFakeServer: true
-        };
-
-        sinon.test = test;
-        return test;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./sandbox");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (sinon) {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend util/core.js
- * @depend test.js
- */
-/**
- * Test case, sandboxes all test functions
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon) {
-    function createTest(property, setUp, tearDown) {
-        return function () {
-            if (setUp) {
-                setUp.apply(this, arguments);
-            }
-
-            var exception, result;
-
-            try {
-                result = property.apply(this, arguments);
-            } catch (e) {
-                exception = e;
-            }
-
-            if (tearDown) {
-                tearDown.apply(this, arguments);
-            }
-
-            if (exception) {
-                throw exception;
-            }
-
-            return result;
-        };
-    }
-
-    function makeApi(sinon) {
-        function testCase(tests, prefix) {
-            if (!tests || typeof tests != "object") {
-                throw new TypeError("sinon.testCase needs an object with test functions");
-            }
-
-            prefix = prefix || "test";
-            var rPrefix = new RegExp("^" + prefix);
-            var methods = {}, testName, property, method;
-            var setUp = tests.setUp;
-            var tearDown = tests.tearDown;
-
-            for (testName in tests) {
-                if (tests.hasOwnProperty(testName) && !/^(setUp|tearDown)$/.test(testName)) {
-                    property = tests[testName];
-
-                    if (typeof property == "function" && rPrefix.test(testName)) {
-                        method = property;
-
-                        if (setUp || tearDown) {
-                            method = createTest(property, setUp, tearDown);
-                        }
-
-                        methods[testName] = sinon.test(method);
-                    } else {
-                        methods[testName] = tests[testName];
-                    }
-                }
-            }
-
-            return methods;
-        }
-
-        sinon.testCase = testCase;
-        return testCase;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./test");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-}(typeof sinon == "object" && sinon || null));
-
-/**
- * @depend times_in_words.js
- * @depend util/core.js
- * @depend match.js
- * @depend format.js
- */
-/**
- * Assertions matching the test spy retrieval interface.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-
-(function (sinon, global) {
-    var slice = Array.prototype.slice;
-
-    function makeApi(sinon) {
-        var assert;
-
-        function verifyIsStub() {
-            var method;
-
-            for (var i = 0, l = arguments.length; i < l; ++i) {
-                method = arguments[i];
-
-                if (!method) {
-                    assert.fail("fake is not a spy");
-                }
-
-                if (method.proxy && method.proxy.isSinonProxy) {
-                    verifyIsStub(method.proxy);
-                } else {
-                    if (typeof method != "function") {
-                        assert.fail(method + " is not a function");
-                    }
-
-                    if (typeof method.getCall != "function") {
-                        assert.fail(method + " is not stubbed");
-                    }
-                }
-
-            }
-        }
-
-        function failAssertion(object, msg) {
-            object = object || global;
-            var failMethod = object.fail || assert.fail;
-            failMethod.call(object, msg);
-        }
-
-        function mirrorPropAsAssertion(name, method, message) {
-            if (arguments.length == 2) {
-                message = method;
-                method = name;
-            }
-
-            assert[name] = function (fake) {
-                verifyIsStub(fake);
-
-                var args = slice.call(arguments, 1);
-                var failed = false;
-
-                if (typeof method == "function") {
-                    failed = !method(fake);
-                } else {
-                    failed = typeof fake[method] == "function" ?
-                        !fake[method].apply(fake, args) : !fake[method];
-                }
-
-                if (failed) {
-                    failAssertion(this, (fake.printf || fake.proxy.printf).apply(fake, [message].concat(args)));
-                } else {
-                    assert.pass(name);
-                }
-            };
-        }
-
-        function exposedName(prefix, prop) {
-            return !prefix || /^fail/.test(prop) ? prop :
-                prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1);
-        }
-
-        assert = {
-            failException: "AssertError",
-
-            fail: function fail(message) {
-                var error = new Error(message);
-                error.name = this.failException || assert.failException;
-
-                throw error;
-            },
-
-            pass: function pass(assertion) {},
-
-            callOrder: function assertCallOrder() {
-                verifyIsStub.apply(null, arguments);
-                var expected = "", actual = "";
-
-                if (!sinon.calledInOrder(arguments)) {
-                    try {
-                        expected = [].join.call(arguments, ", ");
-                        var calls = slice.call(arguments);
-                        var i = calls.length;
-                        while (i) {
-                            if (!calls[--i].called) {
-                                calls.splice(i, 1);
-                            }
-                        }
-                        actual = sinon.orderByFirstCall(calls).join(", ");
-                    } catch (e) {
-                        // If this fails, we'll just fall back to the blank string
-                    }
-
-                    failAssertion(this, "expected " + expected + " to be " +
-                                "called in order but were called as " + actual);
-                } else {
-                    assert.pass("callOrder");
-                }
-            },
-
-            callCount: function assertCallCount(method, count) {
-                verifyIsStub(method);
-
-                if (method.callCount != count) {
-                    var msg = "expected %n to be called " + sinon.timesInWords(count) +
-                        " but was called %c%C";
-                    failAssertion(this, method.printf(msg));
-                } else {
-                    assert.pass("callCount");
-                }
-            },
-
-            expose: function expose(target, options) {
-                if (!target) {
-                    throw new TypeError("target is null or undefined");
-                }
-
-                var o = options || {};
-                var prefix = typeof o.prefix == "undefined" && "assert" || o.prefix;
-                var includeFail = typeof o.includeFail == "undefined" || !!o.includeFail;
-
-                for (var method in this) {
-                    if (method != "expose" && (includeFail || !/^(fail)/.test(method))) {
-                        target[exposedName(prefix, method)] = this[method];
-                    }
-                }
-
-                return target;
-            },
-
-            match: function match(actual, expectation) {
-                var matcher = sinon.match(expectation);
-                if (matcher.test(actual)) {
-                    assert.pass("match");
-                } else {
-                    var formatted = [
-                        "expected value to match",
-                        "    expected = " + sinon.format(expectation),
-                        "    actual = " + sinon.format(actual)
-                    ]
-                    failAssertion(this, formatted.join("\n"));
-                }
-            }
-        };
-
-        mirrorPropAsAssertion("called", "expected %n to have been called at least once but was never called");
-        mirrorPropAsAssertion("notCalled", function (spy) {
-            return !spy.called;
-        }, "expected %n to not have been called but was called %c%C");
-        mirrorPropAsAssertion("calledOnce", "expected %n to be called once but was called %c%C");
-        mirrorPropAsAssertion("calledTwice", "expected %n to be called twice but was called %c%C");
-        mirrorPropAsAssertion("calledThrice", "expected %n to be called thrice but was called %c%C");
-        mirrorPropAsAssertion("calledOn", "expected %n to be called with %1 as this but was called with %t");
-        mirrorPropAsAssertion("alwaysCalledOn", "expected %n to always be called with %1 as this but was called with %t");
-        mirrorPropAsAssertion("calledWithNew", "expected %n to be called with new");
-        mirrorPropAsAssertion("alwaysCalledWithNew", "expected %n to always be called with new");
-        mirrorPropAsAssertion("calledWith", "expected %n to be called with arguments %*%C");
-        mirrorPropAsAssertion("calledWithMatch", "expected %n to be called with match %*%C");
-        mirrorPropAsAssertion("alwaysCalledWith", "expected %n to always be called with arguments %*%C");
-        mirrorPropAsAssertion("alwaysCalledWithMatch", "expected %n to always be called with match %*%C");
-        mirrorPropAsAssertion("calledWithExactly", "expected %n to be called with exact arguments %*%C");
-        mirrorPropAsAssertion("alwaysCalledWithExactly", "expected %n to always be called with exact arguments %*%C");
-        mirrorPropAsAssertion("neverCalledWith", "expected %n to never be called with arguments %*%C");
-        mirrorPropAsAssertion("neverCalledWithMatch", "expected %n to never be called with match %*%C");
-        mirrorPropAsAssertion("threw", "%n did not throw exception%C");
-        mirrorPropAsAssertion("alwaysThrew", "%n did not always throw exception%C");
-
-        sinon.assert = assert;
-        return assert;
-    }
-
-    var isNode = typeof module !== "undefined" && module.exports && typeof require == "function";
-    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
-
-    function loadDependencies(require, exports, module) {
-        var sinon = require("./util/core");
-        require("./match");
-        require("./format");
-        module.exports = makeApi(sinon);
-    }
-
-    if (isAMD) {
-        define(loadDependencies);
-    } else if (isNode) {
-        loadDependencies(require, module.exports, module);
-    } else if (!sinon) {
-        return;
-    } else {
-        makeApi(sinon);
-    }
-
-}(typeof sinon == "object" && sinon || null, typeof window != "undefined" ? window : (typeof self != "undefined") ? self : global));
-
-  return sinon;
-}));
diff --git a/resources/lib/sinonjs/sinon-1.17.3.js b/resources/lib/sinonjs/sinon-1.17.3.js
new file mode 100644 (file)
index 0000000..d77b317
--- /dev/null
@@ -0,0 +1,6437 @@
+/**
+ * Sinon.JS 1.17.3, 2016/01/27
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS
+ *
+ * (The BSD License)
+ * 
+ * Copyright (c) 2010-2014, Christian Johansen, christian@cjohansen.no
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 
+ *     * Redistributions of source code must retain the above copyright notice,
+ *       this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright notice,
+ *       this list of conditions and the following disclaimer in the documentation
+ *       and/or other materials provided with the distribution.
+ *     * Neither the name of Christian Johansen nor the names of his contributors
+ *       may be used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+(function (root, factory) {
+  'use strict';
+  if (typeof define === 'function' && define.amd) {
+    define('sinon', [], function () {
+      return (root.sinon = factory());
+    });
+  } else if (typeof exports === 'object') {
+    module.exports = factory();
+  } else {
+    root.sinon = factory();
+  }
+}(this, function () {
+  'use strict';
+  var samsam, formatio, lolex;
+  (function () {
+                function define(mod, deps, fn) {
+                  if (mod == "samsam") {
+                    samsam = deps();
+                  } else if (typeof deps === "function" && mod.length === 0) {
+                    lolex = deps();
+                  } else if (typeof fn === "function") {
+                    formatio = fn(samsam);
+                  }
+                }
+    define.amd = {};
+((typeof define === "function" && define.amd && function (m) { define("samsam", m); }) ||
+ (typeof module === "object" &&
+      function (m) { module.exports = m(); }) || // Node
+ function (m) { this.samsam = m(); } // Browser globals
+)(function () {
+    var o = Object.prototype;
+    var div = typeof document !== "undefined" && document.createElement("div");
+
+    function isNaN(value) {
+        // Unlike global isNaN, this avoids type coercion
+        // typeof check avoids IE host object issues, hat tip to
+        // lodash
+        var val = value; // JsLint thinks value !== value is "weird"
+        return typeof value === "number" && value !== val;
+    }
+
+    function getClass(value) {
+        // Returns the internal [[Class]] by calling Object.prototype.toString
+        // with the provided value as this. Return value is a string, naming the
+        // internal class, e.g. "Array"
+        return o.toString.call(value).split(/[ \]]/)[1];
+    }
+
+    /**
+     * @name samsam.isArguments
+     * @param Object object
+     *
+     * Returns ``true`` if ``object`` is an ``arguments`` object,
+     * ``false`` otherwise.
+     */
+    function isArguments(object) {
+        if (getClass(object) === 'Arguments') { return true; }
+        if (typeof object !== "object" || typeof object.length !== "number" ||
+                getClass(object) === "Array") {
+            return false;
+        }
+        if (typeof object.callee == "function") { return true; }
+        try {
+            object[object.length] = 6;
+            delete object[object.length];
+        } catch (e) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * @name samsam.isElement
+     * @param Object object
+     *
+     * Returns ``true`` if ``object`` is a DOM element node. Unlike
+     * Underscore.js/lodash, this function will return ``false`` if ``object``
+     * is an *element-like* object, i.e. a regular object with a ``nodeType``
+     * property that holds the value ``1``.
+     */
+    function isElement(object) {
+        if (!object || object.nodeType !== 1 || !div) { return false; }
+        try {
+            object.appendChild(div);
+            object.removeChild(div);
+        } catch (e) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * @name samsam.keys
+     * @param Object object
+     *
+     * Return an array of own property names.
+     */
+    function keys(object) {
+        var ks = [], prop;
+        for (prop in object) {
+            if (o.hasOwnProperty.call(object, prop)) { ks.push(prop); }
+        }
+        return ks;
+    }
+
+    /**
+     * @name samsam.isDate
+     * @param Object value
+     *
+     * Returns true if the object is a ``Date``, or *date-like*. Duck typing
+     * of date objects work by checking that the object has a ``getTime``
+     * function whose return value equals the return value from the object's
+     * ``valueOf``.
+     */
+    function isDate(value) {
+        return typeof value.getTime == "function" &&
+            value.getTime() == value.valueOf();
+    }
+
+    /**
+     * @name samsam.isNegZero
+     * @param Object value
+     *
+     * Returns ``true`` if ``value`` is ``-0``.
+     */
+    function isNegZero(value) {
+        return value === 0 && 1 / value === -Infinity;
+    }
+
+    /**
+     * @name samsam.equal
+     * @param Object obj1
+     * @param Object obj2
+     *
+     * Returns ``true`` if two objects are strictly equal. Compared to
+     * ``===`` there are two exceptions:
+     *
+     *   - NaN is considered equal to NaN
+     *   - -0 and +0 are not considered equal
+     */
+    function identical(obj1, obj2) {
+        if (obj1 === obj2 || (isNaN(obj1) && isNaN(obj2))) {
+            return obj1 !== 0 || isNegZero(obj1) === isNegZero(obj2);
+        }
+    }
+
+
+    /**
+     * @name samsam.deepEqual
+     * @param Object obj1
+     * @param Object obj2
+     *
+     * Deep equal comparison. Two values are "deep equal" if:
+     *
+     *   - They are equal, according to samsam.identical
+     *   - They are both date objects representing the same time
+     *   - They are both arrays containing elements that are all deepEqual
+     *   - They are objects with the same set of properties, and each property
+     *     in ``obj1`` is deepEqual to the corresponding property in ``obj2``
+     *
+     * Supports cyclic objects.
+     */
+    function deepEqualCyclic(obj1, obj2) {
+
+        // used for cyclic comparison
+        // contain already visited objects
+        var objects1 = [],
+            objects2 = [],
+        // contain pathes (position in the object structure)
+        // of the already visited objects
+        // indexes same as in objects arrays
+            paths1 = [],
+            paths2 = [],
+        // contains combinations of already compared objects
+        // in the manner: { "$1['ref']$2['ref']": true }
+            compared = {};
+
+        /**
+         * used to check, if the value of a property is an object
+         * (cyclic logic is only needed for objects)
+         * only needed for cyclic logic
+         */
+        function isObject(value) {
+
+            if (typeof value === 'object' && value !== null &&
+                    !(value instanceof Boolean) &&
+                    !(value instanceof Date)    &&
+                    !(value instanceof Number)  &&
+                    !(value instanceof RegExp)  &&
+                    !(value instanceof String)) {
+
+                return true;
+            }
+
+            return false;
+        }
+
+        /**
+         * returns the index of the given object in the
+         * given objects array, -1 if not contained
+         * only needed for cyclic logic
+         */
+        function getIndex(objects, obj) {
+
+            var i;
+            for (i = 0; i < objects.length; i++) {
+                if (objects[i] === obj) {
+                    return i;
+                }
+            }
+
+            return -1;
+        }
+
+        // does the recursion for the deep equal check
+        return (function deepEqual(obj1, obj2, path1, path2) {
+            var type1 = typeof obj1;
+            var type2 = typeof obj2;
+
+            // == null also matches undefined
+            if (obj1 === obj2 ||
+                    isNaN(obj1) || isNaN(obj2) ||
+                    obj1 == null || obj2 == null ||
+                    type1 !== "object" || type2 !== "object") {
+
+                return identical(obj1, obj2);
+            }
+
+            // Elements are only equal if identical(expected, actual)
+            if (isElement(obj1) || isElement(obj2)) { return false; }
+
+            var isDate1 = isDate(obj1), isDate2 = isDate(obj2);
+            if (isDate1 || isDate2) {
+                if (!isDate1 || !isDate2 || obj1.getTime() !== obj2.getTime()) {
+                    return false;
+                }
+            }
+
+            if (obj1 instanceof RegExp && obj2 instanceof RegExp) {
+                if (obj1.toString() !== obj2.toString()) { return false; }
+            }
+
+            var class1 = getClass(obj1);
+            var class2 = getClass(obj2);
+            var keys1 = keys(obj1);
+            var keys2 = keys(obj2);
+
+            if (isArguments(obj1) || isArguments(obj2)) {
+                if (obj1.length !== obj2.length) { return false; }
+            } else {
+                if (type1 !== type2 || class1 !== class2 ||
+                        keys1.length !== keys2.length) {
+                    return false;
+                }
+            }
+
+            var key, i, l,
+                // following vars are used for the cyclic logic
+                value1, value2,
+                isObject1, isObject2,
+                index1, index2,
+                newPath1, newPath2;
+
+            for (i = 0, l = keys1.length; i < l; i++) {
+                key = keys1[i];
+                if (!o.hasOwnProperty.call(obj2, key)) {
+                    return false;
+                }
+
+                // Start of the cyclic logic
+
+                value1 = obj1[key];
+                value2 = obj2[key];
+
+                isObject1 = isObject(value1);
+                isObject2 = isObject(value2);
+
+                // determine, if the objects were already visited
+                // (it's faster to check for isObject first, than to
+                // get -1 from getIndex for non objects)
+                index1 = isObject1 ? getIndex(objects1, value1) : -1;
+                index2 = isObject2 ? getIndex(objects2, value2) : -1;
+
+                // determine the new pathes of the objects
+                // - for non cyclic objects the current path will be extended
+                //   by current property name
+                // - for cyclic objects the stored path is taken
+                newPath1 = index1 !== -1
+                    ? paths1[index1]
+                    : path1 + '[' + JSON.stringify(key) + ']';
+                newPath2 = index2 !== -1
+                    ? paths2[index2]
+                    : path2 + '[' + JSON.stringify(key) + ']';
+
+                // stop recursion if current objects are already compared
+                if (compared[newPath1 + newPath2]) {
+                    return true;
+                }
+
+                // remember the current objects and their pathes
+                if (index1 === -1 && isObject1) {
+                    objects1.push(value1);
+                    paths1.push(newPath1);
+                }
+                if (index2 === -1 && isObject2) {
+                    objects2.push(value2);
+                    paths2.push(newPath2);
+                }
+
+                // remember that the current objects are already compared
+                if (isObject1 && isObject2) {
+                    compared[newPath1 + newPath2] = true;
+                }
+
+                // End of cyclic logic
+
+                // neither value1 nor value2 is a cycle
+                // continue with next level
+                if (!deepEqual(value1, value2, newPath1, newPath2)) {
+                    return false;
+                }
+            }
+
+            return true;
+
+        }(obj1, obj2, '$1', '$2'));
+    }
+
+    var match;
+
+    function arrayContains(array, subset) {
+        if (subset.length === 0) { return true; }
+        var i, l, j, k;
+        for (i = 0, l = array.length; i < l; ++i) {
+            if (match(array[i], subset[0])) {
+                for (j = 0, k = subset.length; j < k; ++j) {
+                    if (!match(array[i + j], subset[j])) { return false; }
+                }
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * @name samsam.match
+     * @param Object object
+     * @param Object matcher
+     *
+     * Compare arbitrary value ``object`` with matcher.
+     */
+    match = function match(object, matcher) {
+        if (matcher && typeof matcher.test === "function") {
+            return matcher.test(object);
+        }
+
+        if (typeof matcher === "function") {
+            return matcher(object) === true;
+        }
+
+        if (typeof matcher === "string") {
+            matcher = matcher.toLowerCase();
+            var notNull = typeof object === "string" || !!object;
+            return notNull &&
+                (String(object)).toLowerCase().indexOf(matcher) >= 0;
+        }
+
+        if (typeof matcher === "number") {
+            return matcher === object;
+        }
+
+        if (typeof matcher === "boolean") {
+            return matcher === object;
+        }
+
+        if (typeof(matcher) === "undefined") {
+            return typeof(object) === "undefined";
+        }
+
+        if (matcher === null) {
+            return object === null;
+        }
+
+        if (getClass(object) === "Array" && getClass(matcher) === "Array") {
+            return arrayContains(object, matcher);
+        }
+
+        if (matcher && typeof matcher === "object") {
+            if (matcher === object) {
+                return true;
+            }
+            var prop;
+            for (prop in matcher) {
+                var value = object[prop];
+                if (typeof value === "undefined" &&
+                        typeof object.getAttribute === "function") {
+                    value = object.getAttribute(prop);
+                }
+                if (matcher[prop] === null || typeof matcher[prop] === 'undefined') {
+                    if (value !== matcher[prop]) {
+                        return false;
+                    }
+                } else if (typeof  value === "undefined" || !match(value, matcher[prop])) {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        throw new Error("Matcher was not a string, a number, a " +
+                        "function, a boolean or an object");
+    };
+
+    return {
+        isArguments: isArguments,
+        isElement: isElement,
+        isDate: isDate,
+        isNegZero: isNegZero,
+        identical: identical,
+        deepEqual: deepEqualCyclic,
+        match: match,
+        keys: keys
+    };
+});
+((typeof define === "function" && define.amd && function (m) {
+    define("formatio", ["samsam"], m);
+}) || (typeof module === "object" && function (m) {
+    module.exports = m(require("samsam"));
+}) || function (m) { this.formatio = m(this.samsam); }
+)(function (samsam) {
+    
+    var formatio = {
+        excludeConstructors: ["Object", /^.$/],
+        quoteStrings: true,
+        limitChildrenCount: 0
+    };
+
+    var hasOwn = Object.prototype.hasOwnProperty;
+
+    var specialObjects = [];
+    if (typeof global !== "undefined") {
+        specialObjects.push({ object: global, value: "[object global]" });
+    }
+    if (typeof document !== "undefined") {
+        specialObjects.push({
+            object: document,
+            value: "[object HTMLDocument]"
+        });
+    }
+    if (typeof window !== "undefined") {
+        specialObjects.push({ object: window, value: "[object Window]" });
+    }
+
+    function functionName(func) {
+        if (!func) { return ""; }
+        if (func.displayName) { return func.displayName; }
+        if (func.name) { return func.name; }
+        var matches = func.toString().match(/function\s+([^\(]+)/m);
+        return (matches && matches[1]) || "";
+    }
+
+    function constructorName(f, object) {
+        var name = functionName(object && object.constructor);
+        var excludes = f.excludeConstructors ||
+                formatio.excludeConstructors || [];
+
+        var i, l;
+        for (i = 0, l = excludes.length; i < l; ++i) {
+            if (typeof excludes[i] === "string" && excludes[i] === name) {
+                return "";
+            } else if (excludes[i].test && excludes[i].test(name)) {
+                return "";
+            }
+        }
+
+        return name;
+    }
+
+    function isCircular(object, objects) {
+        if (typeof object !== "object") { return false; }
+        var i, l;
+        for (i = 0, l = objects.length; i < l; ++i) {
+            if (objects[i] === object) { return true; }
+        }
+        return false;
+    }
+
+    function ascii(f, object, processed, indent) {
+        if (typeof object === "string") {
+            var qs = f.quoteStrings;
+            var quote = typeof qs !== "boolean" || qs;
+            return processed || quote ? '"' + object + '"' : object;
+        }
+
+        if (typeof object === "function" && !(object instanceof RegExp)) {
+            return ascii.func(object);
+        }
+
+        processed = processed || [];
+
+        if (isCircular(object, processed)) { return "[Circular]"; }
+
+        if (Object.prototype.toString.call(object) === "[object Array]") {
+            return ascii.array.call(f, object, processed);
+        }
+
+        if (!object) { return String((1/object) === -Infinity ? "-0" : object); }
+        if (samsam.isElement(object)) { return ascii.element(object); }
+
+        if (typeof object.toString === "function" &&
+                object.toString !== Object.prototype.toString) {
+            return object.toString();
+        }
+
+        var i, l;
+        for (i = 0, l = specialObjects.length; i < l; i++) {
+            if (object === specialObjects[i].object) {
+                return specialObjects[i].value;
+            }
+        }
+
+        return ascii.object.call(f, object, processed, indent);
+    }
+
+    ascii.func = function (func) {
+        return "function " + functionName(func) + "() {}";
+    };
+
+    ascii.array = function (array, processed) {
+        processed = processed || [];
+        processed.push(array);
+        var pieces = [];
+        var i, l;
+        l = (this.limitChildrenCount > 0) ? 
+            Math.min(this.limitChildrenCount, array.length) : array.length;
+
+        for (i = 0; i < l; ++i) {
+            pieces.push(ascii(this, array[i], processed));
+        }
+
+        if(l < array.length)
+            pieces.push("[... " + (array.length - l) + " more elements]");
+
+        return "[" + pieces.join(", ") + "]";
+    };
+
+    ascii.object = function (object, processed, indent) {
+        processed = processed || [];
+        processed.push(object);
+        indent = indent || 0;
+        var pieces = [], properties = samsam.keys(object).sort();
+        var length = 3;
+        var prop, str, obj, i, k, l;
+        l = (this.limitChildrenCount > 0) ? 
+            Math.min(this.limitChildrenCount, properties.length) : properties.length;
+
+        for (i = 0; i < l; ++i) {
+            prop = properties[i];
+            obj = object[prop];
+
+            if (isCircular(obj, processed)) {
+                str = "[Circular]";
+            } else {
+                str = ascii(this, obj, processed, indent + 2);
+            }
+
+            str = (/\s/.test(prop) ? '"' + prop + '"' : prop) + ": " + str;
+            length += str.length;
+            pieces.push(str);
+        }
+
+        var cons = constructorName(this, object);
+        var prefix = cons ? "[" + cons + "] " : "";
+        var is = "";
+        for (i = 0, k = indent; i < k; ++i) { is += " "; }
+
+        if(l < properties.length)
+            pieces.push("[... " + (properties.length - l) + " more elements]");
+
+        if (length + indent > 80) {
+            return prefix + "{\n  " + is + pieces.join(",\n  " + is) + "\n" +
+                is + "}";
+        }
+        return prefix + "{ " + pieces.join(", ") + " }";
+    };
+
+    ascii.element = function (element) {
+        var tagName = element.tagName.toLowerCase();
+        var attrs = element.attributes, attr, pairs = [], attrName, i, l, val;
+
+        for (i = 0, l = attrs.length; i < l; ++i) {
+            attr = attrs.item(i);
+            attrName = attr.nodeName.toLowerCase().replace("html:", "");
+            val = attr.nodeValue;
+            if (attrName !== "contenteditable" || val !== "inherit") {
+                if (!!val) { pairs.push(attrName + "=\"" + val + "\""); }
+            }
+        }
+
+        var formatted = "<" + tagName + (pairs.length > 0 ? " " : "");
+        var content = element.innerHTML;
+
+        if (content.length > 20) {
+            content = content.substr(0, 20) + "[...]";
+        }
+
+        var res = formatted + pairs.join(" ") + ">" + content +
+                "</" + tagName + ">";
+
+        return res.replace(/ contentEditable="inherit"/, "");
+    };
+
+    function Formatio(options) {
+        for (var opt in options) {
+            this[opt] = options[opt];
+        }
+    }
+
+    Formatio.prototype = {
+        functionName: functionName,
+
+        configure: function (options) {
+            return new Formatio(options);
+        },
+
+        constructorName: function (object) {
+            return constructorName(this, object);
+        },
+
+        ascii: function (object, processed, indent) {
+            return ascii(this, object, processed, indent);
+        }
+    };
+
+    return Formatio.prototype;
+});
+!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.lolex=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+(function (global){
+/*global global, window*/
+/**
+ * @author Christian Johansen (christian@cjohansen.no) and contributors
+ * @license BSD
+ *
+ * Copyright (c) 2010-2014 Christian Johansen
+ */
+
+(function (global) {
+    
+    // Make properties writable in IE, as per
+    // http://www.adequatelygood.com/Replacing-setTimeout-Globally.html
+    // JSLint being anal
+    var glbl = global;
+
+    global.setTimeout = glbl.setTimeout;
+    global.clearTimeout = glbl.clearTimeout;
+    global.setInterval = glbl.setInterval;
+    global.clearInterval = glbl.clearInterval;
+    global.Date = glbl.Date;
+
+    // setImmediate is not a standard function
+    // avoid adding the prop to the window object if not present
+    if('setImmediate' in global) {
+        global.setImmediate = glbl.setImmediate;
+        global.clearImmediate = glbl.clearImmediate;
+    }
+
+    // node expects setTimeout/setInterval to return a fn object w/ .ref()/.unref()
+    // browsers, a number.
+    // see https://github.com/cjohansen/Sinon.JS/pull/436
+
+    var NOOP = function () { return undefined; };
+    var timeoutResult = setTimeout(NOOP, 0);
+    var addTimerReturnsObject = typeof timeoutResult === "object";
+    clearTimeout(timeoutResult);
+
+    var NativeDate = Date;
+    var uniqueTimerId = 1;
+
+    /**
+     * Parse strings like "01:10:00" (meaning 1 hour, 10 minutes, 0 seconds) into
+     * number of milliseconds. This is used to support human-readable strings passed
+     * to clock.tick()
+     */
+    function parseTime(str) {
+        if (!str) {
+            return 0;
+        }
+
+        var strings = str.split(":");
+        var l = strings.length, i = l;
+        var ms = 0, parsed;
+
+        if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) {
+            throw new Error("tick only understands numbers, 'm:s' and 'h:m:s'. Each part must be two digits");
+        }
+
+        while (i--) {
+            parsed = parseInt(strings[i], 10);
+
+            if (parsed >= 60) {
+                throw new Error("Invalid time " + str);
+            }
+
+            ms += parsed * Math.pow(60, (l - i - 1));
+        }
+
+        return ms * 1000;
+    }
+
+    /**
+     * Used to grok the `now` parameter to createClock.
+     */
+    function getEpoch(epoch) {
+        if (!epoch) { return 0; }
+        if (typeof epoch.getTime === "function") { return epoch.getTime(); }
+        if (typeof epoch === "number") { return epoch; }
+        throw new TypeError("now should be milliseconds since UNIX epoch");
+    }
+
+    function inRange(from, to, timer) {
+        return timer && timer.callAt >= from && timer.callAt <= to;
+    }
+
+    function mirrorDateProperties(target, source) {
+        var prop;
+        for (prop in source) {
+            if (source.hasOwnProperty(prop)) {
+                target[prop] = source[prop];
+            }
+        }
+
+        // set special now implementation
+        if (source.now) {
+            target.now = function now() {
+                return target.clock.now;
+            };
+        } else {
+            delete target.now;
+        }
+
+        // set special toSource implementation
+        if (source.toSource) {
+            target.toSource = function toSource() {
+                return source.toSource();
+            };
+        } else {
+            delete target.toSource;
+        }
+
+        // set special toString implementation
+        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;
+
+        return target;
+    }
+
+    function createDate() {
+        function ClockDate(year, month, date, hour, minute, second, ms) {
+            // Defensive and verbose to avoid potential harm in passing
+            // explicit undefined when user does not pass argument
+            switch (arguments.length) {
+            case 0:
+                return new NativeDate(ClockDate.clock.now);
+            case 1:
+                return new NativeDate(year);
+            case 2:
+                return new NativeDate(year, month);
+            case 3:
+                return new NativeDate(year, month, date);
+            case 4:
+                return new NativeDate(year, month, date, hour);
+            case 5:
+                return new NativeDate(year, month, date, hour, minute);
+            case 6:
+                return new NativeDate(year, month, date, hour, minute, second);
+            default:
+                return new NativeDate(year, month, date, hour, minute, second, ms);
+            }
+        }
+
+        return mirrorDateProperties(ClockDate, NativeDate);
+    }
+
+    function addTimer(clock, timer) {
+        if (timer.func === undefined) {
+            throw new Error("Callback must be provided to timer calls");
+        }
+
+        if (!clock.timers) {
+            clock.timers = {};
+        }
+
+        timer.id = uniqueTimerId++;
+        timer.createdAt = clock.now;
+        timer.callAt = clock.now + (timer.delay || (clock.duringTick ? 1 : 0));
+
+        clock.timers[timer.id] = timer;
+
+        if (addTimerReturnsObject) {
+            return {
+                id: timer.id,
+                ref: NOOP,
+                unref: NOOP
+            };
+        }
+
+        return timer.id;
+    }
+
+
+    function compareTimers(a, b) {
+        // Sort first by absolute timing
+        if (a.callAt < b.callAt) {
+            return -1;
+        }
+        if (a.callAt > b.callAt) {
+            return 1;
+        }
+
+        // Sort next by immediate, immediate timers take precedence
+        if (a.immediate && !b.immediate) {
+            return -1;
+        }
+        if (!a.immediate && b.immediate) {
+            return 1;
+        }
+
+        // Sort next by creation time, earlier-created timers take precedence
+        if (a.createdAt < b.createdAt) {
+            return -1;
+        }
+        if (a.createdAt > b.createdAt) {
+            return 1;
+        }
+
+        // Sort next by id, lower-id timers take precedence
+        if (a.id < b.id) {
+            return -1;
+        }
+        if (a.id > b.id) {
+            return 1;
+        }
+
+        // As timer ids are unique, no fallback `0` is necessary
+    }
+
+    function firstTimerInRange(clock, from, to) {
+        var timers = clock.timers,
+            timer = null,
+            id,
+            isInRange;
+
+        for (id in timers) {
+            if (timers.hasOwnProperty(id)) {
+                isInRange = inRange(from, to, timers[id]);
+
+                if (isInRange && (!timer || compareTimers(timer, timers[id]) === 1)) {
+                    timer = timers[id];
+                }
+            }
+        }
+
+        return timer;
+    }
+
+    function firstTimer(clock) {
+        var timers = clock.timers,
+            timer = null,
+            id;
+
+        for (id in timers) {
+            if (timers.hasOwnProperty(id)) {
+                if (!timer || compareTimers(timer, timers[id]) === 1) {
+                    timer = timers[id];
+                }
+            }
+        }
+
+        return timer;
+    }
+
+    function callTimer(clock, timer) {
+        var exception;
+
+        if (typeof timer.interval === "number") {
+            clock.timers[timer.id].callAt += timer.interval;
+        } else {
+            delete clock.timers[timer.id];
+        }
+
+        try {
+            if (typeof timer.func === "function") {
+                timer.func.apply(null, timer.args);
+            } else {
+                eval(timer.func);
+            }
+        } catch (e) {
+            exception = e;
+        }
+
+        if (!clock.timers[timer.id]) {
+            if (exception) {
+                throw exception;
+            }
+            return;
+        }
+
+        if (exception) {
+            throw exception;
+        }
+    }
+
+    function timerType(timer) {
+        if (timer.immediate) {
+            return "Immediate";
+        } else if (typeof timer.interval !== "undefined") {
+            return "Interval";
+        } else {
+            return "Timeout";
+        }
+    }
+
+    function clearTimer(clock, timerId, ttype) {
+        if (!timerId) {
+            // null appears to be allowed in most browsers, and appears to be
+            // relied upon by some libraries, like Bootstrap carousel
+            return;
+        }
+
+        if (!clock.timers) {
+            clock.timers = [];
+        }
+
+        // in Node, timerId is an object with .ref()/.unref(), and
+        // its .id field is the actual timer id.
+        if (typeof timerId === "object") {
+            timerId = timerId.id;
+        }
+
+        if (clock.timers.hasOwnProperty(timerId)) {
+            // check that the ID matches a timer of the correct type
+            var timer = clock.timers[timerId];
+            if (timerType(timer) === ttype) {
+                delete clock.timers[timerId];
+            } else {
+                               throw new Error("Cannot clear timer: timer created with set" + ttype + "() but cleared with clear" + timerType(timer) + "()");
+                       }
+        }
+    }
+
+    function uninstall(clock, target) {
+        var method,
+            i,
+            l;
+
+        for (i = 0, l = clock.methods.length; i < l; i++) {
+            method = clock.methods[i];
+
+            if (target[method].hadOwnProperty) {
+                target[method] = clock["_" + method];
+            } else {
+                try {
+                    delete target[method];
+                } catch (ignore) {}
+            }
+        }
+
+        // Prevent multiple executions which will completely remove these props
+        clock.methods = [];
+    }
+
+    function hijackMethod(target, method, clock) {
+        var prop;
+
+        clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(target, method);
+        clock["_" + method] = target[method];
+
+        if (method === "Date") {
+            var date = mirrorDateProperties(clock[method], target[method]);
+            target[method] = date;
+        } else {
+            target[method] = function () {
+                return clock[method].apply(clock, arguments);
+            };
+
+            for (prop in clock[method]) {
+                if (clock[method].hasOwnProperty(prop)) {
+                    target[method][prop] = clock[method][prop];
+                }
+            }
+        }
+
+        target[method].clock = clock;
+    }
+
+    var timers = {
+        setTimeout: setTimeout,
+        clearTimeout: clearTimeout,
+        setImmediate: global.setImmediate,
+        clearImmediate: global.clearImmediate,
+        setInterval: setInterval,
+        clearInterval: clearInterval,
+        Date: Date
+    };
+
+    var keys = Object.keys || function (obj) {
+        var ks = [],
+            key;
+
+        for (key in obj) {
+            if (obj.hasOwnProperty(key)) {
+                ks.push(key);
+            }
+        }
+
+        return ks;
+    };
+
+    exports.timers = timers;
+
+    function createClock(now) {
+        var clock = {
+            now: getEpoch(now),
+            timeouts: {},
+            Date: createDate()
+        };
+
+        clock.Date.clock = clock;
+
+        clock.setTimeout = function setTimeout(func, timeout) {
+            return addTimer(clock, {
+                func: func,
+                args: Array.prototype.slice.call(arguments, 2),
+                delay: timeout
+            });
+        };
+
+        clock.clearTimeout = function clearTimeout(timerId) {
+            return clearTimer(clock, timerId, "Timeout");
+        };
+
+        clock.setInterval = function setInterval(func, timeout) {
+            return addTimer(clock, {
+                func: func,
+                args: Array.prototype.slice.call(arguments, 2),
+                delay: timeout,
+                interval: timeout
+            });
+        };
+
+        clock.clearInterval = function clearInterval(timerId) {
+            return clearTimer(clock, timerId, "Interval");
+        };
+
+        clock.setImmediate = function setImmediate(func) {
+            return addTimer(clock, {
+                func: func,
+                args: Array.prototype.slice.call(arguments, 1),
+                immediate: true
+            });
+        };
+
+        clock.clearImmediate = function clearImmediate(timerId) {
+            return clearTimer(clock, timerId, "Immediate");
+        };
+
+        clock.tick = function tick(ms) {
+            ms = typeof ms === "number" ? ms : parseTime(ms);
+            var tickFrom = clock.now, tickTo = clock.now + ms, previous = clock.now;
+            var timer = firstTimerInRange(clock, tickFrom, tickTo);
+            var oldNow;
+
+            clock.duringTick = true;
+
+            var firstException;
+            while (timer && tickFrom <= tickTo) {
+                if (clock.timers[timer.id]) {
+                    tickFrom = clock.now = timer.callAt;
+                    try {
+                        oldNow = clock.now;
+                        callTimer(clock, timer);
+                        // compensate for any setSystemTime() call during timer callback
+                        if (oldNow !== clock.now) {
+                            tickFrom += clock.now - oldNow;
+                            tickTo += clock.now - oldNow;
+                            previous += clock.now - oldNow;
+                        }
+                    } catch (e) {
+                        firstException = firstException || e;
+                    }
+                }
+
+                timer = firstTimerInRange(clock, previous, tickTo);
+                previous = tickFrom;
+            }
+
+            clock.duringTick = false;
+            clock.now = tickTo;
+
+            if (firstException) {
+                throw firstException;
+            }
+
+            return clock.now;
+        };
+
+        clock.next = function next() {
+            var timer = firstTimer(clock);
+            if (!timer) {
+                return clock.now;
+            }
+
+            clock.duringTick = true;
+            try {
+                clock.now = timer.callAt;
+                callTimer(clock, timer);
+                return clock.now;
+            } finally {
+                clock.duringTick = false;
+            }
+        };
+
+        clock.reset = function reset() {
+            clock.timers = {};
+        };
+
+        clock.setSystemTime = function setSystemTime(now) {
+            // determine time difference
+            var newNow = getEpoch(now);
+            var difference = newNow - clock.now;
+
+            // update 'system clock'
+            clock.now = newNow;
+
+            // update timers and intervals to keep them stable
+            for (var id in clock.timers) {
+                if (clock.timers.hasOwnProperty(id)) {
+                    var timer = clock.timers[id];
+                    timer.createdAt += difference;
+                    timer.callAt += difference;
+                }
+            }
+        };
+
+        return clock;
+    }
+    exports.createClock = createClock;
+
+    exports.install = function install(target, now, toFake) {
+        var i,
+            l;
+
+        if (typeof target === "number") {
+            toFake = now;
+            now = target;
+            target = null;
+        }
+
+        if (!target) {
+            target = global;
+        }
+
+        var clock = createClock(now);
+
+        clock.uninstall = function () {
+            uninstall(clock, target);
+        };
+
+        clock.methods = toFake || [];
+
+        if (clock.methods.length === 0) {
+            clock.methods = keys(timers);
+        }
+
+        for (i = 0, l = clock.methods.length; i < l; i++) {
+            hijackMethod(target, clock.methods[i], clock);
+        }
+
+        return clock;
+    };
+
+}(global || this));
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}]},{},[1])(1)
+});
+  })();
+  var define;
+/**
+ * Sinon core utilities. For internal use only.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+var sinon = (function () {
+"use strict";
+ // eslint-disable-line no-unused-vars
+    
+    var sinonModule;
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        sinonModule = module.exports = require("./sinon/util/core");
+        require("./sinon/extend");
+        require("./sinon/walk");
+        require("./sinon/typeOf");
+        require("./sinon/times_in_words");
+        require("./sinon/spy");
+        require("./sinon/call");
+        require("./sinon/behavior");
+        require("./sinon/stub");
+        require("./sinon/mock");
+        require("./sinon/collection");
+        require("./sinon/assert");
+        require("./sinon/sandbox");
+        require("./sinon/test");
+        require("./sinon/test_case");
+        require("./sinon/match");
+        require("./sinon/format");
+        require("./sinon/log_error");
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+        sinonModule = module.exports;
+    } else {
+        sinonModule = {};
+    }
+
+    return sinonModule;
+}());
+
+/**
+ * @depend ../../sinon.js
+ */
+/**
+ * Sinon core utilities. For internal use only.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal) {
+    
+    var div = typeof document !== "undefined" && document.createElement("div");
+    var hasOwn = Object.prototype.hasOwnProperty;
+
+    function isDOMNode(obj) {
+        var success = false;
+
+        try {
+            obj.appendChild(div);
+            success = div.parentNode === obj;
+        } catch (e) {
+            return false;
+        } finally {
+            try {
+                obj.removeChild(div);
+            } catch (e) {
+                // Remove failed, not much we can do about that
+            }
+        }
+
+        return success;
+    }
+
+    function isElement(obj) {
+        return div && obj && obj.nodeType === 1 && isDOMNode(obj);
+    }
+
+    function isFunction(obj) {
+        return typeof obj === "function" || !!(obj && obj.constructor && obj.call && obj.apply);
+    }
+
+    function isReallyNaN(val) {
+        return typeof val === "number" && isNaN(val);
+    }
+
+    function mirrorProperties(target, source) {
+        for (var prop in source) {
+            if (!hasOwn.call(target, prop)) {
+                target[prop] = source[prop];
+            }
+        }
+    }
+
+    function isRestorable(obj) {
+        return typeof obj === "function" && typeof obj.restore === "function" && obj.restore.sinon;
+    }
+
+    // Cheap way to detect if we have ES5 support.
+    var hasES5Support = "keys" in Object;
+
+    function makeApi(sinon) {
+        sinon.wrapMethod = function wrapMethod(object, property, method) {
+            if (!object) {
+                throw new TypeError("Should wrap property of object");
+            }
+
+            if (typeof method !== "function" && typeof method !== "object") {
+                throw new TypeError("Method wrapper should be a function or a property descriptor");
+            }
+
+            function checkWrappedMethod(wrappedMethod) {
+                var error;
+
+                if (!isFunction(wrappedMethod)) {
+                    error = new TypeError("Attempted to wrap " + (typeof wrappedMethod) + " property " +
+                                        property + " as function");
+                } else if (wrappedMethod.restore && wrappedMethod.restore.sinon) {
+                    error = new TypeError("Attempted to wrap " + property + " which is already wrapped");
+                } else if (wrappedMethod.calledBefore) {
+                    var verb = wrappedMethod.returns ? "stubbed" : "spied on";
+                    error = new TypeError("Attempted to wrap " + property + " which is already " + verb);
+                }
+
+                if (error) {
+                    if (wrappedMethod && wrappedMethod.stackTrace) {
+                        error.stack += "\n--------------\n" + wrappedMethod.stackTrace;
+                    }
+                    throw error;
+                }
+            }
+
+            var error, wrappedMethod, i;
+
+            // IE 8 does not support hasOwnProperty on the window object and Firefox has a problem
+            // when using hasOwn.call on objects from other frames.
+            var owned = object.hasOwnProperty ? object.hasOwnProperty(property) : hasOwn.call(object, property);
+
+            if (hasES5Support) {
+                var methodDesc = (typeof method === "function") ? {value: method} : method;
+                var wrappedMethodDesc = sinon.getPropertyDescriptor(object, property);
+
+                if (!wrappedMethodDesc) {
+                    error = new TypeError("Attempted to wrap " + (typeof wrappedMethod) + " property " +
+                                        property + " as function");
+                } else if (wrappedMethodDesc.restore && wrappedMethodDesc.restore.sinon) {
+                    error = new TypeError("Attempted to wrap " + property + " which is already wrapped");
+                }
+                if (error) {
+                    if (wrappedMethodDesc && wrappedMethodDesc.stackTrace) {
+                        error.stack += "\n--------------\n" + wrappedMethodDesc.stackTrace;
+                    }
+                    throw error;
+                }
+
+                var types = sinon.objectKeys(methodDesc);
+                for (i = 0; i < types.length; i++) {
+                    wrappedMethod = wrappedMethodDesc[types[i]];
+                    checkWrappedMethod(wrappedMethod);
+                }
+
+                mirrorProperties(methodDesc, wrappedMethodDesc);
+                for (i = 0; i < types.length; i++) {
+                    mirrorProperties(methodDesc[types[i]], wrappedMethodDesc[types[i]]);
+                }
+                Object.defineProperty(object, property, methodDesc);
+            } else {
+                wrappedMethod = object[property];
+                checkWrappedMethod(wrappedMethod);
+                object[property] = method;
+                method.displayName = property;
+            }
+
+            method.displayName = property;
+
+            // Set up a stack trace which can be used later to find what line of
+            // code the original method was created on.
+            method.stackTrace = (new Error("Stack Trace for original")).stack;
+
+            method.restore = function () {
+                // For prototype properties try to reset by delete first.
+                // If this fails (ex: localStorage on mobile safari) then force a reset
+                // via direct assignment.
+                if (!owned) {
+                    // In some cases `delete` may throw an error
+                    try {
+                        delete object[property];
+                    } catch (e) {} // eslint-disable-line no-empty
+                    // For native code functions `delete` fails without throwing an error
+                    // on Chrome < 43, PhantomJS, etc.
+                } else if (hasES5Support) {
+                    Object.defineProperty(object, property, wrappedMethodDesc);
+                }
+
+                // Use strict equality comparison to check failures then force a reset
+                // via direct assignment.
+                if (object[property] === method) {
+                    object[property] = wrappedMethod;
+                }
+            };
+
+            method.restore.sinon = true;
+
+            if (!hasES5Support) {
+                mirrorProperties(method, wrappedMethod);
+            }
+
+            return method;
+        };
+
+        sinon.create = function create(proto) {
+            var F = function () {};
+            F.prototype = proto;
+            return new F();
+        };
+
+        sinon.deepEqual = function deepEqual(a, b) {
+            if (sinon.match && sinon.match.isMatcher(a)) {
+                return a.test(b);
+            }
+
+            if (typeof a !== "object" || typeof b !== "object") {
+                return isReallyNaN(a) && isReallyNaN(b) || 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;
+            var aLength = 0;
+            var bLength = 0;
+
+            if (aString === "[object Array]" && a.length !== b.length) {
+                return false;
+            }
+
+            for (prop in a) {
+                if (a.hasOwnProperty(prop)) {
+                    aLength += 1;
+
+                    if (!(prop in b)) {
+                        return false;
+                    }
+
+                    if (!deepEqual(a[prop], b[prop])) {
+                        return false;
+                    }
+                }
+            }
+
+            for (prop in b) {
+                if (b.hasOwnProperty(prop)) {
+                    bLength += 1;
+                }
+            }
+
+            return aLength === bLength;
+        };
+
+        sinon.functionName = function functionName(func) {
+            var name = func.displayName || func.name;
+
+            // Use function decomposition as a last resort to get function
+            // name. Does not rely on function decomposition to work - if it
+            // doesn't debugging will be slightly less informative
+            // (i.e. toString will say 'spy' rather than 'myFunc').
+            if (!name) {
+                var matches = func.toString().match(/function ([^\s\(]+)/);
+                name = matches && matches[1];
+            }
+
+            return name;
+        };
+
+        sinon.functionToString = function toString() {
+            if (this.getCall && this.callCount) {
+                var thisValue,
+                    prop;
+                var i = this.callCount;
+
+                while (i--) {
+                    thisValue = this.getCall(i).thisValue;
+
+                    for (prop in thisValue) {
+                        if (thisValue[prop] === this) {
+                            return prop;
+                        }
+                    }
+                }
+            }
+
+            return this.displayName || "sinon fake";
+        };
+
+        sinon.objectKeys = function objectKeys(obj) {
+            if (obj !== Object(obj)) {
+                throw new TypeError("sinon.objectKeys called on a non-object");
+            }
+
+            var keys = [];
+            var key;
+            for (key in obj) {
+                if (hasOwn.call(obj, key)) {
+                    keys.push(key);
+                }
+            }
+
+            return keys;
+        };
+
+        sinon.getPropertyDescriptor = function getPropertyDescriptor(object, property) {
+            var proto = object;
+            var descriptor;
+
+            while (proto && !(descriptor = Object.getOwnPropertyDescriptor(proto, property))) {
+                proto = Object.getPrototypeOf(proto);
+            }
+            return descriptor;
+        };
+
+        sinon.getConfig = function (custom) {
+            var config = {};
+            custom = custom || {};
+            var defaults = sinon.defaultConfig;
+
+            for (var prop in defaults) {
+                if (defaults.hasOwnProperty(prop)) {
+                    config[prop] = custom.hasOwnProperty(prop) ? custom[prop] : defaults[prop];
+                }
+            }
+
+            return config;
+        };
+
+        sinon.defaultConfig = {
+            injectIntoThis: true,
+            injectInto: null,
+            properties: ["spy", "stub", "mock", "clock", "server", "requests"],
+            useFakeTimers: true,
+            useFakeServer: true
+        };
+
+        sinon.timesInWords = function timesInWords(count) {
+            return count === 1 && "once" ||
+                count === 2 && "twice" ||
+                count === 3 && "thrice" ||
+                (count || 0) + " times";
+        };
+
+        sinon.calledInOrder = function (spies) {
+            for (var i = 1, l = spies.length; i < l; i++) {
+                if (!spies[i - 1].calledBefore(spies[i]) || !spies[i].called) {
+                    return false;
+                }
+            }
+
+            return true;
+        };
+
+        sinon.orderByFirstCall = function (spies) {
+            return spies.sort(function (a, b) {
+                // uuid, won't ever be equal
+                var aCall = a.getCall(0);
+                var bCall = b.getCall(0);
+                var aId = aCall && aCall.callId || -1;
+                var bId = bCall && bCall.callId || -1;
+
+                return aId < bId ? -1 : 1;
+            });
+        };
+
+        sinon.createStubInstance = function (constructor) {
+            if (typeof constructor !== "function") {
+                throw new TypeError("The constructor should be a function.");
+            }
+            return sinon.stub(sinon.create(constructor.prototype));
+        };
+
+        sinon.restore = function (object) {
+            if (object !== null && typeof object === "object") {
+                for (var prop in object) {
+                    if (isRestorable(object[prop])) {
+                        object[prop].restore();
+                    }
+                }
+            } else if (isRestorable(object)) {
+                object.restore();
+            }
+        };
+
+        return sinon;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports) {
+        makeApi(exports);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+        return;
+    }
+
+    if (isNode) {
+        loadDependencies(require, module.exports, module);
+        return;
+    }
+
+    if (sinonGlobal) {
+        makeApi(sinonGlobal);
+    }
+}(
+    typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ */
+(function (sinonGlobal) {
+    
+    function makeApi(sinon) {
+
+        // Adapted from https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug
+        var hasDontEnumBug = (function () {
+            var obj = {
+                constructor: function () {
+                    return "0";
+                },
+                toString: function () {
+                    return "1";
+                },
+                valueOf: function () {
+                    return "2";
+                },
+                toLocaleString: function () {
+                    return "3";
+                },
+                prototype: function () {
+                    return "4";
+                },
+                isPrototypeOf: function () {
+                    return "5";
+                },
+                propertyIsEnumerable: function () {
+                    return "6";
+                },
+                hasOwnProperty: function () {
+                    return "7";
+                },
+                length: function () {
+                    return "8";
+                },
+                unique: function () {
+                    return "9";
+                }
+            };
+
+            var result = [];
+            for (var prop in obj) {
+                if (obj.hasOwnProperty(prop)) {
+                    result.push(obj[prop]());
+                }
+            }
+            return result.join("") !== "0123456789";
+        })();
+
+        /* Public: Extend target in place with all (own) properties from sources in-order. Thus, last source will
+         *         override properties in previous sources.
+         *
+         * target - The Object to extend
+         * sources - Objects to copy properties from.
+         *
+         * Returns the extended target
+         */
+        function extend(target /*, sources */) {
+            var sources = Array.prototype.slice.call(arguments, 1);
+            var source, i, prop;
+
+            for (i = 0; i < sources.length; i++) {
+                source = sources[i];
+
+                for (prop in source) {
+                    if (source.hasOwnProperty(prop)) {
+                        target[prop] = source[prop];
+                    }
+                }
+
+                // Make sure we copy (own) toString method even when in JScript with DontEnum bug
+                // See https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug
+                if (hasDontEnumBug && source.hasOwnProperty("toString") && source.toString !== target.toString) {
+                    target.toString = source.toString;
+                }
+            }
+
+            return target;
+        }
+
+        sinon.extend = extend;
+        return sinon.extend;
+    }
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        module.exports = makeApi(sinon);
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    if (isAMD) {
+        define(loadDependencies);
+        return;
+    }
+
+    if (isNode) {
+        loadDependencies(require, module.exports, module);
+        return;
+    }
+
+    if (sinonGlobal) {
+        makeApi(sinonGlobal);
+    }
+}(
+    typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ */
+(function (sinonGlobal) {
+    
+    function makeApi(sinon) {
+
+        function timesInWords(count) {
+            switch (count) {
+                case 1:
+                    return "once";
+                case 2:
+                    return "twice";
+                case 3:
+                    return "thrice";
+                default:
+                    return (count || 0) + " times";
+            }
+        }
+
+        sinon.timesInWords = timesInWords;
+        return sinon.timesInWords;
+    }
+
+    function loadDependencies(require, exports, module) {
+        var core = require("./util/core");
+        module.exports = makeApi(core);
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    if (isAMD) {
+        define(loadDependencies);
+        return;
+    }
+
+    if (isNode) {
+        loadDependencies(require, module.exports, module);
+        return;
+    }
+
+    if (sinonGlobal) {
+        makeApi(sinonGlobal);
+    }
+}(
+    typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ */
+/**
+ * Format functions
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2014 Christian Johansen
+ */
+(function (sinonGlobal) {
+    
+    function makeApi(sinon) {
+        function typeOf(value) {
+            if (value === null) {
+                return "null";
+            } else if (value === undefined) {
+                return "undefined";
+            }
+            var string = Object.prototype.toString.call(value);
+            return string.substring(8, string.length - 1).toLowerCase();
+        }
+
+        sinon.typeOf = typeOf;
+        return sinon.typeOf;
+    }
+
+    function loadDependencies(require, exports, module) {
+        var core = require("./util/core");
+        module.exports = makeApi(core);
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    if (isAMD) {
+        define(loadDependencies);
+        return;
+    }
+
+    if (isNode) {
+        loadDependencies(require, module.exports, module);
+        return;
+    }
+
+    if (sinonGlobal) {
+        makeApi(sinonGlobal);
+    }
+}(
+    typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ * @depend typeOf.js
+ */
+/*jslint eqeqeq: false, onevar: false, plusplus: false*/
+/*global module, require, sinon*/
+/**
+ * Match functions
+ *
+ * @author Maximilian Antoni (mail@maxantoni.de)
+ * @license BSD
+ *
+ * Copyright (c) 2012 Maximilian Antoni
+ */
+(function (sinonGlobal) {
+    
+    function makeApi(sinon) {
+        function assertType(value, type, name) {
+            var actual = sinon.typeOf(value);
+            if (actual !== type) {
+                throw new TypeError("Expected type of " + name + " to be " +
+                    type + ", but was " + actual);
+            }
+        }
+
+        var matcher = {
+            toString: function () {
+                return this.message;
+            }
+        };
+
+        function isMatcher(object) {
+            return matcher.isPrototypeOf(object);
+        }
+
+        function matchObject(expectation, actual) {
+            if (actual === null || actual === undefined) {
+                return false;
+            }
+            for (var key in expectation) {
+                if (expectation.hasOwnProperty(key)) {
+                    var exp = expectation[key];
+                    var act = actual[key];
+                    if (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;
+        }
+
+        function match(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) {
+                    // we need type coercion here
+                    return expectation == actual; // eslint-disable-line eqeqeq
+                };
+                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;
+        }
+
+        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;
+        };
+
+        match.isMatcher = isMatcher;
+
+        match.any = match(function () {
+            return true;
+        }, "any");
+
+        match.defined = match(function (actual) {
+            return actual !== null && actual !== undefined;
+        }, "defined");
+
+        match.truthy = match(function (actual) {
+            return !!actual;
+        }, "truthy");
+
+        match.falsy = match(function (actual) {
+            return !actual;
+        }, "falsy");
+
+        match.same = function (expectation) {
+            return match(function (actual) {
+                return expectation === actual;
+            }, "same(" + expectation + ")");
+        };
+
+        match.typeOf = function (type) {
+            assertType(type, "string", "type");
+            return match(function (actual) {
+                return sinon.typeOf(actual) === type;
+            }, "typeOf(\"" + type + "\")");
+        };
+
+        match.instanceOf = function (type) {
+            assertType(type, "function", "type");
+            return match(function (actual) {
+                return actual instanceof type;
+            }, "instanceOf(" + sinon.functionName(type) + ")");
+        };
+
+        function createPropertyMatcher(propertyTest, messagePrefix) {
+            return function (property, value) {
+                assertType(property, "string", "property");
+                var onlyProperty = arguments.length === 1;
+                var message = messagePrefix + "(\"" + property + "\"";
+                if (!onlyProperty) {
+                    message += ", " + value;
+                }
+                message += ")";
+                return match(function (actual) {
+                    if (actual === undefined || actual === null ||
+                            !propertyTest(actual, property)) {
+                        return false;
+                    }
+                    return onlyProperty || sinon.deepEqual(value, actual[property]);
+                }, message);
+            };
+        }
+
+        match.has = createPropertyMatcher(function (actual, property) {
+            if (typeof actual === "object") {
+                return property in actual;
+            }
+            return actual[property] !== undefined;
+        }, "has");
+
+        match.hasOwn = createPropertyMatcher(function (actual, property) {
+            return actual.hasOwnProperty(property);
+        }, "hasOwn");
+
+        match.bool = match.typeOf("boolean");
+        match.number = match.typeOf("number");
+        match.string = match.typeOf("string");
+        match.object = match.typeOf("object");
+        match.func = match.typeOf("function");
+        match.array = match.typeOf("array");
+        match.regexp = match.typeOf("regexp");
+        match.date = match.typeOf("date");
+
+        sinon.match = match;
+        return match;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        require("./typeOf");
+        module.exports = makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+        return;
+    }
+
+    if (isNode) {
+        loadDependencies(require, module.exports, module);
+        return;
+    }
+
+    if (sinonGlobal) {
+        makeApi(sinonGlobal);
+    }
+}(
+    typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ */
+/**
+ * Format functions
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2014 Christian Johansen
+ */
+(function (sinonGlobal, formatio) {
+    
+    function makeApi(sinon) {
+        function valueFormatter(value) {
+            return "" + value;
+        }
+
+        function getFormatioFormatter() {
+            var formatter = formatio.configure({
+                    quoteStrings: false,
+                    limitChildrenCount: 250
+                });
+
+            function format() {
+                return formatter.ascii.apply(formatter, arguments);
+            }
+
+            return format;
+        }
+
+        function getNodeFormatter() {
+            try {
+                var util = require("util");
+            } catch (e) {
+                /* Node, but no util module - would be very old, but better safe than sorry */
+            }
+
+            function format(v) {
+                var isObjectWithNativeToString = typeof v === "object" && v.toString === Object.prototype.toString;
+                return isObjectWithNativeToString ? util.inspect(v) : v;
+            }
+
+            return util ? format : valueFormatter;
+        }
+
+        var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+        var formatter;
+
+        if (isNode) {
+            try {
+                formatio = require("formatio");
+            }
+            catch (e) {} // eslint-disable-line no-empty
+        }
+
+        if (formatio) {
+            formatter = getFormatioFormatter();
+        } else if (isNode) {
+            formatter = getNodeFormatter();
+        } else {
+            formatter = valueFormatter;
+        }
+
+        sinon.format = formatter;
+        return sinon.format;
+    }
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        module.exports = makeApi(sinon);
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    if (isAMD) {
+        define(loadDependencies);
+        return;
+    }
+
+    if (isNode) {
+        loadDependencies(require, module.exports, module);
+        return;
+    }
+
+    if (sinonGlobal) {
+        makeApi(sinonGlobal);
+    }
+}(
+    typeof sinon === "object" && sinon, // eslint-disable-line no-undef
+    typeof formatio === "object" && formatio // eslint-disable-line no-undef
+));
+
+/**
+  * @depend util/core.js
+  * @depend match.js
+  * @depend format.js
+  */
+/**
+  * Spy calls
+  *
+  * @author Christian Johansen (christian@cjohansen.no)
+  * @author Maximilian Antoni (mail@maxantoni.de)
+  * @license BSD
+  *
+  * Copyright (c) 2010-2013 Christian Johansen
+  * Copyright (c) 2013 Maximilian Antoni
+  */
+(function (sinonGlobal) {
+    
+    var slice = Array.prototype.slice;
+
+    function makeApi(sinon) {
+        function throwYieldError(proxy, text, args) {
+            var msg = sinon.functionName(proxy) + text;
+            if (args.length) {
+                msg += " Received [" + slice.call(args).join(", ") + "]";
+            }
+            throw new Error(msg);
+        }
+
+        var callProto = {
+            calledOn: function calledOn(thisValue) {
+                if (sinon.match && sinon.match.isMatcher(thisValue)) {
+                    return thisValue.test(this.thisValue);
+                }
+                return this.thisValue === thisValue;
+            },
+
+            calledWith: function calledWith() {
+                var l = arguments.length;
+                if (l > this.args.length) {
+                    return false;
+                }
+                for (var i = 0; i < l; i += 1) {
+                    if (!sinon.deepEqual(arguments[i], this.args[i])) {
+                        return false;
+                    }
+                }
+
+                return true;
+            },
+
+            calledWithMatch: function calledWithMatch() {
+                var l = arguments.length;
+                if (l > this.args.length) {
+                    return false;
+                }
+                for (var i = 0; i < l; i += 1) {
+                    var actual = this.args[i];
+                    var expectation = arguments[i];
+                    if (!sinon.match || !sinon.match(expectation).test(actual)) {
+                        return false;
+                    }
+                }
+                return true;
+            },
+
+            calledWithExactly: function calledWithExactly() {
+                return arguments.length === this.args.length &&
+                    this.calledWith.apply(this, arguments);
+            },
+
+            notCalledWith: function notCalledWith() {
+                return !this.calledWith.apply(this, arguments);
+            },
+
+            notCalledWithMatch: function notCalledWithMatch() {
+                return !this.calledWithMatch.apply(this, arguments);
+            },
+
+            returned: function returned(value) {
+                return sinon.deepEqual(value, this.returnValue);
+            },
+
+            threw: function threw(error) {
+                if (typeof error === "undefined" || !this.exception) {
+                    return !!this.exception;
+                }
+
+                return this.exception === error || this.exception.name === error;
+            },
+
+            calledWithNew: function calledWithNew() {
+                return this.proxy.prototype && this.thisValue instanceof this.proxy;
+            },
+
+            calledBefore: function (other) {
+                return this.callId < other.callId;
+            },
+
+            calledAfter: function (other) {
+                return this.callId > other.callId;
+            },
+
+            callArg: function (pos) {
+                this.args[pos]();
+            },
+
+            callArgOn: function (pos, thisValue) {
+                this.args[pos].apply(thisValue);
+            },
+
+            callArgWith: function (pos) {
+                this.callArgOnWith.apply(this, [pos, null].concat(slice.call(arguments, 1)));
+            },
+
+            callArgOnWith: function (pos, thisValue) {
+                var args = slice.call(arguments, 2);
+                this.args[pos].apply(thisValue, args);
+            },
+
+            "yield": function () {
+                this.yieldOn.apply(this, [null].concat(slice.call(arguments, 0)));
+            },
+
+            yieldOn: function (thisValue) {
+                var args = this.args;
+                for (var i = 0, l = args.length; i < l; ++i) {
+                    if (typeof args[i] === "function") {
+                        args[i].apply(thisValue, slice.call(arguments, 1));
+                        return;
+                    }
+                }
+                throwYieldError(this.proxy, " cannot yield since no callback was passed.", args);
+            },
+
+            yieldTo: function (prop) {
+                this.yieldToOn.apply(this, [prop, null].concat(slice.call(arguments, 1)));
+            },
+
+            yieldToOn: function (prop, thisValue) {
+                var args = this.args;
+                for (var i = 0, l = args.length; i < l; ++i) {
+                    if (args[i] && typeof args[i][prop] === "function") {
+                        args[i][prop].apply(thisValue, slice.call(arguments, 2));
+                        return;
+                    }
+                }
+                throwYieldError(this.proxy, " cannot yield to '" + prop +
+                    "' since no callback was passed.", args);
+            },
+
+            getStackFrames: function () {
+                // Omit the error message and the two top stack frames in sinon itself:
+                return this.stack && this.stack.split("\n").slice(3);
+            },
+
+            toString: function () {
+                var callStr = this.proxy ? this.proxy.toString() + "(" : "";
+                var args = [];
+
+                if (!this.args) {
+                    return ":(";
+                }
+
+                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 + ")";
+                    }
+                }
+                if (this.stack) {
+                    callStr += this.getStackFrames()[0].replace(/^\s*(?:at\s+|@)?/, " at ");
+
+                }
+
+                return callStr;
+            }
+        };
+
+        callProto.invokeCallback = callProto.yield;
+
+        function createSpyCall(spy, thisValue, args, returnValue, exception, id, stack) {
+            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;
+            proxyCall.stack = stack;
+
+            return proxyCall;
+        }
+        createSpyCall.toString = callProto.toString; // used by mocks
+
+        sinon.spyCall = createSpyCall;
+        return createSpyCall;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        require("./match");
+        require("./format");
+        module.exports = makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+        return;
+    }
+
+    if (isNode) {
+        loadDependencies(require, module.exports, module);
+        return;
+    }
+
+    if (sinonGlobal) {
+        makeApi(sinonGlobal);
+    }
+}(
+    typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+  * @depend times_in_words.js
+  * @depend util/core.js
+  * @depend extend.js
+  * @depend call.js
+  * @depend format.js
+  */
+/**
+  * Spy functions
+  *
+  * @author Christian Johansen (christian@cjohansen.no)
+  * @license BSD
+  *
+  * Copyright (c) 2010-2013 Christian Johansen
+  */
+(function (sinonGlobal) {
+    
+    function makeApi(sinon) {
+        var push = Array.prototype.push;
+        var slice = Array.prototype.slice;
+        var callId = 0;
+
+        function spy(object, property, types) {
+            if (!property && typeof object === "function") {
+                return spy.create(object);
+            }
+
+            if (!object && !property) {
+                return spy.create(function () { });
+            }
+
+            if (types) {
+                var methodDesc = sinon.getPropertyDescriptor(object, property);
+                for (var i = 0; i < types.length; i++) {
+                    methodDesc[types[i]] = spy.create(methodDesc[types[i]]);
+                }
+                return sinon.wrapMethod(object, property, methodDesc);
+            }
+
+            return sinon.wrapMethod(object, property, spy.create(object[property]));
+        }
+
+        function matchingFake(fakes, args, strict) {
+            if (!fakes) {
+                return undefined;
+            }
+
+            for (var i = 0, l = fakes.length; i < l; i++) {
+                if (fakes[i].matches(args, strict)) {
+                    return fakes[i];
+                }
+            }
+        }
+
+        function incrementCallCount() {
+            this.called = true;
+            this.callCount += 1;
+            this.notCalled = false;
+            this.calledOnce = this.callCount === 1;
+            this.calledTwice = this.callCount === 2;
+            this.calledThrice = this.callCount === 3;
+        }
+
+        function createCallProperties() {
+            this.firstCall = this.getCall(0);
+            this.secondCall = this.getCall(1);
+            this.thirdCall = this.getCall(2);
+            this.lastCall = this.getCall(this.callCount - 1);
+        }
+
+        var vars = "a,b,c,d,e,f,g,h,i,j,k,l";
+        function createProxy(func, proxyLength) {
+            // Retain the function length:
+            var p;
+            if (proxyLength) {
+                eval("p = (function proxy(" + vars.substring(0, proxyLength * 2 - 1) + // eslint-disable-line no-eval
+                    ") { return p.invoke(func, this, slice.call(arguments)); });");
+            } else {
+                p = function proxy() {
+                    return p.invoke(func, this, slice.call(arguments));
+                };
+            }
+            p.isSinonProxy = true;
+            return p;
+        }
+
+        var uuid = 0;
+
+        // Public API
+        var spyApi = {
+            reset: function () {
+                if (this.invoking) {
+                    var err = new Error("Cannot reset Sinon function while invoking it. " +
+                                        "Move the call to .reset outside of the callback.");
+                    err.name = "InvalidResetException";
+                    throw err;
+                }
+
+                this.called = false;
+                this.notCalled = true;
+                this.calledOnce = false;
+                this.calledTwice = false;
+                this.calledThrice = false;
+                this.callCount = 0;
+                this.firstCall = null;
+                this.secondCall = null;
+                this.thirdCall = null;
+                this.lastCall = null;
+                this.args = [];
+                this.returnValues = [];
+                this.thisValues = [];
+                this.exceptions = [];
+                this.callIds = [];
+                this.stacks = [];
+                if (this.fakes) {
+                    for (var i = 0; i < this.fakes.length; i++) {
+                        this.fakes[i].reset();
+                    }
+                }
+
+                return this;
+            },
+
+            create: function create(func, spyLength) {
+                var name;
+
+                if (typeof func !== "function") {
+                    func = function () { };
+                } else {
+                    name = sinon.functionName(func);
+                }
+
+                if (!spyLength) {
+                    spyLength = func.length;
+                }
+
+                var proxy = createProxy(func, spyLength);
+
+                sinon.extend(proxy, spy);
+                delete proxy.create;
+                sinon.extend(proxy, func);
+
+                proxy.reset();
+                proxy.prototype = func.prototype;
+                proxy.displayName = name || "spy";
+                proxy.toString = sinon.functionToString;
+                proxy.instantiateFake = sinon.spy.create;
+                proxy.id = "spy#" + uuid++;
+
+                return proxy;
+            },
+
+            invoke: function invoke(func, thisValue, args) {
+                var matching = matchingFake(this.fakes, args);
+                var exception, returnValue;
+
+                incrementCallCount.call(this);
+                push.call(this.thisValues, thisValue);
+                push.call(this.args, args);
+                push.call(this.callIds, callId++);
+
+                // Make call properties available from within the spied function:
+                createCallProperties.call(this);
+
+                try {
+                    this.invoking = true;
+
+                    if (matching) {
+                        returnValue = matching.invoke(func, thisValue, args);
+                    } else {
+                        returnValue = (this.func || func).apply(thisValue, args);
+                    }
+
+                    var thisCall = this.getCall(this.callCount - 1);
+                    if (thisCall.calledWithNew() && typeof returnValue !== "object") {
+                        returnValue = thisValue;
+                    }
+                } catch (e) {
+                    exception = e;
+                } finally {
+                    delete this.invoking;
+                }
+
+                push.call(this.exceptions, exception);
+                push.call(this.returnValues, returnValue);
+                push.call(this.stacks, new Error().stack);
+
+                // Make return value and exception available in the calls:
+                createCallProperties.call(this);
+
+                if (exception !== undefined) {
+                    throw exception;
+                }
+
+                return returnValue;
+            },
+
+            named: function named(name) {
+                this.displayName = name;
+                return this;
+            },
+
+            getCall: function getCall(i) {
+                if (i < 0 || i >= this.callCount) {
+                    return null;
+                }
+
+                return sinon.spyCall(this, this.thisValues[i], this.args[i],
+                                        this.returnValues[i], this.exceptions[i],
+                                        this.callIds[i], this.stacks[i]);
+            },
+
+            getCalls: function () {
+                var calls = [];
+                var i;
+
+                for (i = 0; i < this.callCount; i++) {
+                    calls.push(this.getCall(i));
+                }
+
+                return calls;
+            },
+
+            calledBefore: function calledBefore(spyFn) {
+                if (!this.called) {
+                    return false;
+                }
+
+                if (!spyFn.called) {
+                    return true;
+                }
+
+                return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1];
+            },
+
+            calledAfter: function calledAfter(spyFn) {
+                if (!this.called || !spyFn.called) {
+                    return false;
+                }
+
+                return this.callIds[this.callCount - 1] > spyFn.callIds[spyFn.callCount - 1];
+            },
+
+            withArgs: function () {
+                var args = slice.call(arguments);
+
+                if (this.fakes) {
+                    var match = matchingFake(this.fakes, args, true);
+
+                    if (match) {
+                        return match;
+                    }
+                } else {
+                    this.fakes = [];
+                }
+
+                var original = this;
+                var fake = this.instantiateFake();
+                fake.matchingAguments = args;
+                fake.parent = this;
+                push.call(this.fakes, fake);
+
+                fake.withArgs = function () {
+                    return original.withArgs.apply(original, arguments);
+                };
+
+                for (var i = 0; i < this.args.length; i++) {
+                    if (fake.matches(this.args[i])) {
+                        incrementCallCount.call(fake);
+                        push.call(fake.thisValues, this.thisValues[i]);
+                        push.call(fake.args, this.args[i]);
+                        push.call(fake.returnValues, this.returnValues[i]);
+                        push.call(fake.exceptions, this.exceptions[i]);
+                        push.call(fake.callIds, this.callIds[i]);
+                    }
+                }
+                createCallProperties.call(fake);
+
+                return fake;
+            },
+
+            matches: function (args, strict) {
+                var margs = this.matchingAguments;
+
+                if (margs.length <= args.length &&
+                    sinon.deepEqual(margs, args.slice(0, margs.length))) {
+                    return !strict || margs.length === args.length;
+                }
+            },
+
+            printf: function (format) {
+                var spyInstance = 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, spyInstance, 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 (spyInstance) {
+                return sinon.timesInWords(spyInstance.callCount);
+            },
+
+            n: function (spyInstance) {
+                return spyInstance.toString();
+            },
+
+            C: function (spyInstance) {
+                var calls = [];
+
+                for (var i = 0, l = spyInstance.callCount; i < l; ++i) {
+                    var stringifiedCall = "    " + spyInstance.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 (spyInstance) {
+                var objects = [];
+
+                for (var i = 0, l = spyInstance.callCount; i < l; ++i) {
+                    push.call(objects, sinon.format(spyInstance.thisValues[i]));
+                }
+
+                return objects.join(", ");
+            },
+
+            "*": function (spyInstance, args) {
+                var formatted = [];
+
+                for (var i = 0, l = args.length; i < l; ++i) {
+                    push.call(formatted, sinon.format(args[i]));
+                }
+
+                return formatted.join(", ");
+            }
+        };
+
+        sinon.extend(spy, spyApi);
+
+        spy.spyCall = sinon.spyCall;
+        sinon.spy = spy;
+
+        return spy;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var core = require("./util/core");
+        require("./call");
+        require("./extend");
+        require("./times_in_words");
+        require("./format");
+        module.exports = makeApi(core);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+        return;
+    }
+
+    if (isNode) {
+        loadDependencies(require, module.exports, module);
+        return;
+    }
+
+    if (sinonGlobal) {
+        makeApi(sinonGlobal);
+    }
+}(
+    typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ * @depend extend.js
+ */
+/**
+ * Stub behavior
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @author Tim Fischbach (mail@timfischbach.de)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal) {
+    
+    var slice = Array.prototype.slice;
+    var join = Array.prototype.join;
+    var useLeftMostCallback = -1;
+    var useRightMostCallback = -2;
+
+    var nextTick = (function () {
+        if (typeof process === "object" && typeof process.nextTick === "function") {
+            return process.nextTick;
+        }
+
+        if (typeof setImmediate === "function") {
+            return setImmediate;
+        }
+
+        return function (callback) {
+            setTimeout(callback, 0);
+        };
+    })();
+
+    function throwsException(error, message) {
+        if (typeof error === "string") {
+            this.exception = new Error(message || "");
+            this.exception.name = error;
+        } else if (!error) {
+            this.exception = new Error("Error");
+        } else {
+            this.exception = error;
+        }
+
+        return this;
+    }
+
+    function getCallback(behavior, args) {
+        var callArgAt = behavior.callArgAt;
+
+        if (callArgAt >= 0) {
+            return args[callArgAt];
+        }
+
+        var argumentList;
+
+        if (callArgAt === useLeftMostCallback) {
+            argumentList = args;
+        }
+
+        if (callArgAt === useRightMostCallback) {
+            argumentList = slice.call(args).reverse();
+        }
+
+        var callArgProp = behavior.callArgProp;
+
+        for (var i = 0, l = argumentList.length; i < l; ++i) {
+            if (!callArgProp && typeof argumentList[i] === "function") {
+                return argumentList[i];
+            }
+
+            if (callArgProp && argumentList[i] &&
+                typeof argumentList[i][callArgProp] === "function") {
+                return argumentList[i][callArgProp];
+            }
+        }
+
+        return null;
+    }
+
+    function makeApi(sinon) {
+        function getCallbackError(behavior, func, args) {
+            if (behavior.callArgAt < 0) {
+                var msg;
+
+                if (behavior.callArgProp) {
+                    msg = sinon.functionName(behavior.stub) +
+                        " expected to yield to '" + behavior.callArgProp +
+                        "', but no object with such a property was passed.";
+                } else {
+                    msg = sinon.functionName(behavior.stub) +
+                        " expected to yield, but no callback was passed.";
+                }
+
+                if (args.length > 0) {
+                    msg += " Received [" + join.call(args, ", ") + "]";
+                }
+
+                return msg;
+            }
+
+            return "argument at index " + behavior.callArgAt + " is not a function: " + func;
+        }
+
+        function callCallback(behavior, args) {
+            if (typeof behavior.callArgAt === "number") {
+                var func = getCallback(behavior, args);
+
+                if (typeof func !== "function") {
+                    throw new TypeError(getCallbackError(behavior, func, args));
+                }
+
+                if (behavior.callbackAsync) {
+                    nextTick(function () {
+                        func.apply(behavior.callbackContext, behavior.callbackArguments);
+                    });
+                } else {
+                    func.apply(behavior.callbackContext, behavior.callbackArguments);
+                }
+            }
+        }
+
+        var proto = {
+            create: function create(stub) {
+                var behavior = sinon.extend({}, sinon.behavior);
+                delete behavior.create;
+                behavior.stub = stub;
+
+                return behavior;
+            },
+
+            isPresent: function isPresent() {
+                return (typeof this.callArgAt === "number" ||
+                        this.exception ||
+                        typeof this.returnArgAt === "number" ||
+                        this.returnThis ||
+                        this.returnValueDefined);
+            },
+
+            invoke: function invoke(context, args) {
+                callCallback(this, args);
+
+                if (this.exception) {
+                    throw this.exception;
+                } else if (typeof this.returnArgAt === "number") {
+                    return args[this.returnArgAt];
+                } else if (this.returnThis) {
+                    return context;
+                }
+
+                return this.returnValue;
+            },
+
+            onCall: function onCall(index) {
+                return this.stub.onCall(index);
+            },
+
+            onFirstCall: function onFirstCall() {
+                return this.stub.onFirstCall();
+            },
+
+            onSecondCall: function onSecondCall() {
+                return this.stub.onSecondCall();
+            },
+
+            onThirdCall: function onThirdCall() {
+                return this.stub.onThirdCall();
+            },
+
+            withArgs: function withArgs(/* arguments */) {
+                throw new Error(
+                    "Defining a stub by invoking \"stub.onCall(...).withArgs(...)\" " +
+                    "is not supported. Use \"stub.withArgs(...).onCall(...)\" " +
+                    "to define sequential behavior for calls with certain arguments."
+                );
+            },
+
+            callsArg: function callsArg(pos) {
+                if (typeof pos !== "number") {
+                    throw new TypeError("argument index is not number");
+                }
+
+                this.callArgAt = pos;
+                this.callbackArguments = [];
+                this.callbackContext = undefined;
+                this.callArgProp = undefined;
+                this.callbackAsync = false;
+
+                return this;
+            },
+
+            callsArgOn: function callsArgOn(pos, context) {
+                if (typeof pos !== "number") {
+                    throw new TypeError("argument index is not number");
+                }
+                if (typeof context !== "object") {
+                    throw new TypeError("argument context is not an object");
+                }
+
+                this.callArgAt = pos;
+                this.callbackArguments = [];
+                this.callbackContext = context;
+                this.callArgProp = undefined;
+                this.callbackAsync = false;
+
+                return this;
+            },
+
+            callsArgWith: function callsArgWith(pos) {
+                if (typeof pos !== "number") {
+                    throw new TypeError("argument index is not number");
+                }
+
+                this.callArgAt = pos;
+                this.callbackArguments = slice.call(arguments, 1);
+                this.callbackContext = undefined;
+                this.callArgProp = undefined;
+                this.callbackAsync = false;
+
+                return this;
+            },
+
+            callsArgOnWith: function callsArgWith(pos, context) {
+                if (typeof pos !== "number") {
+                    throw new TypeError("argument index is not number");
+                }
+                if (typeof context !== "object") {
+                    throw new TypeError("argument context is not an object");
+                }
+
+                this.callArgAt = pos;
+                this.callbackArguments = slice.call(arguments, 2);
+                this.callbackContext = context;
+                this.callArgProp = undefined;
+                this.callbackAsync = false;
+
+                return this;
+            },
+
+            yields: function () {
+                this.callArgAt = useLeftMostCallback;
+                this.callbackArguments = slice.call(arguments, 0);
+                this.callbackContext = undefined;
+                this.callArgProp = undefined;
+                this.callbackAsync = false;
+
+                return this;
+            },
+
+            yieldsRight: function () {
+                this.callArgAt = useRightMostCallback;
+                this.callbackArguments = slice.call(arguments, 0);
+                this.callbackContext = undefined;
+                this.callArgProp = undefined;
+                this.callbackAsync = false;
+
+                return this;
+            },
+
+            yieldsOn: function (context) {
+                if (typeof context !== "object") {
+                    throw new TypeError("argument context is not an object");
+                }
+
+                this.callArgAt = useLeftMostCallback;
+                this.callbackArguments = slice.call(arguments, 1);
+                this.callbackContext = context;
+                this.callArgProp = undefined;
+                this.callbackAsync = false;
+
+                return this;
+            },
+
+            yieldsTo: function (prop) {
+                this.callArgAt = useLeftMostCallback;
+                this.callbackArguments = slice.call(arguments, 1);
+                this.callbackContext = undefined;
+                this.callArgProp = prop;
+                this.callbackAsync = false;
+
+                return this;
+            },
+
+            yieldsToOn: function (prop, context) {
+                if (typeof context !== "object") {
+                    throw new TypeError("argument context is not an object");
+                }
+
+                this.callArgAt = useLeftMostCallback;
+                this.callbackArguments = slice.call(arguments, 2);
+                this.callbackContext = context;
+                this.callArgProp = prop;
+                this.callbackAsync = false;
+
+                return this;
+            },
+
+            throws: throwsException,
+            throwsException: throwsException,
+
+            returns: function returns(value) {
+                this.returnValue = value;
+                this.returnValueDefined = true;
+                this.exception = undefined;
+
+                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;
+            }
+        };
+
+        function createAsyncVersion(syncFnName) {
+            return function () {
+                var result = this[syncFnName].apply(this, arguments);
+                this.callbackAsync = true;
+                return result;
+            };
+        }
+
+        // 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"] = createAsyncVersion(method);
+            }
+        }
+
+        sinon.behavior = proto;
+        return proto;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        require("./extend");
+        module.exports = makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+        return;
+    }
+
+    if (isNode) {
+        loadDependencies(require, module.exports, module);
+        return;
+    }
+
+    if (sinonGlobal) {
+        makeApi(sinonGlobal);
+    }
+}(
+    typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ */
+(function (sinonGlobal) {
+    
+    function makeApi(sinon) {
+        function walkInternal(obj, iterator, context, originalObj, seen) {
+            var proto, prop;
+
+            if (typeof Object.getOwnPropertyNames !== "function") {
+                // We explicitly want to enumerate through all of the prototype's properties
+                // in this case, therefore we deliberately leave out an own property check.
+                /* eslint-disable guard-for-in */
+                for (prop in obj) {
+                    iterator.call(context, obj[prop], prop, obj);
+                }
+                /* eslint-enable guard-for-in */
+
+                return;
+            }
+
+            Object.getOwnPropertyNames(obj).forEach(function (k) {
+                if (!seen[k]) {
+                    seen[k] = true;
+                    var target = typeof Object.getOwnPropertyDescriptor(obj, k).get === "function" ?
+                        originalObj : obj;
+                    iterator.call(context, target[k], k, target);
+                }
+            });
+
+            proto = Object.getPrototypeOf(obj);
+            if (proto) {
+                walkInternal(proto, iterator, context, originalObj, seen);
+            }
+        }
+
+        /* Public: walks the prototype chain of an object and iterates over every own property
+         * name encountered. The iterator is called in the same fashion that Array.prototype.forEach
+         * works, where it is passed the value, key, and own object as the 1st, 2nd, and 3rd positional
+         * argument, respectively. In cases where Object.getOwnPropertyNames is not available, walk will
+         * default to using a simple for..in loop.
+         *
+         * obj - The object to walk the prototype chain for.
+         * iterator - The function to be called on each pass of the walk.
+         * context - (Optional) When given, the iterator will be called with this object as the receiver.
+         */
+        function walk(obj, iterator, context) {
+            return walkInternal(obj, iterator, context, obj, {});
+        }
+
+        sinon.walk = walk;
+        return sinon.walk;
+    }
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        module.exports = makeApi(sinon);
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    if (isAMD) {
+        define(loadDependencies);
+        return;
+    }
+
+    if (isNode) {
+        loadDependencies(require, module.exports, module);
+        return;
+    }
+
+    if (sinonGlobal) {
+        makeApi(sinonGlobal);
+    }
+}(
+    typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ * @depend extend.js
+ * @depend spy.js
+ * @depend behavior.js
+ * @depend walk.js
+ */
+/**
+ * Stub functions
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal) {
+    
+    function makeApi(sinon) {
+        function stub(object, property, func) {
+            if (!!func && typeof func !== "function" && typeof func !== "object") {
+                throw new TypeError("Custom stub should be a function or a property descriptor");
+            }
+
+            var wrapper;
+
+            if (func) {
+                if (typeof func === "function") {
+                    wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func;
+                } else {
+                    wrapper = func;
+                    if (sinon.spy && sinon.spy.create) {
+                        var types = sinon.objectKeys(wrapper);
+                        for (var i = 0; i < types.length; i++) {
+                            wrapper[types[i]] = sinon.spy.create(wrapper[types[i]]);
+                        }
+                    }
+                }
+            } else {
+                var stubLength = 0;
+                if (typeof object === "object" && typeof object[property] === "function") {
+                    stubLength = object[property].length;
+                }
+                wrapper = stub.create(stubLength);
+            }
+
+            if (!object && typeof property === "undefined") {
+                return sinon.stub.create();
+            }
+
+            if (typeof property === "undefined" && typeof object === "object") {
+                sinon.walk(object || {}, function (value, prop, propOwner) {
+                    // we don't want to stub things like toString(), valueOf(), etc. so we only stub if the object
+                    // is not Object.prototype
+                    if (
+                        propOwner !== Object.prototype &&
+                        prop !== "constructor" &&
+                        typeof sinon.getPropertyDescriptor(propOwner, prop).value === "function"
+                    ) {
+                        stub(object, prop);
+                    }
+                });
+
+                return object;
+            }
+
+            return sinon.wrapMethod(object, property, wrapper);
+        }
+
+
+        /*eslint-disable no-use-before-define*/
+        function getParentBehaviour(stubInstance) {
+            return (stubInstance.parent && getCurrentBehavior(stubInstance.parent));
+        }
+
+        function getDefaultBehavior(stubInstance) {
+            return stubInstance.defaultBehavior ||
+                    getParentBehaviour(stubInstance) ||
+                    sinon.behavior.create(stubInstance);
+        }
+
+        function getCurrentBehavior(stubInstance) {
+            var behavior = stubInstance.behaviors[stubInstance.callCount - 1];
+            return behavior && behavior.isPresent() ? behavior : getDefaultBehavior(stubInstance);
+        }
+        /*eslint-enable no-use-before-define*/
+
+        var uuid = 0;
+
+        var proto = {
+            create: function create(stubLength) {
+                var functionStub = function () {
+                    return getCurrentBehavior(functionStub).invoke(this, arguments);
+                };
+
+                functionStub.id = "stub#" + uuid++;
+                var orig = functionStub;
+                functionStub = sinon.spy.create(functionStub, stubLength);
+                functionStub.func = orig;
+
+                sinon.extend(functionStub, stub);
+                functionStub.instantiateFake = sinon.stub.create;
+                functionStub.displayName = "stub";
+                functionStub.toString = sinon.functionToString;
+
+                functionStub.defaultBehavior = null;
+                functionStub.behaviors = [];
+
+                return functionStub;
+            },
+
+            resetBehavior: function () {
+                var i;
+
+                this.defaultBehavior = null;
+                this.behaviors = [];
+
+                delete this.returnValue;
+                delete this.returnArgAt;
+                this.returnThis = false;
+
+                if (this.fakes) {
+                    for (i = 0; i < this.fakes.length; i++) {
+                        this.fakes[i].resetBehavior();
+                    }
+                }
+            },
+
+            onCall: function onCall(index) {
+                if (!this.behaviors[index]) {
+                    this.behaviors[index] = sinon.behavior.create(this);
+                }
+
+                return this.behaviors[index];
+            },
+
+            onFirstCall: function onFirstCall() {
+                return this.onCall(0);
+            },
+
+            onSecondCall: function onSecondCall() {
+                return this.onCall(1);
+            },
+
+            onThirdCall: function onThirdCall() {
+                return this.onCall(2);
+            }
+        };
+
+        function createBehavior(behaviorMethod) {
+            return function () {
+                this.defaultBehavior = this.defaultBehavior || sinon.behavior.create(this);
+                this.defaultBehavior[behaviorMethod].apply(this.defaultBehavior, arguments);
+                return this;
+            };
+        }
+
+        for (var method in sinon.behavior) {
+            if (sinon.behavior.hasOwnProperty(method) &&
+                !proto.hasOwnProperty(method) &&
+                method !== "create" &&
+                method !== "withArgs" &&
+                method !== "invoke") {
+                proto[method] = createBehavior(method);
+            }
+        }
+
+        sinon.extend(stub, proto);
+        sinon.stub = stub;
+
+        return stub;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var core = require("./util/core");
+        require("./behavior");
+        require("./spy");
+        require("./extend");
+        module.exports = makeApi(core);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+        return;
+    }
+
+    if (isNode) {
+        loadDependencies(require, module.exports, module);
+        return;
+    }
+
+    if (sinonGlobal) {
+        makeApi(sinonGlobal);
+    }
+}(
+    typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend times_in_words.js
+ * @depend util/core.js
+ * @depend call.js
+ * @depend extend.js
+ * @depend match.js
+ * @depend spy.js
+ * @depend stub.js
+ * @depend format.js
+ */
+/**
+ * Mock functions.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal) {
+    
+    function makeApi(sinon) {
+        var push = [].push;
+        var match = sinon.match;
+
+        function mock(object) {
+            // if (typeof console !== undefined && console.warn) {
+            //     console.warn("mock will be removed from Sinon.JS v2.0");
+            // }
+
+            if (!object) {
+                return sinon.expectation.create("Anonymous mock");
+            }
+
+            return mock.create(object);
+        }
+
+        function each(collection, callback) {
+            if (!collection) {
+                return;
+            }
+
+            for (var i = 0, l = collection.length; i < l; i += 1) {
+                callback(collection[i]);
+            }
+        }
+
+        function arrayEquals(arr1, arr2, compareLength) {
+            if (compareLength && (arr1.length !== arr2.length)) {
+                return false;
+            }
+
+            for (var i = 0, l = arr1.length; i < l; i++) {
+                if (!sinon.deepEqual(arr1[i], arr2[i])) {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        sinon.extend(mock, {
+            create: function create(object) {
+                if (!object) {
+                    throw new TypeError("object is null");
+                }
+
+                var mockObject = sinon.extend({}, mock);
+                mockObject.object = object;
+                delete mockObject.create;
+
+                return mockObject;
+            },
+
+            expects: function expects(method) {
+                if (!method) {
+                    throw new TypeError("method is falsy");
+                }
+
+                if (!this.expectations) {
+                    this.expectations = {};
+                    this.proxies = [];
+                }
+
+                if (!this.expectations[method]) {
+                    this.expectations[method] = [];
+                    var mockObject = this;
+
+                    sinon.wrapMethod(this.object, method, function () {
+                        return mockObject.invokeMethod(method, this, arguments);
+                    });
+
+                    push.call(this.proxies, method);
+                }
+
+                var expectation = sinon.expectation.create(method);
+                push.call(this.expectations[method], expectation);
+
+                return expectation;
+            },
+
+            restore: function restore() {
+                var object = this.object;
+
+                each(this.proxies, function (proxy) {
+                    if (typeof object[proxy].restore === "function") {
+                        object[proxy].restore();
+                    }
+                });
+            },
+
+            verify: function verify() {
+                var expectations = this.expectations || {};
+                var messages = [];
+                var met = [];
+
+                each(this.proxies, function (proxy) {
+                    each(expectations[proxy], function (expectation) {
+                        if (!expectation.met()) {
+                            push.call(messages, expectation.toString());
+                        } else {
+                            push.call(met, expectation.toString());
+                        }
+                    });
+                });
+
+                this.restore();
+
+                if (messages.length > 0) {
+                    sinon.expectation.fail(messages.concat(met).join("\n"));
+                } else if (met.length > 0) {
+                    sinon.expectation.pass(messages.concat(met).join("\n"));
+                }
+
+                return true;
+            },
+
+            invokeMethod: function invokeMethod(method, thisValue, args) {
+                var expectations = this.expectations && this.expectations[method] ? this.expectations[method] : [];
+                var expectationsWithMatchingArgs = [];
+                var currentArgs = args || [];
+                var i, available;
+
+                for (i = 0; i < expectations.length; i += 1) {
+                    var expectedArgs = expectations[i].expectedArguments || [];
+                    if (arrayEquals(expectedArgs, currentArgs, expectations[i].expectsExactArgCount)) {
+                        expectationsWithMatchingArgs.push(expectations[i]);
+                    }
+                }
+
+                for (i = 0; i < expectationsWithMatchingArgs.length; i += 1) {
+                    if (!expectationsWithMatchingArgs[i].met() &&
+                        expectationsWithMatchingArgs[i].allowsCall(thisValue, args)) {
+                        return expectationsWithMatchingArgs[i].apply(thisValue, args);
+                    }
+                }
+
+                var messages = [];
+                var exhausted = 0;
+
+                for (i = 0; i < expectationsWithMatchingArgs.length; i += 1) {
+                    if (expectationsWithMatchingArgs[i].allowsCall(thisValue, args)) {
+                        available = available || expectationsWithMatchingArgs[i];
+                    } else {
+                        exhausted += 1;
+                    }
+                }
+
+                if (available && exhausted === 0) {
+                    return available.apply(thisValue, args);
+                }
+
+                for (i = 0; i < expectations.length; i += 1) {
+                    push.call(messages, "    " + expectations[i].toString());
+                }
+
+                messages.unshift("Unexpected call: " + sinon.spyCall.toString.call({
+                    proxy: method,
+                    args: args
+                }));
+
+                sinon.expectation.fail(messages.join("\n"));
+            }
+        });
+
+        var times = sinon.timesInWords;
+        var slice = Array.prototype.slice;
+
+        function callCountInWords(callCount) {
+            if (callCount === 0) {
+                return "never called";
+            }
+
+            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) {
+            var isMatcher = match && match.isMatcher(possibleMatcher);
+
+            return isMatcher && possibleMatcher.test(arg) || true;
+        }
+
+        sinon.expectation = {
+            minCalls: 1,
+            maxCalls: 1,
+
+            create: function create(methodName) {
+                var expectation = sinon.extend(sinon.stub.create(), sinon.expectation);
+                delete expectation.create;
+                expectation.method = methodName;
+
+                return expectation;
+            },
+
+            invoke: function invoke(func, thisValue, args) {
+                this.verifyCallAllowed(thisValue, args);
+
+                return sinon.spy.invoke.apply(this, arguments);
+            },
+
+            atLeast: function atLeast(num) {
+                if (typeof num !== "number") {
+                    throw new TypeError("'" + num + "' is not number");
+                }
+
+                if (!this.limitsSet) {
+                    this.maxCalls = null;
+                    this.limitsSet = true;
+                }
+
+                this.minCalls = num;
+
+                return this;
+            },
+
+            atMost: function atMost(num) {
+                if (typeof num !== "number") {
+                    throw new TypeError("'" + num + "' is not number");
+                }
+
+                if (!this.limitsSet) {
+                    this.minCalls = null;
+                    this.limitsSet = true;
+                }
+
+                this.maxCalls = num;
+
+                return this;
+            },
+
+            never: function never() {
+                return this.exactly(0);
+            },
+
+            once: function once() {
+                return this.exactly(1);
+            },
+
+            twice: function twice() {
+                return this.exactly(2);
+            },
+
+            thrice: function thrice() {
+                return this.exactly(3);
+            },
+
+            exactly: function exactly(num) {
+                if (typeof num !== "number") {
+                    throw new TypeError("'" + num + "' is not a number");
+                }
+
+                this.atLeast(num);
+                return this.atMost(num);
+            },
+
+            met: function met() {
+                return !this.failed && receivedMinCalls(this);
+            },
+
+            verifyCallAllowed: function verifyCallAllowed(thisValue, args) {
+                if (receivedMaxCalls(this)) {
+                    this.failed = true;
+                    sinon.expectation.fail(this.method + " already called " + times(this.maxCalls));
+                }
+
+                if ("expectedThis" in this && this.expectedThis !== thisValue) {
+                    sinon.expectation.fail(this.method + " called with " + thisValue + " as thisValue, expected " +
+                        this.expectedThis);
+                }
+
+                if (!("expectedArguments" in this)) {
+                    return;
+                }
+
+                if (!args) {
+                    sinon.expectation.fail(this.method + " received no arguments, expected " +
+                        sinon.format(this.expectedArguments));
+                }
+
+                if (args.length < this.expectedArguments.length) {
+                    sinon.expectation.fail(this.method + " received too few arguments (" + sinon.format(args) +
+                        "), expected " + sinon.format(this.expectedArguments));
+                }
+
+                if (this.expectsExactArgCount &&
+                    args.length !== this.expectedArguments.length) {
+                    sinon.expectation.fail(this.method + " received too many arguments (" + sinon.format(args) +
+                        "), expected " + sinon.format(this.expectedArguments));
+                }
+
+                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {
+
+                    if (!verifyMatcher(this.expectedArguments[i], args[i])) {
+                        sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) +
+                            ", didn't match " + this.expectedArguments.toString());
+                    }
+
+                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {
+                        sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) +
+                            ", expected " + sinon.format(this.expectedArguments));
+                    }
+                }
+            },
+
+            allowsCall: function allowsCall(thisValue, args) {
+                if (this.met() && receivedMaxCalls(this)) {
+                    return false;
+                }
+
+                if ("expectedThis" in this && this.expectedThis !== thisValue) {
+                    return false;
+                }
+
+                if (!("expectedArguments" in this)) {
+                    return true;
+                }
+
+                args = args || [];
+
+                if (args.length < this.expectedArguments.length) {
+                    return false;
+                }
+
+                if (this.expectsExactArgCount &&
+                    args.length !== this.expectedArguments.length) {
+                    return false;
+                }
+
+                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {
+                    if (!verifyMatcher(this.expectedArguments[i], args[i])) {
+                        return false;
+                    }
+
+                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {
+                        return false;
+                    }
+                }
+
+                return true;
+            },
+
+            withArgs: function withArgs() {
+                this.expectedArguments = slice.call(arguments);
+                return this;
+            },
+
+            withExactArgs: function withExactArgs() {
+                this.withArgs.apply(this, arguments);
+                this.expectsExactArgCount = true;
+                return this;
+            },
+
+            on: function on(thisValue) {
+                this.expectedThis = thisValue;
+                return this;
+            },
+
+            toString: function () {
+                var args = (this.expectedArguments || []).slice();
+
+                if (!this.expectsExactArgCount) {
+                    push.call(args, "[...]");
+                }
+
+                var callStr = sinon.spyCall.toString.call({
+                    proxy: this.method || "anonymous mock expectation",
+                    args: args
+                });
+
+                var message = callStr.replace(", [...", "[, ...") + " " +
+                    expectedCallCountInWords(this);
+
+                if (this.met()) {
+                    return "Expectation met: " + message;
+                }
+
+                return "Expected " + message + " (" +
+                    callCountInWords(this.callCount) + ")";
+            },
+
+            verify: function verify() {
+                if (!this.met()) {
+                    sinon.expectation.fail(this.toString());
+                } else {
+                    sinon.expectation.pass(this.toString());
+                }
+
+                return true;
+            },
+
+            pass: function pass(message) {
+                sinon.assert.pass(message);
+            },
+
+            fail: function fail(message) {
+                var exception = new Error(message);
+                exception.name = "ExpectationError";
+
+                throw exception;
+            }
+        };
+
+        sinon.mock = mock;
+        return mock;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        require("./times_in_words");
+        require("./call");
+        require("./extend");
+        require("./match");
+        require("./spy");
+        require("./stub");
+        require("./format");
+
+        module.exports = makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+        return;
+    }
+
+    if (isNode) {
+        loadDependencies(require, module.exports, module);
+        return;
+    }
+
+    if (sinonGlobal) {
+        makeApi(sinonGlobal);
+    }
+}(
+    typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ * @depend spy.js
+ * @depend stub.js
+ * @depend mock.js
+ */
+/**
+ * Collections of stubs, spies and mocks.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal) {
+    
+    var push = [].push;
+    var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+    function getFakes(fakeCollection) {
+        if (!fakeCollection.fakes) {
+            fakeCollection.fakes = [];
+        }
+
+        return fakeCollection.fakes;
+    }
+
+    function each(fakeCollection, method) {
+        var fakes = getFakes(fakeCollection);
+
+        for (var i = 0, l = fakes.length; i < l; i += 1) {
+            if (typeof fakes[i][method] === "function") {
+                fakes[i][method]();
+            }
+        }
+    }
+
+    function compact(fakeCollection) {
+        var fakes = getFakes(fakeCollection);
+        var i = 0;
+        while (i < fakes.length) {
+            fakes.splice(i, 1);
+        }
+    }
+
+    function makeApi(sinon) {
+        var collection = {
+            verify: function resolve() {
+                each(this, "verify");
+            },
+
+            restore: function restore() {
+                each(this, "restore");
+                compact(this);
+            },
+
+            reset: function restore() {
+                each(this, "reset");
+            },
+
+            verifyAndRestore: function verifyAndRestore() {
+                var exception;
+
+                try {
+                    this.verify();
+                } catch (e) {
+                    exception = e;
+                }
+
+                this.restore();
+
+                if (exception) {
+                    throw exception;
+                }
+            },
+
+            add: function add(fake) {
+                push.call(getFakes(this), fake);
+                return fake;
+            },
+
+            spy: function spy() {
+                return this.add(sinon.spy.apply(sinon, arguments));
+            },
+
+            stub: function stub(object, property, value) {
+                if (property) {
+                    var original = object[property];
+
+                    if (typeof original !== "function") {
+                        if (!hasOwnProperty.call(object, property)) {
+                            throw new TypeError("Cannot stub non-existent own property " + property);
+                        }
+
+                        object[property] = value;
+
+                        return this.add({
+                            restore: function () {
+                                object[property] = original;
+                            }
+                        });
+                    }
+                }
+                if (!property && !!object && typeof object === "object") {
+                    var stubbedObj = sinon.stub.apply(sinon, arguments);
+
+                    for (var prop in stubbedObj) {
+                        if (typeof stubbedObj[prop] === "function") {
+                            this.add(stubbedObj[prop]);
+                        }
+                    }
+
+                    return stubbedObj;
+                }
+
+                return this.add(sinon.stub.apply(sinon, arguments));
+            },
+
+            mock: function mock() {
+                return this.add(sinon.mock.apply(sinon, arguments));
+            },
+
+            inject: function inject(obj) {
+                var col = this;
+
+                obj.spy = function () {
+                    return col.spy.apply(col, arguments);
+                };
+
+                obj.stub = function () {
+                    return col.stub.apply(col, arguments);
+                };
+
+                obj.mock = function () {
+                    return col.mock.apply(col, arguments);
+                };
+
+                return obj;
+            }
+        };
+
+        sinon.collection = collection;
+        return collection;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        require("./mock");
+        require("./spy");
+        require("./stub");
+        module.exports = makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+        return;
+    }
+
+    if (isNode) {
+        loadDependencies(require, module.exports, module);
+        return;
+    }
+
+    if (sinonGlobal) {
+        makeApi(sinonGlobal);
+    }
+}(
+    typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * 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
+ */
+(function () {
+    
+    function makeApi(s, lol) {
+        /*global lolex */
+        var llx = typeof lolex !== "undefined" ? lolex : lol;
+
+        s.useFakeTimers = function () {
+            var now;
+            var methods = Array.prototype.slice.call(arguments);
+
+            if (typeof methods[0] === "string") {
+                now = 0;
+            } else {
+                now = methods.shift();
+            }
+
+            var clock = llx.install(now || 0, methods);
+            clock.restore = clock.uninstall;
+            return clock;
+        };
+
+        s.clock = {
+            create: function (now) {
+                return llx.createClock(now);
+            }
+        };
+
+        s.timers = {
+            setTimeout: setTimeout,
+            clearTimeout: clearTimeout,
+            setImmediate: (typeof setImmediate !== "undefined" ? setImmediate : undefined),
+            clearImmediate: (typeof clearImmediate !== "undefined" ? clearImmediate : undefined),
+            setInterval: setInterval,
+            clearInterval: clearInterval,
+            Date: Date
+        };
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, epxorts, module, lolex) {
+        var core = require("./core");
+        makeApi(core, lolex);
+        module.exports = core;
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module, require("lolex"));
+    } else {
+        makeApi(sinon); // eslint-disable-line no-undef
+    }
+}());
+
+/**
+ * Minimal Event interface implementation
+ *
+ * Original implementation by Sven Fuchs: https://gist.github.com/995028
+ * Modifications and tests by Christian Johansen.
+ *
+ * @author Sven Fuchs (svenfuchs@artweb-design.de)
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2011 Sven Fuchs, Christian Johansen
+ */
+if (typeof sinon === "undefined") {
+    this.sinon = {};
+}
+
+(function () {
+    
+    var push = [].push;
+
+    function makeApi(sinon) {
+        sinon.Event = function Event(type, bubbles, cancelable, target) {
+            this.initEvent(type, bubbles, cancelable, target);
+        };
+
+        sinon.Event.prototype = {
+            initEvent: function (type, bubbles, cancelable, target) {
+                this.type = type;
+                this.bubbles = bubbles;
+                this.cancelable = cancelable;
+                this.target = target;
+            },
+
+            stopPropagation: function () {},
+
+            preventDefault: function () {
+                this.defaultPrevented = true;
+            }
+        };
+
+        sinon.ProgressEvent = function ProgressEvent(type, progressEventRaw, target) {
+            this.initEvent(type, false, false, target);
+            this.loaded = progressEventRaw.loaded || null;
+            this.total = progressEventRaw.total || null;
+            this.lengthComputable = !!progressEventRaw.total;
+        };
+
+        sinon.ProgressEvent.prototype = new sinon.Event();
+
+        sinon.ProgressEvent.prototype.constructor = sinon.ProgressEvent;
+
+        sinon.CustomEvent = function CustomEvent(type, customData, target) {
+            this.initEvent(type, false, false, target);
+            this.detail = customData.detail || null;
+        };
+
+        sinon.CustomEvent.prototype = new sinon.Event();
+
+        sinon.CustomEvent.prototype.constructor = sinon.CustomEvent;
+
+        sinon.EventTarget = {
+            addEventListener: function addEventListener(event, listener) {
+                this.eventListeners = this.eventListeners || {};
+                this.eventListeners[event] = this.eventListeners[event] || [];
+                push.call(this.eventListeners[event], listener);
+            },
+
+            removeEventListener: function removeEventListener(event, listener) {
+                var listeners = this.eventListeners && this.eventListeners[event] || [];
+
+                for (var i = 0, l = listeners.length; i < l; ++i) {
+                    if (listeners[i] === listener) {
+                        return listeners.splice(i, 1);
+                    }
+                }
+            },
+
+            dispatchEvent: function dispatchEvent(event) {
+                var type = event.type;
+                var listeners = this.eventListeners && this.eventListeners[type] || [];
+
+                for (var i = 0; i < listeners.length; i++) {
+                    if (typeof listeners[i] === "function") {
+                        listeners[i].call(this, event);
+                    } else {
+                        listeners[i].handleEvent(event);
+                    }
+                }
+
+                return !!event.defaultPrevented;
+            }
+        };
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require) {
+        var sinon = require("./core");
+        makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require);
+    } else {
+        makeApi(sinon); // eslint-disable-line no-undef
+    }
+}());
+
+/**
+ * @depend util/core.js
+ */
+/**
+ * Logs errors
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2014 Christian Johansen
+ */
+(function (sinonGlobal) {
+    
+    // cache a reference to setTimeout, so that our reference won't be stubbed out
+    // when using fake timers and errors will still get logged
+    // https://github.com/cjohansen/Sinon.JS/issues/381
+    var realSetTimeout = setTimeout;
+
+    function makeApi(sinon) {
+
+        function log() {}
+
+        function logError(label, err) {
+            var msg = label + " threw exception: ";
+
+            function throwLoggedError() {
+                err.message = msg + err.message;
+                throw err;
+            }
+
+            sinon.log(msg + "[" + err.name + "] " + err.message);
+
+            if (err.stack) {
+                sinon.log(err.stack);
+            }
+
+            if (logError.useImmediateExceptions) {
+                throwLoggedError();
+            } else {
+                logError.setTimeout(throwLoggedError, 0);
+            }
+        }
+
+        // When set to true, any errors logged will be thrown immediately;
+        // If set to false, the errors will be thrown in separate execution frame.
+        logError.useImmediateExceptions = false;
+
+        // wrap realSetTimeout with something we can stub in tests
+        logError.setTimeout = function (func, timeout) {
+            realSetTimeout(func, timeout);
+        };
+
+        var exports = {};
+        exports.log = sinon.log = log;
+        exports.logError = sinon.logError = logError;
+
+        return exports;
+    }
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        module.exports = makeApi(sinon);
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    if (isAMD) {
+        define(loadDependencies);
+        return;
+    }
+
+    if (isNode) {
+        loadDependencies(require, module.exports, module);
+        return;
+    }
+
+    if (sinonGlobal) {
+        makeApi(sinonGlobal);
+    }
+}(
+    typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend core.js
+ * @depend ../extend.js
+ * @depend event.js
+ * @depend ../log_error.js
+ */
+/**
+ * Fake XDomainRequest object
+ */
+
+/**
+ * Returns the global to prevent assigning values to 'this' when this is undefined.
+ * This can occur when files are interpreted by node in strict mode.
+ * @private
+ */
+function getGlobal() {
+    
+    return typeof window !== "undefined" ? window : global;
+}
+
+if (typeof sinon === "undefined") {
+    if (typeof this === "undefined") {
+        getGlobal().sinon = {};
+    } else {
+        this.sinon = {};
+    }
+}
+
+// wrapper for global
+(function (global) {
+    
+    var xdr = { XDomainRequest: global.XDomainRequest };
+    xdr.GlobalXDomainRequest = global.XDomainRequest;
+    xdr.supportsXDR = typeof xdr.GlobalXDomainRequest !== "undefined";
+    xdr.workingXDR = xdr.supportsXDR ? xdr.GlobalXDomainRequest : false;
+
+    function makeApi(sinon) {
+        sinon.xdr = xdr;
+
+        function FakeXDomainRequest() {
+            this.readyState = FakeXDomainRequest.UNSENT;
+            this.requestBody = null;
+            this.requestHeaders = {};
+            this.status = 0;
+            this.timeout = null;
+
+            if (typeof FakeXDomainRequest.onCreate === "function") {
+                FakeXDomainRequest.onCreate(this);
+            }
+        }
+
+        function verifyState(x) {
+            if (x.readyState !== FakeXDomainRequest.OPENED) {
+                throw new Error("INVALID_STATE_ERR");
+            }
+
+            if (x.sendFlag) {
+                throw new Error("INVALID_STATE_ERR");
+            }
+        }
+
+        function verifyRequestSent(x) {
+            if (x.readyState === FakeXDomainRequest.UNSENT) {
+                throw new Error("Request not sent");
+            }
+            if (x.readyState === FakeXDomainRequest.DONE) {
+                throw new Error("Request done");
+            }
+        }
+
+        function verifyResponseBodyType(body) {
+            if (typeof body !== "string") {
+                var error = new Error("Attempted to respond to fake XDomainRequest with " +
+                                    body + ", which is not a string.");
+                error.name = "InvalidBodyException";
+                throw error;
+            }
+        }
+
+        sinon.extend(FakeXDomainRequest.prototype, sinon.EventTarget, {
+            open: function open(method, url) {
+                this.method = method;
+                this.url = url;
+
+                this.responseText = null;
+                this.sendFlag = false;
+
+                this.readyStateChange(FakeXDomainRequest.OPENED);
+            },
+
+            readyStateChange: function readyStateChange(state) {
+                this.readyState = state;
+                var eventName = "";
+                switch (this.readyState) {
+                case FakeXDomainRequest.UNSENT:
+                    break;
+                case FakeXDomainRequest.OPENED:
+                    break;
+                case FakeXDomainRequest.LOADING:
+                    if (this.sendFlag) {
+                        //raise the progress event
+                        eventName = "onprogress";
+                    }
+                    break;
+                case FakeXDomainRequest.DONE:
+                    if (this.isTimeout) {
+                        eventName = "ontimeout";
+                    } else if (this.errorFlag || (this.status < 200 || this.status > 299)) {
+                        eventName = "onerror";
+                    } else {
+                        eventName = "onload";
+                    }
+                    break;
+                }
+
+                // raising event (if defined)
+                if (eventName) {
+                    if (typeof this[eventName] === "function") {
+                        try {
+                            this[eventName]();
+                        } catch (e) {
+                            sinon.logError("Fake XHR " + eventName + " handler", e);
+                        }
+                    }
+                }
+            },
+
+            send: function send(data) {
+                verifyState(this);
+
+                if (!/^(get|head)$/i.test(this.method)) {
+                    this.requestBody = data;
+                }
+                this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8";
+
+                this.errorFlag = false;
+                this.sendFlag = true;
+                this.readyStateChange(FakeXDomainRequest.OPENED);
+
+                if (typeof this.onSend === "function") {
+                    this.onSend(this);
+                }
+            },
+
+            abort: function abort() {
+                this.aborted = true;
+                this.responseText = null;
+                this.errorFlag = true;
+
+                if (this.readyState > sinon.FakeXDomainRequest.UNSENT && this.sendFlag) {
+                    this.readyStateChange(sinon.FakeXDomainRequest.DONE);
+                    this.sendFlag = false;
+                }
+            },
+
+            setResponseBody: function setResponseBody(body) {
+                verifyRequestSent(this);
+                verifyResponseBodyType(body);
+
+                var chunkSize = this.chunkSize || 10;
+                var index = 0;
+                this.responseText = "";
+
+                do {
+                    this.readyStateChange(FakeXDomainRequest.LOADING);
+                    this.responseText += body.substring(index, index + chunkSize);
+                    index += chunkSize;
+                } while (index < body.length);
+
+                this.readyStateChange(FakeXDomainRequest.DONE);
+            },
+
+            respond: function respond(status, contentType, body) {
+                // content-type ignored, since XDomainRequest does not carry this
+                // we keep the same syntax for respond(...) as for FakeXMLHttpRequest to ease
+                // test integration across browsers
+                this.status = typeof status === "number" ? status : 200;
+                this.setResponseBody(body || "");
+            },
+
+            simulatetimeout: function simulatetimeout() {
+                this.status = 0;
+                this.isTimeout = true;
+                // Access to this should actually throw an error
+                this.responseText = undefined;
+                this.readyStateChange(FakeXDomainRequest.DONE);
+            }
+        });
+
+        sinon.extend(FakeXDomainRequest, {
+            UNSENT: 0,
+            OPENED: 1,
+            LOADING: 3,
+            DONE: 4
+        });
+
+        sinon.useFakeXDomainRequest = function useFakeXDomainRequest() {
+            sinon.FakeXDomainRequest.restore = function restore(keepOnCreate) {
+                if (xdr.supportsXDR) {
+                    global.XDomainRequest = xdr.GlobalXDomainRequest;
+                }
+
+                delete sinon.FakeXDomainRequest.restore;
+
+                if (keepOnCreate !== true) {
+                    delete sinon.FakeXDomainRequest.onCreate;
+                }
+            };
+            if (xdr.supportsXDR) {
+                global.XDomainRequest = sinon.FakeXDomainRequest;
+            }
+            return sinon.FakeXDomainRequest;
+        };
+
+        sinon.FakeXDomainRequest = FakeXDomainRequest;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./core");
+        require("../extend");
+        require("./event");
+        require("../log_error");
+        makeApi(sinon);
+        module.exports = sinon;
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else {
+        makeApi(sinon); // eslint-disable-line no-undef
+    }
+})(typeof global !== "undefined" ? global : self);
+
+/**
+ * @depend core.js
+ * @depend ../extend.js
+ * @depend event.js
+ * @depend ../log_error.js
+ */
+/**
+ * Fake XMLHttpRequest object
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal, global) {
+    
+    function getWorkingXHR(globalScope) {
+        var supportsXHR = typeof globalScope.XMLHttpRequest !== "undefined";
+        if (supportsXHR) {
+            return globalScope.XMLHttpRequest;
+        }
+
+        var supportsActiveX = typeof globalScope.ActiveXObject !== "undefined";
+        if (supportsActiveX) {
+            return function () {
+                return new globalScope.ActiveXObject("MSXML2.XMLHTTP.3.0");
+            };
+        }
+
+        return false;
+    }
+
+    var supportsProgress = typeof ProgressEvent !== "undefined";
+    var supportsCustomEvent = typeof CustomEvent !== "undefined";
+    var supportsFormData = typeof FormData !== "undefined";
+    var supportsArrayBuffer = typeof ArrayBuffer !== "undefined";
+    var supportsBlob = typeof Blob === "function";
+    var sinonXhr = { XMLHttpRequest: global.XMLHttpRequest };
+    sinonXhr.GlobalXMLHttpRequest = global.XMLHttpRequest;
+    sinonXhr.GlobalActiveXObject = global.ActiveXObject;
+    sinonXhr.supportsActiveX = typeof sinonXhr.GlobalActiveXObject !== "undefined";
+    sinonXhr.supportsXHR = typeof sinonXhr.GlobalXMLHttpRequest !== "undefined";
+    sinonXhr.workingXHR = getWorkingXHR(global);
+    sinonXhr.supportsCORS = sinonXhr.supportsXHR && "withCredentials" in (new sinonXhr.GlobalXMLHttpRequest());
+
+    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
+    };
+
+    // An upload object is created for each
+    // FakeXMLHttpRequest and allows upload
+    // events to be simulated using uploadProgress
+    // and uploadError.
+    function UploadProgress() {
+        this.eventListeners = {
+            progress: [],
+            load: [],
+            abort: [],
+            error: []
+        };
+    }
+
+    UploadProgress.prototype.addEventListener = function addEventListener(event, listener) {
+        this.eventListeners[event].push(listener);
+    };
+
+    UploadProgress.prototype.removeEventListener = function removeEventListener(event, listener) {
+        var listeners = this.eventListeners[event] || [];
+
+        for (var i = 0, l = listeners.length; i < l; ++i) {
+            if (listeners[i] === listener) {
+                return listeners.splice(i, 1);
+            }
+        }
+    };
+
+    UploadProgress.prototype.dispatchEvent = function dispatchEvent(event) {
+        var listeners = this.eventListeners[event.type] || [];
+
+        for (var i = 0, listener; (listener = listeners[i]) != null; i++) {
+            listener(event);
+        }
+    };
+
+    // Note that for FakeXMLHttpRequest to work pre ES5
+    // we lose some of the alignment with the spec.
+    // To ensure as close a match as possible,
+    // set responseType before calling open, send or respond;
+    function FakeXMLHttpRequest() {
+        this.readyState = FakeXMLHttpRequest.UNSENT;
+        this.requestHeaders = {};
+        this.requestBody = null;
+        this.status = 0;
+        this.statusText = "";
+        this.upload = new UploadProgress();
+        this.responseType = "";
+        this.response = "";
+        if (sinonXhr.supportsCORS) {
+            this.withCredentials = false;
+        }
+
+        var xhr = this;
+        var events = ["loadstart", "load", "abort", "loadend"];
+
+        function addEventListener(eventName) {
+            xhr.addEventListener(eventName, function (event) {
+                var listener = xhr["on" + eventName];
+
+                if (listener && typeof listener === "function") {
+                    listener.call(this, event);
+                }
+            });
+        }
+
+        for (var i = events.length - 1; i >= 0; i--) {
+            addEventListener(events[i]);
+        }
+
+        if (typeof FakeXMLHttpRequest.onCreate === "function") {
+            FakeXMLHttpRequest.onCreate(this);
+        }
+    }
+
+    function verifyState(xhr) {
+        if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {
+            throw new Error("INVALID_STATE_ERR");
+        }
+
+        if (xhr.sendFlag) {
+            throw new Error("INVALID_STATE_ERR");
+        }
+    }
+
+    function getHeader(headers, header) {
+        header = header.toLowerCase();
+
+        for (var h in headers) {
+            if (h.toLowerCase() === header) {
+                return h;
+            }
+        }
+
+        return null;
+    }
+
+    // filtering to enable a white-list version of Sinon FakeXhr,
+    // where whitelisted requests are passed through to real XHR
+    function each(collection, callback) {
+        if (!collection) {
+            return;
+        }
+
+        for (var i = 0, l = collection.length; i < l; i += 1) {
+            callback(collection[i]);
+        }
+    }
+    function some(collection, callback) {
+        for (var index = 0; index < collection.length; index++) {
+            if (callback(collection[index]) === true) {
+                return true;
+            }
+        }
+        return false;
+    }
+    // largest arity in XHR is 5 - XHR#open
+    var apply = function (obj, method, args) {
+        switch (args.length) {
+        case 0: return obj[method]();
+        case 1: return obj[method](args[0]);
+        case 2: return obj[method](args[0], args[1]);
+        case 3: return obj[method](args[0], args[1], args[2]);
+        case 4: return obj[method](args[0], args[1], args[2], args[3]);
+        case 5: return obj[method](args[0], args[1], args[2], args[3], args[4]);
+        }
+    };
+
+    FakeXMLHttpRequest.filters = [];
+    FakeXMLHttpRequest.addFilter = function addFilter(fn) {
+        this.filters.push(fn);
+    };
+    var IE6Re = /MSIE 6/;
+    FakeXMLHttpRequest.defake = function defake(fakeXhr, xhrArgs) {
+        var xhr = new sinonXhr.workingXHR(); // eslint-disable-line new-cap
+
+        each([
+            "open",
+            "setRequestHeader",
+            "send",
+            "abort",
+            "getResponseHeader",
+            "getAllResponseHeaders",
+            "addEventListener",
+            "overrideMimeType",
+            "removeEventListener"
+        ], function (method) {
+            fakeXhr[method] = function () {
+                return apply(xhr, method, arguments);
+            };
+        });
+
+        var copyAttrs = function (args) {
+            each(args, function (attr) {
+                try {
+                    fakeXhr[attr] = xhr[attr];
+                } catch (e) {
+                    if (!IE6Re.test(navigator.userAgent)) {
+                        throw e;
+                    }
+                }
+            });
+        };
+
+        var stateChange = function stateChange() {
+            fakeXhr.readyState = xhr.readyState;
+            if (xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) {
+                copyAttrs(["status", "statusText"]);
+            }
+            if (xhr.readyState >= FakeXMLHttpRequest.LOADING) {
+                copyAttrs(["responseText", "response"]);
+            }
+            if (xhr.readyState === FakeXMLHttpRequest.DONE) {
+                copyAttrs(["responseXML"]);
+            }
+            if (fakeXhr.onreadystatechange) {
+                fakeXhr.onreadystatechange.call(fakeXhr, { target: fakeXhr });
+            }
+        };
+
+        if (xhr.addEventListener) {
+            for (var event in fakeXhr.eventListeners) {
+                if (fakeXhr.eventListeners.hasOwnProperty(event)) {
+
+                    /*eslint-disable no-loop-func*/
+                    each(fakeXhr.eventListeners[event], function (handler) {
+                        xhr.addEventListener(event, handler);
+                    });
+                    /*eslint-enable no-loop-func*/
+                }
+            }
+            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;
+        }
+    }
+
+    function convertToArrayBuffer(body) {
+        var buffer = new ArrayBuffer(body.length);
+        var view = new Uint8Array(buffer);
+        for (var i = 0; i < body.length; i++) {
+            var charCode = body.charCodeAt(i);
+            if (charCode >= 256) {
+                throw new TypeError("arraybuffer or blob responseTypes require binary string, " +
+                                    "invalid character " + body[i] + " found.");
+            }
+            view[i] = charCode;
+        }
+        return buffer;
+    }
+
+    function isXmlContentType(contentType) {
+        return !contentType || /(text\/xml)|(application\/xml)|(\+xml)/.test(contentType);
+    }
+
+    function convertResponseBody(responseType, contentType, body) {
+        if (responseType === "" || responseType === "text") {
+            return body;
+        } else if (supportsArrayBuffer && responseType === "arraybuffer") {
+            return convertToArrayBuffer(body);
+        } else if (responseType === "json") {
+            try {
+                return JSON.parse(body);
+            } catch (e) {
+                // Return parsing failure as null
+                return null;
+            }
+        } else if (supportsBlob && responseType === "blob") {
+            var blobOptions = {};
+            if (contentType) {
+                blobOptions.type = contentType;
+            }
+            return new Blob([convertToArrayBuffer(body)], blobOptions);
+        } else if (responseType === "document") {
+            if (isXmlContentType(contentType)) {
+                return FakeXMLHttpRequest.parseXML(body);
+            }
+            return null;
+        }
+        throw new Error("Invalid responseType " + responseType);
+    }
+
+    function clearResponse(xhr) {
+        if (xhr.responseType === "" || xhr.responseType === "text") {
+            xhr.response = xhr.responseText = "";
+        } else {
+            xhr.response = xhr.responseText = null;
+        }
+        xhr.responseXML = null;
+    }
+
+    FakeXMLHttpRequest.parseXML = function parseXML(text) {
+        // Treat empty string as parsing failure
+        if (text !== "") {
+            try {
+                if (typeof DOMParser !== "undefined") {
+                    var parser = new DOMParser();
+                    return parser.parseFromString(text, "text/xml");
+                }
+                var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
+                xmlDoc.async = "false";
+                xmlDoc.loadXML(text);
+                return xmlDoc;
+            } catch (e) {
+                // Unable to parse XML - no biggie
+            }
+        }
+
+        return null;
+    };
+
+    FakeXMLHttpRequest.statusCodes = {
+        100: "Continue",
+        101: "Switching Protocols",
+        200: "OK",
+        201: "Created",
+        202: "Accepted",
+        203: "Non-Authoritative Information",
+        204: "No Content",
+        205: "Reset Content",
+        206: "Partial Content",
+        207: "Multi-Status",
+        300: "Multiple Choice",
+        301: "Moved Permanently",
+        302: "Found",
+        303: "See Other",
+        304: "Not Modified",
+        305: "Use Proxy",
+        307: "Temporary Redirect",
+        400: "Bad Request",
+        401: "Unauthorized",
+        402: "Payment Required",
+        403: "Forbidden",
+        404: "Not Found",
+        405: "Method Not Allowed",
+        406: "Not Acceptable",
+        407: "Proxy Authentication Required",
+        408: "Request Timeout",
+        409: "Conflict",
+        410: "Gone",
+        411: "Length Required",
+        412: "Precondition Failed",
+        413: "Request Entity Too Large",
+        414: "Request-URI Too Long",
+        415: "Unsupported Media Type",
+        416: "Requested Range Not Satisfiable",
+        417: "Expectation Failed",
+        422: "Unprocessable Entity",
+        500: "Internal Server Error",
+        501: "Not Implemented",
+        502: "Bad Gateway",
+        503: "Service Unavailable",
+        504: "Gateway Timeout",
+        505: "HTTP Version Not Supported"
+    };
+
+    function makeApi(sinon) {
+        sinon.xhr = sinonXhr;
+
+        sinon.extend(FakeXMLHttpRequest.prototype, sinon.EventTarget, {
+            async: true,
+
+            open: function open(method, url, async, username, password) {
+                this.method = method;
+                this.url = url;
+                this.async = typeof async === "boolean" ? async : true;
+                this.username = username;
+                this.password = password;
+                clearResponse(this);
+                this.requestHeaders = {};
+                this.sendFlag = false;
+
+                if (FakeXMLHttpRequest.useFilters === true) {
+                    var xhrArgs = arguments;
+                    var defake = some(FakeXMLHttpRequest.filters, function (filter) {
+                        return filter.apply(this, xhrArgs);
+                    });
+                    if (defake) {
+                        return FakeXMLHttpRequest.defake(this, arguments);
+                    }
+                }
+                this.readyStateChange(FakeXMLHttpRequest.OPENED);
+            },
+
+            readyStateChange: function readyStateChange(state) {
+                this.readyState = state;
+
+                var readyStateChangeEvent = new sinon.Event("readystatechange", false, false, this);
+
+                if (typeof this.onreadystatechange === "function") {
+                    try {
+                        this.onreadystatechange(readyStateChangeEvent);
+                    } catch (e) {
+                        sinon.logError("Fake XHR onreadystatechange handler", e);
+                    }
+                }
+
+                switch (this.readyState) {
+                    case FakeXMLHttpRequest.DONE:
+                        if (supportsProgress) {
+                            this.upload.dispatchEvent(new sinon.ProgressEvent("progress", {loaded: 100, total: 100}));
+                            this.dispatchEvent(new sinon.ProgressEvent("progress", {loaded: 100, total: 100}));
+                        }
+                        this.upload.dispatchEvent(new sinon.Event("load", false, false, this));
+                        this.dispatchEvent(new sinon.Event("load", false, false, this));
+                        this.dispatchEvent(new sinon.Event("loadend", false, false, this));
+                        break;
+                }
+
+                this.dispatchEvent(readyStateChangeEvent);
+            },
+
+            setRequestHeader: function setRequestHeader(header, value) {
+                verifyState(this);
+
+                if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) {
+                    throw new Error("Refused to set unsafe header \"" + header + "\"");
+                }
+
+                if (this.requestHeaders[header]) {
+                    this.requestHeaders[header] += "," + value;
+                } else {
+                    this.requestHeaders[header] = value;
+                }
+            },
+
+            // Helps testing
+            setResponseHeaders: function setResponseHeaders(headers) {
+                verifyRequestOpened(this);
+                this.responseHeaders = {};
+
+                for (var header in headers) {
+                    if (headers.hasOwnProperty(header)) {
+                        this.responseHeaders[header] = headers[header];
+                    }
+                }
+
+                if (this.async) {
+                    this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED);
+                } else {
+                    this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED;
+                }
+            },
+
+            // Currently treats ALL data as a DOMString (i.e. no Document)
+            send: function send(data) {
+                verifyState(this);
+
+                if (!/^(get|head)$/i.test(this.method)) {
+                    var contentType = getHeader(this.requestHeaders, "Content-Type");
+                    if (this.requestHeaders[contentType]) {
+                        var value = this.requestHeaders[contentType].split(";");
+                        this.requestHeaders[contentType] = value[0] + ";charset=utf-8";
+                    } else if (supportsFormData && !(data instanceof FormData)) {
+                        this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8";
+                    }
+
+                    this.requestBody = data;
+                }
+
+                this.errorFlag = false;
+                this.sendFlag = this.async;
+                clearResponse(this);
+                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;
+                clearResponse(this);
+                this.errorFlag = true;
+                this.requestHeaders = {};
+                this.responseHeaders = {};
+
+                if (this.readyState > FakeXMLHttpRequest.UNSENT && this.sendFlag) {
+                    this.readyStateChange(FakeXMLHttpRequest.DONE);
+                    this.sendFlag = false;
+                }
+
+                this.readyState = FakeXMLHttpRequest.UNSENT;
+
+                this.dispatchEvent(new sinon.Event("abort", false, false, this));
+
+                this.upload.dispatchEvent(new sinon.Event("abort", false, false, this));
+
+                if (typeof this.onerror === "function") {
+                    this.onerror();
+                }
+            },
+
+            getResponseHeader: function getResponseHeader(header) {
+                if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {
+                    return null;
+                }
+
+                if (/^Set-Cookie2?$/i.test(header)) {
+                    return null;
+                }
+
+                header = getHeader(this.responseHeaders, header);
+
+                return this.responseHeaders[header] || null;
+            },
+
+            getAllResponseHeaders: function getAllResponseHeaders() {
+                if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {
+                    return "";
+                }
+
+                var headers = "";
+
+                for (var header in this.responseHeaders) {
+                    if (this.responseHeaders.hasOwnProperty(header) &&
+                        !/^Set-Cookie2?$/i.test(header)) {
+                        headers += header + ": " + this.responseHeaders[header] + "\r\n";
+                    }
+                }
+
+                return headers;
+            },
+
+            setResponseBody: function setResponseBody(body) {
+                verifyRequestSent(this);
+                verifyHeadersReceived(this);
+                verifyResponseBodyType(body);
+                var contentType = this.getResponseHeader("Content-Type");
+
+                var isTextResponse = this.responseType === "" || this.responseType === "text";
+                clearResponse(this);
+                if (this.async) {
+                    var chunkSize = this.chunkSize || 10;
+                    var index = 0;
+
+                    do {
+                        this.readyStateChange(FakeXMLHttpRequest.LOADING);
+
+                        if (isTextResponse) {
+                            this.responseText = this.response += body.substring(index, index + chunkSize);
+                        }
+                        index += chunkSize;
+                    } while (index < body.length);
+                }
+
+                this.response = convertResponseBody(this.responseType, contentType, body);
+                if (isTextResponse) {
+                    this.responseText = this.response;
+                }
+
+                if (this.responseType === "document") {
+                    this.responseXML = this.response;
+                } else if (this.responseType === "" && isXmlContentType(contentType)) {
+                    this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText);
+                }
+                this.readyStateChange(FakeXMLHttpRequest.DONE);
+            },
+
+            respond: function respond(status, headers, body) {
+                this.status = typeof status === "number" ? status : 200;
+                this.statusText = FakeXMLHttpRequest.statusCodes[this.status];
+                this.setResponseHeaders(headers || {});
+                this.setResponseBody(body || "");
+            },
+
+            uploadProgress: function uploadProgress(progressEventRaw) {
+                if (supportsProgress) {
+                    this.upload.dispatchEvent(new sinon.ProgressEvent("progress", progressEventRaw));
+                }
+            },
+
+            downloadProgress: function downloadProgress(progressEventRaw) {
+                if (supportsProgress) {
+                    this.dispatchEvent(new sinon.ProgressEvent("progress", progressEventRaw));
+                }
+            },
+
+            uploadError: function uploadError(error) {
+                if (supportsCustomEvent) {
+                    this.upload.dispatchEvent(new sinon.CustomEvent("error", {detail: error}));
+                }
+            }
+        });
+
+        sinon.extend(FakeXMLHttpRequest, {
+            UNSENT: 0,
+            OPENED: 1,
+            HEADERS_RECEIVED: 2,
+            LOADING: 3,
+            DONE: 4
+        });
+
+        sinon.useFakeXMLHttpRequest = function () {
+            FakeXMLHttpRequest.restore = function restore(keepOnCreate) {
+                if (sinonXhr.supportsXHR) {
+                    global.XMLHttpRequest = sinonXhr.GlobalXMLHttpRequest;
+                }
+
+                if (sinonXhr.supportsActiveX) {
+                    global.ActiveXObject = sinonXhr.GlobalActiveXObject;
+                }
+
+                delete FakeXMLHttpRequest.restore;
+
+                if (keepOnCreate !== true) {
+                    delete FakeXMLHttpRequest.onCreate;
+                }
+            };
+            if (sinonXhr.supportsXHR) {
+                global.XMLHttpRequest = FakeXMLHttpRequest;
+            }
+
+            if (sinonXhr.supportsActiveX) {
+                global.ActiveXObject = function ActiveXObject(objId) {
+                    if (objId === "Microsoft.XMLHTTP" || /^Msxml2\.XMLHTTP/i.test(objId)) {
+
+                        return new FakeXMLHttpRequest();
+                    }
+
+                    return new sinonXhr.GlobalActiveXObject(objId);
+                };
+            }
+
+            return FakeXMLHttpRequest;
+        };
+
+        sinon.FakeXMLHttpRequest = FakeXMLHttpRequest;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./core");
+        require("../extend");
+        require("./event");
+        require("../log_error");
+        makeApi(sinon);
+        module.exports = sinon;
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+        return;
+    }
+
+    if (isNode) {
+        loadDependencies(require, module.exports, module);
+        return;
+    }
+
+    if (sinonGlobal) {
+        makeApi(sinonGlobal);
+    }
+}(
+    typeof sinon === "object" && sinon, // eslint-disable-line no-undef
+    typeof global !== "undefined" ? global : self
+));
+
+/**
+ * @depend fake_xdomain_request.js
+ * @depend fake_xml_http_request.js
+ * @depend ../format.js
+ * @depend ../log_error.js
+ */
+/**
+ * The Sinon "server" mimics a web server that receives requests from
+ * sinon.FakeXMLHttpRequest and provides an API to respond to those requests,
+ * both synchronously and asynchronously. To respond synchronuously, canned
+ * answers have to be provided upfront.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function () {
+    
+    var push = [].push;
+
+    function responseArray(handler) {
+        var response = handler;
+
+        if (Object.prototype.toString.call(handler) !== "[object Array]") {
+            response = [200, {}, handler];
+        }
+
+        if (typeof response[2] !== "string") {
+            throw new TypeError("Fake server response body should be string, but was " +
+                                typeof response[2]);
+        }
+
+        return response;
+    }
+
+    var wloc = typeof window !== "undefined" ? window.location : {};
+    var rCurrLoc = new RegExp("^" + wloc.protocol + "//" + wloc.host);
+
+    function matchOne(response, reqMethod, reqUrl) {
+        var rmeth = response.method;
+        var matchMethod = !rmeth || rmeth.toLowerCase() === reqMethod.toLowerCase();
+        var url = response.url;
+        var matchUrl = !url || url === reqUrl || (typeof url.test === "function" && url.test(reqUrl));
+
+        return matchMethod && matchUrl;
+    }
+
+    function match(response, request) {
+        var requestUrl = request.url;
+
+        if (!/^https?:\/\//.test(requestUrl) || rCurrLoc.test(requestUrl)) {
+            requestUrl = requestUrl.replace(rCurrLoc, "");
+        }
+
+        if (matchOne(response, this.getHTTPMethod(request), requestUrl)) {
+            if (typeof response.response === "function") {
+                var ru = response.url;
+                var args = [request].concat(ru && typeof ru.exec === "function" ? ru.exec(requestUrl).slice(1) : []);
+                return response.response.apply(response, args);
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    function makeApi(sinon) {
+        sinon.fakeServer = {
+            create: function (config) {
+                var server = sinon.create(this);
+                server.configure(config);
+                if (!sinon.xhr.supportsCORS) {
+                    this.xhr = sinon.useFakeXDomainRequest();
+                } else {
+                    this.xhr = sinon.useFakeXMLHttpRequest();
+                }
+                server.requests = [];
+
+                this.xhr.onCreate = function (xhrObj) {
+                    server.addRequest(xhrObj);
+                };
+
+                return server;
+            },
+            configure: function (config) {
+                var whitelist = {
+                    "autoRespond": true,
+                    "autoRespondAfter": true,
+                    "respondImmediately": true,
+                    "fakeHTTPMethods": true
+                };
+                var setting;
+
+                config = config || {};
+                for (setting in config) {
+                    if (whitelist.hasOwnProperty(setting) && config.hasOwnProperty(setting)) {
+                        this[setting] = config[setting];
+                    }
+                }
+            },
+            addRequest: function addRequest(xhrObj) {
+                var server = this;
+                push.call(this.requests, xhrObj);
+
+                xhrObj.onSend = function () {
+                    server.handleRequest(this);
+
+                    if (server.respondImmediately) {
+                        server.respond();
+                    } else if (server.autoRespond && !server.responding) {
+                        setTimeout(function () {
+                            server.responding = false;
+                            server.respond();
+                        }, server.autoRespondAfter || 10);
+
+                        server.responding = true;
+                    }
+                };
+            },
+
+            getHTTPMethod: function getHTTPMethod(request) {
+                if (this.fakeHTTPMethods && /post/i.test(request.method)) {
+                    var matches = (request.requestBody || "").match(/_method=([^\b;]+)/);
+                    return matches ? matches[1] : request.method;
+                }
+
+                return request.method;
+            },
+
+            handleRequest: function handleRequest(xhr) {
+                if (xhr.async) {
+                    if (!this.queue) {
+                        this.queue = [];
+                    }
+
+                    push.call(this.queue, xhr);
+                } else {
+                    this.processRequest(xhr);
+                }
+            },
+
+            log: function log(response, request) {
+                var str;
+
+                str = "Request:\n" + sinon.format(request) + "\n\n";
+                str += "Response:\n" + sinon.format(response) + "\n\n";
+
+                sinon.log(str);
+            },
+
+            respondWith: function respondWith(method, url, body) {
+                if (arguments.length === 1 && typeof method !== "function") {
+                    this.response = responseArray(method);
+                    return;
+                }
+
+                if (!this.responses) {
+                    this.responses = [];
+                }
+
+                if (arguments.length === 1) {
+                    body = method;
+                    url = method = null;
+                }
+
+                if (arguments.length === 2) {
+                    body = url;
+                    url = method;
+                    method = null;
+                }
+
+                push.call(this.responses, {
+                    method: method,
+                    url: url,
+                    response: typeof body === "function" ? body : responseArray(body)
+                });
+            },
+
+            respond: function respond() {
+                if (arguments.length > 0) {
+                    this.respondWith.apply(this, arguments);
+                }
+
+                var queue = this.queue || [];
+                var requests = queue.splice(0, queue.length);
+
+                for (var i = 0; i < requests.length; i++) {
+                    this.processRequest(requests[i]);
+                }
+            },
+
+            processRequest: function processRequest(request) {
+                try {
+                    if (request.aborted) {
+                        return;
+                    }
+
+                    var response = this.response || [404, {}, ""];
+
+                    if (this.responses) {
+                        for (var l = this.responses.length, i = l - 1; i >= 0; i--) {
+                            if (match.call(this, this.responses[i], request)) {
+                                response = this.responses[i].response;
+                                break;
+                            }
+                        }
+                    }
+
+                    if (request.readyState !== 4) {
+                        this.log(response, request);
+
+                        request.respond(response[0], response[1], response[2]);
+                    }
+                } catch (e) {
+                    sinon.logError("Fake server request processing", e);
+                }
+            },
+
+            restore: function restore() {
+                return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments);
+            }
+        };
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./core");
+        require("./fake_xdomain_request");
+        require("./fake_xml_http_request");
+        require("../format");
+        makeApi(sinon);
+        module.exports = sinon;
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else {
+        makeApi(sinon); // eslint-disable-line no-undef
+    }
+}());
+
+/**
+ * @depend fake_server.js
+ * @depend fake_timers.js
+ */
+/**
+ * Add-on for sinon.fakeServer that automatically handles a fake timer along with
+ * the FakeXMLHttpRequest. The direct inspiration for this add-on is jQuery
+ * 1.3.x, which does not use xhr object's onreadystatehandler at all - instead,
+ * it polls the object for completion with setInterval. Dispite the direct
+ * motivation, there is nothing jQuery-specific in this file, so it can be used
+ * in any environment where the ajax implementation depends on setInterval or
+ * setTimeout.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function () {
+    
+    function makeApi(sinon) {
+        function Server() {}
+        Server.prototype = sinon.fakeServer;
+
+        sinon.fakeServerWithClock = new Server();
+
+        sinon.fakeServerWithClock.addRequest = function addRequest(xhr) {
+            if (xhr.async) {
+                if (typeof setTimeout.clock === "object") {
+                    this.clock = setTimeout.clock;
+                } else {
+                    this.clock = sinon.useFakeTimers();
+                    this.resetClock = true;
+                }
+
+                if (!this.longestTimeout) {
+                    var clockSetTimeout = this.clock.setTimeout;
+                    var clockSetInterval = this.clock.setInterval;
+                    var server = this;
+
+                    this.clock.setTimeout = function (fn, timeout) {
+                        server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);
+
+                        return clockSetTimeout.apply(this, arguments);
+                    };
+
+                    this.clock.setInterval = function (fn, timeout) {
+                        server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);
+
+                        return clockSetInterval.apply(this, arguments);
+                    };
+                }
+            }
+
+            return sinon.fakeServer.addRequest.call(this, xhr);
+        };
+
+        sinon.fakeServerWithClock.respond = function respond() {
+            var returnVal = sinon.fakeServer.respond.apply(this, arguments);
+
+            if (this.clock) {
+                this.clock.tick(this.longestTimeout || 0);
+                this.longestTimeout = 0;
+
+                if (this.resetClock) {
+                    this.clock.restore();
+                    this.resetClock = false;
+                }
+            }
+
+            return returnVal;
+        };
+
+        sinon.fakeServerWithClock.restore = function restore() {
+            if (this.clock) {
+                this.clock.restore();
+            }
+
+            return sinon.fakeServer.restore.apply(this, arguments);
+        };
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require) {
+        var sinon = require("./core");
+        require("./fake_server");
+        require("./fake_timers");
+        makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require);
+    } else {
+        makeApi(sinon); // eslint-disable-line no-undef
+    }
+}());
+
+/**
+ * @depend util/core.js
+ * @depend extend.js
+ * @depend collection.js
+ * @depend util/fake_timers.js
+ * @depend util/fake_server_with_clock.js
+ */
+/**
+ * Manages fake collections as well as fake utilities such as Sinon's
+ * timers and fake XHR implementation in one convenient object.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal) {
+    
+    function makeApi(sinon) {
+        var push = [].push;
+
+        function exposeValue(sandbox, config, key, value) {
+            if (!value) {
+                return;
+            }
+
+            if (config.injectInto && !(key in config.injectInto)) {
+                config.injectInto[key] = value;
+                sandbox.injectedKeys.push(key);
+            } else {
+                push.call(sandbox.args, value);
+            }
+        }
+
+        function prepareSandboxFromConfig(config) {
+            var sandbox = sinon.create(sinon.sandbox);
+
+            if (config.useFakeServer) {
+                if (typeof config.useFakeServer === "object") {
+                    sandbox.serverPrototype = config.useFakeServer;
+                }
+
+                sandbox.useFakeServer();
+            }
+
+            if (config.useFakeTimers) {
+                if (typeof config.useFakeTimers === "object") {
+                    sandbox.useFakeTimers.apply(sandbox, config.useFakeTimers);
+                } else {
+                    sandbox.useFakeTimers();
+                }
+            }
+
+            return sandbox;
+        }
+
+        sinon.sandbox = sinon.extend(sinon.create(sinon.collection), {
+            useFakeTimers: function useFakeTimers() {
+                this.clock = sinon.useFakeTimers.apply(sinon, arguments);
+
+                return this.add(this.clock);
+            },
+
+            serverPrototype: sinon.fakeServer,
+
+            useFakeServer: function useFakeServer() {
+                var proto = this.serverPrototype || sinon.fakeServer;
+
+                if (!proto || !proto.create) {
+                    return null;
+                }
+
+                this.server = proto.create();
+                return this.add(this.server);
+            },
+
+            inject: function (obj) {
+                sinon.collection.inject.call(this, obj);
+
+                if (this.clock) {
+                    obj.clock = this.clock;
+                }
+
+                if (this.server) {
+                    obj.server = this.server;
+                    obj.requests = this.server.requests;
+                }
+
+                obj.match = sinon.match;
+
+                return obj;
+            },
+
+            restore: function () {
+                sinon.collection.restore.apply(this, arguments);
+                this.restoreContext();
+            },
+
+            restoreContext: function () {
+                if (this.injectedKeys) {
+                    for (var i = 0, j = this.injectedKeys.length; i < j; i++) {
+                        delete this.injectInto[this.injectedKeys[i]];
+                    }
+                    this.injectedKeys = [];
+                }
+            },
+
+            create: function (config) {
+                if (!config) {
+                    return sinon.create(sinon.sandbox);
+                }
+
+                var sandbox = prepareSandboxFromConfig(config);
+                sandbox.args = sandbox.args || [];
+                sandbox.injectedKeys = [];
+                sandbox.injectInto = config.injectInto;
+                var prop,
+                    value;
+                var exposed = sandbox.inject({});
+
+                if (config.properties) {
+                    for (var i = 0, l = config.properties.length; i < l; i++) {
+                        prop = config.properties[i];
+                        value = exposed[prop] || prop === "sandbox" && sandbox;
+                        exposeValue(sandbox, config, prop, value);
+                    }
+                } else {
+                    exposeValue(sandbox, config, "sandbox", value);
+                }
+
+                return sandbox;
+            },
+
+            match: sinon.match
+        });
+
+        sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer;
+
+        return sinon.sandbox;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        require("./extend");
+        require("./util/fake_server_with_clock");
+        require("./util/fake_timers");
+        require("./collection");
+        module.exports = makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+        return;
+    }
+
+    if (isNode) {
+        loadDependencies(require, module.exports, module);
+        return;
+    }
+
+    if (sinonGlobal) {
+        makeApi(sinonGlobal);
+    }
+}(
+    typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend util/core.js
+ * @depend sandbox.js
+ */
+/**
+ * Test function, sandboxes fakes
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal) {
+    
+    function makeApi(sinon) {
+        var slice = Array.prototype.slice;
+
+        function test(callback) {
+            var type = typeof callback;
+
+            if (type !== "function") {
+                throw new TypeError("sinon.test needs to wrap a test function, got " + type);
+            }
+
+            function sinonSandboxedTest() {
+                var config = sinon.getConfig(sinon.config);
+                config.injectInto = config.injectIntoThis && this || config.injectInto;
+                var sandbox = sinon.sandbox.create(config);
+                var args = slice.call(arguments);
+                var oldDone = args.length && args[args.length - 1];
+                var exception, result;
+
+                if (typeof oldDone === "function") {
+                    args[args.length - 1] = function sinonDone(res) {
+                        if (res) {
+                            sandbox.restore();
+                        } else {
+                            sandbox.verifyAndRestore();
+                        }
+                        oldDone(res);
+                    };
+                }
+
+                try {
+                    result = callback.apply(this, args.concat(sandbox.args));
+                } catch (e) {
+                    exception = e;
+                }
+
+                if (typeof oldDone !== "function") {
+                    if (typeof exception !== "undefined") {
+                        sandbox.restore();
+                        throw exception;
+                    } else {
+                        sandbox.verifyAndRestore();
+                    }
+                }
+
+                return result;
+            }
+
+            if (callback.length) {
+                return function sinonAsyncSandboxedTest(done) { // eslint-disable-line no-unused-vars
+                    return sinonSandboxedTest.apply(this, arguments);
+                };
+            }
+
+            return sinonSandboxedTest;
+        }
+
+        test.config = {
+            injectIntoThis: true,
+            injectInto: null,
+            properties: ["spy", "stub", "mock", "clock", "server", "requests"],
+            useFakeTimers: true,
+            useFakeServer: true
+        };
+
+        sinon.test = test;
+        return test;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var core = require("./util/core");
+        require("./sandbox");
+        module.exports = makeApi(core);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+    } else if (isNode) {
+        loadDependencies(require, module.exports, module);
+    } else if (sinonGlobal) {
+        makeApi(sinonGlobal);
+    }
+}(typeof sinon === "object" && sinon || null)); // eslint-disable-line no-undef
+
+/**
+ * @depend util/core.js
+ * @depend test.js
+ */
+/**
+ * Test case, sandboxes all test functions
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal) {
+    
+    function createTest(property, setUp, tearDown) {
+        return function () {
+            if (setUp) {
+                setUp.apply(this, arguments);
+            }
+
+            var exception, result;
+
+            try {
+                result = property.apply(this, arguments);
+            } catch (e) {
+                exception = e;
+            }
+
+            if (tearDown) {
+                tearDown.apply(this, arguments);
+            }
+
+            if (exception) {
+                throw exception;
+            }
+
+            return result;
+        };
+    }
+
+    function makeApi(sinon) {
+        function testCase(tests, prefix) {
+            if (!tests || typeof tests !== "object") {
+                throw new TypeError("sinon.testCase needs an object with test functions");
+            }
+
+            prefix = prefix || "test";
+            var rPrefix = new RegExp("^" + prefix);
+            var methods = {};
+            var setUp = tests.setUp;
+            var tearDown = tests.tearDown;
+            var testName,
+                property,
+                method;
+
+            for (testName in tests) {
+                if (tests.hasOwnProperty(testName) && !/^(setUp|tearDown)$/.test(testName)) {
+                    property = tests[testName];
+
+                    if (typeof property === "function" && rPrefix.test(testName)) {
+                        method = property;
+
+                        if (setUp || tearDown) {
+                            method = createTest(property, setUp, tearDown);
+                        }
+
+                        methods[testName] = sinon.test(method);
+                    } else {
+                        methods[testName] = tests[testName];
+                    }
+                }
+            }
+
+            return methods;
+        }
+
+        sinon.testCase = testCase;
+        return testCase;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var core = require("./util/core");
+        require("./test");
+        module.exports = makeApi(core);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+        return;
+    }
+
+    if (isNode) {
+        loadDependencies(require, module.exports, module);
+        return;
+    }
+
+    if (sinonGlobal) {
+        makeApi(sinonGlobal);
+    }
+}(
+    typeof sinon === "object" && sinon // eslint-disable-line no-undef
+));
+
+/**
+ * @depend times_in_words.js
+ * @depend util/core.js
+ * @depend match.js
+ * @depend format.js
+ */
+/**
+ * Assertions matching the test spy retrieval interface.
+ *
+ * @author Christian Johansen (christian@cjohansen.no)
+ * @license BSD
+ *
+ * Copyright (c) 2010-2013 Christian Johansen
+ */
+(function (sinonGlobal, global) {
+    
+    var slice = Array.prototype.slice;
+
+    function makeApi(sinon) {
+        var assert;
+
+        function verifyIsStub() {
+            var method;
+
+            for (var i = 0, l = arguments.length; i < l; ++i) {
+                method = arguments[i];
+
+                if (!method) {
+                    assert.fail("fake is not a spy");
+                }
+
+                if (method.proxy && method.proxy.isSinonProxy) {
+                    verifyIsStub(method.proxy);
+                } else {
+                    if (typeof method !== "function") {
+                        assert.fail(method + " is not a function");
+                    }
+
+                    if (typeof method.getCall !== "function") {
+                        assert.fail(method + " is not stubbed");
+                    }
+                }
+
+            }
+        }
+
+        function failAssertion(object, msg) {
+            object = object || global;
+            var failMethod = object.fail || assert.fail;
+            failMethod.call(object, msg);
+        }
+
+        function mirrorPropAsAssertion(name, method, message) {
+            if (arguments.length === 2) {
+                message = method;
+                method = name;
+            }
+
+            assert[name] = function (fake) {
+                verifyIsStub(fake);
+
+                var args = slice.call(arguments, 1);
+                var failed = false;
+
+                if (typeof method === "function") {
+                    failed = !method(fake);
+                } else {
+                    failed = typeof fake[method] === "function" ?
+                        !fake[method].apply(fake, args) : !fake[method];
+                }
+
+                if (failed) {
+                    failAssertion(this, (fake.printf || fake.proxy.printf).apply(fake, [message].concat(args)));
+                } else {
+                    assert.pass(name);
+                }
+            };
+        }
+
+        function exposedName(prefix, prop) {
+            return !prefix || /^fail/.test(prop) ? prop :
+                prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1);
+        }
+
+        assert = {
+            failException: "AssertError",
+
+            fail: function fail(message) {
+                var error = new Error(message);
+                error.name = this.failException || assert.failException;
+
+                throw error;
+            },
+
+            pass: function pass() {},
+
+            callOrder: function assertCallOrder() {
+                verifyIsStub.apply(null, arguments);
+                var expected = "";
+                var actual = "";
+
+                if (!sinon.calledInOrder(arguments)) {
+                    try {
+                        expected = [].join.call(arguments, ", ");
+                        var calls = slice.call(arguments);
+                        var i = calls.length;
+                        while (i) {
+                            if (!calls[--i].called) {
+                                calls.splice(i, 1);
+                            }
+                        }
+                        actual = sinon.orderByFirstCall(calls).join(", ");
+                    } catch (e) {
+                        // If this fails, we'll just fall back to the blank string
+                    }
+
+                    failAssertion(this, "expected " + expected + " to be " +
+                                "called in order but were called as " + actual);
+                } else {
+                    assert.pass("callOrder");
+                }
+            },
+
+            callCount: function assertCallCount(method, count) {
+                verifyIsStub(method);
+
+                if (method.callCount !== count) {
+                    var msg = "expected %n to be called " + sinon.timesInWords(count) +
+                        " but was called %c%C";
+                    failAssertion(this, method.printf(msg));
+                } else {
+                    assert.pass("callCount");
+                }
+            },
+
+            expose: function expose(target, options) {
+                if (!target) {
+                    throw new TypeError("target is null or undefined");
+                }
+
+                var o = options || {};
+                var prefix = typeof o.prefix === "undefined" && "assert" || o.prefix;
+                var includeFail = typeof o.includeFail === "undefined" || !!o.includeFail;
+
+                for (var method in this) {
+                    if (method !== "expose" && (includeFail || !/^(fail)/.test(method))) {
+                        target[exposedName(prefix, method)] = this[method];
+                    }
+                }
+
+                return target;
+            },
+
+            match: function match(actual, expectation) {
+                var matcher = sinon.match(expectation);
+                if (matcher.test(actual)) {
+                    assert.pass("match");
+                } else {
+                    var formatted = [
+                        "expected value to match",
+                        "    expected = " + sinon.format(expectation),
+                        "    actual = " + sinon.format(actual)
+                    ];
+
+                    failAssertion(this, formatted.join("\n"));
+                }
+            }
+        };
+
+        mirrorPropAsAssertion("called", "expected %n to have been called at least once but was never called");
+        mirrorPropAsAssertion("notCalled", function (spy) {
+            return !spy.called;
+        }, "expected %n to not have been called but was called %c%C");
+        mirrorPropAsAssertion("calledOnce", "expected %n to be called once but was called %c%C");
+        mirrorPropAsAssertion("calledTwice", "expected %n to be called twice but was called %c%C");
+        mirrorPropAsAssertion("calledThrice", "expected %n to be called thrice but was called %c%C");
+        mirrorPropAsAssertion("calledOn", "expected %n to be called with %1 as this but was called with %t");
+        mirrorPropAsAssertion(
+            "alwaysCalledOn",
+            "expected %n to always be called with %1 as this but was called with %t"
+        );
+        mirrorPropAsAssertion("calledWithNew", "expected %n to be called with new");
+        mirrorPropAsAssertion("alwaysCalledWithNew", "expected %n to always be called with new");
+        mirrorPropAsAssertion("calledWith", "expected %n to be called with arguments %*%C");
+        mirrorPropAsAssertion("calledWithMatch", "expected %n to be called with match %*%C");
+        mirrorPropAsAssertion("alwaysCalledWith", "expected %n to always be called with arguments %*%C");
+        mirrorPropAsAssertion("alwaysCalledWithMatch", "expected %n to always be called with match %*%C");
+        mirrorPropAsAssertion("calledWithExactly", "expected %n to be called with exact arguments %*%C");
+        mirrorPropAsAssertion("alwaysCalledWithExactly", "expected %n to always be called with exact arguments %*%C");
+        mirrorPropAsAssertion("neverCalledWith", "expected %n to never be called with arguments %*%C");
+        mirrorPropAsAssertion("neverCalledWithMatch", "expected %n to never be called with match %*%C");
+        mirrorPropAsAssertion("threw", "%n did not throw exception%C");
+        mirrorPropAsAssertion("alwaysThrew", "%n did not always throw exception%C");
+
+        sinon.assert = assert;
+        return assert;
+    }
+
+    var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
+    var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
+
+    function loadDependencies(require, exports, module) {
+        var sinon = require("./util/core");
+        require("./match");
+        require("./format");
+        module.exports = makeApi(sinon);
+    }
+
+    if (isAMD) {
+        define(loadDependencies);
+        return;
+    }
+
+    if (isNode) {
+        loadDependencies(require, module.exports, module);
+        return;
+    }
+
+    if (sinonGlobal) {
+        makeApi(sinonGlobal);
+    }
+}(
+    typeof sinon === "object" && sinon, // eslint-disable-line no-undef
+    typeof global !== "undefined" ? global : self
+));
+
+  return sinon;
+}));
diff --git a/resources/lib/sinonjs/sinon-ie-1.15.4.js b/resources/lib/sinonjs/sinon-ie-1.15.4.js
deleted file mode 100644 (file)
index 9eac958..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/**
- * Sinon.JS 1.15.4, 2015/06/27
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS
- *
- * (The BSD License)
- * 
- * Copyright (c) 2010-2014, Christian Johansen, christian@cjohansen.no
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice,
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice,
- *       this list of conditions and the following disclaimer in the documentation
- *       and/or other materials provided with the distribution.
- *     * Neither the name of Christian Johansen nor the names of his contributors
- *       may be used to endorse or promote products derived from this software
- *       without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * Helps IE run the fake timers. By defining global functions, IE allows
- * them to be overwritten at a later point. If these are not defined like
- * this, overwriting them will result in anything from an exception to browser
- * crash.
- *
- * If you don't require fake timers to work in IE, don't include this file.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-if (typeof window !== "undefined") {
-    function setTimeout() {}
-    function clearTimeout() {}
-    function setImmediate() {}
-    function clearImmediate() {}
-    function setInterval() {}
-    function clearInterval() {}
-    function Date() {}
-
-    // Reassign the original functions. Now their writable attribute
-    // should be true. Hackish, I know, but it works.
-    setTimeout = sinon.timers.setTimeout;
-    clearTimeout = sinon.timers.clearTimeout;
-    setImmediate = sinon.timers.setImmediate;
-    clearImmediate = sinon.timers.clearImmediate;
-    setInterval = sinon.timers.setInterval;
-    clearInterval = sinon.timers.clearInterval;
-    Date = sinon.timers.Date;
-}
-
-/**
- * Helps IE run the fake XMLHttpRequest. By defining global functions, IE allows
- * them to be overwritten at a later point. If these are not defined like
- * this, overwriting them will result in anything from an exception to browser
- * crash.
- *
- * If you don't require fake XHR to work in IE, don't include this file.
- *
- * @author Christian Johansen (christian@cjohansen.no)
- * @license BSD
- *
- * Copyright (c) 2010-2013 Christian Johansen
- */
-if (typeof window !== "undefined") {
-    function XMLHttpRequest() {}
-
-    // Reassign the original function. Now its writable attribute
-    // should be true. Hackish, I know, but it works.
-    XMLHttpRequest = sinon.xhr.XMLHttpRequest || undefined;
-}
-/**
- * Helps IE run the fake XDomainRequest. By defining global functions, IE allows
- * them to be overwritten at a later point. If these are not defined like
- * this, overwriting them will result in anything from an exception to browser
- * crash.
- *
- * If you don't require fake XDR to work in IE, don't include this file.
- */
-if (typeof window !== "undefined") {
-    function XDomainRequest() {}
-
-    // Reassign the original function. Now its writable attribute
-    // should be true. Hackish, I know, but it works.
-    XDomainRequest = sinon.xdr.XDomainRequest || undefined;
-}
index 2318b33..50bfa87 100644 (file)
                                        $.data( table, 'tablesorter', { config: config } );
 
                                        // Get the CSS class names, could be done elsewhere
-                                       sortCSS = [ config.cssDesc, config.cssAsc ];
+                                       sortCSS = [ config.cssAsc, config.cssDesc ];
+                                       // Messages tell the the user what the *next* state will be
+                                       // so are in reverse order to the CSS classes.
                                        sortMsg = [ mw.msg( 'sort-descending' ), mw.msg( 'sort-ascending' ) ];
 
                                        // Build headers
index 168a1c1..b339371 100644 (file)
@@ -2,6 +2,10 @@
        'use strict';
 
        /**
+        * Fired after an edit was successfully saved.
+        *
+        * Does not fire for null edits.
+        *
         * @event postEdit
         * @member mw.hook
         * @param {Object} [data] Optional data
index 93b7265..12825de 100644 (file)
@@ -33,7 +33,7 @@
 // Button styling
 // ----------------------------------------------------------------------------
 
-.button-colors(@bgColor, @highlightColor, @activeColor) {
+.button-colors( @bgColor, @highlightColor, @activeColor ) {
        background: @bgColor;
 
        &:hover {
@@ -60,7 +60,7 @@
        }
 }
 
-.button-colors(@bgColor, @highlightColor, @activeColor) when (lightness(@bgColor) >= 70%) {
+.button-colors( @bgColor, @highlightColor, @activeColor ) when ( lightness( @bgColor ) >= 70% ) {
        color: @colorButtonText;
        border: 1px solid @colorGray12;
 
@@ -87,7 +87,7 @@
        }
 }
 
-.button-colors(@bgColor, @highlightColor, @activeColor) when (lightness(@bgColor) < 70%) {
+.button-colors( @bgColor, @highlightColor, @activeColor ) when ( lightness( @bgColor ) < 70% ) {
        color: #fff;
        // border of the same color as background so that light background and
        // dark background buttons are the same height and width
        }
 }
 
-.button-colors-quiet(@textColor, @highlightColor, @activeColor) {
+.button-colors-quiet( @textColor, @highlightColor, @activeColor ) {
        // Quiet buttons all start gray, and reveal
        // constructive/progressive/destructive color on hover and active.
        color: @colorButtonText;
index 831ba8c..fd907ac 100644 (file)
@@ -1,11 +1,12 @@
 /* Styles for user login and signup forms */
 .mw-form-related-link-container {
+       margin-bottom: 0.5em;
        text-align: center;
 }
 
 .mw-ui-vform .mw-secure {
        /* @embed */
-       background: url(images/icon-lock.png) no-repeat scroll left center transparent;
+       background: url( images/icon-lock.png ) no-repeat left center;
        margin: 0 0 0 1px;
        padding: 0 0 0 11px;
 }
@@ -57,7 +58,7 @@ section.mw-form-header {
        /* Other display formats end up too wide */
        display: table-cell;
        width: 270px;
-       background-color: #FFF;
+       background-color: #fff;
 }
 
 /* Make the fancycaptcha-image-container full-width within its parent. */
index df3db57..42d5693 100644 (file)
@@ -1,9 +1,8 @@
 /* The login form invites users to create an account */
 #mw-createaccount-cta {
        width: 20em;
-       height: 10em;
        /* @embed */
-       background: url(images/glyph-people-large.png) no-repeat 50%;
+       background: url( images/glyph-people-large.png ) no-repeat 50%;
        margin: 0 auto;
-       padding-top: 4em;
+       padding-top: 7.8em;
 }
index 40a67c5..5931efb 100644 (file)
                }
        }
 
-       // Constructive buttons
+       // Constructive buttons (deprecated, consolidated with `progressive` – see T110555)
        //
        // Use constructive buttons for actions which result in a final action in the process that results
        // in a change of state.
        //
        // Styleguide 2.1.2.
        &.mw-ui-constructive {
-               .button-colors( @colorConstructive, @colorConstructiveHighlight, @colorConstructiveActive );
+               .button-colors( @colorProgressive, @colorProgressiveHighlight, @colorProgressiveActive );
 
                &.mw-ui-quiet {
-                       .button-colors-quiet( @colorConstructive, @colorConstructiveHighlight, @colorConstructiveActive );
+                       .button-colors-quiet( @colorProgressive, @colorProgressiveHighlight, @colorProgressiveActive );
                }
        }
 
index 49219d7..418fd23 100644 (file)
@@ -7,18 +7,30 @@
                /**
                 * Convenience method for 'action=parse'.
                 *
-                * @param {string} wikitext
+                * @param {string|mw.Title} content Content to parse, either as a wikitext string or
+                *   a mw.Title.
+                * @param {Object} additionalParams Parameters object to set custom settings, e.g.
+                *   redirects, sectionpreview.  prop should not be overridden.
                 * @return {jQuery.Promise}
                 * @return {Function} return.done
                 * @return {string} return.done.data Parsed HTML of `wikitext`.
                 */
-               parse: function ( wikitext ) {
-                       var apiPromise = this.get( {
+               parse: function ( content, additionalParams ) {
+                       var apiPromise, config = $.extend( {
                                formatversion: 2,
                                action: 'parse',
-                               contentmodel: 'wikitext',
-                               text: wikitext
-                       } );
+                               contentmodel: 'wikitext'
+                       }, additionalParams );
+
+                       if ( mw.Title && content instanceof mw.Title ) {
+                               // Parse existing page
+                               config.page = content.getPrefixedDb();
+                       } else {
+                               // Parse wikitext from input
+                               config.text = String( content );
+                       }
+
+                       apiPromise = this.get( config );
 
                        return apiPromise
                                .then( function ( data ) {
index 671f38f..fdb7adf 100644 (file)
 
                                // Convert size to human-readable string.
                                $.each( modules, function ( i, module ) {
+                                       module.sizeInBytes = module.size;
                                        module.size = humanSize( module.size );
                                } );
 
index f282db6..9d799db 100644 (file)
                         * @param {string} [moduleName] Name of currently executing module
                         * @return {jQuery.Promise}
                         */
-                       function queueModuleScript( src, moduleName ) {
+                       function queueModuleScript( src ) {
                                var r = $.Deferred();
 
                                pendingRequests.push( function () {
-                                       if ( moduleName && !hasOwn.call( registry, moduleName ) ) {
-                                               window.require = mw.loader.require;
-                                               window.module = registry[ moduleName ].module;
-                                       }
                                        addScript( src ).always( function () {
-                                               // Clear environment
-                                               delete window.require;
-                                               delete window.module;
                                                r.resolve();
 
                                                // Start the next one (if any)
index aa9dd05..6396331 100644 (file)
                 * @return {boolean}
                 */
                isElementInViewport: function ( el, rectangle ) {
-                       var elRect = el.getBoundingClientRect(),
+                       var $el = $( el ),
+                               offset = $el.offset(),
+                               rect = {
+                                       height: $el.height(),
+                                       width: $el.width(),
+                                       top: offset.top,
+                                       left: offset.left
+                               },
                                viewport = rectangle || this.makeViewportFromWindow();
 
                        return (
-                               ( viewport.bottom >= elRect.top ) &&
-                               ( viewport.right >= elRect.left ) &&
-                               ( viewport.top <= elRect.top + elRect.height ) &&
-                               ( viewport.left <= elRect.left + elRect.width )
+                               // Top border must be above viewport's bottom
+                               ( viewport.bottom >= rect.top ) &&
+                               // Left border must be before viewport's right border
+                               ( viewport.right >= rect.left ) &&
+                               // Bottom border must be below viewport's top
+                               ( viewport.top <= rect.top + rect.height ) &&
+                               // Right border must be after viewport's left border
+                               ( viewport.left <= rect.left + rect.width )
                        );
                },
 
index 214bcc1..fd308b2 100644 (file)
@@ -6,7 +6,6 @@
 abstract class MediaWikiLangTestCase extends MediaWikiTestCase {
        protected function setUp() {
                global $wgLanguageCode, $wgContLang;
-               parent::setUp();
 
                if ( $wgLanguageCode != $wgContLang->getCode() ) {
                        throw new MWException( "Error in MediaWikiLangTestCase::setUp(): " .
@@ -14,18 +13,11 @@ abstract class MediaWikiLangTestCase extends MediaWikiTestCase {
                                "\$wgContLang->getCode() (" . $wgContLang->getCode() . ")" );
                }
 
-               // HACK: Call getLanguage() so the real $wgContLang is cached as the user language
-               // rather than our fake one. This is to avoid breaking other, unrelated tests.
-               RequestContext::getMain()->getLanguage();
-
-               $langCode = 'en'; # For mainpage to be 'Main Page'
-               $langObj = Language::factory( $langCode );
+               parent::setUp();
 
-               $this->setMwGlobals( [
-                       'wgLanguageCode' => $langCode,
-                       'wgLang' => $langObj,
-                       'wgContLang' => $langObj,
-               ] );
+               $this->setUserLang( 'en' );
+               // For mainpage to be 'Main Page'
+               $this->setContentLang( 'en' );
 
                MessageCache::singleton()->disable();
        }
index d5192ac..045c3d4 100644 (file)
@@ -29,6 +29,8 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        public static $users;
 
        /**
+        * Primary database
+        *
         * @var DatabaseBase
         * @since 1.18
         */
@@ -132,14 +134,21 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        $this->checkDbIsSupported();
 
                        if ( !self::$dbSetup ) {
-                               // switch to a temporary clone of the database
-                               self::setupTestDB( $this->db, $this->dbPrefix() );
+                               $this->setupAllTestDBs();
+                               $this->addCoreDBData();
 
                                if ( ( $this->db->getType() == 'oracle' || !self::$useTemporaryTables ) && self::$reuseDB ) {
-                                       $this->resetDB();
+                                       $this->resetDB( $this->db, $this->tablesUsed );
                                }
                        }
-                       $this->addCoreDBData();
+
+                       // TODO: the DB setup should be done in setUpBeforeClass(), so the test DB
+                       // is available in subclass's setUpBeforeClass() and setUp() methods.
+                       // This would also remove the need for the HACK that is oncePerClass().
+                       if ( $this->oncePerClass() ) {
+                               $this->addDBDataOnce();
+                       }
+
                        $this->addDBData();
                        $needsResetDB = true;
                }
@@ -147,10 +156,26 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                parent::run( $result );
 
                if ( $needsResetDB ) {
-                       $this->resetDB();
+                       $this->resetDB( $this->db, $this->tablesUsed );
                }
        }
 
+       /**
+        * @return boolean
+        */
+       private function oncePerClass() {
+               // Remember current test class in the database connection,
+               // so we know when we need to run addData.
+
+               $class = static::class;
+
+               $first = !isset( $this->db->_hasDataForTestClass )
+                       || $this->db->_hasDataForTestClass !== $class;
+
+               $this->db->_hasDataForTestClass = $class;
+               return $first;
+       }
+
        /**
         * @since 1.21
         *
@@ -415,6 +440,33 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                $this->setMwGlobals( $name, $merged );
        }
 
+       /**
+        * @since 1.27
+        * @param string|Language $lang
+        */
+       public function setUserLang( $lang ) {
+               RequestContext::getMain()->setLanguage( $lang );
+               $this->setMwGlobals( 'wgLang', RequestContext::getMain()->getLanguage() );
+       }
+
+       /**
+        * @since 1.27
+        * @param string|Language $lang
+        */
+       public function setContentLang( $lang ) {
+               if ( $lang instanceof Language ) {
+                       $langCode = $lang->getCode();
+                       $langObj = $lang;
+               } else {
+                       $langCode = $lang;
+                       $langObj = Language::factory( $langCode );
+               }
+               $this->setMwGlobals( [
+                       'wgLanguageCode' => $langCode,
+                       'wgContLang' => $langObj,
+               ] );
+       }
+
        /**
         * Sets the logger for a specified channel, for the duration of the test.
         * @since 1.27
@@ -513,10 +565,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                $user = User::newFromName( 'UTSysop' );
                $comment = __METHOD__ . ': Sample page for unit test.';
 
-               // Avoid memory leak...?
-               // LinkCache::singleton()->clear();
-               // Maybe.  But doing this absolutely breaks $title->isRedirect() when called during unit tests....
-
                $page = WikiPage::factory( $title );
                $page->doEditContent( ContentHandler::makeContent( $text, $title ), $comment, 0, false, $user );
 
@@ -527,8 +575,29 @@ 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
+        * Stub. If a test suite needs to add additional data to the database, it should
+        * implement this method and do so. This method is called once per test suite
+        * (i.e. once per class).
+        *
+        * Note data added by this method may be removed by resetDB() depending on
+        * the contents of $tablesUsed.
+        *
+        * To add additional data between test function runs, override prepareDB().
+        *
+        * @see addDBData()
+        * @see resetDB()
+        *
+        * @since 1.27
+        */
+       public function addDBDataOnce() {
+       }
+
+       /**
+        * Stub. Subclasses may override this to prepare the database.
+        * Called before every test run (test function or data set).
+        *
+        * @see addDBDataOnce()
+        * @see resetDB()
         *
         * @since 1.18
         */
@@ -618,6 +687,52 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                self::$dbSetup = false;
        }
 
+       /**
+        * Setups a database with the given prefix.
+        *
+        * If reuseDB is true and certain conditions apply, it will just change the prefix.
+        * Otherwise, it will clone the tables and change the prefix.
+        *
+        * Clones all tables in the given database (whatever database that connection has
+        * open), to versions with the test prefix.
+        *
+        * @param DatabaseBase $db Database to use
+        * @param string $prefix Prefix to use for test tables
+        * @return bool True if tables were cloned, false if only the prefix was changed
+        */
+       protected static function setupDatabaseWithTestPrefix( DatabaseBase $db, $prefix ) {
+               $tablesCloned = self::listTables( $db );
+               $dbClone = new CloneDatabase( $db, $tablesCloned, $prefix );
+               $dbClone->useTemporaryTables( self::$useTemporaryTables );
+
+               if ( ( $db->getType() == 'oracle' || !self::$useTemporaryTables ) && self::$reuseDB ) {
+                       CloneDatabase::changePrefix( $prefix );
+
+                       return false;
+               } else {
+                       $dbClone->cloneTableStructure();
+                       return true;
+               }
+       }
+
+       /**
+        * Set up all test DBs
+        */
+       public function setupAllTestDBs() {
+               global $wgDBprefix;
+
+               self::$oldTablePrefix = $wgDBprefix;
+
+               $testPrefix = $this->dbPrefix();
+
+               // switch to a temporary clone of the database
+               self::setupTestDB( $this->db, $testPrefix );
+
+               if ( self::isUsingExternalStoreDB() ) {
+                       self::setupExternalStoreTestDBs( $testPrefix );
+               }
+       }
+
        /**
         * Creates an empty skeleton of the wiki database by cloning its structure
         * to equivalent tables using the given $prefix. Then sets MediaWiki to
@@ -640,8 +755,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * @throws MWException If the database table prefix is already $prefix
         */
        public static function setupTestDB( DatabaseBase $db, $prefix ) {
-               global $wgDBprefix;
-               if ( $wgDBprefix === $prefix ) {
+               if ( $db->tablePrefix() === $prefix ) {
                        throw new MWException(
                                'Cannot run unit tests, the database prefix is already "' . $prefix . '"' );
                }
@@ -650,49 +764,110 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        return;
                }
 
-               $tablesCloned = self::listTables( $db );
-               $dbClone = new CloneDatabase( $db, $tablesCloned, $prefix );
-               $dbClone->useTemporaryTables( self::$useTemporaryTables );
-
                self::$dbSetup = true;
-               self::$oldTablePrefix = $wgDBprefix;
-
-               if ( ( $db->getType() == 'oracle' || !self::$useTemporaryTables ) && self::$reuseDB ) {
-                       CloneDatabase::changePrefix( $prefix );
 
+               if ( !self::setupDatabaseWithTestPrefix( $db, $prefix ) ) {
                        return;
-               } else {
-                       $dbClone->cloneTableStructure();
                }
 
+               // Assuming this isn't needed for External Store database, and not sure if the procedure
+               // would be available there.
                if ( $db->getType() == 'oracle' ) {
                        $db->query( 'BEGIN FILL_WIKI_INFO; END;' );
                }
        }
 
+       /**
+        * Clones the External Store database(s) for testing
+        *
+        * @param string $testPrefix Prefix for test tables
+        */
+       protected static function setupExternalStoreTestDBs( $testPrefix ) {
+               $connections = self::getExternalStoreDatabaseConnections();
+               foreach ( $connections as $dbw ) {
+                       // Hack: cloneTableStructure sets $wgDBprefix to the unit test
+                       // prefix,.  Even though listTables now uses tablePrefix, that
+                       // itself is populated from $wgDBprefix by default.
+
+                       // We have to set it back, or we won't find the original 'blobs'
+                       // table to copy.
+
+                       $dbw->tablePrefix( self::$oldTablePrefix );
+                       self::setupDatabaseWithTestPrefix( $dbw, $testPrefix );
+               }
+       }
+
+       /**
+        * Gets master database connections for all of the ExternalStoreDB
+        * stores configured in $wgDefaultExternalStore.
+        *
+        * @return array Array of DatabaseBase master connections
+        */
+
+       protected static function getExternalStoreDatabaseConnections() {
+               global $wgDefaultExternalStore;
+
+               $externalStoreDB = ExternalStore::getStoreObject( 'DB' );
+               $defaultArray = (array) $wgDefaultExternalStore;
+               $dbws = [];
+               foreach ( $defaultArray as $url ) {
+                       if ( strpos( $url, 'DB://' ) === 0 ) {
+                               list( $proto, $cluster ) = explode( '://', $url, 2 );
+                               $dbw = $externalStoreDB->getMaster( $cluster );
+                               $dbws[] = $dbw;
+                       }
+               }
+
+               return $dbws;
+       }
+
+       /**
+        * Check whether ExternalStoreDB is being used
+        *
+        * @return bool True if it's being used
+        */
+       protected static function isUsingExternalStoreDB() {
+               global $wgDefaultExternalStore;
+               if ( !$wgDefaultExternalStore ) {
+                       return false;
+               }
+
+               $defaultArray = (array) $wgDefaultExternalStore;
+               foreach ( $defaultArray as $url ) {
+                       if ( strpos( $url, 'DB://' ) === 0 ) {
+                               return true;
+                       }
+               }
+
+               return false;
+       }
+
        /**
         * Empty all tables so they can be repopulated for tests
+        *
+        * @param DatabaseBase $db|null Database to reset
+        * @param array $tablesUsed Tables to reset
         */
-       private function resetDB() {
-               if ( $this->db ) {
-                       if ( $this->db->getType() == 'oracle' ) {
-                               if ( self::$useTemporaryTables ) {
-                                       wfGetLB()->closeAll();
-                                       $this->db = wfGetDB( DB_MASTER );
+       private function resetDB( $db, $tablesUsed ) {
+               if ( $db ) {
+                       $truncate = in_array( $db->getType(), [ 'oracle', 'mysql' ] );
+                       foreach ( $tablesUsed as $tbl ) {
+                               // TODO: reset interwiki and user tables to their original content.
+                               if ( $tbl == 'interwiki' || $tbl == 'user' ) {
+                                       continue;
+                               }
+
+                               if ( $truncate ) {
+                                       $db->query( 'TRUNCATE TABLE ' . $db->tableName( $tbl ), __METHOD__ );
                                } else {
-                                       foreach ( $this->tablesUsed as $tbl ) {
-                                               if ( $tbl == 'interwiki' ) {
-                                                       continue;
-                                               }
-                                               $this->db->query( 'TRUNCATE TABLE ' . $this->db->tableName( $tbl ), __METHOD__ );
-                                       }
+
+                                       $db->delete( $tbl, '*', __METHOD__ );
                                }
-                       } else {
-                               foreach ( $this->tablesUsed as $tbl ) {
-                                       if ( $tbl == 'interwiki' || $tbl == 'user' ) {
-                                               continue;
-                                       }
-                                       $this->db->delete( $tbl, '*', __METHOD__ );
+
+                               if ( $tbl === 'page' ) {
+                                       // Forget about the pages since they don't
+                                       // exist in the DB.
+                                       LinkCache::singleton()->clear();
                                }
                        }
                }
@@ -729,10 +904,8 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                $this->assertTrue( $value == '', $msg );
        }
 
-       private static function unprefixTable( $tableName ) {
-               global $wgDBprefix;
-
-               return substr( $tableName, strlen( $wgDBprefix ) );
+       private static function unprefixTable( &$tableName, $ind, $prefix ) {
+               $tableName = substr( $tableName, strlen( $prefix ) );
        }
 
        private static function isNotUnittest( $table ) {
@@ -747,16 +920,15 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * @return array
         */
        public static function listTables( $db ) {
-               global $wgDBprefix;
-
-               $tables = $db->listTables( $wgDBprefix, __METHOD__ );
+               $prefix = $db->tablePrefix();
+               $tables = $db->listTables( $prefix, __METHOD__ );
 
                if ( $db->getType() === 'mysql' ) {
                        # bug 43571: cannot clone VIEWs under MySQL
-                       $views = $db->listViews( $wgDBprefix, __METHOD__ );
+                       $views = $db->listViews( $prefix, __METHOD__ );
                        $tables = array_diff( $tables, $views );
                }
-               $tables = array_map( [ __CLASS__, 'unprefixTable' ], $tables );
+               array_walk( $tables, [ __CLASS__, 'unprefixTable' ], $prefix );
 
                // Don't duplicate test tables from the previous fataled run
                $tables = array_filter( $tables, [ __CLASS__, 'isNotUnittest' ] );
@@ -1283,4 +1455,5 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        public static function wfResetOutputBuffersBarrier( $buffer ) {
                return $buffer;
        }
+
 }
index 28192e9..35ebf42 100644 (file)
@@ -13,16 +13,7 @@ class BlockTest extends MediaWikiLangTestCase {
        /* variable used to save up the blockID we insert in this test suite */
        private $blockId;
 
-       protected function setUp() {
-               parent::setUp();
-               $this->setMwGlobals( [
-                       'wgLanguageCode' => 'en',
-                       'wgContLang' => Language::factory( 'en' )
-               ] );
-       }
-
        function addDBData() {
-
                $user = User::newFromName( 'UTBlockee' );
                if ( $user->getID() == 0 ) {
                        $user->addToDatabase();
index d451e21..a2bb97a 100644 (file)
@@ -12,8 +12,6 @@ class ExportTest extends MediaWikiLangTestCase {
        protected function setUp() {
                parent::setUp();
                $this->setMwGlobals( [
-                       'wgContLang' => Language::factory( 'en' ),
-                       'wgLanguageCode' => 'en',
                        'wgCapitalLinks' => true,
                ] );
        }
index 78e71ea..5dd4f7a 100644 (file)
@@ -18,12 +18,12 @@ class ExtraParserTest extends MediaWikiTestCase {
                $contLang = Language::factory( 'en' );
                $this->setMwGlobals( [
                        'wgShowDBErrorBacktrace' => true,
-                       'wgLanguageCode' => 'en',
-                       'wgContLang' => $contLang,
-                       'wgLang' => Language::factory( 'en' ),
                        'wgCleanSignatures' => true,
                ] );
+               $this->setUserLang( 'en' );
+               $this->setContentLang( $contLang );
 
+               // FIXME: This test should pass without setting global content language
                $this->options = ParserOptions::newFromUserAndLang( new User, $contLang );
                $this->options->setTemplateCallback( [ __CLASS__, 'statelessFetchTemplate' ] );
                $this->parser = new Parser;
index a18e3c8..a90295a 100644 (file)
@@ -6,8 +6,11 @@ class HtmlTest extends MediaWikiTestCase {
        protected function setUp() {
                parent::setUp();
 
-               $langCode = 'en';
-               $langObj = Language::factory( $langCode );
+               $this->setMwGlobals( [
+                       'wgWellFormedXml' => false,
+               ] );
+
+               $langObj = Language::factory( 'en' );
 
                // Hardcode namespaces during test runs,
                // so that html output based on existing namespaces
@@ -32,13 +35,8 @@ class HtmlTest extends MediaWikiTestCase {
                        100 => 'Custom',
                        101 => 'Custom_talk',
                ] );
-
-               $this->setMwGlobals( [
-                       'wgLanguageCode' => $langCode,
-                       'wgContLang' => $langObj,
-                       'wgLang' => $langObj,
-                       'wgWellFormedXml' => false,
-               ] );
+               $this->setUserLang( $langObj );
+               $this->setContentLang( $langObj );
        }
 
        /**
index 908376b..bca3982 100644 (file)
@@ -10,8 +10,6 @@ class MWTimestampTest extends MediaWikiLangTestCase {
 
                // Avoid 'GetHumanTimestamp' hook and others
                $this->setMwGlobals( 'wgHooks', [] );
-
-               RequestContext::getMain()->setLanguage( Language::factory( 'en' ) );
        }
 
        /**
index 951cf8d..5ea0cdf 100644 (file)
@@ -8,7 +8,7 @@ class MergeHistoryTest extends MediaWikiTestCase {
        /**
         * Make some pages to work with
         */
-       public function addDBData() {
+       public function addDBDataOnce() {
                // Pages that won't actually be merged
                $this->insertPage( 'Test' );
                $this->insertPage( 'Test2' );
index bdd80e4..cf34b18 100644 (file)
@@ -6,9 +6,9 @@ class MessageTest extends MediaWikiLangTestCase {
                parent::setUp();
 
                $this->setMwGlobals( [
-                       'wgLang' => Language::factory( 'en' ),
                        'wgForceUIMsgAsContentMsg' => [],
                ] );
+               $this->setUserLang( 'en' );
        }
 
        /**
@@ -517,7 +517,7 @@ class MessageTest extends MediaWikiLangTestCase {
         * @covers Message::inContentLanguage
         */
        public function testInContentLanguage() {
-               $this->setMwGlobals( 'wgLang', Language::factory( 'fr' ) );
+               $this->setUserLang( 'fr' );
 
                // NOTE: make sure internal caching of the message text is reset appropriately
                $msg = wfMessage( 'mainpage' );
@@ -531,9 +531,9 @@ class MessageTest extends MediaWikiLangTestCase {
         */
        public function testInContentLanguageOverride() {
                $this->setMwGlobals( [
-                       'wgLang' => Language::factory( 'fr' ),
                        'wgForceUIMsgAsContentMsg' => [ 'mainpage' ],
                ] );
+               $this->setUserLang( 'fr' );
 
                // NOTE: make sure internal caching of the message text is reset appropriately.
                // NOTE: wgForceUIMsgAsContentMsg forces the messages *current* language to be used.
index 6f4c300..6d5154f 100644 (file)
@@ -5,7 +5,7 @@
  */
 class PrefixSearchTest extends MediaWikiLangTestCase {
 
-       public function addDBData() {
+       public function addDBDataOnce() {
                if ( !$this->isWikitextNS( NS_MAIN ) ) {
                        // tests are skipped if NS_MAIN is not wikitext
                        return;
index 16d8c97..440495b 100644 (file)
@@ -57,6 +57,8 @@ class RevisionStorageTest extends MediaWikiTestCase {
                                CONTENT_MODEL_WIKITEXT
                        );
                }
+
+               $this->tablesUsed[] = 'archive';
        }
 
        protected function tearDown() {
index 6f4395b..782fab0 100644 (file)
@@ -321,24 +321,25 @@ class StatusTest extends MediaWikiLangTestCase {
        /**
         * @dataProvider provideGetWikiTextAndHtml
         * @covers Status::getWikiText
-        * @todo test long and short context messages generated through this method
-        *       this can not really be done now due to use of wfMessage()->plain()
-        *       It is possible to mock such methods but only if namespaces are used
         */
-       public function testGetWikiText( Status $status, $wikitext, $html ) {
+       public function testGetWikiText(
+               Status $status, $wikitext, $wrappedWikitext, $html, $wrappedHtml
+       ) {
                $this->assertEquals( $wikitext, $status->getWikiText() );
+
+               $this->assertEquals( $wrappedWikitext, $status->getWikiText( 'wrap-short', 'wrap-long', 'qqx' ) );
        }
 
        /**
         * @dataProvider provideGetWikiTextAndHtml
         * @covers Status::getHtml
-        * @todo test long and short context messages generated through this method
-        *   this can not really be done now due to use of $this->getWikiText using
-        *   wfMessage()->plain(). It is possible to mock such methods but only if
-        *   namespaces are used.
         */
-       public function testGetHtml( Status $status, $wikitext, $html ) {
+       public function testGetHtml(
+               Status $status, $wikitext, $wrappedWikitext, $html, $wrappedHtml
+       ) {
                $this->assertEquals( $html, $status->getHTML() );
+
+               $this->assertEquals( $wrappedHtml, $status->getHTML( 'wrap-short', 'wrap-long', 'qqx' ) );
        }
 
        /**
@@ -352,7 +353,11 @@ class StatusTest extends MediaWikiLangTestCase {
                $testCases['GoodStatus'] = [
                        new Status(),
                        "Internal error: Status::getWikiText called for a good result, this is incorrect\n",
+                       "(wrap-short: (internalerror_info: Status::getWikiText called for a good result, " .
+                               "this is incorrect\n))",
                        "<p>Internal error: Status::getWikiText called for a good result, this is incorrect\n</p>",
+                       "<p>(wrap-short: (internalerror_info: Status::getWikiText called for a good result, " .
+                               "this is incorrect\n))\n</p>",
                ];
 
                $status = new Status();
@@ -360,7 +365,11 @@ class StatusTest extends MediaWikiLangTestCase {
                $testCases['GoodButNoError'] = [
                        $status,
                        "Internal error: Status::getWikiText: Invalid result object: no error text but not OK\n",
+                       "(wrap-short: (internalerror_info: Status::getWikiText: Invalid result object: " .
+                               "no error text but not OK\n))",
                        "<p>Internal error: Status::getWikiText: Invalid result object: no error text but not OK\n</p>",
+                       "<p>(wrap-short: (internalerror_info: Status::getWikiText: Invalid result object: " .
+                               "no error text but not OK\n))\n</p>",
                ];
 
                $status = new Status();
@@ -368,7 +377,9 @@ class StatusTest extends MediaWikiLangTestCase {
                $testCases['1StringWarning'] = [
                        $status,
                        "<fooBar!>",
+                       "(wrap-short: (fooBar!))",
                        "<p>&lt;fooBar!&gt;\n</p>",
+                       "<p>(wrap-short: (fooBar!))\n</p>",
                ];
 
                $status = new Status();
@@ -377,7 +388,9 @@ class StatusTest extends MediaWikiLangTestCase {
                $testCases['2StringWarnings'] = [
                        $status,
                        "* <fooBar!>\n* <fooBar2!>\n",
+                       "(wrap-long: * (fooBar!)\n* (fooBar2!)\n)",
                        "<ul><li> &lt;fooBar!&gt;</li>\n<li> &lt;fooBar2!&gt;</li></ul>\n",
+                       "<p>(wrap-long: * (fooBar!)\n</p>\n<ul><li> (fooBar2!)</li></ul>\n<p>)\n</p>",
                ];
 
                $status = new Status();
@@ -385,7 +398,9 @@ class StatusTest extends MediaWikiLangTestCase {
                $testCases['1MessageWarning'] = [
                        $status,
                        "<fooBar!>",
+                       "(wrap-short: (fooBar!: foo, bar))",
                        "<p>&lt;fooBar!&gt;\n</p>",
+                       "<p>(wrap-short: (fooBar!: foo, bar))\n</p>",
                ];
 
                $status = new Status();
@@ -394,12 +409,26 @@ class StatusTest extends MediaWikiLangTestCase {
                $testCases['2MessageWarnings'] = [
                        $status,
                        "* <fooBar!>\n* <fooBar2!>\n",
+                       "(wrap-long: * (fooBar!: foo, bar)\n* (fooBar2!)\n)",
                        "<ul><li> &lt;fooBar!&gt;</li>\n<li> &lt;fooBar2!&gt;</li></ul>\n",
+                       "<p>(wrap-long: * (fooBar!: foo, bar)\n</p>\n<ul><li> (fooBar2!)</li></ul>\n<p>)\n</p>",
                ];
 
                return $testCases;
        }
 
+       private static function sanitizedMessageParams( Message $message ) {
+               return array_map( function ( $p ) {
+                       return $p instanceof Message
+                               ? [
+                                       'key' => $p->getKey(),
+                                       'params' => self::sanitizedMessageParams( $p ),
+                                       'lang' => $p->getLanguage()->getCode(),
+                               ]
+                               : $p;
+               }, $message->getParams() );
+       }
+
        /**
         * @dataProvider provideGetMessage
         * @covers Status::getMessage
@@ -407,9 +436,10 @@ class StatusTest extends MediaWikiLangTestCase {
        public function testGetMessage(
                Status $status, $expectedParams = [], $expectedKey, $expectedWrapper
        ) {
-               $message = $status->getMessage();
+               $message = $status->getMessage( null, null, 'qqx' );
                $this->assertInstanceOf( 'Message', $message );
-               $this->assertEquals( $expectedParams, $message->getParams(), 'Message::getParams' );
+               $this->assertEquals( $expectedParams, self::sanitizedMessageParams( $message ),
+                       'Message::getParams' );
                $this->assertEquals( $expectedKey, $message->getKey(), 'Message::getKey' );
 
                $message = $status->getMessage( 'wrapper-short', 'wrapper-long' );
@@ -462,20 +492,18 @@ class StatusTest extends MediaWikiLangTestCase {
                        'wrapper-short'
                ];
 
-               // FIXME: Assertion tries to compare a StubUserLang with a Language object, because
-               // "data providers are executed before both the call to the setUpBeforeClass static method
-               // and the first call to the setUp method. Because of that you can't access any variables
-               // you create there from within a data provider."
-               // http://phpunit.de/manual/3.7/en/writing-tests-for-phpunit.html
-//             $status = new Status();
-//             $status->warning( 'fooBar!' );
-//             $status->warning( 'fooBar2!' );
-//             $testCases[ '2StringWarnings' ] = array(
-//                     $status,
-//                     array( new Message( 'fooBar!' ), new Message( 'fooBar2!' ) ),
-//                     "* \$1\n* \$2",
-//                     'wrapper-long'
-//             );
+               $status = new Status();
+               $status->warning( 'fooBar!' );
+               $status->warning( 'fooBar2!' );
+               $testCases[ '2StringWarnings' ] = [
+                       $status,
+                       [
+                               [ 'key' => 'fooBar!', 'params' => [], 'lang' => 'qqx' ],
+                               [ 'key' => 'fooBar2!', 'params' => [], 'lang' => 'qqx' ]
+                       ],
+                       "* \$1\n* \$2",
+                       'wrapper-long'
+               ];
 
                $status = new Status();
                $status->warning( new Message( 'fooBar!', [ 'foo', 'bar' ] ) );
@@ -491,7 +519,10 @@ class StatusTest extends MediaWikiLangTestCase {
                $status->warning( new Message( 'fooBar2!' ) );
                $testCases['2MessageWarnings'] = [
                        $status,
-                       [ new Message( 'fooBar!', [ 'foo', 'bar' ] ), new Message( 'fooBar2!' ) ],
+                       [
+                               [ 'key' => 'fooBar!', 'params' => [ 'foo', 'bar' ], 'lang' => 'qqx' ],
+                               [ 'key' => 'fooBar2!', 'params' => [], 'lang' => 'qqx' ]
+                       ],
                        "* \$1\n* \$2",
                        'wrapper-long'
                ];
index a4d0059..584a368 100644 (file)
@@ -26,14 +26,10 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
        protected function setUp() {
                parent::setUp();
 
-               $langObj = Language::factory( 'en' );
                $localZone = 'UTC';
                $localOffset = date( 'Z' ) / 60;
 
                $this->setMwGlobals( [
-                       'wgContLang' => $langObj,
-                       'wgLanguageCode' => 'en',
-                       'wgLang' => $langObj,
                        'wgLocaltimezone' => $localZone,
                        'wgLocalTZoffset' => $localOffset,
                        'wgNamespaceProtection' => [
index f2ad1c6..b3465e1 100644 (file)
@@ -9,14 +9,12 @@ class TitleTest extends MediaWikiTestCase {
                parent::setUp();
 
                $this->setMwGlobals( [
-                       'wgLanguageCode' => 'en',
-                       'wgContLang' => Language::factory( 'en' ),
-                       // User language
-                       'wgLang' => Language::factory( 'en' ),
                        'wgAllowUserJs' => false,
                        'wgDefaultLanguageVariant' => false,
                        'wgMetaNamespace' => 'Project',
                ] );
+               $this->setUserLang( 'en' );
+               $this->setContentLang( 'en' );
        }
 
        /**
@@ -421,12 +419,11 @@ class TitleTest extends MediaWikiTestCase {
        ) {
                // Setup environnement for this test
                $this->setMwGlobals( [
-                       'wgLanguageCode' => $contLang,
-                       'wgContLang' => Language::factory( $contLang ),
-                       'wgLang' => Language::factory( $lang ),
                        'wgDefaultLanguageVariant' => $variant,
                        'wgAllowUserJs' => true,
                ] );
+               $this->setUserLang( $lang );
+               $this->setContentLang( $contLang );
 
                $title = Title::newFromText( $titleText );
                $this->assertInstanceOf( 'Title', $title,
index 9341fb8..91dd1aa 100644 (file)
@@ -25,21 +25,45 @@ class WatchedItemStoreIntegrationTest extends MediaWikiTestCase {
                $store = WatchedItemStore::getDefaultInstance();
                // Cleanup after previous tests
                $store->removeWatch( $user, $title );
+               $initialWatchers = $store->countWatchers( $title );
+               $initialUserWatchedItems = $store->countWatchedItems( $user );
 
                $this->assertFalse(
                        $store->isWatched( $user, $title ),
                        'Page should not initially be watched'
                );
+
                $store->addWatch( $user, $title );
                $this->assertTrue(
                        $store->isWatched( $user, $title ),
                        'Page should be watched'
                );
+               $this->assertEquals( $initialUserWatchedItems + 1, $store->countWatchedItems( $user ) );
+               $this->assertEquals( $initialWatchers + 1, $store->countWatchers( $title ) );
+               $this->assertEquals(
+                       $initialWatchers + 1,
+                       $store->countWatchersMultiple( [ $title ] )[$title->getNamespace()][$title->getDBkey()]
+               );
+               $this->assertEquals(
+                       [ 0 => [ 'WatchedItemStoreIntegrationTestPage' => $initialWatchers + 1 ] ],
+                       $store->countWatchersMultiple( [ $title ], [ 'minimumWatchers' => $initialWatchers + 1 ] )
+               );
+               $this->assertEquals(
+                       [ 0 => [ 'WatchedItemStoreIntegrationTestPage' => 0 ] ],
+                       $store->countWatchersMultiple( [ $title ], [ 'minimumWatchers' => $initialWatchers + 2 ] )
+               );
+
                $store->removeWatch( $user, $title );
                $this->assertFalse(
                        $store->isWatched( $user, $title ),
                        'Page should be unwatched'
                );
+               $this->assertEquals( $initialUserWatchedItems, $store->countWatchedItems( $user ) );
+               $this->assertEquals( $initialWatchers, $store->countWatchers( $title ) );
+               $this->assertEquals(
+                       $initialWatchers,
+                       $store->countWatchersMultiple( [ $title ] )[$title->getNamespace()][$title->getDBkey()]
+               );
        }
 
        public function testUpdateAndResetNotificationTimestamp() {
@@ -49,15 +73,33 @@ class WatchedItemStoreIntegrationTest extends MediaWikiTestCase {
                $store = WatchedItemStore::getDefaultInstance();
                $store->addWatch( $user, $title );
                $this->assertNull( $store->loadWatchedItem( $user, $title )->getNotificationTimestamp() );
+               $initialVisitingWatchers = $store->countVisitingWatchers( $title, '20150202020202' );
+               $initialUnreadNotifications = $store->countUnreadNotifications( $user );
 
                $store->updateNotificationTimestamp( $otherUser, $title, '20150202010101' );
                $this->assertEquals(
                        '20150202010101',
                        $store->loadWatchedItem( $user, $title )->getNotificationTimestamp()
                );
+               $this->assertEquals(
+                       $initialVisitingWatchers - 1,
+                       $store->countVisitingWatchers( $title, '20150202020202' )
+               );
+               $this->assertEquals(
+                       $initialUnreadNotifications + 1,
+                       $store->countUnreadNotifications( $user )
+               );
+               $this->assertSame(
+                       true,
+                       $store->countUnreadNotifications( $user, $initialUnreadNotifications + 1 )
+               );
 
                $this->assertTrue( $store->resetNotificationTimestamp( $user, $title ) );
-               $this->assertNull( $store->loadWatchedItem( $user, $title )->getNotificationTimestamp() );
+               $this->assertNull( $store->getWatchedItem( $user, $title )->getNotificationTimestamp() );
+               $this->assertEquals(
+                       $initialVisitingWatchers,
+                       $store->countVisitingWatchers( $title, '20150202020202' )
+               );
        }
 
        public function testDuplicateAllAssociatedEntries() {
index 709b4b4..983a5fe 100644 (file)
@@ -31,10 +31,10 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
        }
 
        /**
-        * @return PHPUnit_Framework_MockObject_MockObject|BagOStuff
+        * @return PHPUnit_Framework_MockObject_MockObject|HashBagOStuff
         */
        private function getMockCache() {
-               $mock = $this->getMockBuilder( BagOStuff::class )
+               $mock = $this->getMockBuilder( HashBagOStuff::class )
                        ->disableOriginalConstructor()
                        ->getMock();
                $mock->expects( $this->any() )
@@ -81,6 +81,345 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                $this->assertSame( $instanceOne, $instanceTwo );
        }
 
+       public function testOverrideDefaultInstance() {
+               $instance = WatchedItemStore::getDefaultInstance();
+               $scopedOverride = $instance->overrideDefaultInstance( null );
+
+               $this->assertNotSame( $instance, WatchedItemStore::getDefaultInstance() );
+
+               unset( $scopedOverride );
+
+               $this->assertSame( $instance, WatchedItemStore::getDefaultInstance() );
+       }
+
+       public function testCountWatchedItems() {
+               $user = $this->getMockNonAnonUserWithId( 1 );
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->exactly( 1 ) )
+                       ->method( 'selectField' )
+                       ->with(
+                               'watchlist',
+                               'COUNT(*)',
+                               [
+                                       'wl_user' => $user->getId(),
+                               ],
+                               $this->isType( 'string' )
+                       )
+                       ->will( $this->returnValue( 12 ) );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertEquals( 12, $store->countWatchedItems( $user ) );
+       }
+
+       public function testCountWatchers() {
+               $titleValue = new TitleValue( 0, 'SomeDbKey' );
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->exactly( 1 ) )
+                       ->method( 'selectField' )
+                       ->with(
+                               'watchlist',
+                               'COUNT(*)',
+                               [
+                                       'wl_namespace' => $titleValue->getNamespace(),
+                                       'wl_title' => $titleValue->getDBkey(),
+                               ],
+                               $this->isType( 'string' )
+                       )
+                       ->will( $this->returnValue( 7 ) );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertEquals( 7, $store->countWatchers( $titleValue ) );
+       }
+
+       public function testCountWatchersMultiple() {
+               $titleValues = [
+                       new TitleValue( 0, 'SomeDbKey' ),
+                       new TitleValue( 0, 'OtherDbKey' ),
+                       new TitleValue( 1, 'AnotherDbKey' ),
+               ];
+
+               $mockDb = $this->getMockDb();
+
+               $dbResult = [
+                       $this->getFakeRow( [ 'wl_title' => 'SomeDbKey', 'wl_namespace' => 0, 'watchers' => 100 ] ),
+                       $this->getFakeRow( [ 'wl_title' => 'OtherDbKey', 'wl_namespace' => 0, 'watchers' => 300 ] ),
+                       $this->getFakeRow( [ 'wl_title' => 'AnotherDbKey', 'wl_namespace' => 1, 'watchers' => 500 ]
+                       ),
+               ];
+               $mockDb->expects( $this->once() )
+                       ->method( 'makeWhereFrom2d' )
+                       ->with(
+                               [ [ 'SomeDbKey' => 1, 'OtherDbKey' => 1 ], [ 'AnotherDbKey' => 1 ] ],
+                               $this->isType( 'string' ),
+                               $this->isType( 'string' )
+                               )
+                       ->will( $this->returnValue( 'makeWhereFrom2d return value' ) );
+               $mockDb->expects( $this->once() )
+                       ->method( 'select' )
+                       ->with(
+                               'watchlist',
+                               [ 'wl_title', 'wl_namespace', 'watchers' => 'COUNT(*)' ],
+                               [ 'makeWhereFrom2d return value' ],
+                               $this->isType( 'string' ),
+                               [
+                                       'GROUP BY' => [ 'wl_namespace', 'wl_title' ],
+                               ]
+                       )
+                       ->will(
+                               $this->returnValue( $dbResult )
+                       );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $expected = [
+                       0 => [ 'SomeDbKey' => 100, 'OtherDbKey' => 300 ],
+                       1 => [ 'AnotherDbKey' => 500 ],
+               ];
+               $this->assertEquals( $expected, $store->countWatchersMultiple( $titleValues ) );
+       }
+
+       public function provideIntWithDbUnsafeVersion() {
+               return [
+                       [ 50 ],
+                       [ "50; DROP TABLE watchlist;\n--" ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideIntWithDbUnsafeVersion
+        */
+       public function testCountWatchersMultiple_withMinimumWatchers( $minWatchers ) {
+               $titleValues = [
+                       new TitleValue( 0, 'SomeDbKey' ),
+                       new TitleValue( 0, 'OtherDbKey' ),
+                       new TitleValue( 1, 'AnotherDbKey' ),
+               ];
+
+               $mockDb = $this->getMockDb();
+
+               $dbResult = [
+                       $this->getFakeRow( [ 'wl_title' => 'SomeDbKey', 'wl_namespace' => 0, 'watchers' => 100 ] ),
+                       $this->getFakeRow( [ 'wl_title' => 'OtherDbKey', 'wl_namespace' => 0, 'watchers' => 300 ] ),
+                       $this->getFakeRow( [ 'wl_title' => 'AnotherDbKey', 'wl_namespace' => 1, 'watchers' => 500 ]
+                       ),
+               ];
+               $mockDb->expects( $this->once() )
+                       ->method( 'makeWhereFrom2d' )
+                       ->with(
+                               [ [ 'SomeDbKey' => 1, 'OtherDbKey' => 1 ], [ 'AnotherDbKey' => 1 ] ],
+                               $this->isType( 'string' ),
+                               $this->isType( 'string' )
+                       )
+                       ->will( $this->returnValue( 'makeWhereFrom2d return value' ) );
+               $mockDb->expects( $this->once() )
+                       ->method( 'select' )
+                       ->with(
+                               'watchlist',
+                               [ 'wl_title', 'wl_namespace', 'watchers' => 'COUNT(*)' ],
+                               [ 'makeWhereFrom2d return value' ],
+                               $this->isType( 'string' ),
+                               [
+                                       'GROUP BY' => [ 'wl_namespace', 'wl_title' ],
+                                       'HAVING' => 'COUNT(*) >= 50',
+                               ]
+                       )
+                       ->will(
+                               $this->returnValue( $dbResult )
+                       );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $expected = [
+                       0 => [ 'SomeDbKey' => 100, 'OtherDbKey' => 300 ],
+                       1 => [ 'AnotherDbKey' => 500 ],
+               ];
+               $this->assertEquals(
+                       $expected,
+                       $store->countWatchersMultiple( $titleValues, [ 'minimumWatchers' => $minWatchers ] )
+               );
+       }
+
+       public function testCountVisitingWatchers() {
+               $titleValue = new TitleValue( 0, 'SomeDbKey' );
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->exactly( 1 ) )
+                       ->method( 'selectField' )
+                       ->with(
+                               'watchlist',
+                               'COUNT(*)',
+                               [
+                                       'wl_namespace' => $titleValue->getNamespace(),
+                                       'wl_title' => $titleValue->getDBkey(),
+                                       'wl_notificationtimestamp >= \'TS111TS\' OR wl_notificationtimestamp IS NULL',
+                               ],
+                               $this->isType( 'string' )
+                       )
+                       ->will( $this->returnValue( 7 ) );
+               $mockDb->expects( $this->exactly( 1 ) )
+                       ->method( 'addQuotes' )
+                       ->will( $this->returnCallback( function( $value ) {
+                               return "'$value'";
+                       } ) );
+               $mockDb->expects( $this->exactly( 1 ) )
+                       ->method( 'timestamp' )
+                       ->will( $this->returnCallback( function( $value ) {
+                               return 'TS' . $value . 'TS';
+                       } ) );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertEquals( 7, $store->countVisitingWatchers( $titleValue, '111' ) );
+       }
+
+       public function testCountUnreadNotifications() {
+               $user = $this->getMockNonAnonUserWithId( 1 );
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->exactly( 1 ) )
+                       ->method( 'selectRowCount' )
+                       ->with(
+                               'watchlist',
+                               '1',
+                               [
+                                       "wl_notificationtimestamp IS NOT NULL",
+                                       'wl_user' => 1,
+                               ],
+                               $this->isType( 'string' )
+                       )
+                       ->will( $this->returnValue( 9 ) );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertEquals( 9, $store->countUnreadNotifications( $user ) );
+       }
+
+       /**
+        * @dataProvider provideIntWithDbUnsafeVersion
+        */
+       public function testCountUnreadNotifications_withUnreadLimit_overLimit( $limit ) {
+               $user = $this->getMockNonAnonUserWithId( 1 );
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->exactly( 1 ) )
+                       ->method( 'selectRowCount' )
+                       ->with(
+                               'watchlist',
+                               '1',
+                               [
+                                       "wl_notificationtimestamp IS NOT NULL",
+                                       'wl_user' => 1,
+                               ],
+                               $this->isType( 'string' ),
+                               [ 'LIMIT' => 50 ]
+                       )
+                       ->will( $this->returnValue( 50 ) );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertSame(
+                       true,
+                       $store->countUnreadNotifications( $user, $limit )
+               );
+       }
+
+       /**
+        * @dataProvider provideIntWithDbUnsafeVersion
+        */
+       public function testCountUnreadNotifications_withUnreadLimit_underLimit( $limit ) {
+               $user = $this->getMockNonAnonUserWithId( 1 );
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->exactly( 1 ) )
+                       ->method( 'selectRowCount' )
+                       ->with(
+                               'watchlist',
+                               '1',
+                               [
+                                       "wl_notificationtimestamp IS NOT NULL",
+                                       'wl_user' => 1,
+                               ],
+                               $this->isType( 'string' ),
+                               [ 'LIMIT' => 50 ]
+                       )
+                       ->will( $this->returnValue( 9 ) );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertEquals(
+                       9,
+                       $store->countUnreadNotifications( $user, $limit )
+               );
+       }
+
        public function testDuplicateEntry_nothingToDuplicate() {
                $mockDb = $this->getMockDb();
                $mockDb->expects( $this->once() )
@@ -102,7 +441,7 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
 
                $store = new WatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       new HashBagOStuff( [ 'maxKeys' => 100 ] )
+                       $this->getMockCache()
                );
 
                $store->duplicateEntry(
@@ -154,9 +493,13 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                                $this->isType( 'string' )
                        );
 
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
+
                $store = new WatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       new HashBagOStuff( [ 'maxKeys' => 100 ] )
+                       $mockCache
                );
 
                $store->duplicateEntry(
@@ -196,9 +539,13 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        )
                        ->will( $this->returnValue( new FakeResultWrapper( [] ) ) );
 
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
+
                $store = new WatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       new HashBagOStuff( [ 'maxKeys' => 100 ] )
+                       $mockCache
                );
 
                $store->duplicateAllAssociatedEntries(
@@ -272,9 +619,13 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                                $this->isType( 'string' )
                        );
 
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
+
                $store = new WatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       new HashBagOStuff( [ 'maxKeys' => 100 ] )
+                       $mockCache
                );
 
                $store->duplicateAllAssociatedEntries(
@@ -519,8 +870,8 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        ->will( $this->returnValue( [] ) );
 
                $mockCache = $this->getMockCache();
-               $mockCache->expects( $this->never() )
-                       ->method( 'delete' );
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
 
                $store = new WatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
@@ -541,8 +892,8 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        ->method( 'selectRow' );
 
                $mockCache = $this->getMockCache();
-               $mockCache->expects( $this->never() )
-                       ->method( 'delete' );
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
 
                $store = new WatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
@@ -574,6 +925,7 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        ->will( $this->returnValue( 1 ) );
 
                $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'get' );
                $mockCache->expects( $this->once() )
                        ->method( 'delete' )
                        ->with( '0:SomeDbKey:1' );
@@ -608,6 +960,7 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        ->will( $this->returnValue( 0 ) );
 
                $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'get' );
                $mockCache->expects( $this->once() )
                        ->method( 'delete' )
                        ->with( '0:SomeDbKey:1' );
@@ -631,6 +984,7 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        ->method( 'delete' );
 
                $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'get' );
                $mockCache->expects( $this->never() )
                        ->method( 'delete' );
 
@@ -665,6 +1019,7 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        ) );
 
                $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'delete' );
                $mockCache->expects( $this->once() )
                        ->method( 'get' )
                        ->with(
@@ -702,14 +1057,14 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                $cachedItem = new WatchedItem( $mockUser, $linkTarget, '20151212010101' );
 
                $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'delete' );
+               $mockCache->expects( $this->never() )->method( 'set' );
                $mockCache->expects( $this->once() )
                        ->method( 'get' )
                        ->with(
                                '0:SomeDbKey:1'
                        )
                        ->will( $this->returnValue( $cachedItem ) );
-               $mockCache->expects( $this->never() )
-                       ->method( 'set' );
 
                $store = new WatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
@@ -741,8 +1096,12 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        ->will( $this->returnValue( [] ) );
 
                $mockCache = $this->getMockCache();
-               $mockCache->expects( $this->never() )
-                       ->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
+               $mockCache->expects( $this->once() )
+                       ->method( 'get' )
+                       ->with( '0:SomeDbKey:1' )
+                       ->will( $this->returnValue( false ) );
 
                $store = new WatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
@@ -763,8 +1122,9 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        ->method( 'selectRow' );
 
                $mockCache = $this->getMockCache();
-               $mockCache->expects( $this->never() )
-                       ->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
 
                $store = new WatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
@@ -797,6 +1157,11 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        ) );
 
                $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'delete' );
+               $mockCache->expects( $this->once() )
+                       ->method( 'get' )
+                       ->with( '0:SomeDbKey:1' )
+                       ->will( $this->returnValue( false ) );
                $mockCache->expects( $this->once() )
                        ->method( 'set' )
                        ->with(
@@ -832,8 +1197,12 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        ->will( $this->returnValue( [] ) );
 
                $mockCache = $this->getMockCache();
-               $mockCache->expects( $this->never() )
-                       ->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
+               $mockCache->expects( $this->once() )
+                       ->method( 'get' )
+                       ->with( '0:SomeDbKey:1' )
+                       ->will( $this->returnValue( false ) );
 
                $store = new WatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
@@ -854,8 +1223,9 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        ->method( 'selectRow' );
 
                $mockCache = $this->getMockCache();
-               $mockCache->expects( $this->never() )
-                       ->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
 
                $store = new WatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
@@ -876,8 +1246,9 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        ->method( 'selectRow' );
 
                $mockCache = $this->getMockCache();
-               $mockCache->expects( $this->never() )
-                       ->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
 
                $store = new WatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
@@ -908,8 +1279,9 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        ->will( $this->returnValue( [] ) );
 
                $mockCache = $this->getMockCache();
-               $mockCache->expects( $this->never() )
-                       ->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
 
                $store = new WatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
@@ -945,6 +1317,7 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        ) );
 
                $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'get' );
                $mockCache->expects( $this->once() )
                        ->method( 'set' )
                        ->with(
@@ -966,7 +1339,7 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        $callableCallCounter++;
                        $this->assertInternalType( 'callable', $callable );
                };
-               $store->overrideDeferredUpdatesAddCallableUpdateCallback( $mockCallback );
+               $scopedOverride = $store->overrideDeferredUpdatesAddCallableUpdateCallback( $mockCallback );
 
                $this->assertTrue(
                        $store->resetNotificationTimestamp(
@@ -975,6 +1348,8 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        )
                );
                $this->assertEquals( 1, $callableCallCounter );
+
+               ScopedCallback::consume( $scopedOverride );
        }
 
        public function testResetNotificationTimestamp_noItemForced() {
@@ -986,6 +1361,8 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        ->method( 'selectRow' );
 
                $mockCache = $this->getMockCache();
+               $mockDb->expects( $this->never() )
+                       ->method( 'get' );
                $mockDb->expects( $this->never() )
                        ->method( 'set' );
                $mockDb->expects( $this->never() )
@@ -1002,7 +1379,7 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        $callableCallCounter++;
                        $this->assertInternalType( 'callable', $callable );
                };
-               $store->overrideDeferredUpdatesAddCallableUpdateCallback( $mockCallback );
+               $scopedOverride = $store->overrideDeferredUpdatesAddCallableUpdateCallback( $mockCallback );
 
                $this->assertTrue(
                        $store->resetNotificationTimestamp(
@@ -1012,6 +1389,8 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        )
                );
                $this->assertEquals( 1, $callableCallCounter );
+
+               ScopedCallback::consume( $scopedOverride );
        }
 
        /**
@@ -1048,6 +1427,8 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        ->method( 'selectRow' );
 
                $mockCache = $this->getMockCache();
+               $mockDb->expects( $this->never() )
+                       ->method( 'get' );
                $mockDb->expects( $this->never() )
                        ->method( 'set' );
                $mockDb->expects( $this->never() )
@@ -1060,7 +1441,7 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
 
                // Note: This does not actually assert the job is correct
                $callableCallCounter = 0;
-               $store->overrideDeferredUpdatesAddCallableUpdateCallback(
+               $scopedOverride = $store->overrideDeferredUpdatesAddCallableUpdateCallback(
                        function( $callable ) use ( &$callableCallCounter ) {
                                $callableCallCounter++;
                                $this->assertInternalType( 'callable', $callable );
@@ -1076,6 +1457,8 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        )
                );
                $this->assertEquals( 1, $callableCallCounter );
+
+               ScopedCallback::consume( $scopedOverride );
        }
 
        public function testResetNotificationTimestamp_oldidSpecifiedNotLatestRevisionForced() {
@@ -1104,6 +1487,8 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                        ) );
 
                $mockCache = $this->getMockCache();
+               $mockDb->expects( $this->never() )
+                       ->method( 'get' );
                $mockDb->expects( $this->never() )
                        ->method( 'set' );
                $mockDb->expects( $this->never() )
@@ -1116,7 +1501,7 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
 
                // Note: This does not actually assert the job is correct
                $addUpdateCallCounter = 0;
-               $store->overrideDeferredUpdatesAddCallableUpdateCallback(
+               $scopedOverrideDeferred = $store->overrideDeferredUpdatesAddCallableUpdateCallback(
                        function( $callable ) use ( &$addUpdateCallCounter ) {
                                $addUpdateCallCounter++;
                                $this->assertInternalType( 'callable', $callable );
@@ -1124,7 +1509,7 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                );
 
                $getTimestampCallCounter = 0;
-               $store->overrideRevisionGetTimestampFromIdCallback(
+               $scopedOverrideRevision = $store->overrideRevisionGetTimestampFromIdCallback(
                        function( $titleParam, $oldidParam ) use ( &$getTimestampCallCounter, $title, $oldid ) {
                                $getTimestampCallCounter++;
                                $this->assertEquals( $title, $titleParam );
@@ -1142,6 +1527,9 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                );
                $this->assertEquals( 1, $addUpdateCallCounter );
                $this->assertEquals( 1, $getTimestampCallCounter );
+
+               ScopedCallback::consume( $scopedOverrideDeferred );
+               ScopedCallback::consume( $scopedOverrideRevision );
        }
 
        public function testUpdateNotificationTimestamp_watchersExist() {
@@ -1182,9 +1570,14 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                                ]
                        );
 
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
+
                $store = new WatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       new HashBagOStuff( [ 'maxKeys' => 100 ] )
+                       $mockCache
                );
 
                $this->assertEquals(
@@ -1219,9 +1612,14 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                $mockDb->expects( $this->never() )
                        ->method( 'update' );
 
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )->method( 'set' );
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'delete' );
+
                $store = new WatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       new HashBagOStuff( [ 'maxKeys' => 100 ] )
+                       $mockCache
                );
 
                $watchers = $store->updateNotificationTimestamp(
@@ -1233,4 +1631,57 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                $this->assertEmpty( $watchers );
        }
 
+       public function testUpdateNotificationTimestamp_clearsCachedItems() {
+               $user = $this->getMockNonAnonUserWithId( 1 );
+               $titleValue = new TitleValue( 0, 'SomeDbKey' );
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'selectRow' )
+                       ->will( $this->returnValue(
+                               $this->getFakeRow( [ 'wl_notificationtimestamp' => '20151212010101' ] )
+                       ) );
+               $mockDb->expects( $this->once() )
+                       ->method( 'select' )
+                       ->will(
+                               $this->returnValue( [
+                                       $this->getFakeRow( [ 'wl_user' => '2' ] ),
+                                       $this->getFakeRow( [ 'wl_user' => '3' ] )
+                               ] )
+                       );
+               $mockDb->expects( $this->once() )
+                       ->method( 'onTransactionIdle' )
+                       ->with( $this->isType( 'callable' ) )
+                       ->will( $this->returnCallback( function( $callable ) {
+                               $callable();
+                       } ) );
+               $mockDb->expects( $this->once() )
+                       ->method( 'update' );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->once() )
+                       ->method( 'set' )
+                       ->with( '0:SomeDbKey:1', $this->isType( 'object' ) );
+               $mockCache->expects( $this->once() )
+                       ->method( 'get' )
+                       ->with( '0:SomeDbKey:1' );
+               $mockCache->expects( $this->once() )
+                       ->method( 'delete' )
+                       ->with( '0:SomeDbKey:1' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               // This will add the item to the cache
+               $store->getWatchedItem( $user, $titleValue );
+
+               $store->updateNotificationTimestamp(
+                       $this->getMockNonAnonUserWithId( 1 ),
+                       $titleValue,
+                       '20151212010101'
+               );
+       }
+
 }
index bc37311..58984cf 100644 (file)
@@ -51,13 +51,15 @@ class WatchedItemUnitTest extends PHPUnit_Framework_TestCase {
                        ->method( 'loadWatchedItem' )
                        ->with( $user, $linkTarget )
                        ->will( $this->returnValue( new WatchedItem( $user, $linkTarget, $timestamp ) ) );
-               WatchedItemStore::overrideDefaultInstance( $store );
+               $scopedOverride = WatchedItemStore::overrideDefaultInstance( $store );
 
                $item = WatchedItem::fromUserTitle( $user, $linkTarget, User::IGNORE_USER_RIGHTS );
 
                $this->assertEquals( $user, $item->getUser() );
                $this->assertEquals( $linkTarget, $item->getLinkTarget() );
                $this->assertEquals( $timestamp, $item->getNotificationTimestamp() );
+
+               ScopedCallback::consume( $scopedOverride );
        }
 
        /**
@@ -83,10 +85,12 @@ class WatchedItemUnitTest extends PHPUnit_Framework_TestCase {
                                        return true;
                                }
                        ) );
-               WatchedItemStore::overrideDefaultInstance( $store );
+               $scopedOverride = WatchedItemStore::overrideDefaultInstance( $store );
 
                $item = new WatchedItem( $user, $linkTarget, $timestamp );
                $item->resetNotificationTimestamp( $force, $oldid );
+
+               ScopedCallback::consume( $scopedOverride );
        }
 
        public function testAddWatch() {
@@ -153,9 +157,11 @@ class WatchedItemUnitTest extends PHPUnit_Framework_TestCase {
                $store->expects( $this->once() )
                        ->method( 'duplicateAllAssociatedEntries' )
                        ->with( $oldTitle, $newTitle );
-               WatchedItemStore::overrideDefaultInstance( $store );
+               $scopedOverride = WatchedItemStore::overrideDefaultInstance( $store );
 
                WatchedItem::duplicateEntries( $oldTitle, $newTitle );
+
+               ScopedCallback::consume( $scopedOverride );
        }
 
        public function testBatchAddWatch() {
@@ -175,9 +181,11 @@ class WatchedItemUnitTest extends PHPUnit_Framework_TestCase {
                $store->expects( $this->once() )
                        ->method( 'addWatchBatch' )
                        ->with( $userTargetCombinations );
-               WatchedItemStore::overrideDefaultInstance( $store );
+               $scopedOverride = WatchedItemStore::overrideDefaultInstance( $store );
 
                WatchedItem::batchAddWatch( $items );
+
+               ScopedCallback::consume( $scopedOverride );
        }
 
 }
index f51997c..d2dccf9 100644 (file)
@@ -17,7 +17,7 @@ class ApiBlockTest extends ApiTestCase {
                return $this->getTokenList( self::$users['sysop'] );
        }
 
-       function addDBData() {
+       function addDBDataOnce() {
                $user = User::newFromName( 'UTApiBlockee' );
 
                if ( $user->getId() == 0 ) {
index 9ba4587..e5971b4 100644 (file)
@@ -36,9 +36,10 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
 
        /**
         * Create a set of pages. These must not change, otherwise the tests might give wrong results.
-        * @see MediaWikiTestCase::addDBData()
+        *
+*@see MediaWikiTestCase::addDBDataOnce()
         */
-       function addDBData() {
+       function addDBDataOnce() {
                try {
                        if ( Title::newFromText( 'AQBT-All' )->exists() ) {
                                return;
index 8f11a51..944d31c 100644 (file)
@@ -29,9 +29,10 @@ class ApiQueryContinue2Test extends ApiQueryContinueTestBase {
 
        /**
         * Create a set of pages. These must not change, otherwise the tests might give wrong results.
-        * @see MediaWikiTestCase::addDBData()
+        *
+*@see MediaWikiTestCase::addDBDataOnce()
         */
-       function addDBData() {
+       function addDBDataOnce() {
                try {
                        $this->editPage( 'AQCT73462-A', '**AQCT73462-A**  [[AQCT73462-B]] [[AQCT73462-C]]' );
                        $this->editPage( 'AQCT73462-B', '[[AQCT73462-A]]  **AQCT73462-B** [[AQCT73462-C]]' );
index a6269ed..b31627b 100644 (file)
@@ -33,9 +33,10 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
 
        /**
         * Create a set of pages. These must not change, otherwise the tests might give wrong results.
-        * @see MediaWikiTestCase::addDBData()
+        *
+*@see MediaWikiTestCase::addDBDataOnce()
         */
-       function addDBData() {
+       function addDBDataOnce() {
                try {
                        $this->editPage( 'Template:AQCT-T1', '**Template:AQCT-T1**' );
                        $this->editPage( 'Template:AQCT-T2', '**Template:AQCT-T2**' );
index a441b3d..40994da 100644 (file)
@@ -6,7 +6,7 @@
  */
 class GenderCacheTest extends MediaWikiLangTestCase {
 
-       function addDBData() {
+       function addDBDataOnce() {
                // ensure the correct default gender
                $this->mergeMwGlobalArrayValue( 'wgDefaultUserOptions', [ 'gender' => 'unknown' ] );
 
index 7d62b01..697eb2d 100644 (file)
@@ -15,7 +15,7 @@ class LocalisationCacheTest extends MediaWikiTestCase {
        }
 
        /**
-        * @return PHPUnit_Framework_MockObject_MockObject|LocalisationCache
+        * @return LocalisationCache
         */
        protected function getMockLocalisationCache() {
                global $IP;
index ddd74e3..bd744c0 100644 (file)
@@ -19,17 +19,11 @@ class MessageCacheTest extends MediaWikiLangTestCase {
        protected function configureLanguages() {
                // for the test, we need the content language to be anything but English,
                // let's choose e.g. German (de)
-               $langCode = 'de';
-               $langObj = Language::factory( $langCode );
-
-               $this->setMwGlobals( [
-                       'wgLanguageCode' => $langCode,
-                       'wgLang' => $langObj,
-                       'wgContLang' => $langObj,
-               ] );
+               $this->setUserLang( 'de' );
+               $this->setContentLang( 'de' );
        }
 
-       function addDBData() {
+       function addDBDataOnce() {
                $this->configureLanguages();
 
                // Set up messages and fallbacks ab -> ru -> de
index 70da12e..6369b33 100644 (file)
@@ -24,6 +24,16 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
         */
        private static $mockRecentChange;
 
+       /**
+        * @var Revision
+        */
+       private static $pageRev = null;
+
+       /**
+        * @var string
+        */
+       private static $pageName = 'CategoryMembershipChangeTestPage';
+
        public static function newForCategorizationCallback() {
                self::$lastNotifyArgs = func_get_args();
                self::$notifyCallCounter += 1;
@@ -34,10 +44,20 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
                parent::setUp();
                self::$notifyCallCounter = 0;
                self::$mockRecentChange = self::getMock( 'RecentChange' );
+
+               $this->setContentLang( 'qqx' );
+       }
+
+       public function addDBDataOnce() {
+               $info = $this->insertPage( self::$pageName );
+               $title = $info['title'];
+
+               $page = WikiPage::factory( $title );
+               self::$pageRev = $page->getRevision();
        }
 
        private function newChange( Revision $revision = null ) {
-               $change = new CategoryMembershipChange( Title::newFromText( 'UTPage' ), $revision );
+               $change = new CategoryMembershipChange( Title::newFromText( self::$pageName ), $revision );
                $change->overrideNewForCategorizationCallback(
                        'CategoryMembershipChangeTest::newForCategorizationCallback'
                );
@@ -53,9 +73,10 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
 
                $this->assertTrue( strlen( self::$lastNotifyArgs[0] ) === 14 );
                $this->assertEquals( 'Category:CategoryName', self::$lastNotifyArgs[1]->getPrefixedText() );
-               $this->assertEquals( 'MediaWiki automatic change', self::$lastNotifyArgs[2]->getName() );
-               $this->assertEquals( '[[:UTPage]] added to category', self::$lastNotifyArgs[3] );
-               $this->assertEquals( 'UTPage', self::$lastNotifyArgs[4]->getPrefixedText() );
+               $this->assertEquals( '(autochange-username)', self::$lastNotifyArgs[2]->getName() );
+               $this->assertEquals( '(recentchanges-page-added-to-category: ' . self::$pageName . ', 0)',
+                       self::$lastNotifyArgs[3] );
+               $this->assertEquals( self::$pageName, self::$lastNotifyArgs[4]->getPrefixedText() );
                $this->assertEquals( 0, self::$lastNotifyArgs[5] );
                $this->assertEquals( 0, self::$lastNotifyArgs[6] );
                $this->assertEquals( null, self::$lastNotifyArgs[7] );
@@ -72,9 +93,10 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
 
                $this->assertTrue( strlen( self::$lastNotifyArgs[0] ) === 14 );
                $this->assertEquals( 'Category:CategoryName', self::$lastNotifyArgs[1]->getPrefixedText() );
-               $this->assertEquals( 'MediaWiki automatic change', self::$lastNotifyArgs[2]->getName() );
-               $this->assertEquals( '[[:UTPage]] removed from category', self::$lastNotifyArgs[3] );
-               $this->assertEquals( 'UTPage', self::$lastNotifyArgs[4]->getPrefixedText() );
+               $this->assertEquals( '(autochange-username)', self::$lastNotifyArgs[2]->getName() );
+               $this->assertEquals( '(recentchanges-page-removed-from-category: ' . self::$pageName . ', 0)',
+                       self::$lastNotifyArgs[3] );
+               $this->assertEquals( self::$pageName, self::$lastNotifyArgs[4]->getPrefixedText() );
                $this->assertEquals( 0, self::$lastNotifyArgs[5] );
                $this->assertEquals( 0, self::$lastNotifyArgs[6] );
                $this->assertEquals( null, self::$lastNotifyArgs[7] );
@@ -84,7 +106,7 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
        }
 
        public function testChangeAddedWithRev() {
-               $revision = Revision::newFromId( Title::newFromText( 'UTPage' )->getLatestRevID() );
+               $revision = Revision::newFromId( Title::newFromText( self::$pageName )->getLatestRevID() );
                $change = $this->newChange( $revision );
                $change->triggerCategoryAddedNotification( Title::newFromText( 'CategoryName', NS_CATEGORY ) );
 
@@ -93,9 +115,10 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
                $this->assertTrue( strlen( self::$lastNotifyArgs[0] ) === 14 );
                $this->assertEquals( 'Category:CategoryName', self::$lastNotifyArgs[1]->getPrefixedText() );
                $this->assertEquals( 'UTSysop', self::$lastNotifyArgs[2]->getName() );
-               $this->assertEquals( '[[:UTPage]] added to category', self::$lastNotifyArgs[3] );
-               $this->assertEquals( 'UTPage', self::$lastNotifyArgs[4]->getPrefixedText() );
-               $this->assertEquals( 0, self::$lastNotifyArgs[5] );
+               $this->assertEquals( '(recentchanges-page-added-to-category: ' . self::$pageName . ', 0)',
+                       self::$lastNotifyArgs[3] );
+               $this->assertEquals( self::$pageName, self::$lastNotifyArgs[4]->getPrefixedText() );
+               $this->assertEquals( self::$pageRev->getParentId(), self::$lastNotifyArgs[5] );
                $this->assertEquals( $revision->getId(), self::$lastNotifyArgs[6] );
                $this->assertEquals( null, self::$lastNotifyArgs[7] );
                $this->assertEquals( 0, self::$lastNotifyArgs[8] );
@@ -104,7 +127,7 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
        }
 
        public function testChangeRemovedWithRev() {
-               $revision = Revision::newFromId( Title::newFromText( 'UTPage' )->getLatestRevID() );
+               $revision = Revision::newFromId( Title::newFromText( self::$pageName )->getLatestRevID() );
                $change = $this->newChange( $revision );
                $change->triggerCategoryRemovedNotification( Title::newFromText( 'CategoryName', NS_CATEGORY ) );
 
@@ -113,9 +136,10 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
                $this->assertTrue( strlen( self::$lastNotifyArgs[0] ) === 14 );
                $this->assertEquals( 'Category:CategoryName', self::$lastNotifyArgs[1]->getPrefixedText() );
                $this->assertEquals( 'UTSysop', self::$lastNotifyArgs[2]->getName() );
-               $this->assertEquals( '[[:UTPage]] removed from category', self::$lastNotifyArgs[3] );
-               $this->assertEquals( 'UTPage', self::$lastNotifyArgs[4]->getPrefixedText() );
-               $this->assertEquals( 0, self::$lastNotifyArgs[5] );
+               $this->assertEquals( '(recentchanges-page-removed-from-category: ' . self::$pageName . ', 0)',
+                       self::$lastNotifyArgs[3] );
+               $this->assertEquals( self::$pageName, self::$lastNotifyArgs[4]->getPrefixedText() );
+               $this->assertEquals( self::$pageRev->getParentId(), self::$lastNotifyArgs[5] );
                $this->assertEquals( $revision->getId(), self::$lastNotifyArgs[6] );
                $this->assertEquals( null, self::$lastNotifyArgs[7] );
                $this->assertEquals( 0, self::$lastNotifyArgs[8] );
index 79cc666..5746a61 100644 (file)
@@ -29,8 +29,8 @@ class OldChangesListTest extends MediaWikiLangTestCase {
 
                $this->setMwGlobals( [
                        'wgArticlePath' => '/wiki/$1',
-                       'wgLang' => Language::factory( 'qqx' )
                ] );
+               $this->setUserLang( 'qqx' );
        }
 
        /**
@@ -197,7 +197,7 @@ class OldChangesListTest extends MediaWikiLangTestCase {
        private function getContext() {
                $user = $this->getTestUser();
                $context = $this->testRecentChangesHelper->getTestContext( $user );
-               $context->setLanguage( Language::factory( 'qqx' ) );
+               $context->setLanguage( 'qqx' );
 
                return $context;
        }
index 128e067..faa1dcc 100644 (file)
@@ -154,7 +154,7 @@ class TestRecentChangesHelper {
 
        public function getTestContext( User $user ) {
                $context = new RequestContext();
-               $context->setLanguage( Language::factory( 'en' ) );
+               $context->setLanguage( 'en' );
 
                $context->setUser( $user );
 
index 18de9be..80fb826 100644 (file)
@@ -330,7 +330,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 
                foreach ( $versions as $version ) {
                        $versions = "upgrading from $version to $wgVersion";
-                       $db = $this->prepareDB( $version );
+                       $db = $this->prepareTestDB( $version );
                        $tables = $this->getTables( $db );
                        $this->assertEquals( $currentTables, $tables, "Different tables $versions" );
                        foreach ( $tables as $table ) {
@@ -389,7 +389,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                $this->assertTrue( $db->close(), "closing database" );
        }
 
-       private function prepareDB( $version ) {
+       private function prepareTestDB( $version ) {
                static $maint = null;
                if ( $maint === null ) {
                        $maint = new FakeMaintenance();
index 75af87e..9609f74 100644 (file)
@@ -6,7 +6,7 @@
  * ^--- make sure temporary tables are used.
  */
 class LinksUpdateTest extends MediaWikiLangTestCase {
-       protected $testingPageId;
+       protected static $testingPageId;
 
        function __construct( $name = null, array $data = [], $dataName = '' ) {
                parent::__construct( $name, $data, $dataName );
@@ -45,9 +45,9 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
                $this->setMwGlobals( 'wgRCWatchCategoryMembership', true );
        }
 
-       public function addDBData() {
+       public function addDBDataOnce() {
                $res = $this->insertPage( 'Testing' );
-               $this->testingPageId = $res['id'];
+               self::$testingPageId = $res['id'];
                $this->insertPage( 'Some_other_page' );
                $this->insertPage( 'Template:TestingTemplate' );
        }
@@ -68,7 +68,7 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
        public function testUpdate_pagelinks() {
                /** @var Title $t */
                /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", $this->testingPageId );
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", self::$testingPageId );
 
                $po->addLink( Title::newFromText( "Foo" ) );
                $po->addLink( Title::newFromText( "Special:Foo" ) ); // special namespace should be ignored
@@ -81,7 +81,7 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
                        'pagelinks',
                        'pl_namespace,
                        pl_title',
-                       'pl_from = ' . $this->testingPageId,
+                       'pl_from = ' . self::$testingPageId,
                        [ [ NS_MAIN, 'Foo' ] ]
                );
                $this->assertArrayEquals( [
@@ -100,7 +100,7 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
                        'pagelinks',
                        'pl_namespace,
                        pl_title',
-                       'pl_from = ' . $this->testingPageId,
+                       'pl_from = ' . self::$testingPageId,
                        [
                                [ NS_MAIN, 'Bar' ],
                                [ NS_TALK, 'Bar' ],
@@ -120,7 +120,7 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
         */
        public function testUpdate_externallinks() {
                /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", $this->testingPageId );
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", self::$testingPageId );
 
                $po->addExternalLink( "http://testing.com/wiki/Foo" );
 
@@ -129,7 +129,7 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
                        $po,
                        'externallinks',
                        'el_to, el_index',
-                       'el_from = ' . $this->testingPageId,
+                       'el_from = ' . self::$testingPageId,
                        [
                                [ 'http://testing.com/wiki/Foo', 'http://com.testing./wiki/Foo' ],
                        ]
@@ -143,7 +143,7 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
                /** @var ParserOutput $po */
                $this->setMwGlobals( 'wgCategoryCollation', 'uppercase' );
 
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", $this->testingPageId );
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", self::$testingPageId );
 
                $po->addCategory( "Foo", "FOO" );
 
@@ -152,7 +152,7 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
                        $po,
                        'categorylinks',
                        'cl_to, cl_sortkey',
-                       'cl_from = ' . $this->testingPageId,
+                       'cl_from = ' . self::$testingPageId,
                        [ [ 'Foo', "FOO\nTESTING" ] ]
                );
        }
@@ -232,7 +232,7 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
         */
        public function testUpdate_iwlinks() {
                /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", $this->testingPageId );
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", self::$testingPageId );
 
                $target = Title::makeTitleSafe( NS_MAIN, "Foo", '', 'linksupdatetest' );
                $po->addInterwikiLink( $target );
@@ -242,7 +242,7 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
                        $po,
                        'iwlinks',
                        'iwl_prefix, iwl_title',
-                       'iwl_from = ' . $this->testingPageId,
+                       'iwl_from = ' . self::$testingPageId,
                        [ [ 'linksupdatetest', 'Foo' ] ]
                );
        }
@@ -252,7 +252,7 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
         */
        public function testUpdate_templatelinks() {
                /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", $this->testingPageId );
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", self::$testingPageId );
 
                $po->addTemplate( Title::newFromText( "Template:Foo" ), 23, 42 );
 
@@ -262,7 +262,7 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
                        'templatelinks',
                        'tl_namespace,
                        tl_title',
-                       'tl_from = ' . $this->testingPageId,
+                       'tl_from = ' . self::$testingPageId,
                        [ [ NS_TEMPLATE, 'Foo' ] ]
                );
        }
@@ -272,7 +272,7 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
         */
        public function testUpdate_imagelinks() {
                /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", $this->testingPageId );
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", self::$testingPageId );
 
                $po->addImage( "Foo.png" );
 
@@ -281,7 +281,7 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
                        $po,
                        'imagelinks',
                        'il_to',
-                       'il_from = ' . $this->testingPageId,
+                       'il_from = ' . self::$testingPageId,
                        [ [ 'Foo.png' ] ]
                );
        }
@@ -295,7 +295,7 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
                ] );
 
                /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", $this->testingPageId );
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", self::$testingPageId );
 
                $po->addLanguageLink( Title::newFromText( "en:Foo" )->getFullText() );
 
@@ -304,7 +304,7 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
                        $po,
                        'langlinks',
                        'll_lang, ll_title',
-                       'll_from = ' . $this->testingPageId,
+                       'll_from = ' . self::$testingPageId,
                        [ [ 'En', 'Foo' ] ]
                );
        }
@@ -316,7 +316,7 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
                global $wgPagePropsHaveSortkey;
 
                /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", $this->testingPageId );
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", self::$testingPageId );
 
                $fields = [ 'pp_propname', 'pp_value' ];
                $expected = [];
@@ -349,7 +349,7 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
                }
 
                $this->assertLinksUpdate(
-                       $t, $po, 'page_props', $fields, 'pp_page = ' . $this->testingPageId, $expected );
+                       $t, $po, 'page_props', $fields, 'pp_page = ' . self::$testingPageId, $expected );
        }
 
        public function testUpdate_page_props_without_sortkey() {
index 94c039c..0e87ffa 100644 (file)
@@ -19,9 +19,9 @@ class MWExceptionTest extends MediaWikiTestCase {
         * @dataProvider provideTextUseOutputPage
         * @covers MWException::useOutputPage
         */
-       public function testUseOutputPage( $expected, $wgLang, $wgFullyInitialised, $wgOut ) {
+       public function testUseOutputPage( $expected, $langObj, $wgFullyInitialised, $wgOut ) {
                $this->setMwGlobals( [
-                       'wgLang' => $wgLang,
+                       'wgLang' => $langObj,
                        'wgFullyInitialised' => $wgFullyInitialised,
                        'wgOut' => $wgOut,
                ] );
@@ -32,7 +32,7 @@ class MWExceptionTest extends MediaWikiTestCase {
 
        public function provideTextUseOutputPage() {
                return [
-                       // expected, wgLang, wgFullyInitialised, wgOut
+                       // expected, langObj, wgFullyInitialised, wgOut
                        [ false, null, null, null ],
                        [ false, $this->getMockLanguage(), null, null ],
                        [ false, $this->getMockLanguage(), true, null ],
@@ -52,9 +52,9 @@ class MWExceptionTest extends MediaWikiTestCase {
         * @dataProvider provideUseMessageCache
         * @covers MWException::useMessageCache
         */
-       public function testUseMessageCache( $expected, $wgLang ) {
+       public function testUseMessageCache( $expected, $langObj ) {
                $this->setMwGlobals( [
-                       'wgLang' => $wgLang,
+                       'wgLang' => $langObj,
                ] );
                $e = new MWException();
                $this->assertEquals( $expected, $e->useMessageCache() );
index 65ffa49..3c648f9 100644 (file)
@@ -52,6 +52,29 @@ class JobTest extends MediaWikiTestCase {
                                $this->getMockJob( [ $mockToStringObj ] ),
                                'someCommand  0={STRING_OBJ_VAL}'
                        ],
+                       [
+                               $this->getMockJob( [
+                                       "pages" => [
+                                               "932737" => [
+                                                       0,
+                                                       "Robert_James_Waller"
+                                               ]
+                                       ],
+                                       "rootJobSignature" => "45868e99bba89064e4483743ebb9b682ef95c1a7",
+                                       "rootJobTimestamp" => "20160309110158",
+                                       "masterPos" => [
+                                               "file" => "db1023-bin.001288",
+                                               "pos" => "308257743",
+                                               "asOfTime" => 1457521464.3814
+                                       ],
+                                       "triggeredRecursive" => true
+                               ] ),
+                               'someCommand  pages={"932737":[0,"Robert_James_Waller"]} ' .
+                               'rootJobSignature=45868e99bba89064e4483743ebb9b682ef95c1a7 ' .
+                               'rootJobTimestamp=20160309110158 masterPos=' .
+                               '{"file":"db1023-bin.001288","pos":"308257743","asOfTime":1457521464.3814} ' .
+                               'triggeredRecursive=1'
+                       ],
                ];
        }
 
index 50a24ad..54178fe 100644 (file)
@@ -21,10 +21,11 @@ class CategoryMembershipChangeJobTest extends MediaWikiTestCase {
        public function setUp() {
                parent::setUp();
                $this->setMwGlobals( 'wgRCWatchCategoryMembership', true );
+               $this->setContentLang( 'qqx' );
        }
 
-       public function addDBData() {
-               parent::addDBData();
+       public function addDBDataOnce() {
+               parent::addDBDataOnce();
                $insertResult = $this->insertPage( self::TITLE_STRING, 'UT Content' );
                $this->title = $insertResult['title'];
        }
@@ -74,11 +75,11 @@ class CategoryMembershipChangeJobTest extends MediaWikiTestCase {
                $removedRevId = $this->editPageText( 'Blank' );
 
                $this->assertEquals(
-                       '[[:' . self::TITLE_STRING . ']] added to category',
+                       '(recentchanges-page-added-to-category: ' . self::TITLE_STRING . ', 0)',
                        $this->getCategorizeRecentChangeForRevId( $addedRevId )->getAttribute( 'rc_comment' )
                );
                $this->assertEquals(
-                       '[[:' . self::TITLE_STRING . ']] removed from category',
+                       '(recentchanges-page-removed-from-category: ' . self::TITLE_STRING . ', 0)',
                        $this->getCategorizeRecentChangeForRevId( $removedRevId )->getAttribute( 'rc_comment' )
                );
        }
index d885926..3a3b514 100644 (file)
@@ -17,9 +17,8 @@ class ArticleTablesTest extends MediaWikiLangTestCase {
                $page = WikiPage::factory( $title );
                $user = new User();
                $user->mRights = [ 'createpage', 'edit', 'purge' ];
-               $this->setMwGlobals( 'wgLanguageCode', 'es' );
-               $this->setMwGlobals( 'wgContLang', Language::factory( 'es' ) );
-               $this->setMwGlobals( 'wgLang', Language::factory( 'fr' ) );
+               $this->setContentLang( 'es' );
+               $this->setUserLang( 'fr' );
 
                $page->doEditContent(
                        new WikitextContent( '{{:{{int:history}}}}' ),
@@ -30,7 +29,7 @@ class ArticleTablesTest extends MediaWikiLangTestCase {
                );
                $templates1 = $title->getTemplateLinksFrom();
 
-               $this->setMwGlobals( 'wgLang', Language::factory( 'de' ) );
+               $this->setUserLang( 'de' );
                $page = WikiPage::factory( $title ); // In order to force the re-rendering of the same wikitext
 
                // We need an edit, a purge is not enough to regenerate the tables
index 04d6067..4eb480d 100644 (file)
@@ -211,15 +211,15 @@ class NewParserTest extends MediaWikiTestCase {
                parent::tearDownAfterClass();
        }
 
-       function addDBData() {
-               $this->tablesUsed[] = 'site_stats';
+       function addDBDataOnce() {
                # disabled for performance
                # $this->tablesUsed[] = 'image';
 
                # Update certain things in site_stats
                $this->db->insert( 'site_stats',
                        [ 'ss_row_id' => 1, 'ss_images' => 2, 'ss_good_articles' => 1 ],
-                       __METHOD__
+                       __METHOD__,
+                       [ 'IGNORE' ]
                );
 
                $user = User::newFromId( 0 );
index 2a3a5fe..6a3f95b 100644 (file)
@@ -10,7 +10,7 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
         */
        private $search;
 
-       public function addDBData() {
+       public function addDBDataOnce() {
                if ( !$this->isWikitextNS( NS_MAIN ) ) {
                        // tests are skipped if NS_MAIN is not wikitext
                        return;
index b680d5e..055e982 100644 (file)
@@ -44,7 +44,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                parent::tearDown();
        }
 
-       public function addDBData() {
+       public function addDBDataOnce() {
                if ( !$this->isWikitextNS( NS_MAIN ) ) {
                        // @todo cover the case of non-wikitext content in the main namespace
                        return;
index 590f287..5126a42 100644 (file)
@@ -62,7 +62,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
                ] );
        }
 
-       public function addDBData() {
+       public function addDBDataOnce() {
                $passwordFactory = new \PasswordFactory();
                $passwordFactory->init( \RequestContext::getMain()->getConfig() );
                // A is unsalted MD5 (thus fast) ... we don't care about security here, this is test only
index 548b75b..89fd1b0 100644 (file)
@@ -5,7 +5,7 @@
  * @covers SpecialMyLanguage
  */
 class SpecialMyLanguageTest extends MediaWikiTestCase {
-       public function addDBData() {
+       public function addDBDataOnce() {
                $titles = [
                        'Page/Another',
                        'Page/Another/ru',
index 1ac5e59..0bb0afe 100644 (file)
@@ -32,10 +32,6 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                parent::setUp();
 
                $this->setMwGlobals( [
-                       'wgLanguageCode' => 'en',
-                       'wgContLang' => Language::factory( 'en' ),
-                       // User language
-                       'wgLang' => Language::factory( 'en' ),
                        'wgAllowUserJs' => false,
                        'wgDefaultLanguageVariant' => false,
                        'wgMetaNamespace' => 'Project',
@@ -57,6 +53,8 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                                ]
                        ]
                ] );
+               $this->setUserLang( 'en' );
+               $this->setContentLang( 'en' );
        }
 
        /**
index 86fc295..02d1a1d 100755 (executable)
@@ -29,13 +29,6 @@ class PHPUnitMaintClass extends Maintenance {
 
        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`.',
-                       false, # not required
-                       true # need arg
-               );
                $this->addOption(
                        'debug-tests',
                        'Log testing activity to the PHPUnitCommand log channel.',
@@ -158,38 +151,6 @@ class PHPUnitMaintClass extends Maintenance {
                                [ '--configuration', $IP . '/tests/phpunit/suite.xml' ] );
                }
 
-               # --with-phpunitdir let us override the default PHPUnit version
-               # Can use with either or phpunit.phar in the directory or the
-               # full PHPUnit code base.
-               if ( $this->hasOption( 'with-phpunitdir' ) ) {
-                       $phpunitDir = $this->getOption( 'with-phpunitdir' );
-
-                       # prepends provided PHPUnit directory or phar
-                       $this->output( "Will attempt loading PHPUnit from `$phpunitDir`\n" );
-                       set_include_path( $phpunitDir . PATH_SEPARATOR . get_include_path() );
-
-                       # Cleanup $args array so the option and its value do not
-                       # pollute PHPUnit
-                       $key = array_search( '--with-phpunitdir', $_SERVER['argv'] );
-                       unset( $_SERVER['argv'][$key] ); // the option
-                       unset( $_SERVER['argv'][$key + 1] ); // its value
-                       $_SERVER['argv'] = array_values( $_SERVER['argv'] );
-               }
-
-               # Makes MediaWiki PHPUnit directory includable so the PHPUnit will
-               # be able to resolve relative files inclusion such as suites/*
-               # PHPUnit uses stream_resolve_include_path() internally
-               # See bug 32022
-               $key = array_search( '--include-path', $_SERVER['argv'] );
-               if ( $key === false ) {
-                       array_splice( $_SERVER['argv'], 1, 0,
-                               __DIR__
-                               . PATH_SEPARATOR
-                               . get_include_path()
-                       );
-                       array_splice( $_SERVER['argv'], 1, 0, '--include-path' );
-               }
-
                $key = array_search( '--debug-tests', $_SERVER['argv'] );
                if ( $key !== false && array_search( '--printer', $_SERVER['argv'] ) === false ) {
                        unset( $_SERVER['argv'][$key] );
@@ -241,43 +202,9 @@ class PHPUnitMaintClass extends Maintenance {
 $maintClass = 'PHPUnitMaintClass';
 require RUN_MAINTENANCE_IF_MAIN;
 
-$ok = false;
-
-if ( class_exists( 'PHPUnit_TextUI_Command' ) ) {
-       echo "PHPUnit already present\n";
-       $ok = true;
-} else {
-       foreach ( [
-                               stream_resolve_include_path( 'phpunit.phar' ),
-                               stream_resolve_include_path( 'phpunit-old.phar' ),
-                               'PHPUnit/Runner/Version.php',
-                               'PHPUnit/Autoload.php'
-                       ] as $includePath ) {
-
-               if ( $includePath === false ) {
-                       // stream_resolve_include_path can return false
-                       continue;
-               }
-
-               \MediaWiki\suppressWarnings();
-               include_once $includePath;
-               \MediaWiki\restoreWarnings();
-               if ( class_exists( 'PHPUnit_TextUI_Command' ) ) {
-                       $ok = true;
-                       echo "Using PHPUnit from $includePath\n";
-                       break;
-               }
-       }
-}
-
-if ( !$ok ) {
-       echo "Couldn't find a usable PHPUnit.\n";
-       exit( 1 );
-}
-
-$puVersion = PHPUnit_Runner_Version::id();
-if ( $puVersion !== '@package_version@' && version_compare( $puVersion, '3.7.0', '<' ) ) {
-       echo "PHPUnit 3.7.0 or later required; you have {$puVersion}.\n";
+if ( !class_exists( 'PHPUnit_TextUI_Command' ) ) {
+       echo "PHPUnit not found. Please install it and other dev dependencies by
+running `composer install` in MediaWiki root directory.\n";
        exit( 1 );
 }
 
diff --git a/tests/phpunit/structure/ExtensionJsonValidationTest.php b/tests/phpunit/structure/ExtensionJsonValidationTest.php
new file mode 100644 (file)
index 0000000..275c0d1
--- /dev/null
@@ -0,0 +1,93 @@
+<?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
+ */
+
+/**
+ * Validates all loaded extensions and skins using the ExtensionRegistry
+ * against the extension.json schema in the docs/ folder.
+ */
+class ExtensionJsonValidationTest extends PHPUnit_Framework_TestCase {
+
+       public function setUp() {
+               parent::setUp();
+               if ( !class_exists( 'JsonSchema\Uri\UriRetriever' ) ) {
+                       $this->markTestSkipped(
+                               'The JsonSchema library cannot be found,' .
+                               ' please install it through composer to run extension.json validation tests.'
+                       );
+               }
+
+               if ( !ExtensionRegistry::getInstance()->getAllThings() ) {
+                       $this->markTestSkipped(
+                               'There are no extensions or skins loaded via the ExtensionRegistry'
+                       );
+               }
+       }
+
+       public static function providePassesValidation() {
+               $values = [];
+               foreach ( ExtensionRegistry::getInstance()->getAllThings() as $thing ) {
+                       $values[] = [ $thing['path'] ];
+               }
+
+               return $values;
+       }
+
+       /**
+        * @dataProvider providePassesValidation
+        * @param string $path Path to thing's json file
+        */
+       public function testPassesValidation( $path ) {
+               $data = json_decode( file_get_contents( $path ) );
+               $this->assertInstanceOf( 'stdClass', $data, "$path is not valid JSON" );
+
+               $this->assertObjectHasAttribute( 'manifest_version', $data,
+                       "$path does not have manifest_version set." );
+               $version = $data->manifest_version;
+               if ( $version !== ExtensionRegistry::MANIFEST_VERSION ) {
+                       $schemaPath = __DIR__ . "/../../../docs/extension.schema.v$version.json";
+               } else {
+                       $schemaPath = __DIR__ . '/../../../docs/extension.schema.json';
+               }
+
+               // Not too old
+               $this->assertTrue(
+                       $version >= ExtensionRegistry::OLDEST_MANIFEST_VERSION,
+                       "$path is using a non-supported schema version"
+               );
+               // Not too new
+               $this->assertTrue(
+                       $version <= ExtensionRegistry::MANIFEST_VERSION,
+                       "$path is using a non-supported schema version"
+               );
+               $retriever = new JsonSchema\Uri\UriRetriever();
+               $schema = $retriever->retrieve( 'file://' . $schemaPath );
+
+               $validator = new JsonSchema\Validator();
+               $validator->check( $data, $schema );
+               if ( $validator->isValid() ) {
+                       // All good.
+                       $this->assertTrue( true );
+               } else {
+                       $out = "$path did pass validation.\n";
+                       foreach ( $validator->getErrors() as $error ) {
+                               $out .= "[{$error['property']}] {$error['message']}\n";
+                       }
+                       $this->assertTrue( false, $out );
+               }
+       }
+}
index 723328e..0e23fdd 100644 (file)
@@ -8,16 +8,14 @@
 class ExtensionsTestSuite extends PHPUnit_Framework_TestSuite {
        public function __construct() {
                parent::__construct();
-               $paths = array();
+               $paths = [];
                // Extensions can return a list of files or directories
-               Hooks::run( 'UnitTestsList', array( &$paths ) );
+               Hooks::run( 'UnitTestsList', [ &$paths ] );
                foreach ( $paths as $path ) {
                        if ( is_dir( $path ) ) {
                                // If the path is a directory, search for test cases.
                                // @since 1.24
-                               $suffixes = array(
-                                       'Test.php',
-                               );
+                               $suffixes = [ 'Test.php' ];
                                $fileIterator = new File_Iterator_Facade();
                                $matchingFiles = $fileIterator->getFilesAsArray( $path, $suffixes );
                                $this->addTestFiles( $matchingFiles );
@@ -26,7 +24,7 @@ class ExtensionsTestSuite extends PHPUnit_Framework_TestSuite {
                                $this->addTestFile( $path );
                        }
                }
-               if ( !count( $paths ) ) {
+               if ( !$paths ) {
                        $this->addTest( new DummyExtensionsTest( 'testNothing' ) );
                }
        }
index 310268f..b7161b1 100644 (file)
@@ -8,14 +8,7 @@ return [
 
        'test.sinonjs' => [
                'scripts' => [
-                       'resources/lib/sinonjs/sinon-1.15.4.js',
-                       // We want tests to work in IE, but can't include this as it
-                       // will break the placeholders in Sinon because the hack it uses
-                       // to hijack IE globals relies on running in the global scope
-                       // and in ResourceLoader this won't be running in the global scope.
-                       // Including it results (among other things) in sandboxed timers
-                       // being broken due to Date inheritance being undefined.
-                       // 'resources/lib/sinonjs/sinon-ie-1.15.4.js',
+                       'resources/lib/sinonjs/sinon-1.17.3.js',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
index f2865eb..dc0cff4 100644 (file)
@@ -6,12 +6,20 @@
        } ) );
 
        QUnit.test( 'Hello world', function ( assert ) {
-               QUnit.expect( 1 );
+               QUnit.expect( 3 );
 
                var api = new mw.Api();
 
                api.parse( '\'\'\'Hello world\'\'\'' ).done( function ( html ) {
-                       assert.equal( html, '<p><b>Hello world</b></p>' );
+                       assert.equal( html, '<p><b>Hello world</b></p>', 'Parse wikitext by string' );
+               } );
+
+               api.parse( {
+                       toString: function () {
+                               return '\'\'\'Hello world\'\'\'';
+                       }
+               } ).done( function ( html ) {
+                       assert.equal( html, '<p><b>Hello world</b></p>', 'Parse wikitext by toString object' );
                } );
 
                this.server.respondWith( /action=parse.*&text='''Hello\+world'''/, function ( request ) {
                        );
                } );
 
+               api.parse( new mw.Title( 'Earth' ) ).done( function ( html ) {
+                       assert.equal( html, '<p><b>Earth</b> is a planet.</p>', 'Parse page by Title object'  );
+               } );
+
+               this.server.respondWith( /action=parse.*&page=Earth/, function ( request ) {
+                       request.respond( 200, { 'Content-Type': 'application/json' },
+                               '{ "parse": { "text": "<p><b>Earth</b> is a planet.</p>" } }'
+                       );
+               } );
+
                this.server.respond();
        } );
 }( mediaWiki ) );
index 394f3bd..520db42 100644 (file)
@@ -3,11 +3,6 @@
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
                        this.server.respondImmediately = true;
-                       this.clock = this.sandbox.useFakeTimers();
-               },
-               teardown: function () {
-                       // https://github.com/jquery/jquery/issues/2453
-                       this.clock.tick();
                }
        } ) );
 
                return sequence( bodies );
        }
 
-       QUnit.test( 'Basic functionality', function ( assert ) {
-               QUnit.expect( 2 );
+       QUnit.test( 'get()', function ( assert ) {
                var api = new mw.Api();
 
                this.server.respond( [ 200, { 'Content-Type': 'application/json' }, '[]' ] );
 
-               api.get( {} )
-                       .done( function ( data ) {
-                               assert.deepEqual( data, [], 'If request succeeds without errors, resolve deferred' );
-                       } );
+               return api.get( {} ).then( function ( data ) {
+                       assert.deepEqual( data, [], 'If request succeeds without errors, resolve deferred' );
+               } );
+       } );
 
-               api.post( {} )
-                       .done( function ( data ) {
-                               assert.deepEqual( data, [], 'Simple POST request' );
-                       } );
+       QUnit.test( 'post()', function ( assert ) {
+               var api = new mw.Api();
+
+               this.server.respond( [ 200, { 'Content-Type': 'application/json' }, '[]' ] );
+
+               return api.post( {} ).then( function ( data ) {
+                       assert.deepEqual( data, [], 'Simple POST request' );
+               } );
        } );
 
        QUnit.test( 'API error', function ( assert ) {
-               QUnit.expect( 1 );
                var api = new mw.Api();
 
                this.server.respond( [ 200, { 'Content-Type': 'application/json' },
                api.get( { action: 'doesntexist' } )
                        .fail( function ( errorCode ) {
                                assert.equal( errorCode, 'unknown_action', 'API error should reject the deferred' );
-                       } );
+                       } )
+                       .always( assert.async() );
        } );
 
        QUnit.test( 'FormData support', function ( assert ) {
-               QUnit.expect( 2 );
                var api = new mw.Api();
 
                this.server.respond( function ( request ) {
                        request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
                } );
 
-               api.post( { action: 'test' }, { contentType: 'multipart/form-data' } );
+               return api.post( { action: 'test' }, { contentType: 'multipart/form-data' } );
        } );
 
        QUnit.test( 'Converting arrays to pipe-separated', function ( assert ) {
-               QUnit.expect( 1 );
                var api = new mw.Api();
 
                this.server.respond( function ( request ) {
                        request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
                } );
 
-               api.get( { test: [ 'foo', 'bar', 'baz' ] } );
+               return api.get( { test: [ 'foo', 'bar', 'baz' ] } );
        } );
 
        QUnit.test( 'Omitting false booleans', function ( assert ) {
-               QUnit.expect( 2 );
                var api = new mw.Api();
 
                this.server.respond( function ( request ) {
                        request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
                } );
 
-               api.get( { foo: false, bar: true } );
+               return api.get( { foo: false, bar: true } );
        } );
 
        QUnit.test( 'getToken() - cached', function ( assert ) {
-               QUnit.expect( 2 );
-               var api = new mw.Api();
+               var api = new mw.Api(),
+                       test = this;
 
                // Get editToken for local wiki, this should not make
                // a request as it should be retrieved from mw.user.tokens.
-               api.getToken( 'edit' )
-                       .done( function ( token ) {
+               return api.getToken( 'edit' )
+                       .then( function ( token ) {
                                assert.ok( token.length, 'Got a token' );
-                       } )
-                       .fail( function ( err ) {
+                       }, function ( err ) {
                                assert.equal( '', err, 'API error' );
+                       } )
+                       .then( function () {
+                               assert.equal( test.server.requests.length, 0, 'Requests made' );
                        } );
-
-               assert.equal( this.server.requests.length, 0, 'Requests made' );
        } );
 
        QUnit.test( 'getToken() - uncached', function ( assert ) {
-               QUnit.expect( 3 );
-               var api = new mw.Api();
+               var api = new mw.Api(),
+                       firstDone = assert.async(),
+                       secondDone = assert.async();
 
                this.server.respondWith( /type=testuncached/, [ 200, { 'Content-Type': 'application/json' },
                        '{ "query": { "tokens": { "testuncachedtoken": "good" } } }'
                        } )
                        .fail( function ( err ) {
                                assert.equal( err, '', 'API error' );
-                       } );
+                       } )
+                       .always( firstDone );
 
                api.getToken( 'testuncached' )
                        .done( function ( token ) {
                        } )
                        .fail( function ( err ) {
                                assert.equal( err, '', 'API error' );
-                       } );
+                       } )
+                       .always( secondDone );
 
                assert.equal( this.server.requests.length, 1, 'Requests made' );
        } );
 
        QUnit.test( 'getToken() - error', function ( assert ) {
-               QUnit.expect( 2 );
                var api = new mw.Api();
 
                this.server.respondWith( /type=testerror/, sequenceBodies( 200, { 'Content-Type': 'application/json' },
                ) );
 
                // Don't cache error (bug 65268)
-               api.getToken( 'testerror' ).fail( function ( err ) {
-                       assert.equal( err, 'bite-me', 'Expected error' );
-
-                       // Make this request after the first one has finished.
-                       // If we make it simultaneously we still want it to share
-                       // the cache, but as soon as it is fulfilled as error we
-                       // reject it so that the next one tries fresh.
-                       api.getToken( 'testerror' ).done( function ( token ) {
+               return api.getToken( 'testerror' )
+                       .then( null, function ( err ) {
+                               assert.equal( err, 'bite-me', 'Expected error' );
+
+                               return api.getToken( 'testerror' );
+                       } )
+                       .then( function ( token ) {
                                assert.equal( token, 'good', 'The token' );
                        } );
-               } );
        } );
 
        QUnit.test( 'getToken() - deprecated', function ( assert ) {
-               QUnit.expect( 2 );
                // Cache API endpoint from default to avoid cachehit in mw.user.tokens
-               var api = new mw.Api( { ajax: { url: '/postWithToken/api.php' } } );
+               var api = new mw.Api( { ajax: { url: '/postWithToken/api.php' } } ),
+                       test = this;
 
                this.server.respondWith( /type=csrf/, [ 200, { 'Content-Type': 'application/json' },
                        '{ "query": { "tokens": { "csrftoken": "csrfgood" } } }'
                ] );
 
                // Get a token of a type that is in the legacy map.
-               api.getToken( 'email' )
+               return api.getToken( 'email' )
                        .done( function ( token ) {
                                assert.equal( token, 'csrfgood', 'Token' );
                        } )
                        .fail( function ( err ) {
                                assert.equal( err, '', 'API error' );
+                       } )
+                       .always( function () {
+                               assert.equal( test.server.requests.length, 1, 'Requests made' );
                        } );
-
-               assert.equal( this.server.requests.length, 1, 'Requests made' );
        } );
 
        QUnit.test( 'badToken()', function ( assert ) {
-               QUnit.expect( 2 );
                var api = new mw.Api(),
                        test = this;
 
                        ]
                ) );
 
-               api.getToken( 'testbad' )
+               return api.getToken( 'testbad' )
                        .then( function () {
                                api.badToken( 'testbad' );
                                return api.getToken( 'testbad' );
        } );
 
        QUnit.test( 'badToken( legacy )', function ( assert ) {
-               QUnit.expect( 2 );
                var api = new mw.Api( { ajax: { url: '/badTokenLegacy/api.php' } } ),
                        test = this;
 
                        ]
                ) );
 
-               api.getToken( 'options' )
+               return api.getToken( 'options' )
                        .then( function () {
                                api.badToken( 'options' );
                                return api.getToken( 'options' );
        } );
 
        QUnit.test( 'postWithToken( tokenType, params )', function ( assert ) {
-               QUnit.expect( 1 );
                var api = new mw.Api( { ajax: { url: '/postWithToken/api.php' } } );
 
                this.server.respondWith( 'GET', /type=testpost/, [ 200, { 'Content-Type': 'application/json' },
                        }
                } );
 
-               api.postWithToken( 'testpost', { action: 'example', key: 'foo' } )
-                       .done( function ( data ) {
+               return api.postWithToken( 'testpost', { action: 'example', key: 'foo' } )
+                       .then( function ( data ) {
                                assert.deepEqual( data, { example: { foo: 'quux' } } );
                        } );
        } );
 
        QUnit.test( 'postWithToken( tokenType, params with assert )', function ( assert ) {
-               QUnit.expect( 2 );
-               var api = new mw.Api( { ajax: { url: '/postWithToken/api.php' } } );
+               var api = new mw.Api( { ajax: { url: '/postWithToken/api.php' } } ),
+                       test = this;
 
                this.server.respondWith( /assert=user/, [ 200, { 'Content-Type': 'application/json' },
                        '{ "error": { "code": "assertuserfailed", "info": "Assertion failed" } }'
                ] );
 
-               api.postWithToken( 'testassertpost', { action: 'example', key: 'foo', assert: 'user' } )
-                       .fail( function ( errorCode ) {
+               return api.postWithToken( 'testassertpost', { action: 'example', key: 'foo', assert: 'user' } )
+                       // Cast error to success and vice versa
+                       .then( function ( ) {
+                               return $.Deferred().reject( 'Unexpected success' );
+                       }, function ( errorCode ) {
                                assert.equal( errorCode, 'assertuserfailed', 'getToken fails assert' );
+                               return $.Deferred().resolve();
+                       } )
+                       .then( function () {
+                               assert.equal( test.server.requests.length, 1, 'Requests made' );
                        } );
-
-               assert.equal( this.server.requests.length, 1, 'Requests made' );
        } );
 
        QUnit.test( 'postWithToken( tokenType, params, ajaxOptions )', function ( assert ) {
-               QUnit.expect( 3 );
-               var api = new mw.Api();
+               var api = new mw.Api(),
+                       test = this;
 
                this.server.respond( [ 200, { 'Content-Type': 'application/json' }, '{ "example": "quux" }' ] );
 
-               api.postWithToken(
-                       'edit',
-                       {
-                               action: 'example'
-                       },
-                       {
-                               headers: {
-                                       'X-Foo': 'Bar'
+               return api.postWithToken( 'edit',
+                               { action: 'example' },
+                               {
+                                       headers: {
+                                               'X-Foo': 'Bar'
+                                       }
                                }
-                       }
-               );
+                       )
+                       .then( function () {
+                               assert.equal( test.server.requests[ 0 ].requestHeaders[ 'X-Foo' ], 'Bar', 'Header sent' );
 
-               api.postWithToken(
-                       'edit',
-                       {
-                               action: 'example'
-                       },
-                       function () {
-                               assert.ok( false, 'This parameter cannot be a callback' );
-                       }
-               )
-               .always( function ( data ) {
-                       assert.equal( data.example, 'quux' );
-               } );
+                               return api.postWithToken( 'edit',
+                                       { action: 'example' },
+                                       function () {
+                                               assert.ok( false, 'This parameter cannot be a callback' );
+                                       }
+                               );
+                       } )
+                       .then( function ( data ) {
+                               assert.equal( data.example, 'quux' );
 
-               assert.equal( this.server.requests.length, 2, 'Request made' );
-               assert.equal( this.server.requests[ 0 ].requestHeaders[ 'X-Foo' ], 'Bar', 'Header sent' );
+                               assert.equal( test.server.requests.length, 2, 'Request made' );
+                       } );
        } );
 
        QUnit.test( 'postWithToken() - badtoken', function ( assert ) {
-               QUnit.expect( 1 );
                var api = new mw.Api();
 
                this.server.respondWith( /type=testbadtoken/, sequenceBodies( 200, { 'Content-Type': 'application/json' },
                // - Request: action=example -> badtoken error
                // - Request: new token -> good
                // - Request: action=example -> success
-               api.postWithToken( 'testbadtoken', { action: 'example', key: 'foo' } )
-                       .done( function ( data ) {
+               return api.postWithToken( 'testbadtoken', { action: 'example', key: 'foo' } )
+                       .then( function ( data ) {
                                assert.deepEqual( data, { example: { foo: 'quux' } } );
                        } );
        } );
 
        QUnit.test( 'postWithToken() - badtoken-cached', function ( assert ) {
-               QUnit.expect( 2 );
                var sequenceA,
                        api = new mw.Api();
 
 
                // - Request: new token -> A
                // - Request: action=example
-               api.postWithToken( 'testonce', { action: 'example', key: 'foo' } )
-                       .done( function ( data ) {
+               return api.postWithToken( 'testonce', { action: 'example', key: 'foo' } )
+                       .then( function ( data ) {
                                assert.deepEqual( data, { example: { value: 'A' } } );
-                       } );
 
-               // - Request: action=example w/ token A -> badtoken error
-               // - Request: new token -> B
-               // - Request: action=example w/ token B -> success
-               api.postWithToken( 'testonce', { action: 'example', key: 'bar' } )
-                       .done( function ( data ) {
+                               // - Request: action=example w/ token A -> badtoken error
+                               // - Request: new token -> B
+                               // - Request: action=example w/ token B -> success
+                               return api.postWithToken( 'testonce', { action: 'example', key: 'bar' } );
+                       } )
+                       .then( function ( data ) {
                                assert.deepEqual( data, { example: { value: 'B' } } );
                        } );
        } );
index 61391d8..f404294 100644 (file)
                        'It should default to the window object if no viewport is given' );
        } );
 
+       QUnit.test( 'isElementInViewport with scrolled page', 1, function ( assert ) {
+               var viewport = {
+                               top: 2000,
+                               left: 0,
+                               right: 1000,
+                               bottom: 2500
+                       },
+                       el = $( '<div />' )
+                               .appendTo( '#qunit-fixture' )
+                               .width( 20 )
+                               .height( 20 )
+                               .offset( {
+                                       top: 2300,
+                                       left: 20
+                               } )
+                               .get( 0 );
+               window.scrollTo( viewport.left, viewport.top );
+               assert.ok( mw.viewport.isElementInViewport( el, viewport ),
+                       'It should return true when the element is fully enclosed in the ' +
+                       'viewport even when the page is scrolled down' );
+               window.scrollTo( 0, 0 );
+       } );
+
        QUnit.test( 'isElementCloseToViewport', 3, function ( assert ) {
                var
                        viewport = {