Merge "resourceloader: Inverse hasOwn() check to fix require in debug mode"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 11 Mar 2016 00:19:03 +0000 (00:19 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 11 Mar 2016 00:19:03 +0000 (00:19 +0000)
419 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/el.json
includes/api/i18n/gl.json
includes/api/i18n/it.json
includes/api/i18n/ja.json
includes/api/i18n/lt.json
includes/api/i18n/nap.json
includes/api/i18n/pt.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/de.json
includes/installer/i18n/en.json
includes/installer/i18n/fr.json
includes/installer/i18n/gl.json
includes/installer/i18n/it.json
includes/installer/i18n/ka.json
includes/installer/i18n/ksh.json
includes/installer/i18n/lt.json
includes/installer/i18n/mg.json
includes/installer/i18n/nap.json
includes/installer/i18n/pl.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/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/SpecialImport.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/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/id.json
languages/i18n/inh.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
load.php
maintenance/Maintenance.php
maintenance/benchmarks/Benchmarker.php
maintenance/dumpBackup.php
maintenance/getConfiguration.php
maintenance/initSiteStats.php
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/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/mediawiki.inspect.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/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/generateJqueryMsgData.php
tests/qunit/suites/resources/mediawiki/mediawiki.viewport.test.js

index 437f8e6..a1614d0 100644 (file)
@@ -213,13 +213,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 +346,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..305359f 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
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..f2633d9 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
  * @file
  * @ingroup Watchlist
  */
+use Wikimedia\Assert\Assert;
 
 /**
  * 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 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 caa5aaf..6841ab7 100644 (file)
        "apihelp-patrol-description": "Patrullar unha páxina ou edición.",
        "apihelp-patrol-param-rcid": "ID de modificación recente a vixiar.",
        "apihelp-patrol-param-revid": "ID de revisión a vixiar.",
+       "apihelp-patrol-param-tags": "Cambiar as etiquetas a aplicar na entrada do rexistro de patrullas.",
        "apihelp-patrol-example-rcid": "Patrullar un cambio recente",
        "apihelp-patrol-example-revid": "Patrullar unha revisión",
        "apihelp-protect-description": "Cambiar o nivel de protección dunha páxina.",
        "apihelp-protect-param-protections": "Lista dos niveis de protección, con formato <kbd>action=level</kbd> (p.ex. <kbd>edit=sysop</kbd>).\n\n<strong>Nota:</strong> Todas as accións que non estean listadas terán restriccións para ser eliminadas.",
        "apihelp-protect-param-expiry": "Selos de tempo de caducidade. Se só se indica un selo de tempo, usarase para todas as proteccións. Use <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, ou <kbd>never</kbd>, para unha protección sen caducidade.",
        "apihelp-protect-param-reason": "Razón para (des)protexer.",
+       "apihelp-protect-param-tags": "Cambiar as etiquetas a aplicar na entrada do rexistro de protección.",
        "apihelp-protect-param-cascade": "Activar a protección en cascada (por exemplo, protexer os modelos transcluídos e as imaxes usadas nesta páxina). Ignórase se ningún dos niveis de protección soporta a protección en cascada.",
        "apihelp-protect-param-watch": "Se se define este parámetro, engadir a páxina que se (des)protexe á lista de vixilancia do usuario actual.",
        "apihelp-protect-param-watchlist": "Engadir ou eliminar sen condicións a páxina da lista de vixiancia do usuario actual, use as preferencias ou non cambie a vixiancia.",
        "apihelp-unblock-param-id": "ID do bloque a desbloquear (obtido de <kbd>list=blocks</kbd>). Non pode usarse xunto con <var>$1user</var>.",
        "apihelp-unblock-param-user": "Nome de usuario, dirección IP ou rango de direccións IP a desbloquear. Non pode usarse xunto con <var>$1id</var>.",
        "apihelp-unblock-param-reason": "Razón para desbloquear.",
+       "apihelp-unblock-param-tags": "Cambiar as etiquetas a aplicar na entrada do rexistro de bloqueo.",
        "apihelp-unblock-example-id": "Desbloquear bloqueo ID #<kbd>105</kbd>.",
        "apihelp-unblock-example-user": "Desbloquear usuario <kbd>Bob</kbd> con razón <kbd>Síntoo Bob</kbd>.",
        "apihelp-undelete-description": "Restaurar modificacións dunha páxina borrada.\n\nUnha lista de modificacións borradas (incluíndo os seus selos de tempo) pode consultarse a través de [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]], e unha lista de IDs de ficheiros borrados pode consultarse a través de [[Special:ApiHelp/query+filearchive|list=filearchive]].",
        "apihelp-undelete-param-title": "Título da páxina a restaurar.",
        "apihelp-undelete-param-reason": "Razón para restaurar.",
+       "apihelp-undelete-param-tags": "Cambiar as etiquetas a aplicar na entrada do rexistro de borrado.",
        "apihelp-undelete-param-timestamps": "Selos de tempo das modificacións a restaurar. Se <var>$1timestamps</var> e <var>$1fileids</var> están baleiras, restaurarase todo.",
        "apihelp-undelete-param-fileids": "IDs das modificacións de ficheiro a restaurar. Se <var>$1timestamps</var> e <var>$1fileids</var> están baleiras, serán restauradas todas.",
        "apihelp-undelete-param-watchlist": "Engadir ou eliminar a páxina da lista de vixiancia do usuario actual sen condicións, use as preferencias ou non cambie a vixiancia.",
index ae4c71a..927509c 100644 (file)
        "apihelp-parse-example-text": "Analizza wikitext.",
        "apihelp-parse-example-texttitle": "Analizza wikitext, specificando il titolo della pagina.",
        "apihelp-parse-example-summary": "Analizza un oggetto.",
+       "apihelp-patrol-param-tags": "Modifica etichette da applicare all'elemento del registro delle verifiche.",
+       "apihelp-protect-param-tags": "Modifica etichette da applicare all'elemento del registro delle protezioni.",
        "apihelp-protect-example-protect": "Proteggi una pagina.",
        "apihelp-query-param-export": "Esporta la versione attuale di tutte le pagine ottenute o generate.",
        "apihelp-query+allcategories-param-dir": "Direzione dell'ordinamento.",
        "apihelp-tokens-param-type": "Tipi di token da richiedere.",
        "apihelp-tokens-example-edit": "Recupera un token di modifica (il predefinito).",
        "apihelp-unblock-description": "Sblocca un utente",
+       "apihelp-unblock-param-tags": "Modifica etichette da applicare all'elemento del registro dei blocchi.",
        "apihelp-undelete-param-title": "Titolo della pagina da ripristinare.",
+       "apihelp-undelete-param-tags": "Modifica etichette da applicare all'elemento del registro delle cancellazioni.",
        "apihelp-upload-example-url": "Carica da un URL.",
        "apihelp-userrights-param-user": "Nome utente.",
        "apihelp-userrights-param-userid": "ID utente.",
index ef97535..04a7554 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-parse-example-page": "ページをパース",
        "apihelp-parse-example-text": "ウィキテキストをパース",
        "apihelp-parse-example-summary": "要約を構文解析します。",
-       "apihelp-patrol-description": "ã\83\9aã\83¼ã\82¸ã\81¾ã\81\9fã\81¯ç\89\88ã\82\92å·¡å\9b\9eæ¸\88ã\81¿ã\81«ã\81\97ã\81¾ã\81\99。",
+       "apihelp-patrol-description": "ã\83\9aã\83¼ã\82¸ã\81¾ã\81\9fã\81¯ç\89\88ã\82\92å·¡å\9b\9eæ¸\88ã\81¿ã\81«ã\81\99ã\82\8b。",
        "apihelp-patrol-param-rcid": "巡回済みにする最近の更新ID。",
        "apihelp-patrol-param-revid": "巡回済みにする版ID。",
+       "apihelp-patrol-param-tags": "巡回記録の項目に適用する変更タグ。",
        "apihelp-patrol-example-rcid": "最近の更新を巡回",
        "apihelp-patrol-example-revid": "版を巡回済みにする。",
        "apihelp-protect-description": "ページの保護レベルを変更します。",
        "apihelp-protect-param-protections": "<kbd>action=level</kbd> の形式 (例えば、<kbd>edit=sysop</kbd>) で整形された、保護レベルの一覧。\n\n<strong>注意: </strong> ここに列挙されなかった操作の制限は解除されます。",
        "apihelp-protect-param-expiry": "有効期限です。タイムスタンプがひとつだけ指定された場合は、それがすべての保護に適用されます。無期限の保護を行う場合は<kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, または <kbd>never</kbd> を指定します。",
        "apihelp-protect-param-reason": "保護(解除)の理由。",
+       "apihelp-protect-param-tags": "保護記録の項目に適用する変更タグ。",
        "apihelp-protect-param-watch": "指定されると、保護(解除)するページが現在の利用者のウォッチリストに追加されます。",
        "apihelp-protect-example-protect": "ページを保護する。",
        "apihelp-protect-example-unprotect": "制限値を <kbd>all</kbd> にしてページの保護を解除する。",
        "apihelp-query+deletedrevs-param-excludeuser": "この利用者による版を一覧表示しない。",
        "apihelp-query+deletedrevs-param-namespace": "この名前空間に含まれるページのみを一覧表示します。",
        "apihelp-query+deletedrevs-param-limit": "一覧表示する版の最大量。",
+       "apihelp-query+deletedrevs-param-prop": "どの情報を取得するか:\n;revid:削除された版の版IDを追加します。\n;parentid:ページの前の版の版IDを追加します。\n;user:版を作成した利用者を追加します。\n;userid:版を作成した利用者のIDを追加します。\n;comment:版のコメントを追加します。\n;parsedcomment:版のコメントを構文解析して追加します。\n;minor:版が細部の編集かどうか印をつけます。\n;len:版の長さ (バイト) を追加します。\n;sha1:版のSHA-1 (base 16) を追加します。\n;content:版の内容を追加します。\n;token:<span class=\"apihelp-deprecated\">廃止予定です。</span>編集トークンを返します。\n;tags:版のタグです。",
        "apihelp-query+deletedrevs-example-mode1": "ページ <kbd>Main Page</kbd> および <kbd>Talk:Main Page</kbd> の最後に削除された版を内容と共に一覧表示する(モード 1)。",
        "apihelp-query+deletedrevs-example-mode2": "<kbd>Bob</kbd> による、削除された最後の50投稿を一覧表示する(モード 2)。",
        "apihelp-query+deletedrevs-example-mode3-main": "標準名前空間にある削除された最初の50版を一覧表示する(モード 3)。",
        "apihelp-unblock-param-id": "解除するブロックのID (<kbd>list=blocks</kbd>で取得できます)。<var>$1user</var> とは同時に使用できません。",
        "apihelp-unblock-param-user": "ブロックを解除する利用者名、IPアドレスまたはIPレンジ。<var>$1id</var>とは同時に使用できません。",
        "apihelp-unblock-param-reason": "ブロック解除の理由。",
+       "apihelp-unblock-param-tags": "ブロック記録の項目に適用する変更タグ。",
        "apihelp-unblock-example-id": "ブロックID #<kbd>105</kbd> を解除する。",
        "apihelp-unblock-example-user": "<kbd>Sorry Bob</kbd> という理由で利用者 <kbd>Bob</kbd> のブロックを解除する。",
        "apihelp-undelete-description": "削除されたページの版を復元します。\n\n削除された版の一覧 (タイムスタンプを含む) は[[Special:ApiHelp/query+deletedrevs|list=deletedrevs]]に、また削除されたファイルのID一覧は[[Special:ApiHelp/query+filearchive|list=filearchive]]で見つけることができます。",
        "apihelp-undelete-param-title": "復元するページ名。",
        "apihelp-undelete-param-reason": "復元の理由。",
+       "apihelp-undelete-param-tags": "削除記録の項目に適用する変更タグ。",
        "apihelp-undelete-param-timestamps": "復元する版のタイムスタンプ。<var>$1timestamps</var> と <var>$1fileids</var> の両方が空の場合、すべての版が復元されます。",
        "apihelp-undelete-example-page": "<kbd>Main Page</kbd> を復元する。",
        "apihelp-undelete-example-revisions": "<kbd>Main Page</kbd> の2つの版を復元する。",
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 1991ea9..6151f11 100644 (file)
        "apihelp-createaccount-param-mailpassword": "Si mpustato a qualunque valore, na password casuale sarrà mannat'a ll'utente.",
        "apihelp-createaccount-param-reason": "Raggiona, a facoltativa, d' 'a criaziona 'e nu cunto a mpizzà int' 'e reggistre.",
        "apihelp-createaccount-param-language": "Codece 'e llengua a mpustà comme predefinita pe' n'utente (opzionale, 'e default fosse 'a lengue d' 'e cuntenute).",
+       "apihelp-createaccount-example-pass": "Crèa utente <kbd>testuser</kbd> c' 'a password <kbd>test123</kbd>.",
+       "apihelp-createaccount-example-mail": "Crea utente <kbd>testmailuser</kbd> e manna na mail cu na password criat' 'a ccaso.",
        "apihelp-delete-description": "Scancella 'na paggena.",
+       "apihelp-delete-param-title": "Titolo d' 'a paggena a scancellà. Nun se pò ausà nziem'a <var>$1pageid</var>.",
+       "apihelp-delete-param-pageid": "ID d' 'a paggena a scancellà. Nun se pò ausà nziem'a <var>$1title</var>.",
+       "apihelp-delete-param-reason": "Raggione p' 'o scancellà. Si nun s'è mpustato, na raggione generata automaticamente s'add'ausà.",
+       "apihelp-delete-param-tags": "Càgna 'e tag pe' puté apprecà l'entrata dint' 'o riggistro 'e scancellazione.",
        "apihelp-delete-param-watch": "Azzecc' 'a paggena â lista 'e paggene cuntrullate.",
        "apihelp-delete-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-delete-param-unwatch": "Liev' 'a paggena â lista 'e paggene cuntrullate.",
        "apihelp-delete-example-reason": "Scancella 'a <kbd>Main Page</kbd> c' 'o mutivo <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Stu modulo è stato stutato.",
        "apihelp-edit-description": "Crèa e cagna paggene.",
+       "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 6aa5ece..254f1c8 100644 (file)
        "apihelp-watch-example-unwatch": "Deixar de vigiar a página <kbd>Página Principal</kbd>.",
        "apihelp-json-description": "Dados de saída em formato JSON.",
        "api-help-title": "Ajuda API da MediaWiki",
+       "api-help-lead": "Esta é uma página de documentação API do MediaWiki gerada automaticamente.\n\nDocumentação e exemplos: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Módulo principal",
        "api-help-flag-deprecated": "Este módulo está obsoleto.",
+       "api-help-source": "Fonte: $1",
        "api-help-license": "Licença: [[$1|$2]]",
        "api-help-license-noname": "Licença: [[$1|Ver ligação]]",
        "api-help-license-unknown": "Licença: <span class=\"apihelp-unknown\">desconhecida</span>",
        "api-help-param-deprecated": "Obsoleto.",
        "api-help-param-required": "Este parâmetro é obrigatório.",
        "api-help-datatypes-header": "Tipo de dados",
+       "api-help-param-type-limit": "Tipo: inteiro ou <kbd>max</kbd>",
+       "api-help-param-type-boolean": "Tipo: boolean ([[Special:ApiHelp/main#main/datatypes|detalhes]])",
+       "api-help-param-type-user": "Tipo: {{PLURAL:$1|1=nome de utilizador|2=lista de nomes de utilizadores}}",
        "api-help-param-list": "{{PLURAL:$1|1=Um dos seguintes valores|2=Valores (separar com <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-multi-separate": "Separe os valores com <kbd>|</kbd>.",
        "api-help-param-default": "Padrão: $1",
        "api-help-examples": "{{PLURAL:$1|Exemplo|Exemplos}}:",
        "api-help-permissions": "{{PLURAL:$1|Permissão|Permissiões}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Concedida a|Concedidas a}}: $2",
+       "api-help-open-in-apisandbox": "<small>[abrir na página de testes]</small>",
        "api-credits-header": "Créditos",
        "api-credits": "Programadores API:\n* Roan Kattouw (programador principal Set 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (criador, programador-líder Set 2006–Set 2007)\n* Brad Jorsch (programador-líder 2013–presente)\n\nPor favor, envie os seus comentários, sugestões e perguntas para mediawiki-api@lists.wikimedia.org ou reporte um erro técnico em https://phabricator.wikimedia.org/."
 }
index 0bb5f63..8b0e5ea 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",
@@ -73,6 +74,7 @@
        "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.",
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 fdb52a8..4d16d45 100644 (file)
@@ -83,6 +83,7 @@
        "config-mysql-charset": "مجموعة محارف قاعدة البيانات",
        "config-mysql-binary": "ثنائي",
        "config-mysql-utf8": "يو تي إف-8",
+       "config-mssql-auth": "نوع الاستيثاق:",
        "config-site-name": "اسم الويكي:",
        "config-site-name-blank": "أدخل اسم موقع.",
        "config-project-namespace": "نطاق المشروع:",
        "config-profile": "ملف صلاحيات المستخدم:",
        "config-profile-wiki": "افتح ويكي",
        "config-profile-no-anon": "إنشاء الحساب مطلوب",
+       "config-profile-fishbowl": "المحررون المخولون فقط",
        "config-profile-private": "ويكي خاص",
        "config-license": "حقوق النسخ والترخيص:",
        "config-license-none": "لا تذييل ترخيص",
        "config-install-mainpage": "إنشاء صفحة رئيسية بالمحتوى الافتراضي",
        "config-install-extension-tables": "إنشاء جداول للامتدادات المفعلة",
        "config-install-mainpage-failed": "لم يتمكن من إدراج الصفحة الرئيسية: $1",
+       "config-download-localsettings": "تنزيل <code>LocalSettings.php</code>",
        "config-help": "مساعدة",
        "config-help-tooltip": "اضغط للتوسيع",
-       "mainpagetext": "'''تم تثبيت ميدياويكي بنجاح.'''",
+       "config-nofile": "لا يمكن العثور على الملف \"$1\". هل حُذف؟",
+       "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 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 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 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]"
 }
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 9366983..0931bea 100644 (file)
@@ -67,7 +67,6 @@
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] è installato",
        "config-apc": "[http://www.php.net/apc APC] è installato",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] è installato",
-       "config-no-cache": "'''Attenziò:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache] nun so' state truvate.\n'A funziona caching 'e ll'oggette non è apicciata.",
        "config-no-cache-apcu": "<strong>Attenziò:</strong> [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache] nun so' state truvate.\n'A funziona caching 'e ll'oggette non è apicciata.",
        "config-mod-security": "<strong>Attenziò:</strong> 'O servitore web vuosto téne [http://modsecurity.org/ mod_security]/mod_security2 appicciato. Ce stanno tante mpustaziune commune ca 'o facessero causà prubbleme a MediaWiki e ll'ati software ca permettessero ll'utente 'e pubbrecà cuntenute.\nSi putite, stutate sta funziona. Sinò, riferite 'a [http://modsecurity.org/documentation/ documentaziona ncopp' 'o mod_security] o cuntattate 'o host vuosto pe' ve dà supporto quanno se scummogliasse cocch'errore.",
        "config-diff3-bad": "GNU diff3 nun truvato.",
        "config-ns-site-name": "'O stesso ch' 'o nomme d' 'o wiki: $1",
        "config-ns-other": "Ati (specificà)",
        "config-ns-other-default": "MyWiki",
-       "config-project-namespace-help": "Secutanno l'esempio 'e Wikipedia, tante wiki teneno 'e paggene lloro ch' 'e regole spartute d' 'e paggene 'e cuntenute, dint'a nu \"'''namespace 'e pruggetto'''\". Tuttuquante 'e titule d' 'e paggene dint'a stu namespace accummenciano cu nu certo prefisso ca se putesse nzegnà ccà.\n'O solito, stu prefisso vene d' 'o nomme d' 'o wiki, ma nun adda cuntenè carattere 'e punteggiatura comme fossero \"#\" o \":\".",
+       "config-project-namespace-help": "Secutanno l'esempio 'e Wikipedia, tante wiki teneno 'e paggene lloro ch' 'e regole spartute d' 'e paggene 'e cuntenute, dint'a nu '''namespace 'e pruggetto'''. Tuttuquante 'e titule d' 'e paggene dint'a stu namespace accummenciano cu nu certo prefisso ca se putesse nzegnà ccà.\n'O solito, stu prefisso vene d' 'o nomme d' 'o wiki, ma nun adda cuntenè carattere 'e punteggiatura comme fossero \"#\" o \":\".",
        "config-ns-invalid": "'O namespace specificato \"<nowiki>$1</nowiki>\" nun è buono.\nSpecificate nu namespace 'e pruggetto differente.",
        "config-ns-conflict": "'O namespace innecato \"<nowiki>$1</nowiki>\" tràse ncunflitto cu nu namespace predefinito 'e MediaWiki.\nSpecifiate n'atu nomme divierzo 'e namespace 'e pruggetto.",
        "config-admin-box": "Cunto ammenistratore",
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 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 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..92311b5 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();
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..abb4e11 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,
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 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..5855ddf 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
@@ -4282,15 +4230,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).
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 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 7379a13..c134c29 100644 (file)
        "nocookieslogin": "يستخدم {{SITENAME}} الكوكيز لتسجيل الدخول.\nالكوكيز معطلة لديك.\nمن فضلك فعلها ثم حاول مرة أخرى.",
        "nocookiesfornew": "لم يتم إنشاء حساب المستخدم، لأننا لم نستطع تأكيد مصدره. \nتأكد من أن ملفات تعريف الارتباط (الكوكيز) مفعلة عندك، ثم أعد تحميل الصفحة وحاول مرة أخرى.",
        "noname": "لم تحدد اسم مستخدم صحيح.",
-       "loginsuccesstitle": "تم الدخول بشكل صحيح",
+       "loginsuccesstitle": "تم الدخول",
        "loginsuccess": "'''لقد سجلت الدخول ل{{SITENAME}} باسم \"$1\".'''",
        "nosuchuser": "لا يوجد مستخدم بالاسم \"$1\".\nأسماء المستخدمين حساسة لحالة الحروف.\nتأكد من إملاء الاسم، أو [[Special:UserLogin/signup|قم بإنشاء حساب جديد]].",
        "nosuchusershort": "لا يوجد مستخدم باسم $1\".\nتأكد من إملاء الاسم.",
        "wrongpasswordempty": "كلمة السر المدخلة كانت فارغة.\nمن فضلك حاول مرة أخرى.",
        "passwordtooshort": "يجب أن تتكون كلمة السر على الأقل من {{PLURAL:$1|حرف واحد|حرفين|$1 حروف|$1 حرفا|$1 حرف}}.",
        "passwordtoolong": "كلمات السر لا يجب أن تكون أطول من  {{PLURAL:$1|1 حرف|$1 حروف}}.",
+       "passwordtoopopular": "كلمات المرور الشائعة لا يمكن استخدامها. برجاء اختيار كلمة مرور أكثر فرادة.",
        "password-name-match": "يجب أن تكون كلمة المرور مختلفة عن اسم المستخدم.",
        "password-login-forbidden": "تم منع استخدام اسم المستخدم هذا وكلمة السر.",
        "mailmypassword": "أعد تعيين كلمة السر",
        "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-no-parameters": "وحدة API هذه ليس بها معاملات.",
        "apisandbox-helpurls": "وصلات المساعدة",
        "apisandbox-examples": "أمثلة",
+       "apisandbox-dynamic-parameters": "معاملات إضافية",
        "apisandbox-dynamic-parameters-add-label": "اضافة أليات:",
        "apisandbox-dynamic-parameters-add-placeholder": "اسم المعامل",
+       "apisandbox-dynamic-error-exists": "يوجد بالفعل معامل باسم \"$1\".",
        "apisandbox-deprecated-parameters": "معاملات مهملة",
        "apisandbox-submit-invalid-fields-title": "بعض الحقول غير صالحة",
        "apisandbox-results": "النتائج",
        "apisandbox-sending-request": "إرسال طلب API ...",
        "apisandbox-loading-results": "استقبال طلبات API ...",
        "apisandbox-request-url-label": "مسار الطلب:",
-       "apisandbox-request-time": "وقت الطلب: $1",
+       "apisandbox-request-time": "وقت الطلب: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "رمز الصحيح وإعادة الموافقة",
        "apisandbox-alert-page": "هناك حقول غير صالحة في هذه الصفحة.",
        "apisandbox-alert-field": "قيمة هذا الحقل غير صالحة.",
        "booksources": "مصادر كتاب",
        "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": "الامتدادات الممكنة",
        "mediastatistics-table-count": "عدد الملفات",
        "api-error-blacklisted": "اختر عنوانا مختلفا ومفهوما.",
        "sessionmanager-tie": "لا يمكن جمع أنواع استيثاق متعددة: $1.",
        "sessionprovider-generic": "جلسات $1",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "جلسات قائمة على ملفات تعريف الارتباط (كوكيز)",
        "sessionprovider-nocookies": "قد يتم تعطيل الكوكيز. تأكد من تمكين ملفات تعريف الأرتباط وأبد مرةأخرى.",
        "randomrootpage": "صفحة جذر عشوائية"
 }
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..e444fd2 100644 (file)
@@ -84,7 +84,7 @@
        "september": "سبتامبر",
        "october": "كتوبر",
        "november": "نوفامبر",
-       "december": "ديسامبر",
+       "december": "ديسمبر",
        "january-gen": "جانفي",
        "february-gen": "فيفري",
        "march-gen": "مارس",
        "unprotectthispage": "بدّل الحضية تاع هاد الباجة",
        "newpage": "باجه جديده",
        "talkpage": "قرعَج على هاد الباجة",
-       "talkpagelinktext": "مهادرة",
+       "talkpagelinktext": "تناقش",
        "specialpage": "باجة خوصوصيّة",
        "personaltools": "دوزان شخصيه",
        "articlepage": "شوف الباجة تاع المحتاوا",
        "pool-errorunknown": "خلطة ماشي معروفة",
        "pool-servererror": "السربيس تاع العدّان راه حابس ( $1 ).",
        "poolcounter-usage-error": "غلطة تاع ستُعمال: $1",
-       "aboutsite": "على{{SITENAME}}",
+       "aboutsite": "على {{SITENAME}}",
        "aboutpage": "Project:على",
        "copyright": "المحتاوا راه تحت النسخة $1 تاع الليسانس، غير يلا كان مكتوب حاجاخرة.",
        "copyrightpage": "{{ns:project}}:حقوق النسخ",
        "currentevents": "الختيّارات",
        "currentevents-url": "Project:خبورات",
        "disclaimers": "تنبيهات",
-       "disclaimerpage": "Project:التحذيرات العامه",
+       "disclaimerpage": "Project:التنبيهات العامة",
        "edithelp": "معونة",
        "helppage-top-gethelp": "معاونة",
        "mainpage": "الپاجة اللولانيّة",
        "policy-url": "Project:المقاون",
        "portal": "بورطاي المجتمع",
        "portal-url": "Project:بورطاي المجتمع",
-       "privacy": "اÙ\84سÙ\8aاسة ØªØ§Ø¹ Ø§Ù\84خصÙ\88صÙ\8aات (اÙ\84دÙ\8aÙ\86 Ø§Ù\84ضÙ\8aÙ\91Ù\82)",
-       "privacypage": "Project:خصÙ\88صÙ\8aÙ\87",
+       "privacy": "اÙ\84سÙ\8aاسة ØªØ§Ø¹ Ø§Ù\84خصÙ\88صÙ\8aØ©",
+       "privacypage": "Project:اÙ\84سÙ\8aاسة ØªØ§Ø¹ Ø§Ù\84خصÙ\88صÙ\8aÙ\91Ø©",
        "badaccess": "مشكل فل مسموحات",
        "badaccess-group0": "ماشي مقبول ليك تدير الشي الّي راك تسيّي تديرهُ.",
        "badaccess-groups": "الفعلة الّي راك سيّيت تديرها مسموحة برك لل مستعملّين {{PLURAL:$2||الّي هوما منل جماعة|الّي هوما من وحدة من هاد الجمايع}}: $1.",
        "viewsourceold": "شوف الاصل",
        "editlink": "تبديل",
        "viewsourcelink": "شوف العين",
-       "editsectionhint": "Ø¥Ù\8aدÙ\8aتÙ\8a Ø§Ù\84صÙ\86Ù\81:$1",
+       "editsectionhint": "بدÙ\91Ù\84 Ù\81 Ø§Ù\84سÙ\83سÙ\8aÙ\88Ù\86$1",
        "toc": "محتويات",
        "showtoc": "ورّي",
        "hidetoc": "خبّي",
        "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": "الباجة",
        "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\".",
        "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": "تبديلات مربوطه",
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 3ace910..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": "Пароль робата выдалены",
        "accmailtitle": "Пароль адасланы.",
        "accmailtext": "Створаны адвольны пароль для [[User talk:$1|$1]] быў адасланы па адрасе $2. Яго можна зьмяніць на старонцы ''[[Special:ChangePassword|зьмены паролю]]'' пасьля ўваходу.",
        "newarticle": "(Новая)",
-       "newarticletext": "Вы прыйшлі па спасылцы на старонку, якая яшчэ не існуе.\nКаб стварыць яе, напішыце тэкст у полі ніжэй (глядзіце [$1 старонку дапамогі] для дадатковай інфармацыі).\nКалі Вы трапілі сюды памылкова, націсьніце '''назад''' у вашым браўзэры.",
+       "newarticletext": "Вы прыйшлі па спасылцы на старонку, якая яшчэ не існуе.\nКаб стварыць яе, напішыце тэкст у полі ніжэй (глядзіце [$1 старонку дапамогі] для дадатковай інфармацыі).\nКалі Вы трапілі сюды памылкова, націсьніце кнопку «<strong>назад</strong>» у вашым браўзэры.",
        "anontalkpagetext": "----''Гэта старонка гутарак ананімнага ўдзельніка, які яшчэ не стварыў сабе рахунак альбо не ўжывае яго. Таму мы вымушаныя ўжываць лічбавы IP-адрас дзеля ягонай ідэнтыфікацыі. Адзін IP-адрас можа выкарыстоўвацца некалькімі ўдзельнікамі. Калі Вы — ананімны ўдзельнік і лічыце, што атрымалі не прызначаныя Вам камэнтары, калі ласка, [[Special:UserLogin/signup|стварыце рахунак]] альбо [[Special:UserLogin|увайдзіце ў сыстэму]], каб у будучыні пазьбегнуць магчымай блытаніны зь іншымі ананімнымі ўдзельнікамі.''",
        "noarticletext": "Цяпер тэкст на гэтай старонцы адсутнічае.\nВы можаце [[Special:Search/{{PAGENAME}}|пашукаць гэтую назву]] сярод іншых старонак, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пашукаць у адпаведных журналах падзеяў]\nальбо [{{fullurl:{{FULLPAGENAME}}|action=edit}} стварыць гэтую старонку]</span>.",
        "noarticletext-nopermission": "Цяпер на гэтай старонцы тэкст адсутнічае.\nВы можаце [[Special:Search/{{PAGENAME}}|пашукаць назву гэтай старонкі]] на іншых старонках, альбо <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пашукаць зьвязаныя запісы ў журналах]</span>, але ў вас няма дазволу ствараць гэтую старонку.",
        "grant-patrol": "Патруляваньне зьменаў старонак",
        "grant-protect": "Абарона і зьняцьце абароны старонак",
        "grant-rollback": "Адкат зьменаў старонак",
+       "grant-sendemail": "Адпраўка лістоў электроннай пошты іншым удзельнікам",
+       "grant-uploadeditmovefile": "Загрузка, замена і перайменаваньне файлаў",
        "newuserlogpage": "Журнал стварэньня рахункаў",
        "newuserlogpagetext": "Гэта журнал стварэньня рахункаў удзельнікаў і ўдзельніц.",
        "rightslog": "Журнал правоў удзельнікаў",
index f2a978e..fed9035 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\" паспяхова сцёрты.",
        "resetpass_forbidden": "Не дазволена мяняць паролі",
        "resetpass-no-info": "Трэба ўвайсці ў сістэму, каб звяртацца да гэтай старонкі наўпрост.",
        "resetpass-submit-loggedin": "Змяніць пароль",
        "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": "Гісторыя старонкі",
        "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": "Назва файла",
        "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».",
        "pager-older-n": "{{PLURAL:$1|1 старэйшая|$1 старэйшыя}}",
        "suppress": "Падавіць",
        "querypage-disabled": "Гэта адмысловая старонка адключана для павышэння прадукцыйнасці.",
+       "apihelp": "Даведка па API",
+       "apihelp-no-such-module": "Модуль \"$1\" не знойдзены.",
+       "apisandbox-reset": "Ачысціць",
+       "apisandbox-retry": "Паўтарыць",
+       "apisandbox-examples": "Прыклады",
+       "apisandbox-dynamic-parameters": "Дадатковыя параметры",
+       "apisandbox-dynamic-parameters-add-label": "Дадаць параметр:",
        "booksources": "Кнігі",
        "booksources-search-legend": "Знайсці, дзе купіць кнігі",
        "booksources-search": "Пошук",
        "logempty": "Нічога адпаведнага ў журнале не знойдзена.",
        "log-title-wildcard": "Знайсці назвы, якія пачынаюцца з гэтага тэксту",
        "showhideselectedlogentries": "Паказаць/схаваць выбраныя запісы журнала",
+       "checkbox-all": "Усе",
        "allpages": "Усе старонкі",
        "nextpage": "Наступная старонка ($1)",
        "prevpage": "Папярэдняя старонка ($1)",
        "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|праўку|праўкі|правак}}",
        "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 12ea82c..c4b6b67 100644 (file)
        "accmailtitle": "پاسورد دیم داته بوت.",
        "newarticle": "(نوکین)",
        "newarticletext": "شما یک لینک ئی پدا گیپته ئیت و بي ورّق ئی رسیته ئيت که تا انون موجود نه اینت .\nپه ای ورّق ئی جۆڑ کورتینی خاتیرا، به جهلگین چارگوش ئی تا په نیوشیتین ئا شرو بکنیت (په گیشتیرین مالوماتان [$1 کومک ئی ورّق  ] ئا بگیندیت).\nاگه نالوٹگ ایدا آته ئیت، وتی بروزیر تا «بێرگشت» ئی کیلی ئا پرینچیت.",
-       "noarticletext": "ای تاکدیم همی انون هیچ متنئ نداریت .\nشما ئه توانیت که بئ دیگه تاکدیمانئ [[Special:Search/{{PAGENAME}}|ای تاکدیمی ئنوانا بگردیت]]،\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} مربوطین سیاه چال ئا هم بگردیت ]،\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} ای تاکدیما ایڈیٹ بکنیت]</span>.",
+       "noarticletext": "ای تاکدیم انونین وختا هیچ متنئ نداریت.\nشما ئه توانێت که بِه دیگه تاکدیمانئ تا [[Special:Search/{{PAGENAME}}|ای عنوانئ پدا بگردێت]]،\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} مربوتين کورم-جاهاني تا هم بگردێت]،\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} ای تاکدیما جۆڑ بکنێت]</span>.",
        "noarticletext-nopermission": "ای تاکدیم همی انون هیچ متنی نداریت.\nشما ئه توانیت که دیگه تاکدیمانئ تا [[Special:Search/{{PAGENAME}}|ای ئنوانئ پدا بگردیت ]]،\nیا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} مرتبطین سیاه چال ئانئ پدا بگردیت ]</span> ولی شما په ای تاکدیمئ جوڑ کورتینا اجازه نداریت.",
        "missing-revision": "#$1 ئی ایڈیٹ شه  «{{FULLPAGENAME}}» ئی تاکدیما موجود نه اینت.\n\nمعمولاً بئ اثر لینک بئ تاریخچهٔ ئا اپڈیٹ نه بوته و تاکدیم پاک بوته.\nتوانیت ایدت مئلومات بئ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} پاک بوته ئین سیاه چال ئی] تا بگیندیت.",
        "userpage-userdoesnotexist": "«<nowiki>$1</nowiki>» ئی کار زوروکین حساب راجستر نه بوته.\nمهربانی بکنیت مطمائین بئیت که لوٹیت ای تاکدیما جوڑ یا ایڈیٹ بکنیت.",
        "recentchanges-label-bot": "ای ایڈیٹا یک ربات ئی کورته",
        "recentchanges-label-unpatrolled": "ای ایڈیٹ تا انون گشت وارته نه بوته",
        "recentchanges-label-plusminus": "تاکدیمئ حجم بئ ای اندازگ بایٹ ئا تغیر کورته",
-       "recentchanges-legend-heading": "'''اختصارئان:'''",
+       "recentchanges-legend-heading": "<strong>اختصارئان:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همیرنگ بی [[Special:NewPages|نوکین تاکدیمانئ لڑ لیست]] ئا سیل بکنیت)",
-       "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": "نشان داتین",
        "javascripttest-pagetext-unknownaction": "نازانتین اکشن \"$1\".",
        "javascripttest-pagetext-skins": "پوسته‌ای ئا په آزمایشانی اجرا ئا انتخاب کنیت:",
        "javascripttest-qunit-intro": "[$1 آزمایشی مشتندانا] بئ mediawiki.org تا بگیندیت.",
-       "tooltip-pt-userpage": "شمی کار زوروکئ تاکدیم",
-       "tooltip-pt-mytalk": "شمی هبر و گپئ تاکدیم",
-       "tooltip-pt-preferences": "نئ تنظیمات",
+       "tooltip-pt-userpage": "{{GENDER:|شمئ کار زُورۆکین}} تاکدیم",
+       "tooltip-pt-mytalk": "{{GENDER:|شمئ}} حبر و گپئ تاکدیم",
+       "tooltip-pt-preferences": "{{GENDER:|شمئ}} تنظیماتان",
        "tooltip-pt-watchlist": "آ دیمانی لیست که شما آوانی تغیرانا پدگیری ئا کنیت",
-       "tooltip-pt-mycontris": "شمی شراکت ئانی لیست",
+       "tooltip-pt-mycontris": "{{GENDER:|شمئ}} شراکتاني لڑ",
        "tooltip-pt-login": "توصیه ئه کنن که بئ سایٹ ئی تا داخل بئیت. اگرچه که ای کار په جبر و زور نه اینت",
        "tooltip-pt-logout": "در بوتین",
        "tooltip-pt-createaccount": "شه شما ئه لوٹن که په وت یک کار زوروکئ حساب ئی جۆڑ بکنیت و بئ سایٹ ئی تا داخل بئیت؛هرچینکه که ای کار جبری نه اینت",
        "tooltip-t-recentchangeslinked": "تاکدیمانئ آخیرین تغیران که ای دیم گۆ آوان لینک داریت",
        "tooltip-feed-rss": "آراس‌اس ئی خبرنامه په ای تاکدیما",
        "tooltip-feed-atom": "اتم ئی حبرنامه په ای دیما",
-       "tooltip-t-contributions": "ای کار زوروکئ شراکتانی لڑ لیست",
+       "tooltip-t-contributions": "{{GENDER:$1|ای کار‌ زوروکئ}} شراکتانی لڑ لیست",
        "tooltip-t-emailuser": "په ای کار زوروکا ایمیل ئی دیم داتین",
        "tooltip-t-info": "ای دیمی باره ئا گیشتیرین مئلومات",
        "tooltip-t-upload": "فایلی بُرز کورتین",
index 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..c7a5faf 100644 (file)
        "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": "অপসারিত ফাইল ও পাতাগুলি দেখুন",
        "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..eb9d6c9 100644 (file)
        "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",
index 8658f09..2dc4b68 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": "ДӀасхьажорг кхоллар дохина.",
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..220ad5a 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 „$1“ 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 „$1“ bylo aktualizováno.",
        "botpasswords-deleted-title": "Heslo pro bota smazáno",
        "botpasswords-deleted-body": "Heslo pro bota „$1“ 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>",
        "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é",
        "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..5196fe7 100644 (file)
        "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 „$1“ wurde erstellt.",
        "botpasswords-updated-title": "Botpasswort aktualisiert",
-       "botpasswords-updated-body": "Das Botpasswort „$1“ wurde erfolgreich aktualisiert.",
+       "botpasswords-updated-body": "Das Botpasswort „$1“ wurde aktualisiert.",
        "botpasswords-deleted-title": "Botpasswort gelöscht",
        "botpasswords-deleted-body": "Das Botpasswort „$1“ 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>",
        "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-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 39146a2..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": "Τροποποίηση όλων των δικαιωμάτων χρηστών",
        "ipb_expiry_temp": "Οι κρυμμένες φραγές ονομάτων χρηστών πρέπει να είναι μόνιμες.",
        "ipb_hide_invalid": "Μη εφικτή καταστολή αυτού του λογαριασμού. Μπορεί να έχει περισσότερες από {{PLURAL:$1|μια επεξεργασία|$1 επεξεργασίες}}.",
        "ipb_already_blocked": "Η διεύθυνση IP \"$1\" είναι ήδη φραγμένη",
-       "ipb-needreblock": "$1 είναι ήδη αποκλεισμένη. Θέλετε να αλλάξετε τις ρυθμίσεις?",
+       "ipb-needreblock": "Η $1 είναι ήδη αποκλεισμένη. Θέλετε να αλλάξετε τις ρυθμίσεις;",
        "ipb-otherblocks-header": "{{PLURAL:$1|Άλλη φραγή|Άλλες φραγές}}",
        "unblock-hideuser": "Δεν μπορείτε να καταργήσετε τον αποκλεισμό αυτού του χρήστη, καθώς το όνομα χρήστη του έχει αποκρυβεί.",
        "ipb_cant_unblock": "Σφάλμα: Ο αριθμός αναγνώρισης φραγής $1 δεν βρέθηκε. Μπορεί να έχει ξεμπλοκαριστεί ήδη.",
        "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..fea9fbd 100644 (file)
        "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 \"$1\" was created.",
        "botpasswords-updated-title": "Bot password updated",
-       "botpasswords-updated-body": "The bot password \"$1\" was updated successfully.",
+       "botpasswords-updated-body": "The bot password \"$1\" was updated.",
        "botpasswords-deleted-title": "Bot password deleted",
        "botpasswords-deleted-body": "The bot password \"$1\" 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>",
        "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",
        "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..3cba069 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-created-body": "Se creó la contraseña de bot \"$1\".",
        "botpasswords-updated-title": "La contraseña de bot ha sido actualizada",
-       "botpasswords-updated-body": "La contraseña de bot\"$1\" se actualizó correctamente.",
+       "botpasswords-updated-body": "Se actualizó la contraseña de bot \"$1\".",
        "botpasswords-deleted-title": "La contraseña de bot ha sido eliminada",
        "botpasswords-deleted-body": "La contraseña de bot \"$1\" ha sido eliminada.",
        "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>",
        "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-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..c958574 100644 (file)
        "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-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..5624c0d 100644 (file)
        "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-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 c20e7e9..6e98be3 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",
        "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.",
        "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-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 perce qu’el est transcllua per {{PLURAL:$1|cela pâge-que qu’est étâye protègiêe|celes pâges-que que sont étâyes protègiêes}} avouéc lo chouèx « protèccion en cascâda » activâ :\n$2",
        "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.",
        "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.",
+       "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, 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.",
        "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.",
        "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 perce que 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 « $1 » 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 « $1 » est étâ betâ a jorn.",
        "botpasswords-deleted-title": "Contresegno de robot suprimâ",
        "botpasswords-deleted-body": "Lo contresegno de robot « $1 » 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>",
        "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.",
        "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 !",
        "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 :",
+       "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}} :",
+       "permissionserrorstext": "Vos éd pas la pèrmission de fâre l’accion demandâye por {{PLURAL:$1|cela rêson|celes rêsons}}-que :",
+       "permissionserrorstext-withaction": "Vos éd pas la pèrmission de $2 por {{PLURAL:$1|cela rêson|celes rêsons}}-que :",
        "contentmodelediterror": "Vos pouede pas changiér cela vèrsion perce que son modèlo de contegnu est <code>$1</code>, cen que sè difèrence du modèlo de contegnu d’ora de la pâge <code>$2</code>.",
        "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.",
        "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.",
        "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-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 perce que yona de les vèrsions est étâye <strong>suprimâye</strong>.\nY pôt avêr més de dètalys dessus lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornâl de les suprèssions].",
        "rev-suppressed-no-diff": "Vos pouede pas vêre cela dif perce que yona de les vèrsions est étâye <strong>suprimâye</strong>.",
-       "rev-deleted-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-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.",
        "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",
        "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.",
        "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.",
        "php-uploaddisabledtext": "Los tèlèchargements de fichiérs sont dèsactivâs dedens PHP.\nSe vos plét, controlâd la configuracion de « file_uploads ».",
        "uploadscripted": "Cél fichiér contint de code HTML ou ben un scripte que porrêt étre entèrprètâ a tôrt per un navegator Vouèbe.",
        "upload-scripted-pi-callback": "Y at pas moyen de tèlèchargiér un fichiér que contint d’enstruccions de trètament de fôlye de stilo XML.",
-       "uploaded-script-svg": "Piéce ècrivâbla « $1 » trovâye dedens lo fichiér SVG tèlèchargiê.",
-       "uploaded-hostile-svg": "CSS pas de sûr trovâ dens la piéce de stilo d’un fichiér SVG tèlèchargiê.",
-       "uploaded-event-handler-on-svg": "La dèfinicion d’atributs de maneyor d’èvènement <code>$1=\"$2\"</code> est pas ôtorisâ dedens los fichiérs SVG.",
-       "uploaded-href-attribute-svg": "Los atributs href dedens los fichiérs SVG sont ôtorisâs ren que por s’en rèferar a de cibes http:// ou ben https://, <code>&lt;$1 $2=\"$3\"&gt;</code> trovâ.",
-       "uploaded-href-unsafe-target-svg": "href de vers des balyês pas de sûr trovâ dedens lo fichiér SVG tèlèchargiê : URI ciba <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploaded-animate-svg": "Balisa « animate » trovâye que porrêt changiér lo href en empleyent l’atribut « from » <code>&lt;$1 $2=\"$3\"&gt;</code> dedens lo fichiér SVG tèlèchargiê.",
-       "uploaded-setting-event-handler-svg": "La dèfinicion d’atributs de maneyor d’èvènement est blocâye, <code>&lt;$1 $2=\"$3\"&gt;</code> trovâ dedens lo fichiér SVG tèlèchargiê.",
+       "uploaded-script-svg": "Na piéce ècrivâbla « $1 » est étâye trovâye dedens lo fichiér SVG tèlèchargiê.",
+       "uploaded-hostile-svg": "CSS pas de sûr est étâ trovâ dens la piéce de stilo d’un fichiér SVG tèlèchargiê.",
+       "uploaded-event-handler-on-svg": "La dèfinicion d’atributs de maneyor d’èvènement <code>$1=\"$2\"</code> est pas ôtorisâye dedens los fichiérs SVG.",
+       "uploaded-href-attribute-svg": "Los atributs href dedens los fichiérs SVG sont ôtorisâs ren que por s’en rèferar a de cibes http:// ou ben https://, <code>&lt;$1 $2=\"$3\"&gt;</code> est étâ trovâ.",
+       "uploaded-href-unsafe-target-svg": "href de vers des balyês pas de sûr est étâ trovâ dedens lo fichiér SVG tèlèchargiê : URI ciba <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-animate-svg": "La balisa « animate » est étâye trovâye que porrêt changiér lo href en empleyent l’atribut « from » <code>&lt;$1 $2=\"$3\"&gt;</code> dedens lo fichiér SVG tèlèchargiê.",
+       "uploaded-setting-event-handler-svg": "La dèfinicion d’atributs de maneyor d’èvènement est dèfendua, <code>&lt;$1 $2=\"$3\"&gt;</code> est étâ trovâ dedens lo fichiér SVG tèlèchargiê.",
        "uploaded-setting-href-svg": "L’usâjo de la balisa « set » por apondre un atribut « href » a la piéce parenta est dèfendu.",
+       "uploaded-wrong-setting-svg": "L’usâjo de la balisa « set » por apondre na ciba distanta/balyês/scripte a un atribut quint que seye est dèfendu. <code>&lt;set to=\"$1\"&gt;</code> est étâ trovâ dedens lo fichiér SVG tèlèchargiê.",
+       "uploaded-setting-handler-svg": "Los SVG que dèfenéssont l’atribut « handler » avouéc distant/balyês/scripte sont dèfendus. <code>$1=\"$2\"</code> est étâ trovâ dedens lo fichiér SVG tèlèchargiê.",
+       "uploaded-remote-url-svg": "Los SVG que dèfenéssont un atribut de stilo quint que seye avouéc un’URL distanta sont dèfendus. <code>$1=\"$2\"</code> est étâ trovâ dedens lo fichiér SVG tèlèchargiê.",
+       "uploaded-image-filter-svg": "Un filtro d’émâge avouéc URL est étâ trovâ : <code>&lt;$1 $2=\"$3\"&gt;</code> dedens lo fichiér SVG tèlèchargiê.",
+       "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â, pôvont èvitar des 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â perce que 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 :",
        "upload-maxfilesize": "Talye maximon du fichiér : $1",
        "upload-description": "Dèscripcion du fichiér",
        "upload-options": "Chouèx de tèlèchargement",
-       "watchthisupload": "Siuvre ceti fichiér",
+       "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-bad-prefix": "Lo nom du fichiér que vos tèlèchargiéd comence per '''« $1 »''' qu’est en g·ènèral un nom pas dèscriptif balyê ôtomaticament per los aparèlys-fotô numericos.\nSe vos plét, chouèsésséd un nom ples dèscriptif por voutron fichié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’o est en g·ènèrâl un nom pas dèscriptif balyê ôtomaticament per los aparèlys-fotô numericos.\nSe vos plét, chouèsésséd-nen un nom ples dèscriptif.",
        "filename-prefix-blacklist": " #<!-- lèssiéd ceta legne justo d’ense --> <pre>\n# La sintaxa est ceta :\n#  * Tot tèxto que siut un « # » tant qu’a la fin de la legne est un comentèro.\n#  * Tota legne pas voueda est un prèfixo tipico de nom de fichiér balyê ôtomaticament per los aparèlys-fotô numericos :\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # quârques enfatâblos\nIMG # g·ènèrico\nJD # Jenoptik\nMGP # Pentax\nPICT # de totes sôrtes\n #</pre> <!-- lèssiéd ceta legne justo d’ense -->",
        "upload-proto-error": "Protocolo fôx",
        "upload-proto-error-text": "Lo tèlèchargement a distance at fôta d’URLs que començont per <code>http://</code> ou ben <code>ftp://</code>.",
        "upload-misc-error-text": "Na fôta encognua est arrevâye pendent lo tèlèchargement.\nSe vos plét, controlâd que l’URL est justa et accèssibla et pués tornâd èprovar.\nSe lo problèmo continue, veriéd-vos vers un [[Special:ListUsers/sysop|administrator]].",
        "upload-too-many-redirects": "L’URL contint trop de redirèccions",
        "upload-http-error": "Na fôta HTTP est arrevâye : $1",
-       "upload-copy-upload-invalid-domain": "Los tèlèchargements de copies sont pas disponiblos dês ceti domêno.",
+       "upload-copy-upload-invalid-domain": "La copia des tèlèchargements est pas disponibla dês cél domêno.",
+       "upload-foreign-cant-upload": "Cél vouiqui est pas configurâ por tèlèchargiér de fichiérs vers lo dèpôt de fichiérs de defôr demandâ.",
+       "upload-dialog-title": "Tèlèchargiér un fichiér",
+       "upload-dialog-button-cancel": "Anular",
+       "upload-dialog-button-done": "Fêt",
+       "upload-dialog-button-save": "Encartar",
+       "upload-dialog-button-upload": "Tèlèchargiér",
+       "upload-form-label-infoform-title": "Dètalys",
+       "upload-form-label-infoform-name": "Nom",
+       "upload-form-label-infoform-name-tooltip": "Un titro dèscriptif sen pariér por lo fichiér, que sèrvirat coment nom de fichiér. Vos pouede empleyér de lengâjo corent avouéc des èspâços. Pas entrebetar l’èxtension du fichiér.",
+       "upload-form-label-infoform-description": "Dèscripcion",
+       "upload-form-label-infoform-description-tooltip": "Dècrire vito tot cen qu’y at de particuliér por cel’ôvra.\nPor na fotô, mencionar les chouses principâles que sont semondues, l’ocasion ou ben l’endrêt.",
+       "upload-form-label-usage-title": "Usâjo",
+       "upload-form-label-usage-filename": "Nom du fichiér",
+       "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 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 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-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-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": "Listar",
+       "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": "Listar",
        "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": "Listar",
+       "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 »)",
+       "allinnamespace": "Totes les pâges (dedens l’èspâço de noms $1)",
        "allpagessubmit": "Listar",
        "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": "Listar",
+       "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-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 perce que 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, adonc doux-três modèlos ant vêr pas étâ èpatâs.",
        "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",
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 713aa03..e83cd67 100644 (file)
        "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\" נוצרה.",
        "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>",
        "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": "×\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 ×\94×\94×\99×\90 × ×\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-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\" מוחלת על יותר {{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..5c5119a 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> तक) {{PLURAL:$5|हुआ बदलाव दर्शाया गया है|हुए बदलाव दर्शाए गये हैं}}।",
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..8b46fb2 100644 (file)
        "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..737edaa 100644 (file)
        "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",
index a1e3d76..be3b009 100644 (file)
        "tog-watchdefault": "Tambahkan halaman yang saya sunting ke daftar pantauan",
        "tog-watchmoves": "Tambahkan halaman yang saya pindahkan ke daftar pantauan",
        "tog-watchdeletion": "Tambahkan halaman yang saya hapus ke daftar pantauan",
-       "tog-watchrollback": "Tambahkan laman yang pernah saya kembalikan ke dalam daftar pantauan saya",
+       "tog-watchrollback": "Tambahkan halaman yang pernah saya kembalikan ke dalam daftar pantauan saya",
        "tog-minordefault": "Tandai semua suntingan sebagai suntingan kecil secara baku",
        "tog-previewontop": "Perlihatkan pratayang sebelum kotak sunting dan tidak sesudahnya",
        "tog-previewonfirst": "Perlihatkan pratayang pada suntingan pertama",
-       "tog-enotifwatchlistpages": "Kirimkan saya surel jika suatu halaman yang saya pantau berubah",
+       "tog-enotifwatchlistpages": "Kirimkan saya surel jika suatu halaman atau berkas yang saya pantau berubah",
        "tog-enotifusertalkpages": "Kirimkan saya surel jika halaman pembicaraan saya berubah",
        "tog-enotifminoredits": "Kirimkan saya surel juga pada perubahan kecil",
        "tog-enotifrevealaddr": "Tampilkan alamat surel saya pada surel notifikasi",
        "prefs-user-pages": "Halaman pengguna",
        "prefs-personal": "Profil",
        "prefs-rc": "Perubahan terbaru",
-       "prefs-watchlist": "Pemantauan",
+       "prefs-watchlist": "Daftar pantauan",
        "prefs-editwatchlist": "Sunting daftar pantauan",
-       "prefs-editwatchlist-label": "Sunting entri di daftar pantuan:",
+       "prefs-editwatchlist-label": "Sunting entri di daftar pantauan Anda:",
        "prefs-editwatchlist-edit": "Lihat dan hapus judul di daftar pantauan Anda",
        "prefs-editwatchlist-raw": "Sunting daftar pantauan mentah",
        "prefs-editwatchlist-clear": "Kosongkan daftar pantauan",
        "prefs-watchlist-days": "Jumlah hari maksimum yang ditampilkan di daftar pantauan:",
        "prefs-watchlist-days-max": "Maksimum $1 {{PLURAL:$1|hari}}",
-       "prefs-watchlist-edits": "Jumlah suntingan maksimum yang ditampilkan di daftar pantauan yang lebih lengkap:",
+       "prefs-watchlist-edits": "Jumlah suntingan maksimum yang ditampilkan di daftar pantauan yang dikembangkan:",
        "prefs-watchlist-edits-max": "Nilai maksimum: 1000",
-       "prefs-watchlist-token": "Token pantauan:",
+       "prefs-watchlist-token": "Token daftar pantauan:",
        "prefs-misc": "Lain-lain",
        "prefs-resetpass": "Ganti kata sandi",
        "prefs-changeemail": "Ubah atau hapus alamat surel",
        "recentchangesdays-max": "(maksimum $1 {{PLURAL:$1|hari|hari}})",
        "recentchangescount": "Standar jumlah suntingan yang ditampilkan:",
        "prefs-help-recentchangescount": "Opsi ini berlaku untuk perubahan terbaru, versi terdahulu halaman, dan log.",
-       "prefs-help-watchlist-token2": "Ini adalah kunci rahasia (token) ke web feed dari daftar pantauan Anda.\nSiapa saja yang tahu akan dapat melihat daftar pantauan Anda, jadi jangan dibagikan.\n[[Special:ResetTokens|Klik di sini jika Anda perlu menyetel ulang]].",
+       "prefs-help-watchlist-token2": "Ini adalah kunci rahasia (token) ke umpan web dari daftar pantauan Anda.\nSiapa saja yang tahu akan dapat melihat daftar pantauan Anda, jadi jangan dibagikan. Jika diperlukan\n[[Special:ResetTokens|Anda dapat mengatur ulang kunci tersebut]].",
        "savedprefs": "Preferensi Anda telah disimpan",
        "savedrights": "Hak pengguna {{GENDER:$1|$1}} telah disimpan.",
        "timezonelegend": "Zona waktu:",
        "right-edituserjs": "Menyunting berkas JS pengguna lain",
        "right-editmyusercss": "Sunting berkas CSS pengguna Anda",
        "right-editmyuserjs": "Sunting berkas JavaScript pengguna Anda",
-       "right-viewmywatchlist": "Lihat daftar pantau Anda",
+       "right-viewmywatchlist": "Lihat daftar pantauan Anda",
        "right-editmywatchlist": "Sunting daftar pantau Anda. Masih ada cara menambahkan halaman tanpa harus memiliki hak ini.",
        "right-viewmyprivateinfo": "Lihat data pribadi Anda (alamat surel, nama asli, dll.)",
        "right-editmyprivateinfo": "Sunting data pribadi Anda (alamat surel, nama asli, dll.)",
        "grant-uploadfile": "Mengunggah berkas baru",
        "grant-basic": "Akses dasar",
        "grant-viewdeleted": "Melihat halaman dan berkas yang dihapus",
-       "grant-viewmywatchlist": "Melihat daftar pantauan Anda",
+       "grant-viewmywatchlist": "Lihat daftar pantauan Anda",
        "newuserlogpage": "Log pengguna baru",
        "newuserlogpagetext": "Di bawah ini adalah log pendaftaran pengguna baru",
        "rightslog": "Log perubahan hak akses",
        "action-userrights-interwiki": "menyunting hak akses dari pengguna di wiki lain",
        "action-siteadmin": "mengunci atau membuka kunci basis data",
        "action-sendemail": "kirim surel",
-       "action-editmywatchlist": "sunting daftar pantau Anda",
+       "action-editmywatchlist": "sunting daftar pantauan Anda",
        "action-viewmywatchlist": "lihat daftar pantau Anda",
        "action-viewmyprivateinfo": "lihat informasi pribadi Anda",
        "action-editmyprivateinfo": "sunting informasi pribadi Anda",
        "recentchangeslinked-feed": "Perubahan terkait",
        "recentchangeslinked-toolbox": "Perubahan terkait",
        "recentchangeslinked-title": "Perubahan yang terkait dengan \"$1\"",
-       "recentchangeslinked-summary": "Ini adalah daftar perubahan pada halaman yang terkait ke halaman yang spesifik (atau bagian dari kategori yang spesifik).\nHalaman pada [[Special:Watchlist|daftar pantauan Anda]] terlihat <strong>dicetak tebal</strong>.",
+       "recentchangeslinked-summary": "Ini adalah daftar perubahan pada halaman yang terkait ke halaman tertentu (atau bagian dari kategori tertentu).\nHalaman pada [[Special:Watchlist|daftar pantauan Anda]] terlihat <strong>dicetak tebal</strong>.",
        "recentchangeslinked-page": "Nama halaman:",
        "recentchangeslinked-to": "Perlihatkan perubahan dari halaman-halaman yang terhubung dengan halaman yang disajikan",
        "recentchanges-page-added-to-category": "[[:$1]] ditambahkan pada kategori",
        "backend-fail-read": "Tidak dapat membaca berkas $1.",
        "backend-fail-create": "Tidak dapat membuat berkas $1.",
        "backend-fail-maxsize": "Tidak dapat membuat berkas $1 karena ukurannya lebih besar dari {{PLURAL:$2||}}$2 bita.",
-       "backend-fail-readonly": "Backend penyimpanan \"$1\" ini saat ini hanya bisa dibaca. Alasan yang diberikan adalah: \"''$2''\"",
+       "backend-fail-readonly": "Penyimpanan latar belakang \"$1\" ini saat ini hanya dapat dibaca. Alasan yang diberikan adalah: <em>$2</em>",
        "backend-fail-synced": "Berkas \"$1\" dalam keadaan yang tidak konsisten dalam backends penyimpanan internal",
        "backend-fail-connect": "Tidak dapat menyambung ke penyimpanan backend \"$1\".",
        "backend-fail-internal": "Kesalahan yang tidak dikenal terjadi di backend penyimpanan \"$1\".",
        "apisandbox": "Bak pasir API",
        "apisandbox-jsonly": "JavaScript dibutuhkan untuk menggunakan kotak pasir API.",
        "apisandbox-api-disabled": "API dinonaktifkan pada situs ini.",
-       "apisandbox-intro": "Gunakan halaman ini untuk bereksperimen dengan '''API layanan web MediaWiki'''.\nLihat [//www.mediawiki.org/wiki/API:Main_page dokumentasi API] untuk perincian lanjut penggunaan API. Contoh: [//www.mediawiki.org/wiki/API#A_simple_example dapatkan konten Halaman Utama]. Pilih sebuah tindakan untuk melihat contoh lain.\n\nPerhatikan bahwa, meskipun ini adalah bak pasir, tindakan yang Anda lakukan pada halaman ini dapat mengubah wiki.",
+       "apisandbox-intro": "Gunakan halaman ini untuk bereksperimen dengan '''API layanan web MediaWiki'''.\nLihat [//www.mediawiki.org/wiki/API:Main_page dokumentasi API] untuk perincian lanjut penggunaan API. Contoh: [//www.mediawiki.org/wiki/API#A_simple_example dapatkan konten Halaman Utama]. Pilih sebuah tindakan untuk melihat contoh lain.\n\nPerhatikan bahwa, meskipun ini adalah bak pasir, tindakan yang Anda lakukan pada halaman ini mungkin dapat mengubah wiki.",
        "apisandbox-fullscreen": "Kembangkan panel",
        "apisandbox-fullscreen-tooltip": "Kembangkan panel kotak pasir untuk mengisi jendela peramban.",
        "apisandbox-unfullscreen": "Tampilkan halaman",
        "mywatchlist": "Daftar pantauan",
        "watchlistfor2": "Untuk $1 $2",
        "nowatchlist": "Daftar pantauan Anda kosong.",
-       "watchlistanontext": "Silahkan login untuk melihat atau mengedit item pada daftarjaga anda",
+       "watchlistanontext": "Silakan masuk log untuk melihat atau mengedit butir dalam daftar pantauan Anda",
        "watchnologin": "Belum masuk log",
        "addwatch": "Tambahkan ke daftar pantauan",
        "addedwatchtext": "\"[[:$1]]\" dan diskusinya telah ditambahkan ke [[Special:Watchlist|watchlist]] Anda.\nPerubahan-perubahan berikutnya pada halaman tersebut dan halaman pembicaraan terkaitnya akan tercantum di sini.",
        "delete-toobig": "Halaman ini memiliki sejarah penyuntingan yang panjang, melebihi {{PLURAL:$1|revisi|revisi}}.\nPenghapusan halaman dengan sejarah penyuntingan yang panjang tidak diperbolehkan untuk mencegah kerusakan di {{SITENAME}}.",
        "delete-warning-toobig": "Halaman ini memiliki sejarah penyuntingan yang panjang, melebihi {{PLURAL:$1|revisi|revisi}}.\nMenghapus halaman ini dapat menyebabkan masalah dalam operasional basis data {{SITENAME}}.",
        "deleteprotected": "Anda tidak dapat menghapus laman ini karena telah dilindungi.",
-       "deleting-backlinks-warning": "'''Peringatan:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Halaman lain]] mengarah atau memiliki transklusi ke halaman yang akan Anda hapus.",
+       "deleting-backlinks-warning": "<strong>Peringatan:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Halaman lain]] mengarah atau memiliki transklusi ke halaman yang akan Anda hapus.",
        "rollback": "Kembalikan suntingan",
        "rollbacklink": "kembalikan",
        "rollbacklinkcount": "kembalikan $1 {{PLURAL:$1|suntingan}}",
        "api-error-badaccess-groups": "Anda tidak diizinkan mengunggah berkas ke wiki ini.",
        "api-error-badtoken": "Kesalahan internal: token buruk.",
        "api-error-copyuploaddisabled": "Mengunggah melalui URL dilarang pada peladen ini.",
-       "api-error-duplicate": "Sudah ada {{PLURAL:$1|berkas lain}} dengan konten yang sama di situs ini.",
-       "api-error-duplicate-archive": "Ada {{PLURAL:$1|berkas}} lain di situs dengan konten yang sama, namun {{PLURAL:$1|berkas|berkas-berkas}} itu telah dihapus.",
+       "api-error-duplicate": "Sudah ada {{PLURAL:$1|berkas lain|berkas lain}} dengan isi yang sama di situs ini.",
+       "api-error-duplicate-archive": "Ada {{PLURAL:$1|berkas lain|berkas lain}} di situs dengan konten yang sama, namun {{PLURAL:$1|berkas|berkas-berkas}} itu telah dihapus.",
        "api-error-empty-file": "Berkas yang Anda kirim kosong.",
        "api-error-emptypage": "Pembuatan halaman baru yang kosong tidak diizinkan.",
        "api-error-fetchfileerror": "Kesalahan internal: terjadi kesalahan saat memperoleh berkas ini.",
        "expand_templates_generate_xml": "Tampilkan pohon parser XML",
        "expand_templates_generate_rawhtml": "Tampilkan HTML mentah",
        "expand_templates_preview": "Pratayang",
-       "pagelanguage": "Pemilih bahasa halaman",
+       "pagelanguage": "Ubah bahasa halaman",
        "pagelang-name": "Halaman",
        "pagelang-language": "Bahasa",
        "pagelang-use-default": "Gunakan bahasa baku",
        "pagelang-select-lang": "Pilih bahasa",
        "right-pagelang": "Ubah bahasa halaman",
        "action-pagelang": "mengubah bahasa halaman",
-       "log-name-pagelang": "Ubah bahasa log",
+       "log-name-pagelang": "Log perubahan bahasa",
        "log-description-pagelang": "Ini adalah log perubahan dalam bahasa halaman.",
-       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|mengubah}} bahasa halaman $3 dari $4 menjadi $5.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|mengubah}} bahasa $3 dari $4 menjadi $5.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (aktif)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>nonaktif</strong>)",
        "mediastatistics": "Statistik media",
index 7ee9692..2241d06 100644 (file)
        "tooltip-pt-login": "Укхаза хьай цIи аьле чувала/яла йиша я, амма чуцаваьлача/ялача хIама а дац",
        "tooltip-pt-logout": "Аравала/яла",
        "tooltip-ca-talk": "ОагIувна чулоацаме дувцам",
-       "tooltip-ca-edit": "Ð\95Ñ\80 Ð¾Ð°Ð³IÑ\83в Ñ\85Ñ\83вÑ\86а Ð¹Ð¸Ñ\88йолаÑ\88 Ñ\8f. Ð\94еÑ\85аÑ\80 Ð´Ð°, IалаÑ\88 ÐµÐ»Ð°Ñ\8cÑ\85, Ñ\85Ñ\8cалÑ\85е Ð±IаÑ\80гÑ\82аÑ\81Ñ\81ама Ð¾Ð°Ð³IÑ\83в Ñ\82Iа Ð±IаÑ\80гÑ\82аÑ\81Ñ\81а.",
+       "tooltip-ca-edit": "Ð¥Ñ\83вÑ\86а ÐµÑ\80 Ð¾Ð°Ð³IÑ\83в",
        "tooltip-ca-addsection": "Керда декъам хьаде",
        "tooltip-ca-viewsource": "Ер оагIув хувцамах лораяь я, амма шун цунна гIувамага хьажа бокъо я.",
        "tooltip-ca-history": "Укх оагIувни хувцама таптар",
index dc488a3..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-chosen-placeholder": "Seleziona alcune etichette",
        "tags-edit-chosen-no-results": "Nessun tag corrispondente trovato",
        "tags-edit-reason": "Motivo:",
-       "tags-edit-revision-submit": "Applica le modifiche a {{PLURAL:$1|questa revisione|$1 revisioni}}",
+       "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..1a03e7f 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 نوغ تبدیلیاں پشیک شروع کورے",
index baedef7..7c44420 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 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..993f8de 100644 (file)
        "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..a78dfa2 100644 (file)
        "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.",
        "botpasswords-label-cancel": "Ophüre",
        "botpasswords-label-delete": "Fottschmiiße",
        "botpasswords-label-resetpassword": "Paßwoot neu säze",
+       "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-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-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",
        "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 de6aa98..6f86826 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 editorium 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",
        "tog-diffonly": "Nihil nisi differentia in pagina facta ostendatur",
        "tog-showhiddencats": "Categorias celatas monstrare",
        "tog-norollbackdiff": "Post reversionem paginae differentia neglegatur",
+       "tog-useeditwarning": "Me paginam nondum servatam relicturum monere",
        "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",
        "summary-preview": "Prospectus summarii:",
        "subject-preview": "Prospectus rei/tituli:",
        "blockedtitle": "Usor obstructus est",
-       "blockedtext": "Nomen tuum vel iste locus IP obstructus est a magistratu $1.\nRatio: :''$2''\n\n* Initium obstructionis: $8\n* Finis obstructionis: $6\n* Obstructio pertinet ad: $7\n\nTibi licet ad $1 vel [[{{MediaWiki:Grouppage-sysop}}|magistratum alium]] nuntium mittere, ut obstructio tua disceptetur.\n\nNota bene te litteras electronicas mittere non posse, nisi inscriptio electronica in [[Special:Preferences|modis tuis deligendis]] data confirmata est neu ab ea utenda non arceris!\n\nLocus IP tuus temporarius $3 est, haec obstructio sub numero #$5 relata est.\nQuaesumus haec omnia supra dicta cuipiam consultationi subiungas.",
-       "autoblockedtext": "Locus IP tuus automatice obstruitur, quia alius quidam, qui a magistratu $1 obstructus est, eo usus erat.\nRatio:\n\n:''$2''\n\n* Initium obstructionis: $8\n* Finis obstructionis: $6\n* Obstructio pertinet ad: $7\n\nTibi licet ad $1 vel [[{{MediaWiki:Grouppage-sysop}}|magistratum alium]] nuntium mittere, ut obstructio tua disceptetur.\n\nNota bene te litteras electronicas mittere non posse, nisi inscriptio electronica in [[Special:Preferences|modis tuis deligendis]] data confirmata est neu ab ea utenda non arceris!\n\nLocus IP tuus temporarius $3 est, haec obstructio sub numero #$5 relata est.\nQuaesumus haec omnia supra dicta cuipiam consultationi subiungas.",
+       "blockedtext": "<strong>Nomen tuum vel iste locus IP obstructus est</strong> a magistratu $1.\nRatio: <em>$2</em>\n\n* Initium obstructionis: $8\n* Finis obstructionis: $6\n* Obstructio pertinet ad: $7\n\nTibi licet ad $1 vel [[{{MediaWiki:Grouppage-sysop}}|magistratum]] alium nuntium mittere, ut obstructio tua disceptetur.\n\nNota bene te litteras electronicas mittere non posse, nisi inscriptio electronica in [[Special:Preferences|modis tuis deligendis]] data confirmata est neu ab ea utenda non arceris!\n\nLocus IP tuus temporarius $3 est, haec obstructio sub numero #$5 relata est.\nQuaesumus haec omnia supra dicta cuipiam consultationi subiungas.",
+       "autoblockedtext": "Locus IP tuus automatice obstruitur, quia alius quidam, qui a magistratu $1 obstructus est, eo usus erat.\nRatio:\n\n:''$2''\n\n* Initium obstructionis: $8\n* Finis obstructionis: $6\n* Obstructio pertinet ad: $7\n\nTibi licet ad $1 vel [[{{MediaWiki:Grouppage-sysop}}|magistratum]] alium nuntium mittere, ut obstructio tua disceptetur.\n\nNota bene te litteras electronicas mittere non posse, nisi inscriptio electronica in [[Special:Preferences|modis tuis deligendis]] data confirmata est neu ab ea utenda non arceris!\n\nLocus IP tuus temporarius $3 est, haec obstructio sub numero #$5 relata est.\nQuaesumus haec omnia supra dicta cuipiam consultationi subiungas.",
        "blockednoreason": "nulla causa data",
        "whitelistedittext": "Necesse est tibi $1 priusquam paginas recenseas.",
        "confirmedittext": "Inscriptio tua electronica adfirmanda est priusquam paginas recenseas.\nQuaesumus eam in [[Special:Preferences|modis tuis seligendis]] notifices et confirmes.",
        "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..b2b5974 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 811a65a..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",
        "october-date": "$1 Oktobra",
        "november-date": "$1 Novambra",
        "december-date": "$1 Desambra",
+       "period-am": "Mrn",
+       "period-pm": "Hrv",
        "pagecategories": "{{PLURAL:$1|Sokajy|Sokajy}}",
        "category_header": "Ireo lahatsoratra ao amin'ny sokajy \"$1\"",
        "subcategories": "Zana-tsokajy",
        "morenotlisted": "Tsy feno ity lisitra ity.",
        "mypage": "Pejy",
        "mytalk": "Dinika",
-       "anontalk": "Resaka ho an'io adiresy IP io",
+       "anontalk": "Pejin-dresaka",
        "navigation": "Fikarohana",
        "and": "&#32;sy",
        "qbfind": "Tadiavina",
        "nstab-template": "Endrika",
        "nstab-help": "Fanoroana",
        "nstab-category": "Sokajy",
+       "mainpage-nstab": "Fandraisana",
        "nosuchaction": "Asa tsy fantatra",
        "nosuchactiontext": "Ny asa voafaritra tao amin'ny URL dia tsy fantatr'ity wiki ity",
        "nosuchspecialpage": "Tsy misy io pejy manokana io",
        "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",
        "virus-scanfailed": "Tsy mety alefa ny fitadiavana (kaody $1)",
        "virus-unknownscanner": "Tsy fantatra io Antivirus io :",
        "logouttext": "'''Efa tafavoaka amin'izay ianao.'''\n\nFantaro fa mety mbola misy ireo pejy milaza anao fa mbola tafiditra raha tsy namafa ny pejy voatakona (cache) ianao.",
+       "cannotlogoutnow-title": "Tsy afaka mivoaka amin'izao fotoana izao",
+       "cannotlogoutnow-text": "Tsy afaka mivoaka rehetra mampiasa $1.",
        "welcomeuser": "Tonga soa, $1",
        "welcomecreation-msg": "Noforonina ny aontinao.\nAza adin ny manova ny [[Special:Preferences|safidinao ro amin'i{{SITENAME}}]].",
        "yourname": "Solonanarana",
        "remembermypassword": "{{PLURAL:}}Tadidio ny tenimiafiko (mandritry ny $1 andro fara-fahabetsany)",
        "userlogin-remembermypassword": "Tadidio aho",
        "userlogin-signwithsecure": "Fidirana amin'ny alalan'ny fanohizana azo antoka",
+       "cannotloginnow-title": "Tsy afaka miditra izao",
+       "cannotloginnow-text": "Tsy afaka miditra rehefa mampiasa $1.",
        "yourdomainname": "faritra (domaine) misy anao",
        "password-change-forbidden": "Tsy afaka manova ny tenimiafina ianao eto amin'ity wiki ity.",
        "externaldberror": "Nisy tsy fetezana angamba teo amin'ny fanamarinana anao tamin'ny sehatra ivelan'ity wiki ity, na tsy manana alalana hanova ny kaontinao ivelany ianao.",
        "createacct-benefit-body2": "pejy{{PLURAL:$1}}",
        "createacct-benefit-body3": "mpandray anjara vao haingana{{PLURAL:$1}}",
        "badretype": "Tsy mitovy ny tenimiafina nampidirinao.",
+       "usernameinprogress": "Efa am-panatanterahana ny famoronan-kaonty amin'ity anaram-pikambana ity.\nMiandrasa azafady.",
        "userexists": "Efa miasa io anaram-pikambana natsofokao io.\nAnarana hafa safidiana.",
        "loginerror": "Tsy fetezana teo amin'ny fidirana",
        "createacct-error": "Hadisoana tam-pamoronana ny kaonty",
        "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.",
        "resetpass_submit": "Ovay ny tenimiafina ary midira",
        "changepassword-success": "Voaova soa aman-tsara ny tenimiafinao!",
        "changepassword-throttled": "Betsaka loatra ny andram-pidirana nataonao.\nAndraso $1 aloha ny mamerina.",
+       "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-bot": "Nataon'ny rôbô ity fanovana ity.",
        "recentchanges-label-unpatrolled": "Ity fanovana ity dia mbola tsy voamarina",
        "recentchanges-label-plusminus": "IO ny isan'ny oktety niova tamin'ilay pejy",
-       "recentchanges-legend-heading": "'''Maribolana:'''",
+       "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",
        "contributions": "Fandraisan'anjaran'ny mpikambana{{GENDER:$1}}",
        "contributions-title": "Fandraisan'anjaran'i $1",
        "mycontris": "Fandraisan'anjara",
+       "anoncontribs": "Fandraisan'anjara",
        "contribsub2": "Ho an'i {{GENDER:$3|$1}} ($2)",
        "nocontribs": "Tsy misy fanovana mifanaraka amin'ireo critères ireo.",
        "uctop": "(ankehitriny)",
        "javascripttest": "Fanandramana JavaScript",
        "javascripttest-pagetext-skins": "Mifidia skin hanaovana ny fanandramana:",
        "javascripttest-qunit-intro": "Jereo ny [$1 fanoroana mikasika ny andrana] eo amin'i mediawiki.org.",
-       "tooltip-pt-userpage": "Ny pejinao",
+       "tooltip-pt-userpage": "Ny pejim-pikambanao",
        "tooltip-pt-anonuserpage": "Ny pejim-bikamban'ny IP andraisanao anjara",
        "tooltip-pt-mytalk": "Pejin-dresakao",
        "tooltip-pt-anontalk": "Ny pejin-dresaka ho an'ny fandraisan' anjara tamin'ny alànan'ity IP ity",
-       "tooltip-pt-preferences": "Ny safidinao",
+       "tooltip-pt-preferences": "Ny safidinao{{GENDER:|}}",
        "tooltip-pt-watchlist": "Ny lisitra ny pejy arahanao-maso",
        "tooltip-pt-mycontris": "Lisitra ny fandraisan'anjaranao",
        "tooltip-pt-login": "Tsara aminao no miditra na misoratra anarana, fa tsy voatery ianao.",
        "tooltip-t-recentchangeslinked": "Lisitry ny fanovàna faran'ny pejy manana rohy amin'ity zavatra ity",
        "tooltip-feed-rss": "Topaka RSS ho an'ity pejy ity",
        "tooltip-feed-atom": "Topaka atom ho an'ity pejy ity",
-       "tooltip-t-contributions": "Hijery ny lisitry ny fandraisan'anjara n'io mpikambana io",
+       "tooltip-t-contributions": "Lisitry ny fandraisan'anjara n'io mpikambana io{{GENDER:$1|}}",
        "tooltip-t-emailuser": "Handefa imailaka any amin'io mpikambana io",
        "tooltip-t-upload": "Handefa sary na rakitra",
        "tooltip-t-specialpages": "Listry ny pejy manokana rehetra",
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 1e14fc4..cd21621 100644 (file)
        "copyrightwarning2": "{{SITENAME}} တွင် ရေးသားမှုအားလုံးသည် အခြားပုံပိုးသူများ၏ တည်းဖြတ်၊ ပြောင်းလဲ၊ ဖယ်ရှားခံရနိုင်သည်ကို သတိပြုပါ။\nအကယ်၍ သင့်ရေးသားချက်များကို အညှာအတာမရှိ တည်းဖြတ်ခံရခြင်း၊ စိတ်တိုင်းကျ ဖြန့်ဝေခံရခြင်းတို့ကို အလိုမရှိပါက ဤနေရာတွင် မတင်ပါနှင့်။<br />\nသင်သည် ဤဆောင်းပါးကို သင်ကိုယ်တိုင်ရေးသားခြင်း၊ သို့မဟုတ် အများပြည်သူဆိုင်ရာဒိုမိန်းများ၊ ယင်းကဲ့သို့ လွတ်လပ်သည့် ရင်းမြစ်မှ ကူးယူထားခြင်း ဖြစ်ကြောင်းလည်း ဝန်ခံ ကတိပြုပါသည် (အသေးစိတ်ကို $1 တွင်ကြည့်ပါ)။\n<strong>မူပိုင်ခွင့်ရှိသော စာ၊ပုံများကို ခွင့်ပြုချက်မရှိဘဲ မတင်ပါနှင့်။</strong>",
        "templatesused": "{{PLURAL:$1|တမ်းပလိတ်|တမ်းပလိတ်}} ခုကို ဤစာမျက်နှာကို သုံးထားသည် -",
        "templatesusedpreview": "{{PLURAL:$1|တမ်းပလိတ်|တမ်းပလိတ်}} ခုကို ဤနမူနာတွင် သုံးထားသည် -",
+       "templatesusedsection": "ဤအပိုင်းတွင် အသုံးပြုထားသော {{PLURAL:$1|တမ်းပလိတ်|တမ်းပလိတ်များ}}:",
        "template-protected": "(ကာကွယ်ထားသည်)",
        "template-semiprotected": "(တစ်စိတ်တစ်ပိုင်း ကာကွယ်ထားသည်)",
        "hiddencategories": "ဤစာမျက်နှာသည် {{PLURAL:$1|ဝှက်ထားသော ကဏ္ဍတစ်ခု|ဝှက်ထားသော ကဏ္ဍ $1 ခု}} ၏ အဖွဲ့ဝင် ဖြစ်သည်။",
        "nocreate-loggedin": "သင်သည် စာမျက်နှာအသစ် ဖန်တီးခွင့်မရှိပါ။",
        "sectioneditnotsupported-title": "ခေါင်းစဉ်ခွဲအလိုက် တည်းဖြတ်ခြင်းကို မထောက်ပံ့ထားပါ",
+       "sectioneditnotsupported-text": "အပိုင်းလိုက်တည်းဖြတ်ခြင်းကို ဤစာမျက်နှာတွင် မရနိုင်ပါ။",
        "permissionserrors": "ခွင့်ပြုချက်အမှား",
        "permissionserrorstext": "အောက်ပါ {{PLURAL:$1|အကြောင်းပြချက်|အကြောင်းပြချက်များ}}ကြောင့် ထိုအရာအတွက် ခွင့်ပြုချက်မရှိပါ -",
        "permissionserrorstext-withaction": "အောက်ပါ အကြောင်းပြချက် {{PLURAL:$1|ခု|ခု}} ကြောင့် $2 အတွက် ခွင့်ပြုချက်မရှိပါ -",
        "edit-gone-missing": "စာမျက်နှာကို အပ်ဒိတ်မလုပ်နိုင်ပါ။\nအဖျက်ခံလိုက်ရပုံပေါ်သည်။",
        "edit-conflict": "အငြင်းပွားမှုကို တည်းဖြတ်ရန်။",
        "edit-no-change": "စာသားကို အပြောင်းအလဲ မလုပ်ခဲ့သောကြောင့် တည်းဖြတ်မှုကို လျစ်လျူရှုလိုက်သည်။",
+       "postedit-confirmation-created": "စာမျက်နှာကို ဖန်တီးပြီးပြီ။",
+       "postedit-confirmation-restored": "စာမျက်နှာကို ပြန်လည်ထိန်းသိမ်းပြီးပြီ။",
+       "postedit-confirmation-saved": "သင့်တည်းဖြတ်မှုကို သိမ်းဆည်းပြီးပြီ။",
        "edit-already-exists": "စာမျက်နှာအသစ်တစ်ခု မဖန်တီးနိုင်ပါ။\nယင်းစာမျက်နှာ တည်ရှိပြီး ဖြစ်သည်။",
        "duplicate-args-category": "တမ်းပလိတ်တွင်းရှိ arguments ထပ်နေသော စာမျက်နှာများ",
        "post-expand-template-inclusion-warning": "'''သတိပေးချက် -''' တမ်းပလိတ်အရွယ်အစား ကြီးလွန်းနေသည်။\nအချို့တမ်းပလိတ်တို့ ပါဝင်မည်မဟုတ်။",
        "histlast": "အသစ်ဆုံး",
        "historyempty": "(ဘာမှမရှိ)",
        "history-feed-title": "မူရာဇဝင်မှတ်တမ်း",
+       "history-feed-description": "ဝီကီပေါ်ရှိ ဤစာမျက်နှာ၏ တည်းဖြတ်မှုရာဇဝင်",
        "history-feed-item-nocomment": "$2 က $1",
        "rev-deleted-comment": "(တည်းဖြတ်မှုအတိုချုပ် ဖယ်ရှားပြီး)",
        "rev-deleted-user": "(အသုံးပြုသူအမည် ဖယ်ရှားပြီး)",
+       "rev-deleted-event": "(အသေးစိတ် မှတ်တမ်း ဖယ်ရှားပြီးပြီ)",
+       "rev-deleted-text-permission": "ဤစာမျက်နှာ ရာဇဝင်များသည် <strong>ဖျက်ထားပြီး</strong>ဖြစ်သည်။\nအသေးစိတ်များကို [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ဖျက်ထားသည့် မှတ်တမ်း]တွင် တွေ့ရှိနိုင်ပါသည်။",
        "rev-delundel": "အမြင်ပုံစံ ပြောင်းလဲရန်",
        "rev-showdeleted": "ပြ",
        "revisiondelete": "မူများကို ဖျက်ရန်/မဖျက်တော့ရန်",
        "revertmerge": "ပြန်ခွဲထုတ်ရန်",
        "history-title": "\"$1\"၏ တည်းဖြတ်မှု ရာဇဝင်",
        "difference-title": "\"$1\" ၏ တည်းဖြတ်မှု မူကွဲများ",
+       "difference-title-multipage": "စာမျက်နှာ \"$1\" နှင့် \"$2\" အကြား ကွဲပြားမှု",
        "difference-multipage": "(စာမျက်နှာများကြားမှ ကွဲပြားချက်များ)",
        "lineno": "စာကြောင်း $1 -",
        "compareselectedversions": "ရွေးချယ်ထားသော မူများကို နှိုင်းယှဉ်ရန်",
        "showhideselectedversions": "ရွေးချယ်ထားသော မူများကို ပြရန်/ဝှက်ရန်",
        "editundo": "နောက်ပြန် ပြန်ပြင်ရန်",
+       "diff-empty": "(ကွဲပြားမှု မရှိ)",
        "searchresults": "ရှာဖွေမှု ရလဒ်များ",
        "searchresults-title": "\"$1\" အတွက် ရှာတွေ့သည့် ရလဒ်များ",
        "titlematches": "စာမျက်နှာခေါင်းစဉ်ကိုက်ညီသည်",
        "search-result-category-size": "{{PLURAL:$1|အသင်းဝင်တစ်ခု|အသင်းဝင် $1 ခု}} ({{PLURAL:$2|ကဏ္ဍခွဲတစ်ခု|ကဏ္ဍခွဲ $2 ခု}}, {{PLURAL:$3|ဖိုင်တစ်ခု|ဖိုင် $3 ခု}})",
        "search-redirect": "($1 သို့ ပြန်ညွှန်းသည်)",
        "search-section": "(အပိုင်း $1)",
+       "search-category": "(ကဏ္ဍ $1)",
        "search-suggest": "$1 ဟု ဆိုလိုပါသလား။",
        "search-interwiki-caption": "ညီအစ်မ ပရောဂျက်များ",
        "search-interwiki-default": "$1 မှ ရလဒ်များ -",
        "right-userrights": "အသုံးပြုသူ၏အခွင့်အရေးများအားလုံးကို တည်းဖြတ်ရန်",
        "right-userrights-interwiki": "အခြားဝီကီများမှ အသုံးပြုသူများ၏ အသုံးပြုသူအခွင့်အရေးများကို တည်းဖြတ်ရန်",
        "right-sendemail": "အခြားအသုံးပြုသူများကို အီးမေးပို့ရန်",
+       "grant-editmywatchlist": "သင့် စောင့်ကြည့်စာရင်းကို တည်းဖြတ်ရန်",
        "newuserlogpage": "အသုံးပြုသူအသစ်ရောက်လာခြင်း မှတ်တမ်း",
        "newuserlogpagetext": "ဤသည်မှာ အသုံးပြုသူအသစ် ဖတ်တီးမှု မှတ်တမ်း ဖြစ်သည်။",
        "rightslog": "အသုံးပြုသူ၏ အခွင့်အရေးများ မှတ်တမ်း",
        "undelete-show-file-submit": "မှန်",
        "namespace": "အမည်ညွှန်း -",
        "invert": "ရွေးချယ်ထားခြင်းကို ပြောင်းပြန်လှန်ရန်",
+       "tooltip-invert": "ဤအကွက်ကို အမှန်ခြစ်၍ ရွေးချယ်ထားသော အမည်ညွှန်း (နှင့် ဆက်စပ်အမည်ညွှန်း)တွင် ပြောင်းလဲမှုများကို ဝှက်ပါ။",
        "namespace_association": "ဆက်စပ်နေသော အမည်ညွှန်း",
        "blanknamespace": "(ပင်မ)",
        "contributions": "{{GENDER:$1|အသုံးပြုသူ}}၏ ဆောင်ရွက်ချက်များ",
        "svg-long-desc": "SVG ဖိုင်, $1 × $2 pixels ကို အကြံပြုသည်, ဖိုင်အရွယ်အစား - $3",
        "show-big-image": "မူရင်းဖိုင်",
        "show-big-image-preview": "ဤနမူနာ၏ အရွယ်အစား - $1။",
+       "show-big-image-other": "အခြား {{PLURAL:$2|ပုံရိပ်ပြတ်သားမှု|ပုံရိပ်ပြတ်သားမှု}}: $1။",
        "newimages": "ပုံအသစ်များပြခန်း",
        "newimages-legend": "စိစစ်မှု",
        "newimages-label": "ဖိုင်အမည် (သို့ ယင်း၏အစိတ်အပိုင်း) -",
        "exif-software": "အသုံးပြုထားသော ဆော့ဝဲ",
        "exif-artist": "ဖန်တီးသူ",
        "exif-copyright": "မူပိုင်ခွင့်ပိုင်ရှင်",
+       "exif-exifversion": "Exif ဗားရှင်း",
+       "exif-colorspace": "အရောင်နေရာ",
        "exif-pixelydimension": "ပုံအကျယ်",
        "exif-pixelxdimension": "ပုံအမြင့်",
        "exif-usercomment": "အသုံးပြုသူ မှတ်ချက်များ",
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 8f2799e..55aebfa 100644 (file)
        "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\" 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\" è fuje agghiurnata.",
        "botpasswords-deleted-title": "Password bot scancellata",
        "botpasswords-deleted-body": "'A password bot \"$1\" è 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>",
        "newarticle": "(Nuovo)",
        "newarticletext": "Site ghiuto/a addò nu link 'e na paggena ca nun esiste ancora.\nP' 'a crià sta paggena, accummenciate a scrivere dint'a cascia cà abbascio (vedite 'a [$1 paggena d'aiuto] pe liegge cchiù nfurmazziune).\nSi site venuto/a ccà pe' sbaglio, vedite 'e sprémmere 'o buttòne '''Arreto''' d' 'o navigatóre.",
        "anontalkpagetext": "----\n''Chest'è 'a paggena 'e discussione 'e n'utente anonimo, ca nun ave criàt' 'ancora n'utenza o ca nun sta ausanno. Pe' l'identificà avite 'e truvà 'o nummero d' 'o ndirizzo IP d' 'o sujo. L'indirizze IP se ponno spartì però sempe ausanno cunte differente. Si site n'utente anonimo e penzate ca 'e cummente ccà dint'a sta paggena nun parlano 'e vuje, allora [[Special:UserLogin/signup|criate n'utenza nnova]] o [[Special:UserLogin|trasite cu chella ca tenite già]] pe' nun sta' mmescato mmiez'a l'ati utente anonime n futuro.''",
-       "noarticletext": "Mo' mo' 'a paggena richiesta è abbacante. Se pò [[Special:Search/{{PAGENAME}}|ascià stu titolo]] dint'a l'ati paggene d' 'o sito, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ascià dint'e riggistre azzeccate] o pure [{{fullurl:{{FULLPAGENAME}}|action=edit}} cagnà 'a paggena mo']</span>.",
+       "noarticletext": "Mo' mo' 'a paggena richiesta è abbacante. Se pò [[Special:Search/{{PAGENAME}}|ascià stu titolo]] dint'a l'ati paggene d' 'o sito, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ascià dint'e riggistre azzeccate] o pure [{{fullurl:{{FULLPAGENAME}}|action=edit}} crià 'a paggena mo']</span>.",
        "noarticletext-nopermission": "Mo' mo' 'a paggena richiesta è abbacante. Se pò [[Special:Search/{{PAGENAME}}|ascià stu titolo]] dint'a l'ati paggene d' 'o sito, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ascià dint'e riggistre azzeccate]</span>, però nun tenite 'o permesso 'a crià sta paggena.",
        "missing-revision": "'A verziona #$1 d' 'a paggena \"{{FULLPAGENAME}}\" nun esiste.\n\nChest'è causato quanno se và dint'a nu link a na paggena ch'è stata scancellata.\n'E dettaglie se ponno truvà dint'a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 'o riggistro 'e scancellamiente].",
        "userpage-userdoesnotexist": "'O cunto utente \"<nowiki>$1</nowiki>\" nun è riggistrato. Cuntrolla ca si buò overo crià o cagnà sta paggena.",
        "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",
        "recentchanges-label-bot": "Cagnamiento affettuato 'a nu bot",
        "recentchanges-label-unpatrolled": "Chista modifica nun è stata 'ncora verificata",
        "recentchanges-label-plusminus": "'A grannezza d' 'a paggena s'è cagnata pe' bbia 'e stu nummero 'e bytes",
-       "recentchanges-legend-heading": "'''Liggenda:'''",
+       "recentchanges-legend-heading": "<strong>Liggenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vide [[Special:NewPages|'e paggene nove]])",
        "recentchanges-submit": "Faje vedé",
        "rcnotefrom": "Ccà abbascio {{PLURAL:$5|è alencato 'o cagnamiento appurtato|song' alincate 'e cagnamiente appurtate}} 'a <strong>$3, $4</strong> (mmustate nfin'a <strong>$1</strong>).",
        "backend-fail-read": "Nun se può lieggere 'o file \"$1\".",
        "backend-fail-create": "Nun se può scrivere 'o file \"$1\"",
        "backend-fail-maxsize": "Nun se può scrivere 'o file \"$1\" pecché chist'è cchiù gruosso 'e {{PLURAL:$2|nu byte|$2 byte}}",
-       "backend-fail-readonly": "L'archivio 'e rezza \"$1\" è mò mò 'n sola-lettura. 'O mutivo è: \"$2\"",
+       "backend-fail-readonly": "L'archivio 'e rezza \"$1\" è mò mò 'n sola-lettura. 'O mutivo è: <em>$2</em>",
        "backend-fail-synced": "'O file \"$1\" è int' 'a nu stato ncunzistente dint'a l'archivie nterne.",
        "backend-fail-connect": "Nun se può cunnettà â memoria 'e rezza \"$1\".",
        "backend-fail-internal": "N'errore scanusciuto s'è verificato int'a l'archivie 'e rezza \"$1\".",
        "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",
        "delete-toobig": "Sta paggena tene na storia 'e cagnamiente troppo longa, ncopp'a $1 {{PLURAL:$1|verzione|verziune}}.\n'O scancellamiento 'e chiste paggene è stato ristretto pe nce 'e putè astipà si ce sta cocche probblema dint' 'o database 'e {{SITENAME}}.",
        "delete-warning-toobig": "Sta paggena tene na cronologgia troppo longa, ncopp'a $1 {{PLURAL:$1|verzione|verziune}}.\nScancellannole se putesse crià troppo burdello ncopp' 'e operaziune 'e database dint'a {{SITENAME}};\niate cuoncio cuoncio.",
        "deleteprotected": "Nun putite scancellà sta paggena pecché è stata prutetta.",
-       "deleting-backlinks-warning": "'''Attenzione:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|ati paggene]] cunteneno cullegamiente o paggene appennute â n'ata paggena ca state pe' scancellà.",
+       "deleting-backlinks-warning": "<strong>Attenzione:</strong>\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|ati paggene]] cunteneno cullegamiente o paggene appennute â n'ata paggena ca state pe' scancellà.",
        "rollback": "Ausa na revizione 'e primma",
        "rollbacklink": "a vascio",
        "rollbacklinkcount": "annulla {{PLURAL:$1|nu cagnamiento|$1 cagnamiente}}",
        "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:",
        "tags-edit-revision-legend": "Azzecca o leva tags 'a {{PLURAL:$1|sta verziona|'e tutte sti $1 verziune}}",
        "tags-edit-logentry-legend": "Azzecca o leva tags 'a {{PLURAL:$1|sta verziona|'e tutte sti $1 verziune}}",
        "tags-edit-existing-tags": "Tag 'e mo:",
-       "tags-edit-existing-tags-none": "''Nisciuno''",
+       "tags-edit-existing-tags-none": "<em>Nisciuno</em>",
        "tags-edit-new-tags": "Nnove tag:",
        "tags-edit-add": "Azzecca sti tag:",
        "tags-edit-remove": "Lèva sti tag:",
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..05f8f96 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",
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..ad1c455 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}}",
        "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..138010a 100644 (file)
        "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 1a2a59e..304fd47 100644 (file)
        "permissionserrors": "Erro de permissão",
        "permissionserrorstext": "Não possui permissão para fazer isso, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:",
        "permissionserrorstext-withaction": "Não possui permissão para $2, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:",
-       "contentmodelediterror": "Não pode editar esta revisão pois seu modelo de conteúdo é <code>$1</code>, e o modelo actual do conteúdo da página é <code>$2</code>.",
+       "contentmodelediterror": "Não pode editar esta revisão pois seu modelo de conteúdo é <code>$1</code>, que é diferente do modelo atual da página <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Aviso: Está a recriar uma página anteriormente eliminada.'''\n\nVerifique se é apropriado continuar a editar esta página.\nPara sua conveniência, é apresentado de seguida o registo de eliminação e de movimento da página:",
        "moveddeleted-notice": "Esta página foi eliminada.\nPara referência, é apresentado de seguida o registo de eliminações e de movimento da página.",
        "moveddeleted-notice-recent": "Desculpe, esta página foi eliminada recentemente (nas últimas 24 horas).\nA exclusão e registo de movimentação para a página são fornecidos abaixo para referência.",
        "apihelp-no-such-module": "Módulo \"$1\" não encontrado.",
        "apisandbox": "Testes da API",
        "apisandbox-api-disabled": "A API está desativada neste site.",
-       "apisandbox-intro": "Use esta página para fazer experiências com a '''API de <i>web services</i> do MediaWiki'''.\nConsulte a [//www.mediawiki.org/wiki/API:Main_page documentação da API] para informações sobre o uso da API. Exemplo: [//www.mediawiki.org/wiki/API#A_simple_example obter o conteúdo da Página Principal]. Selecione uma operação para ver mais exemplos.\n\nNote que, embora esta seja uma área de testes, as operações que executar nesta página podem modificar a wiki.",
+       "apisandbox-intro": "Use esta página para fazer experiências com a <strong>API de serviços da web do MediaWiki</strong>.\nConsulte a [[mw:API:Main page|documentação da API]] para informações sobre o uso da API. Exemplo: [//www.mediawiki.org/wiki/API#A_simple_example obter o conteúdo da Página Principal]. Selecione uma operação para ver mais exemplos.\n\nNote que, embora esta seja uma área de testes, as operações que executar nesta página podem modificar a wiki.",
        "apisandbox-fullscreen": "Expandir painel",
+       "apisandbox-fullscreen-tooltip": "Expandir o painel da página de testes para preencher a janela do navegador.",
        "apisandbox-unfullscreen": "Mostrar página",
        "apisandbox-submit": "Fazer o pedido",
        "apisandbox-reset": "Limpar",
        "apisandbox-retry": "Tentar novamente",
+       "apisandbox-loading": "A carregar a informação do módulo API \"$1\"...",
+       "apisandbox-load-error": "Ocorreu um erro ao carregar a informação do módulo API \"$1\": $2",
+       "apisandbox-no-parameters": "Este módulo API não possui parâmetros.",
+       "apisandbox-helpurls": "Ligações de ajuda",
        "apisandbox-examples": "Exemplos",
+       "apisandbox-dynamic-parameters": "Parâmetros adicionais",
        "apisandbox-dynamic-parameters-add-label": "Adicionar parâmetro:",
        "apisandbox-dynamic-parameters-add-placeholder": "Nome do parâmetro",
        "apisandbox-dynamic-error-exists": "Um parâmetro com o nome \"$1\" já existe.",
        "apisandbox-deprecated-parameters": "Parâmetros obsoletos",
+       "apisandbox-fetch-token": "Auto-preencher o token",
        "apisandbox-submit-invalid-fields-title": "Alguns campos são inválidos",
        "apisandbox-submit-invalid-fields-message": "Por favor, corrija os campos marcados e tente novamente.",
        "apisandbox-results": "Resultados",
        "showhideselectedlogentries": "Mostrar ou ocultar as entradas selecionadas",
        "log-edit-tags": "Editar etiquetas das entradas de registo selecionadas",
        "checkbox-select": "Selecionar: $1",
+       "checkbox-all": "Todas",
+       "checkbox-none": "Nenhuma",
        "checkbox-invert": "Inverter",
        "allpages": "Todas as páginas",
        "nextpage": "Página seguinte ($1)",
        "unblock": "Desbloquear utilizador",
        "blockip": "Bloquear {{GENDER:$1|utilizador|utilizadora|utilizador(a)}}",
        "blockip-legend": "Bloquear utilizador(a)",
-       "blockiptext": "Utilize o formulário abaixo para bloquear o acesso de escrita a um endereço IP específico ou a um nome de utilizador(a).\nIsto só deve ser feito para prevenir vandalismo e de acordo com a [[{{MediaWiki:Policy-url}}|política]]. Indique a seguir um motivo de bloqueio específico (por exemplo, indicando as páginas que foram alvo de vandalismo).",
+       "blockiptext": "Utilize o formulário abaixo para bloquear o acesso de escrita a um endereço IP específico ou a um nome de utilizador(a).\nIsto só deve ser feito para prevenir vandalismo e de acordo com a [[{{MediaWiki:Policy-url}}|política]]. Indique a seguir um motivo de bloqueio específico (por exemplo, indicando as páginas que foram alvo de vandalismo).\nPode bloquear intervalos de endereços IP com a sintaxe [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; o maior intervalo permitido é /$1 para IPv4 e /$2 para IPv6.",
        "ipaddressorusername": "Endereço de IP ou utilizador(a):",
        "ipbexpiry": "Expiração:",
        "ipbreason": "Motivo:",
        "block-log-flags-hiddenname": "nome de utilizador oculto",
        "range_block_disabled": "A funcionalidade de administrador para o bloqueio de gamas de IP está desativada.",
        "ipb_expiry_invalid": "Tempo de expiração inválido.",
+       "ipb_expiry_old": "O tempo de expiração está no passado.",
        "ipb_expiry_temp": "Bloqueios com nome de utilizador oculto devem ser permanentes.",
        "ipb_hide_invalid": "Não foi possível suprimir esta conta; ela possui mais de {{PLURAL:$1|uma edição|$1 edições}}.",
        "ipb_already_blocked": "\"$1\" já se encontra bloqueado",
        "import-interwiki-history": "Copiar todo o histórico de revisões desta página",
        "import-interwiki-templates": "Incluir todas as predefinições",
        "import-interwiki-submit": "Importar",
+       "import-mapping-default": "Importar para localizações predefinidas",
+       "import-mapping-namespace": "Importar para um domínio:",
+       "import-mapping-subpage": "Importar como sub-páginas da seguinte página:",
        "import-upload-filename": "Nome do ficheiro:",
        "import-comment": "Comentário:",
        "importtext": "Exporte o ficheiro da wiki de origem utilizando a página especial [[Special:Export|exportação de páginas]].\nGrave o ficheiro no seu computador e importe-o aqui.",
        "svg-long-error": "Ficheiro SVG inválido: $1",
        "show-big-image": "Ficheiro original",
        "show-big-image-preview": "Tamanho desta antevisão: $1.",
+       "show-big-image-preview-differ": "Tamanho desta antevisão em $3 do ficheiro $2: $1",
        "show-big-image-other": "{{PLURAL:$2|Outra resolução|Outras resoluções}}: $1.",
        "show-big-image-size": "$1 × $2 pixels",
        "file-info-gif-looped": "cíclico",
        "exif-compression-4": "CCITT Grupo 4 codificação de fax",
        "exif-copyrighted-true": "Direitos de autor reservados",
        "exif-copyrighted-false": "Situação dos direitos autorais não definida",
+       "exif-photometricinterpretation-1": "Preto e branco (Preto é 0)",
        "exif-unknowndate": "Data desconhecida",
        "exif-orientation-1": "Normal",
        "exif-orientation-2": "Espelhamento horizontal",
        "version-libraries-license": "Licença",
        "version-libraries-description": "Descrição",
        "version-libraries-authors": "Autores",
-       "redirect": "Redirecionar pelo ID do ficheiro, do utilizador ou da revisão",
+       "redirect": "Redirecionar por ficheiro, utilizador, página, revisão, ou ID de registo",
        "redirect-legend": "Redirecionar para um ficheiro ou página",
-       "redirect-summary": "Esta página especial redireciona para um ficheiro (dado o nome do ficheiro), para uma página (dado um ID de revisão ou página) ou para uma página de utilizador (dado um ID numérico do utilizador). Utilização: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] ou [[{{#Special:Redirect}}/user/101]].",
+       "redirect-summary": "Esta página especial redireciona para um ficheiro (dado o nome do ficheiro), para uma página (dado um ID de revisão ou página) ou para uma página de utilizador (dado um ID numérico do utilizador), ou para uma entrada do registo (dado o ID do registo). Utilização: [[{{#Special:Redirect}}/file/Example.jpg]], \n[[{{#Special:Redirect}}/page/64308]], [{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], ou [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Ir",
        "redirect-lookup": "Pesquisa:",
        "redirect-value": "Valor:",
        "redirect-page": "Identificador (ID) da página",
        "redirect-revision": "Revisão da página",
        "redirect-file": "Nome do ficheiro",
+       "redirect-logid": "ID do registo",
        "redirect-not-exists": "Valor não encontrado",
        "fileduplicatesearch": "Ficheiros duplicados",
        "fileduplicatesearch-summary": "Procure ficheiros duplicados tendo por base o seu resumo criptográfico.",
        "expand_templates_preview": "Antevisão do resultado",
        "expand_templates_preview_fail_html": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de ter havido perda de dados da sessão, a pré-visualização ficará oculta como precaução contra ataques por JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor tente novamente.</strong>\nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta, e verifique se o seu navegador permite a utilização de ''cookies'' deste sítio.",
        "expand_templates_preview_fail_html_anon": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de não ter sessão iniciada, a pré-visualização ficará oculta como precaução contra ataques do JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor [[Especial:UserLogin|inicie sessão]] e tente novamente.</strong>",
+       "expand_templates_input_missing": "Necessita de fornecer pelo menos algum texto de entrada.",
        "pagelanguage": "Alterar idioma da página",
        "pagelang-name": "Página",
        "pagelang-language": "Idioma",
        "mw-widgets-titleinput-description-new-page": "a página ainda não existe.",
        "mw-widgets-titleinput-description-redirect": "redirecionar para $1",
        "api-error-blacklisted": "Escolha um título diferente e descritivo, por favor.",
+       "sessionprovider-generic": "Sessões $1",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "sessões baseadas em cookie",
+       "sessionprovider-nocookies": "Os cookies podem estar desativados. Certifique-se de que os cookies estão ativados e inicie novamente.",
        "randomrootpage": "Página raiz aleatória"
 }
index c9a0c23..93a3e79 100644 (file)
        "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",
        "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..7e7ebe7 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«.",
        "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«.",
        "botpasswords-deleted-title": "Izbrisali smo geslo bota",
        "botpasswords-deleted-body": "Uspešno smo izbrisali geslo bota »$1«.",
        "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>",
        "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-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..e856378 100644 (file)
        "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.",
        "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\".",
        "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-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 f053661..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|மாற்றமாகும்.|மாற்றங்களாகும்.}}",
        "import-rootpage-invalid": "கொடுக்கப்பட்ட மூலப்பக்கம் செல்லாத தலைப்பாகும்.",
        "importlogpage": "இறக்குமதி பதிகை",
        "importlogpagetext": "வேறு விக்கிகளிலில் தொகுப்பு வரலாற்றைக் கொண்டப் பக்கங்களின் மேலாண்மை இறக்குமதிகள்.",
-       "import-logentry-upload-detail": "{{PLURAL:$1|ஒரு திருத்தம்|$1 திருத்தங்கள்}}",
-       "import-logentry-interwiki-detail": "$2 à®\87லிரà¯\81நà¯\8dதà¯\81 {{PLURAL:$1|à®\92à®°à¯\81 à®¤à®¿à®°à¯\81தà¯\8dதமà¯\8d|$1 à®¤à®¿à®°à¯\81தà¯\8dதà®\99à¯\8dà®\95ளà¯\8d}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|திருத்தம்|திருத்தங்கள்}} இறக்குமதி செய்யப்பட்டன",
+       "import-logentry-interwiki-detail": "$2 à®\87லிரà¯\81நà¯\8dதà¯\81 {{PLURAL:$1|திரà¯\81தà¯\8dதமà¯\8d|திரà¯\81தà¯\8dதà®\99à¯\8dà®\95ளà¯\8d}} à®\87à®±à®\95à¯\8dà®\95à¯\81மதி à®\9aà¯\86யà¯\8dயபà¯\8dபà®\9fà¯\8dà®\9fன",
        "javascripttest": "சாவாநிரல் சோதனை நடக்கின்றது",
        "javascripttest-pagetext-noframework": "இந்த பக்கம் JavaScript பரிசோதனை ஓட்டத்திற்காக ஒதுக்கப்பட்டுள்ளது",
        "javascripttest-pagetext-unknownframework": "அறியப்படாத சோதனை பணிச்சட்டம் \"$1\".",
        "special-characters-group-thai": "தாய்",
        "special-characters-group-lao": "இலாவோ",
        "special-characters-group-khmer": "கெமெர்",
+       "special-characters-title-endash": "சிறு கோடு",
+       "special-characters-title-emdash": "பெரு கோடு",
        "special-characters-title-minus": "கழித்தல் குறி",
        "mw-widgets-dateinput-no-date": "திகதி தெரிவுச் செய்யப்படவில்லை",
        "mw-widgets-titleinput-description-new-page": "இப்பக்கம் இன்னும் உருவாக்கப்படவில்லை",
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..e126367 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": "Ð\9fаÑ\80олÑ\8c Ð±Ð¾Ñ\82а Â«$1» Ð±Ñ\83в Ñ\83Ñ\81пÑ\96Ñ\88но Ñ\81Ñ\82воÑ\80ений.",
+       "botpasswords-created-body": "Ð\9fаÑ\80олÑ\8c Ð±Ð¾Ñ\82а Â«$1» Ð±Ñ\83ло Ñ\81Ñ\82воÑ\80ено.",
        "botpasswords-updated-title": "Пароль бота оновлено",
-       "botpasswords-updated-body": "Ð\9fаÑ\80олÑ\8c Ð±Ð¾Ñ\82а Â«$1» Ð±Ñ\83в Ñ\83Ñ\81пÑ\96Ñ\88но Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ð¹.",
+       "botpasswords-updated-body": "Ð\9fаÑ\80олÑ\8c Ð±Ð¾Ñ\82а Â«$1» Ð±Ñ\83ло Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð¾.",
        "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": "Ð\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-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..ea691f9 100644 (file)
        "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": "æ\9cºå\99¨äººå¯\86ç \81â\80\9c$1â\80\9då·²æ\88\90å\8a\9fæ\9b´æ\96°ã\80\82",
+       "botpasswords-created-body": "机器人密码“$1”已更新。",
        "botpasswords-updated-title": "机器人密码已更新",
-       "botpasswords-updated-body": "æ\9cºå\99¨äººå¯\86ç \81â\80\9c$1â\80\9då·²æ\88\90å\8a\9fæ\9b´æ\96°ã\80\82",
+       "botpasswords-updated-body": "机器人密码“$1”已更新。",
        "botpasswords-deleted-title": "机器人密码已删除",
        "botpasswords-deleted-body": "机器人密码“$1”已删除。",
        "botpasswords-newpassword": "用于登录<strong>$1</strong>的新密码是<strong>$2</strong>。<em>请记住它以备今后参考。</em>",
        "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-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": "回退",
        "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 c6452fb..d30a348 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
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 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 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 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 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 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' ) );
                }
        }
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,
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 = {