Merge "build: Update grunt-jscs to 2.8.0"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sun, 13 Mar 2016 07:54:39 +0000 (07:54 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sun, 13 Mar 2016 07:54:39 +0000 (07:54 +0000)
447 files changed:
RELEASE-NOTES-1.27
composer.json
docs/hooks.txt
includes/Block.php
includes/DefaultSettings.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/HttpFunctions.php
includes/MovePage.php
includes/OutputPage.php
includes/Setup.php
includes/Status.php
includes/StubObject.php
includes/Title.php
includes/WatchedItem.php
includes/WatchedItemStore.php
includes/WebRequest.php
includes/WebResponse.php
includes/actions/HistoryAction.php
includes/actions/RollbackAction.php
includes/actions/WatchAction.php
includes/api/ApiBase.php
includes/api/ApiContinuationManager.php
includes/api/ApiEditPage.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedContributions.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatXml.php
includes/api/ApiHelp.php
includes/api/ApiImageRotate.php
includes/api/ApiImport.php
includes/api/ApiLogin.php
includes/api/ApiMain.php
includes/api/ApiOpenSearch.php
includes/api/ApiOptions.php
includes/api/ApiPageSet.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllLinks.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBacklinksprop.php
includes/api/ApiQueryFileRepoInfo.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryRevisionsBase.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryStashImageInfo.php
includes/api/ApiResult.php
includes/api/ApiStashEdit.php
includes/api/ApiTokens.php
includes/api/ApiUpload.php
includes/api/ApiWatch.php
includes/api/i18n/ar.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/lt.json
includes/api/i18n/nap.json
includes/api/i18n/vi.json
includes/cache/MessageCache.php
includes/changes/ChangesList.php
includes/content/JsonContent.php
includes/context/RequestContext.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabaseOracle.php
includes/db/DatabaseUtility.php
includes/db/IDatabase.php
includes/db/loadbalancer/LoadMonitor.php
includes/diff/DairikiDiff.php
includes/diff/DifferenceEngine.php
includes/filebackend/FileBackendMultiWrite.php
includes/filerepo/FileRepo.php
includes/filerepo/ForeignAPIRepo.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/MysqlUpdater.php
includes/installer/i18n/ar.json
includes/installer/i18n/bn.json
includes/installer/i18n/cs.json
includes/installer/i18n/de.json
includes/installer/i18n/en.json
includes/installer/i18n/fi.json
includes/installer/i18n/fr.json
includes/installer/i18n/gl.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/lt.json
includes/installer/i18n/mg.json
includes/installer/i18n/pl.json
includes/installer/i18n/pt.json
includes/installer/i18n/sl.json
includes/installer/i18n/uk.json
includes/installer/i18n/zh-hans.json
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobQueueFederated.php
includes/mail/EmailNotification.php
includes/media/XCF.php
includes/parser/Parser.php
includes/registration/ExtensionProcessor.php
includes/resourceloader/ResourceLoaderContext.php
includes/search/SearchMssql.php
includes/session/BotPasswordSessionProvider.php
includes/session/Session.php
includes/session/SessionManager.php
includes/skins/SkinTemplate.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBotPasswords.php
includes/specials/SpecialChangeContentModel.php
includes/specials/SpecialImport.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialUserlogin.php
includes/templates/Userlogin.php
includes/upload/UploadBase.php
includes/upload/UploadFromChunks.php
includes/user/User.php
includes/utils/MWRestrictions.php
languages/Language.php
languages/LanguageConverter.php
languages/classes/LanguageCu.php
languages/classes/LanguageHy.php
languages/classes/LanguageUk.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/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/gd.json
languages/i18n/gl.json
languages/i18n/gom-deva.json
languages/i18n/gom-latn.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/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/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/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/xmf.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
load.php
maintenance/Maintenance.php
maintenance/benchmarks/Benchmarker.php
maintenance/dumpBackup.php
maintenance/getConfiguration.php
maintenance/initSiteStats.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
package.json
phpcs.xml
resources/lib/oojs-ui/i18n/mn.json [new file with mode: 0644]
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/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/src/mediawiki.action/mediawiki.action.view.postEdit.js
resources/src/mediawiki.less/mediawiki.ui/mixins.less
resources/src/mediawiki.special/mediawiki.special.preferences.js
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/WatchedItemIntegrationTest.php [new file with mode: 0644]
tests/phpunit/includes/WatchedItemStoreIntegrationTest.php [new file with mode: 0644]
tests/phpunit/includes/WatchedItemStoreTest.php [deleted file]
tests/phpunit/includes/WatchedItemStoreUnitTest.php [new file with mode: 0644]
tests/phpunit/includes/WatchedItemUnitTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/RandomImageGenerator.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/DatabaseMysqlBaseTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/deferred/LinksUpdateTest.php
tests/phpunit/includes/exception/MWExceptionTest.php
tests/phpunit/includes/jobqueue/jobs/CategoryMembershipChangeJobTest.php
tests/phpunit/includes/libs/MemoizedCallableTest.php
tests/phpunit/includes/media/WebPTest.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/specialpage/SpecialPageFactoryTest.php
tests/phpunit/includes/specials/SpecialMyLanguageTest.php
tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
tests/phpunit/structure/ApiDocumentationTest.php
tests/phpunit/suites/ExtensionsTestSuite.php
tests/qunit/data/defineCallMwLoaderTestCallback.js [new file with mode: 0644]
tests/qunit/data/generateJqueryMsgData.php
tests/qunit/data/requireCallMwLoaderTestCallback.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.viewport.test.js

index 437f8e6..82d8103 100644 (file)
@@ -172,7 +172,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,13 +214,35 @@ 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).
 * ApiQueryBase::getDirectionDescription() was removed (deprecated since 1.25).
+* ApiQuery::getGenerators() was removed (deprecated since 1.21).
 * ApiQuery::getModules() was removed (deprecated since 1.21).
+* ApiQuery::getModuleType() was removed (deprecated since 1.21).
+* 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 ===
 
@@ -324,6 +347,18 @@ changes to languages because of Phabricator reports.
   does not support categories.
 * wikidiff difference engine is no longer supported, anyone still using it are encouraged
   to upgrade to wikidiff2 which is actively maintained and has better package availability.
+* Database logic was removed from WatchedItem and a WatchedItemStore was created:
+** WatchedItem::IGNORE_USER_RIGHTS and WatchedItem::CHECK_USER_RIGHTS were deprecated.
+   User::IGNORE_USER_RIGHTS and User::CHECK_USER_RIGHTS were introduced.
+** WatchedItem::fromUserTitle was deprecated in favour of the constructor.
+** WatchedItem::resetNotificationTimestamp was deprecated.
+** WatchedItem::batchAddWatch was deprecated.
+** WatchedItem::addWatch was deprecated.
+** WatchedItem::removeWatch was deprecated.
+** WatchedItem::isWatched was deprecated.
+** WatchedItem::duplicateEntries was deprecated.
+** EmailNotification::updateWatchlistTimestamp was deprecated.
+** User::getWatchedItem was removed.
 
 == Compatibility ==
 
index a545bb1..a21b4e8 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.2",
                "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 c5f2424..a431f1b 100644 (file)
@@ -178,7 +178,8 @@ once for 'TimStarling', and once for 'brion'.
 
 Hooks can return three possible values:
 
-  * true: the hook has operated successfully
+  * No return value (or null): the hook has operated successfully. Previously,
+    true was required. This is the default since MediaWiki 1.23.
   * "some string": an error occurred; processing should stop and the error
                    should be shown to the user
   * false: the hook has successfully done the work necessary and the calling
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 2a9986e..c04602c 100644 (file)
@@ -2096,7 +2096,7 @@ $wgTransactionalTimeLimit = 120;
 
 /**
  * Directory for caching data in the local filesystem. Should not be accessible
- * from the web. Set this to false to not use any local caches.
+ * from the web.
  *
  * Note: if multiple wikis share the same localisation cache directory, they
  * must all have the same set of extensions. You can set a directory just for
index 482fcc6..3268700 100644 (file)
@@ -2109,7 +2109,7 @@ class EditPage {
                $watch = $this->watchthis;
                // Do this in its own transaction to reduce contention...
                DeferredUpdates::addCallableUpdate( function () use ( $user, $title, $watch ) {
-                       if ( $watch == $user->isWatched( $title, WatchedItem::IGNORE_USER_RIGHTS ) ) {
+                       if ( $watch == $user->isWatched( $title, User::IGNORE_USER_RIGHTS ) ) {
                                return; // nothing to change
                        }
                        WatchAction::doWatchOrUnwatch( $watch, $title, $user );
index e48a399..3fa91fa 100644 (file)
@@ -1738,7 +1738,7 @@ function wfEscapeWikiText( $text ) {
                                $repl2[] = preg_quote( substr( $prot, 0, -1 ), '/' );
                        }
                }
-               $repl2 = $repl2 ? '/\b(' . join( '|', $repl2 ) . '):/i' : '/^(?!)/';
+               $repl2 = $repl2 ? '/\b(' . implode( '|', $repl2 ) . '):/i' : '/^(?!)/';
        }
        $text = substr( strtr( "\n$text", $repl ), 1 );
        $text = preg_replace( $repl2, '$1&#58;', $text );
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 afa4e1c..321b7e3 100644 (file)
@@ -369,7 +369,8 @@ class MovePage {
                $oldsnamespace = MWNamespace::getSubject( $this->oldTitle->getNamespace() );
                $newsnamespace = MWNamespace::getSubject( $this->newTitle->getNamespace() );
                if ( $oldsnamespace != $newsnamespace || $oldtitle != $newtitle ) {
-                       WatchedItem::duplicateEntries( $this->oldTitle, $this->newTitle );
+                       $store = WatchedItemStore::getDefaultInstance();
+                       $store->duplicateAllAssociatedEntries( $this->oldTitle, $this->newTitle );
                }
 
                Hooks::run(
index 5d1d5d0..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.
         *
@@ -2069,7 +2029,7 @@ class OutputPage extends ContextSource {
                foreach ( SessionManager::singleton()->getVaryHeaders() as $header => $options ) {
                        $this->addVaryHeader( $header, $options );
                }
-               return 'Vary: ' . join( ', ', array_keys( $this->mVaryHeader ) );
+               return 'Vary: ' . implode( ', ', array_keys( $this->mVaryHeader ) );
        }
 
        /**
@@ -2213,8 +2173,12 @@ class OutputPage extends ContextSource {
 
                if ( $this->mEnableClientCache ) {
                        if (
-                               $config->get( 'UseSquid' ) && !SessionManager::getGlobalSession()->isPersistent() &&
-                               !$this->isPrintable() && $this->mCdnMaxage != 0 && !$this->haveCacheVaryCookies()
+                               $config->get( 'UseSquid' ) &&
+                               !$response->hasCookies() &&
+                               !SessionManager::getGlobalSession()->isPersistent() &&
+                               !$this->isPrintable() &&
+                               $this->mCdnMaxage != 0 &&
+                               !$this->haveCacheVaryCookies()
                        ) {
                                if ( $config->get( 'UseESI' ) ) {
                                        # We'll purge the proxy cache explicitly, but require end user agents
@@ -2363,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
@@ -3214,7 +3167,7 @@ class OutputPage extends ContextSource {
                        $articleId = $wikiPage->getId();
                }
 
-               $lang = $title->getPageLanguage();
+               $lang = $title->getPageViewLanguage();
 
                // Pre-process information
                $separatorTransTable = $lang->separatorTransformTable();
index f92c8c2..f26d789 100644 (file)
@@ -536,6 +536,35 @@ if ( !class_exists( 'AutoLoader' ) ) {
        require_once "$IP/includes/AutoLoader.php";
 }
 
+// Install a header callback to prevent caching of responses with cookies (T127993)
+if ( !$wgCommandLineMode ) {
+       header_register_callback( function () {
+               $headers = [];
+               foreach ( headers_list() as $header ) {
+                       list( $name, $value ) = explode( ':', $header, 2 );
+                       $headers[strtolower( trim( $name ) )][] = trim( $value );
+               }
+
+               if ( isset( $headers['set-cookie'] ) ) {
+                       $cacheControl = isset( $headers['cache-control'] )
+                               ? implode( ', ', $headers['cache-control'] )
+                               : '';
+
+                       if ( !preg_match( '/(?:^|,)\s*(?:private|no-cache|no-store)\s*(?:$|,)/i', $cacheControl ) ) {
+                               header( 'Expires: Thu, 01 Jan 1970 00:00:00 GMT' );
+                               header( 'Cache-Control: private, max-age=0, s-maxage=0' );
+                               MediaWiki\Logger\LoggerFactory::getInstance( 'cache-cookies' )->warning(
+                                       'Cookies set on {url} with Cache-Control "{cache-control}"', [
+                                               'url' => WebRequest::getGlobalRequestURL(),
+                                               'cookies' => $headers['set-cookie'],
+                                               'cache-control' => $cacheControl ?: '<not set>',
+                                       ]
+                               );
+                       }
+               }
+       } );
+}
+
 MWExceptionHandler::installHandler();
 
 require_once "$IP/includes/compat/normal/UtfNormalUtil.php";
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 c0ec97f..0ac3e46 100644 (file)
@@ -174,7 +174,7 @@ class Title implements LinkTarget {
                // make sure we are using the right one. To detect changes over the course
                // of a request, we remember a fingerprint of the config used to create the
                // codec singleton, and re-create it if the fingerprint doesn't match.
-               $fingerprint = spl_object_hash( $wgContLang ) . '|' . join( '+', $wgLocalInterwikis );
+               $fingerprint = spl_object_hash( $wgContLang ) . '|' . implode( '+', $wgLocalInterwikis );
 
                if ( $fingerprint !== $titleCodecFingerprint ) {
                        $titleCodec = null;
@@ -4466,8 +4466,12 @@ class Title implements LinkTarget {
                        $this->mNotificationTimestamp = [];
                }
 
-               $watchedItem = WatchedItem::fromUserTitle( $user, $this );
-               $this->mNotificationTimestamp[$uid] = $watchedItem->getNotificationTimestamp();
+               $watchedItem = WatchedItemStore::getDefaultInstance()->getWatchedItem( $user, $this );
+               if ( $watchedItem ) {
+                       $this->mNotificationTimestamp[$uid] = $watchedItem->getNotificationTimestamp();
+               } else {
+                       $this->mNotificationTimestamp[$uid] = false;
+               }
 
                return $this->mNotificationTimestamp[$uid];
        }
index b597f99..5b4a4fc 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Accessor and mutator for watchlist entries.
- *
  * 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
 /**
  * Representation of a pair of user and title for watchlist entries.
  *
+ * @author Tim Starling
+ * @author Addshore
+ *
  * @ingroup Watchlist
  */
 class WatchedItem {
-       /** @var Title */
-       private $mTitle;
-
-       /** @var User */
-       private $mUser;
-
-       /** @var int */
-       private $mCheckRights;
-
-       /** @var bool */
-       private $loaded = false;
-
-       /** @var bool */
-       private $watched;
-
-       /** @var string */
-       private $timestamp;
 
        /**
-        * Constant to specify that user rights 'editmywatchlist' and
-        * 'viewmywatchlist' should not be checked.
-        * @since 1.22
+        * @deprecated since 1.27, see User::IGNORE_USER_RIGHTS
         */
-       const IGNORE_USER_RIGHTS = 0;
+       const IGNORE_USER_RIGHTS = User::IGNORE_USER_RIGHTS;
 
        /**
-        * Constant to specify that user rights 'editmywatchlist' and
-        * 'viewmywatchlist' should be checked.
-        * @since 1.22
+        * @deprecated since 1.27, see User::CHECK_USER_RIGHTS
         */
-       const CHECK_USER_RIGHTS = 1;
+       const CHECK_USER_RIGHTS = User::CHECK_USER_RIGHTS;
 
        /**
-        * Create a WatchedItem object with the given user and title
-        * @since 1.22 $checkRights parameter added
-        * @param User $user The user to use for (un)watching
-        * @param Title $title The title we're going to (un)watch
-        * @param int $checkRights Whether to check the 'viewmywatchlist' and 'editmywatchlist' rights.
-        *     Pass either WatchedItem::IGNORE_USER_RIGHTS or WatchedItem::CHECK_USER_RIGHTS.
-        * @return WatchedItem
+        * @deprecated Internal class use only
         */
-       public static function fromUserTitle( $user, $title,
-               $checkRights = WatchedItem::CHECK_USER_RIGHTS
-       ) {
-               $wl = new WatchedItem;
-               $wl->mUser = $user;
-               $wl->mTitle = $title;
-               $wl->mCheckRights = $checkRights;
-
-               return $wl;
-       }
+       const DEPRECATED_USAGE_TIMESTAMP = -100;
 
        /**
-        * Title being watched
-        * @return Title
+        * @var bool
+        * @deprecated Internal class use only
         */
-       protected function getTitle() {
-               return $this->mTitle;
-       }
+       public $checkRights = User::CHECK_USER_RIGHTS;
 
        /**
-        * Helper to retrieve the title namespace
-        * @return int
+        * @var Title
+        * @deprecated Internal class use only
         */
-       protected function getTitleNs() {
-               return $this->getTitle()->getNamespace();
-       }
+       private $title;
 
        /**
-        * Helper to retrieve the title DBkey
-        * @return string
+        * @var LinkTarget
         */
-       protected function getTitleDBkey() {
-               return $this->getTitle()->getDBkey();
-       }
+       private $linkTarget;
 
        /**
-        * Helper to retrieve the user id
-        * @return int
+        * @var User
         */
-       protected function getUserId() {
-               return $this->mUser->getId();
-       }
+       private $user;
 
        /**
-        * Return an array of conditions to select or update the appropriate database
-        * row.
-        *
-        * @return array
+        * @var null|string the value of the wl_notificationtimestamp field
         */
-       private function dbCond() {
-               return [
-                       'wl_user' => $this->getUserId(),
-                       'wl_namespace' => $this->getTitleNs(),
-                       'wl_title' => $this->getTitleDBkey(),
-               ];
-       }
+       private $notificationTimestamp;
 
        /**
-        * Load the object from the database
+        * @param User $user
+        * @param LinkTarget $linkTarget
+        * @param null|string $notificationTimestamp the value of the wl_notificationtimestamp field
+        * @param bool|null $checkRights DO NOT USE - used internally for backward compatibility
         */
-       private function load() {
-               if ( $this->loaded ) {
-                       return;
-               }
-               $this->loaded = true;
-
-               // Only loggedin user can have a watchlist
-               if ( $this->mUser->isAnon() ) {
-                       $this->watched = false;
-                       return;
-               }
-
-               // some pages cannot be watched
-               if ( !$this->getTitle()->isWatchable() ) {
-                       $this->watched = false;
-                       return;
-               }
-
-               # Pages and their talk pages are considered equivalent for watching;
-               # remember that talk namespaces are numbered as page namespace+1.
-
-               $dbr = wfGetDB( DB_SLAVE );
-               $row = $dbr->selectRow( 'watchlist', 'wl_notificationtimestamp',
-                       $this->dbCond(), __METHOD__ );
-
-               if ( $row === false ) {
-                       $this->watched = false;
-               } else {
-                       $this->watched = true;
-                       $this->timestamp = $row->wl_notificationtimestamp;
+       public function __construct(
+               User $user,
+               LinkTarget $linkTarget,
+               $notificationTimestamp,
+               $checkRights = null
+       ) {
+               $this->user = $user;
+               $this->linkTarget = $linkTarget;
+               $this->notificationTimestamp = $notificationTimestamp;
+               if ( $checkRights !== null ) {
+                       $this->checkRights = $checkRights;
                }
        }
 
        /**
-        * Check permissions
-        * @param string $what 'viewmywatchlist' or 'editmywatchlist'
-        * @return bool
+        * @return User
         */
-       private function isAllowed( $what ) {
-               return !$this->mCheckRights || $this->mUser->isAllowed( $what );
+       public function getUser() {
+               return $this->user;
        }
 
        /**
-        * Is mTitle being watched by mUser?
-        * @return bool
+        * @return LinkTarget
         */
-       public function isWatched() {
-               if ( !$this->isAllowed( 'viewmywatchlist' ) ) {
-                       return false;
-               }
-
-               $this->load();
-               return $this->watched;
+       public function getLinkTarget() {
+               return $this->linkTarget;
        }
 
        /**
         * Get the notification timestamp of this entry.
         *
-        * @return bool|null|string False if the page is not watched, the value of
-        *   the wl_notificationtimestamp field otherwise
+        * @return bool|null|string
         */
        public function getNotificationTimestamp() {
-               if ( !$this->isAllowed( 'viewmywatchlist' ) ) {
-                       return false;
-               }
-
-               $this->load();
-               if ( $this->watched ) {
-                       return $this->timestamp;
-               } else {
-                       return false;
+               // Back compat for objects constructed using self::fromUserTitle
+               if ( $this->notificationTimestamp === self::DEPRECATED_USAGE_TIMESTAMP ) {
+                       // wfDeprecated( __METHOD__, '1.27' );
+                       if ( $this->checkRights && !$this->user->isAllowed( 'viewmywatchlist' ) ) {
+                               return false;
+                       }
+                       $item = WatchedItemStore::getDefaultInstance()
+                               ->loadWatchedItem( $this->user, $this->linkTarget );
+                       if ( $item ) {
+                               $this->notificationTimestamp = $item->getNotificationTimestamp();
+                       } else {
+                               $this->notificationTimestamp = false;
+                       }
                }
+               return $this->notificationTimestamp;
        }
 
        /**
-        * Reset the notification timestamp of this entry
-        *
-        * @param bool $force Whether to force the write query to be executed even if the
-        *    page is not watched or the notification timestamp is already NULL.
-        * @param int $oldid The revision id being viewed. If not given or 0, latest revision is assumed.
+        * Back compat pre 1.27 with the WatchedItemStore introduction
+        * @todo remove in 1.28/9
+        * -------------------------------------------------
         */
-       public function resetNotificationTimestamp(
-               $force = '', $oldid = 0
-       ) {
-               // Only loggedin user can have a watchlist
-               if ( wfReadOnly() || $this->mUser->isAnon() || !$this->isAllowed( 'editmywatchlist' ) ) {
-                       return;
-               }
 
-               if ( $force != 'force' ) {
-                       $this->load();
-                       if ( !$this->watched || $this->timestamp === null ) {
-                               return;
+       /**
+        * @return Title
+        * @deprecated Internal class use only
+        */
+       public function getTitle() {
+               if ( !$this->title ) {
+                       if ( $this->linkTarget instanceof Title ) {
+                               $this->title = $this->linkTarget;
+                       } else {
+                               $this->title = Title::newFromLinkTarget( $this->linkTarget );
                        }
                }
+               return $this->title;
+       }
 
-               $title = $this->getTitle();
-               if ( !$oldid ) {
-                       // No oldid given, assuming latest revision; clear the timestamp.
-                       $notificationTimestamp = null;
-               } elseif ( !$title->getNextRevisionID( $oldid ) ) {
-                       // Oldid given and is the latest revision for this title; clear the timestamp.
-                       $notificationTimestamp = null;
-               } else {
-                       // See if the version marked as read is more recent than the one we're viewing.
-                       // Call load() if it wasn't called before due to $force.
-                       $this->load();
-
-                       if ( $this->timestamp === null ) {
-                               // This can only happen if $force is enabled.
-                               $notificationTimestamp = null;
-                       } else {
-                               // Oldid given and isn't the latest; update the timestamp.
-                               // This will result in no further notification emails being sent!
-                               $notificationTimestamp = Revision::getTimestampFromId( $title, $oldid );
-                               // We need to go one second to the future because of various strict comparisons
-                               // throughout the codebase
-                               $ts = new MWTimestamp( $notificationTimestamp );
-                               $ts->timestamp->add( new DateInterval( 'PT1S' ) );
-                               $notificationTimestamp = $ts->getTimestamp( TS_MW );
+       /**
+        * @deprecated since 1.27 Use the constructor, WatchedItemStore::getWatchedItem()
+        *             or WatchedItemStore::loadWatchedItem()
+        */
+       public static function fromUserTitle( $user, $title, $checkRights = User::CHECK_USER_RIGHTS ) {
+               // wfDeprecated( __METHOD__, '1.27' );
+               return new self( $user, $title, self::DEPRECATED_USAGE_TIMESTAMP, (bool)$checkRights );
+       }
 
-                               if ( $notificationTimestamp < $this->timestamp ) {
-                                       if ( $force != 'force' ) {
-                                               return;
-                                       } else {
-                                               // This is a little silly…
-                                               $notificationTimestamp = $this->timestamp;
-                                       }
-                               }
-                       }
+       /**
+        * @deprecated since 1.27 Use WatchedItemStore::resetNotificationTimestamp()
+        */
+       public function resetNotificationTimestamp( $force = '', $oldid = 0 ) {
+               // wfDeprecated( __METHOD__, '1.27' );
+               if ( $this->checkRights && !$this->user->isAllowed( 'editmywatchlist' ) ) {
+                       return;
                }
-
-               // If the page is watched by the user (or may be watched), update the timestamp
-               $job = new ActivityUpdateJob(
-                       $title,
-                       [
-                               'type'      => 'updateWatchlistNotification',
-                               'userid'    => $this->getUserId(),
-                               'notifTime' => $notificationTimestamp,
-                               'curTime'   => time()
-                       ]
+               WatchedItemStore::getDefaultInstance()->resetNotificationTimestamp(
+                       $this->user,
+                       $this->getTitle(),
+                       $force,
+                       $oldid
                );
-               // Try to run this post-send
-               DeferredUpdates::addCallableUpdate( function() use ( $job ) {
-                       $job->run();
-               } );
-
-               $this->timestamp = null;
        }
 
        /**
-        * @param WatchedItem[] $items
-        * @return bool
+        * @deprecated since 1.27 Use WatchedItemStore::addWatchBatch()
         */
        public static function batchAddWatch( array $items ) {
-
-               if ( wfReadOnly() ) {
-                       return false;
-               }
-
-               $rows = [];
-               foreach ( $items as $item ) {
-                       // Only loggedin user can have a watchlist
-                       if ( $item->mUser->isAnon() || !$item->isAllowed( 'editmywatchlist' ) ) {
+               // wfDeprecated( __METHOD__, '1.27' );
+               $userTargetCombinations = [];
+               /** @var WatchedItem $watchedItem */
+               foreach ( $items as $watchedItem ) {
+                       if ( $watchedItem->checkRights && !$watchedItem->getUser()->isAllowed( 'editmywatchlist' ) ) {
                                continue;
                        }
-                       $rows[] = [
-                               'wl_user' => $item->getUserId(),
-                               'wl_namespace' => MWNamespace::getSubject( $item->getTitleNs() ),
-                               'wl_title' => $item->getTitleDBkey(),
-                               'wl_notificationtimestamp' => null,
+                       $userTargetCombinations[] = [
+                               $watchedItem->getUser(),
+                               $watchedItem->getTitle()->getSubjectPage()
                        ];
-                       // Every single watched page needs now to be listed in watchlist;
-                       // namespace:page and namespace_talk:page need separate entries:
-                       $rows[] = [
-                               'wl_user' => $item->getUserId(),
-                               'wl_namespace' => MWNamespace::getTalk( $item->getTitleNs() ),
-                               'wl_title' => $item->getTitleDBkey(),
-                               'wl_notificationtimestamp' => null
+                       $userTargetCombinations[] = [
+                               $watchedItem->getUser(),
+                               $watchedItem->getTitle()->getTalkPage()
                        ];
-                       $item->watched = true;
-               }
-
-               if ( !$rows ) {
-                       return false;
-               }
-
-               $dbw = wfGetDB( 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' );
                }
-
-               return true;
+               $store = WatchedItemStore::getDefaultInstance();
+               return $store->addWatchBatch( $userTargetCombinations );
        }
 
        /**
-        * Given a title and user (assumes the object is setup), add the watch to the database.
+        * @deprecated since 1.27 Use User::addWatch()
         * @return bool
         */
        public function addWatch() {
-               return self::batchAddWatch( [ $this ] );
+               // wfDeprecated( __METHOD__, '1.27' );
+               $this->user->addWatch( $this->getTitle(), $this->checkRights );
+               return true;
        }
 
        /**
-        * Same as addWatch, only the opposite.
+        * @deprecated since 1.27 Use User::removeWatch()
         * @return bool
         */
        public function removeWatch() {
-
-               // Only loggedin user can have a watchlist
-               if ( wfReadOnly() || $this->mUser->isAnon() || !$this->isAllowed( 'editmywatchlist' ) ) {
+               // wfDeprecated( __METHOD__, '1.27' );
+               if ( $this->checkRights && !$this->user->isAllowed( 'editmywatchlist' ) ) {
                        return false;
                }
+               $this->user->removeWatch( $this->getTitle(), $this->checkRights );
+               return true;
+       }
 
-               $success = false;
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->delete( 'watchlist',
-                       [
-                               'wl_user' => $this->getUserId(),
-                               'wl_namespace' => MWNamespace::getSubject( $this->getTitleNs() ),
-                               'wl_title' => $this->getTitleDBkey(),
-                       ], __METHOD__
-               );
-               if ( $dbw->affectedRows() ) {
-                       $success = true;
-               }
-
-               # the following code compensates the new behavior, introduced by the
-               # enotif patch, that every single watched page needs now to be listed
-               # in watchlist namespace:page and namespace_talk:page had separate
-               # entries: clear them
-               $dbw->delete( 'watchlist',
-                       [
-                               'wl_user' => $this->getUserId(),
-                               'wl_namespace' => MWNamespace::getTalk( $this->getTitleNs() ),
-                               'wl_title' => $this->getTitleDBkey(),
-                       ], __METHOD__
-               );
-
-               if ( $dbw->affectedRows() ) {
-                       $success = true;
-               }
-
-               $this->watched = false;
-
-               return $success;
+       /**
+        * @deprecated since 1.27 Use User::isWatched()
+        * @return bool
+        */
+       public function isWatched() {
+               // wfDeprecated( __METHOD__, '1.27' );
+               return $this->user->isWatched( $this->getTitle(), $this->checkRights );
        }
 
        /**
-        * @deprecated since 1.27. See WatchedItemStore::duplicateEntry
-        *
-        * @param Title $oldTitle
-        * @param Title $newTitle
+        * @deprecated since 1.27 Use WatchedItemStore::duplicateAllAssociatedEntries()
         */
        public static function duplicateEntries( Title $oldTitle, Title $newTitle ) {
+               // wfDeprecated( __METHOD__, '1.27' );
                $store = WatchedItemStore::getDefaultInstance();
-               $store->duplicateEntry( $oldTitle->getSubjectPage(), $newTitle->getSubjectPage() );
-               $store->duplicateEntry( $oldTitle->getTalkPage(), $newTitle->getTalkPage() );
+               $store->duplicateAllAssociatedEntries( $oldTitle, $newTitle );
        }
 
 }
index 83a5856..1aed8e0 100644 (file)
@@ -1,8 +1,10 @@
 <?php
 
+use Wikimedia\Assert\Assert;
+
 /**
  * Storage layer class for WatchedItems.
- * Database interaction
+ * Database interaction.
  *
  * @author Addshore
  *
@@ -15,19 +17,465 @@ class WatchedItemStore {
         */
        private $loadBalancer;
 
-       public function __construct( LoadBalancer $loadBalancer ) {
+       /**
+        * @var BagOStuff
+        */
+       private $cache;
+
+       /**
+        * @var callable|null
+        */
+       private $deferredUpdatesAddCallableUpdateCallback;
+
+       /**
+        * @var callable|null
+        */
+       private $revisionGetTimestampFromIdCallback;
+
+       /**
+        * @var self|null
+        */
+       private static $instance;
+
+       public function __construct( LoadBalancer $loadBalancer, BagOStuff $cache ) {
                $this->loadBalancer = $loadBalancer;
+               $this->cache = $cache;
+               $this->deferredUpdatesAddCallableUpdateCallback = [ 'DeferredUpdates', 'addCallableUpdate' ];
+               $this->revisionGetTimestampFromIdCallback = [ 'Revision', 'getTimestampFromId' ];
+       }
+
+       /**
+        * Overrides the DeferredUpdates::addCallableUpdate callback
+        * 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
+        *
+        * @throws MWException
+        */
+       public function overrideDeferredUpdatesAddCallableUpdateCallback( $callback ) {
+               if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
+                       throw new MWException(
+                               'Cannot override DeferredUpdates::addCallableUpdate callback in operation.'
+                       );
+               }
+               Assert::parameterType( 'callable', $callback, '$callback' );
+               $this->deferredUpdatesAddCallableUpdateCallback = $callback;
+       }
+
+       /**
+        * Overrides the Revision::getTimestampFromId callback
+        * This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
+        *
+        * @param callable $callback
+        * @see Revision::getTimestampFromId for callback signiture
+        *
+        * @throws MWException
+        */
+       public function overrideRevisionGetTimestampFromIdCallback( $callback ) {
+               if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
+                       throw new MWException(
+                               'Cannot override Revision::getTimestampFromId callback in operation.'
+                       );
+               }
+               Assert::parameterType( 'callable', $callback, '$callback' );
+               $this->revisionGetTimestampFromIdCallback = $callback;
+       }
+
+       /**
+        * 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
+        *
+        * @throws MWException
+        */
+       public static function overrideDefaultInstance( WatchedItemStore $store ) {
+               if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
+                       throw new MWException(
+                               'Cannot override ' . __CLASS__ . 'default instance in operation.'
+                       );
+               }
+               self::$instance = $store;
        }
 
        /**
         * @return self
         */
        public static function getDefaultInstance() {
-               static $instance;
-               if ( !$instance ) {
-                       $instance = new self( wfGetLB() );
+               if ( !self::$instance ) {
+                       self::$instance = new self(
+                               wfGetLB(),
+                               new HashBagOStuff( [ 'maxKeys' => 100 ] )
+                       );
+               }
+               return self::$instance;
+       }
+
+       private function getCacheKey( User $user, LinkTarget $target ) {
+               return $this->cache->makeKey(
+                       (string)$target->getNamespace(),
+                       $target->getDBkey(),
+                       (string)$user->getId()
+               );
+       }
+
+       private function cache( WatchedItem $item ) {
+               $this->cache->set(
+                       $this->getCacheKey( $item->getUser(), $item->getLinkTarget() ),
+                       $item
+               );
+       }
+
+       private function uncache( User $user, LinkTarget $target ) {
+               $this->cache->delete( $this->getCacheKey( $user, $target ) );
+       }
+
+       /**
+        * @param User $user
+        * @param LinkTarget $target
+        *
+        * @return WatchedItem|null
+        */
+       private function getCached( User $user, LinkTarget $target ) {
+               return $this->cache->get( $this->getCacheKey( $user, $target ) );
+       }
+
+       /**
+        * Return an array of conditions to select or update the appropriate database
+        * row.
+        *
+        * @param User $user
+        * @param LinkTarget $target
+        *
+        * @return array
+        */
+       private function dbCond( User $user, LinkTarget $target ) {
+               return [
+                       'wl_user' => $user->getId(),
+                       'wl_namespace' => $target->getNamespace(),
+                       'wl_title' => $target->getDBkey(),
+               ];
+       }
+
+       /**
+        * Get an item (may be cached)
+        *
+        * @param User $user
+        * @param LinkTarget $target
+        *
+        * @return WatchedItem|false
+        */
+       public function getWatchedItem( User $user, LinkTarget $target ) {
+               $cached = $this->getCached( $user, $target );
+               if ( $cached ) {
+                       return $cached;
+               }
+               return $this->loadWatchedItem( $user, $target );
+       }
+
+       /**
+        * Loads an item from the db
+        *
+        * @param User $user
+        * @param LinkTarget $target
+        *
+        * @return WatchedItem|false
+        */
+       public function loadWatchedItem( User $user, LinkTarget $target ) {
+               // Only loggedin user can have a watchlist
+               if ( $user->isAnon() ) {
+                       return false;
+               }
+
+               $dbr = $this->loadBalancer->getConnection( DB_SLAVE, [ 'watchlist' ] );
+               $row = $dbr->selectRow(
+                       'watchlist',
+                       'wl_notificationtimestamp',
+                       $this->dbCond( $user, $target ),
+                       __METHOD__
+               );
+               $this->loadBalancer->reuseConnection( $dbr );
+
+               if ( !$row ) {
+                       return false;
+               }
+
+               $item = new WatchedItem(
+                       $user,
+                       $target,
+                       $row->wl_notificationtimestamp
+               );
+               $this->cache( $item );
+
+               return $item;
+       }
+
+       /**
+        * Must be called separately for Subject & Talk namespaces
+        *
+        * @param User $user
+        * @param LinkTarget $target
+        *
+        * @return bool
+        */
+       public function isWatched( User $user, LinkTarget $target ) {
+               return (bool)$this->getWatchedItem( $user, $target );
+       }
+
+       /**
+        * Must be called separately for Subject & Talk namespaces
+        *
+        * @param User $user
+        * @param LinkTarget $target
+        */
+       public function addWatch( User $user, LinkTarget $target ) {
+               $this->addWatchBatch( [ [ $user, $target ] ] );
+       }
+
+       /**
+        * @param array[] $userTargetCombinations array of arrays containing [0] => User [1] => LinkTarget
+        *
+        * @return bool success
+        */
+       public function addWatchBatch( array $userTargetCombinations ) {
+               if ( $this->loadBalancer->getReadOnlyReason() !== false ) {
+                       return false;
+               }
+
+               $rows = [];
+               foreach ( $userTargetCombinations as list( $user, $target ) ) {
+                       /**
+                        * @var User $user
+                        * @var LinkTarget $target
+                        */
+
+                       // Only loggedin user can have a watchlist
+                       if ( $user->isAnon() ) {
+                               continue;
+                       }
+                       $rows[] = [
+                               'wl_user' => $user->getId(),
+                               'wl_namespace' => $target->getNamespace(),
+                               'wl_title' => $target->getDBkey(),
+                               'wl_notificationtimestamp' => null,
+                       ];
+                       $this->uncache( $user, $target );
+               }
+
+               if ( !$rows ) {
+                       return false;
+               }
+
+               $dbw = $this->loadBalancer->getConnection( DB_MASTER, [ 'watchlist' ] );
+               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 );
+
+               return true;
+       }
+
+       /**
+        * Removes the an entry for the User watching the LinkTarget
+        * Must be called separately for Subject & Talk namespaces
+        *
+        * @param User $user
+        * @param LinkTarget $target
+        *
+        * @return bool success
+        * @throws DBUnexpectedError
+        * @throws MWException
+        */
+       public function removeWatch( User $user, LinkTarget $target ) {
+               // Only logged in user can have a watchlist
+               if ( $this->loadBalancer->getReadOnlyReason() !== false || $user->isAnon() ) {
+                       return false;
                }
-               return $instance;
+
+               $this->uncache( $user, $target );
+
+               $dbw = $this->loadBalancer->getConnection( DB_MASTER, [ 'watchlist' ] );
+               $dbw->delete( 'watchlist',
+                       [
+                               'wl_user' => $user->getId(),
+                               'wl_namespace' => $target->getNamespace(),
+                               'wl_title' => $target->getDBkey(),
+                       ], __METHOD__
+               );
+               $success = (bool)$dbw->affectedRows();
+               $this->loadBalancer->reuseConnection( $dbw );
+
+               return $success;
+       }
+
+       /**
+        * @param User $editor The editor that triggered the update. Their notification
+        *  timestamp will not be updated(they have already seen it)
+        * @param LinkTarget $target The target to update timestamps for
+        * @param string $timestamp Set the update timestamp to this value
+        *
+        * @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' ] );
+               $res = $dbw->select( [ 'watchlist' ],
+                       [ 'wl_user' ],
+                       [
+                               'wl_user != ' . intval( $editor->getId() ),
+                               'wl_namespace' => $target->getNamespace(),
+                               'wl_title' => $target->getDBkey(),
+                               'wl_notificationtimestamp IS NULL',
+                       ], __METHOD__
+               );
+
+               $watchers = [];
+               foreach ( $res as $row ) {
+                       $watchers[] = intval( $row->wl_user );
+               }
+
+               if ( $watchers ) {
+                       // Update wl_notificationtimestamp for all watching users except the editor
+                       $fname = __METHOD__;
+                       $dbw->onTransactionIdle(
+                               function () use ( $dbw, $timestamp, $watchers, $target, $fname ) {
+                                       $dbw->update( 'watchlist',
+                                               [ /* SET */
+                                                       'wl_notificationtimestamp' => $dbw->timestamp( $timestamp )
+                                               ], [ /* WHERE */
+                                                       'wl_user' => $watchers,
+                                                       'wl_namespace' => $target->getNamespace(),
+                                                       'wl_title' => $target->getDBkey(),
+                                               ], $fname
+                                       );
+                               }
+                       );
+               }
+
+               $this->loadBalancer->reuseConnection( $dbw );
+
+               return $watchers;
+       }
+
+       /**
+        * Reset the notification timestamp of this entry
+        *
+        * @param User $user
+        * @param Title $title
+        * @param string $force Whether to force the write query to be executed even if the
+        *    page is not watched or the notification timestamp is already NULL.
+        *    'force' in order to force
+        * @param int $oldid The revision id being viewed. If not given or 0, latest revision is assumed.
+        *
+        * @return bool success
+        */
+       public function resetNotificationTimestamp( User $user, Title $title, $force = '', $oldid = 0 ) {
+               // Only loggedin user can have a watchlist
+               if ( $this->loadBalancer->getReadOnlyReason() !== false || $user->isAnon() ) {
+                       return false;
+               }
+
+               $item = null;
+               if ( $force != 'force' ) {
+                       $item = $this->loadWatchedItem( $user, $title );
+                       if ( !$item || $item->getNotificationTimestamp() === null ) {
+                               return false;
+                       }
+               }
+
+               // If the page is watched by the user (or may be watched), update the timestamp
+               $job = new ActivityUpdateJob(
+                       $title,
+                       [
+                               'type'      => 'updateWatchlistNotification',
+                               'userid'    => $user->getId(),
+                               'notifTime' => $this->getNotificationTimestamp( $user, $title, $item, $force, $oldid ),
+                               'curTime'   => time()
+                       ]
+               );
+
+               // Try to run this post-send
+               // Calls DeferredUpdates::addCallableUpdate in normal operation
+               call_user_func(
+                       $this->deferredUpdatesAddCallableUpdateCallback,
+                       function() use ( $job ) {
+                               $job->run();
+                       }
+               );
+
+               $this->uncache( $user, $title );
+
+               return true;
+       }
+
+       private function getNotificationTimestamp( User $user, Title $title, $item, $force, $oldid ) {
+               if ( !$oldid ) {
+                       // No oldid given, assuming latest revision; clear the timestamp.
+                       return null;
+               }
+
+               if ( !$title->getNextRevisionID( $oldid ) ) {
+                       // Oldid given and is the latest revision for this title; clear the timestamp.
+                       return null;
+               }
+
+               if ( $item === null ) {
+                       $item = $this->loadWatchedItem( $user, $title );
+               }
+
+               if ( !$item ) {
+                       // This can only happen if $force is enabled.
+                       return null;
+               }
+
+               // Oldid given and isn't the latest; update the timestamp.
+               // This will result in no further notification emails being sent!
+               // Calls Revision::getTimestampFromId in normal operation
+               $notificationTimestamp = call_user_func(
+                       $this->revisionGetTimestampFromIdCallback,
+                       $title,
+                       $oldid
+               );
+
+               // We need to go one second to the future because of various strict comparisons
+               // throughout the codebase
+               $ts = new MWTimestamp( $notificationTimestamp );
+               $ts->timestamp->add( new DateInterval( 'PT1S' ) );
+               $notificationTimestamp = $ts->getTimestamp( TS_MW );
+
+               if ( $notificationTimestamp < $item->getNotificationTimestamp() ) {
+                       if ( $force != 'force' ) {
+                               return false;
+                       } else {
+                               // This is a little silly…
+                               return $item->getNotificationTimestamp();
+                       }
+               }
+
+               return $notificationTimestamp;
+       }
+
+       /**
+        * Check if the given title already is watched by the user, and if so
+        * add a watch for the new title.
+        *
+        * To be used for page renames and such.
+        *
+        * @param LinkTarget $oldTarget
+        * @param LinkTarget $newTarget
+        */
+       public function duplicateAllAssociatedEntries( LinkTarget $oldTarget, LinkTarget $newTarget ) {
+               if ( !$oldTarget instanceof Title ) {
+                       $oldTarget = Title::newFromLinkTarget( $oldTarget );
+               }
+               if ( !$newTarget instanceof Title ) {
+                       $newTarget = Title::newFromLinkTarget( $newTarget );
+               }
+
+               $this->duplicateEntry( $oldTarget->getSubjectPage(), $newTarget->getSubjectPage() );
+               $this->duplicateEntry( $oldTarget->getTalkPage(), $newTarget->getTalkPage() );
        }
 
        /**
index ce5cb96..812a320 100644 (file)
@@ -719,13 +719,13 @@ class WebRequest {
        }
 
        /**
-        * Return the path and query string portion of the request URI.
+        * Return the path and query string portion of the main request URI.
         * This will be suitable for use as a relative link in HTML output.
         *
         * @throws MWException
         * @return string
         */
-       public function getRequestURL() {
+       public static function getGlobalRequestURL() {
                if ( isset( $_SERVER['REQUEST_URI'] ) && strlen( $_SERVER['REQUEST_URI'] ) ) {
                        $base = $_SERVER['REQUEST_URI'];
                } elseif ( isset( $_SERVER['HTTP_X_ORIGINAL_URL'] )
@@ -762,6 +762,17 @@ class WebRequest {
                }
        }
 
+       /**
+        * Return the path and query string portion of the request URI.
+        * This will be suitable for use as a relative link in HTML output.
+        *
+        * @throws MWException
+        * @return string
+        */
+       public function getRequestURL() {
+               return self::getGlobalRequestURL();
+       }
+
        /**
         * Return the request URI with the canonical service and hostname, path,
         * and query string. This will be suitable for use as an absolute link
index c7d0a5b..458c207 100644 (file)
@@ -179,6 +179,16 @@ class WebResponse {
        public function clearCookie( $name, $options = [] ) {
                $this->setCookie( $name, '', time() - 31536000 /* 1 year */, $options );
        }
+
+       /**
+        * Checks whether this request is performing cookie operations
+        *
+        * @return bool
+        * @since 1.27
+        */
+       public function hasCookies() {
+               return (bool)self::$setCookies;
+       }
 }
 
 /**
index 6f1f3e8..5ec10e6 100644 (file)
@@ -682,7 +682,7 @@ class HistoryPager extends ReverseChronologicalPager {
                $s .= $dirmark;
 
                if ( $rev->isMinor() ) {
-                       $s .= ' ' . ChangesList::flag( 'minor' );
+                       $s .= ' ' . ChangesList::flag( 'minor', $this->getContext() );
                }
 
                # Sometimes rev_len isn't populated
index db8c82d..d002da8 100644 (file)
@@ -103,7 +103,7 @@ class RollbackAction extends FormlessAction {
                        ->parseAsBlock() );
 
                if ( $user->getBoolOption( 'watchrollback' ) ) {
-                       $user->addWatch( $this->page->getTitle(), WatchedItem::IGNORE_USER_RIGHTS );
+                       $user->addWatch( $this->page->getTitle(), User::IGNORE_USER_RIGHTS );
                }
 
                $this->getOutput()->returnToMain( false, $this->getTitle() );
index 8f13456..890740f 100644 (file)
@@ -82,12 +82,12 @@ class WatchAction extends FormAction {
         */
        public static function doWatchOrUnwatch( $watch, Title $title, User $user ) {
                if ( $user->isLoggedIn() &&
-                       $user->isWatched( $title, WatchedItem::IGNORE_USER_RIGHTS ) != $watch
+                       $user->isWatched( $title, User::IGNORE_USER_RIGHTS ) != $watch
                ) {
                        // If the user doesn't have 'editmywatchlist', we still want to
                        // allow them to add but not remove items via edits and such.
                        if ( $watch ) {
-                               return self::doWatch( $title, $user, WatchedItem::IGNORE_USER_RIGHTS );
+                               return self::doWatch( $title, $user, User::IGNORE_USER_RIGHTS );
                        } else {
                                return self::doUnwatch( $title, $user );
                        }
@@ -101,15 +101,16 @@ class WatchAction extends FormAction {
         * @since 1.22 Returns Status, $checkRights parameter added
         * @param Title $title Page to watch/unwatch
         * @param User $user User who is watching/unwatching
-        * @param int $checkRights Passed through to $user->addWatch()
+        * @param bool $checkRights Passed through to $user->addWatch()
+        *     Pass User::CHECK_USER_RIGHTS or User::IGNORE_USER_RIGHTS.
         * @return Status
         */
-       public static function doWatch( Title $title, User $user,
-               $checkRights = WatchedItem::CHECK_USER_RIGHTS
+       public static function doWatch(
+               Title $title,
+               User $user,
+               $checkRights = User::CHECK_USER_RIGHTS
        ) {
-               if ( $checkRights !== WatchedItem::IGNORE_USER_RIGHTS &&
-                       !$user->isAllowed( 'editmywatchlist' )
-               ) {
+               if ( $checkRights && !$user->isAllowed( 'editmywatchlist' ) ) {
                        return User::newFatalPermissionDeniedStatus( 'editmywatchlist' );
                }
 
index 76fae6b..7944167 100644 (file)
@@ -302,7 +302,7 @@ abstract class ApiBase extends ContextSource {
                                        $qs = $k;
                                        $msg = self::escapeWikiText( $v );
                                        if ( is_array( $msg ) ) {
-                                               $msg = join( " ", $msg );
+                                               $msg = implode( ' ', $msg );
                                        }
                                }
 
@@ -547,13 +547,13 @@ abstract class ApiBase extends ContextSource {
                        $parent = $module;
                        $manager = $parent->getModuleManager();
                        if ( $manager === null ) {
-                               $errorPath = join( '+', array_slice( $parts, 0, $i ) );
+                               $errorPath = implode( '+', array_slice( $parts, 0, $i ) );
                                $this->dieUsage( "The module \"$errorPath\" has no submodules", 'badmodule' );
                        }
                        $module = $manager->getModule( $parts[$i] );
 
                        if ( $module === null ) {
-                               $errorPath = $i ? join( '+', array_slice( $parts, 0, $i ) ) : $parent->getModuleName();
+                               $errorPath = $i ? implode( '+', array_slice( $parts, 0, $i ) ) : $parent->getModuleName();
                                $this->dieUsage(
                                        "The module \"$errorPath\" does not have a submodule \"{$parts[$i]}\"",
                                        'badmodule'
@@ -711,7 +711,7 @@ abstract class ApiBase extends ContextSource {
                $p = $this->getModulePrefix();
 
                $intersection = array_intersect( array_keys( array_filter( $params,
-                       [ $this, "parameterNotEmpty" ] ) ), $required );
+                       [ $this, 'parameterNotEmpty' ] ) ), $required );
 
                if ( count( $intersection ) > 1 ) {
                        $this->dieUsage(
@@ -737,7 +737,7 @@ abstract class ApiBase extends ContextSource {
                $p = $this->getModulePrefix();
 
                $intersection = array_intersect( array_keys( array_filter( $params,
-                       [ $this, "parameterNotEmpty" ] ) ), $required );
+                       [ $this, 'parameterNotEmpty' ] ) ), $required );
 
                if ( count( $intersection ) > 1 ) {
                        $this->dieUsage(
@@ -760,7 +760,7 @@ abstract class ApiBase extends ContextSource {
                $p = $this->getModulePrefix();
 
                $intersection = array_intersect(
-                       array_keys( array_filter( $params, [ $this, "parameterNotEmpty" ] ) ),
+                       array_keys( array_filter( $params, [ $this, 'parameterNotEmpty' ] ) ),
                        $required
                );
 
@@ -830,7 +830,7 @@ abstract class ApiBase extends ContextSource {
         */
        protected function getWatchlistValue( $watchlist, $titleObj, $userOption = null ) {
 
-               $userWatching = $this->getUser()->isWatched( $titleObj, WatchedItem::IGNORE_USER_RIGHTS );
+               $userWatching = $this->getUser()->isWatched( $titleObj, User::IGNORE_USER_RIGHTS );
 
                switch ( $watchlist ) {
                        case 'watch':
@@ -917,7 +917,7 @@ abstract class ApiBase extends ContextSource {
                                ApiBase::dieDebug(
                                        __METHOD__,
                                        "Boolean param $encParamName's default is set to '$default'. " .
-                                               "Boolean parameters must default to false."
+                                               'Boolean parameters must default to false.'
                                );
                        }
 
@@ -942,8 +942,8 @@ abstract class ApiBase extends ContextSource {
                                if ( $value !== null ) {
                                        $this->dieUsage(
                                                "File upload param $encParamName is not a file upload; " .
-                                                       "be sure to use multipart/form-data for your POST and include " .
-                                                       "a filename in the Content-Disposition header.",
+                                                       'be sure to use multipart/form-data for your POST and include ' .
+                                                       'a filename in the Content-Disposition header.',
                                                "badupload_{$encParamName}"
                                        );
                                }
@@ -1157,7 +1157,7 @@ abstract class ApiBase extends ContextSource {
                        if ( count( $unknown ) ) {
                                if ( $allowMultiple ) {
                                        $s = count( $unknown ) > 1 ? 's' : '';
-                                       $vals = implode( ", ", $unknown );
+                                       $vals = implode( ', ', $unknown );
                                        $this->setWarning( "Unrecognized value$s for parameter '$valueName': $vals" );
                                } else {
                                        $this->dieUsage(
@@ -1615,15 +1615,15 @@ abstract class ApiBase extends ContextSource {
                ],
                'badaccess-group0' => [
                        'code' => 'permissiondenied',
-                       'info' => "Permission denied"
+                       'info' => 'Permission denied'
                ], // Generic permission denied message
                'badaccess-groups' => [
                        'code' => 'permissiondenied',
-                       'info' => "Permission denied"
+                       'info' => 'Permission denied'
                ],
                'titleprotected' => [
                        'code' => 'protectedtitle',
-                       'info' => "This title has been protected from creation"
+                       'info' => 'This title has been protected from creation'
                ],
                'nocreate-loggedin' => [
                        'code' => 'cantcreate',
@@ -1643,15 +1643,15 @@ abstract class ApiBase extends ContextSource {
                ],
                'confirmedittext' => [
                        'code' => 'confirmemail',
-                       'info' => "You must confirm your email address before you can edit"
+                       'info' => 'You must confirm your email address before you can edit'
                ],
                'blockedtext' => [
                        'code' => 'blocked',
-                       'info' => "You have been blocked from editing"
+                       'info' => 'You have been blocked from editing'
                ],
                'autoblockedtext' => [
                        'code' => 'autoblocked',
-                       'info' => "Your IP address has been blocked automatically, because it was used by a blocked user"
+                       'info' => 'Your IP address has been blocked automatically, because it was used by a blocked user'
                ],
 
                // Miscellaneous interface messages
@@ -1661,19 +1661,19 @@ abstract class ApiBase extends ContextSource {
                ],
                'alreadyrolled' => [
                        'code' => 'alreadyrolled',
-                       'info' => "The page you tried to rollback was already rolled back"
+                       'info' => 'The page you tried to rollback was already rolled back'
                ],
                'cantrollback' => [
                        'code' => 'onlyauthor',
-                       'info' => "The page you tried to rollback only has one author"
+                       'info' => 'The page you tried to rollback only has one author'
                ],
                'readonlytext' => [
                        'code' => 'readonly',
-                       'info' => "The wiki is currently in read-only mode"
+                       'info' => 'The wiki is currently in read-only mode'
                ],
                'sessionfailure' => [
                        'code' => 'badtoken',
-                       'info' => "Invalid token" ],
+                       'info' => 'Invalid token' ],
                'cannotdelete' => [
                        'code' => 'cantdelete',
                        'info' => "Couldn't delete \"\$1\". Maybe it was deleted already by someone else"
@@ -1686,11 +1686,11 @@ abstract class ApiBase extends ContextSource {
                ],
                'immobile_namespace' => [
                        'code' => 'immobilenamespace',
-                       'info' => "You tried to move pages from or to a namespace that is protected from moving"
+                       'info' => 'You tried to move pages from or to a namespace that is protected from moving'
                ],
                'articleexists' => [
                        'code' => 'articleexists',
-                       'info' => "The destination article already exists and is not a redirect to the source article"
+                       'info' => 'The destination article already exists and is not a redirect to the source article'
                ],
                'protectedpage' => [
                        'code' => 'protectedpage',
@@ -1698,11 +1698,11 @@ abstract class ApiBase extends ContextSource {
                ],
                'hookaborted' => [
                        'code' => 'hookaborted',
-                       'info' => "The modification you tried to make was aborted by an extension hook"
+                       'info' => 'The modification you tried to make was aborted by an extension hook'
                ],
                'cantmove-titleprotected' => [
                        'code' => 'protectedtitle',
-                       'info' => "The destination article has been protected from creation"
+                       'info' => 'The destination article has been protected from creation'
                ],
                'imagenocrossnamespace' => [
                        'code' => 'nonfilenamespace',
@@ -1714,20 +1714,20 @@ abstract class ApiBase extends ContextSource {
                ],
                // 'badarticleerror' => shouldn't happen
                // 'badtitletext' => shouldn't happen
-               'ip_range_invalid' => [ 'code' => 'invalidrange', 'info' => "Invalid IP range" ],
+               'ip_range_invalid' => [ 'code' => 'invalidrange', 'info' => 'Invalid IP range' ],
                'range_block_disabled' => [
                        'code' => 'rangedisabled',
-                       'info' => "Blocking IP ranges has been disabled"
+                       'info' => 'Blocking IP ranges has been disabled'
                ],
                'nosuchusershort' => [
                        'code' => 'nosuchuser',
                        'info' => "The user you specified doesn't exist"
                ],
-               'badipaddress' => [ 'code' => 'invalidip', 'info' => "Invalid IP address specified" ],
-               'ipb_expiry_invalid' => [ 'code' => 'invalidexpiry', 'info' => "Invalid expiry time" ],
+               'badipaddress' => [ 'code' => 'invalidip', 'info' => 'Invalid IP address specified' ],
+               'ipb_expiry_invalid' => [ 'code' => 'invalidexpiry', 'info' => 'Invalid expiry time' ],
                'ipb_already_blocked' => [
                        'code' => 'alreadyblocked',
-                       'info' => "The user you tried to block was already blocked"
+                       'info' => 'The user you tried to block was already blocked'
                ],
                'ipb_blocked_as_range' => [
                        'code' => 'blockedasrange',
@@ -1735,11 +1735,11 @@ abstract class ApiBase extends ContextSource {
                ],
                'ipb_cant_unblock' => [
                        'code' => 'cantunblock',
-                       'info' => "The block you specified was not found. It may have been unblocked already"
+                       'info' => 'The block you specified was not found. It may have been unblocked already'
                ],
                'mailnologin' => [
                        'code' => 'cantsend',
-                       'info' => "You are not logged in, you do not have a confirmed email address, or you are not allowed to send email to other users, so you cannot send email"
+                       'info' => 'You are not logged in, you do not have a confirmed email address, or you are not allowed to send email to other users, so you cannot send email'
                ],
                'ipbblocked' => [
                        'code' => 'ipbblocked',
@@ -1751,23 +1751,23 @@ abstract class ApiBase extends ContextSource {
                ],
                'usermaildisabled' => [
                        'code' => 'usermaildisabled',
-                       'info' => "User email has been disabled"
+                       'info' => 'User email has been disabled'
                ],
                'blockedemailuser' => [
                        'code' => 'blockedfrommail',
-                       'info' => "You have been blocked from sending email"
+                       'info' => 'You have been blocked from sending email'
                ],
                'notarget' => [
                        'code' => 'notarget',
-                       'info' => "You have not specified a valid target for this action"
+                       'info' => 'You have not specified a valid target for this action'
                ],
                'noemail' => [
                        'code' => 'noemail',
-                       'info' => "The user has not specified a valid email address, or has chosen not to receive email from other users"
+                       'info' => 'The user has not specified a valid email address, or has chosen not to receive email from other users'
                ],
                'rcpatroldisabled' => [
                        'code' => 'patroldisabled',
-                       'info' => "Patrolling is disabled on this wiki"
+                       'info' => 'Patrolling is disabled on this wiki'
                ],
                'markedaspatrollederror-noautopatrol' => [
                        'code' => 'noautopatrol',
@@ -1804,7 +1804,7 @@ abstract class ApiBase extends ContextSource {
                // API-specific messages
                'readrequired' => [
                        'code' => 'readapidenied',
-                       'info' => "You need read permission to use this module"
+                       'info' => 'You need read permission to use this module'
                ],
                'writedisabled' => [
                        'code' => 'noapiwrite',
@@ -1843,7 +1843,7 @@ abstract class ApiBase extends ContextSource {
                ],
                'unblock-notarget' => [
                        'code' => 'notarget',
-                       'info' => "Either the id or the user parameter must be set"
+                       'info' => 'Either the id or the user parameter must be set'
                ],
                'unblock-idanduser' => [
                        'code' => 'idanduser',
@@ -1863,7 +1863,7 @@ abstract class ApiBase extends ContextSource {
                ],
                'createonly-exists' => [
                        'code' => 'articleexists',
-                       'info' => "The article you tried to create has been created already"
+                       'info' => 'The article you tried to create has been created already'
                ],
                'nocreate-missing' => [
                        'code' => 'missingtitle',
@@ -1992,17 +1992,17 @@ abstract class ApiBase extends ContextSource {
                'noedit' => [ 'code' => 'noedit', 'info' => "You don't have permission to edit pages" ],
                'wasdeleted' => [
                        'code' => 'pagedeleted',
-                       'info' => "The page has been deleted since you fetched its timestamp"
+                       'info' => 'The page has been deleted since you fetched its timestamp'
                ],
                'blankpage' => [
                        'code' => 'emptypage',
-                       'info' => "Creating new, empty pages is not allowed"
+                       'info' => 'Creating new, empty pages is not allowed'
                ],
-               'editconflict' => [ 'code' => 'editconflict', 'info' => "Edit conflict detected" ],
-               'hashcheckfailed' => [ 'code' => 'badmd5', 'info' => "The supplied MD5 hash was incorrect" ],
+               'editconflict' => [ 'code' => 'editconflict', 'info' => 'Edit conflict detected' ],
+               'hashcheckfailed' => [ 'code' => 'badmd5', 'info' => 'The supplied MD5 hash was incorrect' ],
                'missingtext' => [
                        'code' => 'notext',
-                       'info' => "One of the text, appendtext, prependtext and undo parameters must be set"
+                       'info' => 'One of the text, appendtext, prependtext and undo parameters must be set'
                ],
                'emptynewsection' => [
                        'code' => 'emptynewsection',
@@ -2024,13 +2024,13 @@ abstract class ApiBase extends ContextSource {
                // Messages from WikiPage::doEit(]
                'edit-hook-aborted' => [
                        'code' => 'edit-hook-aborted',
-                       'info' => "Your edit was aborted by an ArticleSave hook"
+                       'info' => 'Your edit was aborted by an ArticleSave hook'
                ],
                'edit-gone-missing' => [
                        'code' => 'edit-gone-missing',
                        'info' => "The page you tried to edit doesn't seem to exist anymore"
                ],
-               'edit-conflict' => [ 'code' => 'editconflict', 'info' => "Edit conflict detected" ],
+               'edit-conflict' => [ 'code' => 'editconflict', 'info' => 'Edit conflict detected' ],
                'edit-already-exists' => [
                        'code' => 'edit-already-exists',
                        'info' => 'It seems the page you tried to create already exist'
@@ -2223,7 +2223,7 @@ abstract class ApiBase extends ContextSource {
                Hooks::run( 'APIGetDescription', [ &$this, &$desc ] );
                $desc = self::escapeWikiText( $desc );
                if ( is_array( $desc ) ) {
-                       $desc = join( "\n", $desc );
+                       $desc = implode( "\n", $desc );
                } else {
                        $desc = (string)$desc;
                }
@@ -2309,7 +2309,7 @@ abstract class ApiBase extends ContextSource {
                                        }
                                        return $line;
                                }, $d );
-                               $d = join( ' ', $d );
+                               $d = implode( ' ', $d );
                        }
 
                        if ( isset( $settings[ApiBase::PARAM_HELP_MSG] ) ) {
@@ -2323,18 +2323,18 @@ abstract class ApiBase extends ContextSource {
                        $msg = ApiBase::makeMessage( $msg, $this->getContext(),
                                [ $prefix, $param, $name, $path ] );
                        if ( !$msg ) {
-                               $this->dieDebug( __METHOD__,
+                               self::dieDebug( __METHOD__,
                                        'Value in ApiBase::PARAM_HELP_MSG is not valid' );
                        }
                        $msgs[$param] = [ $msg ];
 
                        if ( isset( $settings[ApiBase::PARAM_HELP_MSG_PER_VALUE] ) ) {
                                if ( !is_array( $settings[ApiBase::PARAM_HELP_MSG_PER_VALUE] ) ) {
-                                       $this->dieDebug( __METHOD__,
+                                       self::dieDebug( __METHOD__,
                                                'ApiBase::PARAM_HELP_MSG_PER_VALUE is not valid' );
                                }
                                if ( !is_array( $settings[ApiBase::PARAM_TYPE] ) ) {
-                                       $this->dieDebug( __METHOD__,
+                                       self::dieDebug( __METHOD__,
                                                'ApiBase::PARAM_HELP_MSG_PER_VALUE may only be used when ' .
                                                'ApiBase::PARAM_TYPE is an array' );
                                }
@@ -2356,7 +2356,7 @@ abstract class ApiBase extends ContextSource {
                                                );
                                                $msgs[$param][] = $m->setContext( $this->getContext() );
                                        } else {
-                                               $this->dieDebug( __METHOD__,
+                                               self::dieDebug( __METHOD__,
                                                        "Value in ApiBase::PARAM_HELP_MSG_PER_VALUE for $value is not valid" );
                                        }
                                }
@@ -2364,7 +2364,7 @@ abstract class ApiBase extends ContextSource {
 
                        if ( isset( $settings[ApiBase::PARAM_HELP_MSG_APPEND] ) ) {
                                if ( !is_array( $settings[ApiBase::PARAM_HELP_MSG_APPEND] ) ) {
-                                       $this->dieDebug( __METHOD__,
+                                       self::dieDebug( __METHOD__,
                                                'Value for ApiBase::PARAM_HELP_MSG_APPEND is not an array' );
                                }
                                foreach ( $settings[ApiBase::PARAM_HELP_MSG_APPEND] as $m ) {
@@ -2373,7 +2373,7 @@ abstract class ApiBase extends ContextSource {
                                        if ( $m ) {
                                                $msgs[$param][] = $m;
                                        } else {
-                                               $this->dieDebug( __METHOD__,
+                                               self::dieDebug( __METHOD__,
                                                        'Value in ApiBase::PARAM_HELP_MSG_APPEND is not valid' );
                                        }
                                }
@@ -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
         *
@@ -2740,7 +2623,7 @@ abstract class ApiBase extends ContextSource {
                                                $examples
                                        ];
                                }
-                               $msg .= "Example" . ( count( $examples ) > 1 ? 's' : '' ) . ":\n";
+                               $msg .= 'Example' . ( count( $examples ) > 1 ? 's' : '' ) . ":\n";
                                foreach ( $examples as $k => $v ) {
                                        if ( is_numeric( $k ) ) {
                                                $msg .= "  $v\n";
@@ -2750,7 +2633,7 @@ abstract class ApiBase extends ContextSource {
                                                } else {
                                                        $msgExample = "  $v";
                                                }
-                                               $msgExample .= ":";
+                                               $msgExample .= ':';
                                                $msg .= wordwrap( $msgExample, 100, "\n" ) . "\n    $k\n";
                                        }
                                }
@@ -2766,7 +2649,7 @@ abstract class ApiBase extends ContextSource {
         * @return string
         */
        private function indentExampleText( $item ) {
-               return "  " . $item;
+               return '  ' . $item;
        }
 
        /**
@@ -2849,7 +2732,7 @@ abstract class ApiBase extends ContextSource {
                                if ( isset( $paramSettings[self::PARAM_REQUIRED] )
                                        && $paramSettings[self::PARAM_REQUIRED]
                                ) {
-                                       $desc .= $paramPrefix . "This parameter is required";
+                                       $desc .= $paramPrefix . 'This parameter is required';
                                }
 
                                $type = isset( $paramSettings[self::PARAM_TYPE] )
@@ -2925,7 +2808,7 @@ abstract class ApiBase extends ContextSource {
                                                                }
                                                                break;
                                                        case 'upload':
-                                                               $desc .= $paramPrefix . "Must be posted as a file upload using multipart/form-data";
+                                                               $desc .= $paramPrefix . 'Must be posted as a file upload using multipart/form-data';
                                                                break;
                                                }
                                        }
@@ -2939,8 +2822,8 @@ abstract class ApiBase extends ContextSource {
                                                if ( !$isArray
                                                        || $isArray && count( $type ) > self::LIMIT_SML1
                                                ) {
-                                                       $desc .= $paramPrefix . "Maximum number of values " .
-                                                               self::LIMIT_SML1 . " (" . self::LIMIT_SML2 . " for bots)";
+                                                       $desc .= $paramPrefix . 'Maximum number of values ' .
+                                                               self::LIMIT_SML1 . ' (' . self::LIMIT_SML2 . ' for bots)';
                                                }
                                        }
                                }
index 25407bf..8f1bd19 100644 (file)
@@ -137,7 +137,7 @@ class ApiContinuationManager {
                }
                $paramName = $module->encodeParamName( $paramName );
                if ( is_array( $paramValue ) ) {
-                       $paramValue = join( '|', $paramValue );
+                       $paramValue = implode( '|', $paramValue );
                }
                $this->continuationData[$name][$paramName] = $paramValue;
        }
@@ -152,7 +152,7 @@ class ApiContinuationManager {
                $name = $module->getModuleName();
                $paramName = $module->encodeParamName( $paramName );
                if ( is_array( $paramValue ) ) {
-                       $paramValue = join( '|', $paramValue );
+                       $paramValue = implode( '|', $paramValue );
                }
                $this->generatorContinuationData[$name][$paramName] = $paramValue;
        }
@@ -193,7 +193,7 @@ class ApiContinuationManager {
                                $data += $kvp;
                        }
                        $data += $this->generatorParams;
-                       $generatorKeys = join( '|', array_keys( $this->generatorParams ) );
+                       $generatorKeys = implode( '|', array_keys( $this->generatorParams ) );
                } elseif ( $this->generatorContinuationData ) {
                        // All the generator-using modules are complete, but the
                        // generator isn't. Continue the generator and restart the
@@ -204,7 +204,7 @@ class ApiContinuationManager {
                        }
                        $data += $generatorParams;
                        $finishedModules = array_diff( $finishedModules, $this->generatedModules );
-                       $generatorKeys = join( '|', array_keys( $generatorParams ) );
+                       $generatorKeys = implode( '|', array_keys( $generatorParams ) );
                        $batchcomplete = true;
                } else {
                        // Generator and prop modules are all done. Mark it so.
@@ -215,7 +215,7 @@ class ApiContinuationManager {
                // Set 'continue' if any continuation data is set or if the generator
                // still needs to run
                if ( $data || $generatorKeys !== '-' ) {
-                       $data['continue'] = $generatorKeys . '||' . join( '|', $finishedModules );
+                       $data['continue'] = $generatorKeys . '||' . implode( '|', $finishedModules );
                }
 
                return [ $data, $batchcomplete ];
index f32bab0..08aba94 100644 (file)
@@ -335,7 +335,7 @@ class ApiEditPage extends ApiBase {
                        $section = $params['section'];
                        if ( !preg_match( '/^((T-)?\d+|new)$/', $section ) ) {
                                $this->dieUsage( "The section parameter must be a valid section id or 'new'",
-                                       "invalidsection" );
+                                       'invalidsection' );
                        }
                        $content = $pageObj->getContent();
                        if ( $section !== '0' && $section != 'new'
index 6611a09..286fe88 100644 (file)
@@ -158,7 +158,7 @@ class ApiExpandTemplates extends ApiBase {
                                        !isset( $prop['jsconfigvars'] ) && !isset( $prop['encodedjsconfigvars'] ) ) {
                                        $this->setWarning( "Property 'modules' was set but not 'jsconfigvars' " .
                                                "or 'encodedjsconfigvars'. Configuration variables are necessary " .
-                                               "for proper module usage." );
+                                               'for proper module usage.' );
                                }
                        }
                }
index dacf828..e28b068 100644 (file)
@@ -173,7 +173,7 @@ class ApiFeedContributions extends ApiBase {
 
                        return '<p>' . htmlspecialchars( $revision->getUserText() ) . $msg .
                                htmlspecialchars( FeedItem::stripComment( $revision->getComment() ) ) .
-                               "</p>\n<hr />\n<div>" . $html . "</div>";
+                               "</p>\n<hr />\n<div>" . $html . '</div>';
                }
 
                return '';
index 7c203d9..c826bba 100644 (file)
@@ -151,7 +151,7 @@ abstract class ApiFormatBase extends ApiBase {
         * Initialize the printer function and prepare the output headers.
         * @param bool $unused Always false since 1.25
         */
-       function initPrinter( $unused = false ) {
+       public function initPrinter( $unused = false ) {
                if ( $this->mDisabled ) {
                        return;
                }
index be9b6d0..a45dbeb 100644 (file)
@@ -266,7 +266,7 @@ class ApiFormatXml extends ApiFormatBase {
                );
        }
 
-       function addXslt() {
+       protected function addXslt() {
                $nt = Title::newFromText( $this->mXslt );
                if ( is_null( $nt ) || !$nt->exists() ) {
                        $this->setWarning( 'Invalid or non-existent stylesheet specified' );
index 349a34d..f2d6329 100644 (file)
@@ -268,7 +268,7 @@ class ApiHelp extends ApiBase {
                                        'level' => $level,
                                        'anchor' => $anchor,
                                        'line' => $header,
-                                       'number' => join( '.', $tocnumber ),
+                                       'number' => implode( '.', $tocnumber ),
                                        'index' => false,
                                ];
                                if ( empty( $options['noheader'] ) ) {
@@ -618,7 +618,7 @@ class ApiHelp extends ApiBase {
                                                                        ->parse();
                                                        }
                                                        if ( $extra ) {
-                                                               $info[] = join( ' ', $extra );
+                                                               $info[] = implode( ' ', $extra );
                                                        }
                                                }
                                        }
@@ -655,7 +655,7 @@ class ApiHelp extends ApiBase {
                                        }
 
                                        if ( $description ) {
-                                               $description = join( '', $description );
+                                               $description = implode( '', $description );
                                                $description = preg_replace( '!\s*</([oud]l)>\s*<\1>\s*!', "\n", $description );
                                                $help['parameters'] .= Html::rawElement( 'dd',
                                                        [ 'class' => 'description' ], $description );
@@ -744,7 +744,7 @@ class ApiHelp extends ApiBase {
 
                        Hooks::run( 'APIHelpModifyOutput', [ $module, &$help, $suboptions, &$haveModules ] );
 
-                       $out .= join( "\n", $help );
+                       $out .= implode( "\n", $help );
                }
 
                return $out;
index b309149..2b99353 100644 (file)
@@ -111,9 +111,9 @@ class ApiImageRotate extends ApiBase {
                        $tmpFile = TempFSFile::factory( 'rotate_', $ext );
                        $dstPath = $tmpFile->getPath();
                        $err = $handler->rotate( $file, [
-                               "srcPath" => $srcPath,
-                               "dstPath" => $dstPath,
-                               "rotation" => $rotation
+                               'srcPath' => $srcPath,
+                               'dstPath' => $dstPath,
+                               'rotation' => $rotation
                        ] );
                        if ( !$err ) {
                                $comment = wfMessage(
index 8574dce..10106ff 100644 (file)
@@ -175,7 +175,7 @@ class ApiImportReporter extends ImportReporter {
         * @param array $pageInfo
         * @return void
         */
-       function reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo ) {
+       public function reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo ) {
                // Add a result entry
                $r = [];
 
@@ -194,7 +194,7 @@ class ApiImportReporter extends ImportReporter {
                parent::reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo );
        }
 
-       function getData() {
+       public function getData() {
                return $this->mResultArr;
        }
 }
index a6e6c49..02aae06 100644 (file)
@@ -208,7 +208,6 @@ class ApiLogin extends ApiBase {
 
                        case LoginForm::THROTTLED:
                                $result['result'] = 'Throttled';
-                               $throttle = $this->getConfig()->get( 'PasswordAttemptThrottle' );
                                $result['wait'] = intval( $loginForm->mThrottleWait );
                                break;
 
index 9e56819..f09c6f2 100644 (file)
@@ -978,7 +978,7 @@ class ApiMain extends ApiBase {
                if ( $module->needsToken() === true ) {
                        throw new MWException(
                                "Module '{$module->getModuleName()}' must be updated for the new token handling. " .
-                               "See documentation for ApiBase::needsToken for details."
+                               'See documentation for ApiBase::needsToken for details.'
                        );
                }
                if ( $module->needsToken() ) {
@@ -1174,7 +1174,7 @@ class ApiMain extends ApiBase {
                                $this->dieUsageMsg( 'writerequired' );
                        } elseif ( $this->getRequest()->getHeader( 'Promise-Non-Write-API-Action' ) ) {
                                $this->dieUsage(
-                                       "Promise-Non-Write-API-Action HTTP header cannot be sent to write API modules",
+                                       'Promise-Non-Write-API-Action HTTP header cannot be sent to write API modules',
                                        'promised-nonwrite-api'
                                );
                        }
@@ -1225,7 +1225,7 @@ class ApiMain extends ApiBase {
                // If a majority of slaves are too lagged then disallow writes
                $slaveCount = wfGetLB()->getServerCount() - 1;
                if ( $numLagged >= ceil( $slaveCount / 2 ) ) {
-                       $laggedServers = join( ', ', $laggedServers );
+                       $laggedServers = implode( ', ', $laggedServers );
                        wfDebugLog(
                                'api-readonly',
                                "Api request failed as read only because the following DBs are lagged: $laggedServers"
@@ -1443,7 +1443,7 @@ class ApiMain extends ApiBase {
                $ret = $this->getRequest()->getVal( $name );
                if ( $ret === null ) {
                        if ( $this->getRequest()->getArray( $name ) !== null ) {
-                               // See bug 10262 for why we don't just join( '|', ... ) the
+                               // See bug 10262 for why we don't just implode( '|', ... ) the
                                // array.
                                $this->setWarning(
                                        "Parameter '$name' uses unsupported PHP array syntax"
@@ -1637,7 +1637,7 @@ class ApiMain extends ApiBase {
                                        'level' => $level,
                                        'anchor' => 'main/datatypes',
                                        'line' => $header,
-                                       'number' => join( '.', $tocnumber ),
+                                       'number' => implode( '.', $tocnumber ),
                                        'index' => false,
                                ];
                        }
@@ -1656,7 +1656,7 @@ class ApiMain extends ApiBase {
                                        'level' => $level,
                                        'anchor' => 'main/credits',
                                        'line' => $header,
-                                       'number' => join( '.', $tocnumber ),
+                                       'number' => implode( '.', $tocnumber ),
                                        'index' => false,
                                ];
                        }
@@ -1771,7 +1771,7 @@ class ApiMain extends ApiBase {
                                ->inLanguage( 'en' )
                                ->text();
                        $groups = User::getGroupsWithPermission( $right );
-                       $msg .= "* " . $right . " *\n  $rightsMsg" .
+                       $msg .= '* ' . $right . " *\n  $rightsMsg" .
                                "\nGranted to:\n  " . str_replace( '*', 'all', implode( ', ', $groups ) ) . "\n\n";
                }
 
index 304b2d6..effa520 100644 (file)
@@ -358,7 +358,7 @@ class ApiOpenSearch extends ApiBase {
 
                $ns = implode( '|', SearchEngine::defaultNamespaces() );
                if ( !$ns ) {
-                       $ns = "0";
+                       $ns = '0';
                }
 
                switch ( $type ) {
index 1dde9c2..e51d46d 100644 (file)
@@ -99,19 +99,19 @@ class ApiOptions extends ApiBase {
                                case 'userjs':
                                        // Allow non-default preferences prefixed with 'userjs-', to be set by user scripts
                                        if ( strlen( $key ) > 255 ) {
-                                               $validation = "key too long (no more than 255 bytes allowed)";
-                                       } elseif ( preg_match( "/[^a-zA-Z0-9_-]/", $key ) !== 0 ) {
-                                               $validation = "invalid key (only a-z, A-Z, 0-9, _, - allowed)";
+                                               $validation = 'key too long (no more than 255 bytes allowed)';
+                                       } elseif ( preg_match( '/[^a-zA-Z0-9_-]/', $key ) !== 0 ) {
+                                               $validation = 'invalid key (only a-z, A-Z, 0-9, _, - allowed)';
                                        } else {
                                                $validation = true;
                                        }
                                        break;
                                case 'special':
-                                       $validation = "cannot be set by this module";
+                                       $validation = 'cannot be set by this module';
                                        break;
                                case 'unused':
                                default:
-                                       $validation = "not a valid preference";
+                                       $validation = 'not a valid preference';
                                        break;
                        }
                        if ( $validation === true ) {
index 1441a45..6bab762 100644 (file)
@@ -595,22 +595,22 @@ class ApiPageSet extends ApiBase {
                'special', 'missingIds', 'missingRevIds', 'missingTitles', 'interwikiTitles' ]
        ) {
                $result = [];
-               if ( in_array( "invalidTitles", $invalidChecks ) ) {
+               if ( in_array( 'invalidTitles', $invalidChecks ) ) {
                        self::addValues( $result, $this->getInvalidTitlesAndReasons(), 'invalid' );
                }
-               if ( in_array( "special", $invalidChecks ) ) {
+               if ( in_array( 'special', $invalidChecks ) ) {
                        self::addValues( $result, $this->getSpecialTitles(), 'special', 'title' );
                }
-               if ( in_array( "missingIds", $invalidChecks ) ) {
+               if ( in_array( 'missingIds', $invalidChecks ) ) {
                        self::addValues( $result, $this->getMissingPageIDs(), 'missing', 'pageid' );
                }
-               if ( in_array( "missingRevIds", $invalidChecks ) ) {
+               if ( in_array( 'missingRevIds', $invalidChecks ) ) {
                        self::addValues( $result, $this->getMissingRevisionIDs(), 'missing', 'revid' );
                }
-               if ( in_array( "missingTitles", $invalidChecks ) ) {
+               if ( in_array( 'missingTitles', $invalidChecks ) ) {
                        self::addValues( $result, $this->getMissingTitles(), 'missing' );
                }
-               if ( in_array( "interwikiTitles", $invalidChecks ) ) {
+               if ( in_array( 'interwikiTitles', $invalidChecks ) ) {
                        self::addValues( $result, $this->getInterwikiTitlesAsResult() );
                }
 
index 6e44f82..c3c9e21 100644 (file)
@@ -137,7 +137,7 @@ class ApiParamInfo extends ApiBase {
                                foreach ( $msgs as $m ) {
                                        $ret[] = $m->setContext( $this->context )->text();
                                }
-                               $res[$key] = join( "\n\n", $ret );
+                               $res[$key] = implode( "\n\n", $ret );
                                if ( $joinLists ) {
                                        $res[$key] = preg_replace( '!^(([*#:;])[^\n]*)\n\n(?=\2)!m', "$1\n", $res[$key] );
                                }
@@ -148,7 +148,7 @@ class ApiParamInfo extends ApiBase {
                                foreach ( $msgs as $m ) {
                                        $ret[] = $m->setContext( $this->context )->parseAsBlock();
                                }
-                               $ret = join( "\n", $ret );
+                               $ret = implode( "\n", $ret );
                                if ( $joinLists ) {
                                        $ret = preg_replace( '!\s*</([oud]l)>\s*<\1>\s*!', "\n", $ret );
                                }
index 872876d..fe418e3 100644 (file)
@@ -72,7 +72,7 @@ class ApiParse extends ApiBase {
                        $this->section = $params['section'];
                        if ( !preg_match( '/^((T-)?\d+|new)$/', $this->section ) ) {
                                $this->dieUsage(
-                                       "The section parameter must be a valid section id or 'new'", "invalidsection"
+                                       'The section parameter must be a valid section id or "new"', 'invalidsection'
                                );
                        }
                } else {
@@ -275,7 +275,7 @@ class ApiParse extends ApiBase {
                $result_array = [];
 
                $result_array['title'] = $titleObj->getPrefixedText();
-               $result_array['pageid'] = $pageid ? $pageid : $pageObj->getId();
+               $result_array['pageid'] = $pageid ?: $pageObj->getId();
 
                if ( !is_null( $oldid ) ) {
                        $result_array['revid'] = intval( $oldid );
@@ -341,8 +341,7 @@ class ApiParse extends ApiBase {
                }
 
                if ( isset( $prop['displaytitle'] ) ) {
-                       $result_array['displaytitle'] = $p_result->getDisplayTitle() ?
-                               $p_result->getDisplayTitle() :
+                       $result_array['displaytitle'] = $p_result->getDisplayTitle() ?:
                                $titleObj->getPrefixedText();
                }
 
@@ -390,9 +389,9 @@ class ApiParse extends ApiBase {
 
                if ( isset( $prop['modules'] ) &&
                        !isset( $prop['jsconfigvars'] ) && !isset( $prop['encodedjsconfigvars'] ) ) {
-                       $this->setWarning( "Property 'modules' was set but not 'jsconfigvars' " .
-                               "or 'encodedjsconfigvars'. Configuration variables are necessary " .
-                               "for proper module usage." );
+                       $this->setWarning( 'Property "modules" was set but not "jsconfigvars" ' .
+                               'or "encodedjsconfigvars". Configuration variables are necessary ' .
+                               'for proper module usage.' );
                }
 
                if ( isset( $prop['indicators'] ) ) {
@@ -428,7 +427,7 @@ class ApiParse extends ApiBase {
 
                if ( isset( $prop['parsetree'] ) || $params['generatexml'] ) {
                        if ( $this->content->getModel() != CONTENT_MODEL_WIKITEXT ) {
-                               $this->dieUsage( "parsetree is only supported for wikitext content", "notwikitext" );
+                               $this->dieUsage( 'parsetree is only supported for wikitext content', 'notwikitext' );
                        }
 
                        $wgParser->startExternalParse( $titleObj, $popts, Parser::OT_PREPROCESS );
@@ -545,10 +544,10 @@ class ApiParse extends ApiBase {
                // Not cached (save or load)
                $section = $content->getSection( $this->section );
                if ( $section === false ) {
-                       $this->dieUsage( "There is no section {$this->section} in " . $what, 'nosuchsection' );
+                       $this->dieUsage( "There is no section {$this->section} in $what", 'nosuchsection' );
                }
                if ( $section === null ) {
-                       $this->dieUsage( "Sections are not supported by " . $what, 'nosuchsection' );
+                       $this->dieUsage( "Sections are not supported by $what", 'nosuchsection' );
                        $section = false;
                }
 
index 58b670a..4336907 100644 (file)
@@ -185,33 +185,6 @@ class ApiQuery extends ApiBase {
                return $this->mPageSet;
        }
 
-       /**
-        * Get the generators array mapping module names to class names
-        * @deprecated since 1.21, list of generators is maintained by ApiPageSet
-        * @return array Array(modulename => classname)
-        */
-       public function getGenerators() {
-               wfDeprecated( __METHOD__, '1.21' );
-               $gens = [];
-               foreach ( $this->mModuleMgr->getNamesWithClasses() as $name => $class ) {
-                       if ( is_subclass_of( $class, 'ApiQueryGeneratorBase' ) ) {
-                               $gens[$name] = $class;
-                       }
-               }
-
-               return $gens;
-       }
-
-       /**
-        * Get whether the specified module is a prop, list or a meta query module
-        * @deprecated since 1.21, use getModuleManager()->getModuleGroup()
-        * @param string $moduleName Name of the module to find type for
-        * @return string|null
-        */
-       function getModuleType( $moduleName ) {
-               return $this->getModuleManager()->getModuleGroup( $moduleName );
-       }
-
        /**
         * @return ApiFormatRaw|null
         */
@@ -451,22 +424,6 @@ class ApiQuery extends ApiBase {
                }
        }
 
-       /**
-        * This method is called by the generator base when generator in the smart-continue
-        * mode tries to set 'query-continue' value. ApiQuery stores those values separately
-        * until the post-processing when it is known if the generation should continue or repeat.
-        * @deprecated since 1.24
-        * @param ApiQueryGeneratorBase $module Generator module
-        * @param string $paramName
-        * @param mixed $paramValue
-        * @return bool True if processed, false if this is a legacy continue
-        */
-       public function setGeneratorContinue( $module, $paramName, $paramValue ) {
-               wfDeprecated( __METHOD__, '1.24' );
-               $this->getContinuationManager()->addGeneratorContinueParam( $module, $paramName, $paramValue );
-               return !$this->getParameter( 'rawcontinue' );
-       }
-
        /**
         * @param ApiPageSet $pageSet Pages to be exported
         * @param ApiResult $result Result to output to
index 94707da..ac90605 100644 (file)
@@ -117,7 +117,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                        if ( $matches ) {
                                $p = $this->getModulePrefix();
                                $this->dieUsage(
-                                       "Cannot use {$p}prop=" . join( '|', array_keys( $matches ) ) . " with {$p}unique",
+                                       "Cannot use {$p}prop=" . implode( '|', array_keys( $matches ) ) . " with {$p}unique",
                                        'params'
                                );
                        }
index 97b122a..fb502e4 100644 (file)
@@ -296,7 +296,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                                // Note we must keep the parameters for the first query constant
                                // This may be overridden at a later step
                                $title = $row->{$this->bl_title};
-                               $this->continueStr = join( '|', array_slice( $this->cont, 0, 2 ) ) .
+                               $this->continueStr = implode( '|', array_slice( $this->cont, 0, 2 ) ) .
                                        "|$ns|$title|{$row->from_ns}|{$row->page_id}";
                                break;
                        }
@@ -451,7 +451,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                                                [ 'query', $this->getModuleName() ],
                                                $idx, array_diff_key( $arr, [ 'redirlinks' => '' ] ) );
                                        if ( !$fit ) {
-                                               $this->continueStr = join( '|', array_slice( $this->cont, 0, 6 ) ) .
+                                               $this->continueStr = implode( '|', array_slice( $this->cont, 0, 6 ) ) .
                                                        "|$pageID";
                                                break;
                                        }
@@ -474,7 +474,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                                                        [ 'query', $this->getModuleName(), $idx, 'redirlinks' ],
                                                        null, $redir );
                                                if ( !$fit ) {
-                                                       $this->continueStr = join( '|', array_slice( $this->cont, 0, 6 ) ) .
+                                                       $this->continueStr = implode( '|', array_slice( $this->cont, 0, 6 ) ) .
                                                                "|$pageID|$key";
                                                        break;
                                                }
index 17b51da..3810e90 100644 (file)
@@ -164,22 +164,14 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase {
                        $this->dieContinueUsageIf( count( $cont ) != count( $sortby ) );
                        $where = '';
                        $i = count( $sortby ) - 1;
-                       $cont_ns = 0;
-                       $cont_title = '';
                        foreach ( array_reverse( $sortby, true ) as $field => $type ) {
                                $v = $cont[$i];
                                switch ( $type ) {
                                        case 'ns':
-                                               $cont_ns = (int)$v;
-                                               /* fall through */
                                        case 'int':
                                                $v = (int)$v;
                                                $this->dieContinueUsageIf( $v != $cont[$i] );
                                                break;
-
-                                       case 'title':
-                                               $cont_title = $v;
-                                               /* fall through */
                                        default:
                                                $v = $db->addQuotes( $v );
                                                break;
@@ -321,7 +313,7 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase {
                foreach ( $sortby as $field => $v ) {
                        $cont[] = $row->$field;
                }
-               $this->setContinueEnumParameter( 'continue', join( '|', $cont ) );
+               $this->setContinueEnumParameter( 'continue', implode( '|', $cont ) );
        }
 
        public function getCacheMode( $params ) {
index 7848bc8..c491236 100644 (file)
@@ -78,7 +78,7 @@ class ApiQueryFileRepoInfo extends ApiQueryBase {
 
                return [
                        'prop' => [
-                               ApiBase::PARAM_DFLT => join( '|', $props ),
+                               ApiBase::PARAM_DFLT => implode( '|', $props ),
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => $props,
                        ],
index 6890046..ab94574 100644 (file)
@@ -308,7 +308,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
                foreach ( $paramList as $name => $value ) {
                        if ( !$h->validateParam( $name, $value ) ) {
-                               $this->dieUsage( "Invalid value for {$p}urlparam ($name=$value)", "urlparam" );
+                               $this->dieUsage( "Invalid value for {$p}urlparam ($name=$value)", 'urlparam' );
                        }
                }
 
@@ -357,7 +357,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
         *    'revdelUser': User to use when checking whether to show revision-deleted fields.
         * @return array Result array
         */
-       static function getInfo( $file, $prop, $result, $thumbParams = null, $opts = false ) {
+       public static function getInfo( $file, $prop, $result, $thumbParams = null, $opts = false ) {
                global $wgContLang;
 
                $anyHidden = false;
index c12393d..266d699 100644 (file)
@@ -294,9 +294,9 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                        $vals['parsetree'] = $xml;
                                } else {
                                        $vals['badcontentformatforparsetree'] = true;
-                                       $this->setWarning( "Conversion to XML is supported for wikitext only, " .
+                                       $this->setWarning( 'Conversion to XML is supported for wikitext only, ' .
                                                $title->getPrefixedDBkey() .
-                                               " uses content model " . $content->getModel() );
+                                               ' uses content model ' . $content->getModel() );
                                }
                        }
                }
@@ -315,9 +315,9 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                                ParserOptions::newFromContext( $this->getContext() )
                                        );
                                } else {
-                                       $this->setWarning( "Template expansion is supported for wikitext only, " .
+                                       $this->setWarning( 'Template expansion is supported for wikitext only, ' .
                                                $title->getPrefixedDBkey() .
-                                               " uses content model " . $content->getModel() );
+                                               ' uses content model ' . $content->getModel() );
                                        $vals['badcontentformat'] = true;
                                        $text = false;
                                }
@@ -332,7 +332,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                        }
 
                        if ( $text === null ) {
-                               $format = $this->contentFormat ? $this->contentFormat : $content->getDefaultFormat();
+                               $format = $this->contentFormat ?: $content->getDefaultFormat();
                                $model = $content->getModel();
 
                                if ( !$content->isSupportedFormat( $format ) ) {
index 4befad6..f05556e 100644 (file)
@@ -652,8 +652,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                }
 
                $data = [
-                       'url' => $url ? $url : '',
-                       'text' => $text ? $text : ''
+                       'url' => $url ?: '',
+                       'text' => $text ?: ''
                ];
 
                return $this->getResult()->addValue( 'query', $property, $data );
index 51f4862..6d1540b 100644 (file)
@@ -42,7 +42,7 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
                $result = $this->getResult();
 
                if ( !$params['filekey'] && !$params['sessionkey'] ) {
-                       $this->dieUsage( "One of filekey or sessionkey must be supplied", 'nofilekey' );
+                       $this->dieUsage( 'One of filekey or sessionkey must be supplied', 'nofilekey' );
                }
 
                // Alias sessionkey to filekey, but give an existing filekey precedence.
@@ -62,9 +62,9 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
                        }
                // @todo Update exception handling here to understand current getFile exceptions
                } catch ( UploadStashFileNotFoundException $e ) {
-                       $this->dieUsage( "File not found: " . $e->getMessage(), "invalidsessiondata" );
+                       $this->dieUsage( 'File not found: ' . $e->getMessage(), 'invalidsessiondata' );
                } catch ( UploadStashBadPathException $e ) {
-                       $this->dieUsage( "Bad path: " . $e->getMessage(), "invalidsessiondata" );
+                       $this->dieUsage( 'Bad path: ' . $e->getMessage(), 'invalidsessiondata' );
                }
        }
 
index f70bbe7..3436320 100644 (file)
@@ -312,7 +312,7 @@ class ApiResult implements ApiSerializable {
                        if ( !$conflicts ) {
                                $arr[$name] += $value;
                        } else {
-                               $keys = join( ', ', array_keys( $conflicts ) );
+                               $keys = implode( ', ', array_keys( $conflicts ) );
                                throw new RuntimeException(
                                        "Conflicting keys ($keys) when attempting to merge element $name"
                                );
@@ -340,7 +340,7 @@ class ApiResult implements ApiSerializable {
                                $value = $value->serializeForApiResult();
                                if ( is_object( $value ) ) {
                                        throw new UnexpectedValueException(
-                                               get_class( $oldValue ) . "::serializeForApiResult() returned an object of class " .
+                                               get_class( $oldValue ) . '::serializeForApiResult() returned an object of class ' .
                                                        get_class( $value )
                                        );
                                }
@@ -351,7 +351,7 @@ class ApiResult implements ApiSerializable {
                                        return self::validateValue( $value );
                                } catch ( Exception $ex ) {
                                        throw new UnexpectedValueException(
-                                               get_class( $oldValue ) . "::serializeForApiResult() returned an invalid value: " .
+                                               get_class( $oldValue ) . '::serializeForApiResult() returned an invalid value: ' .
                                                        $ex->getMessage(),
                                                0,
                                                $ex
@@ -372,7 +372,7 @@ class ApiResult implements ApiSerializable {
                        }
                        $value = $tmp;
                } elseif ( is_float( $value ) && !is_finite( $value ) ) {
-                       throw new InvalidArgumentException( "Cannot add non-finite floats to ApiResult" );
+                       throw new InvalidArgumentException( 'Cannot add non-finite floats to ApiResult' );
                } elseif ( is_string( $value ) ) {
                        $value = $wgContLang->normalize( $value );
                } elseif ( $value !== null && !is_scalar( $value ) ) {
@@ -538,7 +538,7 @@ class ApiResult implements ApiSerializable {
                ) {
                        throw new RuntimeException(
                                "Attempting to set content element as $name when " . $arr[self::META_CONTENT] .
-                                       " is already set as the content element"
+                                       ' is already set as the content element'
                        );
                }
                $arr[self::META_CONTENT] = $name;
@@ -1132,12 +1132,12 @@ class ApiResult implements ApiSerializable {
                                                $tmp = [];
                                                return $tmp;
                                        default:
-                                               $fail = join( '.', array_slice( $path, 0, $i + 1 ) );
+                                               $fail = implode( '.', array_slice( $path, 0, $i + 1 ) );
                                                throw new InvalidArgumentException( "Path $fail does not exist" );
                                }
                        }
                        if ( !is_array( $ret[$k] ) ) {
-                               $fail = join( '.', array_slice( $path, 0, $i + 1 ) );
+                               $fail = implode( '.', array_slice( $path, 0, $i + 1 ) );
                                throw new InvalidArgumentException( "Path $fail is not an array" );
                        }
                        $ret = &$ret[$k];
index d8562b0..3c02c9c 100644 (file)
@@ -50,7 +50,7 @@ class ApiStashEdit extends ApiBase {
                if ( !ContentHandler::getForModelID( $params['contentmodel'] )
                        ->isSupportedFormat( $params['contentformat'] )
                ) {
-                       $this->dieUsage( "Unsupported content model/format", 'badmodelformat' );
+                       $this->dieUsage( 'Unsupported content model/format', 'badmodelformat' );
                }
 
                // Trim and fix newlines so the key SHA1's match (see RequestContext::getText())
@@ -77,7 +77,7 @@ class ApiStashEdit extends ApiBase {
                                $baseRev->getId()
                        );
                        if ( !$editContent ) {
-                               $this->dieUsage( "Could not merge updated section.", 'replacefailed' );
+                               $this->dieUsage( 'Could not merge updated section.', 'replacefailed' );
                        }
                        if ( $currentRev->getId() == $baseRev->getId() ) {
                                // Base revision was still the latest; nothing to merge
@@ -433,19 +433,19 @@ class ApiStashEdit extends ApiBase {
                ];
        }
 
-       function needsToken() {
+       public function needsToken() {
                return 'csrf';
        }
 
-       function mustBePosted() {
+       public function mustBePosted() {
                return true;
        }
 
-       function isWriteMode() {
+       public function isWriteMode() {
                return true;
        }
 
-       function isInternal() {
+       public function isInternal() {
                return true;
        }
 }
index 63bae9d..4940394 100644 (file)
@@ -32,9 +32,9 @@ class ApiTokens extends ApiBase {
 
        public function execute() {
                $this->setWarning(
-                       "action=tokens has been deprecated. Please use action=query&meta=tokens instead."
+                       'action=tokens has been deprecated. Please use action=query&meta=tokens instead.'
                );
-               $this->logFeatureUsage( "action=tokens" );
+               $this->logFeatureUsage( 'action=tokens' );
 
                $params = $this->extractRequestParams();
                $res = [
index 79e88c6..326f8ba 100644 (file)
@@ -542,9 +542,9 @@ class ApiUpload extends ApiBase {
                                ];
                                ApiResult::setIndexedTagName( $extradata['allowed'], 'ext' );
 
-                               $msg = "Filetype not permitted: ";
+                               $msg = 'Filetype not permitted: ';
                                if ( isset( $verification['blacklistedExt'] ) ) {
-                                       $msg .= join( ', ', $verification['blacklistedExt'] );
+                                       $msg .= implode( ', ', $verification['blacklistedExt'] );
                                        $extradata['blacklisted'] = array_values( $verification['blacklistedExt'] );
                                        ApiResult::setIndexedTagName( $extradata['blacklisted'], 'ext' );
                                } else {
@@ -664,7 +664,7 @@ class ApiUpload extends ApiBase {
                                $this->dieUsage( 'No such filekey: ' . $e->getMessage(), 'stashnosuchfilekey' );
                                break;
                        default:
-                               $this->dieUsage( $exceptionType . ": " . $e->getMessage(), 'stasherror' );
+                               $this->dieUsage( $exceptionType . ': ' . $e->getMessage(), 'stasherror' );
                                break;
                }
        }
@@ -714,7 +714,7 @@ class ApiUpload extends ApiBase {
                if ( $this->mParams['async'] ) {
                        $progress = UploadBase::getSessionStatus( $this->getUser(), $this->mParams['filekey'] );
                        if ( $progress && $progress['result'] === 'Poll' ) {
-                               $this->dieUsage( "Upload from stash already in progress.", 'publishfailed' );
+                               $this->dieUsage( 'Upload from stash already in progress.', 'publishfailed' );
                        }
                        UploadBase::setSessionStatus(
                                $this->getUser(),
index 4e5e000..f09fdcb 100644 (file)
@@ -80,7 +80,7 @@ class ApiWatch extends ApiBase {
                        if ( $extraParams ) {
                                $p = $this->getModulePrefix();
                                $this->dieUsage(
-                                       "The parameter {$p}title can not be used with " . implode( ", ", $extraParams ),
+                                       "The parameter {$p}title can not be used with " . implode( ', ', $extraParams ),
                                        'invalidparammix'
                                );
                        }
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 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..e62cc30 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 více informací o usnadnění testování požadavků na API viz [[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 08d087a..979f023 100644 (file)
        "apihelp-paraminfo-param-querymodules": "クエリモジュール名のリスト (<var>prop</var>, <var>meta</var> or <var>list</var> パラメータの値)。<kbd>$1querymodules=foo</kbd> の代わりに <kbd>$1modules=query+foo</kbd> を使用してください。",
        "apihelp-paraminfo-example-1": "<kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd>, and <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> に関する情報を表示する。",
        "apihelp-parse-param-summary": "構文解析のための要約",
+       "apihelp-parse-param-page": "このページの内容を構文解析します。<var>$1text</var> および <var>$1title</var> とは同時に使用できません。",
        "apihelp-parse-param-redirects": "もし <var>$1page</var> や <var>$1pageid</var> に転送ページが指定された場合、それを解決する。",
        "apihelp-parse-param-prop": "どの情報を取得するか:",
        "apihelp-parse-paramvalue-prop-text": "ウィキテキストの解析されたテキストを提供します。",
        "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 5ad108b..da676a1 100644 (file)
@@ -4,6 +4,13 @@
                        "Zygimantus"
                ]
        },
+       "apihelp-createaccount-param-name": "Naudotojo vardas.",
+       "apihelp-createaccount-param-realname": "Vardas (nebūtina).",
+       "apihelp-delete-description": "Ištrinti puslapį.",
+       "apihelp-edit-param-text": "Puslapio turinys.",
+       "apihelp-emailuser-description": "Siųsti el. laišką naudotojui.",
+       "apihelp-expandtemplates-param-title": "Puslapio pavadinimas.",
+       "apihelp-feedrecentchanges-example-simple": "Parodyti naujausius keitimus.",
        "apihelp-query+alldeletedrevisions-example-user": "Sąrašas paskutinių 50 ištrintų indėlių pagal vartotoją\n<kbd>Pavyzdys</kbd>.",
        "apihelp-query+allrevisions-param-namespace": "Rodyti puslapius tik šioje vardų srityje.",
        "apihelp-query+backlinks-example-simple": "Rodyti nuorodas <kbd>Pagrindinis puslapis</kbd>.",
index b5cba60..6151f11 100644 (file)
        "apihelp-edit-param-title": "Titolo d' 'a paggena a cagnà. Nun se pò ausà nziem'a <var>$1pageid</var>.",
        "apihelp-edit-param-pageid": "ID d' 'a paggena a cagnà. Nun se pò ausà nziem'a <var>$1title</var>.",
        "apihelp-edit-param-section": "Nummero 'e sezione. <kbd>0</kbd> p' 'a sezione ncoppa, <kbd>new</kbd> pe' na seziona nova.",
+       "apihelp-edit-param-sectiontitle": "'O titolo pe' na seziona nova.",
        "apihelp-edit-param-text": "Cuntenuto 'e paggena.",
+       "apihelp-edit-param-summary": "Oggetto d' 'a modifica. Pure 'o titolo ra sezione quanno $1sezione=new e $1sectiontitle nun è mpustato.",
+       "apihelp-edit-param-tags": "Cagna 'e tag ca s'avesser'applicà 'a verziona.",
+       "apihelp-edit-param-minor": "Cagnamiento piccerillo.",
+       "apihelp-edit-param-notminor": "Cagnamiento nun-piccerillo.",
+       "apihelp-edit-param-bot": "Nzegna stu cagnamiento comm' 'e bot.",
+       "apihelp-edit-param-basetimestamp": "Nzegna 'o tiempo d' 'a verzione bbase, ausato pe' puté ffà scummiglià cunflitte 'edizione. Se putesse piglià pe' bbìa 'e [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
+       "apihelp-edit-param-starttimestamp": "Nzegna 'o tiempo d' 'a verzione bbase, ausato pe' puté ffà scummiglià cunflitte 'edizione. Nu valore buono se putess'arrepiglià pe' bbìa 'e <var>[[Special:ApiHelp/main|curtimestamp]]</var> quann'accummencia 'o prucess' 'edizione (e.g. quanno se stà a carrecà 'o contenuto 'e na paggena p' 'a cagnà).",
+       "apihelp-edit-param-recreate": "Scrive ncopp'a cocch'errore ncopp'a paggena avenno scancellato chesto a nu certo punto.",
+       "apihelp-edit-param-createonly": "Nun cagnà 'a paggena si esiste già.",
+       "apihelp-edit-param-nocreate": "Ietta 'errore si 'a paggena nun esiste.",
+       "apihelp-edit-param-watch": "Azzecc' 'a paggena â lista 'e paggene cuntrullate.",
+       "apihelp-edit-param-unwatch": "Liev' 'a paggena â lista 'e paggene cuntrullate.",
+       "apihelp-edit-param-watchlist": "Senza condizione, azzeccà o luvà 'a paggena 'a l'elenco 'e paggene cuntrullate 'e ll'utente, ausà mpustaziune o nun 'o cagnà l'elenco.",
+       "apihelp-edit-param-md5": "'O hash MD5 d' 'o parammetro 'e $1text, o chill' 'e $1prependtext e $1appendtext concatenate. Si mpustato, 'o cagnamiento nun fosse fatto... 'o cuntrario succeresse si 'o hash fosse curretto.",
        "apihelp-edit-param-prependtext": "Azzecca stu testo addò 'o cap' 'e paggena. Se mettesse ncuoll'a $1text.",
        "apihelp-edit-param-appendtext": "Azzecca stu testo addò 'o cap' 'e paggena. Se mettesse ncuoll'a $1text.\n\nAusate $1section=new pe' ne puté appennere na seziona nova, ato che ausà stu parammetro.",
        "apihelp-edit-param-undo": "Torna arrèto sta verziona. Miette ncuollo 'o $1text, $1prependtext e $1appendtext.",
        "apihelp-expandtemplates-paramvalue-prop-properties": "'E pruprietà 'e pagena definite p' 'e parole magiche spannute dint' 'o wikitesto.",
        "apihelp-expandtemplates-paramvalue-prop-volatile": "Si l'output fosse volatile e nun s'avess'ausà n'atavota addò servesse dint' 'a paggena.",
        "apihelp-expandtemplates-paramvalue-prop-ttl": "'O tiempo massimo aropp' 'o quale 'e caches d' 'o risultato s'avessero a nzegnà invalide.",
+       "apihelp-expandtemplates-paramvalue-prop-modules": "Ogne modulo ResourceLoader ch' 'e funzione parser addimannajero a s'azzeccà a ll'output. Fosse <kbd>jsconfigvars</kbd> o pure <kbd>encodedjsconfigvars</kbd> s'avesser'addimannà tutte 'nzieme pe' bbìa d' 'e <kbd>modules</kbd>.",
+       "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Dà nfurmaziune 'e variabbele 'e mpustaziona JavaScript specifiche 'a paggena.",
+       "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Dà 'e variabbele 'e mpustaziona 'e JavaScript specifiche 'a na paggena comm'a na stringa JSON.",
+       "apihelp-expandtemplates-paramvalue-prop-parsetree": "L'albero 'e parse XML 'a ll'input.",
+       "apihelp-expandtemplates-param-includecomments": "Si s'avess'azzeccà cocche cummento HTML dint'a ll'output.",
+       "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 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-login-example-login": "Tràse.",
        "apihelp-move-description": "Mòve paggena.",
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 15432da..637eb88 100644 (file)
@@ -132,7 +132,7 @@ class ChangesList extends ContextSource {
                $f = '';
                foreach ( array_keys( $this->getConfig()->get( 'RecentChangesFlags' ) ) as $flag ) {
                        $f .= isset( $flags[$flag] ) && $flags[$flag]
-                               ? self::flag( $flag )
+                               ? self::flag( $flag, $this->getContext() )
                                : $nothing;
                }
 
@@ -168,40 +168,40 @@ class ChangesList extends ContextSource {
        }
 
        /**
-        * Provide the "<abbr>" element appropriate to a given abbreviated flag,
-        * namely the flag indicating a new page, a minor edit, a bot edit, or an
-        * unpatrolled edit.  By default in English it will contain "N", "m", "b",
-        * "!" respectively, plus it will have an appropriate title and class.
+        * Make an "<abbr>" element for a given change flag. The flag indicating a new page, minor edit,
+        * bot edit, or unpatrolled edit. In English it typically contains "N", "m", "b", or "!".
         *
         * @param string $flag One key of $wgRecentChangesFlags
-        * @return string Raw HTML
+        * @param IContextSource $context
+        * @return string HTML
         */
-       public static function flag( $flag ) {
+       public static function flag( $flag, IContextSource $context = null ) {
+               static $map = [ 'minoredit' => 'minor', 'botedit' => 'bot' ];
                static $flagInfos = null;
+
                if ( is_null( $flagInfos ) ) {
                        global $wgRecentChangesFlags;
                        $flagInfos = [];
                        foreach ( $wgRecentChangesFlags as $key => $value ) {
-                               $flagInfos[$key]['letter'] = wfMessage( $value['letter'] )->escaped();
-                               $flagInfos[$key]['title'] = wfMessage( $value['title'] )->escaped();
+                               $flagInfos[$key]['letter'] = $value['letter'];
+                               $flagInfos[$key]['title'] = $value['title'];
                                // Allow customized class name, fall back to flag name
-                               $flagInfos[$key]['class'] = Sanitizer::escapeClass(
-                                       isset( $value['class'] ) ? $value['class'] : $key );
+                               $flagInfos[$key]['class'] = isset( $value['class'] ) ? $value['class'] : $key;
                        }
                }
 
-               // Inconsistent naming, bleh, kepted for b/c
-               $map = [
-                       'minoredit' => 'minor',
-                       'botedit' => 'bot',
-               ];
+               $context = $context ?: RequestContext::getMain();
+
+               // Inconsistent naming, kepted for b/c
                if ( isset( $map[$flag] ) ) {
                        $flag = $map[$flag];
                }
 
-               return "<abbr class='" . $flagInfos[$flag]['class'] . "' title='" .
-                       $flagInfos[$flag]['title'] . "'>" . $flagInfos[$flag]['letter'] .
-                       '</abbr>';
+               $info = $flagInfos[$flag];
+               return Html::element( 'abbr', [
+                       'class' => $info['class'],
+                       'title' => wfMessage( $info['title'] )->setContext( $context )->text(),
+               ], wfMessage( $info['letter'] )->setContext( $context )->text() );
        }
 
        /**
@@ -337,7 +337,7 @@ class ChangesList extends ContextSource {
         */
        public function insertLog( &$s, $title, $logtype ) {
                $page = new LogPage( $logtype );
-               $logname = $page->getName()->escaped();
+               $logname = $page->getName()->setContext( $this->getContext() )->escaped();
                $s .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $title, $logname ) )->escaped();
        }
 
index b9215fc..40d9277 100644 (file)
@@ -161,7 +161,7 @@ class JsonContent extends TextContent {
                        );
                }
                return Html::rawElement( 'table', [ 'class' => 'mw-json' ],
-                       Html::rawElement( 'tbody', [], join( '', $rows ) )
+                       Html::rawElement( 'tbody', [], implode( '', $rows ) )
                );
        }
 
@@ -200,7 +200,7 @@ class JsonContent extends TextContent {
                        );
                }
                return Html::rawElement( 'table', [ 'class' => 'mw-json' ],
-                       Html::rawElement( 'tbody', [], join( "\n", $rows ) )
+                       Html::rawElement( 'tbody', [], implode( "\n", $rows ) )
                );
        }
 
index 35ee1b7..c8b8108 100644 (file)
@@ -167,7 +167,7 @@ class RequestContext implements IContextSource, MutableContext {
         *
         * @param Title $title
         */
-       public function setTitle( Title $title ) {
+       public function setTitle( Title $title = null ) {
                $this->title = $title;
                // Erase the WikiPage so a new one with the new title gets created.
                $this->wikipage = null;
index 7058061..1e27205 100644 (file)
@@ -757,19 +757,13 @@ abstract class DatabaseMysqlBase extends Database {
                return $approxLag;
        }
 
-       /**
-        * Wait for the slave to catch up to a given master position.
-        * @todo Return values for this and base class are rubbish
-        *
-        * @param DBMasterPos|MySQLMasterPos $pos
-        * @param int $timeout The maximum number of seconds to wait for synchronisation
-        * @return int Zero if the slave was past that position already,
-        *   greater than zero if we waited for some period of time, less than
-        *   zero if we timed out.
-        */
        function masterPosWait( DBMasterPos $pos, $timeout ) {
+               if ( !( $pos instanceof MySQLMasterPos ) ) {
+                       throw new InvalidArgumentException( "Position not an instance of MySQLMasterPos" );
+               }
+
                if ( $this->lastKnownSlavePos && $this->lastKnownSlavePos->hasReached( $pos ) ) {
-                       return '0'; // http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html
+                       return 0;
                }
 
                # Commit any open transactions
@@ -778,18 +772,28 @@ abstract class DatabaseMysqlBase extends Database {
                # Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set
                $encFile = $this->addQuotes( $pos->file );
                $encPos = intval( $pos->pos );
-               $sql = "SELECT MASTER_POS_WAIT($encFile, $encPos, $timeout)";
-               $res = $this->doQuery( $sql );
-
-               $status = false;
-               if ( $res ) {
-                       $row = $this->fetchRow( $res );
-                       if ( $row ) {
-                               $status = $row[0]; // can be NULL, -1, or 0+ per the MySQL manual
-                               if ( ctype_digit( $status ) ) { // success
-                                       $this->lastKnownSlavePos = $pos;
-                               }
+               $res = $this->doQuery( "SELECT MASTER_POS_WAIT($encFile, $encPos, $timeout)" );
+
+               $row = $res ? $this->fetchRow( $res ) : false;
+               if ( !$row ) {
+                       throw new DBExpectedError( $this, "Failed to query MASTER_POS_WAIT()" );
+               }
+
+               // Result can be NULL (error), -1 (timeout), or 0+ per the MySQL manual
+               $status = ( $row[0] !== null ) ? intval( $row[0] ) : null;
+               if ( $status === null ) {
+                       // T126436: jobs programmed to wait on master positions might be referencing binlogs
+                       // with an old master hostname. Such calls make MASTER_POS_WAIT() return null. Try
+                       // to detect this and treat the slave as having reached the position; a proper master
+                       // switchover already requires that the new master be caught up before the switch.
+                       $slavePos = $this->getSlavePos();
+                       if ( $slavePos && !$slavePos->channelsMatch( $pos ) ) {
+                               $this->lastKnownSlavePos = $slavePos;
+                               $status = 0;
                        }
+               } elseif ( $status >= 0 ) {
+                       // Remember that this position was reached to save queries next time
+                       $this->lastKnownSlavePos = $pos;
                }
 
                return $status;
@@ -1446,11 +1450,34 @@ class MySQLMasterPos implements DBMasterPos {
                return ( $thisPos && $thatPos && $thisPos >= $thatPos );
        }
 
+       function channelsMatch( DBMasterPos $pos ) {
+               if ( !( $pos instanceof self ) ) {
+                       throw new InvalidArgumentException( "Position not an instance of " . __CLASS__ );
+               }
+
+               $thisBinlog = $this->getBinlogName();
+               $thatBinlog = $pos->getBinlogName();
+
+               return ( $thisBinlog !== false && $thisBinlog === $thatBinlog );
+       }
+
        function __toString() {
                // e.g db1034-bin.000976/843431247
                return "{$this->file}/{$this->pos}";
        }
 
+       /**
+        * @return string|bool
+        */
+       protected function getBinlogName() {
+               $m = [];
+               if ( preg_match( '!^(.+)\.(\d+)/(\d+)$!', (string)$this, $m ) ) {
+                       return $m[1];
+               }
+
+               return false;
+       }
+
        /**
         * @return array|bool (int, int)
         */
index 9b301a9..9e53653 100644 (file)
@@ -618,7 +618,7 @@ class DatabaseOracle extends Database {
 
                $table = $this->tableName( $table );
                // "INSERT INTO tables (a, b, c)"
-               $sql = "INSERT INTO " . $table . " (" . join( ',', array_keys( $row ) ) . ')';
+               $sql = "INSERT INTO " . $table . " (" . implode( ',', array_keys( $row ) ) . ')';
                $sql .= " VALUES (";
 
                // for each value, append ":key"
index 6fa8bf0..b6c37ee 100644 (file)
@@ -332,6 +332,13 @@ interface DBMasterPos {
         */
        public function hasReached( DBMasterPos $pos );
 
+       /**
+        * @param DBMasterPos $pos
+        * @return bool Whether this position appears to be for the same channel as another
+        * @since 1.27
+        */
+       public function channelsMatch( DBMasterPos $pos );
+
        /**
         * @return string
         * @since 1.27
index 7855861..8b1c3df 100644 (file)
@@ -1183,14 +1183,13 @@ interface IDatabase {
        public function wasReadOnlyError();
 
        /**
-        * Wait for the slave to catch up to a given master position.
+        * Wait for the slave to catch up to a given master position
         *
         * @param DBMasterPos $pos
-        * @param int $timeout The maximum number of seconds to wait for
-        *   synchronisation
-        * @return int Zero if the slave was past that position already,
+        * @param int $timeout The maximum number of seconds to wait for synchronisation
+        * @return int|null Zero if the slave was past that position already,
         *   greater than zero if we waited for some period of time, less than
-        *   zero if we timed out.
+        *   zero if it timed out, and null on error
         */
        public function masterPosWait( DBMasterPos $pos, $timeout );
 
index d5cd017..e68cf1a 100644 (file)
@@ -36,7 +36,7 @@ interface LoadMonitor {
 
        /**
         * Perform pre-connection load ratio adjustment.
-        * @param array $loads
+        * @param array &$loads
         * @param string|bool $group The selected query group. Default: false
         * @param string|bool $wiki Default: false
         */
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..a1a1bb0 100644 (file)
@@ -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 5a103c6..6f40bda 100644 (file)
@@ -202,11 +202,17 @@ class FileBackendMultiWrite extends FileBackend {
                                if ( $this->asyncWrites && !$this->hasVolatileSources( $ops ) ) {
                                        // Bind $scopeLock to the callback to preserve locks
                                        DeferredUpdates::addCallableUpdate(
-                                               function() use ( $backend, $realOps, $opts, $scopeLock ) {
+                                               function() use ( $backend, $realOps, $opts, $scopeLock, $relevantPaths ) {
+                                                       wfDebugLog( 'FileOperationReplication',
+                                                               "'{$backend->getName()}' async replication; paths: " .
+                                                               FormatJson::encode( $relevantPaths ) );
                                                        $backend->doOperations( $realOps, $opts );
                                                }
                                        );
                                } else {
+                                       wfDebugLog( 'FileOperationReplication',
+                                               "'{$backend->getName()}' sync replication; paths: " .
+                                               FormatJson::encode( $relevantPaths ) );
                                        $status->merge( $backend->doOperations( $realOps, $opts ) );
                                }
                        }
index 789803f..1565b49 100644 (file)
@@ -1115,7 +1115,7 @@ class FileRepo {
         * @param array $srcPaths Ordered list of source virtual URLs/storage paths
         * @param string $dstPath Target file system path
         * @param int $flags Bitwise combination of the following flags:
-        *   self::DELETE_SOURCE     Delete the source files
+        *   self::DELETE_SOURCE     Delete the source files on success
         * @return FileRepoStatus
         */
        public function concatenate( array $srcPaths, $dstPath, $flags = 0 ) {
@@ -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 d29cd7d..cc9099c 100644 (file)
@@ -537,7 +537,7 @@ class ForeignAPIRepo extends FileRepo {
         * @since 1.23
         */
        protected static function getIIProps() {
-               return join( '|', self::$imageInfoProps );
+               return implode( '|', self::$imageInfoProps );
        }
 
        /**
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..0a3ded7 100644 (file)
@@ -1108,7 +1108,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 +1124,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 +1133,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 +1159,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 +1524,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 +1542,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 +1550,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 +1566,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..0b07765 100644 (file)
@@ -104,7 +104,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..6e5d656 100644 (file)
@@ -912,45 +912,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 57eaffe..154f7c3 100644 (file)
@@ -516,7 +516,7 @@ class MysqlUpdater extends DatabaseUpdater {
                                $prev_title = $row->cur_title;
                                $prev_namespace = $row->cur_namespace;
                        }
-                       $sql = "DELETE FROM $cur WHERE cur_id IN ( " . join( ',', $deleteId ) . ')';
+                       $sql = "DELETE FROM $cur WHERE cur_id IN ( " . implode( ',', $deleteId ) . ')';
                        $this->db->query( $sql, __METHOD__ );
                        $this->output( wfTimestamp( TS_DB ) );
                        $this->output( "......<b>Deleted</b> " . $this->db->affectedRows() . " records.\n" );
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 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 865447a..6fa5930 100644 (file)
        "config-install-mainpage": "Creating main page with default content",
        "config-install-extension-tables": "Creating tables for enabled extensions",
        "config-install-mainpage-failed": "Could not insert main page: $1",
-       "config-install-done": "<strong>Congratulations!</strong>\nYou have successfully installed MediaWiki.\n\nThe installer has generated a <code>LocalSettings.php</code> file.\nIt contains all your configuration.\n\nYou will need to download it and put it in the base of your wiki installation (the same directory as index.php). The download should have started automatically.\n\nIf the download was not offered, or if you cancelled it, you can restart the download by clicking the link below:\n\n$3\n\n<strong>Note:</strong> If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.\n\nWhen that has been done, you can <strong>[$2 enter your wiki]</strong>.",
+       "config-install-done": "<strong>Congratulations!</strong>\nYou have installed MediaWiki.\n\nThe installer has generated a <code>LocalSettings.php</code> file.\nIt contains all your configuration.\n\nYou will need to download it and put it in the base of your wiki installation (the same directory as index.php). The download should have started automatically.\n\nIf the download was not offered, or if you cancelled it, you can restart the download by clicking the link below:\n\n$3\n\n<strong>Note:</strong> If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.\n\nWhen that has been done, you can <strong>[$2 enter your wiki]</strong>.",
        "config-download-localsettings": "Download <code>LocalSettings.php</code>",
        "config-help": "help",
        "config-help-tooltip": "click to expand",
        "config-nofile": "File \"$1\" could not be found. Has it been deleted?",
        "config-extension-link": "Did you know that your wiki supports [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions]?\n\nYou can browse [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category] or the [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] to see the full list of extensions.",
-       "mainpagetext": "<strong>MediaWiki has been successfully installed.</strong>",
+       "mainpagetext": "<strong>MediaWiki has been installed.</strong>",
        "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.\n\n== Getting started ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\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 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..60fe204 100644 (file)
@@ -22,7 +22,8 @@
                        "Wladek92",
                        "Scoopfinder",
                        "Seb35",
-                       "Linedwell"
+                       "Linedwell",
+                       "Orlodrim"
                ]
        },
        "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": "'''Félicitations!'''\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 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-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 f524b32..2909e52 100644 (file)
        "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-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": "Höfundaréttur og leyfi",
        "config-license-pd": "Almenningseign",
+       "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-help": "_Hjálp",
        "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 71c5231..e7bed0e 100644 (file)
@@ -13,7 +13,7 @@
        "config-localsettings-upgrade": "Aptiktas failas <code>LocalSettings.php</code>. Norėdami patobulinti šią instaliaciją, prašome įvesti reikšmę <code>$wgUpgradeKey</code> į dėžutę žemiau. Jūs rasite ją <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "Aptiktas failas <code>LocalSettings.php</code>. Tam kad patobulinti šią instaliaciją, prašome paleisti <code>update.php</code>.",
        "config-localsettings-key": "Naujinimo raktas:",
-       "config-localsettings-badkey": "Raktas, kurį pateikėte, yra neteisingas.",
+       "config-localsettings-badkey": "Atnaujinimo raktas, kurį pateikėte, yra neteisingas.",
        "config-upgrade-key-missing": "Aptikta esama MediaWiki instaliacija. Tam kad atnaujinti šią instaliaciją, prašome įrašyti šią eilutę <code>LocalSettings.php</code> failo pabaigoje:\n\n$1",
        "config-localsettings-incomplete": "Esamas failas <code>LocalSettings.php</code> yra nepilnas. Nenustatytas kintamasis $1.\nPrašome pakeisti failą <code>LocalSettings.php</code> tai, kad kintamasis būtų nustatytas ir spauskite „{{int:Config-continue}}“.",
        "config-localsettings-connection-error": "Buvo susidurta su klaida, kai jungtasi prie duomenų bazės naudojantis nustatymais iš <code>LocalSettings.php</code>. Prašome pataisyti šiuos nustatymus ir bandyti dar kartą.\n\n$1",
@@ -54,6 +54,7 @@
        "config-apc": "[http://www.php.net/apc APC] yra įdiegtas",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] yra įdiegtas",
        "config-diff3-bad": "GNU diff3 nerastas.",
+       "config-using-server": "Naudojant serverio pavadinimas „<nowiki>$1</nowiki>“.",
        "config-using-uri": "Naudojamas serverio URL „<nowiki>$1$2</nowiki>“.",
        "config-db-type": "Duomenų bazės tipas:",
        "config-db-host": "Duomenų bazės serveris:",
        "config-header-oracle": "Oracle nustatymai",
        "config-header-mssql": "„Microsoft“ SQL serverio nustatymai",
        "config-invalid-db-type": "Neteisingas duomenų bazės tipas",
+       "config-missing-db-name": "Privalote įvesti „{{int:config-db-name}}“ reikšmę.",
        "config-missing-db-host": "Privalote įvesti „{{int:config-db-host}}“ reikšmę.",
        "config-missing-db-server-oracle": "Privalote įvesti „{{int:config-db-host-oracle}}“ reikšmę.",
        "config-postgres-old": "PostgreSQL $1 ar vėlesnė yra reikalinga. Jūs turite $2.",
+       "config-sqlite-cant-create-db": "Nepavyko sukurti duomenų bazės failo <code>$1</code>.",
        "config-regenerate": "Pergeneruoti LocalSettings.php →",
        "config-db-web-account-same": "Naudoti tą pačią paskyrą kaip ir įdiegimui",
        "config-db-web-create": "Sukurti paskyrą, jeigu jos nėra",
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 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 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 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 aaf9fb0..479ec32 100644 (file)
@@ -452,7 +452,6 @@ class JobQueueDB extends JobQueue {
         * @see JobQueue::doAck()
         * @param Job $job
         * @throws MWException
-        * @return Job|bool
         */
        protected function doAck( Job $job ) {
                if ( !isset( $job->metadata['id'] ) ) {
@@ -476,8 +475,6 @@ class JobQueueDB extends JobQueue {
                } catch ( DBError $e ) {
                        $this->throwDBException( $e );
                }
-
-               return true;
        }
 
        /**
index c127239..bd832db 100644 (file)
@@ -49,7 +49,7 @@
 class JobQueueFederated extends JobQueue {
        /** @var HashRing */
        protected $partitionRing;
-       /** @var array (partition name => JobQueue) reverse sorted by weight */
+       /** @var JobQueue[] (partition name => JobQueue) reverse sorted by weight */
        protected $partitionQueues = [];
 
        /** @var int Maximum number of partitions to try */
@@ -311,7 +311,7 @@ class JobQueueFederated extends JobQueue {
                        throw new MWException( "The given job has no defined partition name." );
                }
 
-               return $this->partitionQueues[$job->metadata['QueuePartition']]->ack( $job );
+               $this->partitionQueues[$job->metadata['QueuePartition']]->ack( $job );
        }
 
        protected function doIsRootJobOldDuplicate( Job $job ) {
index 30907e6..4f8f6b3 100644 (file)
@@ -72,10 +72,13 @@ class EmailNotification {
        protected $editor;
 
        /**
+        * @deprecated since 1.27 use WatchedItemStore::updateNotificationTimestamp directly
+        *
         * @param User $editor The editor that triggered the update.  Their notification
         *  timestamp will not be updated(they have already seen it)
         * @param LinkTarget $linkTarget The link target of the title to update timestamps for
         * @param string $timestamp Set the update timestamp to this value
+        *
         * @return int[] Array of user IDs
         */
        public static function updateWatchlistTimestamp(
@@ -83,47 +86,16 @@ class EmailNotification {
                LinkTarget $linkTarget,
                $timestamp
        ) {
-               global $wgEnotifWatchlist, $wgShowUpdatedMarker;
-
-               if ( !$wgEnotifWatchlist && !$wgShowUpdatedMarker ) {
+               // wfDeprecated( __METHOD__, '1.27' );
+               $config = RequestContext::getMain()->getConfig();
+               if ( !$config->get( 'EnotifWatchlist' ) && !$config->get( 'ShowUpdatedMarker' ) ) {
                        return [];
                }
-
-               $dbw = wfGetDB( DB_MASTER );
-               $res = $dbw->select( [ 'watchlist' ],
-                       [ 'wl_user' ],
-                       [
-                               'wl_user != ' . intval( $editor->getID() ),
-                               'wl_namespace' => $linkTarget->getNamespace(),
-                               'wl_title' => $linkTarget->getDBkey(),
-                               'wl_notificationtimestamp IS NULL',
-                       ], __METHOD__
+               return WatchedItemStore::getDefaultInstance()->updateNotificationTimestamp(
+                       $editor,
+                       $linkTarget,
+                       $timestamp
                );
-
-               $watchers = [];
-               foreach ( $res as $row ) {
-                       $watchers[] = intval( $row->wl_user );
-               }
-
-               if ( $watchers ) {
-                       // Update wl_notificationtimestamp for all watching users except the editor
-                       $fname = __METHOD__;
-                       $dbw->onTransactionIdle(
-                               function () use ( $dbw, $timestamp, $watchers, $linkTarget, $fname ) {
-                                       $dbw->update( 'watchlist',
-                                               [ /* SET */
-                                                       'wl_notificationtimestamp' => $dbw->timestamp( $timestamp )
-                                               ], [ /* WHERE */
-                                                       'wl_user' => $watchers,
-                                                       'wl_namespace' => $linkTarget->getNamespace(),
-                                                       'wl_title' => $linkTarget->getDBkey(),
-                                               ], $fname
-                                       );
-                               }
-                       );
-               }
-
-               return $watchers;
        }
 
        /**
@@ -149,7 +121,15 @@ class EmailNotification {
                }
 
                // update wl_notificationtimestamp for watchers
-               $watchers = self::updateWatchlistTimestamp( $editor, $title, $timestamp );
+               $config = RequestContext::getMain()->getConfig();
+               $watchers = [];
+               if ( $config->get( 'EnotifWatchlist' ) || $config->get( 'ShowUpdatedMarker' ) ) {
+                       $watchers = WatchedItemStore::getDefaultInstance()->updateNotificationTimestamp(
+                               $editor,
+                               $title,
+                               $timestamp
+                       );
+               }
 
                $sendEmail = true;
                // $watchers deals with $wgEnotifWatchlist.
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 d65e8be..d7ba266 100644 (file)
@@ -4636,7 +4636,7 @@ class Parser {
                        $anchor = $safeHeadline;
                        $legacyAnchor = $legacyHeadline;
                        if ( isset( $refers[$arrayKey] ) ) {
-                               // @codingStandardsIgnoreStart 
+                               // @codingStandardsIgnoreStart
                                for ( $i = 2; isset( $refers["${arrayKey}_$i"] ); ++$i );
                                // @codingStandardsIgnoreEnd
                                $anchor .= "_$i";
@@ -4645,7 +4645,7 @@ class Parser {
                                $refers[$arrayKey] = true;
                        }
                        if ( $legacyHeadline !== false && isset( $refers[$legacyArrayKey] ) ) {
-                               // @codingStandardsIgnoreStart 
+                               // @codingStandardsIgnoreStart
                                for ( $i = 2; isset( $refers["${legacyArrayKey}_$i"] ); ++$i );
                                // @codingStandardsIgnoreEnd
                                $legacyAnchor .= "_$i";
@@ -4793,7 +4793,7 @@ class Parser {
                        $sections[0] = $sections[0] . $toc . "\n";
                }
 
-               $full .= join( '', $sections );
+               $full .= implode( '', $sections );
 
                if ( $this->mForceTocPosition ) {
                        return str_replace( '<!--MWTOC-->', $toc, $full );
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 598702d..5e8fb04 100644 (file)
@@ -160,7 +160,7 @@ class SearchMssql extends SearchDatabase {
                        }
                }
 
-               $searchon = $this->db->addQuotes( join( ',', $q ) );
+               $searchon = $this->db->addQuotes( implode( ',', $q ) );
                $field = $this->getIndexField( $fulltext );
                return "$field, $searchon";
        }
index 70c771d..bbdfdc3 100644 (file)
@@ -120,7 +120,7 @@ class BotPasswordSessionProvider extends ImmutableSessionProviderWithCookie {
                if ( $missingKeys ) {
                        $this->logger->info( 'Session "{session}": Missing metadata: {missing}', [
                                'session' => $info,
-                               'missing' => join( ', ', $missingKeys ),
+                               'missing' => implode( ', ', $missingKeys ),
                        ] );
                        return false;
                }
index 21db609..0fd8fa8 100644 (file)
@@ -352,7 +352,7 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
                        $new = true;
                }
                if ( is_array( $salt ) ) {
-                       $salt = join( '|', $salt );
+                       $salt = implode( '|', $salt );
                }
                return new Token( $secret, (string)$salt, $new );
        }
index 81f8243..0a304a9 100644 (file)
@@ -287,7 +287,7 @@ final class SessionManager implements SessionManagerInterface {
                // Make sure there's exactly one
                if ( count( $infos ) > 1 ) {
                        throw new \UnexpectedValueException(
-                               'Multiple empty sessions tied for top priority: ' . join( ', ', $infos )
+                               'Multiple empty sessions tied for top priority: ' . implode( ', ', $infos )
                        );
                } elseif ( count( $infos ) < 1 ) {
                        throw new \UnexpectedValueException( 'No provider could provide an empty session!' );
@@ -537,7 +537,7 @@ final class SessionManager implements SessionManagerInterface {
                \DeferredUpdates::addUpdate( new \SiteStatsUpdate( 0, 0, 0, 0, 1 ) );
 
                # Watch user's userpage and talk page
-               $user->addWatch( $user->getUserPage(), \WatchedItem::IGNORE_USER_RIGHTS );
+               $user->addWatch( $user->getUserPage(), User::IGNORE_USER_RIGHTS );
 
                return true;
        }
@@ -677,7 +677,7 @@ final class SessionManager implements SessionManagerInterface {
 
                if ( count( $retInfos ) > 1 ) {
                        $ex = new \OverflowException(
-                               'Multiple sessions for this request tied for top priority: ' . join( ', ', $retInfos )
+                               'Multiple sessions for this request tied for top priority: ' . implode( ', ', $retInfos )
                        );
                        $ex->sessionInfos = $retInfos;
                        throw $ex;
@@ -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 d6e0377..419c4b4 100644 (file)
@@ -248,6 +248,30 @@ class SkinTemplate extends Skin {
 
        }
 
+       /**
+        * Wrap the body text with language information and identifiable element
+        *
+        * @param Title $title
+        * @return string html
+        */
+       protected function wrapHTML( $title, $html ) {
+               # An ID that includes the actual body text; without categories, contentSub, ...
+               $realBodyAttribs = [ 'id' => 'mw-content-text' ];
+
+               # Add a mw-content-ltr/rtl class to be able to style based on text direction
+               # when the content is different from the UI language, i.e.:
+               # not for special pages or file pages AND only when viewing
+               if ( !in_array( $title->getNamespace(), [ NS_SPECIAL, NS_FILE ] ) &&
+                       Action::getActionName( $this ) === 'view' ) {
+                       $pageLang = $title->getPageViewLanguage();
+                       $realBodyAttribs['lang'] = $pageLang->getHtmlCode();
+                       $realBodyAttribs['dir'] = $pageLang->getDir();
+                       $realBodyAttribs['class'] = 'mw-content-' . $pageLang->getDir();
+               }
+
+               return Html::rawElement( 'div', $realBodyAttribs, $html );
+       }
+
        /**
         * initialize various variables and generate the template
         *
@@ -424,22 +448,8 @@ class SkinTemplate extends Skin {
                $tpl->set( 'sitenotice', $this->getSiteNotice() );
                $tpl->set( 'bottomscripts', $this->bottomScripts() );
                $tpl->set( 'printfooter', $this->printSource() );
-
-               # An ID that includes the actual body text; without categories, contentSub, ...
-               $realBodyAttribs = [ 'id' => 'mw-content-text' ];
-
-               # Add a mw-content-ltr/rtl class to be able to style based on text direction
-               # when the content is different from the UI language, i.e.:
-               # not for special pages or file pages AND only when viewing
-               if ( !in_array( $title->getNamespace(), [ NS_SPECIAL, NS_FILE ] ) &&
-                       Action::getActionName( $this ) === 'view' ) {
-                       $pageLang = $title->getPageViewLanguage();
-                       $realBodyAttribs['lang'] = $pageLang->getHtmlCode();
-                       $realBodyAttribs['dir'] = $pageLang->getDir();
-                       $realBodyAttribs['class'] = 'mw-content-' . $pageLang->getDir();
-               }
-
-               $out->mBodytext = Html::rawElement( 'div', $realBodyAttribs, $out->mBodytext );
+               // Wrap the bodyText with #mw-content-text element
+               $out->mBodytext = $this->wrapHTML( $title, $out->mBodytext );
                $tpl->setRef( 'bodytext', $out->mBodytext );
 
                $language_urls = $this->getLanguages();
@@ -640,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 ),
@@ -683,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 bc2bb31..8ce480e 100644 (file)
@@ -582,31 +582,51 @@ class SpecialPageFactory {
         * @return string HTML fragment
         */
        public static function capturePath( Title $title, IContextSource $context ) {
-               global $wgOut, $wgTitle, $wgRequest, $wgUser, $wgLang;
-
-               // Save current globals
-               $oldTitle = $wgTitle;
-               $oldOut = $wgOut;
-               $oldRequest = $wgRequest;
-               $oldUser = $wgUser;
-               $oldLang = $wgLang;
-
-               // Set the globals to the current context
+               global $wgTitle, $wgOut, $wgRequest, $wgUser, $wgLang;
+               $main = RequestContext::getMain();
+
+               // Save current globals and main context
+               $glob = [
+                       'title' => $wgTitle,
+                       'output' => $wgOut,
+                       'request' => $wgRequest,
+                       'user' => $wgUser,
+                       'language' => $wgLang,
+               ];
+               $ctx = [
+                       'title' => $main->getTitle(),
+                       'output' => $main->getOutput(),
+                       'request' => $main->getRequest(),
+                       'user' => $main->getUser(),
+                       'language' => $main->getLanguage(),
+               ];
+
+               // Override
                $wgTitle = $title;
                $wgOut = $context->getOutput();
                $wgRequest = $context->getRequest();
                $wgUser = $context->getUser();
                $wgLang = $context->getLanguage();
+               $main->setTitle( $title );
+               $main->setOutput( $context->getOutput() );
+               $main->setRequest( $context->getRequest() );
+               $main->setUser( $context->getUser() );
+               $main->setLanguage( $context->getLanguage() );
 
                // The useful part
                $ret = self::executePath( $title, $context, true );
 
-               // And restore the old globals
-               $wgTitle = $oldTitle;
-               $wgOut = $oldOut;
-               $wgRequest = $oldRequest;
-               $wgUser = $oldUser;
-               $wgLang = $oldLang;
+               // Restore old globals and context
+               $wgTitle = $glob['title'];
+               $wgOut = $glob['output'];
+               $wgRequest = $glob['request'];
+               $wgUser = $glob['user'];
+               $wgLang = $glob['language'];
+               $main->setTitle( $ctx['title'] );
+               $main->setOutput( $ctx['output'] );
+               $main->setRequest( $ctx['request'] );
+               $main->setUser( $ctx['user'] );
+               $main->setLanguage( $ctx['language'] );
 
                return $ret;
        }
index 9930655..625e4aa 100644 (file)
@@ -794,7 +794,7 @@ class SpecialBlock extends FormSpecialPage {
                        WatchAction::doWatch(
                                Title::makeTitle( NS_USER, $target ),
                                $performer,
-                               WatchedItem::IGNORE_USER_RIGHTS
+                               User::IGNORE_USER_RIGHTS
                        );
                }
 
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 72f8cca..fe1dd98 100644 (file)
@@ -581,7 +581,7 @@ class ImportReporter extends ContextSource {
         * @param array $pageInfo
         * @return void
         */
-       function reportPage( $title, $foreignTitle, $revisionCount,
+       public function reportPage( $title, $foreignTitle, $revisionCount,
                        $successCount, $pageInfo ) {
                $args = func_get_args();
                call_user_func_array( $this->mOriginalPageOutCallback, $args );
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 6b61ef9..8d45468 100644 (file)
@@ -714,7 +714,7 @@ class LoginForm extends SpecialPage {
                DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 0, 0, 0, 1 ) );
 
                // Watch user's userpage and talk page
-               $u->addWatch( $u->getUserPage(), WatchedItem::IGNORE_USER_RIGHTS );
+               $u->addWatch( $u->getUserPage(), User::IGNORE_USER_RIGHTS );
 
                return Status::newGood( $u );
        }
index 4a0b413..f19c0f2 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,11 +58,11 @@ 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' );
 
@@ -90,7 +90,7 @@ class UserloginTemplate extends BaseTemplate {
                        </div>
 
                        <div class="mw-ui-vform-field">
-                               <label for='wpPassword1'>
+                               <label for="wpPassword1">
                                        <?php
                                        $this->msg( 'userlogin-yourpassword' );
                                        ?>
@@ -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 } ?>
@@ -148,7 +148,7 @@ class UserloginTemplate extends BaseTemplate {
                                        'tabindex' => '6',
                                );
                                $modifiers = array(
-                                       'mw-ui-constructive',
+                                       'mw-ui-progressive',
                                );
                                echo Html::submitButton( $this->getMsg( 'pt-login-button' )->text(), $attrs, $modifiers );
                                ?>
@@ -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 c1e538a..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
@@ -716,7 +735,7 @@ abstract class UploadBase {
                                WatchAction::doWatch(
                                        $this->getLocalFile()->getTitle(),
                                        $user,
-                                       WatchedItem::IGNORE_USER_RIGHTS
+                                       User::IGNORE_USER_RIGHTS
                                );
                        }
                        Hooks::run( 'UploadComplete', [ &$this ] );
@@ -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 d82a9e6..ebb4ebb 100644 (file)
@@ -145,12 +145,12 @@ class UploadFromChunks extends UploadFromFile {
                if ( !$status->isOk() ) {
                        return $status;
                }
+
                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 7bc410d..09124bf 100644 (file)
@@ -62,17 +62,22 @@ class User implements IDBAccessObject {
         */
        const VERSION = 10;
 
-       /**
-        * Maximum items in $mWatchedItems
-        */
-       const MAX_WATCHED_ITEMS_CACHE = 100;
-
        /**
         * Exclude user options that are set to their default value.
         * @since 1.25
         */
        const GETOPTIONS_EXCLUDE_DEFAULTS = 1;
 
+       /**
+        * @since 1.27
+        */
+       const CHECK_USER_RIGHTS = true;
+
+       /**
+        * @since 1.27
+        */
+       const IGNORE_USER_RIGHTS = false;
+
        /**
         * Array of Strings List of member variables which are saved to the
         * shared cache (memcached). Any operation which changes the
@@ -291,9 +296,6 @@ class User implements IDBAccessObject {
        /** @var Block */
        private $mBlockedFromCreateAccount = false;
 
-       /** @var array */
-       private $mWatchedItems = [];
-
        /** @var integer User::READ_* constant bitfield used to load data */
        protected $queryFlagsUsed = self::READ_NORMAL;
 
@@ -856,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;
                }
 
@@ -867,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;
                }
 
@@ -883,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;
                }
 
@@ -3445,51 +3441,36 @@ class User implements IDBAccessObject {
                }
        }
 
-       /**
-        * Get a WatchedItem for this user and $title.
-        *
-        * @since 1.22 $checkRights parameter added
-        * @param Title $title
-        * @param int $checkRights Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
-        *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
-        * @return WatchedItem
-        */
-       public function getWatchedItem( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
-               $key = $checkRights . ':' . $title->getNamespace() . ':' . $title->getDBkey();
-
-               if ( isset( $this->mWatchedItems[$key] ) ) {
-                       return $this->mWatchedItems[$key];
-               }
-
-               if ( count( $this->mWatchedItems ) >= self::MAX_WATCHED_ITEMS_CACHE ) {
-                       $this->mWatchedItems = [];
-               }
-
-               $this->mWatchedItems[$key] = WatchedItem::fromUserTitle( $this, $title, $checkRights );
-               return $this->mWatchedItems[$key];
-       }
-
        /**
         * Check the watched status of an article.
         * @since 1.22 $checkRights parameter added
         * @param Title $title Title of the article to look at
-        * @param int $checkRights Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
-        *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
+        * @param bool $checkRights Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+        *     Pass User::CHECK_USER_RIGHTS or User::IGNORE_USER_RIGHTS.
         * @return bool
         */
-       public function isWatched( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
-               return $this->getWatchedItem( $title, $checkRights )->isWatched();
+       public function isWatched( $title, $checkRights = self::CHECK_USER_RIGHTS ) {
+               if ( $title->isWatchable() && ( !$checkRights || $this->isAllowed( 'viewmywatchlist' ) ) ) {
+                       return WatchedItemStore::getDefaultInstance()->isWatched( $this, $title );
+               }
+               return false;
        }
 
        /**
         * Watch an article.
         * @since 1.22 $checkRights parameter added
         * @param Title $title Title of the article to look at
-        * @param int $checkRights Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
-        *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
-        */
-       public function addWatch( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
-               $this->getWatchedItem( $title, $checkRights )->addWatch();
+        * @param bool $checkRights Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+        *     Pass User::CHECK_USER_RIGHTS or User::IGNORE_USER_RIGHTS.
+        */
+       public function addWatch( $title, $checkRights = self::CHECK_USER_RIGHTS ) {
+               if ( !$checkRights || $this->isAllowed( 'editmywatchlist' ) ) {
+                       WatchedItemStore::getDefaultInstance()->addWatchBatch( [
+                               [ $this, $title->getSubjectPage() ],
+                               [ $this, $title->getTalkPage() ],
+                       ]
+                       );
+               }
                $this->invalidateCache();
        }
 
@@ -3497,11 +3478,14 @@ class User implements IDBAccessObject {
         * Stop watching an article.
         * @since 1.22 $checkRights parameter added
         * @param Title $title Title of the article to look at
-        * @param int $checkRights Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
-        *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
+        * @param bool $checkRights Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+        *     Pass User::CHECK_USER_RIGHTS or User::IGNORE_USER_RIGHTS.
         */
-       public function removeWatch( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
-               $this->getWatchedItem( $title, $checkRights )->removeWatch();
+       public function removeWatch( $title, $checkRights = self::CHECK_USER_RIGHTS ) {
+               if ( !$checkRights || $this->isAllowed( 'editmywatchlist' ) ) {
+                       WatchedItemStore::getDefaultInstance()->removeWatch( $this, $title->getSubjectPage() );
+                       WatchedItemStore::getDefaultInstance()->removeWatch( $this, $title->getTalkPage() );
+               }
                $this->invalidateCache();
        }
 
@@ -3569,9 +3553,8 @@ class User implements IDBAccessObject {
                        $force = 'force';
                }
 
-               $this->getWatchedItem( $title )->resetNotificationTimestamp(
-                       $force, $oldid
-               );
+               WatchedItemStore::getDefaultInstance()
+                       ->resetNotificationTimestamp( $this, $title, $force, $oldid );
        }
 
        /**
index 521e345..617e8f5 100644 (file)
@@ -69,13 +69,13 @@ class MWRestrictions {
                $invalidKeys = array_diff( $keys, $validKeys );
                if ( $invalidKeys ) {
                        throw new InvalidArgumentException(
-                               'Array contains invalid keys: ' . join( ', ', $invalidKeys )
+                               'Array contains invalid keys: ' . implode( ', ', $invalidKeys )
                        );
                }
                $missingKeys = array_diff( $neededKeys, $keys );
                if ( $missingKeys ) {
                        throw new InvalidArgumentException(
-                               'Array is missing required keys: ' . join( ', ', $missingKeys )
+                               'Array is missing required keys: ' . implode( ', ', $missingKeys )
                        );
                }
 
index 0bd2276..6f404dd 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,33 +788,6 @@ class Language {
                return $this->getMessageFromDB( "tog-$tog" );
        }
 
-       /**
-        * Get native language names, indexed by code.
-        * Only those defined in MediaWiki, no other data like CLDR.
-        * If $customisedOnly is true, only returns codes with a messages file
-        *
-        * @param bool $customisedOnly
-        *
-        * @return array
-        * @deprecated since 1.20, use fetchLanguageNames()
-        */
-       public static function getLanguageNames( $customisedOnly = false ) {
-               return self::fetchLanguageNames( null, $customisedOnly ? 'mwfile' : 'mw' );
-       }
-
-       /**
-        * 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
@@ -954,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
@@ -2896,6 +2844,7 @@ class Language {
        /**
         * @param string $s
         * @return string
+        * @throws MWException
         */
        function checkTitleEncoding( $s ) {
                if ( is_array( $s ) ) {
@@ -4235,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 );
@@ -4282,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).
@@ -4416,6 +4356,7 @@ class Language {
        /**
         * @param string $code
         * @return string
+        * @throws MWException
         * @since 1.23
         */
        public static function getJsonMessagesFileName( $code ) {
@@ -4581,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 b36f080..89625c0 100644 (file)
@@ -52,11 +52,11 @@ class LanguageCu extends Language {
                if ( !preg_match( "/[a-zA-Z_]/us", $word ) ) {
                        switch ( $case ) {
                                case 'genitive': # родительный падеж
-                                       if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вики' )
-                                               || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вики' )
+                                       if ( ( implode( '', array_slice( $ar[0], -4 ) ) == 'вики' )
+                                               || ( implode( '', array_slice( $ar[0], -4 ) ) == 'Вики' )
                                        ) {
-                                       } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ї' ) {
-                                               $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'їѩ';
+                                       } elseif ( implode( '', array_slice( $ar[0], -2 ) ) == 'ї' ) {
+                                               $word = implode( '', array_slice( $ar[0], 0, -2 ) ) . 'їѩ';
                                        }
                                        break;
                                case 'accusative': # винительный падеж
index f6d5270..05b0ebe 100644 (file)
@@ -52,12 +52,12 @@ class LanguageHy extends Language {
                if ( !preg_match( "/[a-zA-Z_]/us", $word ) ) {
                        switch ( $case ) {
                                case 'genitive': # սեռական հոլով
-                                       if ( join( '', array_slice( $ar[0], -1 ) ) == 'ա' ) {
-                                               $word = join( '', array_slice( $ar[0], 0, -1 ) ) . 'այի';
-                                       } elseif ( join( '', array_slice( $ar[0], -1 ) ) == 'ո' ) {
-                                               $word = join( '', array_slice( $ar[0], 0, -1 ) ) . 'ոյի';
-                                       } elseif ( join( '', array_slice( $ar[0], -4 ) ) == 'գիրք' ) {
-                                               $word = join( '', array_slice( $ar[0], 0, -4 ) ) . 'գրքի';
+                                       if ( implode( '', array_slice( $ar[0], -1 ) ) == 'ա' ) {
+                                               $word = implode( '', array_slice( $ar[0], 0, -1 ) ) . 'այի';
+                                       } elseif ( implode( '', array_slice( $ar[0], -1 ) ) == 'ո' ) {
+                                               $word = implode( '', array_slice( $ar[0], 0, -1 ) ) . 'ոյի';
+                                       } elseif ( implode( '', array_slice( $ar[0], -4 ) ) == 'գիրք' ) {
+                                               $word = implode( '', array_slice( $ar[0], 0, -4 ) ) . 'գրքի';
                                        } else {
                                                $word .= 'ի';
                                        }
index 6cc23e3..72bde40 100644 (file)
@@ -51,19 +51,19 @@ class LanguageUk extends Language {
                if ( !preg_match( "/[a-zA-Z_]/us", $word ) ) {
                        switch ( $case ) {
                                case 'genitive': # родовий відмінок
-                                       if ( join( '', array_slice( $ar[0], -2 ) ) === 'ія' ) {
-                                               $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ії';
-                                       } elseif ( join( '', array_slice( $ar[0], -2 ) ) === 'ти' ) {
-                                               $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'т';
-                                       } elseif ( join( '', array_slice( $ar[0], -2 ) ) === 'ди' ) {
-                                               $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'дів';
-                                       } elseif ( join( '', array_slice( $ar[0], -3 ) ) === 'ник' ) {
-                                               $word = join( '', array_slice( $ar[0], 0, -3 ) ) . 'ника';
+                                       if ( implode( '', array_slice( $ar[0], -2 ) ) === 'ія' ) {
+                                               $word = implode( '', array_slice( $ar[0], 0, -2 ) ) . 'ії';
+                                       } elseif ( implode( '', array_slice( $ar[0], -2 ) ) === 'ти' ) {
+                                               $word = implode( '', array_slice( $ar[0], 0, -2 ) ) . 'т';
+                                       } elseif ( implode( '', array_slice( $ar[0], -2 ) ) === 'ди' ) {
+                                               $word = implode( '', array_slice( $ar[0], 0, -2 ) ) . 'дів';
+                                       } elseif ( implode( '', array_slice( $ar[0], -3 ) ) === 'ник' ) {
+                                               $word = implode( '', array_slice( $ar[0], 0, -3 ) ) . 'ника';
                                        }
                                        break;
                                case 'accusative': # знахідний відмінок
-                                       if ( join( '', array_slice( $ar[0], -2 ) ) === 'ія' ) {
-                                               $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ію';
+                                       if ( implode( '', array_slice( $ar[0], -2 ) ) === 'ія' ) {
+                                               $word = implode( '', array_slice( $ar[0], 0, -2 ) ) . 'ію';
                                        }
                                        break;
                        }
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..318f8a2 100644 (file)
@@ -58,7 +58,8 @@
                        "Haytham morsy",
                        "BAB ZAA",
                        "ASammour",
-                       "Maroen1990"
+                       "Maroen1990",
+                       "Sonic N800"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "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\" قد حذفت.",
        "resetpass_forbidden": "كلمات السر لا يمكن تغييرها",
        "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": "الصفحة المصدر غير صالحة.",
        "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-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 5131276..cc23671 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": "نوفامبر",
-       "december": "ديسامبر",
+       "july": "جويلية",
+       "august": "اوت",
+       "september": "سبتمبر",
+       "october": "اكتوبر",
+       "november": "نوفمبر",
+       "december": "ديسمبر",
        "january-gen": "جانفي",
        "february-gen": "فيفري",
        "march-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",
        "unprotectthispage": "بدّل الحضية تاع هاد الباجة",
        "newpage": "باجه جديده",
        "talkpage": "قرعَج على هاد الباجة",
-       "talkpagelinktext": "مهادرة",
+       "talkpagelinktext": "تناقش",
        "specialpage": "باجة خوصوصيّة",
-       "personaltools": "دÙ\88زاÙ\86 Ø´Ø®ØµÙ\8aÙ\87",
+       "personaltools": "ادÙ\8eÙ\88ات Ø´Ø®ØµÙ\8aÙ\91Ø©",
        "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": "السياسة تاع الخصوصيات (الدين الضيّق)",
-       "privacypage": "Project:خصÙ\88صÙ\8aÙ\87",
+       "portal": "بÙ\88ابة المجتمع",
+       "portal-url": "Project:بÙ\88ابة المجتمع",
+       "privacy": "السياسة تاع الخصوصيّة",
+       "privacypage": "Project:اÙ\84سÙ\8aاسة ØªØ§Ø¹ Ø§Ù\84خصÙ\88صÙ\8aÙ\91Ø©",
        "badaccess": "مشكل فل مسموحات",
        "badaccess-group0": "ماشي مقبول ليك تدير الشي الّي راك تسيّي تديرهُ.",
        "badaccess-groups": "الفعلة الّي راك سيّيت تديرها مسموحة برك لل مستعملّين {{PLURAL:$2||الّي هوما منل جماعة|الّي هوما من وحدة من هاد الجمايع}}: $1.",
        "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).",
        "viewsourceold": "شوف الاصل",
        "editlink": "تبديل",
        "viewsourcelink": "شوف العين",
-       "editsectionhint": "Ø¥Ù\8aدÙ\8aتÙ\8a Ø§Ù\84صÙ\86Ù\81:$1",
+       "editsectionhint": "بدÙ\91Ù\84 Ù\81 Ø§Ù\84سÙ\83سÙ\8aÙ\88Ù\86$1",
        "toc": "محتويات",
        "showtoc": "ورّي",
        "hidetoc": "خبّي",
        "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 (اÙ\84باجة Ù\85ا Ù\83اÙ\8aÙ\86Ø´)",
+       "red-link-title": "$1 (اÙ\84باجة Ù\85ا Ù\83اÙ\8aÙ\86Ø© Ø´Ù\8a)",
        "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": "هاد الباجة الخوصوصيّة ما كاينش منها",
        "myprivateinfoprotected": "ما عندكش السراح باش تبدّل المعلومات الشخصيّة ديالك.",
        "mypreferencesprotected": "ما عندكش السراح باش تبدّل الإختيّارات ديالك.",
        "ns-specialprotected": "الپاجات الخصيصة ما تنجمش تتبدّل.",
-       "titleprotected": "هاد العلوان راه محضي من` التبدال من عند [[User:$1|$1]].\nالسبّة الّي مدّها هيّا <em>$2</em>.",
+       "titleprotected": "[[User:$1|$1]] {{GENDER:$1|حمى|حمات}} هاذ العنوان م الخلقان.\nالسبّة تاعو هيّ <em>$2</em>.",
        "filereadonlyerror": "ماشي ممكن تبدال الفيشي \"$1\" خاطرش الزمّام \"$2\" راه مشغّلة فيه الخاصيّة \"اقرا برك\".\n\nالموسيّر الّي غلقهُ راه ماد التفسير هادا: \"$3\".",
        "invalidtitle-knownnamespace": "علوان ماشي مقبول ب وسَع تاع تسميّة \"$2\" معا الكتيبة \"$3\".",
        "invalidtitle-unknownnamespace": "علوان ماشي مقبول ب نمرو ماشي معروف تاع الوسَع تاع تسميّة \"$1\" معا الكتيبة \"$2\".",
        "loginlanguagelabel": "اللوغه: $1",
        "suspicious-userlogout": "المطلب تاعك باش تسجّل خارج ما تسجّلش خاطر راه يبان مرسول من عند بحّار معطّل ولا  خزّان تاع وسّاط (proxy cache).",
        "createacct-another-realname-tip": "السميّة الحقّانيّة ماشي ملزومة.\nيلا تستعملها غادي تصلاح باش تنسّب ليك الخدمة الّي غادي تديرها.",
-       "pt-login": "دخÙ\84Ø©",
+       "pt-login": "ادخÙ\84",
        "pt-login-button": "دخول",
-       "pt-createaccount": "اصÙ\86ع Ø­Ø³Ø§Ø¨",
+       "pt-createaccount": "اعÙ\85Ù\84 Ù\83Ù\88Ù\86ت",
        "pt-userlogout": "الخروج",
        "php-mail-error-unknown": "غلطة مجهولة صرات فل وضيفة mail() تاع PHP.",
        "user-mail-no-addy": "راك سيّيت تبعت إيمال بلا ما تحُطّ آدريسة ليه.",
        "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",
        "minoreditletter": "ط",
        "newpageletter": "ج‌",
        "boteditletter": "ب",
-       "rc-change-size-new": "$1 {{PLURAL:$1|octet|octets}} مورا التبدال",
+       "rc-change-size-new": "$1 {{PLURAL:$1|اوكتاتة|اوكتاتات}} بعد التبدال",
        "rc-enhanced-expand": "شوف التفاصيل",
        "rc-enhanced-hide": "خبي التفاصيل",
        "recentchangeslinked": "تبديلات مربوطه",
        "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Ø´ Ø¶Ø±Ù\88رÙ\8a",
-       "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 Ù\83Ù\88Ù\86ت Ù\88تدخÙ\84 Ù\81Ù\8aÙ\87Ø\9b Ù\84اÙ\83Ù\86 Ù\87اذا Ù\85ا Ø´Ù\8a Ù\85Ù\84زÙ\88Ù\85 Ø¹Ù\84Ù\8aÙ\83",
+       "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..ef8ef21 100644 (file)
        "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..b2fc126 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 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 53259dc..3842d27 100644 (file)
        "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» быў створаны.",
        "botpasswords-updated-title": "Пароль робата абноўлены",
        "botpasswords-updated-body": "Пароль робата «$1» быў пасьпяхова абноўлены.",
        "botpasswords-deleted-title": "Пароль робата выдалены",
        "grant-protect": "Абарона і зьняцьце абароны старонак",
        "grant-rollback": "Адкат зьменаў старонак",
        "grant-sendemail": "Адпраўка лістоў электроннай пошты іншым удзельнікам",
+       "grant-uploadeditmovefile": "Загрузка, замена і перайменаваньне файлаў",
        "newuserlogpage": "Журнал стварэньня рахункаў",
        "newuserlogpagetext": "Гэта журнал стварэньня рахункаў удзельнікаў і ўдзельніц.",
        "rightslog": "Журнал правоў удзельнікаў",
index f2a978e..d2ac95d 100644 (file)
        "title-invalid-interwiki": "Запытаны загаловак зьмяшчае інтэрвікі-спасылку, якую нельга ўжываць у назвах.",
        "title-invalid-talk-namespace": "Запытаная назва старонкі адпавядае старонцы размоў, якая не можа існаваць.",
        "title-invalid-characters": "Запытаная назва старонкі ўтрымлівае недапушчальныя сімвалы: \"$1\".",
+       "title-invalid-relative": "Назва ўтрымлівае адносны шлях. Адносныя назвы старонак (./, ../) недапушчальныя, паколькі яны часта недасяжныя падчас апрацоўкі карыстальніцкім браўзерам.",
        "title-invalid-magic-tilde": "Запытаная назва старонкі ўтрымлівае недапушчальную паслядоўнасць тыльдаў (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "Запытаная назва старонкі занадта доўгая. Яна павінна быць не даўжэй за $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\" паспяхова створаны.",
+       "botpasswords-updated-title": "Пароль робата абноўлены",
+       "botpasswords-updated-body": "Пароль для робата \"$1\" паспяхова абноўлены.",
+       "botpasswords-deleted-title": "Пароль робата сцёрты",
+       "botpasswords-deleted-body": "Пароль для робата \"$1\" паспяхова сцёрты.",
+       "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": "Змяніць пароль",
        "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Ніжэй паказаны журнал сціранняў і пераносаў для гэтай старонкі.",
        "log-fulllog": "Паглядзець поўны лог",
        "content-model-text": "звычайны тэкст",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Пусты аб'ект",
+       "content-json-empty-array": "Пусты масіў",
        "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Некаторыя шаблоны не будуць улучаныя.",
        "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": "Гісторыя старонкі",
        "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": "(яшчэ)",
        "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": "Аўта-пацверджаныя ўдзельнікі",
        "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",
        "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 */ новы падраздзел",
        "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-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": "Статыстыка",
        "pager-older-n": "{{PLURAL:$1|1 старэйшая|$1 старэйшыя}}",
        "suppress": "Падавіць",
        "querypage-disabled": "Гэта адмысловая старонка адключана для павышэння прадукцыйнасці.",
+       "apihelp": "Даведка па API",
+       "apihelp-no-such-module": "Модуль \"$1\" не знойдзены.",
+       "apisandbox-submit": "Зрабіць запыт",
+       "apisandbox-reset": "Ачысціць",
+       "apisandbox-retry": "Паўтарыць",
+       "apisandbox-examples": "Прыклады",
+       "apisandbox-dynamic-parameters": "Дадатковыя параметры",
+       "apisandbox-dynamic-parameters-add-label": "Дадаць параметр:",
        "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)",
        "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": "Гэтая старонка была сцёртая. Прычына сцірання паказаная ў ніжэй, разам з падрабязнасцямі пра ўдзельнікаў, якія правілі старонку перад сціраннем. Сам тэкст сцёртых версій даступны толькі адміністратарам.",
        "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-contributions": "Ð\9fеÑ\80алÑ\96к Ñ\83кладаÑ\9e {{GENDER:$1|гÑ\8dÑ\82ага Ñ\9eдзелÑ\8cнÑ\96ка|гÑ\8dÑ\82ай Ñ\83дзелÑ\8cнÑ\96Ñ\86Ñ\8b}}",
        "tooltip-t-emailuser": "Адаслаць удзельніку ліст эл.пошты",
        "tooltip-t-upload": "Укласці файлы",
        "tooltip-t-specialpages": "Пералік усіх адмысловых старонак",
        "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-edit": "правіць",
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 7188b0c..1867fe7 100644 (file)
@@ -6,7 +6,8 @@
                        "Rachitrali",
                        "Mjbmr",
                        "Macofe",
-                       "Hosseinblue"
+                       "Hosseinblue",
+                       "Dalba"
                ]
        },
        "tog-underline": "لینکانی جهلگا خط کشیتین",
        "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|نشان داته بوته|نشان داته انت}}).",
+       "rcnotefrom": "بِه جهلگا تغیرات شه <strong>$3, $4</strong> (تا <strong>$1</strong> {{PLURAL:$5|نشان داته بوته|نشان داته انت}}).",
        "rclistfrom": "نوکین تغیراتانئ نشان داتین شرو شه $3 $2",
        "rcshowhideminor": "$1 ئی کمین ایڈیٹان",
        "rcshowhideminor-show": "نشان داتین",
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 7824732..21fd01f 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টি পাতা}} নিচে দেখানো হল।}}",
        "revdelete-unsuppress": "সংশোধন পুনঃস্থাপনের উপর সীমাবদ্ধতা দূর করো",
        "revdelete-log": "কারণ:",
        "revdelete-submit": "নির্বাচিত {{PLURAL:$1|সংশোধনে|সংশোধসমূহে}} প্রয়োগ করো",
-       "revdelete-success": "'''সংশোধন দৃশ্যমানতা সফলভাবে হালনাগাদ করা হয়েছে।'''",
+       "revdelete-success": "সংশোধনের দৃশ্যমানতা হালনাগাদ করা হয়েছে।",
        "revdelete-failure": "সংশোধনের দৃশ্যমানতা হালনাগাদ করা যায়নি:\n$1",
        "logdelete-success": "'''ঘটনা দৃশ্যমানতা সফলভাবে স্থাপন করা হয়েছে।'''",
        "logdelete-failure": "'''লগ-এর দৃশ্যমানতা নির্ধারণ সম্ভব হচ্ছে না:'''\n$1",
        "grant-editmyoptions": "আপনার ব্যবহারকারী পছন্দসমূহ সম্পাদনা করুন",
        "grant-editmywatchlist": "আপনার নজরতালিকা সম্পাদনা করুন",
        "grant-editprotected": "সংরক্ষিত পাতা সম্পাদনা করুন",
+       "grant-sendemail": "অন্য ব্যবহারকারীকে ইমেইল পাঠান",
        "grant-uploadfile": "নতুন ফাইল আপলোড করুন",
        "grant-basic": "মৌলিক অধিকার",
        "grant-viewdeleted": "অপসারিত ফাইল ও পাতাগুলি দেখুন",
        "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..e531009 100644 (file)
        "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).",
index de6f9ed..913a16e 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.",
        "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:",
        "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",
        "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-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.",
        "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",
        "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 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..4996cad 100644 (file)
@@ -28,7 +28,8 @@
                        "לערי ריינהארט",
                        "Cvanca",
                        "Macofe",
-                       "Urbanecm"
+                       "Urbanecm",
+                       "LordMsz"
                ]
        },
        "tog-underline": "Podtrhávat odkazy:",
        "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“ uživatele „$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“ uživatele „$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“ uživatele „$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-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",
        "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..07babc7 100644 (file)
        "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'')",
        "rcnotefrom": "Isod rhestrir pob newid er <strong>$3, $4</strong> (ymddengys <strong>$1</strong> ohonynt).",
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 a3be6ef..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": "Benutzerrechte verwalten",
        "userrights-lookup-user": "Gruppenzugehörigkeit verwalten",
        "userrights-user-editname": "Benutzername:",
-       "editusergroup": "{{GENDER:$1|Benutzerrechte}} bearbeiten",
+       "editusergroup": "{{GENDER:$1|Benutzergruppen}} verwalten",
        "editinguser": "Ändere Benutzerrechte {{GENDER:$1|des Benutzers|der Benutzerin}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Benutzer-Gruppenzugehörigkeit bearbeiten",
        "saveusergroups": "{{GENDER:$1|Gruppenzugehörigkeit}} ändern",
        "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",
        "right-editprotected": "Seiten bearbeiten, die als „{{int:protect-level-sysop}}“ geschützt sind",
        "right-editsemiprotected": "Seiten bearbeiten, die als „{{int:protect-level-autoconfirmed}}“ geschützt sind",
        "right-editcontentmodel": "Das Inhaltsmodell einer Seite bearbeiten",
-       "right-editinterface": "Benutzeroberfläche bearbeiten",
+       "right-editinterface": "Systemnachrichten und Benutzeroberflächen bearbeiten",
        "right-editusercssjs": "Fremde CSS- und JavaScript-Dateien bearbeiten",
        "right-editusercss": "Fremde CSS-Dateien bearbeiten",
        "right-edituserjs": "Fremde JavaScript-Dateien bearbeiten",
        "right-patrolmarks": "Kontrollmarkierungen in den letzten Änderungen sehen",
        "right-unwatchedpages": "Liste der unbeobachteten Seiten ansehen",
        "right-mergehistory": "Versionsgeschichten von Seiten vereinen",
-       "right-userrights": "Benutzerrechte bearbeiten",
-       "right-userrights-interwiki": "Benutzerrechte in anderen Wikis bearbeiten",
+       "right-userrights": "Benutzerrechte verwalten",
+       "right-userrights-interwiki": "Benutzerrechte in anderen Wikis verwalten",
        "right-siteadmin": "Datenbank sperren und entsperren",
        "right-override-export-depth": "Exportiere Seiten einschließlich verlinkter Seiten bis zu einer Tiefe von 5",
        "right-sendemail": "E-Mails an andere Benutzer senden",
        "action-autopatrol": "eigene Bearbeitungen als kontrolliert zu markieren",
        "action-unwatchedpages": "die Liste der unbeobachteten Seiten einzusehen",
        "action-mergehistory": "die Versionsgeschichten von Seiten zu vereinen",
-       "action-userrights": "Benutzerrechte zu ändern",
+       "action-userrights": "Benutzerrechte zu verwalten",
        "action-userrights-interwiki": "die Rechte von Benutzern in anderen Wikis zu ändern",
        "action-siteadmin": "die Datenbank zu sperren oder freizugeben",
        "action-sendemail": "E-Mails zu senden",
        "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.",
        "changecontentmodel-nodirectediting": "Das Inhaltsmodell „$1“ unterstützt keine direkten Bearbeitungen",
        "log-name-contentmodel": "Inhaltsmodell-Änderungs-Logbuch",
        "log-description-contentmodel": "Ereignisse bezüglich den Inhaltsmodellen einer Seite",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|erstellte}} die Seite $3 mit einem Nicht-Standard-Inhaltsmodell „$5“",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|änderte}} das Inhaltsmodell der Seite $3 von „$4“ nach „$5“",
        "logentry-contentmodel-change-revertlink": "zurücksetzen",
        "logentry-contentmodel-change-revert": "zurücksetzen",
        "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 df8a1c3..16d8c33 100644 (file)
        "right-importupload": "Εισαγωγή σελίδων με ανέβασμα αρχείου",
        "right-patrol": "Σήμανση επεξεργασιών άλλων χρηστών ως ελεγμένες",
        "right-autopatrol": "Αυτόματη σημείωση των επεξεργασιών τους ως ελεγμένες",
-       "right-patrolmarks": "Î\94είÏ\84ε Ï\84ιÏ\82 Ï\83ημειÏ\8eÏ\83ειÏ\82 'Ï\85Ï\80Ï\8c Ï\80αÏ\81ακολοÏ\8dθηÏ\83η' Ï\84Ï\89ν Ï\80Ï\81οÏ\83Ï\86άτων αλλαγών",
+       "right-patrolmarks": "ΠÏ\81οβολή Ï\83ημάνÏ\83εÏ\89ν ÎµÎ»Î­Î³Ï\87οÏ\85 Ï\80Ï\81Ï\8cÏ\83Ï\86ατων αλλαγών",
        "right-unwatchedpages": "Δείτε μια λίστα σελίδων που δεν παρακολουθούνται",
        "right-mergehistory": "Συγχώνευση του ιστορικού των σελίδων",
        "right-userrights": "Τροποποίηση όλων των δικαιωμάτων χρηστών",
        "pageinfo-category-pages": "Αριθμός σελίδων",
        "pageinfo-category-subcats": "Αριθμός υποκατηγοριών",
        "pageinfo-category-files": "Αριθμός αρχείων",
-       "markaspatrolleddiff": "Î\9dα Ï\83ημειÏ\89θεί 'Ï\85Ï\80Ï\8c Ï\80αÏ\81ακολοÏ\8dθηÏ\83η'",
+       "markaspatrolleddiff": "ΣήμανÏ\83η Ï\89Ï\82 ÎµÎ»ÎµÎ³Î¼Î­Î½Î¿",
        "markaspatrolledtext": "Σήμανση αυτής της σελίδας ως ελεγμένης",
        "markaspatrolledtext-file": "Επισημάνετε αυτή τη έκδοση του αρχείου ως ελεγμένη",
-       "markedaspatrolled": "ΣημειÏ\89μένο Ï\89Ï\82 'Ï\85Ï\80Ï\8c Ï\80αÏ\81ακολοÏ\8dθηÏ\83η'",
+       "markedaspatrolled": "ΣημειÏ\8eθηκε Ï\89Ï\82 ÎµÎ»ÎµÎ³Î¼Î­Î½Î¿",
        "markedaspatrolledtext": "Η επιλεγμένη αναθεώρηση της [[:$1]] έχει σημειωθεί ως ελεγμένη.",
        "rcpatroldisabled": "Η λειτουργία 'Παρακολούθηση Πρόσφατων Αλλαγών' έχει απενεργοποιηθεί.",
        "rcpatroldisabledtext": "Η λειτουργία 'Παρακολούθηση Πρόσφατων Αλλαγών' είναι αυτή τη στιγμή απενεργοποιημένη.",
        "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 115b66f..5b32b97 100644 (file)
        "moredotdotdot": "More...",
        "morenotlisted": "This list is not complete.",
        "mypage": "Page",
+       "anonuserpage": "Unknown user",
        "mytalk": "Talk",
        "anontalk": "Talk",
        "navigation": "Navigation",
        "nocookiesfornew": "The user account was not created, as we could not confirm its source.\nEnsure you have cookies enabled, reload this page and try again.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
        "noname": "You have not specified a valid username.",
-       "loginsuccesstitle": "Login successful",
+       "loginsuccesstitle": "Logged in",
        "loginsuccess": "<strong>You are now logged in to {{SITENAME}} as \"$1\".</strong>",
        "nosuchuser": "There is no user by the name \"$1\".\nUsernames are case sensitive.\nCheck your spelling, or [[Special:UserLogin/signup|create a new account]].",
        "nosuchusershort": "There is no user by the name \"$1\".\nCheck your spelling.",
        "createaccount-title": "Account creation for {{SITENAME}}",
        "createaccount-text": "Someone created an account for your email address on {{SITENAME}} ($4) named \"$2\", with password \"$3\".\nYou should log in and change your password now.\n\nYou may ignore this message, if this account was created in error.",
        "login-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.",
-       "login-abort-generic": "Your login was unsuccessful - Aborted",
+       "login-abort-generic": "Your login failed - Aborted",
        "login-migrated-generic": "Your account has been migrated, and your username no longer exist on this wiki.",
        "loginlanguagelabel": "Language: $1",
        "loginlanguagelinks": "* {{#language:de}}|de\n* {{#language:en}}|en\n* {{#language:eo}}|eo\n* {{#language:fr}}|fr\n* {{#language:es}}|es\n* {{#language:it}}|it\n* {{#language:nl}}|nl",
        "newpassword": "New password:",
        "retypenew": "Retype new password:",
        "resetpass_submit": "Set password and log in",
-       "changepassword-success": "Your password has been changed successfully!",
+       "changepassword-success": "Your password has been changed!",
        "changepassword-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.",
        "botpasswords": "Bot passwords",
        "botpasswords-summary": "<em>Bot passwords</em> allow access to a user account via the API without using the account's main login credentials. The user rights available when logged in with a bot password may be restricted.\n\nIf you don't know why you might want to do this, you should probably not do it. No one should ever ask you to generate one of these and give it to them.",
        "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 successfully.",
+       "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 successfully.",
+       "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.",
        "resetpass-no-info": "You must be logged in to access this page directly.",
        "resetpass-submit-loggedin": "Change password",
        "resetpass-submit-cancel": "Cancel",
-       "resetpass-wrong-oldpass": "Invalid temporary or current password.\nYou may have already successfully changed your password or requested a new temporary password.",
+       "resetpass-wrong-oldpass": "Invalid temporary or current password.\nYou may have already changed your password or requested a new temporary password.",
        "resetpass-recycled": "Please reset your password to something other than your current password.",
        "resetpass-temp-emailed": "You logged in with a temporary emailed code.\nTo finish logging in, you must set a new password here:",
        "resetpass-temp-password": "Temporary password:",
        "revdelete-unsuppress": "Remove restrictions on restored revisions",
        "revdelete-log": "Reason:",
        "revdelete-submit": "Apply to selected {{PLURAL:$1|revision|revisions}}",
-       "revdelete-success": "Revision visibility successfully updated.",
+       "revdelete-success": "Revision visibility updated.",
        "revdelete-failure": "Revision visibility could not be updated:\n$1",
-       "logdelete-success": "Log visibility successfully set.",
+       "logdelete-success": "Log visibility set.",
        "logdelete-failure": "Log visibility could not be set:\n$1",
        "revdel-restore": "change visibility",
        "pagehist": "Page history",
        "userrights-unchangeable-col": "Groups you cannot change",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Conflict of user rights changes! Please review and confirm your changes.",
-       "userrights-removed-self": "You successfully removed your own rights. As such, you are no longer able to access this page.",
+       "userrights-removed-self": "You removed your own rights. As such, you are no longer able to access this page.",
        "group": "Group:",
        "group-user": "Users",
        "group-autoconfirmed": "Autoconfirmed users",
        "uploadstash-summary": "This page provides access to files that are uploaded or in the process of uploading, but are not yet published to the wiki. These files are not visible to anyone but the user who uploaded them.",
        "uploadstash-clear": "Clear stashed files",
        "uploadstash-nofiles": "You have no stashed files.",
-       "uploadstash-badtoken": "Performing of that action was unsuccessful, perhaps because your editing credentials expired. Try again.",
-       "uploadstash-errclear": "Clearing the files was unsuccessful.",
+       "uploadstash-badtoken": "Performing that action failed. Perhaps because your editing credentials expired. Please try again.",
+       "uploadstash-errclear": "Clearing the files failed.",
        "uploadstash-refresh": "Refresh the list of files",
        "invalid-chunk-offset": "Invalid chunk offset",
        "img-auth-accessdenied": "Access denied",
        "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.",
        "tags-delete-not-allowed": "Tags defined by an extension cannot be deleted unless the extension specifically allows it.",
        "tags-delete-not-found": "The tag \"$1\" does not exist.",
        "tags-delete-too-many-uses": "The tag \"$1\" is applied to more than $2 {{PLURAL:$2|revision|revisions}}, which means it cannot be deleted.",
-       "tags-delete-warnings-after-delete": "The tag \"$1\" was deleted successfully, but the following {{PLURAL:$2|warning was|warnings were}} encountered:",
+       "tags-delete-warnings-after-delete": "The tag \"$1\" was deleted, but the following {{PLURAL:$2|warning was|warnings were}} encountered:",
        "tags-activate-title": "Activate tag",
        "tags-activate-question": "You are about to activate the tag \"$1\".",
        "tags-activate-reason": "Reason:",
        "tags-edit-reason": "Reason:",
        "tags-edit-revision-submit": "Apply changes to {{PLURAL:$1|this revision|$1 revisions}}",
        "tags-edit-logentry-submit": "Apply changes to {{PLURAL:$1|this log entry|$1 log entries}}",
-       "tags-edit-success": "The changes were successfully applied.",
+       "tags-edit-success": "The changes were applied.",
        "tags-edit-failure": "The changes could not be applied:\n$1",
        "tags-edit-nooldid-title": "Invalid target revision",
        "tags-edit-nooldid-text": "You have either not specified any target revision on which to perform this function, or the specified revision does not exist.",
index 148f851..44f361e 100644 (file)
        "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 79e1cfd..f5a40c3 100644 (file)
        "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.",
        "changecontentmodel-nodirectediting": "El modelo de contenido $1 no admite la edición directa",
        "log-name-contentmodel": "Registro de cambios del modelo de contenido",
        "log-description-contentmodel": "Eventos relacionados con los modelos de contenido de una página",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|creó}} la página $3 usando un modelo de contenido no predeterminado \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|cambió}} el modelo de contenido de la página $3 de \"$4\" a \"$5\"",
        "logentry-contentmodel-change-revertlink": "revertir",
        "logentry-contentmodel-change-revert": "revertir",
        "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 a6a5652..9d76b80 100644 (file)
@@ -50,7 +50,8 @@
                        "MRG90",
                        "Mahdy Saffar",
                        "Arian Ar",
-                       "Ms96"
+                       "Ms96",
+                       "Freshman404"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
        "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": "گذرÙ\88اÚ\98Ù\87Ù\94 Ø±Ø¨Ø§ØªÛ\8c Â«$1» Ø¨Ø§ Ù\85Ù\88Ù\81Ù\82Û\8cت Ø§Û\8cجاد Ø´Ø¯.",
+       "botpasswords-created-body": "گذرواژهٔ رباتی «$1» ایجاد شد.",
        "botpasswords-updated-title": "گذرواژه ربات به‌روز شد",
-       "botpasswords-updated-body": "گذرواژهٔ رباتی «$1» با موفقیت به‌روز شد.",
+       "botpasswords-updated-body": "گذرواژهٔ رباتی «$1» به‌روز شد.",
        "botpasswords-deleted-title": "گذرواژه ربات حذف شد",
        "botpasswords-deleted-body": "گذرواژهٔ رباتی «$1» حذف شد.",
        "botpasswords-newpassword": "<strong>$2</strong> گذرواژهٔ جدید برای ورود با <strong>$1</strong> است. <em>لطفاً این را برای ارجاع در آینده ذخیره کنید.</em>",
        "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": "گذرواژهٔ موقت:",
        "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": "جابجایی نامعتبر قطعه",
        "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": "صفحهٔ $3 با استفاده از مدل‌های محتوایی غیر پیش‌فرض «$5» توسط $1 {{GENDER:$2|ساخته شد}}",
        "logentry-contentmodel-change": "نمونه محتوای صفحهٔ $3 از \"$4\" به \"$5\" توسط $1 {{GENDER:$2|تغییر داده شد}}",
        "logentry-contentmodel-change-revertlink": "واگردانی",
        "logentry-contentmodel-change-revert": "واگردانی",
        "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": "سیاهه‌ها",
        "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 2cac81f..d12e340 100644 (file)
@@ -18,6 +18,7 @@
        "tog-hideminor": "Krógva minni broytingar í seinastu broytingum",
        "tog-hidepatrolled": "Krógva eftirkannaðar rættingar í seinastu broytingum",
        "tog-newpageshidepatrolled": "Goym eftirkannaðar síður frá listanum yvir nýggjar síður",
+       "tog-hidecategorization": "Fjal bólking av síðum",
        "tog-extendwatchlist": "Víðka eftirlitslistan fyri at vísa allar broytingar, ikki bara tær seinastu",
        "tog-usenewrc": "Bólka broytingar eftir síðu í seinastu broytingum og eftirlitslita",
        "tog-numberheadings": "Sjálvvirkandi talmerking av yvirskriftum",
@@ -46,6 +47,7 @@
        "tog-watchlisthideliu": "Goym broytingar sum eru gjørdar av brúkarum, sum eru loggaðir á, frá hyggjaralistanum",
        "tog-watchlisthideanons": "Krógva broytingar sum eru gjørdar av dulnevndum brúkarum frá eftirlitslistanum",
        "tog-watchlisthidepatrolled": "Fjal eftirhugdar broytingar frá eftirlitslistanum",
+       "tog-watchlisthidecategorization": "Fjal bólking av síðum",
        "tog-ccmeonemails": "Send mær avrit av teldubrøvum, sum eg sendi til aðrar brúkarar",
        "tog-diffonly": "Vís ikki innihaldið av síðuni undir broytingum",
        "tog-showhiddencats": "Vís goymdir bólkar",
        "morenotlisted": "Hesin listin er ikki liðugur.",
        "mypage": "Síða",
        "mytalk": "Kjak",
-       "anontalk": "Kjak til hesa IP-adressuna",
+       "anontalk": "Kjak",
        "navigation": "Navigatión",
        "and": "&#32;og",
        "qbfind": "Finn",
        "pool-timeout": "Støðgur, bíða verður eftir lásinum",
        "pool-queuefull": "Køin til \"hylin\" er full",
        "pool-errorunknown": "Ókend villa",
+       "pool-servererror": "Pool counter-tænastan er ikki tøk ($1).",
+       "poolcounter-usage-error": "Nýtslufeilur: $1",
        "aboutsite": "Um {{SITENAME}}",
        "aboutpage": "Project:Um",
        "copyright": "Innihaldið er tøkt undir $1, um ikki annað er viðmerkt.",
        "nstab-template": "Fyrimynd",
        "nstab-help": "Hjálp",
        "nstab-category": "Bólkur",
+       "mainpage-nstab": "Forsíða",
        "nosuchaction": "Ongin slík gerð",
        "nosuchactiontext": "Gerðin, ið tilskilað er í url, virkar ikki.\nMøguliga hevur tú stava urlin skeivt, ella fylgt einari skeivari leinkju.\nHetta kann eisini benda á ein feil í software'ini sum {{SITENAME}} brúkar.",
        "nosuchspecialpage": "Ongin slík serlig síða",
        "filerenameerror": "Kundi ikki umdoypa fílu \"$1\" til \"$2\".",
        "filedeleteerror": "Kundi ikki strika fíluna \"$1\".",
        "directorycreateerror": "Kundi ikki upprætta mappuna \"$1\".",
+       "directoryreadonlyerror": "Faldarin \"$1\" er vardur móti skriving.",
+       "directorynotreadableerror": "Faldarin \"$1\" er ikki lesbarur.",
        "filenotfound": "Kundi ikki finna fílu \"$1\".",
        "unexpected": "Óvæntað virði: \"$1\"=\"$2\".",
        "formerror": "Villa: Kundi ikki senda skránna.",
        "viewsource": "Vís keldu",
        "viewsource-title": "Sí keldu fyri $1",
        "actionthrottled": "Hendingin kvaldist",
-       "actionthrottledtext": "↓ Fyri at mótvirka spam, er tað ikki møguligt at gera hetta alt ov nógvar ferðir uppá stutta tíð, og tú ert farin yvir tað markið.\nVinarliga royn aftur um fáir minuttir.",
+       "actionthrottledtext": "Fyri at mótvirka spam, er tað ikki møguligt at gera hetta alt ov nógvar ferðir uppá stutta tíð, og tú ert farin yvir tað markið.\nVinarliga royn aftur um fáir minuttir.",
        "protectedpagetext": "Hendan síða er blivin vard fyri at steðga rættingum ella øðrum handlingum.",
-       "viewsourcetext": "Tú kanst síggja og avrita kelduna til hesa grein:",
-       "viewyourtext": "Tú kanst síggja og avrita kelduna fyri '''tínar rættingar''' til hesa síðuna:",
+       "viewsourcetext": "Tú kanst síggja og avrita kelduna til hesa grein.",
+       "viewyourtext": "Tú kanst síggja og avrita kelduna til <strong>tínar rættingar</strong> til hesa síðuna.",
        "protectedinterface": "↓ Henda síðan gevur markamóts tekst til ritbúnaðin (software), og er vard fyri at fyribyrgja misnýtslu.\nFyri at gera rættingar ella broyta týðingar á øllum wiki'um, vinarliga nýt [//translatewiki.net/ translatewiki.net], MediaWiki verkætlanina.",
-       "editinginterface": "↓ '''Ávaring:''' Tú rættar eina síðu sum verður brúkt til at geva markamóts tekst til ritbúnaðin (software).\nBroytingar á hesi síðu fara at ávirka útsjóndina á brúkara markamótinum (interface) fyri aðrar brúkarar á hesi wiki.\nFyri at gera týðingar ella broyta týðingar á øllum wiki, vinarliga nýt [//translatewiki.net/ translatewiki.net],  sum er ein MediaWiki verkætlan.",
-       "cascadeprotected": "Henda síðan er vard fyri rættingum, tí hon er í fylgjandi {{PLURAL:$1|síðu, sum er|síðum, sum eru}}\nvardar við \"arvaðari síðuverjing\"\n$2",
+       "editinginterface": "<strong>Ávaring:</strong> Tú rættar eina síðu sum verður brúkt til at geva markamóts tekst til ritbúnaðin (software).\nBroytingar á hesi síðu fara at ávirka útsjóndina á brúkara markamótinum (interface) fyri aðrar brúkarar á hesi wiki.",
+       "translateinterface": "Fyri at gera ella broyta týðingar fyri allar wikiir, vinarliga nýt [//translatewiki.net/ translatewiki.net], the MediaWiki staðsetingar verkætlan.",
+       "cascadeprotected": "Henda síðan er vard fyri rættingum, tí hon er í fylgjandi {{PLURAL:$1|síðu, sum er|síðum, sum eru}}\nvardar við \"niðurarvan\" møguleikanum tendraðum:\n$2",
        "namespaceprotected": "Tú hevur ikki loyvi til at rætta síður í $1 navnateiginum.",
        "customcssprotected": "Tú hevur ikki loyvi til at rætta hesa CSS síðuna, tí hon inniheldur persónligar innstillingar hjá øðrum brúkara.",
        "customjsprotected": "Tú hevur ikki loyvir til at rætta hesa JavaScript síðuna, tí hon inniheldur persónligar innstillingar hjá øðrum brúkara.",
        "mypreferencesprotected": "Tú hevur ikki loyvi til at rætta tínar preferensur.",
        "ns-specialprotected": "Serstakar síður kunnu ikki rættast.",
        "titleprotected": "[[User:$1|$1]] hevur vart hetta heitið frá skapan.\nGivin orsøk er <em>$2</em>.",
-       "filereadonlyerror": "Tað var ikki møguligt at broyta fíluna \"$1\" tí at fílugoymslan \"$2\" er í bara-lesa støðu.\n\nUmboðsstjórin sum stongdi hana, gav hesa frágreiðing: \"$3\".",
+       "filereadonlyerror": "Tað var ikki møguligt at broyta fíluna \"$1\" tí at fílugoymslan \"$2\" er skrivivard.\n\nSkipanaradministratorurin sum stongdi hana, gav hesa frágreiðing: \"$3\".",
        "invalidtitle-knownnamespace": "Ógyldugt heiti við navnaøki \"$2\" og teksti \"$3\"",
        "invalidtitle-unknownnamespace": "Ógyldigt heiti við ókendum navnaøkis tali $1 og teksti \"$2\"",
        "exception-nologin": "Tú ert ikki loggað/ur inn",
-       "exception-nologin-text": "Vinarliga [[Special:Userlogin|rita inn]] fyri at fáa atgongd til hesa síðu ella handling.",
+       "exception-nologin-text": "Vinarliga rita inn fyri at fáa atgongd til hesa síðu ella handling.",
        "exception-nologin-text-manual": "Vinarliga $1 fyri at fáa atgongd til hesa síðu ella handling.",
        "virus-badscanner": "Konfiguratións villa: Ókendur virus skannari: ''$1''",
        "virus-scanfailed": "↓  skanning virkaði ikki (kota $1)",
        "virus-unknownscanner": "ókent antivirus:",
        "logouttext": "'''Tú hevur nú ritað út.'''\n \nLegg til merkis, at summar síður framvegis vera vístar, sum um tú enn vart loggað/ur á, til tú hevur reinsað tín brovsara fyri \"cache\".",
+       "cannotlogoutnow-title": "Tað ber ikki til at rita út nú",
        "welcomeuser": "Vælkomin, $1!",
        "welcomecreation-msg": "Tín konta er nú stovnað.\nGloym ikki at broyta tínar [[Special:Preferences|{{SITENAME}}-innstillingar]].",
        "yourname": "Títt brúkaranavn:",
        "resetpass_submit": "Vel loyniorð og rita inn",
        "changepassword-success": "Títt loyniorð er nú broytt!",
        "changepassword-throttled": "Tú hevur roynt at rita inn ov nógvar ferðir nýliga.\nVinarliga bíða $1 áðrenn tú roynir aftur.",
+       "botpasswords-label-create": "Upprætta",
+       "botpasswords-label-update": "Dagfør",
+       "botpasswords-label-cancel": "Avbrót",
+       "botpasswords-label-delete": "Strika",
+       "botpasswords-label-resetpassword": "Nullstilla loyniorðið",
        "resetpass_forbidden": "Loyniorð kunnu ikki broytast",
        "resetpass-no-info": "Tú mást vera loggaður á fyri at fáa beinleiðis atgongd til hesa síðu.",
        "resetpass-submit-loggedin": "Broyt loyniorð",
        "sig_tip": "Tín undirskrift við tíðarstempli",
        "hr_tip": "Vatnrøtt linja (vera sparin við)",
        "summary": "Samandráttur:",
-       "subject": "Evni/heiti:",
+       "subject": "Evni:",
        "minoredit": "Hetta er smábroyting",
        "watchthis": "Hav eftirlit við hesi síðuni",
        "savearticle": "Goym síðu",
        "notextmatches": "Ongin síðutekstur samsvarar",
        "prevn": "undanfarnu {{PLURAL:$1|$1}}",
        "nextn": "næstu {{PLURAL:$1|$1}}",
+       "prev-page": "undanfarna síða",
        "next-page": "næsta síða",
        "prevn-title": "Gomul $1 {{PLURAL:$1|úrslit|úrslit}}",
        "nextn-title": "Næstu $1 {{PLURAL:$1|úrslit|úrslit}}",
        "search-redirect": "(umstilling $1)",
        "search-section": "(sektión $1)",
        "search-category": "(bólkur $1)",
+       "search-file-match": "(svarar til innihaldið av fíluni)",
        "search-suggest": "Meinti tú: $1",
+       "search-rewritten": "Vísir úrslit fyri $1. Leita í staðin eftir $2.",
        "search-interwiki-caption": "Líknandi verkætlanir",
        "search-interwiki-default": "Úrslit frá $1:",
        "search-interwiki-more": "(meira)",
        "showingresultsinrange": "Niðanfyri verða víst upp til {{PLURAL:$1|<strong>1</strong> úrslit|<strong>$1</strong> úrslit}} í økinum #<strong>$2</strong> til #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Úrslit <strong>$1</strong> av <strong>$3</strong>|Úrslit <strong>$1 - $2</strong> av <strong>$3</strong>}}",
        "search-nonefound": "Leitingin gav onki úrslit.",
+       "search-nonefound-thiswiki": "Ongi úrslit passaðu til fyrispurningin á hesi síðu.",
        "powersearch-legend": "Víðkað leitan",
        "powersearch-ns": "Leita í navnaøkinum:",
        "powersearch-togglelabel": "Kanna eftir:",
        "preferences": "Innstillingar",
        "mypreferences": "Innstillingar",
        "prefs-edits": "Tal av rættingum:",
-       "prefsnologintext2": "Vinarliga $1 fyri at broyta tínar innstillingat.",
+       "prefsnologintext2": "Vinarliga rita inn fyri at broyta tínar innstillingar.",
        "prefs-skin": "Hamur",
        "skin-preview": "Forskoðan",
        "datedefault": "Ongi serlig ynskir",
        "prefs-personal": "Brúkaradáta",
        "prefs-rc": "Nýkomnar broytingar og stubbaskoðan",
        "prefs-watchlist": "Eftirlit",
+       "prefs-editwatchlist": "Rætta eftirlitslistan",
+       "prefs-editwatchlist-clear": "Rudda tín eftirlitslista",
        "prefs-watchlist-days": "Tal av døgum, sum skula vísast í eftirliti:",
        "prefs-watchlist-days-max": "Í mesta lagi $1 {{PLURAL:$1|dagur|dagar}}",
        "prefs-watchlist-edits": "Tal av rættingum, sum skula vísast í víðkaðum eftirliti:",
        "prefs-watchlist-token": "Lykil til eftirlitslistan:",
        "prefs-misc": "Ymiskar innstillingar",
        "prefs-resetpass": "Broyt loyniorð",
-       "prefs-changeemail": "Broyt t-post adressu",
+       "prefs-changeemail": "Broyt ella tak burtur t-post adressu",
        "prefs-setemail": "Skriva tína t-post adressu",
        "prefs-email": "T-post møguleikar",
        "prefs-rendering": "Útsjónd",
        "rows": "Røð:",
        "columns": "Teigar:",
        "searchresultshead": "Leita",
-       "stub-threshold": "Avmarkað til <a href=\"#\" class=\"stub\">stubba leinki</a> formatering (bytes):",
+       "stub-threshold": "Avmarkað til stubba leinki formatering $1:",
+       "stub-threshold-sample-link": "dømi",
        "stub-threshold-disabled": "Er gjørt óvirki",
        "recentchangesdays": "Dagar av vísa í seinastu broytingum:",
        "recentchangesdays-max": "Í mesta lagi $1 {{PLURAL:$1|dagur|dagar}}",
        "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 d64d4db..19e70c0 100644 (file)
        "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 de robots « $1 » 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 de robots « $1 » 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-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>",
        "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. Du coup, 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.",
        "changecontentmodel-nodirectediting": "Le modèle de contenu $1 ne permet pas la modification directe",
        "log-name-contentmodel": "Journal de modification de modèle de contenu",
        "log-description-contentmodel": "Événements relatifs aux modèles de contenu d’une page",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|a créé}} la page $3 en utilisant un modèle de contenu « $5 » autre que celui par défaut",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|a modifié}} le modèle de contenu de la page $3 de « $4 » en « $5 »",
        "logentry-contentmodel-change-revertlink": "rétablir",
        "logentry-contentmodel-change-revert": "rétablir",
        "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 cbdb0b0..38bee34 100644 (file)
        "category-empty": "<em>Ora cela catègoria contint gins de pâge de fichiér multimèdiâ.</em>",
        "hidden-categories": "{{PLURAL:$1|Catègoria cachiêe|Catègories cachiêes}}",
        "hidden-category-category": "Catègories cachiêes",
-       "category-subcat-count": "Cela catègoria-que at {{PLURAL:$2|mas que cela sot-catègoria.|{{PLURAL:$1|cela sot-catègoria|celes $1 sot-catègories}}, sur na soma de $2.}}",
-       "category-subcat-count-limited": "Cela catègoria-que at {{PLURAL:$1|cela sot-catègoria|celes $1 sot-catègories}}.",
-       "category-article-count": "{{PLURAL:$2|Cela catègoria-que contint mas que cela pâge.|{{PLURAL:$1|Cela pâge est|Celes $1 pâges sont}} a cela catègoria-que, sur na soma de $2.}}",
-       "category-article-count-limited": "{{PLURAL:$1|Cela pâge figure|Celes $1 pâges figuront}} dedens la presenta catègoria.",
-       "category-file-count": "{{PLURAL:$2|Cela catègoria-que contint mas que cél fichiér.|{{PLURAL:$1|Cél fichiér est|Celos $1 fichiérs sont}} a cela catègoria-que, sur na soma de $2.}}",
-       "category-file-count-limited": "{{PLURAL:$1|Cél fichiér figure|Celos $1 fichiérs figuront}} dedens la presenta catègoria.",
+       "category-subcat-count": "Cela catègoria at {{PLURAL:$2|mas que cela sot-catègoria-que.|{{PLURAL:$1|cela sot-catègoria|celes $1 sot-catègories}}-que, sur na soma de $2.}}",
+       "category-subcat-count-limited": "Cela catègoria at {{PLURAL:$1|cela sot-catègoria|celes $1 sot-catègories}}-que.",
+       "category-article-count": "{{PLURAL:$2|Cela catègoria contint mas que cela pâge-que.|{{PLURAL:$1|Cela pâge-que est|Celes $1 pâges-que sont}} a cela catègoria, sur na soma de $2.}}",
+       "category-article-count-limited": "{{PLURAL:$1|Cela pâge-que figure|Celes $1 pâges-que figuront}} dedens la presenta catègoria.",
+       "category-file-count": "{{PLURAL:$2|Cela catègoria contint mas que cél fichiér-que.|{{PLURAL:$1|Cél fichiér-que est|Celos $1 fichiérs-que sont}} a cela catègoria, sur na soma de $2.}}",
+       "category-file-count-limited": "{{PLURAL:$1|Cél fichiér-que figure|Celos $1 fichiérs-que figuront}} dedens la presenta catègoria.",
        "listingcontinuesabbrev": "(suita)",
        "index-category": "Pâges endèxâyes",
        "noindex-category": "Pâges pas endèxâyes",
        "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",
        "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",
        "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.",
        "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.",
-       "perfcached": "Celes balyês sont en cacho et pôvont pas étre a jorn. Por lo més {{PLURAL:$1|un rèsultat est disponiblo|$1 rèsultats sont disponiblos}} dedens lo cacho.",
-       "perfcachedts": "Celes balyês sont en cacho et sont étâyes betâyes a jorn por lo dèrriér côp lo $1. Por lo més {{PLURAL:$4|un rèsultat est disponiblo|$4 rèsultats sont disponiblos}} dedens lo cacho.",
+       "perfcached": "Celes balyês-que sont en cacho et pôvont pas étre a jorn. Por lo més {{PLURAL:$1|un rèsultat est disponiblo|$1 rèsultats sont disponiblos}} dedens lo cacho.",
+       "perfcachedts": "Celes balyês-que sont en cacho et sont étâyes betâyes a jorn por lo dèrriér côp lo $1. Por lo més {{PLURAL:$4|un rèsultat est disponiblo|$4 rèsultats sont disponiblos}} dedens lo cacho.",
        "querypage-no-updates": "Ora les mêses a jorn por cela pâge sont dèsactivâyes.\nLes balyês ique seront pas betâyes a jorn.",
        "viewsource": "Vêre lo tèxto sôrsa",
        "viewsource-title": "Vêre lo tèxto sôrsa de $1",
        "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-que est protègiêe contre los changements perce qu’el est transcllua per {{PLURAL:$1|cela pâge qu’est étâye protègiêe|celes pâges que sont étâyes protègiêes}} avouéc lo chouèx « protèccion en cascâda » activâ :\n$2",
+       "translateinterface": "Por 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.",
+       "cascadeprotected": "Cela pâge est protègiêe contre los changements, 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",
        "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ê",
        "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.",
+       "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 dessus cél vouiqui.",
+       "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 proxi.",
        "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",
+       "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 ou ben 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-throttled": "Vos éd èprovâ un mouél de branchements.\nSe vos plét, atende-vos $1 devant que tornar èprovar.",
        "changeemail-nochange": "Se vos plét, buchiéd na novèl’adrèce èlèctronica difèrenta.",
        "resettokens": "Rebetar a zérô los jetons",
-       "resettokens-text": "Ique, vos pouede rebetar a zérô los jetons que pèrmètont d’arrevar a quârques balyês privâyes associyêes a voutron comptio.\n\nVos o devriâd fâre se vos los éd partagiês per accident avouéc yon ou ben se voutron comptio est étâ compromètu.",
+       "resettokens-text": "Ique, vos pouede rebetar a zérô los jetons que pèrmètont d’arrevar a quârques balyês privâyes associyêes a voutron comptio.\n\nVos o devriâd fâre se vos los éd partagiês per accident avouéc yon ou ben se voutron comptio est étâ comprometu.",
        "resettokens-no-tokens": "Y at gins de jeton a rebetar a zérô.",
        "resettokens-tokens": "Jetons :",
        "resettokens-token-label": "$1 (valor d’ora : $2)",
        "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’empleyér.\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.",
-       "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’empleyér.\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.",
+       "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, entrebetâ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]].",
        "loginreqlink": "branchiér",
        "loginreqpagetext": "Se vos plét, vos vos dête $1 por povêr vêre les ôtres pâges.",
        "accmailtitle": "Contresegno mandâ",
-       "accmailtext": "Un contresegno fêt a l’hasârd por [[User talk:$1|$1]] est étâ mandâ a $2. Pôt étre changiê sur la pâge de <em>[[Special:ChangePassword|changement de contresegno]]</em> aprés branchement.",
+       "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 sur 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.",
+       "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 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 sur lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornâl de les suprèssions].",
+       "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-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 :",
        "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>",
        "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 proxi 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.",
        "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 :",
+       "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érel 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 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 :",
        "sectioneditnotsupported-title": "Changement de sèccion pas recognu",
        "sectioneditnotsupported-text": "Lo changement d’una sèccion est pas recognu dens cela pâge.",
        "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}} :",
-       "permissionserrorstext-withaction": "Vos éd pas la pèrmission de $2 por {{PLURAL:$1|cela rêson|celes rêsons}} :",
-       "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>.",
+       "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, 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â.",
        "defaultmessagetext": "Mèssâjo per dèfôt",
        "content-failed-to-parse": "Falyita de l’analise du contegnu de $2 por lo modèlo $1 : $3",
        "invalid-content-data": "Balyês du contegnu pas justes",
-       "content-not-allowed-here": "Lo contegnu « $1 » est pas ôtorisâ sur la pâge [[$2]]",
+       "content-not-allowed-here": "Lo contegnu « $1 » est pas ôtorisâ dessus la pâge [[$2]]",
        "editwarning-warning": "Quitar cela pâge vos farat pèrdre tôs los changements que vos éd fêts.\nSe vos éte branchiê{{GENDER:||e}}, vos pouede dèsactivar cela semonce dedens la sèccion « {{int:prefs-editing}} » de voutres prèferences.",
        "editpage-notsupportedcontentformat-title": "Format de contegnu pas recognu",
        "editpage-notsupportedcontentformat-text": "Lo format de contegnu $1 est pas recognu per lo modèlo de contegnu $2.",
        "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-deleted-user": "(nom d’utilisator enlevâ)",
        "rev-deleted-event": "(dètalys du jornâl enlevâs)",
        "rev-deleted-user-contribs": "[nom d’utilisator ou ben adrèce IP enlevâ(ye) - changement cachiê sur les contribucions]",
-       "rev-deleted-text-permission": "Cela vèrsion de la pâge est étâye <strong>suprimâye</strong>.\nY pôt avêr més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornâl de les suprèssions].",
-       "rev-suppressed-text-permission": "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 sur lo [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jornâl de les rèprèssions].",
-       "rev-deleted-text-unhide": "Cela vèrsion de la pâge est étâye <strong>suprimâye</strong>.\nY pôt avêr més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornâl de les suprèssions].\nVos pouede adés [$1 vêre cela vèrsion] se vos o voléd.",
-       "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 sur 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 sur 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 sur 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 sur 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-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 sur 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 sur 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 sur 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 sur lo [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jornâl de les rèprèssions].",
+       "rev-deleted-text-permission": "Cela vèrsion de la pâge 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-text-permission": "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].",
+       "rev-deleted-text-unhide": "Cela vèrsion de la pâge 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 vèrsion] se vos o voléd.",
+       "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, 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",
        "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-suppress-text": "La rèprèssion dêt étre empleyêe <strong>ren que</strong> dens celos câs :\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-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-hide-image": "Cachiér lo contegnu du fichiér",
        "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-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-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 des ôtros chouèx de visibilitât.",
+       "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-reason-dropdown": "*Rêsons corentes de suprèssion\n** Violacion du drêt d’ôtor\n** Comentèros enformacions a sè que vant pas avouéc\n** Nom d’utilisator que vat pas avouéc\n** Enformacions que pôvont étre difamatouères",
        "revdelete-otherreason": "Ôtra rêson ou ben rêson de més :",
        "revdelete-reasonotherlist": "Ôtra rêson",
        "mergehistory-from": "Pâge d’origina :",
        "mergehistory-into": "Pâge de dèstinacion :",
        "mergehistory-list": "Historico des changements que pôvont étre fusionâs",
-       "mergehistory-merge": "Celes vèrsions de [[:$1]] pôvont étre fusionâyes dedens [[:$2]].\nEmpleyéd la colona de botons de chouèx por fusionar mas que les vèrsions fêtes dês lo comencement tant qu’a la dâta spècifiâye.\nNotâd que l’usâjo des lims de navegacion rebeterat a zérô cela colona.",
+       "mergehistory-merge": "Celes vèrsions-que de [[:$1]] pôvont étre fusionâyes dedens [[:$2]].\nEmpleyéd la colona de botons de chouèx por fusionar mas que les vèrsions fêtes dês lo comencement tant qu’a la dâta spècifiâye.\nNotâd que l’usâjo des lims de navegacion rebeterat a zérô cela colona.",
        "mergehistory-go": "Montrar los changements que pôvont étre fusionâs",
        "mergehistory-submit": "Fusionar les vèrsions",
        "mergehistory-empty": "Niona vèrsion pôt étre fusionâye.",
        "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-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.",
        "diff-multi-sameuser": "({{PLURAL:$1|Na vèrsion entèrmèdièra per lo mém’utilisator pas montrâye|$1 vèrsions entèrmèdières per lo mém’utilisator pas montrâyes}})",
        "diff-multi-otherusers": "({{PLURAL:$1|Na vèrsion entèrmèdièra|$1 vèrsions entèrmèdières}} per {{PLURAL:$2|un ôtr’utilisator|$2 utilisators}} pas montrâye{{PLURAL:$1||s}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Na vèrsion entèrmèdièra|$1 vèrsions entèrmèdières}} per més {{PLURAL:$2|d’un utilisator|de $2 utilisators}} {{PLURAL:$1|est pas montrâye|sont pas montrâyes}})",
-       "difference-missing-revision": "{{PLURAL:$2|Na vèrsion|$2 vèrsions}} de cela difèrence ($1) {{PLURAL:$2|est pas étâye trovâye|sont pas étâyes trovâyes}}.\n\nEn g·ènèrâl cen arreve en siuvent un lim dèpassâ d’una dif de vers na pâge qu’est étâye suprimâye.\nVos pouede trovar més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornâl de les suprèssions].",
+       "difference-missing-revision": "{{PLURAL:$2|Na vèrsion|$2 vèrsions}} de cela difèrence ($1) {{PLURAL:$2|est pas étâye trovâye|sont pas étâyes trovâyes}}.\n\nEn g·ènèrâl cen arreve en siuvent un lim dèpassâ d’una dif 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].",
        "searchresults": "Rèsultats de la rechèrche",
        "searchresults-title": "Rèsultats de la rechèrche por « $1 »",
        "titlematches": "Corrèspondances dedens los titros de les pâges",
        "shown-title": "Montrar $1 rèsultat{{PLURAL:$1||s}} per pâge",
        "viewprevnext": "Vêre ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "<strong>Y at na pâge apelâye « [[:$1]] » sur cél vouiqui.</strong> {{PLURAL:$2|0=|Vêde avouéc los ôtros rèsultats de voutra rechèrche.}}",
-       "searchmenu-new": "<strong>Fâre la pâge « [[:$1|$1]] » sur cél vouiqui !</strong> {{PLURAL:$2|0=|Vêde avouéc la pâge trovâye avouéc voutra rechèrche.|Vêde avouéc los rèsultats de voutra rechèrche.}}",
+       "searchmenu-new": "<strong>Fâre la pâge « [[:$1|$1]] » sur cél vouiqui !</strong> {{PLURAL:$2|0=|Vêde asse-ben la pâge trovâye avouéc voutra rechèrche.|Vêde avouéc los rèsultats de voutra rechèrche.}}",
        "searchprofile-articles": "Pâges de contegnu",
        "searchprofile-images": "Multimèdiâ",
        "searchprofile-everything": "Tot",
        "yourvariant": "Vèrsion de la lengoua du contegnu :",
        "prefs-help-variant": "Voutra vèrsion voutron ortografia prèferâye por fâre vêre les pâges de contegnu de cél vouiqui.",
        "yournick": "Signatura novèla :",
-       "prefs-help-signature": "Los comentèros sur les pâges de discussion dêvont étre signês avouéc « <nowiki>~~~~</nowiki> » que serat convèrti per voutra signatura et un horodatâjo.",
+       "prefs-help-signature": "Los comentèros dessus les pâges de discussion dêvont étre signês avouéc « <nowiki>~~~~</nowiki> » que serat convèrti per voutra signatura et un horodatâjo.",
        "badsig": "Signatura bruta pas justa.\nControlâd les balises HTML.",
        "badsiglength": "Voutra signatura est trop longe.\nDêt pas dèpassar $1 caractèro{{PLURAL:$1||s}}.",
        "yourgender": "Coment vos prèferâd étre dècrit ?",
        "email": "Mèssageria èlèctronica",
        "prefs-help-realname": "Lo veré nom est u chouèx.\nS’il est balyê, serat empleyê por vos atribuar voutres ôvres.",
        "prefs-help-email": "L’adrèce èlèctronica est u chouèx, mas el est nècèssèra por rebetar a zérô voutron contresegno, se vos vegnévâd a l’oubliar.",
-       "prefs-help-email-others": "Vos porriâd avouéc chouèsir de lèssiér los ôtros lor veriér vers vos per mèssageria èlèctronica avouéc un lim sur voutra pâge utilisator ou ben de discussion sen que seye nècèssèro de rèvèlar voutron adrèce èlèctronica.",
+       "prefs-help-email-others": "Vos porriâd asse-ben chouèsir de lèssiér los ôtros lor veriér vers vos per mèssageria èlèctronica avouéc un lim sur voutra pâge utilisator ou ben de discussion sen que seye nècèssèro de rèvèlar voutron adrèce èlèctronica.",
        "prefs-help-email-required": "Un’adrèce èlèctronica est nècèssèra.",
        "prefs-info": "Enformacions de bâsa",
        "prefs-i18n": "Entèrnacionalisacion",
        "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",
        "right-purge": "Purgiér lo cacho du seto d’una pâge sen confirmacion",
        "right-autoconfirmed": "Pas étre afèctâ per les limitacions de dèbit liyêes a les adrèces IP",
        "right-bot": "Étre trètâ coment un mècanismo ôtomatisâ",
-       "right-nominornewtalk": "Pas dècllenchiér la notificacion de mèssâjo novél quand fant un petiôt changement sur la pâge de discussion d’un utilisator",
+       "right-nominornewtalk": "Pas dècllenchiér la notificacion de mèssâjo novél quand fant un petiôt changement dessus la pâge de discussion d’un utilisator",
        "right-apihighlimits": "Empleyér de limites ples hôtes dedens les demandes API",
        "right-writeapi": "Empleyér l’API d’ècritura",
        "right-delete": "Suprimar de pâges",
        "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_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.",
        "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 sur lo [[Special:Log/upload|jornâl des tèlèchargements]], et les suprèssions sur 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 :\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",
+       "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-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).",
        "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]]",
-       "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 sur la pâge de dèscripcion.\nPor o fâre, vos la devréd changiér a la man.\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.",
        "file-thumbnail-no": "Lo nom du fichiér comence per <strong>$1</strong>.\nSemble étre un’émâge en talye rèduita <em>(miniatura)</em>.\nSe vos éd cel’émâge en hôta rèsolucion, tèlèchargiéd-la, ôtrament changiéd son nom, se vos plét.",
        "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>.",
        "foreign-structured-upload-form-label-own-work": "Su l’ôtor de cel’ôvra",
        "foreign-structured-upload-form-label-infoform-categories": "Catègories",
        "foreign-structured-upload-form-label-infoform-date": "Dâta",
-       "foreign-structured-upload-form-label-own-work-message-local": "Confirmo que tèlèchârjo cél fichiér d’aprés les condicions et les politiques de licence de {{SITENAME}}.",
+       "foreign-structured-upload-form-label-own-work-message-local": "Confirmo que tèlèchârjo cél fichiér d’aprés les condicions d’usâjo et les politiques de licence de {{SITENAME}}.",
        "foreign-structured-upload-form-label-not-own-work-message-local": "Se vos pouede pas tèlèchargiér cél fichiér d’aprés les politiques de {{SITENAME}}, se vos plét cllôde cela bouèta de dialogo et pués èprovâd un’ôtra mètoda.",
-       "foreign-structured-upload-form-label-not-own-work-local-local": "Vos pouede avouéc èprovar la [[Special:Upload|pâge de tèlèchargement per dèfôt]].",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Vos pouede asse-ben èprovar la [[Special:Upload|pâge de tèlèchargement per dèfôt]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Compregno que tèlèchârjo cél fichiér vers un dèpôt partagiê. Confirmo qu’o fé d’aprés les condicions d’usâjo et les politiques de licence de ceti.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Se vos pouede pas tèlèchargiér cél fichiér d’aprés les politiques du dèpôt partagiê, se vos plét cllôde cela bouèta de dialogo et pués èprovâd un’ôtra mètoda.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Vos pouede asse-ben èprovar d’empleyér la [[Special:Upload|pâge de tèlèchargement de {{SITENAME}}]], se cél fichiér y pôt étre tèlèchargiê d’aprés lors politiques.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Cèrtifio étre lo dètentior des drêts d’ôtor sur cél fichiér, et j’accèpto de publeyér cél fichiér dessus Wikimedia Commons en lo betent irrèvocâblament desot licence [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Atribucion - Partâjo dens les Mémes Condicions 4.0] et pués j’accèpto les [https://wikimediafoundation.org/wiki/Terms_of_Use condicions d’usâjo].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Se vos éte pas lo dètentior des drêts d’ôtor sur cél fichiér ou ben que vos lo voléd publeyér desot na licence difèrenta, vos pouede empleyér l’[https://commons.wikimedia.org/wiki/Special:UploadWizard assistent de tèlèchargement de Commons].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Vos pouede asse-ben èprovar d’empleyér la [[Special:Upload|pâge de tèlèchargement de {{SITENAME}}]], se cél fichiér y pôt étre tèlèchargiê d’aprés lors politiques.",
        "backend-fail-stream": "Y at pas moyen de tramandar lo fichiér « $1 ».",
        "backend-fail-backup": "Y at pas moyen d’encartar lo fichiér « $1 ».",
        "backend-fail-notexists": "Lo fichiér $1 ègziste pas.",
        "backend-fail-copy": "Y at pas moyen de copiyér lo fichiér « $1 » vers « $2 ».",
        "backend-fail-move": "Y at pas moyen de dèplaciér lo fichiér « $1 » vers « $2 ».",
        "backend-fail-opentemp": "Y at pas moyen d’uvrir lo fichiér temporèro.",
-       "backend-fail-writetemp": "Y at pas moyen d’ècrire dedens lo fichiér temporèro.",
+       "backend-fail-writetemp": "Y at pas moyen d’ècrire sur lo fichiér temporèro.",
        "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-readonly": "Ora lo sistèmo de stocâjo « $1 » est justo en lèctura. La rêson balyêe est : « ''$2'' »",
+       "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 pèrmissions ensufisentes ou ben de rèpèrtouèros / conteniors manquents.",
-       "filejournal-fail-dbconnect": "Y at pas moyen de sè branchiér a la bâsa de balyês du jornal 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 jornal por lo sistèmo de stocâjo « $1 ».",
-       "lockmanager-notlocked": "Y at pas moyen de dèvèrrolyér « $1 » ; il est pas vèrrolyê.",
+       "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.",
+       "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â.",
        "lockmanager-fail-closelock": "Y at pas moyen de cllôre lo fichiér de vèrroly por « $1 ».",
        "lockmanager-fail-deletelock": "Y at pas moyen de suprimar lo fichiér de vèrroly por « $1 ».",
        "lockmanager-fail-acquirelock": "Y at pas moyen d’avêr lo vèrroly por « $1 ».",
        "lockmanager-fail-releaselock": "Y at pas moyen de relâchiér lo vèrroly por « $1 ».",
        "lockmanager-fail-db-bucket": "Y at pas moyen de sè veriér vers prod de bâses de balyês de vèrroly dedens la sèlye $1.",
        "lockmanager-fail-db-release": "Y at pas moyen de relâchiér los vèrrolys sur la bâsa de balyês $1.",
-       "lockmanager-fail-svr-acquire": "Y at pas moyen d’avêr des vèrrolys sur lo sèrvior $1.",
+       "lockmanager-fail-svr-acquire": "Y at pas moyen d’avêr de vèrrolys sur lo sèrvior $1.",
        "lockmanager-fail-svr-release": "Y at pas moyen de relâchiér los vèrrolys sur lo sèrvior $1.",
        "zip-file-open-error": "Na fôta est arrevâye pendent l’uvèrtura du fichiér por los contrôlos ZIP.",
        "zip-wrong-format": "Lo fichiér spècifiâ est pas un fichiér ZIP.",
        "zip-bad": "Lo fichiér est un fichiér ZIP corrompu ou ben ôtrament iliésiblo.\nPôt pas étre controlâ coment fôt por la sècuritât.",
-       "zip-unsupported": "Lo fichiér est un fichiér ZIP qu’emplèye des fonccionalitâts ZIP pas recognues per MediaWiki.\nPôt pas étre controlâ coment fôt por la sècuritât.",
+       "zip-unsupported": "Lo fichiér est un fichiér ZIP qu’emplèye de fonccionalitâts ZIP pas recognues per MediaWiki.\nPôt pas étre controlâ coment fôt por la sècuritât.",
        "uploadstash": "Cacho de tèlèchargement",
-       "uploadstash-summary": "Ceta pâge balye accès ux fichiérs que sont tèlèchargiês ou ben en côrs 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": "Èfaciér los fichiérs en cacho",
+       "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 manquenta.\nVoutron sèrvior est pas configurâ por passar cel’enformacion.\nPôt étre bâsâye sur CGI et vêr pas recognetre « img_auth ».\nVêde https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "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-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.",
        "img-auth-nofile": "Lo fichiér « $1 » ègziste pas.",
-       "img-auth-isdir": "Vos èprovâd d’arrevar u rèpèrtouèro « $1 ».\nSolament l’accès ux fichiérs est pèrmês.",
+       "img-auth-isdir": "Vos èprovâd d’arrevar u rèpèrtouèro « $1 ».\nSolament l’accès ux fichiérs est pèrmetu.",
        "img-auth-streaming": "Lèctura en continu de « $1 ».",
-       "img-auth-public": "La fonccion de img_auth.php est de sortir des fichiérs d’un vouiqui privâ.\nCeti vouiqui est configurâ coment un vouiqui publico.\nPor na sècuritât pèrfèta, img_auth.php est dèsactivâ.",
-       "img-auth-noread": "L’utilisator at pas accès a la lèctura de « $1 ».",
+       "img-auth-public": "La fonccion d’img_auth.php est de sortir de fichiérs d’un vouiqui privâ.\nCél vouiqui est configurâ coment un vouiqui publico.\nPor na sècuritât parfèta, img_auth.php est dèsactivâ.",
+       "img-auth-noread": "L’utilisator at pas accès en lèctura de « $1 ».",
        "http-invalid-url": "URL pas justa : $1",
        "http-invalid-scheme": "Les URLs avouéc lo plan « $1 » sont pas recognues.",
        "http-request-error": "La demanda HTTP at pas reussi a côsa d’una fôta encognua.",
        "upload-curl-error6": "Y at pas moyen d’avengiér l’URL",
        "upload-curl-error6-text": "L’URL balyêe pôt pas étre avengiêe.\nSe vos plét, tornâd controlar que l’URL est justa et pués que lo seto est en legne.",
        "upload-curl-error28": "Dèlê dèpassâ pendent lo tèlèchargement",
-       "upload-curl-error28-text": "Lo seto at tardâ bien a rèpondre.\nSe vos plét, controlâd que lo seto est en legne, atende un pou et pués tornâd èprovar.\nVos pouede asse-ben èprovar a un’hora de muendra afluence.",
+       "upload-curl-error28-text": "Lo seto at tardâ ben a rèpondre.\nSe vos plét, controlâd que lo seto est en legne, atende-vos un petiôt moment et pués tornâd èprovar.\nVos pouede asse-ben èprovar a un’hora de muendra borrâ.",
        "license": "Licence :",
        "license-header": "Licence",
        "nolicense": "Pas yona chouèsia",
+       "licenses-edit": "Changiér los chouèx de licence",
        "license-nopreview": "(Apèrçu pas disponiblo)",
-       "upload_source_url": " (un’URL justa et accèssibla publicament)",
-       "upload_source_file": " (un fichiér sur voutron ordenator)",
-       "listfiles-summary": "Ceta pâge spèciâla montre tôs los fichiérs tèlèchargiês.\nQuand el est filtrâye per utilisator, solament los fichiérs que la vèrsion la ples novèla est étâye tèlèchargiêe per cél utilisator sont montrâs.",
-       "listfiles_search_for": "Rechèrchiér un nom de fichiér mèdia :",
+       "upload_source_url": "(lo fichiér que vos éd chouèsi dês un’URL justa et accèssibla publicament)",
+       "upload_source_file": "(lo fichiér que vos éd chouèsi dês voutron ordenator)",
+       "listfiles-delete": "suprimar",
+       "listfiles-summary": "Cela pâge spèciâla montre tôs los fichiérs tèlèchargiês.",
+       "listfiles_search_for": "Rechèrchiér un nom de fichiér multimèdiâ :",
+       "listfiles-userdoesnotexist": "Lo comptio utilisator « $1 » est pas encartâ.",
        "imgfile": "fichiér",
        "listfiles": "Lista de fichiérs",
-       "listfiles_thumb": "Figura",
+       "listfiles_thumb": "Miniatura",
        "listfiles_date": "Dâta",
        "listfiles_name": "Nom",
        "listfiles_user": "Utilisator",
        "listfiles_size": "Talye",
        "listfiles_description": "Dèscripcion",
        "listfiles_count": "Vèrsions",
+       "listfiles-show-all": "Entrebetar les vielyes vèrsions de les émâges",
+       "listfiles-latestversion": "Vèrsion d’ora",
+       "listfiles-latestversion-yes": "Ouè",
+       "listfiles-latestversion-no": "Nan",
        "file-anchor-link": "Fichiér",
        "filehist": "Historico du fichiér",
        "filehist-help": "Cllicar dessus na dâta et hora por vêre lo fichiér coment il ére a cél moment.",
        "filehist-datetime": "Dâta et hora",
        "filehist-thumb": "Miniatura",
        "filehist-thumbtext": "Miniatura por la vèrsion du $1",
-       "filehist-nothumb": "Niona figura",
+       "filehist-nothumb": "Niona miniatura",
        "filehist-user": "Utilisator",
        "filehist-dimensions": "Dimensions",
        "filehist-filesize": "Talye du fichiér",
        "filehist-comment": "Comentèro",
        "imagelinks": "Usâjo du fichiér",
-       "linkstoimage": "{{PLURAL:$1|Cela pâge-que emplèye|Celes $1 pâges-que emplèyont}} ceti fichiér :",
-       "linkstoimage-more": "Més {{PLURAL:$1|d’una pâge emplèye|de $1 pâges emplèyont}} ceti fichiér.\nCeta lista montre ren que {{PLURAL:$1|la premiére pâge qu’emplèye|les $1 premiéres pâges qu’emplèyont}} ceti fichiér.\nNa [[Special:WhatLinksHere/$2|lista complèta]] est disponibla.",
-       "nolinkstoimage": "Niona pâge emplèye ceti fichiér.",
-       "morelinkstoimage": "Vêde [[Special:WhatLinksHere/$1|més de lims]] de vers ceti fichiér.",
+       "linkstoimage": "{{PLURAL:$1|Cela pâge-que emplèye|Celes $1 pâges-que emplèyont}} cél fichiér :",
+       "linkstoimage-more": "Més {{PLURAL:$1|d’una pâge emplèye|de $1 pâges emplèyont}} cél fichiér.\nCela lista-que montre mas que {{PLURAL:$1|la premiére pâge qu’emplèye|les $1 premiéres pâges qu’emplèyont}} cél fichiér.\nNa [[Special:WhatLinksHere/$2|lista complèta]] est disponibla.",
+       "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]]) :",
-       "sharedupload": "Ceti fichiér vint de $1 et pôt étre empleyê per d’ôtros projèts.",
-       "sharedupload-desc-there": "Ceti fichiér vint de $1 et pôt étre empleyê per d’ôtros projèts.\nSe vos plét, vêde la sina [$2 pâge de dèscripcion] por més d’enformacions.",
+       "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.",
-       "sharedupload-desc-edit": "Ceti fichiér vint de $1 et pôt étre empleyê per d’ôtros projèts.\nPôt-étre vos voléd changiér la dèscripcion sur la sina [$2 pâge de dèscripcion].",
-       "sharedupload-desc-create": "Ceti fichiér vint de $1 et pôt étre empleyê per d’ôtros projèts.\nPôt-étre vos voléd changiér la dèscripcion sur la sina [$2 pâge de dèscripcion].",
+       "sharedupload-desc-edit": "Cél fichiér vint de $1 et pôt étre empleyê per d’ôtros projèts.\nPôt-étre vos voléd changiér la dèscripcion dessus sa [$2 pâge de dèscripcion].",
+       "sharedupload-desc-create": "Cél fichiér vint de $1 et pôt étre empleyê per d’ôtros projèts.\nPôt-étre vos voléd changiér la dèscripcion dessus sa [$2 pâge de dèscripcion].",
        "filepage-nofile": "Nion fichiér de cél nom ègziste.",
        "filepage-nofile-link": "Nion fichiér de cél nom ègziste, mas vos en pouede [$1 tèlèchargiér yon].",
-       "uploadnewversion-linktext": "Tèlèchargiér na novèla vèrsion de ceti fichiér",
+       "uploadnewversion-linktext": "Tèlèchargiér na novèla vèrsion de cél fichiér",
        "shared-repo-from": "de : $1",
        "shared-repo": "un dèpôt partagiê",
        "filepage.css": "/* Lo code CSS betâ ique est encllu dens la pâge de dèscripcion du fichiér, et pués dens los vouiquis cliants ètrangiérs. */",
-       "upload-disallowed-here": "Vos pouede pas ècllafar ceti fichiér.",
+       "upload-disallowed-here": "Vos pouede pas ècllafar cél fichiér.",
        "filerevert": "Rèvocar $1",
        "filerevert-legend": "Rèvocar lo fichiér",
-       "filerevert-intro": "Vos éte prèst a rèvocar lo fichiér '''[[Media:$1|$1]]''' a la [$4 vèrsion du $2 a $3].",
+       "filerevert-intro": "Vos éte prèst a rèvocar lo fichiér <strong>[[Media:$1|$1]]</strong> a la [$4 vèrsion du $2 a $3].",
        "filerevert-comment": "Rêson :",
        "filerevert-defaultcomment": "Rèvocâ a la vèrsion du $1 a $2 ($3)",
        "filerevert-submit": "Rèvocar",
-       "filerevert-success": "'''[[Media:$1|$1]]''' est étâ rèvocâ a la [$4 vèrsion du $2 a $3].",
+       "filerevert-success": "<strong>[[Media:$1|$1]]</strong> est étâ rèvocâ a la [$4 vèrsion du $2 a $3].",
        "filerevert-badversion": "Y at gins de vèrsion locâla devant de cél fichiér avouéc l’horodatâjo balyê.",
        "filedelete": "Suprimar $1",
        "filedelete-legend": "Suprimar lo fichiér",
-       "filedelete-intro": "Vos éte prèst a suprimar lo fichiér '''[[Media:$1|$1]]''' et pués tot lo sin historico.",
-       "filedelete-intro-old": "Vos éte aprés suprimar la vèrsion de '''[[Media:$1|$1]]''' du [$4 $2 a $3].",
+       "filedelete-intro": "Vos éte prèst a suprimar lo fichiér <strong>[[Media:$1|$1]]</strong> et pués tot son historico.",
+       "filedelete-intro-old": "Vos éte aprés suprimar la vèrsion de <strong>[[Media:$1|$1]]</strong> du [$4 $2 a $3].",
        "filedelete-comment": "Rêson :",
        "filedelete-submit": "Suprimar",
-       "filedelete-success": "'''$1''' est étâ suprimâ.",
-       "filedelete-success-old": "La vèrsion de '''[[Media:$1|$1]]''' du $2 a $3 est étâye suprimâye.",
-       "filedelete-nofile": "'''$1''' ègziste pas.",
-       "filedelete-nofile-old": "Ègziste gins de vèrsion arch·ivâye de '''$1''' avouéc los atributs spècifiâs.",
-       "filedelete-otherreason": "Ôtra rêson / rêson de ples :",
+       "filedelete-success": "<strong>$1</strong> est étâ suprimâ.",
+       "filedelete-success-old": "La vèrsion de <strong>[[Media:$1|$1]]</strong> du $2 a $3 est étâye suprimâye.",
+       "filedelete-nofile": "<strong>$1</strong> ègziste pas.",
+       "filedelete-nofile-old": "Ègziste gins de vèrsion arch·ivâye de <strong>$1</strong> avouéc los atributs spècifiâs.",
+       "filedelete-otherreason": "Ôtra rêson ou ben rêson de més :",
        "filedelete-reason-otherlist": "Ôtra rêson",
-       "filedelete-reason-dropdown": "*Rêsons corentes de suprèssion\n** Violacion du drêt d’ôtor\n** Fichiér en doblo",
+       "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 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.",
        "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 que corrèspond 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 d’entrebetâ 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 lo cajon 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 povêr vêre ou ben 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.",
+       "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ê 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}}]]).",
        "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-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-edit-reasonlist": "Changiér les rêsons de protèccion",
        "whatlinkshere-hidelinks": "$1 los lims",
        "whatlinkshere-hideimages": "$1 los fichiérs liyês",
        "whatlinkshere-filters": "Filtros",
+       "whatlinkshere-submit": "Emmodar",
        "autoblockid": "Blocâjo ôtomatico #$1",
        "block": "Blocar l’usanciér",
        "unblock": "Dèblocar l’usanciér",
        "allmessages-filter-modified": "Changiê",
        "allmessages-prefix": "Filtrar per prèfixo :",
        "allmessages-language": "Lengoua :",
-       "allmessages-filter-submit": "Aplicar",
+       "allmessages-filter-submit": "Emmodar",
        "thumbnail-more": "Agrantir",
        "filemissing": "Fichiér manquent",
        "thumbnail_error": "Èrror pendent la crèacion de la figura : $1",
        "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 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..0c59e35 100644 (file)
        "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 de bot \"$1\".",
        "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 \"$1\" foi actualizado.",
        "botpasswords-deleted-title": "Contrasinal de bot borrado",
        "botpasswords-deleted-body": "O contrasinal de bot \"$1\" 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>",
        "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",
        "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 eb82d6f..b48844d 100644 (file)
@@ -11,7 +11,8 @@
                        "Supriya kankumbikar",
                        "Vaishali Parab",
                        "The Discoverer",
-                       "Cliffa fernandes"
+                       "Cliffa fernandes",
+                       "Rxy"
                ]
        },
        "tog-hideminor": "हालींच बदल केल्ल्यांतले बारीक संपादन लिपय",
@@ -24,7 +25,7 @@
        "tog-enotifwatchlistpages": "म्हज्या सादुरवळेरेंतलें पान वा फायल बदल्ली जाल्यार म्हाका इमेल करात",
        "tog-shownumberswatching": "ध्यान दवरपी वांगड्यांची संख्या दाखय",
        "tog-oldsig": "सद्याची निशाणी",
-       "tog-uselivepreview": "लायव à¤ªà¥\81रà¥\8dवनियाळाà¤\9aà¥\8b à¤\89पà¥\87à¤\97 à¤\95र",
+       "tog-uselivepreview": "लायव à¤ªà¥\81रà¥\8dवनियाळाà¤\9aà¥\8b à¤µà¤¾à¤ªर",
        "tog-watchlisthideown": "सादुरवळेरीतलें म्हजे संपादन लिपय",
        "tog-watchlisthidebots": "ध्यानसुचीतले रोबोट संपादन लिपय",
        "tog-watchlisthideminor": "सादुरवळेरीतले ल्हान संपादन लिपय",
        "and": "&#32;आनीक",
        "qbfind": "सोदात",
        "qbbrowse": "ब्राउज",
-       "qbedit": "सà¤\82पादन",
+       "qbedit": "बदल",
        "qbpageoptions": "हें पान",
        "qbmyoptions": "म्हजी पानां",
        "faq": "परत परत विचारिल्ले प्रस्न",
        "print": "छाप",
        "view": "पळय",
        "view-foreign": " $1 चेर पळयात",
-       "edit": "सà¤\82पादन",
+       "edit": "बदल",
        "edit-local": "थळाव्या संपादनाचें वर्णन",
        "create": "निर्माण कर",
        "create-local": "थळावे वर्णन जोडात",
        "newpage": "नवें पान",
        "talkpage": "ह्या पानाचेर चर्चा करात",
        "talkpagelinktext": "चर्चा",
-       "specialpage": "à¤\96ाशà¥\87लà¥\87à¤\82 पान",
+       "specialpage": "विशà¥\87श पान",
        "personaltools": "खाजगी साधनां",
        "articlepage": "मजकूर पान पळयात",
        "talk": "भासाभास",
        "redirectedfrom": "($1 सून पुनर्निर्देशित)",
        "redirectpagesub": "पान परतून निर्देशीत करचें",
        "redirectto": "हांगां पुनर्निर्देशित:",
-       "lastmodifiedat": " ह्या पानांत निमाणो बदल,$1 वेर $2 वेळार केल्लो",
+       "lastmodifiedat": "ह्या पानांत निमाणो बदल,$1 वेर $2 वेळार केल्लो",
        "protectedpage": "राखून दवरिल्लें पान",
        "jumpto": "हुपून वचात:",
        "jumptonavigation": "दिशा-नियंत्रण",
        "ok": "बरें",
        "retrievedfrom": "\"$1\" चे कडल्यान परतून मेळयलें",
        "youhavenewmessagesmulti": "$1 चेर तुका नवो संदेश आसा",
-       "editsection": "सà¤\82पादन",
-       "editold": "सà¤\82पादन",
+       "editsection": "बदल",
+       "editold": "बदल",
        "viewsourceold": "उगम पळेयात",
        "editlink": "बदल",
        "viewsourcelink": "उगम पळयात",
        "nstab-main": "पान",
        "nstab-user": "वापरपी पान",
        "nstab-media": "माध्यमाचें पान",
-       "nstab-special": "à¤\96ाशà¥\87लà¥\87à¤\82 पान",
+       "nstab-special": "विशà¥\87श पान",
        "nstab-project": "प्रकल्पाचें पान",
        "nstab-image": "फायल",
        "nstab-mediawiki": "संदेश",
        "nstab-help": "आदाराचें पान",
        "nstab-category": "वर्ग",
        "nosuchaction": "असले तरेचे कार्य ना",
-       "nosuchspecialpage": "à¤\85सलà¥\87 à¤\95ाà¤\82यà¤\9a à¤\96ाशà¥\87लà¥\87à¤\82 पान ना",
+       "nosuchspecialpage": "à¤\85सलà¥\87 à¤\95ाà¤\82यà¤\9a à¤µà¤¿à¤¶à¥\87श पान ना",
        "error": "चूक",
        "databaseerror": "डॅटाबॅज त्रुटी",
        "databaseerror-textcl": "डॅटाबेज विरोध त्रुटी आयिल्ली आसा",
        "image_tip": "अंत: स्थापीत फायल",
        "media_tip": "फायलीची जोडणी",
        "sig_tip": "वेळ-छाप सयत तुमची निशाणी",
-       "hr_tip": "à¤\86डवà¥\80 à¤µà¤³ (à¤\89णà¥\8b à¤\89पà¥\87à¤\97 à¤\95रचो)",
+       "hr_tip": "à¤\86डवà¥\80 à¤µà¤³ (à¤\89णà¥\8b à¤µà¤¾à¤ªरचो)",
        "summary": "आपरोस:",
        "subject": "विशय/माथाळो",
        "minoredit": "हें दाकटें संपादन",
        "prefs-watchlist": "सादुरवळेरी",
        "youremail": "इमेल",
        "yourrealname": "खरें नांवः",
-       "right-writeapi": "बरà¥\8bवपाà¤\9aà¥\87 API à¤\9aà¥\8b à¤\89पà¥\87à¤\97 à¤\95रात",
+       "right-writeapi": "बरà¥\8bवपाà¤\9aà¥\87 API à¤µà¤¾à¤ªरात",
        "newuserlogpage": "वापरपी रोचनेचे वळेरी",
        "action-edit": "हें पान संपादीत कर",
        "nchanges": "$1 {{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| नव्या पानांची सुची]] पळयात)",
        "rcnotefrom": "$2 पासून केल्ले बदल सकयल दिल्यात ($1 मेरेन दाखयल्यात)",
        "rclistfrom": "$3 $2 साकून नवें बदल दाखयात",
        "statistics": "संख्याशास्त्र",
        "statistics-pages": "पान:",
        "statistics-files": "फायल अपलोड करात",
-       "brokenredirects-edit": "सà¤\82पादन",
+       "brokenredirects-edit": "बदल",
        "brokenredirects-delete": "काडून उडयात",
        "nbytes": "$1 {{PLURAL:$1|बाय्ट}}",
        "nmembers": "$1 {{PLURAL:$1|वांगडी}}",
        "changecontentmodel-reason-label": "कारण:",
        "protectlogpage": "सुरक्षितेचें सोत्र",
        "protectedarticle": "राखिल्ले\"[[$1]]\"",
-       "restriction-edit": "सà¤\82पादन",
+       "restriction-edit": "बदल",
        "restriction-move": "दुसरेकडे व्हरात",
        "restriction-create": "निर्माण कर",
        "undeletelink": "पळेयात/परत हाडात",
        "namespace_association": "संबंदीत नांवथोळ",
        "tooltip-namespace_association": "चर्चा वा वेंचीक नांवाचें सुवातीक संबंदीत विशयाच्या नांवाची सुवात आस्पावन घेवपाखातीर ह्या बॉक्सांत पळयात",
        "blanknamespace": "(मुखेल)",
-       "contributions": "{{GENDER:$1|à¤\89पà¥\87à¤\97à¤\95रà¥\8dतà¥\8b}} योगदानां",
+       "contributions": "{{GENDER:$1|वापरपà¥\80}} योगदानां",
        "contributions-title": "$1 खातीर वापरप्याचीं योगदानां",
        "mycontris": "योगदान",
        "uctop": "(हालीचें)",
        "tooltip-t-contributions": "ह्या वापरप्याची योगदानाची वळेरी",
        "tooltip-t-emailuser": "ह्या उपेगकर्त्याक इ-मेल धाडात",
        "tooltip-t-upload": "फायली अपलोड करात",
-       "tooltip-t-specialpages": "सà¤\97ळà¥\8dया à¤\96ाशà¥\87लà¥\8dया पानांची वळेरी",
+       "tooltip-t-specialpages": "सà¤\97ळà¥\8dया à¤µà¤¿à¤¶à¥\87श पानांची वळेरी",
        "tooltip-t-print": "ह्या पानाची छापपायोग्य आवृत्ती",
        "tooltip-t-permalink": "ह्या पानाच्या ह्या पुनर्नियाळाकडे सदांकाळ जोडणी",
        "tooltip-ca-nstab-main": "मजकूर पान पळेयात",
        "watchlisttools-view": "प्रस्तूत बदल पळयात.",
        "watchlisttools-edit": "सादुरवळेरी पळय आनी संपादीत करात",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|उलयात]])",
-       "specialpages": "à¤\96ाशà¥\87लà¥\80à¤\82 पानां",
+       "specialpages": "विशà¥\87श पानां",
        "tag-filter": "[[Special:Tags|कुर्वेचीट]] गाळणो:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|कुरवेचीट|कुरवेचीटी}}]]: $2)",
        "htmlform-title-not-exists": "$1 अस्तित्वांत ना.",
index 28125ae..5343a48 100644 (file)
        "newpage": "Novem pan",
        "talkpage": "Hea panachem bhasabhas kor",
        "talkpagelinktext": "Bhasabhas",
-       "specialpage": "Khaxhel pan",
+       "specialpage": "Vixex pan",
        "personaltools": "Khasgi avtam",
        "articlepage": "Vixoi sombondhi pan poloi",
        "talk": "Bhasabhas",
        "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",
        "nstab-main": "Pan",
        "nstab-user": "Vapuddpeachem pan",
        "nstab-media": "Madheomachem pan",
-       "nstab-special": "Khaxelem pan",
+       "nstab-special": "Vixex pan",
        "nstab-project": "Prokolpache pan",
        "nstab-image": "Fail",
        "nstab-mediawiki": "Sondex",
        "nstab-category": "Vorg",
        "mainpage-nstab": "Mukhel pan",
        "nosuchaction": "Oslem torechem karya nam",
-       "nosuchspecialpage": "Oslem kaich khaxellem pan na",
+       "nosuchspecialpage": "Oslem kaich vixex pan na",
        "error": "Chuk",
        "databaseerror": "Totv-kox chuk",
        "databaseerror-textcl": "Totv-kox (database) sodtana chuk ghodli",
        "template-semiprotected": "(ordhem rakhun dovorlelem)",
        "hiddencategories": "Hem pan {{PLURAL:$1|1 lipoilelea vorgacho vangddi|$1 lipoileleam vorgancho vangddi}}:",
        "permissionserrorstext-withaction": "$2, hem korpak tuka porvangi na, {{PLURAL:$1|hea karnnak lagon|hea karnnank lagun}}:",
-       "recreate-moveddeleted-warn": "<strong>Xittkavnni: Tum ek pan porot rochtai jem fattim kadun udoilelem.<strong>\n\nPanacho sudar korop sarkem zalear dhean di.\nPan vogllavpachem ani sotr halovpachem, sovloti khatir hangasor dilelem asa:",
+       "recreate-moveddeleted-warn": "<strong>Xittkavnni: Tum ek pan porot rochtai jem fattim kadun udoilelem.<strong>\n\nPanacho sudar korop sarkem zalear dhean di.\nPan kadoupachem ani halovpachem sotr, sovloti khatir hangasor dilelem asa:",
        "moveddeleted-notice": "Hem pan kadun udoilelem asa.\nPanachea kadun udounechi ani hallovnechi sotr sondorba khatir sokoil dilea.",
        "content-model-wikitext": "wikimozkur",
        "content-model-text": "Sado mozkur",
        "prefs-help-email": "Email potto sokticho na, pun tum gupitutor visroxi zalear gupitutor punorsthapon korunk email pottechi goroz podta.",
        "prefs-help-email-others": "Tujean dusreank tujea vapurpeacho panar vo bhasabhasache panar aslele eke email zodde vorvim tuje xim sompork korunk diunk zata.\nDusre tuje xim sompork kortat tednam tuzo email potto tankam kollchenam.",
        "group-all": "(soglle)",
-       "right-writeapi": "Borovpeache API-cho upeog",
+       "right-writeapi": "Borovpeache API-cho vapor",
        "newuserlogpage": "Vapurpi rochnnechem sotr",
        "action-edit": "hem pan sudar",
        "nchanges": "$1 {{PLURAL:$1|bodlop|bodlopam}}",
        "delete-legend": "Kadun udoi",
        "actioncomplete": "Karvai sompurnn",
        "actionfailed": "Karvai oiesiesvi",
-       "dellogpage": "Vogllaoneche sotr",
+       "dellogpage": "Kadun udouneche sotr",
        "deleteotherreason": "Dusrem/aniki karon:",
        "rollbacklink": "kovoll",
        "rollbacklinkcount": "$1 {{PLURAL:$1|bodol|bodlopam}} kovoll",
        "tooltip-t-contributions": "{{GENDER:$1|Hea vapuddpeachea}} yogdanachi suchi",
        "tooltip-t-emailuser": "{{GENDER:$1|Hea vapuddpeak}} email patthoi",
        "tooltip-t-upload": "Faili upload kor",
-       "tooltip-t-specialpages": "Sogllea khaxelim pananchi volleri",
+       "tooltip-t-specialpages": "Sogllea vixex pananchi volleri",
        "tooltip-t-print": "Hea panachem chap'pakyogya avrutti",
        "tooltip-t-permalink": "Hea panache hea uzollnnek togpi zoddni",
        "tooltip-ca-nstab-main": "Mozkur pan polloi",
        "watchlisttools-raw": "Sadurvollerichi mull-an bodol kor",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|uloi]])",
        "duplicate-defaultsort": "'''Chotrai:''' Falta anukraman mukhel ''$2'' rodd korta adhlem falta anukraman mukhel ''$1'', haka.",
-       "specialpages": "Khaxelim Panam",
+       "specialpages": "Vixex panam",
        "external_image_whitelist": " #Hi voll asa toxich dovor<pre>\n#Khala sodpache sache (''regular expressions'') ghal (fokot // modem voita poi tem bhag)\n#Hanche borobor bhaile zodlele murt comparar kel'le zatele\n#Mell khatat tim murt koxeo distele, na zalear fokot mortek ek zodd distele\n#Jeo voll #-an suru zatele tem vivek mhunn manlele zatele\n#Hanga vhodle and dhakte okxora modem forok podona\n\n#Soglle sodpache sache hea volla voir ghal. Hi voll asa toxich dovor</pre>",
        "tag-filter": "[[Special:Tags|Kurvechit]] challni:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Kurvechit|Kurvechiti}}]]: $2)",
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..ebe10c7 100644 (file)
        "moredotdotdot": "और...",
        "morenotlisted": "यह सूची पूर्ण नहीं है।",
        "mypage": "पृष्ठ",
+       "anonuserpage": "अज्ञात सदस्य",
        "mytalk": "वार्ता",
        "anontalk": "वार्ता",
        "navigation": "भ्रमण",
        "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-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": "चिह्नित श्रेणी",
        "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": "उपयोक्ता पर अवरोधण हटाएँ",
        "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..4240fbb 100644 (file)
        "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''')։",
index a318921..0d14ead 100644 (file)
        "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.",
        "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",
        "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",
index 136f62f..0be6b07 100644 (file)
        "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 bot \"$1\" è stata creata.",
        "botpasswords-updated-title": "Password bot aggiornata",
-       "botpasswords-updated-body": "La password bot \"$1\" è stata aggiornata con successo.",
+       "botpasswords-updated-body": "La password bot \"$1\" è stata aggiornata.",
        "botpasswords-deleted-title": "Password bot cancellata",
        "botpasswords-deleted-body": "La password bot \"$1\" è stata cancellata.",
        "botpasswords-newpassword": "La nuova password per accedere con <strong>$1</strong> è <strong>$2</strong>. <em>Registratelo per consultazioni future.</em>",
        "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-nodirectediting": "Il modello di contenuto $1 non supporta la modifica diretta",
        "log-name-contentmodel": "Modifiche del modello contenuti",
        "log-description-contentmodel": "Eventi relativi al modello di contenuto di una pagina",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|ha creato}} la pagina $3 utilizzando un modello di contenuto non predefinito \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|ha modificato}} il modello di contenuto della pagina $3 da \"$4\" a \"$5\"",
        "logentry-contentmodel-change-revertlink": "ripristina",
        "logentry-contentmodel-change-revert": "ripristina",
        "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..53e2f20 100644 (file)
        "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": "მოვლენის ხილვადობა შეიცვალა.",
        "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\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\92á\83\97á\83®á\83\9dá\83\95á\83\97, á\83¡á\83ªá\83\90á\83\93á\83\94á\83\97 á\83\99á\83\98á\83\93á\83\94á\83\95.",
        "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..e07c931 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",
        "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)",
        "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..2496807 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",
        "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",
        "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",
        "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...",
        "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 '[[Specialis:Conlationes/$2|$2]]') ([[Disputatio:$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:",
        "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",
index a992d35..60117ff 100644 (file)
        "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.",
        "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",
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 3e6c7c1..ad93163 100644 (file)
        "blocked-mailpassword": "Jūsų IP adresas yra užblokuotas nuo redagavimo, taigi neleidžiama naudoti slaptažodžio priminimo funkcijos, kad apsisaugotume nuo piktnaudžiavimo.",
        "eauthentsent": "Patvirtinimo laiškas buvo nusiųstas į paskirtąjį el. pašto adresą.\nPrieš išsiunčiant kitą laišką į jūsų dėžutę, jūs turite vykdyti nurodymus laiške, kad patvirtintumėte, kad dėžutė tikrai yra jūsų.",
        "throttled-mailpassword": "Slaptažodžio priminimas jau buvo išsiųstas, per {{PLURAL:$1|$1 paskutinę valandą|$1 paskutines valandas|$1 paskutinių valandų}}.\n\nNorint apsisaugoti nuo piktnaudžiavimo, slaptažodžio priminimas gali būti išsiųstas tik kas {{PLURAL:$1|$1 valandą|$1 valandas|$1 valandų}}.",
-       "mailerror": "Klaida siunčiant paštą: $1",
+       "mailerror": "Klaida siunčiant laišką: $1",
        "acct_creation_throttle_hit": "Šio projekto lankytojai, naudojantys jūsų IP adresą, sukūrė {{PLURAL:$1|$1 paskyrą|$1 paskyras|$1 paskyrų}} per paskutiniąją dieną, o tai yra didžiausias leidžiamas kiekis per šį laiko tarpą.\nTodėl šiuo metu lankytojai, naudojantys šį IP adresą, daugiau negali kurti paskyrų.",
        "emailauthenticated": "Jūsų el. pašto adresas buvo patvirtintas $2 d. $3.",
        "emailnotauthenticated": "Jūsų el. pašto adresas dar nėra patvirtintas. Jokie laiškai\nnebus siunčiami nei vienai žemiau išvardintai paslaugai.",
        "mergehistory-empty": "Versijos negali būti sujungtos",
        "mergehistory-done": "$3 $1 {{PLURAL:$3|versija|versijos|versijų}} sėkmingai {{PLURAL:$3|sujungta|sujungtos|sujungta}} su [[:$2]].",
        "mergehistory-fail": "Nepavyksta atlikti istorijų sujungimo, prašome patikrinti puslapio ir laiko parametrus.",
+       "mergehistory-fail-invalid-dest": "Paskirties puslapis yra neteisingas.",
        "mergehistory-fail-toobig": "Nepavyksta sulieti istorijos, nes būtina pernešti daugiau, nei leidžia $1 riba, {{PLURAL:$1|versijos|versijų}}.",
        "mergehistory-no-source": "Šaltinio puslapis $1 neegzistuoja.",
        "mergehistory-no-destination": "Rezultato puslapis $1 neegzistuoja.",
        "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",
        "apisandbox": "API smėlio dėžės",
        "apisandbox-api-disabled": "API yra išjungtas šioje svetainėje.",
        "apisandbox-intro": "Naudokite šį puslapį norėdami eksperimentuoti su '''MediaWiki API \"„.\n\tIeškokite [//www.mediawiki.org/wiki/API:Main_page API dokumentacijoje] Išsamesnės informacijos apie API naudojimo.",
+       "apisandbox-fullscreen": "Išplėsti skydelį",
+       "apisandbox-unfullscreen": "Rodyti puslapį",
        "apisandbox-submit": "Pateikti prašymą",
        "apisandbox-reset": "Išvalyti",
        "apisandbox-retry": "Bandykite dar kartą",
        "apisandbox-no-parameters": "Šis API modulis neturi parametrų.",
+       "apisandbox-helpurls": "Pagalbinės nuorodos",
        "apisandbox-examples": "Pavyzdžiai",
        "apisandbox-dynamic-parameters": "Papildomi parametrai",
        "apisandbox-dynamic-parameters-add-label": "Pridėti parametrą:",
        "apisandbox-dynamic-parameters-add-placeholder": "Parametro pavadinimas",
+       "apisandbox-dynamic-error-exists": "Parametras, pavadinimu „$1“ jau yra.",
        "apisandbox-deprecated-parameters": "Nebenaudojami parametrai",
        "apisandbox-submit-invalid-fields-title": "Kai kurie laukai yra neteisingi",
        "apisandbox-results": "Rezultatai",
        "apisandbox-request-url-label": "Prašyti URL:",
        "apisandbox-request-time": "Užklausos laikas: $1",
+       "apisandbox-alert-field": "Šio lauko reikšmė yra neteisinga.",
        "booksources": "Knygų šaltiniai",
        "booksources-search-legend": "Knygų šaltinių paieška",
        "booksources-search": "Ieškoti",
        "expand_templates_preview_fail_html": "<em>Nes {{SITENAME}} turi įgalinta gryną HTML ir įvyko sesijos duomenų praradimas, peržiūra yra paslėpta kaip atsargos priemonė prieš JavaScript atakas.</em>\n\n<strong>Jei tai teisėtas peržiūros bandymas, prašome bandyti dar kartą.</strong>\nJei tai vistiek neveikia, pabandykite [[Special:UserLogout|atsijungti]] ir vėl prisijungti.",
        "expand_templates_preview_fail_html_anon": "<em>Nes {{SITENAME}} turi įgalinta gryną HTML ir jūs esate neprisijungęs, peržiūra paslėpta kaip atsargumo priemonė prieš JavaScript atakas.</em>\n\n<strong>Jei tai teisėtas peržiūros bandymas prašome [[Special:UserLogin|prisijungti]] ir bandyti vėl.</strong>",
        "expand_templates_input_missing": "Turite pateikti bent truputį įvesties teksto.",
-       "pagelanguage": "Puslapio kalbos pasirinkimas",
+       "pagelanguage": "Keisti puslapio kalbą",
        "pagelang-name": "Puslapis",
        "pagelang-language": "Kalba",
        "pagelang-use-default": "Naudoti numatytąją kalbą",
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 4d3fe0b..7437611 100644 (file)
        "userrights": "Dalībnieku tiesību pārvaldība",
        "userrights-lookup-user": "Pārvaldīt dalībnieka grupas",
        "userrights-user-editname": "Ievadi lietotājvārdu:",
-       "editusergroup": "Izmainīt dalībnieka grupas",
+       "editusergroup": "Izmainīt {{GENDER:$1|dalībnieka|dalībnieces}} grupas",
        "editinguser": "Izmainīt lietotāja '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) statusu",
        "userrights-editusergroup": "Izmainīt lietotāja grupas",
-       "saveusergroups": "Saglabāt dalībnieka grupas",
+       "saveusergroups": "Saglabāt {{GENDER:$1|dalībnieka|dalībnieces}} grupas",
        "userrights-groupsmember": "Šobrīd ietilpst grupās:",
        "userrights-groupsmember-auto": "Netiešs dalībnieks:",
        "userrights-groups-help": "Tu vari izmainīt kādās grupās šis lietotājs ir:\n* Ieķeksēts lauciņš norāda, ka lietotājs ir attiecīgajā grupā.\n* Neieķeksēts lauciņš norāda, ka lietotājs nav attiecīgajā grupā.\n* * norāda, ka šo grupu tu nevarēsi noņemt, pēc tam, kad to būsi pielicis, vai otrādāk (tu nevarēsi atcelt savas izmaiņas).",
        "recentchanges-label-bot": "Šis ir bota veikts labojums",
        "recentchanges-label-unpatrolled": "Šis labojums vēl nav pārbaudīts",
        "recentchanges-label-plusminus": "Par tik baitiem tika izmainīts lapas izmērs",
-       "recentchanges-legend-heading": "'''Apzīmējumi:'''",
+       "recentchanges-legend-heading": "<strong>Apzīmējumi:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (skatīt arī [[Special:NewPages|jaunās lapas]])",
        "recentchanges-submit": "Rādīt",
        "rcnotefrom": "Šobrīd redzamas izmaiņas kopš '''$2''' (parādītas ne vairāk par '''$1''').",
        "apisandbox": "API smilškaste",
        "apisandbox-api-disabled": "API ir atspējots šajā tīmekļa vietnē.",
        "apisandbox-reset": "Notīrīt",
-       "apisandbox-examples": "Piemērs",
-       "apisandbox-results": "Rezultāts",
+       "apisandbox-examples": "Piemēri",
+       "apisandbox-results": "Rezultāti",
        "apisandbox-request-url-label": "Pieprasījuma URL:",
        "apisandbox-request-time": "Pieprasījuma izpildes laiks: $1",
        "booksources": "Grāmatu avoti",
        "movenotallowedfile": "Tev nav atļaujas pārvietot failus.",
        "cant-move-user-page": "Tev nav atļaujas pārvietot lietotāju lapas (neskaitot apakšlapas).",
        "cant-move-to-user-page": "Tev nav atļaujas pārvietot lapu uz lietotāja lapu (neskaitot lietotāja lapas apakšlapu).",
-       "newtitle": "Uz šādu lapu",
+       "newtitle": "Jaunais nosaukums:",
        "move-watch": "Uzraudzīt šo lapu",
        "movepagebtn": "Pārvietot lapu",
        "pagemovedsub": "Pārvietošana notikusi veiksmīgi",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versijas|versija|versijas}} no $2",
        "javascripttest": "JavaScript testēšana",
        "javascripttest-pagetext-unknownaction": "Nezināma darbība \"$1\".",
-       "tooltip-pt-userpage": "Tava lietotāja lapa",
+       "tooltip-pt-userpage": "Tava {{GENDER:|dalībnieka|dalībnieces}} lapa",
        "tooltip-pt-anonuserpage": "Manas IP adreses lietotāja lapa",
-       "tooltip-pt-mytalk": "Tava diskusiju lapa",
+       "tooltip-pt-mytalk": "{{GENDER:|Tava}} diskusiju lapa",
        "tooltip-pt-anontalk": "Diskusija par labojumiem, kas izdarīti no šīs IP adreses",
-       "tooltip-pt-preferences": "Tavas izvēles",
+       "tooltip-pt-preferences": "{{GENDER:|Tavas}} izvēles",
        "tooltip-pt-watchlist": "Tevis uzraudzītās lapas",
        "tooltip-pt-mycontris": "{{GENDER:|Tavs}} devums",
        "tooltip-pt-anoncontribs": "Labojumi, kas veikti no šīs IP adreses",
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 16cc94f..4a5b94b 100644 (file)
@@ -15,6 +15,7 @@
        "tog-hideminor": "Hanitsika ny fiovana madinika ao amin'ny fiovana farany",
        "tog-hidepatrolled": "Hanitrika ny fiovana voaara-maso ao amin'ny fiovana farany",
        "tog-newpageshidepatrolled": "Hanitsika ny pejy voaara-maso ao amin'ny pejy vaovao",
+       "tog-hidecategorization": "Hanafina ny fansokajiana pejy",
        "tog-extendwatchlist": "Hanitatra ny lisitra fanaraham-pejy mba haneho ny fanovana rehetra fa tsy ny vaovao indrindra fotsiny",
        "tog-usenewrc": "Hampivondrona ny fiovana araky ny pejy ao amin'ny fiovana farany ary ao amin'ny lisitry ny pejy arahana",
        "tog-numberheadings": "Asio laharany ny lohateny",
        "tog-watchlisthidebots": "Asitriho amin'ny lisitro ny fanovàna nataon'ny rôbô",
        "tog-watchlisthideminor": "Tsy aseho ny fisoloina kely anatin'ny pejy fanaraha-maso",
        "tog-watchlisthideliu": "Asitriho amin'ny lisitro ny fanovàna nataon'ny mpikambana hafa",
+       "tog-watchlistreloadautomatically": "Hanavao ny lisitry ny pejy arahana rehefa misy sivana niova (mila JavaScript)",
        "tog-watchlisthideanons": "Asitriho amin'ny lisitro ny fanovana nataon'ny IP",
        "tog-watchlisthidepatrolled": "Asitriho amin'ny lisitro ny fanovàna efa nojerena",
+       "tog-watchlisthidecategorization": "Hanafina ny fanasokajiana pejy",
        "tog-ccmeonemails": "Andefaso tahaka ny imailaka alefako amin'ny mpikambana hafa",
        "tog-diffonly": "Aza ampiseho ny voatonin'ny pejy eo amban'ny diff",
        "tog-showhiddencats": "Asehoy ny sokajy misitrika",
        "databaseerror-query": "Hataka: $1",
        "databaseerror-function": "Lefa: $1",
        "databaseerror-error": "Hadisoana: $1",
+       "transaction-duration-limit-exceeded": "Mba tsy hisian'ny fihalavan'ny fotoam-pandikana be loatra, dia nofoanana ity asa ity satria nihoatra ny fetra $2 {{PLURAL:$2}}segondra ny fotoana nalain'ny asa fanoratana ($1 s). Raha manova zavatra mibolongana be indray mandeha ianao dia zarazarao ho kelikely ny zavatra ataonao.",
        "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-cancel": "Avela",
+       "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 :",
        "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)",
        "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-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-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]]",
+       "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",
        "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",
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..f3e4132 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 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..4459df2 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": "ဖျက်ပစ်လိုက်သော မှတ်တမ်း",
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..b4fdd36 100644 (file)
        "recentchanges-label-bot": "Che sī ki-khì-lâng kái--ê",
        "recentchanges-label-unpatrolled": "這个編輯抑無巡視過",
        "recentchanges-label-plusminus": "彼頁改了;精差的位元組",
-       "recentchanges-legend-heading": "'''Ké-soeh:'''",
+       "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",
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 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..e9ff2ed 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 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 d91ed95..bcea86b 100644 (file)
@@ -81,7 +81,8 @@
                        "Doctore",
                        "PiotrAntosz",
                        "The Polish",
-                       "Expert3222"
+                       "Expert3222",
+                       "Mateuszek045"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "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",
        "listgrouprights-namespaceprotection-header": "Ograniczenia przestrzeni nazw",
        "listgrouprights-namespaceprotection-namespace": "Przestrzeń nazw",
        "listgrouprights-namespaceprotection-restrictedto": "Uprawnienia pozwalające użytkownikom na edytowanie",
+       "listgrants": "Uprawnienia",
+       "listgrants-grant": "Uprawnienie",
        "listgrants-rights": "Uprawnienie",
        "trackingcategories": "Śledzenie kategorii",
        "trackingcategories-summary": "Ta strona zawiera listę kategorii monitorujących wypełnianych automatycznie przez oprogramowanie MediaWiki. Nazwy kategorii można zmienić edytując odpowiednie komunikaty systemowe znajdujące się w przestrzeni nazw {{ns:8}}.",
        "delete-toobig": "Ta strona ma bardzo długą historię edycji – ponad $1 {{PLURAL:$1|zmianę|zmiany|zmian}}.<br />\nUsuwanie jej zostało ograniczone ze względu na możliwość zakłócenia pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.",
        "delete-warning-toobig": "Ta strona ma bardzo długą historię edycji – ponad $1 {{PLURAL:$1|zmianę|zmiany|zmian}}.<br />\nBądź ostrożny, ponieważ usunięcie jej może spowodować zakłócenia w pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.",
        "deleteprotected": "Nie możesz usunąć tej strony, ponieważ została zabezpieczona.",
-       "deleting-backlinks-warning": "''' Uwaga:''' Do strony, którą masz zamiar usunąć, odwołują się [[Special:WhatLinksHere/{{FULLPAGENAME}}|inne strony]].",
+       "deleting-backlinks-warning": "<strong>Uwaga:</strong> Do strony, którą masz zamiar usunąć, odwołują się [[Special:WhatLinksHere/{{FULLPAGENAME}}|inne strony]].",
        "rollback": "Cofnij edycję",
        "rollbacklink": "cofnij",
        "rollbacklinkcount": "cofnij $1 {{PLURAL:$1|edycję|edycje|edycji}}",
        "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:",
        "expand_templates_generate_xml": "Pokaż drzewo analizatora składni w formacie XML",
        "expand_templates_generate_rawhtml": "Pokaż surowy HTML",
        "expand_templates_preview": "Podgląd",
-       "expand_templates_preview_fail_html": "<em>Ponieważ {{SITENAME}} ma włączony surowy kod HTML i zaistniała strata danych z sesji, podgląd jest ukryty jako zabezpieczenie przed atakiem JavaScript.</em>\n\n<strong>Jeśli to jest próba słusznego podglądu, proszę spróbować ponownie.</strong>\nJeśli to nadal nie działa, spróbuj [[Special:UserLogout|wylogować się]] i zalogować się z powrotem.",
+       "expand_templates_preview_fail_html": "<em>Ponieważ {{SITENAME}} ma włączony surowy kod HTML i zaistniała strata danych z sesji, podgląd jest ukryty jako zabezpieczenie przed atakiem JavaScript.</em>\n\n<strong>Jeśli to jest próba słusznego podglądu, proszę spróbować ponownie.</strong>\nJeśli to nie pomoże – spróbuj [[Special:UserLogout|wylogować się]] i zalogować ponownie, a także upewnij się, że twoja przeglądarka akceptuje ciasteczka z tej witryny.",
        "pagelanguage": "Zmiana języka strony",
        "pagelang-name": "Strona",
        "pagelang-language": "Język",
        "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..51b82aa 100644 (file)
@@ -90,7 +90,8 @@
                        "Eduardo Addad de Oliveira",
                        "Raphaelras",
                        "Arthurteb303",
-                       "Rffontenelle"
+                       "Rffontenelle",
+                       "HenriqueCrang"
                ]
        },
        "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",
index 304fd47..cb91985 100644 (file)
        "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": "A palavra-passe para o robô \"$1\" foi criada.",
        "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": "A palavra-passe de robô \"$1\" foi atualizada.",
        "botpasswords-deleted-title": "Palavra-passe de robô eliminada",
        "botpasswords-deleted-body": "A palavra-passe de robô \"$1\" foi eliminada.",
        "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>",
        "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",
        "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.",
index c9a0c23..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.",
        "exif-make": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe Manufacturer of the digital camera (or scanner) that took the photo.",
        "exif-model": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe model of camera (or scanner) used to take the picture.",
        "exif-software": "Short for \"The software which was used to create or modify this image\".\n\nThe property can come from the Exif Software tag, PNG software chunk, iptc-iim 2:65 Software field, or XMP's xmp:CreatorTool field.\n\nExif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
-       "exif-artist": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis message labels the author or artist of the work. Usually this means who took the photograph, or who drew the picture. The corresponding value field most commonly contains a single author, however it can contain an ordered (or unordered depending on which metadata standard is used to store the information) list of authors. Sometimes the persons position is prefixed before their name such as \"Photographer, John Smith\". The exif standard recommends multiple authors be specified by \"position, Author 1; position for author 2, Author 2's name\" however this doesn't seem to happen in practise very often. If multiple authors are specified using a non-exif standard, then a billeted (or numbered) list is used.\n\nThis property can be specified by exif Artist tag, XMP's tiff:Artist, XMP's dc:creator, iptc-iim's 2:80 byline, PNG's author textual chunk, PNG's (unofficial) artist textual chunk. XMP's photoshop:AuthorsPosition and iptc 2:85 byline-title can also affect display of this property.\n{{Identical|Author}}",
+       "exif-artist": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis message labels the author or artist of the work. Usually this means who took the photograph, or who drew the picture. The corresponding value field most commonly contains a single author, however it can contain an ordered (or unordered depending on which metadata standard is used to store the information) list of authors. Sometimes the persons position is prefixed before their name such as \"Photographer, John Smith\". The exif standard recommends multiple authors be specified by \"position, Author 1; position for author 2, Author 2's name\" however this doesn't seem to happen in practice very often. If multiple authors are specified using a non-exif standard, then a billeted (or numbered) list is used.\n\nThis property can be specified by exif Artist tag, XMP's tiff:Artist, XMP's dc:creator, iptc-iim's 2:80 byline, PNG's author textual chunk, PNG's (unofficial) artist textual chunk. XMP's photoshop:AuthorsPosition and iptc 2:85 byline-title can also affect display of this property.\n{{Identical|Author}}",
        "exif-copyright": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nLabel for information contained in exif Copyright tag, XMP dc:rights, IPTC-iim 2:116, or PNG copyright textual chunk.\n\nTypically the copyright statement for the photograph/drawing/video (such as ''(c) 2010 John Smith. Released under GFDL''). Sometimes contains license information. See also {{msg-mw|exif-copyrightowner}}",
        "exif-exifversion": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nVersion of exif standard photo uses. Typically this is 2.22",
        "exif-flashpixversion": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nVersion of flashpix used. Flashpix is a format used for storing some types of metadata in image. It is not as commonly used as EXIF, and mediawiki currently cannot read Flashpix data.",
        "exif-compressedbitsperpixel": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
        "exif-pixelydimension": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Image width}}",
        "exif-pixelxdimension": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Image height}}",
-       "exif-usercomment": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nComments by user. Sometimes used like ImageDescription when the ImageDescription contained non-ascii characters. (Technically ImageDescription is supposed to contain ascii characters. In practise utf-8 is used in ImageDescription, so this field isn't used too much.)",
+       "exif-usercomment": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nComments by user. Sometimes used like ImageDescription when the ImageDescription contained non-ascii characters. (Technically ImageDescription is supposed to contain ascii characters. In practice utf-8 is used in ImageDescription, so this field isn't used too much.)",
        "exif-relatedsoundfile": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSome cameras offer the option to record an audio \"memo\" for the photo they just took. If the user did that, the name of the file is labelled with this message.",
        "exif-datetimeoriginal": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe date and time when the original image data was generated. For example if it was a painting from 1773, scanned in to a computer in 2007, the datetimeoriginal would be 1773 and {{msg-mw|exif-datetimedigitized}} would have the 2007 date.",
        "exif-datetimedigitized": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe date and time when the image was stored as digital data.",
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..75d7c49 100644 (file)
        "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": "Ð\9fаÑ\80олÑ\8c Ð±Ð¾Ñ\82а Â«$1» Ð±Ñ\8bл Ñ\83Ñ\81пеÑ\88но Ñ\81оздан.",
+       "botpasswords-created-body": "Пароль бота «$1» был создан.",
        "botpasswords-updated-title": "Пароль бота обновлён",
-       "botpasswords-updated-body": "Пароль бота «$1» был успешно обновлён.",
+       "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": "Неправильный временный или текущий пароль.\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-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..e62d931 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 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..0034434 100644 (file)
        "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 1571bc2..a0c7d66 100644 (file)
        "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.",
        "changecontentmodel-nodirectediting": "Model vsebine $1 ne podpira neposrednega urejanja",
        "log-name-contentmodel": "Dnevnik sprememb modela vsebine",
        "log-description-contentmodel": "Dogodki, povezani z modeli vsebin strani",
+       "logentry-contentmodel-new": "$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} stran $3 z neprivzetim modelom vsebine »$5«",
        "logentry-contentmodel-change": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} model vsebine strani $3 z »$4« na »$5«",
        "logentry-contentmodel-change-revertlink": "vrni",
        "logentry-contentmodel-change-revert": "vrni",
        "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..04b8a53 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 e42fc1a..e95cfbb 100644 (file)
        "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).",
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 849f526..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.",
        "newarticle": "(Ny)",
        "newarticletext": "Du har klickat på en länk till en sida som inte finns ännu. För att skapa sidan, börja att skriva i fältet nedan (du kan läsa mer på [$1 hjälpsidan]). Om du kom hit av misstag kan du bara trycka på <strong>tillbaka</strong>-knappen i din webbläsare.",
        "anontalkpagetext": "----''Detta är diskussionssidan för en anonym användare som inte ännu skapat ett konto, eller som inte använder det.\nDärför måste vi använda den numeriska IP-adressen för att identifiera honom/henne.\nEn sådan IP-adress kan delas av flera användare.\nOm du är en anonym användare och känner att irrelevanta kommentarer har riktats mot dig, vänligen [[Special:UserLogin/signup|skapa ett konto]] eller [[Special:UserLogin|logga in]] för att undvika framtida förväxlingar med andra anonyma användare.''",
-       "noarticletext": "Det finns just nu ingen text på denna sida.\nDu kan [[Special:Search/{{PAGENAME}}|söka efter denna sidtitel]] på andra sidor, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} söka i relaterade loggar], eller [{{fullurl:{{FULLPAGENAME}}|action=edit}} redigera denna sida]</span>.",
+       "noarticletext": "Det finns just nu ingen text på denna sida.\nDu kan [[Special:Search/{{PAGENAME}}|söka efter denna sidtitel]] på andra sidor, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} söka i relaterade loggar], eller [{{fullurl:{{FULLPAGENAME}}|action=edit}} skapa denna sida]</span>.",
        "noarticletext-nopermission": "Det finns för tillfället ingen text på denna sida.\nDu kan [[Special:Search/{{PAGENAME}}|söka efter denna sidas titel]] på andra sidor,\neller <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} söka i relaterade loggar]</span> men du har inte behörighet att skapa sidan.",
        "missing-revision": "Revisionen #$1 av sidan med namnet \"{{FULLPAGENAME}}\" finns inte.\n\nDetta orsakas vanligen av efter en gammal historiklänk till en sida som har raderats.\nDetaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" är inte ett registrerat användarkonto. Tänk efter om du vill skapa/redigera den här sidan.",
        "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",
        "recentchanges-label-bot": "Denna redigering gjordes av en bot",
        "recentchanges-label-unpatrolled": "Denna redigering har inte blivit patrullerad ännu",
        "recentchanges-label-plusminus": "Sidans storlek ändrades med detta antal byte",
-       "recentchanges-legend-heading": "'''Teckenförklaring:'''",
+       "recentchanges-legend-heading": "<strong>Teckenförklaring:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se även [[Special:NewPages|listan över nya sidor]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Visa",
        "backend-fail-read": "Kunde inte läsa filen ''$1''.",
        "backend-fail-create": "Kunde inte skapa filen $1.",
        "backend-fail-maxsize": "Kunde inte skapa filen $1 eftersom den är större än {{PLURAL:$2|en byte|$2 bytes}}.",
-       "backend-fail-readonly": "Lagringssystemet \"$1\" är för närvarande skrivskyddad. Den angivna anledningen är: \"$2\"",
+       "backend-fail-readonly": "Lagringssystemet \"$1\" är för närvarande skrivskyddat. Den angivna anledningen var: <em>$2</em>",
        "backend-fail-synced": "Filen \"$1\" är i ett inkonsekvent tillstånd inom de interna lagringssystemen",
        "backend-fail-connect": "Kunde inte ansluta till lagringssystemet \"$1\".",
        "backend-fail-internal": "Ett okänt fel uppstod i lagringssystemet \"$1\".",
        "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",
        "delete-toobig": "Denna sida har en lång redigeringshistorik med mer än $1 {{PLURAL:$1|sidversion|sidversioner}}. Borttagning av sådana sidor har begränsats för att förhindra oavsiktliga driftstörningar på {{SITENAME}}.",
        "delete-warning-toobig": "Denna sida har en lång redigeringshistorik med mer än $1 {{PLURAL:$1|sidversion|sidversioner}}. Att radera sidan kan skapa problem med hanteringen av databasen på {{SITENAME}}; var försiktig.",
        "deleteprotected": "Du kan inte radera denna sida eftersom den är skyddad.",
-       "deleting-backlinks-warning": "'''Varning:'''\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|Andra sidor]] länkar till eller inkluderar sidan som du är på väg att radera.",
+       "deleting-backlinks-warning": "<strong>Varning:</strong>\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|Andra sidor]] länkar till eller inkluderar sidan som du är på väg att radera.",
        "rollback": "Rulla tillbaka ändringar",
        "rollbacklink": "rulla tillbaka",
        "rollbacklinkcount": "rulla tillbaka $1 {{PLURAL:$1|redigering|redigeringar}}",
        "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.",
        "changecontentmodel-nodirectediting": "Innehållsmodellen $1 stöder inte direkt redigering",
        "log-name-contentmodel": "Ändringslogg för innehållsmodellen",
        "log-description-contentmodel": "Händelser som är relaterade till en sidas innehållsmodeller",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|skapade}} sidan $3 med den icke-standardiserade innehållsmodellen \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|ändrade}} innehållsmodellen för sidan $3 från \"$4\" till \"$5\"",
        "logentry-contentmodel-change-revertlink": "återställ",
        "logentry-contentmodel-change-revert": "återställ",
        "tags-edit-revision-legend": "Lägg eller ta bort märken från {{PLURAL:$1|denna sidversion|alla $1 sidversioner}}",
        "tags-edit-logentry-legend": "Lägg till eller ta bort märken från {{PLURAL:$1|denna loggpost|alla $1 loggposter}}",
        "tags-edit-existing-tags": "Befintliga märken:",
-       "tags-edit-existing-tags-none": "''Inga''",
+       "tags-edit-existing-tags-none": "<em>Inga</em>",
        "tags-edit-new-tags": "Nya märken:",
        "tags-edit-add": "Lägg till dessa märken:",
        "tags-edit-remove": "Ta bort dessa märken:",
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..7374523 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 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 bfe89bd..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).",
        "rcshowhidemine": "Benim değişikliklerimi $1",
        "rcshowhidemine-show": "göster",
        "rcshowhidemine-hide": "gizle",
-       "rcshowhidecategorization": "$1 Sayfa kategorizasyonu",
+       "rcshowhidecategorization": "$1 sayfa kategorizasyonu",
        "rcshowhidecategorization-show": "Göster",
        "rcshowhidecategorization-hide": "Gizle",
        "rclinks": "Son $2 günde yapılan son $1 değişikliği göster;<br /> $3",
        "wlshowhideanons": "anonim kullanıcılar",
        "wlshowhidepatr": "incelenmiş değişiklikler",
        "wlshowhidemine": "değişikliklerim",
+       "wlshowhidecategorization": "sayfa kategorizasyonu",
        "watchlist-options": "İzleme listesi seçenekleri",
        "watching": "İzleniyor...",
        "unwatching": "İzlenmiyor...",
index 49be8ce..cd81bf5 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-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": "Сәбәп:",
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 f36eb07..2a58690 100644 (file)
        "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": "Історія сторінки",
        "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.",
        "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|з'явились такі|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..a3805fe 100644 (file)
        "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á.",
        "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-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-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",
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..0f15351 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 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..4b4a024 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": "回退",
        "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:|您}}的设置",
        "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..66010b2 100644 (file)
@@ -68,7 +68,8 @@
                        "范",
                        "Jasonzhuocn",
                        "Bowleerin",
-                       "飞舞回堂前"
+                       "飞舞回堂前",
+                       "Bbslam"
                ]
        },
        "tog-underline": "底線標示連結:",
        "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\" 已建立。",
        "botpasswords-updated-title": "已更新機器人密碼",
-       "botpasswords-updated-body": "機器人密碼 \"$1\" 已修改成功。",
+       "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": "無效的臨時或現有密碼。\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 類型。",
        "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 c6452fb..2b97f7a 100644 (file)
--- a/load.php
+++ b/load.php
 
 use MediaWiki\Logger\LoggerFactory;
 
+// This endpoint is supposed to be independent of request cookies and other
+// details of the session. Log warnings for violations of the no-session
+// constraint.
+define( 'MW_NO_SESSION', 'warn' );
+
 require __DIR__ . '/includes/WebStart.php';
 
 // URL safety checks
@@ -31,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 );
                }
        }
 
index 8651a68..5fab082 100644 (file)
@@ -87,7 +87,7 @@ abstract class Benchmarker extends Maintenance {
                        $ret .= sprintf( "%s times: function %s(%s) :\n",
                                $res['count'],
                                $res['function'],
-                               join( ', ', $res['arguments'] )
+                               implode( ', ', $res['arguments'] )
                        );
                        $ret .= sprintf( "   %6.2fms (%6.2fms each)\n",
                                $res['delta'] * 1000,
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 6bc9a6a..3c679e6 100644 (file)
@@ -53,7 +53,7 @@ class GetConfiguration extends Maintenance {
                $this->addOption( 'regex', 'regex to filter variables with', false, true );
                $this->addOption( 'iregex', 'same as --regex but case insensitive', false, true );
                $this->addOption( 'settings', 'Space-separated list of wg* variables', false, true );
-               $this->addOption( 'format', join( ', ', self::$outFormats ), false, true );
+               $this->addOption( 'format', implode( ', ', self::$outFormats ), false, true );
        }
 
        protected function validateParamsAndArgs() {
index 7e62b89..b2530ce 100644 (file)
@@ -63,6 +63,9 @@ class InitSiteStats extends Maintenance {
                        $this->output( "\nUpdating site statistics..." );
                        $counter->refresh();
                        $this->output( "done.\n" );
+               } else {
+                       $this->output( "\nTo update the site statistics table, run the script "
+                               . "with the --update option.\n" );
                }
 
                if ( $this->hasOption( 'active' ) ) {
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 91d27bb..21a050b 100644 (file)
@@ -19,6 +19,6 @@
     "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>
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 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..d297933 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.2
  * 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-08T21:46:49Z
  */
 ( function ( OO ) {
 
index 5bd560a..8b92d89 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.2
  * 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-08T21:46:53Z
  */
 .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 {
        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..6ff352c 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.2
  * 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-08T21:46:53Z
  */
 .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 {
        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..f587a39 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.2
  * 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-08T21:46:49Z
  */
 ( function ( OO ) {
 
@@ -7020,7 +7020,7 @@ 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
@@ -7705,7 +7705,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:
  *
@@ -8106,8 +8106,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 +8161,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 +8204,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..c2bf522 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.2
  * 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-08T21:46:49Z
  */
 ( function ( OO ) {
 
index f246a93..0ea3006 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.2
  * 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-08T21:46:53Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
index e11849e..90b7f83 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.2
  * 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-08T21:46:53Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
index dfdabc9..6fddd25 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.2
  * 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-08T21:46:49Z
  */
 ( function ( OO ) {
 
index 045f55d..2d60c08 100644 (file)
@@ -1,31 +1,36 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.2
  * 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-08T21:46:53Z
  */
-.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..165a6c2 100644 (file)
@@ -1,31 +1,36 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.2
  * 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-08T21:46:53Z
  */
-.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..04137da 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.2
  * 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-08T21:46:49Z
  */
 ( 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..68659d3 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.2
  * 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-08T21:46:53Z
  */
 .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..e1e5b51 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.2
  * 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-08T21:46:53Z
  */
 .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..dbd50ed 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.1
+ * OOjs UI v0.16.2
  * 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-08T21:46:49Z
  */
 ( 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>
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 );
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 29322f4..a756f22 100644 (file)
 
                // Check if all of the form values are unchanged
                function isPrefsChanged() {
-                       var inputs = $( '#mw-prefs-form :input' ),
+                       var inputs = $( '#mw-prefs-form :input[name]' ),
                                input, $input, inputType,
                                index, optIndex,
                                opt;
                                $input = $( input );
 
                                // Different types of inputs have different methods for accessing defaults
-                               if ( $input.is( 'select' ) ) { // <select> has the property defaultSelected for each option
+                               if ( $input.is( 'select' ) ) {
+                                       // <select> has the property defaultSelected for each option
                                        for ( optIndex = 0; optIndex < input.options.length; optIndex++ ) {
                                                opt = input.options[ optIndex ];
                                                if ( opt.selected !== opt.defaultSelected ) {
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..02528dc 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 ( typeof content === 'string' ) {
+                               // Wikitext
+                               config.text = content;
+                       } else {
+                               // mw.Title
+                               config.page = content.getPrefixedDb();
+                       }
+
+                       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..4aad2ba 100644 (file)
                                var r = $.Deferred();
 
                                pendingRequests.push( function () {
-                                       if ( moduleName && !hasOwn.call( registry, moduleName ) ) {
+                                       if ( moduleName && hasOwn.call( registry, moduleName ) ) {
                                                window.require = mw.loader.require;
                                                window.module = registry[ moduleName ].module;
                                        }
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..b9cf51d 100644 (file)
@@ -134,12 +134,20 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        if ( !self::$dbSetup ) {
                                // switch to a temporary clone of the database
                                self::setupTestDB( $this->db, $this->dbPrefix() );
+                               $this->addCoreDBData();
 
                                if ( ( $this->db->getType() == 'oracle' || !self::$useTemporaryTables ) && self::$reuseDB ) {
                                        $this->resetDB();
                                }
                        }
-                       $this->addCoreDBData();
+
+                       // TODO: the DB setup should be done in setUpBeforeClass(), so the test DB
+                       // is available in subclasse'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;
                }
@@ -151,6 +159,22 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                }
        }
 
+       /**
+        * @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 +439,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
@@ -527,8 +578,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
         */
@@ -675,23 +747,16 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         */
        private function resetDB() {
                if ( $this->db ) {
-                       if ( $this->db->getType() == 'oracle' ) {
-                               if ( self::$useTemporaryTables ) {
-                                       wfGetLB()->closeAll();
-                                       $this->db = wfGetDB( DB_MASTER );
-                               } else {
-                                       foreach ( $this->tablesUsed as $tbl ) {
-                                               if ( $tbl == 'interwiki' ) {
-                                                       continue;
-                                               }
-                                               $this->db->query( 'TRUNCATE TABLE ' . $this->db->tableName( $tbl ), __METHOD__ );
-                                       }
+                       $truncate = in_array( $this->db->getType(), [ 'oracle', 'mysql' ] );
+                       foreach ( $this->tablesUsed as $tbl ) {
+                               // TODO: reset interwiki and user tables to their original content.
+                               if ( $tbl == 'interwiki' || $tbl == 'user' ) {
+                                       continue;
                                }
-                       } else {
-                               foreach ( $this->tablesUsed as $tbl ) {
-                                       if ( $tbl == 'interwiki' || $tbl == 'user' ) {
-                                               continue;
-                                       }
+
+                               if ( $truncate ) {
+                                       $this->db->query( 'TRUNCATE TABLE ' . $this->db->tableName( $tbl ), __METHOD__ );
+                               } else {
                                        $this->db->delete( $tbl, '*', __METHOD__ );
                                }
                        }
@@ -1283,4 +1348,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,
diff --git a/tests/phpunit/includes/WatchedItemIntegrationTest.php b/tests/phpunit/includes/WatchedItemIntegrationTest.php
new file mode 100644 (file)
index 0000000..20fcedb
--- /dev/null
@@ -0,0 +1,123 @@
+<?php
+
+/**
+ * @author Addshore
+ *
+ * @group Database
+ *
+ * @covers WatchedItem
+ */
+class WatchedItemIntegrationTest extends MediaWikiTestCase {
+
+       public function setUp() {
+               parent::setUp();
+               self::$users['WatchedItemIntegrationTestUser']
+                       = new TestUser( 'WatchedItemIntegrationTestUser' );
+       }
+
+       private function getUser() {
+               return self::$users['WatchedItemIntegrationTestUser']->getUser();
+       }
+
+       public function testWatchAndUnWatchItem() {
+               $user = $this->getUser();
+               $title = Title::newFromText( 'WatchedItemIntegrationTestPage' );
+               // Cleanup after previous tests
+               WatchedItem::fromUserTitle( $user, $title )->removeWatch();
+
+               $this->assertFalse(
+                       WatchedItem::fromUserTitle( $user, $title )->isWatched(),
+                       'Page should not initially be watched'
+               );
+               WatchedItem::fromUserTitle( $user, $title )->addWatch();
+               $this->assertTrue(
+                       WatchedItem::fromUserTitle( $user, $title )->isWatched(),
+                       'Page should be watched'
+               );
+               WatchedItem::fromUserTitle( $user, $title )->removeWatch();
+               $this->assertFalse(
+                       WatchedItem::fromUserTitle( $user, $title )->isWatched(),
+                       'Page should be unwatched'
+               );
+       }
+
+       public function testUpdateAndResetNotificationTimestamp() {
+               $user = $this->getUser();
+               $otherUser = ( new TestUser( 'WatchedItemIntegrationTestUser_otherUser' ) )->getUser();
+               $title = Title::newFromText( 'WatchedItemIntegrationTestPage' );
+               WatchedItem::fromUserTitle( $user, $title )->addWatch();
+               $this->assertNull( WatchedItem::fromUserTitle( $user, $title )->getNotificationTimestamp() );
+
+               EmailNotification::updateWatchlistTimestamp( $otherUser, $title, '20150202010101' );
+               $this->assertEquals(
+                       '20150202010101',
+                       WatchedItem::fromUserTitle( $user, $title )->getNotificationTimestamp()
+               );
+
+               WatchedItem::fromUserTitle( $user, $title )->resetNotificationTimestamp();
+               $this->assertNull( WatchedItem::fromUserTitle( $user, $title )->getNotificationTimestamp() );
+       }
+
+       public function testDuplicateAllAssociatedEntries() {
+               $user = $this->getUser();
+               $titleOld = Title::newFromText( 'WatchedItemIntegrationTestPageOld' );
+               $titleNew = Title::newFromText( 'WatchedItemIntegrationTestPageNew' );
+               WatchedItem::fromUserTitle( $user, $titleOld->getSubjectPage() )->addWatch();
+               WatchedItem::fromUserTitle( $user, $titleOld->getTalkPage() )->addWatch();
+               // Cleanup after previous tests
+               WatchedItem::fromUserTitle( $user, $titleNew->getSubjectPage() )->removeWatch();
+               WatchedItem::fromUserTitle( $user, $titleNew->getTalkPage() )->removeWatch();
+
+               WatchedItem::duplicateEntries( $titleOld, $titleNew );
+
+               $this->assertTrue(
+                       WatchedItem::fromUserTitle( $user, $titleOld->getSubjectPage() )->isWatched()
+               );
+               $this->assertTrue(
+                       WatchedItem::fromUserTitle( $user, $titleOld->getTalkPage() )->isWatched()
+               );
+               $this->assertTrue(
+                       WatchedItem::fromUserTitle( $user, $titleNew->getSubjectPage() )->isWatched()
+               );
+               $this->assertTrue(
+                       WatchedItem::fromUserTitle( $user, $titleNew->getTalkPage() )->isWatched()
+               );
+       }
+
+       public function testIsWatched_falseOnNotAllowed() {
+               $user = $this->getUser();
+               $title = Title::newFromText( 'WatchedItemIntegrationTestPage' );
+               WatchedItem::fromUserTitle( $user, $title )->addWatch();
+
+               $this->assertTrue( WatchedItem::fromUserTitle( $user, $title )->isWatched() );
+               $user->mRights = [];
+               $this->assertFalse( WatchedItem::fromUserTitle( $user, $title )->isWatched() );
+       }
+
+       public function testGetNotificationTimestamp_falseOnNotAllowed() {
+               $user = $this->getUser();
+               $title = Title::newFromText( 'WatchedItemIntegrationTestPage' );
+               WatchedItem::fromUserTitle( $user, $title )->addWatch();
+               WatchedItem::fromUserTitle( $user, $title )->resetNotificationTimestamp();
+
+               $this->assertEquals(
+                       null,
+                       WatchedItem::fromUserTitle( $user, $title )->getNotificationTimestamp()
+               );
+               $user->mRights = [];
+               $this->assertFalse( WatchedItem::fromUserTitle( $user, $title )->isWatched() );
+       }
+
+       public function testRemoveWatch_falseOnNotAllowed() {
+               $user = $this->getUser();
+               $title = Title::newFromText( 'WatchedItemIntegrationTestPage' );
+               WatchedItem::fromUserTitle( $user, $title )->addWatch();
+
+               $previousRights = $user->mRights;
+               $user->mRights = [];
+               $this->assertFalse( WatchedItem::fromUserTitle( $user, $title )->removeWatch() );
+               $user->mRights = $previousRights;
+               $this->assertTrue( WatchedItem::fromUserTitle( $user, $title )->removeWatch() );
+       }
+
+}
diff --git a/tests/phpunit/includes/WatchedItemStoreIntegrationTest.php b/tests/phpunit/includes/WatchedItemStoreIntegrationTest.php
new file mode 100644 (file)
index 0000000..9341fb8
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+
+/**
+ * @author Addshore
+ *
+ * @group Database
+ *
+ * @covers WatchedItemStore
+ */
+class WatchedItemStoreIntegrationTest extends MediaWikiTestCase {
+
+       public function setUp() {
+               parent::setUp();
+               self::$users['WatchedItemStoreIntegrationTestUser']
+                       = new TestUser( 'WatchedItemStoreIntegrationTestUser' );
+       }
+
+       private function getUser() {
+               return self::$users['WatchedItemStoreIntegrationTestUser']->getUser();
+       }
+
+       public function testWatchAndUnWatchItem() {
+               $user = $this->getUser();
+               $title = Title::newFromText( 'WatchedItemStoreIntegrationTestPage' );
+               $store = WatchedItemStore::getDefaultInstance();
+               // Cleanup after previous tests
+               $store->removeWatch( $user, $title );
+
+               $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'
+               );
+               $store->removeWatch( $user, $title );
+               $this->assertFalse(
+                       $store->isWatched( $user, $title ),
+                       'Page should be unwatched'
+               );
+       }
+
+       public function testUpdateAndResetNotificationTimestamp() {
+               $user = $this->getUser();
+               $otherUser = ( new TestUser( 'WatchedItemStoreIntegrationTestUser_otherUser' ) )->getUser();
+               $title = Title::newFromText( 'WatchedItemStoreIntegrationTestPage' );
+               $store = WatchedItemStore::getDefaultInstance();
+               $store->addWatch( $user, $title );
+               $this->assertNull( $store->loadWatchedItem( $user, $title )->getNotificationTimestamp() );
+
+               $store->updateNotificationTimestamp( $otherUser, $title, '20150202010101' );
+               $this->assertEquals(
+                       '20150202010101',
+                       $store->loadWatchedItem( $user, $title )->getNotificationTimestamp()
+               );
+
+               $this->assertTrue( $store->resetNotificationTimestamp( $user, $title ) );
+               $this->assertNull( $store->loadWatchedItem( $user, $title )->getNotificationTimestamp() );
+       }
+
+       public function testDuplicateAllAssociatedEntries() {
+               $user = $this->getUser();
+               $titleOld = Title::newFromText( 'WatchedItemStoreIntegrationTestPageOld' );
+               $titleNew = Title::newFromText( 'WatchedItemStoreIntegrationTestPageNew' );
+               $store = WatchedItemStore::getDefaultInstance();
+               $store->addWatch( $user, $titleOld->getSubjectPage() );
+               $store->addWatch( $user, $titleOld->getTalkPage() );
+               // Cleanup after previous tests
+               $store->removeWatch( $user, $titleNew->getSubjectPage() );
+               $store->removeWatch( $user, $titleNew->getTalkPage() );
+
+               $store->duplicateAllAssociatedEntries( $titleOld, $titleNew );
+
+               $this->assertTrue( $store->isWatched( $user, $titleOld->getSubjectPage() ) );
+               $this->assertTrue( $store->isWatched( $user, $titleOld->getTalkPage() ) );
+               $this->assertTrue( $store->isWatched( $user, $titleNew->getSubjectPage() ) );
+               $this->assertTrue( $store->isWatched( $user, $titleNew->getTalkPage() ) );
+       }
+
+}
diff --git a/tests/phpunit/includes/WatchedItemStoreTest.php b/tests/phpunit/includes/WatchedItemStoreTest.php
deleted file mode 100644 (file)
index fc132b0..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-<?php
-
-/**
- * @author Addshore
- *
- * @covers WatchedItemStore
- */
-class WatchedItemStoreTest extends PHPUnit_Framework_TestCase {
-
-       /**
-        * @return PHPUnit_Framework_MockObject_MockObject|IDatabase
-        */
-       private function getMockDb() {
-               return $this->getMock( 'IDatabase' );
-       }
-
-       /**
-        * @return PHPUnit_Framework_MockObject_MockObject|LoadBalancer
-        */
-       private function getMockLoadBalancer( $mockDb ) {
-               $mock = $this->getMockBuilder( 'LoadBalancer' )
-                       ->disableOriginalConstructor()
-                       ->getMock();
-               $mock->expects( $this->any() )
-                       ->method( 'getConnection' )
-                       ->will( $this->returnValue( $mockDb ) );
-               return $mock;
-       }
-
-       private function getFakeRow( $userId, $timestamp ) {
-               $fakeRow = new stdClass();
-               $fakeRow->wl_user = $userId;
-               $fakeRow->wl_notificationtimestamp = $timestamp;
-               return $fakeRow;
-       }
-
-       public function testDuplicateEntry_nothingToDuplicate() {
-               $mockDb = $this->getMockDb();
-               $mockDb->expects( $this->exactly( 1 ) )
-                       ->method( 'select' )
-                       ->will( $this->returnValue( new FakeResultWrapper( [] ) ) );
-
-               $store = new WatchedItemStore( $this->getMockLoadBalancer( $mockDb ) );
-
-               $store->duplicateEntry(
-                       Title::newFromText( 'Old_Title' ),
-                       Title::newFromText( 'New_Title' )
-               );
-       }
-
-       public function testDuplicateEntry_somethingToDuplicate() {
-               $fakeRows = [
-                       $this->getFakeRow( 1, '20151212010101' ),
-                       $this->getFakeRow( 2, null ),
-               ];
-
-               $mockDb = $this->getMockDb();
-               $mockDb->expects( $this->at( 0 ) )
-                       ->method( 'select' )
-                       ->will( $this->returnValue( new FakeResultWrapper( $fakeRows ) ) );
-               $mockDb->expects( $this->at( 1 ) )
-                       ->method( 'replace' )
-                       ->with(
-                               'watchlist',
-                               [ [ 'wl_user', 'wl_namespace', 'wl_title' ] ],
-                               [
-                                       [
-                                               'wl_user' => 1,
-                                               'wl_namespace' => 0,
-                                               'wl_title' => 'New_Title',
-                                               'wl_notificationtimestamp' => '20151212010101',
-                                       ],
-                                       [
-                                               'wl_user' => 2,
-                                               'wl_namespace' => 0,
-                                               'wl_title' => 'New_Title',
-                                               'wl_notificationtimestamp' => null,
-                                       ],
-                               ],
-                               $this->isType( 'string' )
-                       );
-
-               $store = new WatchedItemStore( $this->getMockLoadBalancer( $mockDb ) );
-
-               $store->duplicateEntry(
-                       Title::newFromText( 'Old_Title' ),
-                       Title::newFromText( 'New_Title' )
-               );
-       }
-
-}
diff --git a/tests/phpunit/includes/WatchedItemStoreUnitTest.php b/tests/phpunit/includes/WatchedItemStoreUnitTest.php
new file mode 100644 (file)
index 0000000..709b4b4
--- /dev/null
@@ -0,0 +1,1236 @@
+<?php
+
+/**
+ * @author Addshore
+ *
+ * @covers WatchedItemStore
+ */
+class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
+
+       /**
+        * @return PHPUnit_Framework_MockObject_MockObject|IDatabase
+        */
+       private function getMockDb() {
+               return $this->getMock( IDatabase::class );
+       }
+
+       /**
+        * @return PHPUnit_Framework_MockObject_MockObject|LoadBalancer
+        */
+       private function getMockLoadBalancer( $mockDb ) {
+               $mock = $this->getMockBuilder( LoadBalancer::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $mock->expects( $this->any() )
+                       ->method( 'getConnection' )
+                       ->will( $this->returnValue( $mockDb ) );
+               $mock->expects( $this->any() )
+                       ->method( 'getReadOnlyReason' )
+                       ->will( $this->returnValue( false ) );
+               return $mock;
+       }
+
+       /**
+        * @return PHPUnit_Framework_MockObject_MockObject|BagOStuff
+        */
+       private function getMockCache() {
+               $mock = $this->getMockBuilder( BagOStuff::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $mock->expects( $this->any() )
+                       ->method( 'makeKey' )
+                       ->will( $this->returnCallback( function() {
+                               return implode( ':', func_get_args() );
+                       } ) );
+               return $mock;
+       }
+
+       /**
+        * @param int $id
+        * @return PHPUnit_Framework_MockObject_MockObject|User
+        */
+       private function getMockNonAnonUserWithId( $id ) {
+               $mock = $this->getMock( User::class );
+               $mock->expects( $this->any() )
+                       ->method( 'isAnon' )
+                       ->will( $this->returnValue( false ) );
+               $mock->expects( $this->any() )
+                       ->method( 'getId' )
+                       ->will( $this->returnValue( $id ) );
+               return $mock;
+       }
+
+       /**
+        * @return User
+        */
+       private function getAnonUser() {
+               return User::newFromName( 'Anon_User' );
+       }
+
+       private function getFakeRow( array $rowValues ) {
+               $fakeRow = new stdClass();
+               foreach ( $rowValues as $valueName => $value ) {
+                       $fakeRow->$valueName = $value;
+               }
+               return $fakeRow;
+       }
+
+       public function testGetDefaultInstance() {
+               $instanceOne = WatchedItemStore::getDefaultInstance();
+               $instanceTwo = WatchedItemStore::getDefaultInstance();
+               $this->assertSame( $instanceOne, $instanceTwo );
+       }
+
+       public function testDuplicateEntry_nothingToDuplicate() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'select' )
+                       ->with(
+                               'watchlist',
+                               [
+                                       'wl_user',
+                                       'wl_notificationtimestamp',
+                               ],
+                               [
+                                       'wl_namespace' => 0,
+                                       'wl_title' => 'Old_Title',
+                               ],
+                               'WatchedItemStore::duplicateEntry',
+                               [ 'FOR UPDATE' ]
+                       )
+                       ->will( $this->returnValue( new FakeResultWrapper( [] ) ) );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       new HashBagOStuff( [ 'maxKeys' => 100 ] )
+               );
+
+               $store->duplicateEntry(
+                       Title::newFromText( 'Old_Title' ),
+                       Title::newFromText( 'New_Title' )
+               );
+       }
+
+       public function testDuplicateEntry_somethingToDuplicate() {
+               $fakeRows = [
+                       $this->getFakeRow( [ 'wl_user' => 1, 'wl_notificationtimestamp' => '20151212010101' ] ),
+                       $this->getFakeRow( [ 'wl_user' => 2, 'wl_notificationtimestamp' => null ] ),
+               ];
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->at( 0 ) )
+                       ->method( 'select' )
+                       ->with(
+                               'watchlist',
+                               [
+                                       'wl_user',
+                                       'wl_notificationtimestamp',
+                               ],
+                               [
+                                       'wl_namespace' => 0,
+                                       'wl_title' => 'Old_Title',
+                               ]
+                       )
+                       ->will( $this->returnValue( new FakeResultWrapper( $fakeRows ) ) );
+               $mockDb->expects( $this->at( 1 ) )
+                       ->method( 'replace' )
+                       ->with(
+                               'watchlist',
+                               [ [ 'wl_user', 'wl_namespace', 'wl_title' ] ],
+                               [
+                                       [
+                                               'wl_user' => 1,
+                                               'wl_namespace' => 0,
+                                               'wl_title' => 'New_Title',
+                                               'wl_notificationtimestamp' => '20151212010101',
+                                       ],
+                                       [
+                                               'wl_user' => 2,
+                                               'wl_namespace' => 0,
+                                               'wl_title' => 'New_Title',
+                                               'wl_notificationtimestamp' => null,
+                                       ],
+                               ],
+                               $this->isType( 'string' )
+                       );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       new HashBagOStuff( [ 'maxKeys' => 100 ] )
+               );
+
+               $store->duplicateEntry(
+                       Title::newFromText( 'Old_Title' ),
+                       Title::newFromText( 'New_Title' )
+               );
+       }
+
+       public function testDuplicateAllAssociatedEntries_nothingToDuplicate() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->at( 0 ) )
+                       ->method( 'select' )
+                       ->with(
+                               'watchlist',
+                               [
+                                       'wl_user',
+                                       'wl_notificationtimestamp',
+                               ],
+                               [
+                                       'wl_namespace' => 0,
+                                       'wl_title' => 'Old_Title',
+                               ]
+                       )
+                       ->will( $this->returnValue( new FakeResultWrapper( [] ) ) );
+               $mockDb->expects( $this->at( 1 ) )
+                       ->method( 'select' )
+                       ->with(
+                               'watchlist',
+                               [
+                                       'wl_user',
+                                       'wl_notificationtimestamp',
+                               ],
+                               [
+                                       'wl_namespace' => 1,
+                                       'wl_title' => 'Old_Title',
+                               ]
+                       )
+                       ->will( $this->returnValue( new FakeResultWrapper( [] ) ) );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       new HashBagOStuff( [ 'maxKeys' => 100 ] )
+               );
+
+               $store->duplicateAllAssociatedEntries(
+                       Title::newFromText( 'Old_Title' ),
+                       Title::newFromText( 'New_Title' )
+               );
+       }
+
+       public function testDuplicateAllAssociatedEntries_somethingToDuplicate() {
+               $fakeRows = [
+                       $this->getFakeRow( [ 'wl_user' => 1, 'wl_notificationtimestamp' => '20151212010101' ] ),
+               ];
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->at( 0 ) )
+                       ->method( 'select' )
+                       ->with(
+                               'watchlist',
+                               [
+                                       'wl_user',
+                                       'wl_notificationtimestamp',
+                               ],
+                               [
+                                       'wl_namespace' => 0,
+                                       'wl_title' => 'Old_Title',
+                               ]
+                       )
+                       ->will( $this->returnValue( new FakeResultWrapper( $fakeRows ) ) );
+               $mockDb->expects( $this->at( 1 ) )
+                       ->method( 'replace' )
+                       ->with(
+                               'watchlist',
+                               [ [ 'wl_user', 'wl_namespace', 'wl_title' ] ],
+                               [
+                                       [
+                                               'wl_user' => 1,
+                                               'wl_namespace' => 0,
+                                               'wl_title' => 'New_Title',
+                                               'wl_notificationtimestamp' => '20151212010101',
+                                       ],
+                               ],
+                               $this->isType( 'string' )
+                       );
+               $mockDb->expects( $this->at( 2 ) )
+                       ->method( 'select' )
+                       ->with(
+                               'watchlist',
+                               [
+                                       'wl_user',
+                                       'wl_notificationtimestamp',
+                               ],
+                               [
+                                       'wl_namespace' => 1,
+                                       'wl_title' => 'Old_Title',
+                               ]
+                       )
+                       ->will( $this->returnValue( new FakeResultWrapper( $fakeRows ) ) );
+               $mockDb->expects( $this->at( 3 ) )
+                       ->method( 'replace' )
+                       ->with(
+                               'watchlist',
+                               [ [ 'wl_user', 'wl_namespace', 'wl_title' ] ],
+                               [
+                                       [
+                                               'wl_user' => 1,
+                                               'wl_namespace' => 1,
+                                               'wl_title' => 'New_Title',
+                                               'wl_notificationtimestamp' => '20151212010101',
+                                       ],
+                               ],
+                               $this->isType( 'string' )
+                       );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       new HashBagOStuff( [ 'maxKeys' => 100 ] )
+               );
+
+               $store->duplicateAllAssociatedEntries(
+                       Title::newFromText( 'Old_Title' ),
+                       Title::newFromText( 'New_Title' )
+               );
+       }
+
+       public function testAddWatch_nonAnonymousUser() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'insert' )
+                       ->with(
+                               'watchlist',
+                               [
+                                       [
+                                               'wl_user' => 1,
+                                               'wl_namespace' => 0,
+                                               'wl_title' => 'Some_Page',
+                                               'wl_notificationtimestamp' => null,
+                                       ]
+                               ]
+                       );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->once() )
+                       ->method( 'delete' )
+                       ->with( '0:Some_Page:1' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $store->addWatch(
+                       $this->getMockNonAnonUserWithId( 1 ),
+                       Title::newFromText( 'Some_Page' )
+               );
+       }
+
+       public function testAddWatch_anonymousUser() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->never() )
+                       ->method( 'insert' );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )
+                       ->method( 'delete' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $store->addWatch(
+                       $this->getAnonUser(),
+                       Title::newFromText( 'Some_Page' )
+               );
+       }
+
+       public function testAddWatchBatch_nonAnonymousUser() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'insert' )
+                       ->with(
+                               'watchlist',
+                               [
+                                       [
+                                               'wl_user' => 1,
+                                               'wl_namespace' => 0,
+                                               'wl_title' => 'Some_Page',
+                                               'wl_notificationtimestamp' => null,
+                                       ],
+                                       [
+                                               'wl_user' => 1,
+                                               'wl_namespace' => 1,
+                                               'wl_title' => 'Some_Page',
+                                               'wl_notificationtimestamp' => null,
+                                       ]
+                               ]
+                       );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->exactly( 2 ) )
+                       ->method( 'delete' );
+               $mockCache->expects( $this->at( 1 ) )
+                       ->method( 'delete' )
+                       ->with( '0:Some_Page:1' );
+               $mockCache->expects( $this->at( 3 ) )
+                       ->method( 'delete' )
+                       ->with( '1:Some_Page:1' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $mockUser = $this->getMockNonAnonUserWithId( 1 );
+
+               $this->assertTrue(
+                       $store->addWatchBatch(
+                               [
+                                       [ $mockUser, new TitleValue( 0, 'Some_Page' ) ],
+                                       [ $mockUser, new TitleValue( 1, 'Some_Page' ) ],
+                               ]
+                       )
+               );
+       }
+
+       public function testAddWatchBatch_anonymousUserCombinationsAreSkipped() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'insert' )
+                       ->with(
+                               'watchlist',
+                               [
+                                       [
+                                               'wl_user' => 1,
+                                               'wl_namespace' => 0,
+                                               'wl_title' => 'Some_Page',
+                                               'wl_notificationtimestamp' => null,
+                                       ]
+                               ]
+                       );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->once() )
+                       ->method( 'delete' )
+                       ->with( '0:Some_Page:1' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertTrue(
+                       $store->addWatchBatch(
+                               [
+                                       [ $this->getMockNonAnonUserWithId( 1 ), new TitleValue( 0, 'Some_Page' ) ],
+                                       [ $this->getAnonUser(), new TitleValue( 0, 'Other_Page' ) ],
+                               ]
+                       )
+               );
+       }
+
+       public function testAddWatchBatchReturnsFalse_whenOnlyGivenAnonymousUserCombinations() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->never() )
+                       ->method( 'insert' );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )
+                       ->method( 'delete' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $anonUser = $this->getAnonUser();
+               $this->assertFalse(
+                       $store->addWatchBatch(
+                               [
+                                       [ $anonUser, new TitleValue( 0, 'Some_Page' ) ],
+                                       [ $anonUser, new TitleValue( 1, 'Other_Page' ) ],
+                               ]
+                       )
+               );
+       }
+
+       public function testAddWatchBatchReturnsFalse_whenGivenEmptyList() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->never() )
+                       ->method( 'insert' );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )
+                       ->method( 'delete' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertFalse(
+                       $store->addWatchBatch( [] )
+               );
+       }
+
+       public function testLoadWatchedItem_existingItem() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'selectRow' )
+                       ->with(
+                               'watchlist',
+                               'wl_notificationtimestamp',
+                               [
+                                       'wl_user' => 1,
+                                       'wl_namespace' => 0,
+                                       'wl_title' => 'SomeDbKey',
+                               ]
+                       )
+                       ->will( $this->returnValue(
+                               $this->getFakeRow( [ 'wl_notificationtimestamp' => '20151212010101' ] )
+                       ) );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->once() )
+                       ->method( 'set' )
+                       ->with(
+                               '0:SomeDbKey:1'
+                       );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $watchedItem = $store->loadWatchedItem(
+                       $this->getMockNonAnonUserWithId( 1 ),
+                       new TitleValue( 0, 'SomeDbKey' )
+               );
+               $this->assertInstanceOf( 'WatchedItem', $watchedItem );
+               $this->assertEquals( 1, $watchedItem->getUser()->getId() );
+               $this->assertEquals( 'SomeDbKey', $watchedItem->getLinkTarget()->getDBkey() );
+               $this->assertEquals( 0, $watchedItem->getLinkTarget()->getNamespace() );
+       }
+
+       public function testLoadWatchedItem_noItem() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'selectRow' )
+                       ->with(
+                               'watchlist',
+                               'wl_notificationtimestamp',
+                               [
+                                       'wl_user' => 1,
+                                       'wl_namespace' => 0,
+                                       'wl_title' => 'SomeDbKey',
+                               ]
+                       )
+                       ->will( $this->returnValue( [] ) );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )
+                       ->method( 'delete' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertFalse(
+                       $store->loadWatchedItem(
+                               $this->getMockNonAnonUserWithId( 1 ),
+                               new TitleValue( 0, 'SomeDbKey' )
+                       )
+               );
+       }
+
+       public function testLoadWatchedItem_anonymousUser() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->never() )
+                       ->method( 'selectRow' );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )
+                       ->method( 'delete' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertFalse(
+                       $store->loadWatchedItem(
+                               $this->getAnonUser(),
+                               new TitleValue( 0, 'SomeDbKey' )
+                       )
+               );
+       }
+
+       public function testRemoveWatch_existingItem() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'delete' )
+                       ->with(
+                               'watchlist',
+                               [
+                                       'wl_user' => 1,
+                                       'wl_namespace' => 0,
+                                       'wl_title' => 'SomeDbKey',
+                               ]
+                       );
+               $mockDb->expects( $this->once() )
+                       ->method( 'affectedRows' )
+                       ->will( $this->returnValue( 1 ) );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->once() )
+                       ->method( 'delete' )
+                       ->with( '0:SomeDbKey:1' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertTrue(
+                       $store->removeWatch(
+                               $this->getMockNonAnonUserWithId( 1 ),
+                               new TitleValue( 0, 'SomeDbKey' )
+                       )
+               );
+       }
+
+       public function testRemoveWatch_noItem() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'delete' )
+                       ->with(
+                               'watchlist',
+                               [
+                                       'wl_user' => 1,
+                                       'wl_namespace' => 0,
+                                       'wl_title' => 'SomeDbKey',
+                               ]
+                       );
+               $mockDb->expects( $this->once() )
+                       ->method( 'affectedRows' )
+                       ->will( $this->returnValue( 0 ) );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->once() )
+                       ->method( 'delete' )
+                       ->with( '0:SomeDbKey:1' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertFalse(
+                       $store->removeWatch(
+                               $this->getMockNonAnonUserWithId( 1 ),
+                               new TitleValue( 0, 'SomeDbKey' )
+                       )
+               );
+       }
+
+       public function testRemoveWatch_anonymousUser() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->never() )
+                       ->method( 'delete' );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )
+                       ->method( 'delete' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertFalse(
+                       $store->removeWatch(
+                               $this->getAnonUser(),
+                               new TitleValue( 0, 'SomeDbKey' )
+                       )
+               );
+       }
+
+       public function testGetWatchedItem_existingItem() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'selectRow' )
+                       ->with(
+                               'watchlist',
+                               'wl_notificationtimestamp',
+                               [
+                                       'wl_user' => 1,
+                                       'wl_namespace' => 0,
+                                       'wl_title' => 'SomeDbKey',
+                               ]
+                       )
+                       ->will( $this->returnValue(
+                               $this->getFakeRow( [ 'wl_notificationtimestamp' => '20151212010101' ] )
+                       ) );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->once() )
+                       ->method( 'get' )
+                       ->with(
+                               '0:SomeDbKey:1'
+                       )
+                       ->will( $this->returnValue( null ) );
+               $mockCache->expects( $this->once() )
+                       ->method( 'set' )
+                       ->with(
+                               '0:SomeDbKey:1'
+                       );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $watchedItem = $store->getWatchedItem(
+                       $this->getMockNonAnonUserWithId( 1 ),
+                       new TitleValue( 0, 'SomeDbKey' )
+               );
+               $this->assertInstanceOf( 'WatchedItem', $watchedItem );
+               $this->assertEquals( 1, $watchedItem->getUser()->getId() );
+               $this->assertEquals( 'SomeDbKey', $watchedItem->getLinkTarget()->getDBkey() );
+               $this->assertEquals( 0, $watchedItem->getLinkTarget()->getNamespace() );
+       }
+
+       public function testGetWatchedItem_cachedItem() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->never() )
+                       ->method( 'selectRow' );
+
+               $mockUser = $this->getMockNonAnonUserWithId( 1 );
+               $linkTarget = new TitleValue( 0, 'SomeDbKey' );
+               $cachedItem = new WatchedItem( $mockUser, $linkTarget, '20151212010101' );
+
+               $mockCache = $this->getMockCache();
+               $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 ),
+                       $mockCache
+               );
+
+               $this->assertEquals(
+                       $cachedItem,
+                       $store->getWatchedItem(
+                               $mockUser,
+                               $linkTarget
+                       )
+               );
+       }
+
+       public function testGetWatchedItem_noItem() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'selectRow' )
+                       ->with(
+                               'watchlist',
+                               'wl_notificationtimestamp',
+                               [
+                                       'wl_user' => 1,
+                                       'wl_namespace' => 0,
+                                       'wl_title' => 'SomeDbKey',
+                               ]
+                       )
+                       ->will( $this->returnValue( [] ) );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )
+                       ->method( 'set' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertFalse(
+                       $store->getWatchedItem(
+                               $this->getMockNonAnonUserWithId( 1 ),
+                               new TitleValue( 0, 'SomeDbKey' )
+                       )
+               );
+       }
+
+       public function testGetWatchedItem_anonymousUser() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->never() )
+                       ->method( 'selectRow' );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )
+                       ->method( 'set' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertFalse(
+                       $store->getWatchedItem(
+                               $this->getAnonUser(),
+                               new TitleValue( 0, 'SomeDbKey' )
+                       )
+               );
+       }
+
+       public function testIsWatchedItem_existingItem() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'selectRow' )
+                       ->with(
+                               'watchlist',
+                               'wl_notificationtimestamp',
+                               [
+                                       'wl_user' => 1,
+                                       'wl_namespace' => 0,
+                                       'wl_title' => 'SomeDbKey',
+                               ]
+                       )
+                       ->will( $this->returnValue(
+                               $this->getFakeRow( [ 'wl_notificationtimestamp' => '20151212010101' ] )
+                       ) );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->once() )
+                       ->method( 'set' )
+                       ->with(
+                               '0:SomeDbKey:1'
+                       );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertTrue(
+                       $store->isWatched(
+                               $this->getMockNonAnonUserWithId( 1 ),
+                               new TitleValue( 0, 'SomeDbKey' )
+                       )
+               );
+       }
+
+       public function testIsWatchedItem_noItem() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'selectRow' )
+                       ->with(
+                               'watchlist',
+                               'wl_notificationtimestamp',
+                               [
+                                       'wl_user' => 1,
+                                       'wl_namespace' => 0,
+                                       'wl_title' => 'SomeDbKey',
+                               ]
+                       )
+                       ->will( $this->returnValue( [] ) );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )
+                       ->method( 'set' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertFalse(
+                       $store->isWatched(
+                               $this->getMockNonAnonUserWithId( 1 ),
+                               new TitleValue( 0, 'SomeDbKey' )
+                       )
+               );
+       }
+
+       public function testIsWatchedItem_anonymousUser() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->never() )
+                       ->method( 'selectRow' );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )
+                       ->method( 'set' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertFalse(
+                       $store->isWatched(
+                               $this->getAnonUser(),
+                               new TitleValue( 0, 'SomeDbKey' )
+                       )
+               );
+       }
+
+       public function testResetNotificationTimestamp_anonymousUser() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->never() )
+                       ->method( 'selectRow' );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )
+                       ->method( 'set' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertFalse(
+                       $store->resetNotificationTimestamp(
+                               $this->getAnonUser(),
+                               Title::newFromText( 'SomeDbKey' )
+                       )
+               );
+       }
+
+       public function testResetNotificationTimestamp_noItem() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'selectRow' )
+                       ->with(
+                               'watchlist',
+                               'wl_notificationtimestamp',
+                               [
+                                       'wl_user' => 1,
+                                       'wl_namespace' => 0,
+                                       'wl_title' => 'SomeDbKey',
+                               ]
+                       )
+                       ->will( $this->returnValue( [] ) );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->never() )
+                       ->method( 'set' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               $this->assertFalse(
+                       $store->resetNotificationTimestamp(
+                               $this->getMockNonAnonUserWithId( 1 ),
+                               Title::newFromText( 'SomeDbKey' )
+                       )
+               );
+       }
+
+       public function testResetNotificationTimestamp_item() {
+               $user = $this->getMockNonAnonUserWithId( 1 );
+               $title = Title::newFromText( 'SomeDbKey' );
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'selectRow' )
+                       ->with(
+                               'watchlist',
+                               'wl_notificationtimestamp',
+                               [
+                                       'wl_user' => 1,
+                                       'wl_namespace' => 0,
+                                       'wl_title' => 'SomeDbKey',
+                               ]
+                       )
+                       ->will( $this->returnValue(
+                               $this->getFakeRow( [ 'wl_notificationtimestamp' => '20151212010101' ] )
+                       ) );
+
+               $mockCache = $this->getMockCache();
+               $mockCache->expects( $this->once() )
+                       ->method( 'set' )
+                       ->with(
+                               '0:SomeDbKey:1',
+                               $this->isInstanceOf( WatchedItem::class )
+                       );
+               $mockCache->expects( $this->once() )
+                       ->method( 'delete' )
+                       ->with( '0:SomeDbKey:1' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               // Note: This does not actually assert the job is correct
+               $callableCallCounter = 0;
+               $mockCallback = function( $callable ) use ( &$callableCallCounter ) {
+                       $callableCallCounter++;
+                       $this->assertInternalType( 'callable', $callable );
+               };
+               $store->overrideDeferredUpdatesAddCallableUpdateCallback( $mockCallback );
+
+               $this->assertTrue(
+                       $store->resetNotificationTimestamp(
+                               $user,
+                               $title
+                       )
+               );
+               $this->assertEquals( 1, $callableCallCounter );
+       }
+
+       public function testResetNotificationTimestamp_noItemForced() {
+               $user = $this->getMockNonAnonUserWithId( 1 );
+               $title = Title::newFromText( 'SomeDbKey' );
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->never() )
+                       ->method( 'selectRow' );
+
+               $mockCache = $this->getMockCache();
+               $mockDb->expects( $this->never() )
+                       ->method( 'set' );
+               $mockDb->expects( $this->never() )
+                       ->method( 'delete' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               // Note: This does not actually assert the job is correct
+               $callableCallCounter = 0;
+               $mockCallback = function( $callable ) use ( &$callableCallCounter ) {
+                       $callableCallCounter++;
+                       $this->assertInternalType( 'callable', $callable );
+               };
+               $store->overrideDeferredUpdatesAddCallableUpdateCallback( $mockCallback );
+
+               $this->assertTrue(
+                       $store->resetNotificationTimestamp(
+                               $user,
+                               $title,
+                               'force'
+                       )
+               );
+               $this->assertEquals( 1, $callableCallCounter );
+       }
+
+       /**
+        * @param $text
+        * @param int $ns
+        *
+        * @return PHPUnit_Framework_MockObject_MockObject|Title
+        */
+       private function getMockTitle( $text, $ns = 0 ) {
+               $title = $this->getMock( Title::class );
+               $title->expects( $this->any() )
+                       ->method( 'getText' )
+                       ->will( $this->returnValue( str_replace( '_', ' ', $text ) ) );
+               $title->expects( $this->any() )
+                       ->method( 'getDbKey' )
+                       ->will( $this->returnValue( str_replace( '_', ' ', $text ) ) );
+               $title->expects( $this->any() )
+                       ->method( 'getNamespace' )
+                       ->will( $this->returnValue( $ns ) );
+               return $title;
+       }
+
+       public function testResetNotificationTimestamp_oldidSpecifiedLatestRevisionForced() {
+               $user = $this->getMockNonAnonUserWithId( 1 );
+               $oldid = 22;
+               $title = $this->getMockTitle( 'SomeTitle' );
+               $title->expects( $this->once() )
+                       ->method( 'getNextRevisionID' )
+                       ->with( $oldid )
+                       ->will( $this->returnValue( false ) );
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->never() )
+                       ->method( 'selectRow' );
+
+               $mockCache = $this->getMockCache();
+               $mockDb->expects( $this->never() )
+                       ->method( 'set' );
+               $mockDb->expects( $this->never() )
+                       ->method( 'delete' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               // Note: This does not actually assert the job is correct
+               $callableCallCounter = 0;
+               $store->overrideDeferredUpdatesAddCallableUpdateCallback(
+                       function( $callable ) use ( &$callableCallCounter ) {
+                               $callableCallCounter++;
+                               $this->assertInternalType( 'callable', $callable );
+                       }
+               );
+
+               $this->assertTrue(
+                       $store->resetNotificationTimestamp(
+                               $user,
+                               $title,
+                               'force',
+                               $oldid
+                       )
+               );
+               $this->assertEquals( 1, $callableCallCounter );
+       }
+
+       public function testResetNotificationTimestamp_oldidSpecifiedNotLatestRevisionForced() {
+               $user = $this->getMockNonAnonUserWithId( 1 );
+               $oldid = 22;
+               $title = $this->getMockTitle( 'SomeDbKey' );
+               $title->expects( $this->once() )
+                       ->method( 'getNextRevisionID' )
+                       ->with( $oldid )
+                       ->will( $this->returnValue( 33 ) );
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'selectRow' )
+                       ->with(
+                               'watchlist',
+                               'wl_notificationtimestamp',
+                               [
+                                       'wl_user' => 1,
+                                       'wl_namespace' => 0,
+                                       'wl_title' => 'SomeDbKey',
+                               ]
+                       )
+                       ->will( $this->returnValue(
+                               $this->getFakeRow( [ 'wl_notificationtimestamp' => '20151212010101' ] )
+                       ) );
+
+               $mockCache = $this->getMockCache();
+               $mockDb->expects( $this->never() )
+                       ->method( 'set' );
+               $mockDb->expects( $this->never() )
+                       ->method( 'delete' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $mockCache
+               );
+
+               // Note: This does not actually assert the job is correct
+               $addUpdateCallCounter = 0;
+               $store->overrideDeferredUpdatesAddCallableUpdateCallback(
+                       function( $callable ) use ( &$addUpdateCallCounter ) {
+                               $addUpdateCallCounter++;
+                               $this->assertInternalType( 'callable', $callable );
+                       }
+               );
+
+               $getTimestampCallCounter = 0;
+               $store->overrideRevisionGetTimestampFromIdCallback(
+                       function( $titleParam, $oldidParam ) use ( &$getTimestampCallCounter, $title, $oldid ) {
+                               $getTimestampCallCounter++;
+                               $this->assertEquals( $title, $titleParam );
+                               $this->assertEquals( $oldid, $oldidParam );
+                       }
+               );
+
+               $this->assertTrue(
+                       $store->resetNotificationTimestamp(
+                               $user,
+                               $title,
+                               'force',
+                               $oldid
+                       )
+               );
+               $this->assertEquals( 1, $addUpdateCallCounter );
+               $this->assertEquals( 1, $getTimestampCallCounter );
+       }
+
+       public function testUpdateNotificationTimestamp_watchersExist() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'select' )
+                       ->with(
+                               [ 'watchlist' ],
+                               [ 'wl_user' ],
+                               [
+                                       'wl_user != 1',
+                                       'wl_namespace' => 0,
+                                       'wl_title' => 'SomeDbKey',
+                                       'wl_notificationtimestamp IS NULL'
+                               ]
+                       )
+                       ->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' )
+                       ->with(
+                               'watchlist',
+                               [ 'wl_notificationtimestamp' => null ],
+                               [
+                                       'wl_user' => [ 2, 3 ],
+                                       'wl_namespace' => 0,
+                                       'wl_title' => 'SomeDbKey',
+                               ]
+                       );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       new HashBagOStuff( [ 'maxKeys' => 100 ] )
+               );
+
+               $this->assertEquals(
+                       [ 2, 3 ],
+                       $store->updateNotificationTimestamp(
+                               $this->getMockNonAnonUserWithId( 1 ),
+                               new TitleValue( 0, 'SomeDbKey' ),
+                               '20151212010101'
+                       )
+               );
+       }
+
+       public function testUpdateNotificationTimestamp_noWatchers() {
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'select' )
+                       ->with(
+                               [ 'watchlist' ],
+                               [ 'wl_user' ],
+                               [
+                                       'wl_user != 1',
+                                       'wl_namespace' => 0,
+                                       'wl_title' => 'SomeDbKey',
+                                       'wl_notificationtimestamp IS NULL'
+                               ]
+                       )
+                       ->will(
+                               $this->returnValue( [] )
+                       );
+               $mockDb->expects( $this->never() )
+                       ->method( 'onTransactionIdle' );
+               $mockDb->expects( $this->never() )
+                       ->method( 'update' );
+
+               $store = new WatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       new HashBagOStuff( [ 'maxKeys' => 100 ] )
+               );
+
+               $watchers = $store->updateNotificationTimestamp(
+                       $this->getMockNonAnonUserWithId( 1 ),
+                       new TitleValue( 0, 'SomeDbKey' ),
+                       '20151212010101'
+               );
+               $this->assertInternalType( 'array', $watchers );
+               $this->assertEmpty( $watchers );
+       }
+
+}
diff --git a/tests/phpunit/includes/WatchedItemUnitTest.php b/tests/phpunit/includes/WatchedItemUnitTest.php
new file mode 100644 (file)
index 0000000..bc37311
--- /dev/null
@@ -0,0 +1,183 @@
+<?php
+
+/**
+ * @author Addshore
+ *
+ * @covers WatchedItem
+ */
+class WatchedItemUnitTest extends PHPUnit_Framework_TestCase {
+
+       public function provideUserTitleTimestamp() {
+               return [
+                       [ User::newFromId( 111 ), Title::newFromText( 'SomeTitle' ), null ],
+                       [ User::newFromId( 111 ), Title::newFromText( 'SomeTitle' ), '20150101010101' ],
+                       [ User::newFromId( 111 ), new TitleValue( 0, 'TVTitle', 'frag' ), '20150101010101' ],
+               ];
+       }
+
+       /**
+        * @return PHPUnit_Framework_MockObject_MockObject|WatchedItemStore
+        */
+       private function getMockWatchedItemStore() {
+               return $this->getMockBuilder( WatchedItemStore::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+       }
+
+       /**
+        * @dataProvider provideUserTitleTimestamp
+        */
+       public function testConstruction( $user, LinkTarget $linkTarget, $notifTimestamp ) {
+               $item = new WatchedItem( $user, $linkTarget, $notifTimestamp );
+
+               $this->assertSame( $user, $item->getUser() );
+               $this->assertSame( $linkTarget, $item->getLinkTarget() );
+               $this->assertSame( $notifTimestamp, $item->getNotificationTimestamp() );
+
+               // The below tests the internal WatchedItem::getTitle method
+               $this->assertInstanceOf( 'Title', $item->getTitle() );
+               $this->assertSame( $linkTarget->getDBkey(), $item->getTitle()->getDBkey() );
+               $this->assertSame( $linkTarget->getFragment(), $item->getTitle()->getFragment() );
+               $this->assertSame( $linkTarget->getNamespace(), $item->getTitle()->getNamespace() );
+               $this->assertSame( $linkTarget->getText(), $item->getTitle()->getText() );
+       }
+
+       /**
+        * @dataProvider provideUserTitleTimestamp
+        */
+       public function testFromUserTitle( $user, $linkTarget, $timestamp ) {
+               $store = $this->getMockWatchedItemStore();
+               $store->expects( $this->once() )
+                       ->method( 'loadWatchedItem' )
+                       ->with( $user, $linkTarget )
+                       ->will( $this->returnValue( new WatchedItem( $user, $linkTarget, $timestamp ) ) );
+               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() );
+       }
+
+       /**
+        * @dataProvider provideUserTitleTimestamp
+        */
+       public function testResetNotificationTimestamp( $user, $linkTarget, $timestamp ) {
+               $force = 'XXX';
+               $oldid = 999;
+
+               $store = $this->getMockWatchedItemStore();
+               $store->expects( $this->once() )
+                       ->method( 'resetNotificationTimestamp' )
+                       ->with( $user, $this->isInstanceOf( Title::class ), $force, $oldid )
+                       ->will( $this->returnCallback(
+                               function ( $user, Title $title, $force, $oldid ) use ( $linkTarget ) {
+                                       /** @var LinkTarget $linkTarget */
+                                       $this->assertInstanceOf( 'Title', $title );
+                                       $this->assertSame( $linkTarget->getDBkey(), $title->getDBkey() );
+                                       $this->assertSame( $linkTarget->getFragment(), $title->getFragment() );
+                                       $this->assertSame( $linkTarget->getNamespace(), $title->getNamespace() );
+                                       $this->assertSame( $linkTarget->getText(), $title->getText() );
+
+                                       return true;
+                               }
+                       ) );
+               WatchedItemStore::overrideDefaultInstance( $store );
+
+               $item = new WatchedItem( $user, $linkTarget, $timestamp );
+               $item->resetNotificationTimestamp( $force, $oldid );
+       }
+
+       public function testAddWatch() {
+               $title = Title::newFromText( 'SomeTitle' );
+               $timestamp = null;
+               $checkRights = 0;
+
+               /** @var User|PHPUnit_Framework_MockObject_MockObject $user */
+               $user = $this->getMock( User::class );
+               $user->expects( $this->once() )
+                       ->method( 'addWatch' )
+                       ->with( $title, $checkRights );
+
+               $item = new WatchedItem( $user, $title, $timestamp, $checkRights );
+               $this->assertTrue( $item->addWatch() );
+       }
+
+       public function testRemoveWatch() {
+               $title = Title::newFromText( 'SomeTitle' );
+               $timestamp = null;
+               $checkRights = 0;
+
+               /** @var User|PHPUnit_Framework_MockObject_MockObject $user */
+               $user = $this->getMock( User::class );
+               $user->expects( $this->once() )
+                       ->method( 'removeWatch' )
+                       ->with( $title, $checkRights );
+
+               $item = new WatchedItem( $user, $title, $timestamp, $checkRights );
+               $this->assertTrue( $item->removeWatch() );
+       }
+
+       public function provideBooleans() {
+               return [
+                       [ true ],
+                       [ false ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideBooleans
+        */
+       public function testIsWatched( $returnValue ) {
+               $title = Title::newFromText( 'SomeTitle' );
+               $timestamp = null;
+               $checkRights = 0;
+
+               /** @var User|PHPUnit_Framework_MockObject_MockObject $user */
+               $user = $this->getMock( User::class );
+               $user->expects( $this->once() )
+                       ->method( 'isWatched' )
+                       ->with( $title, $checkRights )
+                       ->will( $this->returnValue( $returnValue ) );
+
+               $item = new WatchedItem( $user, $title, $timestamp, $checkRights );
+               $this->assertEquals( $returnValue, $item->isWatched() );
+       }
+
+       public function testDuplicateEntries() {
+               $oldTitle = Title::newFromText( 'OldTitle' );
+               $newTitle = Title::newFromText( 'NewTitle' );
+
+               $store = $this->getMockWatchedItemStore();
+               $store->expects( $this->once() )
+                       ->method( 'duplicateAllAssociatedEntries' )
+                       ->with( $oldTitle, $newTitle );
+               WatchedItemStore::overrideDefaultInstance( $store );
+
+               WatchedItem::duplicateEntries( $oldTitle, $newTitle );
+       }
+
+       public function testBatchAddWatch() {
+               /** @var WatchedItem[] $items */
+               $items = [
+                       new WatchedItem( User::newFromId( 1 ), new TitleValue( 0, 'Title1' ), null ),
+                       new WatchedItem( User::newFromId( 3 ), Title::newFromText( 'Title2' ), '20150101010101' ),
+               ];
+
+               $userTargetCombinations = [];
+               foreach ( $items as $item ) {
+                       $userTargetCombinations[] = [ $item->getUser(), $item->getTitle()->getSubjectPage() ];
+                       $userTargetCombinations[] = [ $item->getUser(), $item->getTitle()->getTalkPage() ];
+               }
+
+               $store = $this->getMockWatchedItemStore();
+               $store->expects( $this->once() )
+                       ->method( 'addWatchBatch' )
+                       ->with( $userTargetCombinations );
+               WatchedItemStore::overrideDefaultInstance( $store );
+
+               WatchedItem::batchAddWatch( $items );
+       }
+
+}
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 62e175b..78cb7fb 100644 (file)
@@ -230,7 +230,7 @@ class RandomImageGenerator {
                        $points[] = $point['x'] . ',' . $point['y'];
                }
 
-               return join( " ", $points );
+               return implode( " ", $points );
        }
 
        /**
@@ -425,7 +425,7 @@ class RandomImageGenerator {
                        $components[] = mt_rand( 0, 255 );
                }
 
-               return 'rgb(' . join( ', ', $components ) . ')';
+               return 'rgb(' . implode( ', ', $components ) . ')';
        }
 
        /**
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 193034f..5746a61 100644 (file)
@@ -29,8 +29,8 @@ class OldChangesListTest extends MediaWikiLangTestCase {
 
                $this->setMwGlobals( [
                        'wgArticlePath' => '/wiki/$1',
-                       'wgLang' => Language::factory( 'qqx' )
                ] );
+               $this->setUserLang( 'qqx' );
        }
 
        /**
@@ -108,13 +108,13 @@ class OldChangesListTest extends MediaWikiLangTestCase {
                $line = $oldChangesList->recentChangesLine( $recentChange, false, 1 );
 
                $this->assertContains(
-                       "<abbr class='newpage' title='(recentchanges-label-newpage)'>(newpageletter)</abbr>",
+                       '<abbr class="newpage" title="(recentchanges-label-newpage)">(newpageletter)</abbr>',
                        $line,
                        'new page flag'
                );
 
                $this->assertContains(
-                       "<abbr class='botedit' title='(recentchanges-label-bot)'>(boteditletter)</abbr>",
+                       '<abbr class="botedit" title="(recentchanges-label-bot)">(boteditletter)</abbr>',
                        $line,
                        'bot flag'
                );
@@ -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 8e8002c..168b2c6 100644 (file)
@@ -247,14 +247,64 @@ class DatabaseMysqlBaseTest extends MediaWikiTestCase {
                ];
        }
 
-       function testMasterPos() {
-               $pos1 = new MySQLMasterPos( 'db1034-bin.000976', '843431247' );
-               $pos2 = new MySQLMasterPos( 'db1034-bin.000976', '843431248' );
-
-               $this->assertTrue( $pos1->hasReached( $pos1 ) );
-               $this->assertTrue( $pos2->hasReached( $pos2 ) );
-               $this->assertTrue( $pos2->hasReached( $pos1 ) );
-               $this->assertFalse( $pos1->hasReached( $pos2 ) );
+       /**
+        * @dataProvider provideComparePositions
+        */
+       function testHasReached( MySQLMasterPos $lowerPos, MySQLMasterPos $higherPos ) {
+               $this->assertTrue( $higherPos->hasReached( $lowerPos ) );
+               $this->assertTrue( $higherPos->hasReached( $higherPos ) );
+               $this->assertTrue( $lowerPos->hasReached( $lowerPos ) );
+               $this->assertFalse( $lowerPos->hasReached( $higherPos ) );
+       }
+
+       function provideComparePositions() {
+               return [
+                       [
+                               new MySQLMasterPos( 'db1034-bin.000976', '843431247' ),
+                               new MySQLMasterPos( 'db1034-bin.000976', '843431248' )
+                       ],
+                       [
+                               new MySQLMasterPos( 'db1034-bin.000976', '999' ),
+                               new MySQLMasterPos( 'db1034-bin.000976', '1000' )
+                       ],
+                       [
+                               new MySQLMasterPos( 'db1034-bin.000976', '999' ),
+                               new MySQLMasterPos( 'db1035-bin.000976', '1000' )
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideChannelPositions
+        */
+       function testChannelsMatch( MySQLMasterPos $pos1, MySQLMasterPos $pos2, $matches ) {
+               $this->assertEquals( $matches, $pos1->channelsMatch( $pos2 ) );
+               $this->assertEquals( $matches, $pos2->channelsMatch( $pos1 ) );
+       }
+
+       function provideChannelPositions() {
+               return [
+                       [
+                               new MySQLMasterPos( 'db1034-bin.000876', '44' ),
+                               new MySQLMasterPos( 'db1034-bin.000976', '74' ),
+                               true
+                       ],
+                       [
+                               new MySQLMasterPos( 'db1052-bin.000976', '999' ),
+                               new MySQLMasterPos( 'db1052-bin.000976', '1000' ),
+                               true
+                       ],
+                       [
+                               new MySQLMasterPos( 'db1066-bin.000976', '9999' ),
+                               new MySQLMasterPos( 'db1035-bin.000976', '10000' ),
+                               false
+                       ],
+                       [
+                               new MySQLMasterPos( 'db1066-bin.000976', '9999' ),
+                               new MySQLMasterPos( 'trump2016.000976', '10000' ),
+                               false
+                       ],
+               ];
        }
 
        /**
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 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 519c8c3..6eb96b1 100644 (file)
@@ -4,7 +4,7 @@
  * in an instance property rather than APC.
  */
 class ArrayBackedMemoizedCallable extends MemoizedCallable {
-       public $cache = [];
+       private $cache = [];
 
        protected function fetchResult( $key, &$success ) {
                if ( array_key_exists( $key, $this->cache ) ) {
@@ -112,6 +112,11 @@ class MemoizedCallableTest extends PHPUnit_Framework_TestCase {
                        $this->readAttribute( $a, 'callableName' ),
                        $this->readAttribute( $b, 'callableName' )
                );
+
+               $c = new ArrayBackedMemoizedCallable( function () {
+                       return rand();
+               } );
+               $this->assertEquals( $c->invokeArgs(), $c->invokeArgs(), 'memoized random' );
        }
 
        /**
index b50fe80..dfa92f1 100644 (file)
@@ -137,5 +137,5 @@ class WebPHandlerTest extends MediaWikiTestCase {
 }
 
 /* Python code to extract a header and convert to PHP format:
- * print '"%s"' % ''.join( '\\x%02X' % ord(c) for c in urllib.urlopen(url).read(36) )
+ * print '"%s"' % ''.implode( '\\x%02X' % ord(c) for c in urllib.urlopen(url).read(36) )
  */
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 998d2bb..534cf9b 100644 (file)
@@ -171,7 +171,7 @@ class SpecialPageFactoryTest extends MediaWikiTestCase {
                $gotWarnings = count( $warnings );
                if ( $gotWarnings !== $expectWarnings ) {
                        $this->fail( "Expected $expectWarnings warning(s), but got $gotWarnings:\n" .
-                               join( "\n", $warnings )
+                               implode( "\n", $warnings )
                        );
                }
        }
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 b9cb6c1..542420a 100644 (file)
@@ -153,7 +153,7 @@ class ApiDocumentationTest extends MediaWikiTestCase {
                                foreach ( $globals as $k => $v ) {
                                        $g[] = "$k=" . var_export( $v, 1 );
                                }
-                               $k = "Module $path with " . join( ', ', $g );
+                               $k = "Module $path with " . implode( ', ', $g );
                                $ret[$k] = [ $path, $globals ];
                        }
                }
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' ) );
                }
        }
diff --git a/tests/qunit/data/defineCallMwLoaderTestCallback.js b/tests/qunit/data/defineCallMwLoaderTestCallback.js
new file mode 100644 (file)
index 0000000..afd886c
--- /dev/null
@@ -0,0 +1 @@
+module.exports = 'Define worked.';
index 456787c..5a96dc3 100644 (file)
@@ -110,7 +110,7 @@ class GenerateJqueryMsgData extends Maintenance {
                                        $langKey = $languageCode . '_' . $key;
                                        $messages[$langKey] = $template;
                                        $tests[] = [
-                                               'name' => $languageCode . ' ' . $key . ' ' . join( ',', $args ),
+                                               'name' => $languageCode . ' ' . $key . ' ' . implode( ',', $args ),
                                                'key' => $langKey,
                                                'args' => $args,
                                                'result' => $result,
diff --git a/tests/qunit/data/requireCallMwLoaderTestCallback.js b/tests/qunit/data/requireCallMwLoaderTestCallback.js
new file mode 100644 (file)
index 0000000..8bc087b
--- /dev/null
@@ -0,0 +1,2 @@
+var x = require( 'test.require.define' );
+module.exports = 'Require worked.' + x;
index f2865eb..4fab90d 100644 (file)
@@ -6,7 +6,7 @@
        } ) );
 
        QUnit.test( 'Hello world', function ( assert ) {
-               QUnit.expect( 1 );
+               QUnit.expect( 2 );
 
                var api = new mw.Api();
 
                        );
                } );
 
+               api.parse( new mw.Title( 'Earth' ) ).done( function ( html ) {
+                       assert.equal( html, '<p><b>Earth</b> is a planet.</p>' );
+               } );
+
+               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 ce4ea8b..dd43c55 100644 (file)
                }, /is not loaded/, 'Requesting non-existent modules throws error.' );
        } );
 
+       QUnit.asyncTest( 'mw.loader require in debug mode', 1, function ( assert ) {
+               var path = mw.config.get( 'wgScriptPath' );
+               mw.loader.register( [
+                       [ 'test.require.define', '0' ],
+                       [ 'test.require.callback', '0', [ 'test.require.define' ] ]
+               ] );
+               mw.loader.implement( 'test.require.callback', [ QUnit.fixurl( path + '/tests/qunit/data/requireCallMwLoaderTestCallback.js' ) ] );
+               mw.loader.implement( 'test.require.define', [ QUnit.fixurl( path + '/tests/qunit/data/defineCallMwLoaderTestCallback.js' ) ] );
+
+               mw.loader.using( 'test.require.callback', function () {
+                       QUnit.start();
+                       var exported = mw.loader.require( 'test.require.callback' );
+                       assert.strictEqual( exported, 'Require worked.Define worked.',
+                               'module.exports worked in debug mode' );
+               }, function () {
+                       QUnit.start();
+                       assert.ok( false, 'Error callback fired while loader.using "test.require.callback" module' );
+               } );
+       } );
+
 }( mediaWiki, jQuery ) );
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 = {