Merge "RC filters: custom help link for beta users"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 3 Mar 2017 18:37:11 +0000 (18:37 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 3 Mar 2017 18:37:11 +0000 (18:37 +0000)
262 files changed:
.stylelintrc
RELEASE-NOTES-1.29
api.php
autoload.php
composer.json
includes/DefaultSettings.php
includes/Defines.php
includes/Html.php
includes/MWTimestamp.php
includes/MergeHistory.php
includes/Revision.php
includes/RevisionList.php
includes/TitleArray.php
includes/TitleArrayFromResult.php
includes/WatchedItemQueryServiceExtension.php
includes/Xml.php
includes/actions/HistoryAction.php
includes/api/ApiMain.php
includes/api/ApiPageSet.php
includes/api/ApiQueryBase.php
includes/api/ApiQuerySiteinfo.php
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/fr.json
includes/api/i18n/he.json
includes/api/i18n/mk.json
includes/api/i18n/qqq.json
includes/api/i18n/zh-hant.json
includes/cache/BacklinkCache.php
includes/cache/LinkBatch.php
includes/changes/ChangesFeed.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/RCCacheEntryFactory.php
includes/compat/Timestamp.php [new file with mode: 0644]
includes/db/DatabaseOracle.php
includes/deferred/DeferredUpdates.php
includes/export/WikiExporter.php
includes/filerepo/LocalRepo.php
includes/installer/i18n/fa.json
includes/installer/i18n/he.json
includes/installer/i18n/mk.json
includes/libs/filebackend/FSFileBackend.php
includes/libs/filebackend/FileBackendStore.php
includes/libs/filebackend/HTTPFileStreamer.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseMssql.php
includes/libs/rdbms/database/DatabaseMysqlBase.php
includes/libs/rdbms/database/DatabaseMysqli.php
includes/libs/rdbms/database/DatabasePostgres.php
includes/libs/rdbms/database/DatabaseSqlite.php
includes/libs/rdbms/database/IDatabase.php
includes/libs/rdbms/database/resultwrapper/FakeResultWrapper.php
includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php
includes/libs/rdbms/database/resultwrapper/ResultWrapper.php
includes/libs/time/ConvertibleTimestamp.php [deleted file]
includes/libs/time/TimestampException.php [deleted file]
includes/libs/time/defines.php [deleted file]
includes/libs/xmp/XMPValidate.php
includes/media/FormatMetadata.php
includes/page/ImagePage.php
includes/page/WikiFilePage.php
includes/page/WikiPage.php
includes/pager/IndexPager.php
includes/pager/ReverseChronologicalPager.php
includes/revisiondelete/RevDelRevisionList.php
includes/search/SqlSearchResultSet.php
includes/skins/Skin.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/ImageQueryPage.php
includes/specialpage/PageQueryPage.php
includes/specialpage/QueryPage.php
includes/specialpage/WantedQueryPage.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialDoubleRedirects.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListDuplicatedFiles.php
includes/specials/SpecialListredirects.php
includes/specials/SpecialMediaStatistics.php
includes/specials/SpecialMostcategories.php
includes/specials/SpecialMostinterwikis.php
includes/specials/SpecialMostlinked.php
includes/specials/SpecialMostlinkedcategories.php
includes/specials/SpecialMostlinkedtemplates.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialShortpages.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUnwatchedpages.php
includes/specials/SpecialWatchlist.php
includes/specials/pagers/AllMessagesTablePager.php
includes/specials/pagers/BlockListPager.php
includes/specials/pagers/ContribsPager.php
includes/specials/pagers/DeletedContribsPager.php
includes/specials/pagers/ImageListPager.php
includes/user/UserArray.php
includes/user/UserArrayFromResult.php
includes/utils/AutoloadGenerator.php
languages/i18n/ar.json
languages/i18n/be-tarask.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ckb.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fr.json
languages/i18n/glk.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/inh.json
languages/i18n/it.json
languages/i18n/ka.json
languages/i18n/ko.json
languages/i18n/mhr.json
languages/i18n/mk.json
languages/i18n/nl.json
languages/i18n/oc.json
languages/i18n/pt-br.json
languages/i18n/qqq.json
languages/i18n/ru.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/tyv.json
languages/i18n/xmf.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/cleanupRemovedModules.php
maintenance/convertUserOptions.php
maintenance/initUserPreference.php [new file with mode: 0644]
maintenance/namespaceDupes.php
maintenance/purgeChangedPages.php
maintenance/purgeModuleDeps.php [new file with mode: 0644]
maintenance/refreshLinks.php
maintenance/sql.php
mw-config/config.css
resources/Resources.php
resources/lib/oojs-ui/i18n/bqi.json
resources/lib/oojs-ui/i18n/br.json
resources/lib/oojs-ui/i18n/mg.json
resources/lib/oojs-ui/i18n/nn.json
resources/lib/oojs-ui/i18n/pnb.json
resources/lib/oojs-ui/i18n/yi.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-interactions.json
resources/lib/oojs-ui/themes/apex/images/icons/case-sensitive.svg
resources/lib/oojs-ui/themes/apex/images/icons/diacritic.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/diacritic.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/icons-editing-advanced.json
resources/lib/oojs-ui/themes/mediawiki/icons-interactions.json
resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.svg [new file with mode: 0644]
resources/src/dom-level2-skip.js [deleted file]
resources/src/jquery/jquery.tablesorter.less
resources/src/mediawiki.action/mediawiki.action.history.css
resources/src/mediawiki.action/mediawiki.action.view.categoryPage.less
resources/src/mediawiki.action/mediawiki.action.view.postEdit.css
resources/src/mediawiki.action/mediawiki.action.view.redirectPage.css
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.less/mediawiki.mixins.less
resources/src/mediawiki.less/mediawiki.mixins.rotation.less
resources/src/mediawiki.less/mediawiki.ui/mixins.less
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js
resources/src/mediawiki.rcfilters/images/pending.gif [new file with mode: 0644]
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.mixins.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ChangesListWrapperWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterGroupWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemHighlightButton.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.HighlightColorPickerWidget.less
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemHighlightButton.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js
resources/src/mediawiki.skinning/content.externallinks.css
resources/src/mediawiki.skinning/content.parsoid.less
resources/src/mediawiki.special/mediawiki.special.block.css
resources/src/mediawiki.special/mediawiki.special.comparepages.styles.less
resources/src/mediawiki.special/mediawiki.special.search.interwikiwidget.styles.less
resources/src/mediawiki.toolbar/toolbar.less
resources/src/mediawiki.ui/components/anchors.less
resources/src/mediawiki.ui/components/buttons.less
resources/src/mediawiki.ui/components/checkbox.less
resources/src/mediawiki.ui/components/forms.less
resources/src/mediawiki.ui/components/icons.less
resources/src/mediawiki.ui/components/inputs.less
resources/src/mediawiki.ui/components/radio.less
resources/src/mediawiki.ui/components/text.less
resources/src/mediawiki.ui/default.less
resources/src/mediawiki.widgets.datetime/CalendarWidget.less
resources/src/mediawiki.widgets.datetime/DateTimeInputWidget.less
resources/src/mediawiki.widgets.datetime/mediawiki.widgets.datetime.definitions.less
resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.less
resources/src/mediawiki/htmlform/styles.css
resources/src/mediawiki/mediawiki.diff.styles.css
resources/src/mediawiki/mediawiki.filewarning.less
resources/src/mediawiki/mediawiki.helplink.less
resources/src/mediawiki/mediawiki.hlist.css
resources/src/mediawiki/mediawiki.icon.less
resources/src/mediawiki/mediawiki.pager.tablePager.less
resources/src/mediawiki/mediawiki.user.js
resources/src/polyfill-nodeTypes.js [deleted file]
tests/parser/ParserTestRunner.php
tests/phpunit/includes/deferred/DeferredUpdatesTest.php
tests/phpunit/includes/libs/time/ConvertibleTimestampTest.php [deleted file]
tests/qunit/QUnitTestResources.php
tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js

index 5a7b29f..27e289d 100644 (file)
@@ -1,15 +1,8 @@
 {
        "extends": "stylelint-config-wikimedia",
        "rules": {
-               "declaration-no-important": null,
-
                "no-descending-specificity": null,
 
-               "selector-no-id": null,
-               "selector-pseudo-element-colon-notation": null,
-
-               "string-quotes": null,
-
-               "value-keyword-case": null
+               "selector-no-id": null
        }
 }
index a1ce9d9..9883474 100644 (file)
@@ -58,6 +58,7 @@ production.
 === External library changes in 1.29 ===
 
 ==== Upgraded external libraries ====
+* Added wikimedia/timestamp v1.0.0.
 * Updated QUnit from v1.22.0 to v1.23.1.
 * Updated cssjanus from v1.1.2 to 1.1.3.
 * Updated psr/log from v1.0.0 to v1.0.2.
@@ -105,6 +106,8 @@ production.
 * Added action=validatepassword to validate passwords for the account creation
   and password change forms.
 * action=purge now requires a POST.
+* There is a new `languagevariants` siprop for action=query&meta=siteinfo,
+  which returns a list of languages with active LanguageConverter instances.
 
 === Action API internal changes in 1.29 ===
 * New methods were added to ApiBase to handle errors and warnings using i18n
diff --git a/api.php b/api.php
index 6e75fb7..a6ce3b2 100644 (file)
--- a/api.php
+++ b/api.php
@@ -63,7 +63,7 @@ RequestContext::getMain()->setTitle( $wgTitle );
 try {
        /* Construct an ApiMain with the arguments passed via the URL. What we get back
         * is some form of an ApiMain, possibly even one that produces an error message,
-        * but we don't care here, as that is handled by the ctor.
+        * but we don't care here, as that is handled by the constructor.
         */
        $processor = new ApiMain( RequestContext::getMain(), $wgEnableWriteAPI );
 
index aa4e544..793b973 100644 (file)
@@ -289,7 +289,6 @@ $wgAutoloadLocalClasses = [
        'ConvertLinks' => __DIR__ . '/maintenance/convertLinks.php',
        'ConvertUserOptions' => __DIR__ . '/maintenance/convertUserOptions.php',
        'ConverterRule' => __DIR__ . '/languages/ConverterRule.php',
-       'ConvertibleTimestamp' => __DIR__ . '/includes/libs/time/ConvertibleTimestamp.php',
        'Cookie' => __DIR__ . '/includes/libs/Cookie.php',
        'CookieJar' => __DIR__ . '/includes/libs/CookieJar.php',
        'CopyFileBackend' => __DIR__ . '/maintenance/copyFileBackend.php',
@@ -629,6 +628,7 @@ $wgAutoloadLocalClasses = [
        'InfoAction' => __DIR__ . '/includes/actions/InfoAction.php',
        'InitEditCount' => __DIR__ . '/maintenance/initEditCount.php',
        'InitSiteStats' => __DIR__ . '/maintenance/initSiteStats.php',
+       'InitUserPreference' => __DIR__ . '/maintenance/initUserPreference.php',
        'InstallDocFormatter' => __DIR__ . '/includes/installer/InstallDocFormatter.php',
        'Installer' => __DIR__ . '/includes/installer/Installer.php',
        'InstallerOverrides' => __DIR__ . '/includes/installer/InstallerOverrides.php',
@@ -974,7 +974,6 @@ $wgAutoloadLocalClasses = [
        'MovePage' => __DIR__ . '/includes/MovePage.php',
        'MovePageForm' => __DIR__ . '/includes/specials/SpecialMovepage.php',
        'MssqlInstaller' => __DIR__ . '/includes/installer/MssqlInstaller.php',
-       'MssqlResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php',
        'MssqlUpdater' => __DIR__ . '/includes/installer/MssqlUpdater.php',
        'MultiConfig' => __DIR__ . '/includes/config/MultiConfig.php',
        'MultiHttpClient' => __DIR__ . '/includes/libs/MultiHttpClient.php',
@@ -1129,6 +1128,7 @@ $wgAutoloadLocalClasses = [
        'PurgeChangedPages' => __DIR__ . '/maintenance/purgeChangedPages.php',
        'PurgeJobUtils' => __DIR__ . '/includes/jobqueue/utils/PurgeJobUtils.php',
        'PurgeList' => __DIR__ . '/maintenance/purgeList.php',
+       'PurgeModuleDeps' => __DIR__ . '/maintenance/purgeModuleDeps.php',
        'PurgeOldText' => __DIR__ . '/maintenance/purgeOldText.php',
        'PurgeParserCache' => __DIR__ . '/maintenance/purgeParserCache.php',
        'QueryPage' => __DIR__ . '/includes/specialpage/QueryPage.php',
@@ -1438,7 +1438,6 @@ $wgAutoloadLocalClasses = [
        'ThumbnailRenderJob' => __DIR__ . '/includes/jobqueue/jobs/ThumbnailRenderJob.php',
        'TidyUpBug37714' => __DIR__ . '/maintenance/tidyUpBug37714.php',
        'TiffHandler' => __DIR__ . '/includes/media/Tiff.php',
-       'TimestampException' => __DIR__ . '/includes/libs/time/TimestampException.php',
        'Timing' => __DIR__ . '/includes/libs/Timing.php',
        'Title' => __DIR__ . '/includes/Title.php',
        'TitleArray' => __DIR__ . '/includes/TitleArray.php',
@@ -1583,6 +1582,7 @@ $wgAutoloadLocalClasses = [
        'Wikimedia\\Rdbms\\ConnectionManager' => __DIR__ . '/includes/libs/rdbms/connectionmanager/ConnectionManager.php',
        'Wikimedia\\Rdbms\\DBMasterPos' => __DIR__ . '/includes/libs/rdbms/database/position/DBMasterPos.php',
        'Wikimedia\\Rdbms\\DatabaseDomain' => __DIR__ . '/includes/libs/rdbms/database/DatabaseDomain.php',
+       'Wikimedia\\Rdbms\\FakeResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/FakeResultWrapper.php',
        'Wikimedia\\Rdbms\\Field' => __DIR__ . '/includes/libs/rdbms/field/Field.php',
        'Wikimedia\\Rdbms\\IBlob' => __DIR__ . '/includes/libs/rdbms/encasing/IBlob.php',
        'Wikimedia\\Rdbms\\ILBFactory' => __DIR__ . '/includes/libs/rdbms/lbfactory/ILBFactory.php',
@@ -1601,10 +1601,12 @@ $wgAutoloadLocalClasses = [
        'Wikimedia\\Rdbms\\LoadMonitorNull' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitorNull.php',
        'Wikimedia\\Rdbms\\MssqlBlob' => __DIR__ . '/includes/libs/rdbms/encasing/MssqlBlob.php',
        'Wikimedia\\Rdbms\\MssqlField' => __DIR__ . '/includes/libs/rdbms/field/MssqlField.php',
+       'Wikimedia\\Rdbms\\MssqlResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php',
        'Wikimedia\\Rdbms\\MySQLField' => __DIR__ . '/includes/libs/rdbms/field/MySQLField.php',
        'Wikimedia\\Rdbms\\MySQLMasterPos' => __DIR__ . '/includes/libs/rdbms/database/position/MySQLMasterPos.php',
        'Wikimedia\\Rdbms\\PostgresBlob' => __DIR__ . '/includes/libs/rdbms/encasing/PostgresBlob.php',
        'Wikimedia\\Rdbms\\PostgresField' => __DIR__ . '/includes/libs/rdbms/field/PostgresField.php',
+       'Wikimedia\\Rdbms\\ResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/ResultWrapper.php',
        'Wikimedia\\Rdbms\\SQLiteField' => __DIR__ . '/includes/libs/rdbms/field/SQLiteField.php',
        'Wikimedia\\Rdbms\\SessionConsistentConnectionManager' => __DIR__ . '/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManager.php',
        'Wikimedia\\Rdbms\\TransactionProfiler' => __DIR__ . '/includes/libs/rdbms/TransactionProfiler.php',
index 3520dc3..fe68a61 100644 (file)
@@ -25,7 +25,7 @@
                "ext-xml": "*",
                "liuggio/statsd-php-client": "1.0.18",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.19.2",
+               "oojs/oojs-ui": "0.19.4",
                "oyejorge/less.php": "1.7.0.10",
                "php": ">=5.5.9",
                "psr/log": "1.0.2",
@@ -41,6 +41,7 @@
                "wikimedia/running-stat": "1.1.0",
                "wikimedia/scoped-callback": "1.0.0",
                "wikimedia/utfnormal": "1.1.0",
+               "wikimedia/timestamp": "1.0.0",
                "wikimedia/wait-condition-loop": "1.0.1",
                "wikimedia/wrappedstring": "2.2.0",
                "zordius/lightncandy": "0.23"
        "autoload": {
                "psr-0": {
                        "ComposerHookHandler": "includes/composer"
-               }
+               },
+               "files": [
+                       "includes/compat/Timestamp.php"
+               ]
        },
        "autoload-dev": {
                "files": [
index 1a82faf..3b08e07 100644 (file)
@@ -4870,9 +4870,7 @@ $wgDefaultUserOptions = [
 /**
  * An array of preferences to not show for the user
  */
-$wgHiddenPrefs = [
-       'rcenhancedfilters',
-];
+$wgHiddenPrefs = [];
 
 /**
  * Characters to prevent during new account creations.
index 35c2a2d..bd92ff0 100644 (file)
@@ -21,7 +21,6 @@
  */
 
 require_once __DIR__ . '/libs/mime/defines.php';
-require_once __DIR__ . '/libs/time/defines.php';
 require_once __DIR__ . '/libs/rdbms/defines.php';
 require_once __DIR__ . '/compat/normal/UtfNormalDefines.php';
 
index 972f62d..8fe4dbe 100644 (file)
@@ -220,8 +220,10 @@ class Html {
         * Identical to rawElement(), but HTML-escapes $contents (like
         * Xml::element()).
         *
-        * @param string $element
-        * @param array $attribs
+        * @param string $element Name of the element, e.g., 'a'
+        * @param array $attribs Associative array of attributes, e.g., [
+        *   'href' => 'https://www.mediawiki.org/' ]. See expandAttributes() for
+        *   further documentation.
         * @param string $contents
         *
         * @return string
@@ -239,8 +241,10 @@ class Html {
         * Identical to rawElement(), but has no third parameter and omits the end
         * tag (and the self-closing '/' in XML mode for empty elements).
         *
-        * @param string $element
-        * @param array $attribs
+        * @param string $element Name of the element, e.g., 'a'
+        * @param array $attribs Associative array of attributes, e.g., [
+        *   'href' => 'https://www.mediawiki.org/' ]. See expandAttributes() for
+        *   further documentation.
         *
         * @return string
         */
@@ -459,7 +463,7 @@ class Html {
         *
         * @param array $attribs Associative array of attributes, e.g., [
         *   'href' => 'https://www.mediawiki.org/' ].  Values will be HTML-escaped.
-        *   A value of false means to omit the attribute.  For boolean attributes,
+        *   A value of false or null means to omit the attribute.  For boolean attributes,
         *   you can omit the key, e.g., [ 'checked' ] instead of
         *   [ 'checked' => 'checked' ] or such.
         *
index c1e5cc4..7f3649e 100644 (file)
@@ -21,6 +21,7 @@
  * @since 1.20
  * @author Tyler Romeo, 2012
  */
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * Library for creating and parsing MW-style timestamps. Based on the JS
index e57f880..8cf3af1 100644 (file)
@@ -24,6 +24,7 @@
  *
  * @file
  */
+use Wikimedia\Timestamp\TimestampException;
 
 /**
  * Handles the backend logic of merging the histories of two
index d6cfcd9..4b9435a 100644 (file)
@@ -21,6 +21,8 @@
  */
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 /**
  * @todo document
@@ -1781,6 +1783,7 @@ class Revision implements IDBAccessObject {
         *
         * @param Title $title
         * @param int $id
+        * @param int $flags
         * @return string|bool False if not found
         */
        static function getTimestampFromId( $title, $id, $flags = 0 ) {
index 53cf699..d909a65 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * List for revision table items for a single page
index 5a28b85..bf2344b 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * The TitleArray class only exists to provide the newFromResult method at pre-
  * sent.
index 668ea54..189fb40 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 class TitleArrayFromResult extends TitleArray implements Countable {
        /** @var ResultWrapper */
        public $res;
index 8fcf131..6301576 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Extension mechanism for WatchedItemQueryService
  *
index 8f18046..d24a27c 100644 (file)
@@ -59,8 +59,8 @@ class Xml {
         * Given an array of ('attributename' => 'value'), it generates the code
         * to set the XML attributes : attributename="value".
         * The values are passed to Sanitizer::encodeAttribute.
-        * Return null if no attributes given.
-        * @param array $attribs Array of attributes for an XML element
+        * Returns null or empty string if no attributes given.
+        * @param array|null $attribs Array of attributes for an XML element
         * @throws MWException
         * @return null|string
         */
index b381edc..d1be7d4 100644 (file)
@@ -24,6 +24,8 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 /**
  * This class handles printing the history page for an article. In order to
index 6d76f8c..604fdf9 100644 (file)
@@ -26,6 +26,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use Wikimedia\Timestamp\TimestampException;
 
 /**
  * This is the main API class, used for both external and internal processing.
index 06019cf..7d16af8 100644 (file)
@@ -24,6 +24,7 @@
  * @file
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * This class contains a list of pages that the client has requested.
@@ -64,6 +65,7 @@ class ApiPageSet extends ApiBase {
        private $mMissingPageIDs = [];
        private $mRedirectTitles = [];
        private $mSpecialTitles = [];
+       private $mAllSpecials = []; // separate from mAllPages to avoid breaking getAllTitlesByNamespace()
        private $mNormalizedTitles = [];
        private $mInterwikiTitles = [];
        /** @var Title[] */
@@ -1061,7 +1063,7 @@ class ApiPageSet extends ApiBase {
         * @return LinkBatch
         */
        private function getRedirectTargets() {
-               $lb = new LinkBatch();
+               $titlesToResolve = [];
                $db = $this->getDB();
 
                $res = $db->select(
@@ -1088,8 +1090,8 @@ class ApiPageSet extends ApiBase {
                        unset( $this->mPendingRedirectIDs[$rdfrom] );
                        if ( $to->isExternal() ) {
                                $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki();
-                       } elseif ( !isset( $this->mAllPages[$row->rd_namespace][$row->rd_title] ) ) {
-                               $lb->add( $row->rd_namespace, $row->rd_title );
+                       } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) {
+                               $titlesToResolve[] = $to;
                        }
                        $this->mRedirectTitles[$from] = $to;
                }
@@ -1104,7 +1106,11 @@ class ApiPageSet extends ApiBase {
                                        // What the hell. Let's just ignore this
                                        continue;
                                }
-                               $lb->addObj( $rt );
+                               if ( $rt->isExternal() ) {
+                                       $this->mInterwikiTitles[$rt->getPrefixedText()] = $rt->getInterwiki();
+                               } elseif ( !isset( $this->mAllPages[$rt->getNamespace()][$rt->getDBkey()] ) ) {
+                                       $titlesToResolve[] = $rt;
+                               }
                                $from = $title->getPrefixedText();
                                $this->mResolvedRedirectTitles[$from] = $title;
                                $this->mRedirectTitles[$from] = $rt;
@@ -1112,7 +1118,7 @@ class ApiPageSet extends ApiBase {
                        }
                }
 
-               return $lb;
+               return $this->processTitlesArray( $titlesToResolve );
        }
 
        /**
@@ -1151,12 +1157,14 @@ class ApiPageSet extends ApiBase {
                                        $titleObj = Title::newFromTextThrow( $title, $this->mDefaultNamespace );
                                } catch ( MalformedTitleException $ex ) {
                                        // Handle invalid titles gracefully
-                                       $this->mAllPages[0][$title] = $this->mFakePageId;
-                                       $this->mInvalidTitles[$this->mFakePageId] = [
-                                               'title' => $title,
-                                               'invalidreason' => $this->getErrorFormatter()->formatException( $ex, [ 'bc' => true ] ),
-                                       ];
-                                       $this->mFakePageId--;
+                                       if ( !isset( $this->mAllPages[0][$title] ) ) {
+                                               $this->mAllPages[0][$title] = $this->mFakePageId;
+                                               $this->mInvalidTitles[$this->mFakePageId] = [
+                                                       'title' => $title,
+                                                       'invalidreason' => $this->getErrorFormatter()->formatException( $ex, [ 'bc' => true ] ),
+                                               ];
+                                               $this->mFakePageId--;
+                                       }
                                        continue; // There's nothing else we can do
                                }
                        } else {
@@ -1184,8 +1192,13 @@ class ApiPageSet extends ApiBase {
                                if ( $titleObj->getNamespace() < 0 ) {
                                        // Handle Special and Media pages
                                        $titleObj = $titleObj->fixSpecialName();
-                                       $this->mSpecialTitles[$this->mFakePageId] = $titleObj;
-                                       $this->mFakePageId--;
+                                       $ns = $titleObj->getNamespace();
+                                       $dbkey = $titleObj->getDBkey();
+                                       if ( !isset( $this->mAllSpecials[$ns][$dbkey] ) ) {
+                                               $this->mAllSpecials[$ns][$dbkey] = $this->mFakePageId;
+                                               $this->mSpecialTitles[$this->mFakePageId] = $titleObj;
+                                               $this->mFakePageId--;
+                                       }
                                } else {
                                        // Regular page
                                        $linkBatch->addObj( $titleObj );
index 2d21865..87bb6a7 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * This is a base class for all Query modules.
  * It provides some common functionality such as constructing various SQL
index a8c037e..cc302dc 100644 (file)
@@ -88,6 +88,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                case 'languages':
                                        $fit = $this->appendLanguages( $p );
                                        break;
+                               case 'languagevariants':
+                                       $fit = $this->appendLanguageVariants( $p );
+                                       break;
                                case 'skins':
                                        $fit = $this->appendSkins( $p );
                                        break;
@@ -713,6 +716,49 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
+       // Export information about which page languages will trigger
+       // language conversion. (T153341)
+       public function appendLanguageVariants( $property ) {
+               $langNames = LanguageConverter::$languagesWithVariants;
+               if ( $this->getConfig()->get( 'DisableLangConversion' ) ) {
+                       // Ensure result is empty if language conversion is disabled.
+                       $langNames = [];
+               }
+               sort( $langNames );
+
+               $data = [];
+               foreach ( $langNames as $langCode ) {
+                       $lang = Language::factory( $langCode );
+                       if ( $lang->getConverter() instanceof FakeConverter ) {
+                               // Only languages which do not return instances of
+                               // FakeConverter implement language conversion.
+                               continue;
+                       }
+                       $data[$langCode] = [];
+                       ApiResult::setIndexedTagName( $data[$langCode], 'variant' );
+                       ApiResult::setArrayType( $data[$langCode], 'kvp', 'code' );
+
+                       $variants = $lang->getVariants();
+                       sort( $variants );
+                       foreach ( $variants as $v ) {
+                               $fallbacks = $lang->getConverter()->getVariantFallbacks( $v );
+                               if ( !is_array( $fallbacks ) ) {
+                                       $fallbacks = [ $fallbacks ];
+                               }
+                               $data[$langCode][$v] = [
+                                       'fallbacks' => $fallbacks,
+                               ];
+                               ApiResult::setIndexedTagName(
+                                       $data[$langCode][$v]['fallbacks'], 'variant'
+                               );
+                       }
+               }
+               ApiResult::setIndexedTagName( $data, 'lang' );
+               ApiResult::setArrayType( $data, 'kvp', 'code' );
+
+               return $this->getResult()->addValue( 'query', $property, $data );
+       }
+
        public function appendSkins( $property ) {
                $data = [];
                $allowed = Skin::getAllowedSkins();
@@ -851,6 +897,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                        'rightsinfo',
                                        'restrictions',
                                        'languages',
+                                       'languagevariants',
                                        'skins',
                                        'extensiontags',
                                        'functionhooks',
index f9de725..ab8a8a5 100644 (file)
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Returns wiki rights (license) information if available.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Returns information on available restriction (protection) types.",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Returns a list of languages MediaWiki supports (optionally localised by using <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Returns a list of language codes for which [[mw:LanguageConverter|LanguageConverter]] is enabled, and the variants supported for each.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "Returns a list of all enabled skins (optionally localised by using <var>$1inlanguagecode</var>, otherwise in the content language).",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Returns a list of parser extension tags.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Returns a list of parser function hooks.",
        "apierror-invalidexpiry": "Invalid expiry time \"$1\".",
        "apierror-invalid-file-key": "Not a valid file key.",
        "apierror-invalidlang": "Invalid language code for parameter <var>$1</var>.",
-       "apierror-invalidoldimage": "The oldimage parameter has invalid format.",
+       "apierror-invalidoldimage": "The <var>oldimage</var> parameter has an invalid format.",
        "apierror-invalidparammix-cannotusewith": "The <kbd>$1</kbd> parameter cannot be used with <kbd>$2</kbd>.",
        "apierror-invalidparammix-mustusewith": "The <kbd>$1</kbd> parameter may only be used with <kbd>$2</kbd>.",
        "apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> cannot be combined with the <var>oldid</var>, <var>pageid</var> or <var>page</var> parameters. Please use <var>title</var> and <var>text</var>.",
        "apierror-invalidparammix": "The {{PLURAL:$2|parameters}} $1 can not be used together.",
-       "apierror-invalidsection": "The section parameter must be a valid section ID or <kbd>new</kbd>.",
+       "apierror-invalidsection": "The <var>section</var> parameter must be a valid section ID or <kbd>new</kbd>.",
        "apierror-invalidsha1base36hash": "The SHA1Base36 hash provided is not valid.",
        "apierror-invalidsha1hash": "The SHA1 hash provided is not valid.",
        "apierror-invalidtitle": "Bad title \"$1\".",
index bf10140..eb155b3 100644 (file)
        "apihelp-xmlfm-description": "Producir los datos de salida en formato XML (con resaltado sintáctico en HTML).",
        "api-format-title": "Resultado de la API de MediaWiki",
        "api-format-prettyprint-header": "Esta es la representación en HTML del formato $1. HTML es adecuado para realizar tareas de depuración, pero no para utilizarlo en aplicaciones.\n\nUtiliza el parámetro <var>format</var> para modificar el formato de salida. Para ver la representación no HTML del formato $1, emplea <kbd>format=$2</kbd>.\n\nPara obtener más información, consulta la [[mw:API|documentación completa]] o la [[Special:ApiHelp/main|ayuda de API]].",
+       "api-format-prettyprint-header-only-html": "Esta es una representación en HTML destinada a la depuración, y no es adecuada para el uso de la aplicación.\n\nVéase la [[mw:API|documentación completa]] o la [[Special:ApiHelp/main|página de ayuda de la API]] para más información.",
        "api-format-prettyprint-status": "Esta respuesta se devolvería con el estado HTTP $1 $2.",
        "api-pageset-param-titles": "Una lista de títulos en los que trabajar.",
        "api-pageset-param-pageids": "Una lista de identificadores de páginas en las que trabajar.",
        "api-pageset-param-generator": "Obtener la lista de páginas en las que trabajar mediante la ejecución del módulo de consulta especificado.\n\n<strong>Nota:</strong> Los nombres de los parámetros del generador deben prefijarse con una «g», véanse los ejemplos.",
        "api-pageset-param-redirects-generator": "Resolver automáticamente las redirecciones en <var>$1titles</var>, <var>$1pageids</var>, y <var>$1revids</var> y en las páginas devueltas por <var>$1generator</var>.",
        "api-pageset-param-redirects-nogenerator": "Resolver automáticamente las redirecciones en <var>$1titles</var>, <var>$1pageids</var> y <var>$1revids</var>.",
+       "api-pageset-param-converttitles": "Convertir los títulos a otras variantes, si es necesario. Solo funciona si el idioma del contenido del wiki admite la conversión entre variantes. La conversión entre variantes está habilitada en idiomas tales como $1.",
        "api-help-title": "Ayuda de la API de MediaWiki",
        "api-help-lead": "Esta es una página de documentación autogenerada de la API de MediaWiki.\n\nDocumentación y ejemplos: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Módulo principal",
        "apierror-changeauth-norequest": "No se ha podido crear la petición de modificación.",
        "apierror-compare-inputneeded": "Se necesita un título, un identificador de página o un número de revisión tanto para el parámetro <var>from</var> como para el parámetro <var>to</var>.",
        "apierror-contentserializationexception": "La serialización de contenido falló: $1",
+       "apierror-contenttoobig": "El contenido que has suministrado supera el tamaño máximo de archivo de $1 {{PLURAL:$1|kilobytes|kilobytes}}.",
        "apierror-create-titleexists": "Los títulos existentes no se pueden proteger con <kbd>create</kbd>.",
        "apierror-csp-report": "Error de procesamiento del informe CSP: $1.",
        "apierror-databaseerror": "[$1] Error en la consulta de la base de datos.",
index 9fbc104..10f4d9f 100644 (file)
        "apihelp-query+deletedrevs-param-namespace": "Lister uniquement les pages dans cet espace de noms.",
        "apihelp-query+deletedrevs-param-limit": "Le nombre maximal de révisions à lister.",
        "apihelp-query+deletedrevs-param-prop": "Quelles propriétés obtenir :\n;revid:Ajoute l’ID de la révision supprimée.\n;parentid:Ajoute l’ID de la révision précédente de la page.\n;user:Ajoute l’utilisateur ayant fait la révision.\n;userid:Ajoute l’ID de l’utilisateur qui a fait la révision.\n;comment:Ajoute le commentaire de la révision.\n;parsedcomment:Ajoute le commentaire analysé de la révision.\n;minor:Marque si la révision est mineure.\n;len:Ajoute la longueur (en octets) de la révision.\n;sha1:Ajoute le SHA-1 (base 16) de la révision.\n;content:Ajoute le contenu de la révision.\n;token:<span class=\"apihelp-deprecated\">Obsolète.</span> Fournit le jeton de modification.\n;tags:Balises pour la révision.",
-       "apihelp-query+deletedrevs-example-mode1": "Lister les dernières révisions supprimées de des pages <kbd>Main Page</kbd> et <kbd>Talk:Main Page</kbd>, avec le contenu (mode 1).",
+       "apihelp-query+deletedrevs-example-mode1": "Lister les dernières révisions supprimées des pages <kbd>Main Page</kbd> et <kbd>Talk:Main Page</kbd>, avec le contenu (mode 1).",
        "apihelp-query+deletedrevs-example-mode2": "Lister les 50 dernières contributions de <kbd>Bob</kbd> supprimées (mode 2).",
        "apihelp-query+deletedrevs-example-mode3-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal (mode 3)",
        "apihelp-query+deletedrevs-example-mode3-talk": "Lister les 50 premières pages supprimées dans l’espace de noms {{ns:talk}} (mode 3).",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Ajoute la profondeur de bits de la version.",
        "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "Utilisé par la page Special:Upload pour obtenir de l’information sur un fichier existant. Non prévu pour être utilisé en dehors du cœur de MédiaWiki.",
        "apihelp-query+imageinfo-paramvalue-prop-badfile": "Ajoute l'indication que le fichier est sur [[MediaWiki:Bad image list]]",
-       "apihelp-query+imageinfo-param-limit": "Combien de révision de fichier renvoyer par fichier.",
+       "apihelp-query+imageinfo-param-limit": "Combien de révisions de fichier renvoyer par fichier.",
        "apihelp-query+imageinfo-param-start": "Horodatage auquel démarrer la liste.",
        "apihelp-query+imageinfo-param-end": "Horodatage auquel arrêter la liste.",
        "apihelp-query+imageinfo-param-urlwidth": "Si $2prop=url est défini, une URL vers une image à l’échelle de cette largeur sera renvoyée.\nPour des raisons de performance si cette option est utilisée, pas plus de $1 images mises à l’échelle seront renvoyées.",
index 682f9fc..7b90e0e 100644 (file)
@@ -13,7 +13,8 @@
                        "Macofe",
                        "MojoMann",
                        "Mikey641",
-                       "Esh77"
+                       "Esh77",
+                       "שמזן"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|תיעוד]]\n* [[mw:API:FAQ|שו\"ת]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api רשימת דיוור]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce הודעות על API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R באגים ובקשות]\n</div>\n<strong>מצב:</strong> כל האפשרויות שמוצגות בדף הזה אמורות לעבוד, אבל ה־API עדיין בפיתוח פעיל, ויכול להשתנות בכל זמן. עשו מינוי ל[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ רשימת הדיוור mediawiki-api-announce] להודעות על עדכונים.\n\n<strong>בקשות שגויות:</strong> כשבקשות שגויות נשלחות ל־API, תישלח כותרת HTTP עם המפתח \"MediaWiki-API-Error\" ואז גם הערך של הכותרת וגם קוד השגיאה יוגדרו לאותו ערך. למידע נוסף ר' [[mw:API:Errors_and_warnings|API: שגיאות ואזהרות]].\n\n<strong>בדיקה:</strong> לבדיקה קלה יותר של בקשות ר' [[Special:ApiSandbox]].",
        "apihelp-setpagelanguage-description": "שנה את השפה של דף",
        "apihelp-setpagelanguage-description-disabled": "שינוי השפה של דף לא מורשה בוויקי זה.\n\nהפעל את <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> על מנת להשתמש בפעולה זו",
        "apihelp-setpagelanguage-param-title": "כותרת הדף שאת שפתו ברצונך לשנות. לא אפשרי להשתמש באפשרות עם <var>$1pageid</var>.",
+       "apihelp-setpagelanguage-param-pageid": "מזהה הדף שאת שפתו ברצונך לשנות. לא אפשרי להשתמש באפשרות עם <var>$1title</var>.",
+       "apihelp-setpagelanguage-param-lang": "קוד השפה של השפה שאליה צריך לשנות את הדף. יש להשתמש ב־<kbd>default</kbd> כדי לאתחל את הדף לשפת בררת המחדל של הוויקי.",
        "apihelp-setpagelanguage-param-reason": "הסיבה לשינוי.",
        "apihelp-setpagelanguage-param-tags": "אילו תגי שינוי להחיל על העיול ביומן שמתבצע כתוצאה מהפעולה הזאת.",
        "apihelp-setpagelanguage-example-language": "שינוי השפה של <kbd>Main Page</kbd> לבסקית.",
        "apihelp-upload-param-sessionkey": "אותו דבר כמו $1filekey, מושאר לצור תאימות אחורה.",
        "apihelp-upload-param-stash": "אם זה מוגדר, השרת יסליק זמנית את הקובץ במקום להוסיף אותו למאגר.",
        "apihelp-upload-param-filesize": "גודל הקובץ של כל ההעלאה.",
-       "apihelp-upload-param-offset": "×\94×\99ס×\98 ×\94×\97ת×\99×\9b×\94 ×\91×\91×\99×\99×\98ים.",
+       "apihelp-upload-param-offset": "×\94×\99ס×\98 ×\94פ×\9c×\97 ×\91×\91תים.",
        "apihelp-upload-param-chunk": "תוכן החתיכה.",
        "apihelp-upload-param-async": "להפוך פעולות קבצים גדולות לאסינכרוניות כשאפשר.",
        "apihelp-upload-param-checkstatus": "לאחזר רק מצב העלאה עבור מפתח הקובץ שניתן.",
        "apihelp-userrights-param-user": "שם משתמש.",
        "apihelp-userrights-param-userid": "מזהה משתמש.",
        "apihelp-userrights-param-add": "הוספת המשתמש לקבוצות האלו, ואם הוא כבר חבר, עדכון זמן התפוגה של החברות בקבוצה הזאת.",
+       "apihelp-userrights-param-expiry": "חותמי־זמן תפוגה. יכולים להיות יחסיים (למשל <kbd>5 months</kbd> או <kbd>2 weeks</kbd>) או מוחלטים (למשל <kbd>2014-09-18T12:34:56Z</kbd>). אם מוגדר רק חותם־זמן אחד, הוא ישמש לכל הקבוצות שהועברו לפרמטר <var>$1add</var>. יש להשתמש ב־<kbd>infinite</kbd>‏, <kbd>indefinite</kbd>‏, <kbd>infinity</kbd>, או <kbd>never</kbd> בשביל קבוצת משתמשים שאינה פגה לעולם.",
        "apihelp-userrights-param-remove": "הסרת משתמש מהקבוצות האלו.",
        "apihelp-userrights-param-reason": "סיבה לשינוי.",
        "apihelp-userrights-param-tags": "לשנות את התגים שיוחלו על העיול ביומן הרשאות המשתמש.",
        "apihelp-userrights-example-user": "הוספת המשתמש <kbd>FooBot</kbd> לקבוצה <kbd>bot</kbd> והסרתו מהקבוצות <kbd>sysop</kbd> ו־<kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "הוספת המשתמש עם המזהה <kbd>123</kbd> לקבוצה <kbd>bot</kbd> והסרתו מהקבוצות <kbd>sysop</kbd> ו־<kbd>bureaucrat</kbd>.",
+       "apihelp-userrights-example-expiry": "להוסיף את <kbd>SometimeSysop</kbd> לקבוצה <kbd>sysop</kbd> לחודש אחד.",
        "apihelp-validatepassword-description": "לבדוק תקינות ססמה אל מול מדיניות הססמאות של הוויקי.\n\nהתקינות מדווחת כ־<samp>Good</samp> אם הססמה קבילה, <samp>Change</samp> אם הססמה יכולה לשמש לכניסה, אבל צריכה להשתנות, או <samp>Invalid</samp> אם הססמה אינה שמישה.",
        "apihelp-validatepassword-param-password": "ססמה שתקינותה תיבדק.",
        "apihelp-validatepassword-param-user": "שם משתמש, לשימוש בעת בדיקת יצירת חשבון. המשתמש ששמו ניתן צריך לא להיות קיים.",
        "apierror-blockedfrommail": "נחסמת משליחת דוא״ל.",
        "apierror-blocked": "נחסמת מעריכה.",
        "apierror-botsnotsupported": "הממשק הזה לא נתמך עבור בוטים.",
+       "apierror-cannot-async-upload-file": "הפרמטרים  <var>async</var> ו־<var>file</var> אינם יכולים להיות משולבים. אם ברצונך לבצע עיבוד אסינכרוני של הקובץ המועלה שלך, יש להעלות אותו תחילה לסליק (באמצעות הפרמטר <var>stash</var>) ואז לפרסם את הקובץ המוסלק באופן אסינכרוני (באמצעות <var>filekey</var> ו־<var>async</var>).",
        "apierror-cannotreauthenticate": "הפעולה הזאת אינה זמינה, כי הזהות שלך לא יכולה להיות מאומתת.",
        "apierror-cannotviewtitle": "אין לך הרשאה להציג את $1.",
        "apierror-cantblock-email": "אין לך הרשאה לחסום משתמשים משליחת דואר אלקטרוני דרך הוויקי.",
        "apierror-integeroutofrange-abovemax": "<var>$1</var> אינו יכול להיות גדול מ־$2 (עכשיו מוגדר $3) עבור משתמשים.",
        "apierror-integeroutofrange-belowminimum": "<var>$1</var> אינו יכול להיות גדול מ־$2 (עכשיו מוגדר $3).",
        "apierror-invalidcategory": "שם הקטגוריה שהזנת אינו תקין.",
+       "apierror-invalid-chunk": "ההיסט בתוספת הפלח הנוכחי גדולים מגודל הקובץ כפי שנטען.",
        "apierror-invalidexpiry": "זמן תפוגה בלתי־תקין \"$1\".",
        "apierror-invalid-file-key": "לא מפתח קובץ תקין.",
+       "apierror-invalidlang": "קוד שפה בלתי־תקין לפרמטר <var>$1</var>.",
+       "apierror-invalidoldimage": "הפרמטר oldimage נשלח בתסדיר בלתי־תקין.",
+       "apierror-invalidparammix-cannotusewith": "הפרמטר <kbd>$1</kbd> אינו יכול לשמש עם <kbd>$2</kbd>.",
+       "apierror-invalidparammix-mustusewith": "הפרמטר <kbd>$1</kbd> יכול לשמש רק עם <kbd>$2</kbd>.",
+       "apierror-invalidparammix-parse-new-section": "לא ניתן לשלב את <kbd>section=new</kbd> עם הפרמטרים <var>oldid</var>‏, <var>pageid</var> או <var>page</var>. נא להשתמש ב־<var>title</var> ו־<var>text</var>.",
+       "apierror-invalidparammix": "{{PLURAL:$2|הפרמטרים}} $1 אינם יכולים לשמש יחדיו.",
+       "apierror-invalidsection": "הפרמטר section חייב להיות מזהה מקטע תקין או <kbd>new</kbd>.",
+       "apierror-invalidsha1base36hash": "גיבוב ה־SHA1Base36 שסופק אינו תקין.",
+       "apierror-invalidsha1hash": "גיבוב ה־SHA1 שסופק אינו תקין.",
        "apierror-invalidtitle": "כותרת רעה \"$1\".",
+       "apierror-invalidurlparam": "ערך בלתי־תקין עבור <var>$1urlparam</var> (ערך: <kbd>$2=$3</kbd>).",
        "apierror-invaliduser": "שם משתמש בלתי־תקין \"$1\".",
+       "apierror-invaliduserid": "מזהה המשתמש <var>$1</var> אינו תקין.",
+       "apierror-maxlag-generic": "ממתין לשרת מסד נתונים: עיכוב של {{PLURAL:$1|שנייה אחת|$1 שניות}}.",
        "apierror-maxlag": "ממתין ל־$2: שיהוי של {{PLURAL:$1|שנייה אחת|$1 שניות}}.",
+       "apierror-mimesearchdisabled": "חיפוש MIME כבוי במצב קמצן.",
+       "apierror-missingcontent-pageid": "תוכן חסר עבור מזהה הדף $1.",
+       "apierror-missingparam-at-least-one-of": "דרוש {{PLURAL:$2|הפרמטר|לפחות אחד מהפרמטרים}} $1.",
+       "apierror-missingparam-one-of": "דרוש {{PLURAL:$2|הפרמטר|אחד מהפרמטרים}} $1.",
+       "apierror-missingparam": "הפרמטר <var>$1</var> צריך להיות מוגדר.",
+       "apierror-missingrev-pageid": "אין גרסה נוכחית של דף עם המזהה $1.",
+       "apierror-missingtitle-createonly": "כותרות חסרות יכולות להיות מוגנות עם <kbd>create</kbd>.",
+       "apierror-missingtitle": "הדף שנתת אינו קיים.",
+       "apierror-missingtitle-byname": "הדף $1 אינו קיים.",
+       "apierror-moduledisabled": "המודול <kbd>$1</kbd> כובה.",
+       "apierror-multival-only-one-of": "{{PLURAL:$3|רק הערך|רק אחד מתוך הערכים}} $2 מותר עבור הפרמטר <var>$1</var>.",
+       "apierror-multival-only-one": "רק ערך אחד מותר עבור הפרמטר <var>$1</var>.",
+       "apierror-multpages": "<var>$1</var> יכול לשמש רק בדף בודד.",
+       "apierror-mustbeloggedin-changeauth": "יש להיכנס לחשבון כדי לשנות נתוני אימות.",
        "apierror-mustbeloggedin-generic": "חובה להיכנס.",
        "apierror-mustbeloggedin-linkaccounts": "חובה להיכנס לחשבון כדי לקשר חשבונות.",
        "apierror-mustbeloggedin-removeauth": "חובה להיכנס לחשבון כדי להסיר מידע אימות.",
        "apierror-mustbeloggedin-uploadstash": "סליק ההעלאה זמין רק למשתמשים שנכנסו לחשבון.",
        "apierror-mustbeloggedin": "חובה להיכנס לחשבון כדי $1.",
+       "apierror-mustbeposted": "המודול <kbd>$1</kbd> דורש בקשת POST.",
+       "apierror-mustpostparams": "{{PLURAL:$2|הפרמטר הבא|הפרמטרים הבאים}} נמצאו במחרוזת השאילתה, אבל חייבים להיות ב־POST בגוף: $1.",
+       "apierror-noapiwrite": "עריכת הוויקי הזה דרך ה־API כובתה. נא לוודא שהמשפט <code dir=\"ltr\">$wgEnableWriteAPI=true;</code> כלול בקובץ <code>LocalSettings.php</code> של הוויקי.",
        "apierror-nochanges": "לא התבקשו שינויים.",
        "apierror-nodeleteablefile": "אין גרסה ישנה כזאת של הקובץ.",
        "apierror-no-direct-editing": "עריכה ישירה דרך ה־API אינה נתמכת עבור דגם התוכן $1 שמשמש ב{{GRAMMAR:תחילית|$2}}.",
        "apierror-noedit-anon": "משתמשים אלמוניים אינם יכולים לערוך דפים.",
+       "apierror-noedit": "אין לך הרשאה לערוך דפים.",
+       "apierror-noimageredirect-anon": "משתמשים אלמוניים אינם יכולים ליצור הפניות לתמונות.",
+       "apierror-noimageredirect": "אין לך הרשאה ליצור הפניות לתמונות.",
        "apierror-nosuchlogid": "אין רשומה ביומן עם המזהה $1.",
+       "apierror-nosuchpageid": "אין דף עם המזהה $1.",
+       "apierror-nosuchrcid": "לא נעשה לאחרונה שינוי עם המזהה $1.",
+       "apierror-nosuchrevid": "אין גרסה עם המזהה $1.",
+       "apierror-nosuchsection": "לא קיים מקטע $1.",
+       "apierror-nosuchsection-what": "אין מקטע $1 ב{{GRAMMAR:תחילית|$2}}.",
+       "apierror-nosuchuserid": "אין משתמש עם המזהה $1.",
+       "apierror-notarget": "לא נתת יעד תקין לפעולה הזאת.",
+       "apierror-notpatrollable": "לא ניתן לנטר את הגרסה $1 כי היא ישנה מדי.",
+       "apierror-nouploadmodule": "לא הוגדר מודול העלאה.",
+       "apierror-opensearch-json-warnings": "לא ניתן לייצג את האזהרות בתסדיר JSON של OpenSearch.",
+       "apierror-pagecannotexist": "מרחב השם אינו מתיר דפים אמתיים.",
+       "apierror-pagedeleted": "הדף הזה נמחק מאז שאחזרת את חותם הזמן שלו.",
+       "apierror-pagelang-disabled": "שינוי שפת הדף אסור בוויקי הזה.",
+       "apierror-paramempty": "הפרמטר <var>$1</var> אינו יכול להיות ריק.",
+       "apierror-parsetree-notwikitext": "<kbd>prop=parsetree</kbd> נתמך רק בתוכן קוד ויקי (wikitext).",
+       "apierror-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd> נתמך רק בתוכן קוד ויקי (wikitext). $1 משתמש במודל התוכן $2.",
+       "apierror-pastexpiry": "זמן התפוגה \"$1\" בעבר.",
+       "apierror-permissiondenied": "אין לך הרשאה $1.",
+       "apierror-permissiondenied-generic": "ההרשאה נדחתה.",
+       "apierror-permissiondenied-patrolflag": "עליך להחזיק בהרשאות <code>patrol</code> או <code>patrolmarks</code> כדי לבקש דגל מנוטר.",
+       "apierror-permissiondenied-unblock": "אין לך הרשאה לשחרר חסימה של משתמשים.",
+       "apierror-prefixsearchdisabled": "חיפוש תחילית כבוי במצב קמצן.",
+       "apierror-promised-nonwrite-api": "כותר <code>Promise-Non-Write-API-Action</code> של HTTP אינו יכול להישלח למודולי API שפועלים במצב כתיבה.",
+       "apierror-protect-invalidaction": "סוג הגנה בלתי־תקין \"$1\".",
+       "apierror-protect-invalidlevel": "קמת הגנה בלתי־תקינה \"$1\".",
+       "apierror-ratelimited": "עברת את מכסת הקצב שלך. נא להמתין זמן־מה ונסות שוב.",
+       "apierror-readapidenied": "יש צורך בהרשאת קריאה כדי להשתמש במודול הזה.",
+       "apierror-readonly": "הוויקי הזה במצב לקריאה בלבד עכשיו.",
+       "apierror-reauthenticate": "לא עברת אימות לאחרונה בשיחה הזאת, נא להתאמת מחדש.",
+       "apierror-redirect-appendonly": "ניסית לערוך במצב מעבר־אחר־הפניות (redirect-following), שצריך לשמש יחד עם <kbd>section=new</kbd>‏, <var>prependtext</var>, או <var>appendtext</var>.",
+       "apierror-revdel-mutuallyexclusive": "אותו השדה אינו יכול לשמש עם <var>hide</var> ועם <var>show</var>.",
+       "apierror-revdel-needtarget": "כותרת יעד נחוצה בשביל סוג ה־RevDel הזה.",
+       "apierror-revdel-paramneeded": "לפחות ערך אחד נחוץ בשביל <var>hide</var> או <var>show</var>.",
+       "apierror-revisions-norevids": "הפרמטר <var>revids</var> אינו יכול לשמש עם אפשרויות הרשימה (<var>$1limit</var>‏, <var>$1startid</var>‏, <var>$1endid</var>‏, <kbd>$1dir=newer</kbd>‏, <var>$1user</var>‏, <var>$1excludeuser</var>‏, <var>$1start</var>, ו־<var>$1end</var>).",
+       "apierror-revisions-singlepage": "<var>titles</var>‏, <var>pageids</var> או מחולל שימשו לאספקת דפים מרובים, אבל הפרמטרים <var>$1limit</var>‏, <var>$1startid</var>‏, <var>$1endid</var>‏, <kbd>$1dir=newer</kbd>‏, <var>$1user</var>‏, <var>$1excludeuser</var>‏, <var>$1start</var>, ו־<var>$1end</var> יכולים לשמש רק בדף בודד.",
+       "apierror-revwrongpage": "הגרסה $1 אינה גרסה של $2.",
+       "apierror-searchdisabled": "חיפוש <var>$1</var> כבוי.",
+       "apierror-sectionreplacefailed": "לא היה אפשר למזג את המקטע המעודכן.",
+       "apierror-sectionsnotsupported": "מקטעים אינם נתמכים במודל התוכן $1.",
+       "apierror-sectionsnotsupported-what": "מקטעים אינם נתמכים ב־$1.",
+       "apierror-show": "פרמטר לא נכון – אי־אפשר לספק ערכים שמבטלים זה את זה.",
+       "apierror-siteinfo-includealldenied": "לא ניתן להציג את המידע של כל השרתים אלא אם <var dir=\"ltr\">$wgShowHostNames</var> מוגדר להיות true.",
+       "apierror-sizediffdisabled": "ההבדל בגודל כבוי במצב קמצן.",
+       "apierror-spamdetected": "העריכה שלך סורבה כי הכילה חלק ספאם: <code>$1</code>.",
+       "apierror-specialpage-cantexecute": "אין לך הרשאה להציג את התוצאות של הדף המיוחד הזה.",
+       "apierror-stashedfilenotfound": "לא היה אפשר למצור את הקובץ בסליק: $1.",
+       "apierror-stashedit-missingtext": "לא נמצא טקסט מוסלק עם הגיבוב שניתן.",
+       "apierror-stashfailed-complete": "העלאה מפולחת הושלמה, יש לבדוק את המצב בשביל לראות פרטים.",
+       "apierror-stashfailed-nosession": "אין שיחת העלאה מפולחת עם המפתח הזה.",
+       "apierror-stashfilestorage": "לא היה אפשר לאחסן את ההעלאה בסליק: $1",
        "apierror-stashinvalidfile": "קובץ מוסלק בלתי־תקין.",
        "apierror-stashnosuchfilekey": "אין מפתח קובץ כזה: $1.",
        "apierror-stashpathinvalid": "מפתח קובץ מתסדיר בלתי־הולם או בלתי־תקין באופן אחר: $1.",
        "apierror-stashwrongowner": "בעלים בלתי־תקין: $1",
        "apierror-stashzerolength": "קובץ באורך אפס, ואל יכול משוחזר בסליק: $1.",
        "apierror-systemblocked": "נחסמת אוטומטית על־ידי מדיה־ויקי.",
+       "apierror-templateexpansion-notwikitext": "הרחבת תבניות נתמכת רק בתוכן קוד ויקי (wikitext). $1 משתמש במודל התוכן $2.",
+       "apierror-toofewexpiries": "{{PLURAL:$1|ניתן חותם זמן תפוגה אחד|ניתנו $1 חותמי זמן תפוגה}} כאשר {{PLURAL:$2|היה נחוץ אחד|היו נחוצים $1}}.",
+       "apierror-unknownaction": "הפעולה שניתנה, <kbd>$1</kbd>, אינה מוכרת.",
+       "apierror-unknownerror-editpage": "שגיאת EditPage בלתי־ידועה: $1.",
        "apierror-unknownerror-nocode": "שגיאה בלתי־ידועה.",
        "apierror-unknownerror": "שגיאה בלתי ידועה: \"$1\".",
        "apierror-unknownformat": "תסדיר בלתי־ידוע \"$1\".",
+       "apierror-unrecognizedparams": "{{PLURAL:$2|פרמטר בלתי־מוכר|פרמטרים בלתי־מוכרים}}: $1.",
+       "apierror-unrecognizedvalue": "לפרמטר <var>$1</var> יש ערך בלתי־מוכר: $2.",
+       "apierror-unsupportedrepo": "מאגר קבצים מקומי אינו תומך בשאילתה לכל התמונות.",
        "apierror-upload-filekeyneeded": "חובה לספק <var>filekey</var> כאשר <var>offset</var> אינו אפס.",
        "apierror-upload-filekeynotallowed": "לא ניתן לספק <var>filekey</var> כאשר <var>offset</var> הוא 0.",
+       "apierror-upload-inprogress": "העלאה מתוך סליק כבר התחילה.",
        "apierror-upload-missingresult": "אין תוצאות בנתוני מצב.",
+       "apierror-urlparamnormal": "לא היה אפשר לנרמל את פרמטרי התמונה עבור $1.",
        "apierror-writeapidenied": "אין לך הרשאה לערוך את הוויקי הזה דרך ה־API.",
        "apiwarn-alldeletedrevisions-performance": "לביצועים טובים יותר בעת יצירת כותרת, יש להשתמש ב־<kbd>$1dir=newer</kbd>.",
        "apiwarn-badurlparam": "לא היה אפשר לפענח את <var>$1urlparam</var> עבור $2. משתמשים רק ב־width ו־height.",
        "apiwarn-deprecation-expandtemplates-prop": "מכיוון שלא ניתנו ערכים לפרמטר <var>prop</var>, תסדיר מיושן ישמש לפלט. התסדיר הזה מיושן, ובעתיד יינתן ערך בררת מחדל לפרמטר <var>prop</var>, כך שתמיד ישמש התסדיר החדש.",
        "apiwarn-deprecation-httpsexpected": "משמש HTTP כשהיה צפוי HTTPS.",
        "apiwarn-deprecation-login-botpw": "כניסה לחשבון עיקרי (main-account) דרך <kbd>action=login</kbd> מיושנת ועלולה להפסיק לעבוד ללא אזהרה נוספת. כדי להמשיך להיכנס עם <kbd>action=login</kbd>, ר' [[Special:BotPasswords]]. כדי להמשיך באופן מאובטח באמצעות חשבון עיקרי, ר' <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-nobotpw": "כניסה בחשבון ראשי עם <kbd>action=login</kbd> מיושנת ויכולה להפסיק לעבוד ללא אזהרה. כדי להיכנס באופן מאובטח, ר' <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-token": "אחזור אסימון דרך <kbd>action=login</kbd> מיושן. נא להשתמש ב־<kbd>action=query&meta=tokens&type=login</kbd> במקום זה.",
        "apiwarn-deprecation-parameter": "הפרמטר <var>$1</var> מיושן.",
        "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> מיושן מאז מדיה־ויקי 1.28. יש להשתמש ב־<kbd>prop=headhtml</kbd> בעת יצירת מסמכי HTML חדשים, או ב־<kbd>prop=modules|jsconfigvars</kbd> בעת עדכון מסמך בצד הלקוח.",
        "apiwarn-redirectsandrevids": "פתרון הפניות לא יכול לשמש יחד עם הפרמטר <var>revids</var>. הפניות ש־<var>revids</var> מצביע אליהן לא נפתרו.",
        "apiwarn-tokennotallowed": "הפעולה \"$1\" אינה מותרת למשתמש הנוכחי.",
        "apiwarn-tokens-origin": "לא ניתן לקבל אסימונים כשמדיניות המקור הזהה אינה חלה.",
-       "apiwarn-toomanyvalues": "יותר מדי ערכים סופקו לפרמטר <var>$1</var>: המגבלה היא $2.",
+       "apiwarn-toomanyvalues": "יותר מדי ערכים סופקו לפרמטר <var>$1</var>. המגבלה היא $2.",
        "apiwarn-truncatedresult": "התוצאה נחתכה כי אחרת היא הייתה ארוכה מהמגבלה של $1 בתים.",
        "apiwarn-unclearnowtimestamp": "העברת \"$2\" בתור פרמטר חותם־זמן <var>$1</var> הוצהרה בתור מיושנת. אם מסיבה כלשהי אתם צריכים להגדיר במפורש את הזמן הנוכחי ללא חישובו בצד הלקוח, יש להשתמש ב־<kbd>now</kbd>.",
        "apiwarn-unrecognizedvalues": "לפרמטר <var>$1</var> היתנ ג{{PLURAL:$3|ניתן ערך בלתי־ידוע|ניתנו ערכים בלתי־ידועים}}: $2.",
index 3abfdeb..0d903ed 100644 (file)
@@ -13,8 +13,8 @@
        "apihelp-main-param-maxage": "Задајте му олку секунди на заглавието за контрола HTTP-меѓускладот <code>s-maxage</code>. Грешките никогаш не се чуваат во меѓускладот.",
        "apihelp-main-param-assert": "Провери дали корисникот е најавен ако е зададено <kbd>user</kbd> или дали го има корисничкото право на бот, ако е зададено <kbd>bot</kbd>.",
        "apihelp-main-param-requestid": "Тука внесената вредност ќе биде вклучена во извештајот. Може да се користи за разликување на барањата.",
-       "apihelp-main-param-servedby": "Вклучи го домаќинското име што го услужило барањето во резултатите.",
-       "apihelp-main-param-curtimestamp": "Ð\91клÑ\83Ñ\87и Ñ\82ековно Ð²Ñ\80еме Ð¸ Ð²Ñ\80еме Ð¸ Ð´Ð°Ñ\82Ñ\83м Ð²Ð¾ Ñ\80езÑ\83лÑ\82аÑ\82от.",
+       "apihelp-main-param-servedby": "Вклучи го домаќинското име што го услужило барањето во исходот.",
+       "apihelp-main-param-curtimestamp": "Ð\92клÑ\83Ñ\87и Ñ\82ековно Ð²Ñ\80еме Ð¸ Ð²Ñ\80еме Ð¸ Ð´Ð°Ñ\82Ñ\83м Ð²Ð¾ Ð¸Ñ\81Ñ\85одот.",
        "apihelp-main-param-origin": "Кога му пристапувате на Пирлогот користејќи повеќедоменско AJAX-барање (CORS), задајте му го на ова изворниот домен. Ова мора да се вклучи во секое подготвително барање и затоа мора да биде дел од URI на барањето (не главната содржина во POST). Ова мора точно да се совпаѓа со еден од изворниците на заглавието Origin:, така што мора да е зададен на нешто како <kbd>https://mk.wikipedia.org</kbd>  or <kbd>https://meta.wikimedia.org</kbd>. Ако овој параметар не се совпаѓа со заглавието <code>Origin</code>:, ќе се појави одговор 403. Ако се совпаѓа, а изворникот е на бел список (на допуштени), тогаш ќе се зададе заглавието <code>Access-Control-Allow-Origin</code>.",
        "apihelp-main-param-uselang": "Јазик за преведување на пораките. Список на јазични кодови ќе најдете на <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> со <kbd>siprop=languages</kbd> или укажете <kbd>user</kbd> за да го користите тековно зададениот јазик корисникот, или пак укажете <kbd>content</kbd> за да го користите јазикот на содржината на ова вики.",
        "apihelp-block-description": "Блокирај корисник.",
        "apihelp-expandtemplates-param-title": "Наслов на страница.",
        "apihelp-expandtemplates-param-text": "Викитекст за претворање.",
        "apihelp-expandtemplates-param-revid": "Назнака на преработката, за <nowiki>{{REVISIONID}}</nowiki> и слични променливи.",
-       "apihelp-expandtemplates-param-prop": "Кои информации треба да ги добиете:\n\nИмајте на ум дека ако не изберете никаква вредност, резултатот ќе го содржи викитекстот, но изводот ќе биде во застарен формат.",
+       "apihelp-expandtemplates-param-prop": "Кои информации треба да ги добиете:\n\nИмајте на ум дека ако не изберете никаква вредност, исходот ќе го содржи викитекстот, но изводот ќе биде во застарен формат.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "Проширениот викитекст.",
        "apihelp-expandtemplates-param-includecomments": "Дали во изводот да се вклучени HTML-коментари.",
        "apihelp-expandtemplates-param-generatexml": "Создај XML-дрво на расчленување (заменето со $1prop=parsetree).",
        "apihelp-feedcontributions-param-deletedonly": "Прикажувај само избришани придонеси.",
        "apihelp-feedcontributions-param-toponly": "Прикажувај само последни преработки.",
        "apihelp-feedcontributions-param-newonly": "Прикажувај само новосоздадени страници",
+       "apihelp-feedcontributions-param-hideminor": "Сокриј ситни уредувања.",
        "apihelp-feedcontributions-param-showsizediff": "Покажувај ја големинската разлика меѓу преработките.",
        "apihelp-feedcontributions-example-simple": "Покажувај придонеси на <kbd>Пример</kbd>.",
        "apihelp-feedrecentchanges-description": "Дава канал со скорешни промени.",
        "apihelp-feedrecentchanges-param-feedformat": "Форматот на каналот.",
-       "apihelp-feedrecentchanges-param-namespace": "Ð\9dа ÐºÐ¾Ñ\98 Ð¸Ð¼ÐµÐ½Ñ\81ки Ð¿Ñ\80оÑ\81Ñ\82оÑ\80 Ð´Ð° Ñ\81е Ð¾Ð³Ñ\80аниÑ\87аÑ\82 Ñ\80езÑ\83лÑ\82аÑ\82иÑ\82е.",
+       "apihelp-feedrecentchanges-param-namespace": "Ð\9dа ÐºÐ¾Ñ\98 Ð¸Ð¼ÐµÐ½Ñ\81ки Ð¿Ñ\80оÑ\81Ñ\82оÑ\80 Ð´Ð° Ñ\81е Ð¾Ð³Ñ\80аниÑ\87и Ð¸Ñ\81Ñ\85одоÑ\82.",
        "apihelp-feedrecentchanges-param-invert": "Сите именски простори освен избраниот.",
        "apihelp-feedrecentchanges-param-associated": "Вклучи придружни именски простори (разговор или главен).",
-       "apihelp-feedrecentchanges-param-days": "Ð\9dа ÐºÐ¾Ð¸ Ð´ÐµÐ½Ð¾Ð²Ð¸ Ð´Ð° Ñ\81е Ð¾Ð³Ñ\80аниÑ\87аÑ\82 Ñ\80езÑ\83лÑ\82аÑ\82ите.",
+       "apihelp-feedrecentchanges-param-days": "Ð\9dа ÐºÐ¾Ð¸ Ð´ÐµÐ½Ð¾Ð²Ð¸ Ð´Ð° Ñ\81е Ð¾Ð³Ñ\80аниÑ\87аÑ\82 Ñ\81Ñ\82авките.",
        "apihelp-feedrecentchanges-param-limit": "Највеќе ставки во исходот за прикажување.",
        "apihelp-feedrecentchanges-param-from": "Прикажи ги промените оттогаш.",
        "apihelp-feedrecentchanges-param-hideminor": "Скриј ги ситните промени.",
        "apihelp-feedrecentchanges-param-hideliu": "Скриј ги промените направени од регистрирани корисници.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Скриј ги испатролираните промени.",
        "apihelp-feedrecentchanges-param-hidemyself": "Скриј ги промените на тековниот корисник.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Сокриј префрлања во други категории.",
        "apihelp-feedrecentchanges-param-tagfilter": "Филтрирање по ознака.",
        "apihelp-feedrecentchanges-param-target": "Прикажи само промени на страници што водат од оваа.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Наместо тоа, прикажи ги промените на страниците поврзани со избраната страница.",
+       "apihelp-feedrecentchanges-param-categories": "Прикажи само промени на страниците во сите овие категории.",
+       "apihelp-feedrecentchanges-param-categories_any": "Прикажи само промени на страниците во било која од категориите.",
        "apihelp-feedrecentchanges-example-simple": "Прикажи скорешни промени",
        "apihelp-feedrecentchanges-example-30days": "Прикажувај скорешни промени 30 дена",
        "apihelp-feedwatchlist-description": "Дава канал од набљудуваните.",
        "apihelp-help-param-wrap": "Обвиткај го изводот како станрадна одѕивна структура од прилотот.",
        "apihelp-help-param-toc": "Вклучи табела со содржина во HTML-изводот.",
        "apihelp-help-example-main": "Помош за главниот модул",
+       "apihelp-help-example-submodules": "Помош за <kbd>action=query</kbd> и сите негови подмодули.",
        "apihelp-help-example-recursive": "Сета помош на една страница",
        "apihelp-help-example-help": "Помош за самиот помошен модул",
        "apihelp-help-example-query": "Помош за два подмодула за барања",
        "apihelp-imagerotate-description": "Сврти една или повеќе слики.",
        "apihelp-imagerotate-param-rotation": "За колку степени да се сврти надесно.",
+       "apihelp-imagerotate-param-tags": "Ознаки за примена врз ставката во дневникот на подигања.",
        "apihelp-imagerotate-example-simple": "Сврти ја <kbd>Податотека:Пример.png</kbd> за <kbd>90</kbd> степени.",
        "apihelp-imagerotate-example-generator": "Сврти ги сите слики во <kbd>Категорија:Некоја</kbd> за <kbd>180</kbd> степени.",
        "apihelp-import-description": "Увези страница од друго вики или од XML-податотека.\n\nИмајте на ум дека POST на HTTP мора да се изведе како подигање на податотеката (т.е. користејќи повеќеделни податоци/податоци од образец) кога ја испраќате податотеката за параметарот <var>xml</var>.",
-       "apihelp-import-param-summary": "Увези Ð¾пис.",
+       "apihelp-import-param-summary": "Ð\9eпиÑ\81 Ð½Ð° Ñ\83возоÑ\82 Ð½Ð° Ð´Ð½ÐµÐ²Ð½Ð¸Ñ\87ки Ð·Ð°пис.",
        "apihelp-import-param-xml": "Подигната XML-податотека.",
        "apihelp-import-param-interwikisource": "За меѓујазични увози: од кое вики да се увезе.",
        "apihelp-import-param-interwikipage": "За меѓујазични увози: страница за увоз.",
        "apihelp-move-example-move": "Премести го <kbd>Badtitle</kbd> на <kbd>Goodtitle</kbd>, неоставајќи пренасочување",
        "apihelp-opensearch-description": "Пребарување на викито со протоколот OpenSearch.",
        "apihelp-opensearch-param-search": "Низа за пребарување.",
-       "apihelp-opensearch-param-limit": "Ð\9dаÑ\98веÑ\9cе Ñ\80езÑ\83лÑ\82аÑ\82и за прикажување.",
+       "apihelp-opensearch-param-limit": "Ð\9dаÑ\98веÑ\9cе Ñ\81Ñ\82авки за прикажување.",
        "apihelp-opensearch-param-namespace": "Именски простори за пребарување.",
        "apihelp-opensearch-param-suggest": "Не прави ништо ако <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> е неточно.",
-       "apihelp-opensearch-param-redirects": "Ð\9aако Ð´Ð° Ñ\81е Ñ\80абоÑ\82и Ñ\81о Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aа:\n;return: Ð\94аÑ\98 Ð³Ð¾ Ñ\81амоÑ\82о Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе.\n;resolve: Ð\94аÑ\98 Ñ\98а Ñ\86елнаÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а. Ð\9cоже Ð´Ð° Ð´Ð°Ð´Ðµ Ð¿Ð¾Ð¼Ð°Ð»ÐºÑ\83 Ð¾Ð´ $1limit Ñ\80езÑ\83лÑ\82аÑ\82и.\nОд историски причини, по основно е „return“ за $1format=json и „resolve“ за други формати.",
+       "apihelp-opensearch-param-redirects": "Ð\9aако Ð´Ð° Ñ\81е Ñ\80абоÑ\82и Ñ\81о Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aа:\n;return: Ð\94аÑ\98 Ð³Ð¾ Ñ\81амоÑ\82о Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе.\n;resolve: Ð\94аÑ\98 Ñ\98а Ñ\86елнаÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а. Ð\9cоже Ð´Ð° Ð´Ð°Ð´Ðµ Ð¿Ð¾Ð¼Ð°Ð»ÐºÑ\83 Ð¾Ð´ $1limit Ñ\81Ñ\82авки.\nОд историски причини, по основно е „return“ за $1format=json и „resolve“ за други формати.",
        "apihelp-opensearch-param-format": "Формат на изводот.",
        "apihelp-opensearch-example-te": "Најди страници што почнуваат со <kbd>Те</kbd>.",
        "apihelp-options-description": "Смени ги нагодувањата на тековниот корисник.\n\nМожат да се зададат само можностите заведени во јадрото или во едно од воспоставените додатоци, или пак можности со клуч кој ја има претставката <code>userjs-</code> (предвиден за употреба од кориснички скрипти).",
        "apihelp-query+revisions-example-first5-user": "Дај ги првите 5 преработки на <kbd>Главна страница</kbd> кои се направени од корисникот „зададен од МедијаВики“ (<kbd>MediaWiki default</kbd>)",
        "apihelp-query+search-example-simple": "Побарај <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Побарај го <kbd>meaning</kbd> по текстовите.",
-       "apihelp-query+search-example-generator": "Дај информации за страниците што излегуваат во резултатите од пребарувањето на <kbd>meaning</kbd>.",
+       "apihelp-query+search-example-generator": "Дај информации за страниците што излегуваат во исходот од пребарувањето на <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-description": "Дај општи информации за мрежното место.",
        "apihelp-upload-param-filename": "Целно име на податотеката.",
        "apihelp-upload-param-comment": "Коментар при подигање. Се користи и како првичен текст на страницата за нови податотеки ако не е укажано <var>$1text</var>.",
        "apihelp-xml-param-xslt": "Ако е укажано, ја додава именуваната страница како XSL-стилска страница. Вредноста мора да биде наслов во именскиот простор „{{ns:MediaWiki}}“ што ќе завршува со <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Ако е укажано, додава именски простор XML.",
        "apihelp-xmlfm-description": "Давај го изводот во XML-формат (подобрен испис во HTML).",
-       "api-format-title": "РезÑ\83лÑ\82аÑ\82 од Извршникот на МедијаВики",
+       "api-format-title": "Ð\98Ñ\81Ñ\85од од Извршникот на МедијаВики",
        "api-format-prettyprint-header": "Ова е HTML-претстава на форматот $1. HTML е добар за отстранување на грешки, но не е погоден за употреба во извршник.\n\nУкажете го параметарот <var>format</var> за да го смените изводниот формат. За да ги видите претставите на форматот $1 вон HTML, задајте <kbd>format=$2</kbd>.\n\nПовеќе информации ќе најдете на [[mw:API|целосната документација]], или пак [[Special:ApiHelp/main|помош со извршникот]].",
        "api-pageset-param-titles": "Список на наслови на кои ќе се работи",
        "api-pageset-param-pageids": "Список на назнаки за страници на кои ќе се работи",
        "api-help-param-token": "Шифра „$1“ добиена од [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
        "api-help-param-token-webui": "За складност, се прифаќа и шифрата што се користи за обичниот кориснички посредник.",
        "api-help-param-disabled-in-miser-mode": "Исклучено поради [[mw:Manual:$wgMiserMode|скржавиот режим]].",
-       "api-help-param-limited-in-miser-mode": "<strong>Напомена:</strong> Бидејќи сте во [[mw:Manual:$wgMiserMode|скржав режим]], користејќи го ова може да добиете помалку од <var>$1limit</var> резултати пред да продолжите; во крајни случаи може да не добиете ниеден резултат.",
+       "api-help-param-limited-in-miser-mode": "<strong>Напомена:</strong> Бидејќи сте во [[mw:Manual:$wgMiserMode|скржав режим]], користејќи го ова може да добиете помалку од <var>$1limit</var> исходни ставки пред да продолжите; во крајни случаи може да не добиете ниедна ставка.",
        "api-help-param-direction": "Во која насока да се набројува:\n;понови:Прво најстарите. Напомена: $1start мора да биде пред $1end.\n;постари:Прво најновите (по основно). Напомена: $1start мора да биде подоцна од $1end.",
        "api-help-param-continue": "Употребете го ова за да продолжите кога има повеќе расположиви ставки.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(нема опис)</span>",
index d4380c2..cca3a3c 100644 (file)
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "{{doc-apihelp-paramvalue|query+siteinfo|prop|rightsinfo}}",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "{{doc-apihelp-paramvalue|query+siteinfo|prop|restrictions}}",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "{{doc-apihelp-paramvalue|query+siteinfo|prop|languages}}",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "{{doc-apihelp-paramvalue|query+siteinfo|prop|languagevariants}}",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "{{doc-apihelp-paramvalue|query+siteinfo|prop|skins}}",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "{{doc-apihelp-paramvalue|query+siteinfo|prop|extensiontags}}",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "{{doc-apihelp-paramvalue|query+siteinfo|prop|functionhooks}}",
index 2415721..6f2bcd6 100644 (file)
@@ -9,7 +9,8 @@
                        "Macofe",
                        "Jasonzhuocn",
                        "Winstonyin",
-                       "Arthur2e5"
+                       "Arthur2e5",
+                       "烈羽"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|說明文件]]\n* [[mw:API:FAQ|常見問題]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 郵寄清單]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 報告錯誤及請求功能]\n</div>\n<strong>狀態資訊:</strong>本頁所展示的所有功能都應正常工作,但是API仍在開發當中,將會隨時變化。請訂閱[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 郵件清單]以便得到更新通知。\n\n<strong>錯誤的請求:</strong>當API收到錯誤的請求時,會發出以「MediaWiki-API-Error」為鍵的HTTP頭欄位,隨後頭欄位的值與錯誤碼將會被設為相同的值。詳細資訊請參閱[[mw:API:Errors_and_warnings|API: 錯誤與警告]]。\n\n<strong>測試:</strong>要簡化API請求的測試過程,請見[[Special:ApiSandbox]]。",
        "apihelp-expandtemplates-param-text": "要轉換的 Wikitext。",
        "apihelp-feedcontributions-description": "回傳使用者貢獻 Feed。",
        "apihelp-feedcontributions-param-feedformat": "Feed 的格式。",
+       "apihelp-feedcontributions-param-hideminor": "隱藏小修改。",
        "apihelp-feedcontributions-param-showsizediff": "顯示修訂版本之間的差異大小。",
        "apihelp-feedcontributions-example-simple": "返回使用者<kbd>Example</kbd>的貢獻。",
        "apihelp-feedrecentchanges-description": "返回最近變更摘要。",
index 349b773..0a07a93 100644 (file)
@@ -26,6 +26,9 @@
  * @copyright © 2011, Antoine Musso
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
+
 /**
  * Class for fetching backlink lists, approximate backlink counts and
  * partitions. This is a shared cache.
index d773fff..77ab2d5 100644 (file)
@@ -22,6 +22,7 @@
  */
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * Class representing a list of titles
index 86c07ba..cffb59a 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Feed to Special:RecentChanges and Special:RecentChangesLiked
  *
index bc7d721..3f4ad14 100644 (file)
@@ -23,6 +23,7 @@
  */
 use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 class ChangesList extends ContextSource {
        /**
index d02eec8..3aad60e 100644 (file)
@@ -531,7 +531,7 @@ class EnhancedChangesList extends ChangesList {
                                $links['total-changes'] = $this->linkRenderer->makeKnownLink(
                                        $block0->getTitle(),
                                        new HtmlArmor( $nchanges[$n] ),
-                                       [],
+                                       [ 'class' => 'mw-changeslist-groupdiff' ],
                                        $queryParams + [
                                                'diff' => $currentRevision,
                                                'oldid' => $last->mAttribs['rc_last_oldid'],
@@ -541,7 +541,7 @@ class EnhancedChangesList extends ChangesList {
                                        $links['total-changes-since-last'] = $this->linkRenderer->makeKnownLink(
                                                        $block0->getTitle(),
                                                        new HtmlArmor( $sinceLastVisitMsg[$sinceLast] ),
-                                                       [],
+                                                       [ 'class' => 'mw-changeslist-groupdiff' ],
                                                        $queryParams + [
                                                                'diff' => $currentRevision,
                                                                'oldid' => $unvisitedOldid,
@@ -563,7 +563,7 @@ class EnhancedChangesList extends ChangesList {
                        $links['history'] = $this->linkRenderer->makeKnownLink(
                                        $block0->getTitle(),
                                        new HtmlArmor( $this->message['enhancedrc-history'] ),
-                                       [],
+                                       [ 'class' => 'mw-changeslist-history' ],
                                        $params
                                );
                }
@@ -718,7 +718,7 @@ class EnhancedChangesList extends ChangesList {
                                        . $this->linkRenderer->makeKnownLink(
                                                $pageTitle,
                                                new HtmlArmor( $this->message['hist'] ),
-                                               [],
+                                               [ 'class' => 'mw-changeslist-history' ],
                                                $query
                                        ) )->escaped();
                return $retVal;
index 2c5c8b1..8ce21f5 100644 (file)
@@ -186,7 +186,7 @@ class RCCacheEntryFactory {
                        $curLink = $curMessage;
                } else {
                        $curUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
-                       $curLink = "<a href=\"$curUrl\">$curMessage</a>";
+                       $curLink = "<a class=\"mw-changeslist-diff-cur\" href=\"$curUrl\">$curMessage</a>";
                }
 
                return $curLink;
@@ -229,16 +229,18 @@ class RCCacheEntryFactory {
                                return $diffMessage;
                        }
                        $diffUrl = htmlspecialchars( $pageTitle->getLinkURL( $queryParams ) );
-                       $diffLink = "<a href=\"$diffUrl\">$diffMessage</a>";
+                       $diffLink = "<a class=\"mw-changeslist-diff\" href=\"$diffUrl\">$diffMessage</a>";
                } else {
                        $diffUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
-                       $diffLink = "<a href=\"$diffUrl\">$diffMessage</a>";
+                       $diffLink = "<a class=\"mw-changeslist-diff\" href=\"$diffUrl\">$diffMessage</a>";
                }
 
                return $diffLink;
        }
 
        /**
+        * Builds the link to the previous version
+        *
         * @param RecentChange $cacheEntry
         * @param bool $showDiffLinks
         *
@@ -257,7 +259,7 @@ class RCCacheEntryFactory {
                        $lastLink = $this->linkRenderer->makeKnownLink(
                                $cacheEntry->getTitle(),
                                new HtmlArmor( $lastMessage ),
-                               [],
+                               [ 'class' => 'mw-changeslist-diff' ],
                                $this->buildDiffQueryParams( $cacheEntry )
                        );
                }
diff --git a/includes/compat/Timestamp.php b/includes/compat/Timestamp.php
new file mode 100644 (file)
index 0000000..bd25432
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+// This file is loaded by composer.json#autoload.files instead of autoload.php,
+// because PHP's class loader does not support autoloading an alias for a class that
+// isn't already loaded. See also AutoLoaderTest and ClassCollector.
+
+// By using an autoload file, this will trigger directly at runtime outside any class
+// loading context. This file will then register the alias and, as class_alias() does
+// by default, it will trigger a plain autoload for the destination class.
+
+// The below uses string concatenation for the alias to avoid being seen by ClassCollector,
+// which would insist on adding it to autoload.php, after which AutoLoaderTest will
+// complain about class_alias() not being in the target class file.
+
+/**
+ * @deprecated since 1.29
+ * @since 1.20
+ */
+class_alias( Wikimedia\Timestamp\TimestampException::class, 'Timestamp' . 'Exception' );
index 344aa3d..ef5a8fe 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup Database
  */
 use Wikimedia\Rdbms\Blob;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * @ingroup Database
index 000b526..0a9755d 100644 (file)
@@ -336,6 +336,21 @@ class DeferredUpdates {
                return count( self::$preSendUpdates ) + count( self::$postSendUpdates );
        }
 
+       /**
+        * @param integer $stage DeferredUpdates constant (PRESEND, POSTSEND, or ALL)
+        * @since 1.29
+        */
+       public static function getPendingUpdates( $stage = self::ALL ) {
+               $updates = [];
+               if ( $stage === self::ALL || $stage === self::PRESEND ) {
+                       $updates = array_merge( $updates, self::$preSendUpdates );
+               }
+               if ( $stage === self::ALL || $stage === self::POSTSEND ) {
+                       $updates = array_merge( $updates, self::$postSendUpdates );
+               }
+               return $updates;
+       }
+
        /**
         * Clear all pending updates without performing them. Generally, you don't
         * want or need to call this. Unit tests need it though.
index 3949764..e41ab54 100644 (file)
@@ -27,6 +27,8 @@
  * @defgroup Dump Dump
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * @ingroup SpecialPage Dump
  */
index d49ae7b..d5e29ab 100644 (file)
@@ -22,6 +22,8 @@
  * @ingroup FileRepo
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A repository that stores files in the local filesystem and registers them
  * in the wiki's own database. This is the most commonly used repository class.
index 5275548..411b2d0 100644 (file)
        "config-install-subscribe-fail": "قادر تصدیق اعلام مدیاویکی نیست:$1",
        "config-install-subscribe-notpossible": "سی‌یوآر‌ال نصب نشده‌است و <code>allow_url_fopen</code> در دسترس نیست.",
        "config-install-mainpage": "ایجاد صفحهٔ اصلی با محتوای پیش‌فرض",
+       "config-install-mainpage-exists": "صفحهٔ اصلی موجود است، رها شد",
        "config-install-extension-tables": "ایجاد جداول برای افزونه‌های فعال",
        "config-install-mainpage-failed": "قادر به درج صفحهٔ اصلی نمی‌باشد:$1",
        "config-install-done": "'''تبریک!'''\nبا موفقیت مدیاویکی را نصب کردید.\nبرنامه نصب‌کننده پرونده <code>LocalSettings.php</code> را درست کرد.\nکه شامل تمام تنظیمات می‌باشد.\n\nشما نیاز به دریافت آن دارید و آن را در پایهٔ نصب ویکی قرار دهید (همان پوشهٔ index.php). دریافت باید به صورت خودکار شروع شده‌باشد.\n\nاگر دریافت شروع نشد یا اگر آن را لغو کردید با کلیک روی پیوند زیر می‌توانید آن را دریافت کنید:\n\n$3\n\n'''توجه داشته باشید:''' اگر این را الآن انجام ندهید، این پرونده تولیدشده در صورتی که نصب را بدون دریافت آن تمام کردید بعداً در اختیار شما قرار نخواهد گرفت.\n\nوقتی انجام شد شما می‌توانید '''[$2 وارد ویکی شوید]'''.",
        "config-nofile": "پروندهٔ «$1» یافت نشد. آیا حذف شده‌است؟",
        "config-extension-link": "آیا می‌دانستید که ویکی شما [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions] را پشتیبانی می‌کند؟\nشما می‌توانید [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category]",
        "mainpagetext": "'''مدیاویکی با موفقیت نصب شد.'''",
-       "mainpagedocfooter": "از [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents]\nبرای اطلاعات بیشتر در مورد به‌کارگیری نرم‌افزار ویکی استفاده کنید.\n\n== آغاز به کار ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings فهرست تنظیمات پیکربندی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ پرسش‌های متداول مدیاویکی]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce فهرست ایمیلی نسخه‌های مدیاویکی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources محلی‌سازی مدیاویکی به زبان شما]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam یادگیری روش‌های مقابله با هرزنگاری در ویکی]"
+       "mainpagedocfooter": "از [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents راهنمای کاربری]\nبرای اطلاعات بیشتر در مورد به‌کارگیری نرم‌افزار ویکی استفاده کنید.\n\n== آغاز به کار ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings فهرست تنظیمات پیکربندی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ پرسش‌های متداول مدیاویکی]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce فهرست ایمیلی نسخه‌های مدیاویکی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources محلی‌سازی مدیاویکی به زبان شما]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam یادگیری روش‌های مقابله با هرزنگاری در ویکی]"
 }
index e98988c..161c5db 100644 (file)
@@ -9,7 +9,8 @@
                        "Yona b",
                        "Rotemliss",
                        "Macofe",
-                       "Guycn2"
+                       "Guycn2",
+                       "שמזן"
                ]
        },
        "config-desc": "תכנית ההתקנה של מדיה־ויקי",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "מדיה־ויקי תומכת במערכות מסדי הנתונים הבאות:\n\n$1\n\nאם אינך רואה את מסד הנתונים שלך ברשימה, יש לעקוב אחר ההוראות המקושרות לעיל כדי להפעיל את התמיכה.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] הוא היעד העיקרי עבור מדיה־ויקי ולו התמיכה הטובה ביותר. מדיה־ויקי עובדת גם עם [{{int:version-db-mariadb-url}} MariaDB] ועם [{{int:version-db-percona-url}} Percona Server], שתואמים ל־MySQL. (ר׳ [http://www.php.net/manual/en/mysql.installation.php how to compile PHP with MySQL support])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] הוא מסד נתונים נפוץ בקוד פתוח והוא נפוץ בתור חלופה ל־MySQL. ייתכן שיש בתצורה הזאת באגים מסוימים והיא לא מומלצת לסביבות מבצעיות. (ר׳ [http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]).",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] הוא מסד נתונים נפוץ בקוד פתוח והוא נפוץ בתור חלופה ל־MySQL. (ר׳ [http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]).",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] הוא מסד נתונים קליל עם תמיכה טובה מאוד. (ר׳ [http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], משתמש ב־PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] הוא מסד נתונים עסקי מסחרי. (ר׳ [http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] הוא מסד נתונים עסקי מסחרי לחלונות. ([http://www.php.net/manual/en/sqlsrv.installation.php How to compile PHP with SQLSRV support])",
        "config-cache-options": "הגדרות למטמון עצמים (object caching):",
        "config-cache-help": "מטמון עצמים משמש לשיפור המהירות של מדיה־ויקי על־ידי שמירה של נתונים שהשימוש בהם נפוץ במטמון.\nלאתרים בינוניים וגדולים כדאי מאוד להפעיל את זה, וגם אתרים קטנים ייהנו מזה.",
        "config-cache-none": "ללא מטמון (שום יכולת אינה מוּסרת, אבל הביצועים באתרים גדולים ייפגעו)",
-       "config-cache-accel": "מטמון עצמים (object caching) של PHP&rlm; (APC&rlm;, XCache או WinCache)",
+       "config-cache-accel": "מטמון עצמים (object caching) של PHP&rlm; (APC,&rlm; APCu,&rlm; XCache או WinCache)",
        "config-cache-memcached": "להשתמש ב־Memcached (דורש התקנות והגדרות נוספות)",
        "config-memcached-servers": "שרתי Memcached:",
        "config-memcached-help": "רשימת כתובות IP ש־Memcached ישתמש בהן.\nיש לרשום כתובת אחת בכל שורה ולציין את הפִּתְחָה (port), למשל:\n 127.0.0.1:11211\n 192.168.1.25:1234",
        "config-install-subscribe-fail": "הרישום ל־mediawiki-announce לא הצליח: $1",
        "config-install-subscribe-notpossible": "cURL אינה מותקנת ו־<code>allow_url_fopen</code> אינה זמינה.",
        "config-install-mainpage": "יצירת דף ראשי עם תוכן התחלתי",
+       "config-install-mainpage-exists": "העמוד הראשי כבר קיים, לדלג",
        "config-install-extension-tables": "יצירת טבלאות להרחבות מופעלות",
        "config-install-mainpage-failed": "לא הצליחה הכנסת דף ראשי: $1.",
        "config-install-done": "<strong>מזל טוב!</strong>\nהתקנת את תוכנת מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ <code>LocalSettings.php</code>.\nהוא מכיל את כל ההגדרות שלך.\n\nיש להוריד אותו ולהכניס אותו לתיקיית הבסיס שבה הותקן הוויקי שלך (אותה התיקייה שבה נמצא הקובץ index.php). ההורדה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלת אותה, אפשר להתחיל אותה מחדש באמצעות לחיצה על הקישור הבא:\n\n$3\n\n<strong>לתשומת לבך:</strong> אם ההורדה לא תבוצע כעת, קובץ ההגדרות <strong>לא</strong> יהיה זמין מאוחר יותר אם תוכנת ההתקנה תיסגר לפני שהקובץ יורד.\n\nלאחר שביצעת את הפעולות שלהלן, באפשרותך <strong>[$2 להיכנס לאתר הוויקי שלך]</strong>.",
        "config-nofile": "הקובץ \"$1\" לא נמצא. האם הוא נמחק?",
        "config-extension-link": "הידעת שמדיה־ויקי תומכת ב־[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions הרחבות]?\n\nבאפשרותך לעיין ב־[https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category הרחבות לפי קטגוריה].",
        "mainpagetext": "<strong>תוכנת מדיה־ויקי הותקנה בהצלחה.</strong>",
-       "mainpagedocfooter": "היעזרו ב[https://meta.wikimedia.org/wiki/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.\n\n== קישורים שימושיים ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימת ההגדרות]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ שאלות ותשובות על מדיה־ויקי]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources תרגום מדיה־ויקי לשפה שלך]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam איך להיאבק נגד ספאם באתר הוויקי שלך]"
+       "mainpagedocfooter": "היעזרו ב[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.\n\n== קישורים שימושיים ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימת ההגדרות]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ שאלות ותשובות על מדיה־ויקי]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources תרגום מדיה־ויקי לשפה שלך]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam איך להיאבק נגד ספאם באתר הוויקי שלך]"
 }
index 70ef27a..89f8e55 100644 (file)
        "config-logo-help": "Матичното руво на МедијаВики има простор за лого од 135x160 пиксели над страничникот.\n\nМожете да употребите <code>$wgStylePath</code> или <code>$wgScriptPath</code> ако вашето лого е релативно на тие патеки.\n\nАко не сакате да имате лого, тогаш оставете го ова поле празно.",
        "config-instantcommons": "Овозможи Instant Commons",
        "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] е функција која им овозможува на викијата да користат слики, звучни записи и други мултимедијални содржини од [https://commons.wikimedia.org/ Ризницата].\nЗа да може ова да работи, МедијаВики бара пристап до семрежјето.\n\nЗа повеќе информации за оваа функција и напатствија за нејзино поставување на вики (сите други освен Ризницата), коносултирајте го [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos прирачникот].",
-       "config-cc-error": "Изборникот на лиценци од Криејтив комонс не даде резултати.\nВнесете го името на лиценцата рачно.",
+       "config-cc-error": "Изборникот на лиценци од Криејтив комонс не даде лиценца.\nВнесете го името на лиценцата рачно.",
        "config-cc-again": "Одберете повторно...",
        "config-cc-not-chosen": "Одберете ја саканата лиценца од Криејтив комонс и стиснете на „proceed“.",
        "config-advanced-settings": "Напредни нагодувања",
index 8afdce4..4f0805b 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup FileBackend
  * @author Aaron Schulz
  */
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * @brief Class for a file system (FS) based file backend.
index a7ceab2..5179477 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup FileBackend
  * @author Aaron Schulz
  */
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * @brief Base class for all backends using particular storage medium.
index 800fdfa..a7d064b 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * Functions related to the output of file content
index 50522ef..c5afe1e 100644 (file)
@@ -29,8 +29,10 @@ use Wikimedia\ScopedCallback;
 use Wikimedia\Rdbms\TransactionProfiler;
 use Wikimedia\Rdbms\LikeMatch;
 use Wikimedia\Rdbms\DatabaseDomain;
+use Wikimedia\Rdbms\ResultWrapper;
 use Wikimedia\Rdbms\DBMasterPos;
 use Wikimedia\Rdbms\Blob;
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * Relational database abstraction object
index 7c82479..75ddc9d 100644 (file)
@@ -27,6 +27,8 @@
 use Wikimedia\Rdbms\Blob;
 use Wikimedia\Rdbms\MssqlBlob;
 use Wikimedia\Rdbms\MssqlField;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\MssqlResultWrapper;
 
 /**
  * @ingroup Database
index 61ba498..9270589 100644 (file)
@@ -23,6 +23,7 @@
 use Wikimedia\Rdbms\DBMasterPos;
 use Wikimedia\Rdbms\MySQLMasterPos;
 use Wikimedia\Rdbms\MySQLField;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * Database abstraction object for MySQL.
index 2f27ff9..7a2200a 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Database
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Database abstraction object for PHP extension mysqli.
  *
index 7b8a940..af9716d 100644 (file)
  * @file
  * @ingroup Database
  */
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 use Wikimedia\WaitConditionLoop;
 use Wikimedia\Rdbms\Blob;
 use Wikimedia\Rdbms\PostgresBlob;
 use Wikimedia\Rdbms\PostgresField;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * @ingroup Database
index 30bfcf8..090ce8e 100644 (file)
@@ -23,6 +23,7 @@
  */
 use Wikimedia\Rdbms\Blob;
 use Wikimedia\Rdbms\SQLiteField;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * @ingroup Database
index f7bb6cf..6bc870b 100644 (file)
@@ -28,6 +28,7 @@ use Wikimedia\Rdbms\Blob;
 use Wikimedia\Rdbms\LikeMatch;
 use Wikimedia\Rdbms\DBMasterPos;
 use Wikimedia\Rdbms\Field;
+use Wikimedia\Rdbms\IResultWrapper;
 
 /**
  * Basic database interface for live and lazy-loaded relation database handles
@@ -363,7 +364,7 @@ interface IDatabase {
         * member variables.
         * If no more rows are available, false is returned.
         *
-        * @param ResultWrapper|stdClass $res Object as returned from IDatabase::query(), etc.
+        * @param IResultWrapper|stdClass $res Object as returned from IDatabase::query(), etc.
         * @return stdClass|bool
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
@@ -374,7 +375,7 @@ interface IDatabase {
         * form. Fields are retrieved with $row['fieldname'].
         * If no more rows are available, false is returned.
         *
-        * @param ResultWrapper $res Result object as returned from IDatabase::query(), etc.
+        * @param IResultWrapper $res Result object as returned from IDatabase::query(), etc.
         * @return array|bool
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
@@ -517,7 +518,7 @@ interface IDatabase {
         * @param bool $tempIgnore Whether to avoid throwing an exception on errors...
         *     maybe best to catch the exception instead?
         * @throws DBError
-        * @return bool|ResultWrapper True for a successful write query, ResultWrapper object
+        * @return bool|IResultWrapper True for a successful write query, IResultWrapper object
         *     for a successful read query, or false on failure if $tempIgnore set
         */
        public function query( $sql, $fname = __METHOD__, $tempIgnore = false );
@@ -731,7 +732,7 @@ interface IDatabase {
         *
         *    [ 'page' => [ 'LEFT JOIN', 'page_latest=rev_id' ] ]
         *
-        * @return ResultWrapper|bool If the query returned no rows, a ResultWrapper
+        * @return IResultWrapper|bool If the query returned no rows, a IResultWrapper
         *   with no rows in it will be returned. If there was a query error, a
         *   DBQueryError exception will be thrown, except if the "ignore errors"
         *   option was set, in which case false will be returned.
@@ -1196,7 +1197,7 @@ interface IDatabase {
         *   for the format. Use $conds == "*" to delete all rows
         * @param string $fname Name of the calling function
         * @throws DBUnexpectedError
-        * @return bool|ResultWrapper
+        * @return bool|IResultWrapper
         */
        public function delete( $table, $conds, $fname = __METHOD__ );
 
@@ -1224,7 +1225,7 @@ interface IDatabase {
         * @param array $selectOptions Options for the SELECT part of the query, see
         *    IDatabase::select() for details.
         *
-        * @return ResultWrapper
+        * @return IResultWrapper
         */
        public function insertSelect( $destTable, $srcTable, $varMap, $conds,
                $fname = __METHOD__,
index 1a046cf..fd7af11 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
+use stdClass;
+
 /**
  * Overloads the relevant methods of the real ResultsWrapper so it
  * doesn't go anywhere near an actual database.
@@ -56,3 +61,6 @@ class FakeResultWrapper extends ResultWrapper {
                return $this->fetchObject();
        }
 }
+
+class_alias( FakeResultWrapper::class, 'FakeResultWrapper' );
+
index b591f4f..4e28397 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
+use stdClass;
+
 class MssqlResultWrapper extends ResultWrapper {
        /** @var integer|null */
        private $mSeekTo = null;
index 88e7cdd..a76d66a 100644 (file)
@@ -1,6 +1,10 @@
 <?php
 
-use Wikimedia\Rdbms\IResultWrapper;
+namespace Wikimedia\Rdbms;
+
+use IDatabase;
+use stdClass;
+use RuntimeException;
 
 /**
  * Result wrapper for grabbing data queried from an IDatabase object
@@ -115,3 +119,5 @@ class ResultWrapper implements IResultWrapper {
                return $this->current() !== false;
        }
 }
+
+class_alias( ResultWrapper::class, 'ResultWrapper' );
diff --git a/includes/libs/time/ConvertibleTimestamp.php b/includes/libs/time/ConvertibleTimestamp.php
deleted file mode 100644 (file)
index c830b4e..0000000
+++ /dev/null
@@ -1,269 +0,0 @@
-<?php
-/**
- * Creation, parsing, and conversion of timestamps.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @since 1.20
- * @author Tyler Romeo, 2012
- */
-
-/**
- * Library for creating, parsing, and converting timestamps. Based on the JS
- * library that does the same thing.
- *
- * @since 1.28
- */
-class ConvertibleTimestamp {
-       /**
-        * Standard gmdate() formats for the different timestamp types.
-        */
-       private static $formats = [
-               TS_UNIX => 'U',
-               TS_MW => 'YmdHis',
-               TS_DB => 'Y-m-d H:i:s',
-               TS_ISO_8601 => 'Y-m-d\TH:i:s\Z',
-               TS_ISO_8601_BASIC => 'Ymd\THis\Z',
-               TS_EXIF => 'Y:m:d H:i:s', // This shouldn't ever be used, but is included for completeness
-               TS_RFC2822 => 'D, d M Y H:i:s',
-               TS_ORACLE => 'd-m-Y H:i:s.000000', // Was 'd-M-y h.i.s A' . ' +00:00' before r51500
-               TS_POSTGRES => 'Y-m-d H:i:s',
-       ];
-
-       /**
-        * The actual timestamp being wrapped (DateTime object).
-        * @var DateTime
-        */
-       public $timestamp;
-
-       /**
-        * Make a new timestamp and set it to the specified time,
-        * or the current time if unspecified.
-        *
-        * @param bool|string|int|float|DateTime $timestamp Timestamp to set, or false for current time
-        */
-       public function __construct( $timestamp = false ) {
-               if ( $timestamp instanceof DateTime ) {
-                       $this->timestamp = $timestamp;
-               } else {
-                       $this->setTimestamp( $timestamp );
-               }
-       }
-
-       /**
-        * Set the timestamp to the specified time, or the current time if unspecified.
-        *
-        * Parse the given timestamp into either a DateTime object or a Unix timestamp,
-        * and then store it.
-        *
-        * @param string|bool $ts Timestamp to store, or false for now
-        * @throws TimestampException
-        */
-       public function setTimestamp( $ts = false ) {
-               $m = [];
-               $da = [];
-               $strtime = '';
-
-               // We want to catch 0, '', null... but not date strings starting with a letter.
-               if ( !$ts || $ts === "\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ) {
-                       $uts = time();
-                       $strtime = "@$uts";
-               } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
-                       # TS_DB
-               } elseif ( preg_match( '/^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
-                       # TS_EXIF
-               } elseif ( preg_match( '/^(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/D', $ts, $da ) ) {
-                       # TS_MW
-               } elseif ( preg_match( '/^(-?\d{1,13})(\.\d+)?$/D', $ts, $m ) ) {
-                       # TS_UNIX
-                       $strtime = "@{$m[1]}"; // https://secure.php.net/manual/en/datetime.formats.compound.php
-               } elseif ( preg_match( '/^\d{2}-\d{2}-\d{4} \d{2}:\d{2}:\d{2}.\d{6}$/', $ts ) ) {
-                       # TS_ORACLE // session altered to DD-MM-YYYY HH24:MI:SS.FF6
-                       $strtime = preg_replace( '/(\d\d)\.(\d\d)\.(\d\d)(\.(\d+))?/', "$1:$2:$3",
-                               str_replace( '+00:00', 'UTC', $ts ) );
-               } elseif ( preg_match(
-                       '/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.*\d*)?Z?$/',
-                       $ts,
-                       $da
-               ) ) {
-                       # TS_ISO_8601
-               } elseif ( preg_match(
-                       '/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(?:\.*\d*)?Z?$/',
-                       $ts,
-                       $da
-               ) ) {
-                       # TS_ISO_8601_BASIC
-               } elseif ( preg_match(
-                       '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d*[\+\- ](\d\d)$/',
-                       $ts,
-                       $da
-               ) ) {
-                       # TS_POSTGRES
-               } elseif ( preg_match(
-                       '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d* GMT$/',
-                       $ts,
-                       $da
-               ) ) {
-                       # TS_POSTGRES
-               } elseif ( preg_match(
-               # Day of week
-                       '/^[ \t\r\n]*([A-Z][a-z]{2},[ \t\r\n]*)?' .
-                       # dd Mon yyyy
-                       '\d\d?[ \t\r\n]*[A-Z][a-z]{2}[ \t\r\n]*\d{2}(?:\d{2})?' .
-                       # hh:mm:ss
-                       '[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d/S',
-                       $ts
-               ) ) {
-                       # TS_RFC2822, accepting a trailing comment.
-                       # See http://www.squid-cache.org/mail-archive/squid-users/200307/0122.html / r77171
-                       # The regex is a superset of rfc2822 for readability
-                       $strtime = strtok( $ts, ';' );
-               } elseif ( preg_match( '/^[A-Z][a-z]{5,8}, \d\d-[A-Z][a-z]{2}-\d{2} \d\d:\d\d:\d\d/', $ts ) ) {
-                       # TS_RFC850
-                       $strtime = $ts;
-               } elseif ( preg_match( '/^[A-Z][a-z]{2} [A-Z][a-z]{2} +\d{1,2} \d\d:\d\d:\d\d \d{4}/', $ts ) ) {
-                       # asctime
-                       $strtime = $ts;
-               } else {
-                       throw new TimestampException( __METHOD__ . ": Invalid timestamp - $ts" );
-               }
-
-               if ( !$strtime ) {
-                       $da = array_map( 'intval', $da );
-                       $da[0] = "%04d-%02d-%02dT%02d:%02d:%02d.00+00:00";
-                       $strtime = call_user_func_array( "sprintf", $da );
-               }
-
-               try {
-                       $final = new DateTime( $strtime, new DateTimeZone( 'GMT' ) );
-               } catch ( Exception $e ) {
-                       throw new TimestampException( __METHOD__ . ': Invalid timestamp format.', $e->getCode(), $e );
-               }
-
-               if ( $final === false ) {
-                       throw new TimestampException( __METHOD__ . ': Invalid timestamp format.' );
-               }
-
-               $this->timestamp = $final;
-       }
-
-       /**
-        * Convert a timestamp string to a given format.
-        *
-        * @param int $style Constant Output format for timestamp
-        * @param string $ts Timestamp
-        * @return string|bool Formatted timestamp or false on failure
-        */
-       public static function convert( $style = TS_UNIX, $ts ) {
-               try {
-                       $ct = new static( $ts );
-                       return $ct->getTimestamp( $style );
-               } catch ( TimestampException $e ) {
-                       return false;
-               }
-       }
-
-       /**
-        * Get the current time in the given format
-        *
-        * @param int $style Constant Output format for timestamp
-        * @return string
-        */
-       public static function now( $style = TS_MW ) {
-               return static::convert( $style, time() );
-       }
-
-       /**
-        * Get the timestamp represented by this object in a certain form.
-        *
-        * Convert the internal timestamp to the specified format and then
-        * return it.
-        *
-        * @param int $style Constant Output format for timestamp
-        * @throws TimestampException
-        * @return string The formatted timestamp
-        */
-       public function getTimestamp( $style = TS_UNIX ) {
-               if ( !isset( self::$formats[$style] ) ) {
-                       throw new TimestampException( __METHOD__ . ': Illegal timestamp output type.' );
-               }
-
-               $output = $this->timestamp->format( self::$formats[$style] );
-
-               if ( ( $style == TS_RFC2822 ) || ( $style == TS_POSTGRES ) ) {
-                       $output .= ' GMT';
-               }
-
-               if ( $style == TS_MW && strlen( $output ) !== 14 ) {
-                       throw new TimestampException( __METHOD__ . ': The timestamp cannot be represented in ' .
-                               'the specified format' );
-               }
-
-               return $output;
-       }
-
-       /**
-        * @return string
-        */
-       public function __toString() {
-               return $this->getTimestamp();
-       }
-
-       /**
-        * Calculate the difference between two ConvertibleTimestamp objects.
-        *
-        * @param ConvertibleTimestamp $relativeTo Base time to calculate difference from
-        * @return DateInterval|bool The DateInterval object representing the
-        *   difference between the two dates or false on failure
-        */
-       public function diff( ConvertibleTimestamp $relativeTo ) {
-               return $this->timestamp->diff( $relativeTo->timestamp );
-       }
-
-       /**
-        * Set the timezone of this timestamp to the specified timezone.
-        *
-        * @param string $timezone Timezone to set
-        * @throws TimestampException
-        */
-       public function setTimezone( $timezone ) {
-               try {
-                       $this->timestamp->setTimezone( new DateTimeZone( $timezone ) );
-               } catch ( Exception $e ) {
-                       throw new TimestampException( __METHOD__ . ': Invalid timezone.', $e->getCode(), $e );
-               }
-       }
-
-       /**
-        * Get the timezone of this timestamp.
-        *
-        * @return DateTimeZone The timezone
-        */
-       public function getTimezone() {
-               return $this->timestamp->getTimezone();
-       }
-
-       /**
-        * Format the timestamp in a given format.
-        *
-        * @param string $format Pattern to format in
-        * @return string The formatted timestamp
-        */
-       public function format( $format ) {
-               return $this->timestamp->format( $format );
-       }
-}
diff --git a/includes/libs/time/TimestampException.php b/includes/libs/time/TimestampException.php
deleted file mode 100644 (file)
index 36ffdee..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-/**
- * @since 1.20
- */
-class TimestampException extends Exception {
-}
diff --git a/includes/libs/time/defines.php b/includes/libs/time/defines.php
deleted file mode 100644 (file)
index ff4dde8..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-/**
- * Unix time - the number of seconds since 1970-01-01 00:00:00 UTC
- */
-define( 'TS_UNIX', 0 );
-
-/**
- * MediaWiki concatenated string timestamp (YYYYMMDDHHMMSS)
- */
-define( 'TS_MW', 1 );
-
-/**
- * MySQL DATETIME (YYYY-MM-DD HH:MM:SS)
- */
-define( 'TS_DB', 2 );
-
-/**
- * RFC 2822 format, for E-mail and HTTP headers
- */
-define( 'TS_RFC2822', 3 );
-
-/**
- * ISO 8601 format with no timezone: 1986-02-09T20:00:00Z
- *
- * This is used by Special:Export
- */
-define( 'TS_ISO_8601', 4 );
-
-/**
- * An Exif timestamp (YYYY:MM:DD HH:MM:SS)
- *
- * @see http://exif.org/Exif2-2.PDF The Exif 2.2 spec, see page 28 for the
- *       DateTime tag and page 36 for the DateTimeOriginal and
- *       DateTimeDigitized tags.
- */
-define( 'TS_EXIF', 5 );
-
-/**
- * Oracle format time.
- */
-define( 'TS_ORACLE', 6 );
-
-/**
- * Postgres format time.
- */
-define( 'TS_POSTGRES', 7 );
-
-/**
- * ISO 8601 basic format with no timezone: 19860209T200000Z.  This is used by ResourceLoader
- */
-define( 'TS_ISO_8601_BASIC', 9 );
index 31eaa3b..76ae279 100644 (file)
@@ -23,6 +23,7 @@
 
 use Psr\Log\LoggerInterface;
 use Psr\Log\LoggerAwareInterface;
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * This contains some static methods for
index 51a0135..f237287 100644 (file)
@@ -24,6 +24,7 @@
  * @see http://exif.org/Exif2-2.PDF The Exif 2.2 specification
  * @file
  */
+use Wikimedia\Timestamp\TimestampException;
 
 /**
  * Format Image metadata values into a human readable form.
index 714d3a9..f8202a6 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Class for viewing MediaWiki file description pages
  *
index 1fa4bfa..e4b524b 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\FakeResultWrapper;
+
 /**
  * Special handling for file pages
  *
index e49ef2a..4bc8ad6 100644 (file)
@@ -22,6 +22,7 @@
 
 use \MediaWiki\Logger\LoggerFactory;
 use \MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 /**
  * Class representing a MediaWiki article and history.
index 395cee5..dc302a2 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Pager
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * IndexPager is an efficient pager which uses a (roughly unique) index in the
  * data set to implement paging, rather than a "LIMIT offset,limit" clause.
index 6f325c9..76f3470 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Pager
  */
+use Wikimedia\Timestamp\TimestampException;
 
 /**
  * IndexPager with a formatted navigation bar
index f0b1907..453c6cc 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\FakeResultWrapper;
+
 /**
  * List for revision table items
  *
index c3985d1..53d09e8 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * This class is used for different SQL-based search engines shipped with MediaWiki
  * @ingroup Search
index 85bd09a..a7740a0 100644 (file)
@@ -906,7 +906,10 @@ abstract class Skin extends ContextSource {
                                $html = htmlspecialchars( $icon["alt"] );
                        }
                        if ( $url ) {
-                               $html = Html::rawElement( 'a', [ "href" => $url ], $html );
+                               global $wgExternalLinkTarget;
+                               $html = Html::rawElement( 'a',
+                                       [ "href" => $url, "target" => $wgExternalLinkTarget ],
+                                       $html );
                        }
                }
                return $html;
index 9cce266..f62b302 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup SpecialPage
  */
 use MediaWiki\Logger\LoggerFactory;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * Special page which uses a ChangesList to show query results.
index c4e53ee..bafee65 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Variant of QueryPage which uses a gallery to output results, thus
  * suited for reports generating images
index 3bb3f85..45cef2b 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Variant of QueryPage which formats the result as a simple link to the page
  *
index 53f8930..40f82f5 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * This is a class for doing query pages; since they're almost all the same,
  * we factor out some of the functionality into a superclass, and let
index 00fca12..9d92cbd 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Class definition for a wanted query page like
  * WantedPages, WantedTemplates, etc
index b730ecd..9aba41e 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A special page listing redirects to non existent page. Those should be
  * fixed to point to an existing page.
index 90efef7..59351dc 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A special page listing redirects to redirecting page.
  * The software will automatically not follow double redirects, to prevent loops.
index a2fa844..a1f5efa 100644 (file)
@@ -22,6 +22,8 @@
  * @author Brion Vibber
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Special:LinkSearch to search the external-links table.
  * @ingroup SpecialPage
index dbe5c2f..52c710d 100644 (file)
@@ -24,6 +24,8 @@
  * @author Brian Wolff
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Special:ListDuplicatedFiles Lists all files where the current version is
  *   a duplicate of the current version of some other file.
index d034a6c..b2d6a33 100644 (file)
@@ -24,6 +24,8 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Special:Listredirects - Lists all the redirects on the wiki.
  * @ingroup SpecialPage
index 1cb6549..a88767a 100644 (file)
@@ -22,6 +22,8 @@
  * @author Brian Wolff
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * @ingroup SpecialPage
  */
index 6095412..0776eec 100644 (file)
@@ -24,6 +24,8 @@
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A special page that list pages that have highest category count
  *
index 210c4a2..8560dca 100644 (file)
@@ -24,6 +24,8 @@
  * @author Umherirrender
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A special page that listed pages that have highest interwiki count
  *
index 712574c..ff8550d 100644 (file)
@@ -25,6 +25,8 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A special page to show pages ordered by the number of pages linking to them.
  *
index 41678cb..699940b 100644 (file)
@@ -24,6 +24,8 @@
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A querypage to show categories ordered in descending order by the pages in them
  *
index d102791..f5c2c5f 100644 (file)
@@ -22,6 +22,8 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Special page lists templates with a large number of
  * transclusion links, i.e. "most used" templates
index eb6d939..cdad926 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * A special page that lists last changes made to the wiki
@@ -455,6 +456,16 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $panel[] = $form;
                $panelString = implode( "\n", $panel );
 
+               // Insert a placeholder for RCFilters
+               if ( $this->getUser()->getOption( 'rcenhancedfilters' ) ) {
+                       $this->getOutput()->addHTML(
+                               Html::element(
+                                       'div',
+                                       [ 'class' => 'rcfilters-container' ]
+                               )
+                       );
+               }
+
                $this->getOutput()->addHTML(
                        Xml::fieldset(
                                $this->msg( 'recentchanges-legend' )->text(),
@@ -526,13 +537,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                parent::addModules();
                $out = $this->getOutput();
                $out->addModules( 'mediawiki.special.recentchanges' );
-               if ( $this->getUser()->getOption(
-                               'rcenhancedfilters',
-                               /*default=*/ null,
-                               /*ignoreHidden=*/ true
-                       )
-               ) {
+               if ( $this->getUser()->getOption( 'rcenhancedfilters' ) ) {
                        $out->addModules( 'mediawiki.rcfilters.filters.ui' );
+                       $out->addModuleStyles( 'mediawiki.rcfilters.filters.base.styles' );
                }
        }
 
@@ -681,7 +688,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        $title = new HtmlArmor( '<strong>' . htmlspecialchars( $title ) . '</strong>' );
                }
 
-               return $this->getLinkRenderer()->makeKnownLink( $this->getPageTitle(), $title, [], $params );
+               return $this->getLinkRenderer()->makeKnownLink( $this->getPageTitle(), $title, [
+                       'data-params' => json_encode( $override ),
+                       'data-keys' => implode( ',', array_keys( $override ) ),
+               ], $params );
        }
 
        /**
index a78b082..a5e5113 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * SpecialShortpages extends QueryPage. It is used to return the shortest
  * pages in the database.
index d5c24c2..56920b3 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup SpecialPage
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * Used to show archived pages and eventually restore them.
index 96878a3..e82279e 100644 (file)
@@ -24,6 +24,8 @@
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * A special page that displays a list of pages that are not on anyones watchlist.
  *
index 85ac2de..822648b 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * A special page that lists last changes made to the wiki,
index efc51ef..ca1b7dc 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Pager
  */
 
+use Wikimedia\Rdbms\FakeResultWrapper;
+
 /**
  * Use TablePager for prettified output. We have to pretend that we're
  * getting data from a table when in fact not all of it comes from the database.
index a4124db..9a447ef 100644 (file)
@@ -23,6 +23,7 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 class BlockListPager extends TablePager {
 
index fb8d8f6..5126bad 100644 (file)
@@ -24,6 +24,8 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 class ContribsPager extends ReverseChronologicalPager {
 
index 2425dd5..a1f6b84 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 class DeletedContribsPager extends IndexPager {
 
index 4c1e8ee..3789dfa 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 class ImageListPager extends TablePager {
 
index dddc850..ab6683b 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 abstract class UserArray implements Iterator {
        /**
         * @param ResultWrapper $res
@@ -38,7 +40,7 @@ abstract class UserArray implements Iterator {
 
        /**
         * @param array $ids
-        * @return UserArrayFromResult
+        * @return UserArrayFromResult|ArrayIterator
         */
        static function newFromIDs( $ids ) {
                $ids = array_map( 'intval', (array)$ids ); // paranoia
@@ -59,7 +61,7 @@ abstract class UserArray implements Iterator {
        /**
         * @since 1.25
         * @param array $names
-        * @return UserArrayFromResult
+        * @return UserArrayFromResult|ArrayIterator
         */
        static function newFromNames( $names ) {
                $names = array_map( 'strval', (array)$names ); // paranoia
index fb533d0..527df7f 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 class UserArrayFromResult extends UserArray implements Countable {
        /** @var ResultWrapper */
        public $res;
@@ -27,7 +29,7 @@ class UserArrayFromResult extends UserArray implements Countable {
        /** @var int */
        public $key;
 
-       /** @var bool|stdClass */
+       /** @var bool|User */
        public $current;
 
        /**
index 55e228a..d7d7a60 100644 (file)
@@ -432,6 +432,15 @@ class ClassCollector {
                                        $this->classes[] = $this->alias['name'];
                                        $this->alias = null;
                                        $this->startToken = null;
+                               } elseif ( !is_array( $token ) || (
+                                       $token[0] !== T_STRING &&
+                                       $token[0] !== T_DOUBLE_COLON &&
+                                       $token[0] !== T_CLASS &&
+                                       $token[0] !== T_WHITESPACE
+                               ) ) {
+                                       // Ignore this call to class_alias() - compat/Timestamp.php
+                                       $this->alias = null;
+                                       $this->startToken = null;
                                }
                        }
                        break;
index e7b42da..26b5857 100644 (file)
        "rcfilters-invalid-filter": "مرشح غير صحيح",
        "rcfilters-empty-filter": "لا مرشحات فعالة. كل المساهمات معروضة.",
        "rcfilters-filterlist-title": "مرشحات",
+       "rcfilters-filterlist-feedbacklink": "تقديم مراجعات لمرشحات (بيتا) الجديدة",
        "rcfilters-highlightbutton-title": "التعليم على النتائج",
        "rcfilters-highlightmenu-title": "اختر لونًا",
        "rcfilters-filterlist-noresults": "لم يتم العثور على مرشحات",
index 84a5ca7..b9e13f7 100644 (file)
        "changeemail-no-info": "Для непасрэднага доступу да гэтай старонкі Вам неабходна ўвайсьці ў сыстэму.",
        "changeemail-oldemail": "Цяперашні адрас электроннай пошты:",
        "changeemail-newemail": "Новы адрас электроннай пошты:",
-       "changeemail-newemail-help": "Ð\9fоле Ñ\82Ñ\80Ñ\8dба Ð¿Ð°ÐºÑ\96нÑ\83Ñ\86Ñ\8c Ð¿Ñ\83Ñ\81Ñ\82Ñ\8bм, ÐºÐ°Ð»Ñ\96 Ð²Ñ\8b Ñ\85оÑ\87аÑ\86е Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c Ñ\81вой Ð°Ð´Ñ\80аÑ\81 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b. Пасьля выдаленьня вы ня зможаце ануляваць забыты пароль і ня будзеце атрымліваць лісты электроннай пошты з гэтай вікі.",
+       "changeemail-newemail-help": "Ð\9aалÑ\96 Ð²Ñ\8b Ñ\85оÑ\87аÑ\86е Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c Ñ\81вой Ð°Ð´Ñ\80аÑ\81 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b, Ð¿Ð°ÐºÑ\96нÑ\8cÑ\86е Ð³Ñ\8dÑ\82ае Ð¿Ð¾Ð»Ðµ Ð¿Ñ\83Ñ\81Ñ\82Ñ\8bм. Пасьля выдаленьня вы ня зможаце ануляваць забыты пароль і ня будзеце атрымліваць лісты электроннай пошты з гэтай вікі.",
        "changeemail-none": "(няма)",
        "changeemail-password": "Ваш пароль у {{GRAMMAR:месны|{{SITENAME}}}}:",
        "changeemail-submit": "Зьмяніць адрас электроннай пошты",
        "rev-deleted-unhide-diff": "Адна з вэрсіяў гэтай старонкі была <strong>выдаленая</strong>.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].\nВы можаце праглядзець [$1 розьніцу паміж вэрсіямі], калі жадаеце.",
        "rev-suppressed-unhide-diff": "Адна з вэрсіяў гэтага параўнаньня была <strong>схаваная</strong>.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].\nВы можаце [$1 паглядзець гэту розьніцу], калі жадаеце.",
        "rev-deleted-diff-view": "Адна з вэрсіяў гэтага параўнаньня была <strong>выдаленая</strong>.\nВы можаце праглядзець гэтую розьніцу паміж вэрсіямі. Падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
-       "rev-suppressed-diff-view": "Адна з вэрсіяў гэтага параўнаньня была '''схаваная'''.\nВы можаце праглядзець гэтую розьніцу паміж вэрсіямі; падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале хаваньняў].",
+       "rev-suppressed-diff-view": "Адна з вэрсіяў гэтага параўнаньня была <strong>схаваная</strong>.\nВы можаце праглядзець гэтую розьніцу паміж вэрсіямі; падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].",
        "rev-delundel": "паказаць/схаваць",
        "rev-showdeleted": "паказаць",
        "revisiondelete": "Выдаліць/аднавіць вэрсіі",
        "rcfilters-invalid-filter": "Няслушны фільтар",
        "rcfilters-empty-filter": "Няма актыўных фільтраў. Паказаны ўвесь унёсак.",
        "rcfilters-filterlist-title": "Фільтры",
+       "rcfilters-filterlist-feedbacklink": "Пакінуць водгук пра новыя (бэта) фільтры",
        "rcfilters-highlightbutton-title": "Вылучыць вынікі",
        "rcfilters-highlightmenu-title": "Абярыце колер",
        "rcfilters-filterlist-noresults": "Фільтры ня знойдзеныя",
        "statistics-users-active-desc": "Удзельнікі, якія выканалі нейкае дзеяньне цягам {{PLURAL:$1|апошняга $1 дня|апошніх $1 дзён|апошніх $1 дзён}}",
        "pageswithprop": "Старонкі з уласьцівасьцямі старонак",
        "pageswithprop-legend": "Старонкі з уласьцівасьцямі старонак",
-       "pageswithprop-text": "Ð\9dа Ð³Ñ\8dÑ\82ай Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b Ð°Ð´Ð»Ñ\8eÑ\81Ñ\82Ñ\80оÑ\9eваÑ\8eÑ\86Ñ\86а Ñ\81Ñ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ñ\9eжÑ\8bваÑ\8eÑ\86Ñ\8c Ð¿Ñ\8dÑ\9eнÑ\8bÑ\8f Ñ\9eлаÑ\81Ñ\8cÑ\86Ñ\96ваÑ\81Ñ\8cÑ\86Ñ\96 Ñ\81Ñ\82аÑ\80онак",
+       "pageswithprop-text": "Ð\9dа Ð³Ñ\8dÑ\82ай Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b Ð°Ð´Ð»Ñ\8eÑ\81Ñ\82Ñ\80оÑ\9eваÑ\8eÑ\86Ñ\86а Ñ\81Ñ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ñ\9eжÑ\8bваÑ\8eÑ\86Ñ\8c Ð¿Ñ\8dÑ\9eнÑ\83Ñ\8e Ñ\9eлаÑ\81Ñ\8cÑ\86Ñ\96ваÑ\81Ñ\8cÑ\86Ñ\8c Ñ\81Ñ\82аÑ\80онкÑ\96.",
        "pageswithprop-prop": "Імя ўласьцівасьці:",
        "pageswithprop-submit": "Паказаць",
        "pageswithprop-prophidden-long": "доўгае тэкставае значэньне ўласьцівасьці схавана ($1)",
        "authmanager-change-not-supported": "Пададзеныя ўліковыя зьвесткі ня могуць быць зьмененыя, бо яны ня будуць выкарыстаныя.",
        "authmanager-create-disabled": "Стварэньне рахункаў адключанае.",
        "authmanager-create-from-login": "Каб стварыць рахунак, калі ласка, запоўніце палі.",
+       "authmanager-create-not-in-progress": "Стварэньне рахунку не выконваецца або страчаныя зьвесткі пра сэсію. Калі ласка, пачніце наноў з самага пачатку.",
+       "authmanager-create-no-primary": "Пададзеныя ўліковыя зьвесткі ня могуць быць выкарыстаныя для стварэньня рахунку.",
        "authmanager-realname-label": "Сапраўднае імя",
        "authmanager-provider-temporarypassword": "Часовы пароль",
        "changecredentials": "Зьмена ўліковых зьвестак",
index ca7fb56..1525cb0 100644 (file)
        "rcfilters-filter-bots-description": "স্বয়ংক্রিয় সরঞ্জাম দিয়ে করা সম্পাদনা।",
        "rcfilters-filter-humans-label": "মানুষ (বট নয়)",
        "rcfilters-filter-humans-description": "মানব সম্পাদক দ্বারা করা সম্পাদনা।",
-       "rcfilters-filtergroup-significance": "তাতà§\8dপর্য",
+       "rcfilters-filtergroup-significance": "তাà§\8eপর্য",
        "rcfilters-filter-minor-label": "অনুল্লেখ্য সম্পাদনা",
        "rcfilters-filter-major-label": "অ-অনুল্লেখ্য সম্পাদনা",
        "rcfilters-filtergroup-changetype": "পরিবর্তনের ধরন",
index c227a23..cfac3b8 100644 (file)
        "previewnote": "'''Diwallit mat, n'eus ken ur rakweled eus an destenn-mañ.'''\nN'eo ket bet enrollet ho kemmoù evit c'hoazh !",
        "continue-editing": "Mont d'an takad kemmañ",
        "previewconflict": "Gant ar rakweled e teu testenn ar bajenn war wel evel ma vo pa vo bet enrollet.",
-       "session_fail_preview": "Ho tigarez ! N'eus ket bet tu da enrollañ ho kemmoù rak kollet eo bet roadennoù an dalc'h.\n\nMarteze n'oc'h ket kevreet ken. <strong>Gwiriit emaoc'h mat kevreet ha klaskit en-dro</strong>.\n\nMa ne'z a ket en-dro, klaskit [Special:UserLogout|digevreañ]] hag adkevreañ war-lerc'h. Gwiriit e asant mat ho merdeet resev toupinoù a-berzh al lec'hienn-mañ ivez.",
+       "session_fail_preview": "Ho tigarez ! N'eus ket bet tu da enrollañ ho kemmoù rak kollet eo bet roadennoù an dalc'h.\n\nMarteze n'oc'h ket kevreet ken. <strong>Gwiriit emaoc'h mat kevreet ha klaskit en-dro</strong>.\n\nMa ne'z a ket en-dro c'hoazh, klaskit [[Special:UserLogout|digevreañ]] hag adkevreañ war-lerc'h. Gwiriit mat e asant ho merdeer resev toupinoù a-berzh al lec'hienn-mañ ivez.",
        "session_fail_preview_html": "Ho tigarez ! N'omp ket bet gouest da enrollañ ho kemmoù rak kollet ez eus bet roadennoù e-kerzh an dalc'h.\n\n<em>Gweredekaet eo al linennoù HTML e {{SITENAME}}. Rak-se eo kuzh ar rakweledoù a-benn en em zifenn diouzh an tagadennoù JavaScript.</em>\n\n<strong>Ma oa reizh ar c'hemmoù hoc'h eus klasket degas, klaskit en-dro.</strong>\nMa ned a ket en-dro, klaskit [[Special:UserLogout|digevreañ]] hag adkevreañ goude. Gwiriit e asant mat ho merdeer degemer toupinoù a-berzh al lec'hienn-mañ ivez.",
        "token_suffix_mismatch": "'''Distaolet eo bet ar c'hemmoù degaset ganeoc'h abalamour ma oa bet kemmesket an arouezennoù poentadur gant ho merdeer en daveer kemmañ. Distaolet eo bet ar c'hemmoù kuit na vije breinet ar bajennad skrid.\nC'hoarvezout a ra a-wechoù pa implijit ur servijer proksi dreinek dizanav.'''",
        "edit_form_incomplete": "'''Darn eus ar furmskrid kemmañ zo chomet hep tizhout ar servijer ; gwiriit ervat emañ mat ho kemmoù tre evel m'int bet graet ganeoc'h ha klaskit en-dro.'''",
        "undo-summary": "Dizober kemmoù $1 a-berzh [[Special:Contributions/$2|$2]] ([[User talk:$2|kaozeal]])",
        "undo-summary-username-hidden": "Dizober ar reizhadenn $1 gant un implijer kuzhet",
        "cantcreateaccount-text": "Stanket eo bet ar c'hrouiñ kontoù adal ar chomlec'h IP ('''$1''') gant [[User:$3|$3]].\n\nAn abeg roet gant $3 zo ''$2''",
+       "cantcreateaccount-range-text": "Berzet eo bet gant [[User:$3|$3]] ar c'hrouiñ kontoù adalek ar chomlec'hioù IP el lijorennoù <strong>$1</strong> m'emañ ho chomlec'h IP (<strong>$4</strong>), \n\n<em>$2</em> eo an abeg roet gant $3",
        "viewpagelogs": "Gwelet ar marilhoù evit ar bajenn-mañ",
        "nohistory": "Ar bajenn-mañ n'he deus tamm istor ebet.",
        "currentrev": "Stumm a-vremañ pe stumm red",
        "history-feed-description": "Istor ar c'hemmoù degaset war ar bajenn-mañ eus ar wiki",
        "history-feed-item-nocomment": "$1 d'an $2",
        "history-feed-empty": "Ar bajenn goulennet n'eus ket anezhi.\nMarteze eo bet diverket eus ar wiki, pe adanvet.\nImplijit [[Special:Search|klaskit er wiki]] evit kavout pajennoù all a c'hallfe klotañ.",
+       "history-edit-tags": "Kemmañ tikedennoù ar stummoù diuzet",
        "rev-deleted-comment": "(diverradenn ar c'hemm diverket)",
        "rev-deleted-user": "(anv implijer diverket)",
-       "rev-deleted-event": "(elfenn dilamet)",
+       "rev-deleted-event": "(munudoù ar marilh bet dilamet)",
        "rev-deleted-user-contribs": "[anv implijer pe chomlec'h IP diverket - kemm kuzhet diouzh an degasadennoù]",
        "rev-deleted-text-permission": "'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nMarteze e kavot munudoù war [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} roll ar pajennoù diverket].",
+       "rev-suppressed-text-permission": "<strong>Diverket</strong> eo bet ar stumm-mañ eus ar bajenn.\nGallout a reot kavout ar munudoù e [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} marilh an diverkadennoù].",
        "rev-deleted-text-unhide": "!'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nMarteze e kavot munudoù war [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} marilh ar pajennoù diverket].\nGallout a rit [$1 gwelet ar stumm-se] c'hoazh mar fell deoc'h kenderc'hel.",
        "rev-suppressed-text-unhide": "'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nTitouroù zo da gaout war [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} marilh ar pajennoù diverket].\nGallout a rit [$1 gwelet ar stumm-se] c'hoazh mar fell deoc'h kenderc'hel.",
        "rev-deleted-text-view": "'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nGallout a rit sellet outañ ; titouroù all a gavot war [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} marilh ar pajennoù diverket].",
        "rev-showdeleted": "diskouez",
        "revisiondelete": "Diverkañ/diziverkañ stummoù",
        "revdelete-nooldid-title": "N'eus stumm pal ebet evit an degasadennoù",
-       "revdelete-nooldid-text": "Pe n'eo ket bet spisaet ganeoc'h ar stumm(où) pal da implijout an arc'hwel-mañ evito. pe n'eus ket eus ar stummoù spisaet, pe emaoc'h o klask kuzhat ar stumm red.",
+       "revdelete-nooldid-text": "Pe n'eus ket bet spisaet ganeoc'h stumm pal ebet da lakaat an arc'hwel-mañ da vont en-dro warnañ, pe n'eus ket eus ar stummoù spisaet, pe emaoc'h o klask kuzhat ar stumm red.",
        "revdelete-no-file": "N'eus ket eus ar restr spisaet ganeoc'h.",
        "revdelete-show-file-confirm": "Ha sur oc'h e fell deoc'h gwelet stumm diverket ar restr \"<nowiki>$1</nowiki>\" deiziataet eus an $2 da $3?",
        "revdelete-show-file-submit": "Ya",
+       "revdelete-selected-text": "{{PLURAL:$1|Stummoù diuzet|Stumm diuzet}} of [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Stumm eus ar restr diuzet}} evit [[:$2]] :",
        "logdelete-selected": "{{PLURAL:$1|Darvoud eus ar marilh diuzet}} :",
+       "revdelete-text-text": "Dont a raio c'hoazh war wel ar stummoù diverket en istor ar bajenn met ne c'hallo ket an dud gwelet darn eus an danvez ken.",
        "revdelete-text-file": "Dalc'het e vo da welet stummoù restroù dilamet en istor ar restr, nemet ne c'hallo ket an dud mont da welet un darn anezho.",
        "logdelete-text": "Gwelet e vo c'hoazh dilamadennoù er marilhoù, nemet ne c'hallo ket an dud mont da welet un darn anezho.",
        "revdelete-text-others": "Ar verourien a c'hallo c'hoazh mont da welet petra zo e-barzh, hag eilpennañ an dilamadenn, nemet ha reolennoù strishoc'h ouzhpenn a vefe.",
        "revdelete-legend": "Lakaat strishadurioù gwelet",
        "revdelete-hide-text": "Testenn ar stumm",
        "revdelete-hide-image": "Kuzhat danvez ar restr",
-       "revdelete-hide-name": "Kuzhat an ober hag ar vukadenn",
+       "revdelete-hide-name": "Kuzhat ar pal hag an arventennoù",
        "revdelete-hide-comment": "Notenn ar c'hemm",
        "revdelete-hide-user": "Anv implijer pe chomlec'h IP an aozer",
        "revdelete-hide-restricted": "Diverkañ ar roadennoù kement d'ar verourien ha d'ar re all",
        "revdelete-unsuppress": "Lemel ar strishadurioù war ar stummoù assavet",
        "revdelete-log": "Abeg :",
        "revdelete-submit": "Lakaat da dalvezout evit an {{PLURAL:$1|adweladenn|adweladennoù}} diuzet",
-       "revdelete-success": "''Gweluster ar stummoù hizivaet mat.'''",
+       "revdelete-success": "Gweluster ar stummoù hizivaet.",
        "revdelete-failure": "''Dibosupl hizivaat gweluster ar stumm :'''\n$1",
-       "logdelete-success": "'''Gweluster ar marilh arventennet evel m'eo dleet.'''",
+       "logdelete-success": "Kemmet eo bet gweluster ar marilh.",
        "logdelete-failure": "'''N'eus ket bet gallet termeniñ gweluster ar marilh :'''\n$1",
        "revdel-restore": "Cheñch ar gweluster",
        "pagehist": "Istor ar bajenn",
        "mergehistory-go": "Diskouez ar stummoù a c'haller kendeuziñ",
        "mergehistory-submit": "Kendeuziñ ar stummoù",
        "mergehistory-empty": "N'haller ket kendeuziñ stumm ebet.",
-       "mergehistory-done": "Kendeuzet ez eus bet $3 {{PLURAL:$3|stumm|stumm}} eus $1 e [[:$2]].",
+       "mergehistory-done": "Kendeuzet ez eus bet $3 {{PLURAL:$3|stumm}} eus $1 e [[:$2]].",
        "mergehistory-fail": "Dibosupl kendeuziñ an istorioù. Gwiriit ar bajenn hag arventennoù an deiziadoù.",
        "mergehistory-fail-bad-timestamp": "Merk amzer direizh.",
        "mergehistory-fail-invalid-source": "Pajenn darzh direizh.",
        "mergehistory-fail-invalid-dest": "Pajenn vuket direizh.",
+       "mergehistory-fail-no-change": "N'eus ket bet kendeuzet stumm ebet p'eo bet kendeuzet an istor. Gwiriit en-dro ar bajenn hag an arventennoù amzer.",
+       "mergehistory-fail-permission": "Re izel eo ho kwirioù evit gallout kendeuziñ an istor.",
+       "mergehistory-fail-self-merge": "Mammenn ha pal ar bajenn n'hall ket bezañ heñvel.",
+       "mergehistory-fail-timestamps-overlap": "En em frikañ a ra stummoù ar vammenn pe dont a reont war-lerc'h stummoù pal.",
        "mergehistory-fail-toobig": "Ne c'haller ket kendeuziñ an istorioù o vezañ ma vefe mont en tu all d'ar harzh a $1 reizhadenn da zilec'hiañ.",
        "mergehistory-no-source": "N'eus ket eus ar bajenn orin $1.",
        "mergehistory-no-destination": "N'eus ket eus ar bajenn dal $1.",
        "search-category": "(rummad $1)",
        "search-file-match": "(klotañ a ra gant endalc'had ar restr)",
        "search-suggest": "N'hoc'h eus ket soñjet kentoc'h e : $1",
+       "search-rewritten": "O tiskouez disoc'hoù evit $1. Klask $2 kentoc'h.",
        "search-interwiki-caption": "Raktresoù kar",
        "search-interwiki-default": "Disoc'hoù eus $1 :",
        "search-interwiki-more": "(muioc'h)",
        "prefs-tokenwatchlist": "Jedouer",
        "prefs-diffs": "Diforc'hioù",
        "prefs-help-prefershttps": "Efediñ a ray an dibarzh-mañ kentañ gwech ma kevreoc'h.",
+       "prefswarning-warning": "Kemmet eo bet ho penndibaboù ganeoc'h, met enrollet n'int ket bet avat.\nMar kuitait ar bajenn-mañ hep klikañ war \"$1\" ne vo ket nevesaet ho penndibaboù",
        "prefs-tabs-navigation-hint": "Titourig : Gallout a rit implijout an touchennoù bir kleiz ha bir dehoù evit merdeiñ etre an ivinelloù e roll an ivinelloù.",
        "userrights": "Merañ statud an implijerien",
        "userrights-lookup-user": "Diuzañ un implijer",
        "userrights-user-editname": "Lakait un anv implijer :",
        "editusergroup": "Kargañ strolladoù implijerien",
        "editinguser": "O kemmañ gwirioù an {{GENDER:$1|implijer|implijerez}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Kemmañ strolladoù an implijer",
-       "userrights-viewusergroup": "Gwelet ar strolladoù implijerien",
+       "viewinguserrights": "Gwelet gwirioù an {{GENDER:$1|implijer|implijerez}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Kemmañ strolladoù an {{GENDER:$1|implijer|implijerez}}",
+       "userrights-viewusergroup": "Gwelet strolladoù an {{GENDER:$1|implijer|implijerez}}",
        "saveusergroups": "Enrollañ strolladoù an {{GENDER:$1|implijer|implijerez}}",
        "userrights-groupsmember": "Ezel eus :",
        "userrights-groupsmember-auto": "Ezel emplegat eus :",
-       "userrights-groups-help": "Cheñch strollad an implijer a c'hallit ober.\n* Ul log asket a verk emañ an implijer er strollad.\n* Ul log diask a verk n'emañ ket an implijer er strollad.\n* Ur * a verk n'hallit ket dilemel ar strollad ur wech bet ouzhpennet, pe ar c'hontrol.",
+       "userrights-groups-help": "Cheñch strolladoù an implijer a c'hallit ober.\n* Ul log asket a verk emañ an implijer er strollad.\n* Ul log diask a verk n'emañ ket an implijer er strollad.\n* Ur * a verk n'hallit ket dilemel ar strollad ur wech bet ouzhpennet ganeoc'h, pe ar c'hontrol.\n* Ur # a verk a c'hallit astenn termen echuiñ ar strollad hepken ; n'hallit ket berraat anezhañ.",
        "userrights-reason": "Abeg :",
        "userrights-no-interwiki": "N'oc'h ket aotreet da gemmañ ar gwirioù implijer war wikioù all.",
        "userrights-nodatabase": "N'eus ket eus an diaz titouroù $1 pe n'eo ket lec'hel.",
        "userrights-expiry-options": "1 deiz:1 day,1 sizhun:1 week,1 miz:1 month,3 miz:3 months,6 miz:6 months, bloaz:1 year",
        "userrights-invalid-expiry": "Direizh eo termen echuiñ ar strollad \"$1\".",
        "userrights-expiry-in-past": "Re gozh eo termen echuiñ ar strollad \"$1\".",
+       "userrights-cannot-shorten-expiry": "N'hallit ket astenn termen echuiñ ar strollad \"$1\". N'eus nemet an implijerien aotreet da ouzhpennañ ha lemel ar strollad-mañ a c'hall astenn an termen.",
        "userrights-conflict": "Bec'h zo abalamour da gemmoù e gwirioù an implijerien. Adwelit an traoù, mar plij, ha kadarnait ho kemmoù.",
        "group": "Strollad :",
        "group-user": "Implijerien",
        "right-reupload-shared": "Gwaskañ restroù ent lec'hel war an diellaoueg vedia rannet",
        "right-upload_by_url": "Enporzhiañ ur restr adal ur chomlec'h URL",
        "right-purge": "Spujañ krubuilh ar pajennoù hep kadarnaat",
-       "right-autoconfirmed": "Kemmañ ar pajennoù damwarezet",
+       "right-autoconfirmed": "Na vezañ trubuilhet gant ar bevennoù kas liammet ouzh ar chomlec'hioù IP",
        "right-bot": "Plediñ ganti evel gant un argerzh emgefre",
        "right-nominornewtalk": "Arabat diskouez ar c'hemenn \"Kemennoù nevez zo ganeoc'h\" pa vez lakaet kemmoù dister e pajenn gaozeal un implijer",
        "right-apihighlimits": "Kreskiñ ar bevennoù er goulennoù API",
        "right-deletedtext": "Gwelet ar skrid diverket hag an diforc'hioù etre ar stummoù diverket",
        "right-browsearchive": "Klask pajennoù bet diverket",
        "right-undelete": "Assevel ur bajenn",
-       "right-suppressrevision": "Teuler ur sell war ar stummoù kuzhet ouzh ar verourien hag assevel anezho",
+       "right-suppressrevision": "Gwelet, kuzhat ha diguzhat stummoù resis pajennoù zo diouzh selloù an implijerien all",
+       "right-viewsuppressed": "Gwelet ar stummoù kuzhet diouzh an implijerien all",
        "right-suppressionlog": "Gwelet ar marilhoù prevez",
        "right-block": "Mirout ouzh an implijerien all a gemmañ pajennoù pelloc'h",
        "right-blockemail": "Mirout ouzh un implijer a gas posteloù",
        "right-hideuser": "Stankañ un implijer, en ur guzhat anezhañ diouzh ar re all",
        "right-ipblock-exempt": "Tremen dreist an IPoù stanket, ar stankadennoù emgefre hag ar bloc'hadennoù IP stanket",
        "right-unblockself": "En em zistankañ",
-       "right-protect": "Kemmañ live gwareziñ ar pajennoù ha kemmañ ar pajennoù gwarezet",
+       "right-protect": "Kemmañ live gwareziñ ar pajennoù ha kemmañ ar pajennoù gwarezet dre skalierad",
        "right-editprotected": "Aozañ ar pajennoù gwarezet evel \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Aozañ ar pajennoù gwarezet evel \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Kemmañ patrom danvez ur bajenn bennak",
        "right-editinterface": "Kemmañ an etrefas implijer",
        "right-editusercssjs": "Kemmañ restroù CSS ha JS implijerien all",
        "right-editusercss": "Kemmañ restroù CSS implijerien all",
        "right-editmyusercss": "Aozañ ho restroù implijer CSS deoc'h-c'hwi",
        "right-editmyuserjs": "Aoazañ ho restroù JavaScript implijer deoc'h-c'hwi",
        "right-viewmywatchlist": "Gwelet ho roll-evezhiañ deoc'h-c'hwi",
+       "right-editmywatchlist": "Kemmañ ho roll evezhiañ deoc'h-c'hwi. Notit mat e vo c'hoazh ouzhpennet pajennoù hep ar gwir-mañ gant obererezhioù zo.",
        "right-viewmyprivateinfo": "Gwelet ho roadennoù prevez deoc'h-c'hwi (da sk. chomlec'h postel, anv gwirion)",
        "right-editmyprivateinfo": "Aozañ ho roadennoù prevez deoc'h-c'hwi (da sk. chomlec'h postel, anv gwirion)",
        "right-editmyoptions": "Kemmañ ho penndibaboù",
        "right-siteadmin": "Prennañ ha dibrennañ ar bank-titouroù",
        "right-override-export-depth": "Ezporzhiañ ar pajennoù en ur lakaat e-barzh ar pajennoù liammet betek un donder a 5 live",
        "right-sendemail": "Kas ur postel d'an implijerien all",
+       "right-managechangetags": "Krouiñ ha gweredekaat/diweredekaat [[Special:Tags|tikedennoù]]",
+       "right-applychangetags": "Lakaat [[Special:Tags|an tikedennoù]] e pleustr asambles gant kemmoù an-unan",
+       "right-changetags": "Ouzhpennañ ha dilemel [[Special:Tags|tikedennoù]], diwar ziviz, war adweladennoù hiniennel pe monedoù marilh.",
+       "right-deletechangetags": "Diverkañ[[Special:Tags|tikedennoù]] a-ziwar an diaz roadennoù",
+       "grant-generic": "Pakad aotreoù \"$1\"",
+       "grant-group-page-interaction": "Etreober gant pajennoù",
+       "grant-group-file-interaction": "Etreober gant mediaoù",
+       "grant-group-watchlist-interaction": "Etreober gant ho roll evezhiañ",
        "grant-group-email": "Kas ur postel",
+       "grant-group-high-volume": "Seveniñ ur pikol obererezh",
+       "grant-group-customization": "Personeladur ha penndibaboù",
+       "grant-group-administration": "Seveniñ oberoù melestradurel",
+       "grant-group-private-information": "Gwelet ar roadennoù prevez diwar ho penn",
        "grant-group-other": "Obererezh liesseurt",
        "grant-blockusers": "Stankañ ha distankañ implijerien",
        "grant-createaccount": "Krouiñ kontoù",
        "action-editcontentmodel": "Kemmañ patrom danvez ur bajenn",
        "action-managechangetags": "krouiñ ha gweredekaat/diweredekaat tikedennoù",
        "action-applychangetags": "lakaat e pleustr an tikedennoù a-gevret gant ho kemmoù",
+       "action-changetags": "ouzhpennañ ha dilemel tikedennoù diwar ziviz diouzh adweladennoù hiniennel pe monedoù marilh",
        "action-deletechangetags": "Diverkañ tikedennoù a-ziwar an diaz-roadennoù",
        "action-purge": "spurjañ ar bajenn-mañ",
        "nchanges": "$1 {{PLURAL:$1|kemm|kemm}}",
        "rcfilters-invalid-filter": "Sil direizh",
        "rcfilters-empty-filter": "Sil oberiant ebet. War wel emañ an holl gemmoù.",
        "rcfilters-filterlist-title": "Siloù",
+       "rcfilters-filterlist-feedbacklink": "Reiñ ho soñj diwar-benn ar siloù (beta) nevez",
        "rcfilters-highlightbutton-title": "Lakaat an disoc'hoù war wel",
        "rcfilters-highlightmenu-title": "Dibabit ul liv",
        "rcfilters-filterlist-noresults": "N'eus bet kavet sil ebet",
        "rcfilters-filter-categorization-label": "Kemmoù rummad",
        "rcfilters-filter-categorization-description": "Roll ar pajennoù ouzhpennet da rummadoù zo pe dilamet diouto.",
        "rcfilters-filter-logactions-label": "Obererezhioù enrollet",
+       "rcfilters-filter-logactions-description": "Obererezhioù melestradurel, krouiñ kontoù, diverkañ pajennoù, enporzhiañ...",
        "rcnotefrom": "Setu aze {{PLURAL:$5|ar c'hemm|ar c'hemmoù}} c'hoarvezet abaoe an <strong>$3, $4</strong> (<strong>$1</strong> d'ar muiañ).",
        "rclistfrom": "Diskouez ar c'hemmoù diwezhañ abaoe an/ar $3 $2",
        "rcshowhideminor": "$1 ar c'hemmoù dister",
        "recentchangeslinked-page": "Anv ar bajenn :",
        "recentchangeslinked-to": "Diskouez ar c'hemmoù war-du ar pajennoù liammet kentoc'h eget re ar bajenn lakaet",
        "recentchanges-page-added-to-category": "[[:$1]] ouzhpennet d'ar rummad",
-       "recentchanges-page-removed-from-category": "Diverket eo bet [[$1]] diouzh ar rummad",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] ouzhpennet d'ar rummad, [[Special:WhatLinksHere/$1|emañ ensoc'het ar bajenn-mañ e diabarzh pajennoù all]]",
+       "recentchanges-page-removed-from-category": "Diverket eo bet [[:$1]] diouzh ar rummad",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] dilamet diouzh ar rummad, [[Special:WhatLinksHere/$1|emañ ensoc'het ar bajenn-mañ e diabarzh pajennoù all]]",
        "autochange-username": "Kemm emgefre gant MediaWiki",
        "upload": "Kargañ war ar servijer",
        "uploadbtn": "Kargañ ur restr",
        "uploaderror": "Fazi enporzhiañ",
        "upload-recreate-warning": "'''Diwallit''' : Diverket pe dilec'hiet ez eus bet ur restr gant an anv-se.'''\n\nDeoc'h da c'houzout, setu aze marilh an diverkañ hag an dilec'hiañ evit ar bajenn-mañ.",
        "uploadtext": "Grit gant ar furmskrid a-is evit enporzhiañ restroù war ar servijer.\nEvit sellet pe klask skeudennoù bet enporzhiet a-raok sellit ouzh [[Special:FileList|roll ar skeudennoù]]. Kavet e vo ar skeudennoù enporzhiet war [[Special:Log/upload|marilh ar pajennoù enporzhiet]] hag an diverkadennoù war [[Special:Log/delete|istor an diverkadennoù]].\n\nEvit enklozañ ur skeudenn en ur pennad, lakait er pennad-se ul liamm skrivet evel-henn :\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:anv_ar_restr.jpg]]</nowiki></code>''' evit diskouez ar restr en he spider brasañ ;\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:anv_ar_restr.png|deskrivadenn]]</nowiki></code>''' evit ober gant ur munud 200 piksel ledander er ur voest a-gleiz enni \"testenn zeskrivañ\" da zeskrivadenn\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:anv_ar_restr.ogg]]</nowiki></code>''' evit sevel ul liamm war-eeun war-du ar restr hep diskouez anezhi.",
-       "upload-permitted": "Seurtoù restroù aotreet : $1.",
-       "upload-preferred": "Seurtoù restroù gwellañ : $1.",
-       "upload-prohibited": "Seurtoù restroù berzet : $1.",
+       "upload-permitted": "{{PLURAL:$2|Seurt|Seurtoù}} restr aotreet : $1.",
+       "upload-preferred": "{{PLURAL:$2|Seurt|Seurtoù}} restr karetañ : $1.",
+       "upload-prohibited": "{{PLURAL:$2|Seurt|Seurtoù}} restr berzet : $1.",
        "uploadlogpage": "Marilh ar pajennoù enporzhiet",
        "uploadlogpagetext": "Setu a-is marilh ar restroù diwezhañ bet karget war ar servijer.\nS.o [[Special:NewFiles|rann ar skeudennoù nevez]] evit kaout ur sell gwiroc'h",
        "filename": "Anv ar restr",
        "largefileserver": "Brasoc'h eo ar restr-mañ eget ar pezh a c'hall ar servijer aotren.",
        "emptyfile": "Evit doare eo goullo ar restr bet karget ganeoc'h. Moarvat eo abalamour d'an tipo en anv ar restr. Gwiriit mat e fell deoc'h pellgargañ ar restr-mañ.",
        "windows-nonascii-filename": "N'eo ket skoret anvioù ar restroù enno arouezennoù dibar gant ar wiki-mañ.",
-       "fileexists": "Ur restr all gant an anv-se zo c'hoazh.\nTrugarez da wiriañ <strong>[[:$1]]</strong> ma n'oc'h ket sur e fell deoc'h kemmañ anezhi.\n[[$1|thumb]]",
+       "fileexists": "Ur restr all gant an anv-mañ zo c'hoazh.\nTrugarez da wiriañ <strong>[[:$1]]</strong> ma n'{{GENDER:|oc'h} ket sur e fell deoc'h kemmañ anezhi.\n[[$1|thumb]]",
        "filepageexists": "Amañ <strong>[[:$1]]</strong> eo bet krouet ar bajenn zeskrivañ evit ar restr-mañ, padal n'eus restr ebet dezhi an anv-se evit c'hoazh.\nAn diverradenn skrivet ganeoc'h ne vo ket gwelet war ar bajenn zeskrivañ.\nMar fell deoc'h e teufe ho tiverradenn war wel eno eo ret deoc'h-c'hwi kemmañ anezhi hoc'h-unan.\n[[$1|thumb]]",
-       "fileexists-extension": "Bez' ez eus dija ur restr gant an anv-se war-bouez nebeut : [[$2|thumb]]\n* Anv ar restr emeur oc'h enporzhiañ : <strong>[[:$1]]</strong>\n* Anv ar restr zo anezhi dija : <strong>[[:$2]]</strong>\nDibabit un anv all mar plij.",
+       "fileexists-extension": "Bez' ez eus ur restr gant an hevelep anv koulz lavaret : [[$2|thumb]]\n* Anv ar restr emeur oc'h enporzhiañ : <strong>[[:$1]]</strong>\n* Anv ar restr zo anezhi c'hoazh : <strong>[[:$2]]</strong>\nDibab un anv all a fell deoc'h kentoc'h marteze ?",
        "fileexists-thumbnail-yes": "Evit doare ez eus ur skeudenn krennet he ment eus ar restr ''(thumbnail)''. [[$1|thumb]]\nGwiriit ar restr <strong>[[:$1]]</strong>.\nMard eo an hevelep skeudenn ha hini ar restr orin, ha heñvel he ment, n'eo ket dav pellgargañ ur stumm krennet ouzhpenn.",
        "file-thumbnail-no": "Kregiñ a ra anv ar restr gant <strong>$1</strong>.\nEvit doare eo ur skeudenn krennet he ment ''(thumbnail)''.\nMa'z eus ganeoc'h ur skeudenn uhel he fizhder, pellgargit anezhi; a-hend-all cheñchit anv ar restr.",
        "fileexists-forbidden": "Ur restr all gant an anv-se zo c'hoazh ha n'hall ket bezan diverket.\nMar fell deoc'h enporzhiañ ho restr memes tra, kit war ho kiz ha grit gant un anv all [[File:$1|thumb|center|$1]]",
index dc6aeb0..ea3c6ac 100644 (file)
        "redirectedfrom": "(Preusmjereno sa $1)",
        "redirectpagesub": "Preusmjerenje",
        "redirectto": "Preusmjerenje na:",
-       "lastmodifiedat": "Ova stranica je posljednji put izmijenjena u $2 na $1.",
+       "lastmodifiedat": "Ova stranica je posljednji put izmijenjena na dan $1 u $2.",
        "viewcount": "Ovoj stranici je pristupljeno {{PLURAL:$1|$1 put|$1 puta}}.",
        "protectedpage": "Zaštićena stranica",
        "jumpto": "Idi na:",
        "revdelete-uname-unhid": "korisničko ime je otkriveno",
        "revdelete-restricted": "primijenjena ograničenja za administratore",
        "revdelete-unrestricted": "uklonjena ograničenja za administratore",
-       "logentry-block-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} sa vremenom isticanja blokade od $5 $6",
+       "logentry-block-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} u trajanju od $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|deblokirao|deblokirala}} je {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|promijenio|promijenila}} je postavke za blokiranje {{GENDER:$4|korisnika|korisnice}} {{GENDER:$4|$3}} u trajanju od $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} sa vremenom isticanja blokade od $5 $6",
index 210f856..4a1f6f6 100644 (file)
@@ -37,6 +37,8 @@
        "tog-watchdefault": "ئەو پەڕانە  و ئەو پەڕگانە من دەستکاریان دەکەم زیاد بکە بە لیستی چاودێڕییەکەم",
        "tog-watchmoves": "ئەو پەڕانە و ئەو پەڕگانە کە من گواستومنەتەوە زیاد بکە بە لیستی چاودێڕییەکەم",
        "tog-watchdeletion": "ئەو پەڕانە و ئەو پەڕگانە من سڕیومنەتەوە زیاد بکە بە لیستی چاودێڕییەکەم",
+       "tog-watchuploads": "ئەو پەڕگە نوێیانەی باریان دەکەم زیاد بکە ناو پێڕستی چاودێرییەکەمەوە",
+       "tog-watchrollback": "ئەو پەڕانەی کە کرداری گەڕاندنەوەم لەسەر ئەنجام داون زیاد بکە ناو پێڕستی چاودێرییەکەمەوە",
        "tog-minordefault": "ھەموو دەستکارییەکان بە ورد نیشان بکە لە حاڵەتی دیفاڵت",
        "tog-previewontop": "پێشبینین بەرلە چوارچێوەی دەستکاری نیشان بدە‌",
        "tog-previewonfirst": "لە یەکەم دەستکاری دا پێشبینین نیشان بدە",
        "newwindow": "(لە پەڕەیەکی نوێدا دەکرێتەوە)",
        "cancel": "ھەڵوەشاندنەوە",
        "moredotdotdot": "زیاتر",
-       "morenotlisted": "ئەم لیستەیە تەواو نییە",
+       "morenotlisted": "ئەم لیستە لەوانەیە تەواو نەبێت",
        "mypage": "پەڕە",
        "mytalk": "لێدوان",
        "anontalk": "لێدوان",
        "searcharticle": "بڕۆ",
        "history": "مێژووی پەڕە",
        "history_short": "مێژووی پەڕە",
+       "history_small": "مێژوو",
        "updatedmarker": "لە دوایین سەردانمدا نوێ کراوەتەوە",
        "printableversion": "وەشانی ئامادەی چاپ",
        "permalink": "بەستەری ھەمیشەیی",
        "view": "بینین",
        "view-foreign": "لە $1دا بیبینە",
        "edit": "دەستکاری",
+       "edit-local": "دەستکاریکردنی زانیارییە ناوخۆییەکان",
        "create": "دروستکردن",
        "create-local": "وەسفی ناوچەیی زۆر بکە",
        "editthispage": "دەستکاری ئەم پەڕەیە بکە‌",
        "talk": "وتووێژ",
        "views": "بینینەکان",
        "toolbox": "ئامرازەکان",
+       "tool-link-userrights": "بینینی گرووپەکانی {{GENDER:$1|بەکارھێنەر}}",
        "tool-link-userrights-readonly": "بینینی گرووپەکانی {{GENDER:$1|بەکارھێنەر}}",
        "tool-link-emailuser": "ئیمەیلی ئەم {{GENDER:$1|بەکارھێنەر}}ە",
        "userpage": "بینینی پەڕەی بەکارھێنەر",
        "viewsource": "بینینی سەرچاوە",
        "viewsource-title": "سەرچاوەی $1 ببینە",
        "actionthrottled": "چالاکی پێشی پێ گیرا",
-       "actionthrottledtext": "بÛ\95 Ù\85Û\95بÛ\95ستÛ\8c Ù¾Û\8eشگرÛ\8cÛ\8c Ù\84Û\95 Ø³Ù¾Û\95Ù\85Ø\8c Ú\95Û\8eÚ¯Û\95 Ù\86ادرÛ\8eت ØªÛ\86 Ù\84Û\95 Ù\85اÙ\88Û\95Û\8cÛ\95Ú©Û\8c Ú©Ù\88رت Ø¯Ø§ Ù\84Û\95 Ø³Û\95ر Û\8cÛ\95Ú© Ø¦Û\95Ù\85Û\95 Ø²Û\86ر Ø¬Ø§Ø± Ø¦Û\95Ù\86جاÙ\85 Ø¨Ø¯Û\95Û\8cØ\8c Ù\88Û\95 ئیستا تۆ لە ڕادە بەدەرت کردووە.\nتکایە پاش چەند خولەک دووبارە تاقی بکەوە.",
+       "actionthrottledtext": "بÛ\95 Ù\85Û\95بÛ\95ستÛ\8c Ù¾Û\8eشگرÛ\8cÛ\8c Ù\84Û\95 Ø®Ø±Ø§Ù¾Ú©Ø§Ø±Û\8cØ\8c Ú\95Û\8eÚ¯Û\95 Ù\86ادرÛ\8eت ØªÛ\86 Ù\84Û\95 Ù\85اÙ\88Û\95Û\8cÛ\95Ú©Û\8c Ú©Ù\88رت Ø¯Ø§ Ù\84Û\95 Ø³Û\95ر Û\8cÛ\95Ú© Ø¦Û\95Ù\85Û\95 Ø²Û\86ر Ø¬Ø§Ø± Ø¦Û\95Ù\86جاÙ\85 Ø¨Ø¯Û\95Û\8cØ\8c ئیستا تۆ لە ڕادە بەدەرت کردووە.\nتکایە پاش چەند خولەک دووبارە تاقی بکەوە.",
        "protectedpagetext": "بۆ بەرگری لە دەستکاریکردن یان چالاکییەکانی تر ئەم پەڕەیە پارێزراوە.",
        "viewsourcetext": "دەتوانی سەرچاوەی ئەم پەڕە ببینی و کۆپیی بکەی٫",
        "viewyourtext": "دەتوانی ژێدەری <strong>دەستکارییەکەت</strong> لەم پەڕەیەدا ببینی و کۆپی بکەی.",
        "virus-scanfailed": "سکەن ئەنجام نەدرا(کۆد $1)",
        "virus-unknownscanner": "دژەڤایرس نەناسراوە:",
        "logouttext": "'''ئێستا چوویتە دەرەوە.'''\n\nئاگادار بە ھەتا ئەو کاتەی کەشی وێبگەڕەکەت پاک دەکەیتەوە، لەوانەیە ھەندێک لە پەڕەکان وا پێشان بدرێن کە ھێشتا لە ژوورەوە بیت.",
+       "cannotlogoutnow-title": "ناتوانیت لە ئێستادا بچیتە دەرەوە",
+       "cannotlogoutnow-text": "توانای چوونە دەرەوەت نییە لەکاتی بەکارھێنانی $1",
        "welcomeuser": "بەخێربێیت، $1!",
        "welcomecreation-msg": "ھەژمارەکەت دروست کرا.\nلە بیرت نەچێت [[Special:Preferences|ھەڵبژاردەکانی {{SITENAME}}]]ت بگۆڕی.",
        "yourname": "ناوی بەکارھێنەری:",
        "createacct-yourpasswordagain-ph": "تێپەروشە دیسان بنووسەوە",
        "userlogin-remembermypassword": "چوونەژوورەوەکەم ڕابگرە",
        "userlogin-signwithsecure": "پەیوەندیی دڵنیا بەکاربھێنە",
+       "cannotlogin-title": "ناتوانیت بچیتە ژوورەوە",
+       "cannotlogin-text": "توانای چوونەژوورەوەت نییە",
+       "cannotloginnow-title": "ناتوانیت لە ئێستادا بچیتە ناوەوە",
+       "cannotloginnow-text": "توانای چوونەژوورەوەت نییە لەکاتی بەکارھێنانی $1",
+       "cannotcreateaccount-title": "ناتوانرێت ھەژمار دروست بکرێت",
        "yourdomainname": "دۆمەینەکەت:",
        "password-change-forbidden": "ناتوانیت تێپەڕوشەکانت لەم ویکییەدا بگۆڕیت.",
        "externaldberror": "یان هەڵەی ڕێگەپێدانی بنکەدراو هەیە یان ڕێگات پێ نادرێت بۆ نوێ کردنی هەژماری دەرەکیت.",
        "login": "بچۆ ژوورەوە",
+       "login-security": "شوناست دڵنیا بکەرەوە",
        "nav-login-createaccount": "بچۆ ژوورەوە / ھەژمار دروست بکە",
        "userlogin": "بچۆ ژوورەوە / ھەژمار دروست بکە",
        "userloginnocreate": "بچۆ ژوورەوە",
        "userlogin-resetpassword-link": "تێپەڕوشەکەت بیر کردووە؟",
        "userlogin-helplink2": "یارمەتی بۆ چوونەژوورەوە",
        "userlogin-loggedin": "تۆ ھەر ئێستا بە ناوی {{GENDER:$1|$1}} چوویتە ژوورەوە.\nفۆرمی ژێرەوە بەکاربھێنە بۆ چوونەژوورەوە وەک بەکارھێنەرێکی تر.",
+       "userlogin-reauth": "دەبێت دووبارە بچیتە ژوورەوە بۆ دڵنیا بوونەوە لە {{GENDER:$1|$1}}بوونت.",
        "userlogin-createanother": "ھەژمارێکی تر دروست بکە",
        "createacct-emailrequired": "ناونیشانی ئیمەیل",
        "createacct-emailoptional": "ناونیشانی ئیمەیل (دڵخوازانە)",
        "createacct-email-ph": "ناونیشانی ئیمەیلەکەت بنووسە",
        "createacct-another-email-ph": "ناونیشانی ئیمەیڵەکەت بنووسە",
        "createaccountmail": "تێپەڕوشەیەکی ھەڕەمەکیی کاتی بەکاربھێنە و بینێرە بۆ ناونیشانی ئیمەیلی دیاریکراو",
+       "createaccountmail-help": "دەتوانرێت بەکار بھێندرێت بۆ دروستکردنی ھەژمار بۆ کەسێکی تر بەبێ زانینی تێپەڕ وشەکەی.",
        "createacct-realname": "ناوی ڕاستی (دڵخوازانە)",
        "createaccountreason": "هۆکار:",
        "createacct-reason": "ھۆکار",
        "createacct-reason-ph": "بۆ ھەژمارێکی تر دروست دەکەی",
        "createacct-submit": "ھەژمارەکەت دروست بکە",
        "createacct-another-submit": "ھەژمار دروست بکە",
+       "createacct-continue-submit": "بەردەوامبوون لە دروستکردنی ھەژمار",
+       "createacct-another-continue-submit": "بەردەوامبوون لە دروستکردنی ھەژمار",
        "createacct-benefit-heading": "{{SITENAME}} لە لایەن کەسانێک وەکوو خۆت دروست کراوە.",
        "createacct-benefit-body1": "{{PLURAL:$1|دەستکاری}}",
        "createacct-benefit-body2": "{{PLURAL:$1|پەڕە}}",
        "createacct-benefit-body3": "دوایین {{PLURAL:$1|بەشداربوو|بەشداربووان}}",
        "badretype": "تێپەڕوشەکان لەیەک ناچن.",
+       "usernameinprogress": "دروستکردنی ھەژمارێک بۆ ئەم ناوی بەکارھێنەرە لە پڕۆسەی بەرھەمھێناندایە. تکایە چاوەڕوان بە.",
        "userexists": "ئەو ناوەی تۆ داوتە پێشتر بەکارھێنراوە.\nناوێکی دیکە ھەڵبژێرە.",
        "loginerror": "ھەڵەی چوونەژوورەوە",
        "createacct-error": "ھەڵە لە دروستکردنی ھەژمار",
        "nocookiesnew": "ھەژماری بەکارھێنەری دروست کرا، بەڵام نەچوویتەوە ژوورەوە.\n{{SITENAME}} بۆ چوونەوە ژوورەوەی بەکارھێنەر کوکی بەکاردەھێنێت.\nتۆ کوکییەکەکەت لەکارخستووە.\nتکایە کوکییەکە کارا بکە، پاشان بە ناوی بەکارھێنەری و تێپەڕوشەکەت بچۆ ژوورەوە.",
        "nocookieslogin": "{{SITENAME}} بۆ چوونەژوورەوە لە کووکی‌یەکان کەڵک وەرئەگرێت.\nڕێگەت نەداوە بە کووکی‌یەکان.\nڕێگەیان پێ بدەو و دیسان تێبکۆشە.",
        "nocookiesfornew": "ھەژماری بەکارھێنەری دروست نەکرا، چون ناتوانین سەرچاوەکەی پشتڕاست بکەینەوە.\nدڵنیا بە کوکییەکانت چالاک کردووە، پەڕەکە بار بکەوە و دیسان ھەوڵ بدە.",
+       "createacct-loginerror": "ھەژمارەکە بە سەرکەوتوانە دروست کرا، بەڵام ناتوانرێت بە شێوەیەکی ئۆتۆماتیکی بکرێیتە ژوورەوە. تکایە سەردانی [[Special:UserLogin|ڕێنماییەکانی چوونەژوورەوە]] بکە.",
        "noname": "ناوی بەکارهێنەرییەکی گۆنجاوت دیاری نەکردووه.",
        "loginsuccesstitle": "چوویە ناوەوە",
        "loginsuccess": "'''ئێستا بە ناوی «$1»ەوە لە {{SITENAME}} چوویتەتەژوورەوە.'''",
-       "nosuchuser": "بەکارھێنەرێک بە ناوی «$1» نیە.\nناوی بەکارھێنەر بە گەورە و بچووک بوونی پیتەکان ھەستیارە.\nڕێنووسەکەت چاولێکەرەوە، یان [[Special:CreateAccount|ھەژمارێکی نوێ دروست بکە]].",
+       "nosuchuser": "بÛ\95کارھÛ\8eÙ\86Û\95رÛ\8eÚ© Ø¨Û\95 Ù\86اÙ\88Û\8c Â«$1» Ù\86Û\8cÛ\8cÛ\95.\nÙ\86اÙ\88Û\8c Ø¨Û\95کارھÛ\8eÙ\86Û\95ر Ø¨Û\95 Ú¯Û\95Ù\88رÛ\95 Ù\88 Ø¨Ú\86Ù\88Ù\88Ú© Ø¨Ù\88Ù\88Ù\86Û\8c Ù¾Û\8cتÛ\95کاÙ\86 Ú¾Û\95ستÛ\8cارÛ\95.\nÚ\95Û\8eÙ\86Ù\88Ù\88سÛ\95Ú©Û\95ت Ú\86اÙ\88Ù\84Û\8eÚ©Û\95رÛ\95Ù\88Û\95Ø\8c Û\8cاÙ\86 [[Special:CreateAccount|Ú¾Û\95Ú\98Ù\85ارÛ\8eÚ©Û\8c Ù\86Ù\88Û\8e Ø¯Ø±Ù\88ست Ø¨Ú©Û\95]].",
        "nosuchusershort": "بەکارھێنەرێک بە ناوی «$1»ەوە نیە.\nبە نووسراوەکەتدا بچۆرەوە.",
        "nouserspecified": "دەبێت ناوێکی بەکارھێنەری دەستنیشان بکەیت.",
        "login-userblocked": "ئەم بەکارهێنەرە بڵۆک کراوە. چوونەژوورەوە ڕێگەپێنەدراوە.",
        "wrongpassword": "تێپەڕوشەی ھەڵە.\nتکایە دووبارە تێبکۆشە.",
        "wrongpasswordempty": "تێپەڕەوشەی لێدراو بەتاڵبوو.\nتکایە هەوڵ بدەوە.",
        "passwordtooshort": "تێپەڕوشەکەت لانی کەم دەبێ {{PLURAL:$1|١ پیت|$1 پیت}} بێت.",
+       "passwordtoolong": "تێپەڕ وشەکان ناتوانرێت لە {{PLURAL:$1|١ کارەکتەر|$1 کارەکتەر}} درێژتر بێت.",
+       "passwordtoopopular": "تێپەڕ وشە باوەکان ناتواندرێت دابنرێن. تکایە تێپەڕ وشەیەکی دەگمەنتر ھەڵبژێرە.",
        "password-name-match": "تێپەڕوشەکەت ئەبێ جیاواز بێت لە ناوی بەکارهێنەریت.",
        "password-login-forbidden": "بەکارهێنانی ئەم ناوی بەکارهێنەر و تێپەڕەووشەیە قەدەغەکراوە.",
        "mailmypassword": "تێپەڕوشەکە ڕێک بخەوە",
        "noemail": "ھیچ ئەدرەسێکی ئیمەیل تۆمار نەکراوە بۆ بەکارھێنەر « $1 ».",
        "noemailcreate": "دەبێ ناونیشانێکی دروستی ئیمەیل بنووسی",
        "passwordsent": "تێپەڕوشەیەکی نوێ نێررا بۆ ئەدرەسی ئیمێلی تۆمارکراوی «$1».\nتکایە دوای وەرگرتنی، دیسان بچۆ ژوورەوە.",
-       "blocked-mailpassword": "ئادرەسی ئای‌پی تۆ بۆ دەستکاری کردن بەستراوه بۆیە بۆ بەرگری لە بەکارهێنانی نابەجێ ئەنجامی گەڕانەوەی تێپەڕوشە ڕیگە نەدراوە.",
+       "blocked-mailpassword": "ناونیشانی ئای پی تۆ بۆ دەستکاری کردن بەستراوه. بۆ بەرگری لە بەکارهێنانی نابەجێ، ئەنجامی گەڕانەوەی تێپەڕوشە ڕیگە نەدراوە لەسەر ئەم ناونیشانە ئای پییە.",
        "eauthentsent": "ئیمێلێکی پشتڕاستکردنەوە بۆ ناونیشانی ئیمێلی دیاریکراو نێررا.\nپێش ئەوەی ئیمەیلی تر بۆ ئەم ھەژمارە بنێررێت، دەبێت پەیڕەوی ڕێکارەکانی ناو ئیمێلەکە بکەیت بۆ پشتڕاستکردنەوەی ئەوەی کە ئەم هەژمارە بە ڕاستی ھی تۆیە.",
        "throttled-mailpassword": "ئیمەیلێکی ڕیکخستنەوەی تێپەڕوشە لە ماوەی {{PLURAL:$1|ساعەت}}ی ڕابردوودا نێردراوە.\nبۆ ڕێگری لە بەکارھێنانی خراپ، ھەر {{PLURAL:$1|ساعەت}} تاکە یەک ئیمەیلی ڕیکخستنەوەی تێپەڕوشە دەنێردرێت.",
        "mailerror": "هەڵە ڕوویدا لە ناردنی ئیمەیل: $1",
        "createaccount-title": "درووست کردنی ھەژمار بۆ {{SITENAME}}",
        "createaccount-text": "کەسێک ھەژمارێکی بۆ ناونیشانی ئیمێلی تۆ لە {{SITENAME}}دا ($4) بە ناوی «$2»ـەوە و بە تێپەڕوشەی  «$3»ـەوە دروست کردووە.\nدەبێت ھەر ئێستا بچیتە چوورەوە و تێپەڕوشەیەکەت بگۆڕیت.\n\nئەگەر ئەم ھەژمارە بە ھەڵە دروست کراوە، دەکرێت گوێ بەم پەیامە نەدەیت.",
        "login-throttled": "زۆر زۆر ھەوڵت داوە بۆ چوونە ژوورەوە.\nتکایە $1 بوەستە پێش ھەوڵی دووبارە.",
+       "login-abort-generic": "چوونەژوورەوەکەت شکستی ھێنا - بەجێ ھێڵدرا",
+       "login-migrated-generic": "ھەژمارەکەت گوازراوەتەوە و ناوی بەکارھێنەرەکەت چی تر لەسەر ئەم ویکیپیدیایە بوونی نییە.",
        "loginlanguagelabel": "زمان: $1",
+       "suspicious-userlogout": "داواکارییەکەت بۆ چوونە دەرەوە ڕەت کرایەوە لەبەر ئەوەی وا دیارە داواکارییەکە لەلایەن براوسەرێکی شکاوەوە نێردراوە.",
+       "createacct-another-realname-tip": "ناوی ڕاستیت پێویست نییە.\nئەگەر ھەڵت بژارد کە دایبنێیت، ئەوا بەکار دەھێندرێت بۆ ئاماژە کردن بە بەکارھێنەر بۆ بەشدارییەکانیان.",
        "pt-login": "بچۆ ژوورەوە",
        "pt-login-button": "بچۆ ژوورەوە",
+       "pt-login-continue-button": "بەردەوامبوونی چوونەژوورەوە",
        "pt-createaccount": "ھەژمار دروست بکە",
        "pt-userlogout": "بچۆ دەرەوە",
+       "user-mail-no-addy": "ھەوڵی ناردنی ئیمەڵ درا بەبێ ھەبوونی ناونیشانێکی ئیمەیڵ.",
        "changepassword": "تێپەڕوشە بگۆڕە",
        "resetpass_announce": "بۆ کۆتایی چوونە ژوورەوە، دەبێت تێپەڕوشەیەکی نوێ دابنێیت.",
        "resetpass_text": "<!-- تێپه‌ڕه‌وشه‌ی هه‌ژماره‌كه‌ سفر بكه‌ره‌وه‌ -->",
        "retypenew": "تێپەڕوشەی نوێ دوبارە بنووسەوە:",
        "resetpass_submit": "تێپەڕوشە رێکخە و بچۆ ژوورەوە",
        "changepassword-success": "تێپەڕەوشەکەت  گۆڕدرا!",
+       "changepassword-throttled": "تۆ ھەوڵی زۆری چوونەژوورەوەت داوە. \nتکایە $1 چاوەڕوان بە پێش دووبارە ھەوڵدانەوە.",
+       "botpasswords": "تێپەڕ وشەی بۆت",
+       "botpasswords-disabled": "تێپەڕ وشەی بۆتەکان کوژێنرانەوە.",
+       "botpasswords-label-appid": "ناوی بۆت",
        "botpasswords-label-create": "دروستکردن",
        "botpasswords-label-update": "نوێکردنەوە",
        "botpasswords-label-cancel": "ھەڵوەشاندنەوە",
        "botpasswords-label-delete": "سڕینەوە",
        "botpasswords-label-resetpassword": "ڕێکخستنەوەی تێپەڕوشە",
+       "botpasswords-bad-appid": "ناوی بۆت «$1» دروست نییە.",
+       "botpasswords-created-title": "تێپەڕ وشەی بۆت دروست کرا",
+       "botpasswords-updated-title": "تێپەڕ وشەی بۆتەکە نوێ کرایەوە",
+       "botpasswords-deleted-title": "تێپەڕ وشەی بۆت سڕدرایەوە",
        "resetpass_forbidden": "تێپەڕوشەکە ناگۆڕدرێت",
        "resetpass-no-info": "بۆ گەیشتنی راستەوخۆ بەم پەڕە ئەشێ بچیتە ژوورەوە.",
        "resetpass-submit-loggedin": "تێپەڕوشە بگۆڕە",
        "resetpass-submit-cancel": "ھەڵوەشاندنەوە",
        "resetpass-wrong-oldpass": "تێپەڕوشەی ھەنووکەیی یان تێپەڕوشەی کاتی ھەڵەیە.\nوا دیارە تێپەڕوشەکەت بە سەرکەوتوویی گۆڕدراوە یان داوای تێپەڕوشەیەکی نوێت کردووە.",
+       "resetpass-recycled": "تکایە تێپەڕوشەکەت بگۆڕە بە دانەیەکی جیاواز لەوەی ئێستا.",
        "resetpass-temp-emailed": "تۆ بە تێپەڕوشەیەکی کاتیی ھاتوویتە ژوورەوە. بۆ تەواوکردنی چوونە ژوورەوە تێپەڕوشەیەکی نوێ لێرە دابنێ.",
        "resetpass-temp-password": "تێپەڕوشەی کاتی:",
+       "resetpass-expired": "تێپەڕ وشەکەت بەسەر چووە، تکایە تێپەڕ وشەیەکی نوێ دابنێ بۆ چوونە ژوورەوە",
+       "resetpass-validity-soft": "تێپەڕ وشەکەت دروست نییە: $1",
        "passwordreset": "ڕێکخستنەوەی تێپەڕوشە",
        "passwordreset-text-one": "ئەم فۆرمە تەواو بکە بۆ بەدەستھێنانی تێپەڕ وشەیەکی کاتیی بە ئیمەیڵ",
        "passwordreset-text-many": "{{PLURAL:$1|یەکێک لەم بۆشاییانە بڕ بکەرەوە بۆ بەدەستھێنانی تێپەڕ وشەیەکی کاتیی بە ئیمەیڵ}}",
        "passwordreset-emailsentusername": "ئەگەر ناونیشانی ئەم ئیمەیڵە بەستراوەتەوە بە ناوی بەکارھێنەرتەوە، ئەوا ڕێکخستنەوەی تێپەڕ وشەت بە ئیمەیڵ پێ دەگات.",
        "passwordreset-invalidemail": "ناونیشانی ئیمەیڵی نەگونجاو",
        "passwordreset-nodata": "نە ئیمەیڵێک یان ناوی بەکارھێنەرێک ھەڵبژێردرا",
-       "changeemail": "گۆڕینی ناونیشانی ئیمەیل",
+       "changeemail": "گۆڕین یان لابردنی ناونیشانی ئیمەیل",
        "changeemail-header": "ئەم فۆرمە تەواو بکە بۆ گۆڕینی ناونیشانی ئیمەیڵەکەت. ئەگەر ئارەزووی ئەوە دەکەیت کە ھەر ئیمەیڵێک لە ھەژمارەکەت بکەیتەوە، بۆشایی ئیمەیڵی نوێ بە بەتاڵی بەجێ بھێڵە لەکاتی پاشەکەوتکردنی فۆرمەکە.",
        "changeemail-no-info": "بۆ گەیشتنی راستەوخۆ بەم پەڕە دەبێت بچیتە ژوورەوە.",
        "changeemail-oldemail": "ئەدرەسی ئیمەیڵی ئێستا:",
        "sig_tip": "واژووەکەت بە مۆری ڕێکەوتەوە",
        "hr_tip": "هێڵی ئاسۆیی (دەگمەن بەکاری بێنە)",
        "summary": "کورتەی دەستکاری:",
-       "subject": "بابەت/سەردێڕ:",
+       "subject": "بابەت:",
        "minoredit": "ئەمە دەستکارییەکی بچووکە",
        "watchthis": "ئەم پەڕەیە بخە ژێر چاودێری",
        "savearticle": "پەڕەکە پاشەکەوت بکە",
        "savechanges": "پاشەکەوتکردنی گۆڕانکارییەکان",
+       "publishpage": "بڵاوکردنەوەی پەڕە",
+       "publishchanges": "پاشەکەوتکردنی گۆڕانکارییەکان",
        "preview": "پێشبینین",
        "showpreview": "پێشبینین نیشان بدە",
        "showdiff": "گۆڕانکارییەکان نیشان بدە",
+       "blankarticle": "<strong>ئاگاداری:</strong> ئەو پەڕەیەی کە ھەوڵی دروستکردنی دەدەیت واڵایە. ئەگەر کرتە لەسەر «{{int:savearticle}}» بکەیت دووبارە، پەڕەکە بەبێ ھیچ ناوەڕۆکێک دروست دەبێت.",
        "anoneditwarning": "<strong>ھۆشیار بە:</strong> نەڕۆیشتووتەتە ژوورەوە. ھەر دەستکارییەک بکەیت ناونیشانی IPیەکەت بۆ ھەموو کەسێک دیار دەبێت. بەڵام ئەگەر <strong>[$1 بچیتە ژوورەوە]</strong> یان <strong>[$2 ھەژمارێک دروست بکەیت]</strong>، دەستکارییەکانت بە ناوی بەکارھێنەرییەکەتەوە بڵاو دەبێتەوە و لە چەند قازانجی تریشی ھەیە.",
        "anonpreviewwarning": "«نەڕۆشتوویتە ژوورەوە. پاشەکەوتکردن، ئەدرەسی IPەکەت لە مێژووی دەستکاریی ئەم پەڕە تۆمار دەکات.»",
        "missingsummary": "'''وە بیر خستنەوە:''' پوختەیەکت نەنووسیوە بۆ چۆنیەتی گۆڕانکارییەکەت.\nئەگەر جارێکی تر پاشکەوت کردن لێبدەی، بێ پوختە تۆمار دەکرێ.",
+       "selfredirect": "<strong>ئاگاداری:</strong> تۆ خەریکی گواستنەوەی ئەم پەڕەیەیت بۆ سەر خۆی. لەوانەیە خەریکی گواستنەوەی پەڕەیەکی ھەڵە بیت یان ھەوڵی گواستنەوە دەدەیت بۆ ئامانجێکی ھەڵە. \nئەگەر دەەبارە کرتە لەسەر «{{int:savearticle}}» بکەیتەوە، ڕەوانەکەرەکە دروست دەکرێت بەھەرحاڵ.",
        "missingcommenttext": "تکایە لە خوارەوە شرۆڤەیەک بنووسە.",
        "missingcommentheader": "'''بیرهێنانەوە:''' بۆ ئەم بۆچوونەت سەردێڕ\\بابەت ڕاچاو نەکردووە.\nئەگەر دیسان «{{int:savearticle}}» لێبدەی، دەستکاریەکەت بێ سەردێڕ یان بابەت پاشەکەوت دەبێ.",
        "summary-preview": "پێشبینینی کورتە:",
-       "subject-preview": "پێشبینینی بابەت/سەردێڕ:",
+       "subject-preview": "پێشبینینی بابەت:",
+       "previewerrortext": "ھەڵەیەک دروست بوو لەکاتی ھەوڵدان بۆ بینینی دەستکارییەکانت.",
        "blockedtitle": "بەکارھێنەر بەربەست کراوە",
        "blockedtext": "'''ناوی بەکارهێنەری یان ئای‌پی ئەدرەسی تۆ بەربەست‌ کراوە.'''\n\nبەربەست لە لایەن $1 کراوە.\nهۆکاری بەربەست کردن ''$2''ە.\n\n* دەستپێکی بەربەست‌کران: $8\n* کۆتایی هاتنی بەربەست‌کران: $6\n* بابەتی بەربەست: $7\n\nبۆ وتووێژ سەبارەت بە بەربەست‌کرانەکە دەبێ پەیوەندی بکەی بە $1 یان یەکێ دی لە [[{{MediaWiki:Grouppage-sysop}}|بەڕێوبەران]].\nلە بیرت بێ تاکوو ئیمەیل ئەدرەسێکی بڕوا پێ‌کراو لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر]] ڕاچاو نەکەی، نابێت لە هەلی «ئیمەیل ناردن بۆ ئەم بەکارهێنەرە» کەڵک وەر بگری؛ کەڵک وەرگرتن لەوە بەربەست نەکراوە بۆت.\n\nئای‌پی ئەدرەسی ئێستای تۆ $3 و پێناسەی بەربەست‌کراو #$5.\nتکایە لە هەر پرس و داواکاریەکت‌دا هەموو وردەکاریەکانی سەرەوە بگونجێنە.",
        "autoblockedtext": "ناونیشانی IPی تۆ بە شێوەی خۆکارانە بەرگیری لێ کراوە چوونکە بەکارھێنەرێکی دیکە بە خراپی بە کاری ھێناوە و بە دەستی $1 بەرگیری لێ کراوە.\nبەم ھۆکارەوە:\n\n:<em>$2</em>\n\n* دەست پێ کردنی بەرگیری: $8\n* بە سەر چوونی بەرگیری: $6\n* Intended blockee: $7\n\nدەتوانیت پەیوەندی بکەیت بە $1 یان یەکێکی دیکە لە [[{{MediaWiki:Grouppage-sysop}}|بەڕێوەبەران]] بۆ وتووێژ لە سەر بەرگیرییەکە.\n\nتێ بگە کە ناتوانیت ئامرازی «ئیمێل بنێرە بۆ ئەم بەکارھێنەرە» بە کار بھێنیت مەگەر ئەوەی کە پێشتر لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر]]تدا ناونیشانێکی گونجاوی ئیمێلت تۆمار کردبێت و بەرگیریت لێ نەکرابێت لە بەکارھێنانی ئەو ئامرازەش.\n\nناونیشانی IPی ئێستای تۆ $3ـە و پێناسەی یەرگیرییەکە #$5ـە.\nتکایە ھەموو وردەکارییەکانی سەرەوە ھەبێت لە ھەر پرس و داوایک کە دەیکەیت.",
        "accmailtext": "تێپەڕوشەیەک کە بە هەڕەمەکی بۆ [[User talk:$1|$1]] دروست کرا، نێررا بۆ $2. دەتوانیت لە پەڕەی <em>[[Special:ChangePassword|گۆڕینی تێپەڕوشەدا]]</em> لە کاتی چوونەژوورەوەدا بیگۆڕی.",
        "newarticle": "(نوێ)",
        "newarticletext": "بە دوای بەستەری پەڕەیەک کەوتووی کە ھێشتا دروست نەکراوە.\nبۆ دروست کردنی پەڕەکە، لە چوارچێوەکەی خوارەوە دەست بکە بە تایپ کردن. (بۆ زانیاری زورتر\n[$1 یارمەتی] ببینە).\nئەگەر بە ھەڵەوە ھاتویتە ئێرە، لە سەر دوگمەی '''back'''ی وێبگەڕەکەت کلیک بکە.",
-       "anontalkpagetext": "----''ئەمە لاپەڕەی وتووێژە بۆ بەکارهێنەرێکی نەناسراوە کە هێشتا هەژمارەی درووست‌نەکردووه یان کەڵکی‌ لێ وەرناگرێ .\nلەبەر ئەوە مەجبوورین ئای‌پی ئەدرەسەکی ژمارەیی بۆ ناساندنی بەکار بێنین.\nئای‌پی ئەدرەسی وا لەوانەیه لە لایەن چەندین بەکارهێنەروە بەکاربێت.\nئەگەر تۆ بەکارهێنەرێکی نەناسراوی و هەست ئەکەی ئەم لێدوانە پەیوەندی بە تۆوە نیە تکایە [[Special:CreateAccount|ھەژمارێکی نوێ دروست بکە]] یان [[Special:UserLogin|بچۆ ژوورەوە]] لەبەر ئەوەی لەداهاتوودا دەگەڵ بەکارهێنەرانی‌ نەناسراوی دی تێکەڵ نەکرێیت. ''",
+       "anontalkpagetext": "----\n<em>ئەمە لاپەڕەی وتووێژە بۆ بەکارهێنەرێکی نەناسراوە کە هێشتا هەژمارەی درووست نەکردووه یان کەڵکی‌ لێ وەرناگرێ.</em>\nلەبەر ئەوە ناچارین ناونیشانی ئای پی ژمارەیی بۆ ناساندنی بەکار بێنین.\nناونیشانی ئای پی وا لەوانەیه لە لایەن چەندین بەکارهێنەری ترەوە بەکاربێت.\nئەگەر تۆ بەکارهێنەرێکی نەناسراویت و هەست دەکەیت ئەم لێدوانە پەیوەندی بە تۆوە نییە، تکایە [[Special:CreateAccount|ھەژمارێکی نوێ دروست بکە]] یان [[Special:UserLogin|بچۆ ژوورەوە]] بۆ تێکەڵ نەبوونت لەگەڵ بەکارھێنەرانی نەناسراوی تردا لە داھاتوودا.",
        "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}}|بۆ ئەم ناوە بگەڕێی]]، یان <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لە لۆگە پەیوەندیدارەکاندا بگەڕێی]</span>، بەڵام ناتوانی ئەم پەڕەیە دروست بکەی.",
+       "missing-revision": "بەسەرداچوونەوەی #$1 پەڕەی «{{FULLPAGENAME}}» بوونی نییە.\n\nئەمە ھەندێک جار ھۆکاری ئەوەیە کە مێژووەکەی بەسەرچووە یاخود پەڕەکە سڕدراوەتە.\nوردەکارییەکان دەتوانرێن ببینرێن لە [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} لۆگی سڕینەوەدا].",
        "userpage-userdoesnotexist": "ھەژماری بەکارھێنەریی «$1» تۆمار نەکراوە.\nتکایە دڵنیا ببەرەوە ئەگەر دەتھەوێت ئەم پەڕەیە دروست یان دەستکاری بکەیت.",
        "userpage-userdoesnotexist-view": "ھەژماری بەکارھێنەریی «$1» تۆمار نەکراوە.",
        "blocked-notice-logextract": "ھەنووکە ئەم بەکارھێنەرە بەربەست کراوە.\nدوایین بابەتی لۆگی بەربەستن لە ژێرەوە ھاتووە:",
-       "clearyourcache": "تێبینی:''' لە دوای پاشەکەوت کردن، لەوانەیە  بۆ بینینی گۆڕانکارییەکان پێویست بێ cacheی وێبگەڕەکەت پاکبکەیتەوە.\n* '''Firefox / Safari:''' دوگمەی ''Shift'' بگرە کاتێک لەسەر ''Reload''دا کرتە دەکەی، یان ھەرکام لە ''Ctrl-F5'' یان ''Ctrl-R'' لێبدە (''⌘-R'' لەسەر Mac دا)\n* '''Google Chrome:''' دوگمەکانی ''Ctrl-Shift-R'' لێبدە  (''⌘-Shift-R'' لەسەر Mac دا)\n* '''Internet Explorer:''' دوگمەی ''Ctrl'' بگرە کاتێک لەسەر  ''Refresh''دا کرتە دەکەی، یان ''Ctrl-F5'' لێبدە\n* '''Opera:''' لە ڕێگەی ''Tools → Preferences'' ەوە cacheەکە بسڕەوە.",
+       "clearyourcache": "<strong>تێبینی:</strong> لە دوای پاشەکەوت کردن، لەوانەیە  بۆ بینینی گۆڕانکارییەکان پێویست بێ کاشی وێبگەڕەکەت پاکبکەیتەوە.\n* '''Firefox / Safari:''' دوگمەی ''Shift'' بگرە کاتێک لەسەر ''Reload''دا کرتە دەکەی، یان ھەرکام لە ''Ctrl-F5'' یان ''Ctrl-R'' لێبدە (''⌘-R'' لەسەر Mac دا)\n* '''Google Chrome:''' دوگمەکانی ''Ctrl-Shift-R'' لێبدە  (''⌘-Shift-R'' لەسەر Mac دا)\n* '''Internet Explorer:''' دوگمەی ''Ctrl'' بگرە کاتێک لەسەر  ''Refresh''دا کرتە دەکەی، یان ''Ctrl-F5'' لێبدە\n* '''Opera:''' لە ڕێگەی ''Tools → Preferences'' ەوە cacheەکە بسڕەوە.",
        "usercssyoucanpreview": "'''سەرچەشن:''' «{{int:showpreview}}» بەکاربێنە بۆ تاقی‌کردنەوەی CSS نوێ‌کەت، پێش پاشەکەوت‌کردن.",
        "userjsyoucanpreview": "'''سەرچەشن:''' «{{int:showpreview}}» بەکاربێنە بۆ تاقی‌کردنەوەی جاڤاسکریپتە نوێ‌کەت، پێش پاشەکەوت‌کردن.",
        "usercsspreview": "<strong>لە بیرت ببێت کە تەنھا خەریکی پێشبینینی CSSـەکەت دەبینیت.\nھێشتا پاشەکەوەت نەکراوە!</strong>",
        "previewnote": "'''لە بیرت نەچێت ئەمە تەنیا پێشبینینە.'''\nگۆڕانکارییەکانت ھێشتا پاشەکەوت نەکراون!",
        "continue-editing": "چوونە سەر بەشی دەستکاریکردن",
        "previewconflict": "ئەم پێشبینینە بە تۆ نیشان ئەدات ئەو دەقەی لە شوێنی دەستکاری سەرەوە داتناوە چۆن بەرچاو ئەکەوێت ئەگەر پاشەکەوتی بکەیت.",
-       "session_fail_preview": "'''ببوورە! ناتوانین دەستکارییەکەت پێواژۆ بکەین بە ھۆی لەدەستدانی session data.'''\nتکایە دیسان ھەوڵبدەوە.\nئەگەر ھێشتا کار ناکات، [[Special:UserLogout|چوونەدەرەوە]] و گەڕانەوەژوورەوە تاقی بکەوە.",
+       "session_fail_preview": "ببوورە! ناتوانین دەستکارییەکەت پێواژۆ بکەین بە ھۆی لەدەستدانی زانیاری و داتاکانی ئەم کۆرسە.\nلەوانەیە ھەژمارەکەت کرابێتە دەرەوە. <strong>تکایە دڵنیا بکەرەوە کە ھێشتا لە ژوورەوەیت و دووبارە ھەوڵ بدەرەوە.</strong>\nئەگەر ھێشتا کار ناکات، [[Special:UserLogout|چوونەدەرەوە]] و گەڕانەوەژوورەوە تاقی بکەوە، دواتریش ئەگەر ھێشتا ڕێگەت نەداوە، ڕێگە بە براوسەرەکەت بدە کە ''کوکی'' لەم سایەتەوە وەربگرێت.",
        "session_fail_preview_html": "'''ببوورە! ناتوانین دەستکارییەکەت پێواژۆ بکەین بە ھۆی لەدەستدانی session data.'''\n\n''لەبەر ئەوەی {{SITENAME}} ڕێگەی داوە بە raw HTML، بۆ بەرگری بەرامبەر بە هێرشەکانی جاڤاسکریپت، پێشبینین شاردراوەتەوە.''\n\n'''ئەگەر ئەمە ھەوڵێکی دەستکاریکردنی ڕەوایە، تکایە دیسان ھەوڵبدەوە.'''\nئەگەر ھێشتا کار ناکات، [[Special:UserLogout|چوونە دەرەوە]] گەڕانەوەژوورەوە تاقی بکەوە.",
        "token_suffix_mismatch": "'''دەستکاریەکەت پەسەند نەکرا لەبەر ئەوەی ڕاژەخواز یان وێبگەڕەکەت نووسەکانی خاڵبەندی لەیەک پچڕاندوە.'''<br />\nدەستکاریەکەت بۆ بەرگری لە تێکەڵ‌بوونی دەقی لاپەڕەکە وەر نەگیرا.<br />\nئەمە بڕێ‌جار کاتێ ڕوو ئەدات کە لە خزمەتی پرۆکسی سەر وێب کەڵک وەر بگریت.",
+       "edit_form_incomplete": "<strong>ھەندێک بەشی دەستکارییەکانت بە سێرڤەرەکەمان نەگەیشت. دووبارە سەیری دەستکارییەکانت بکە بۆ دڵنیا بوون لە تەواوییان و دووبارە ھەوڵ بدەرەوە.</strong>",
        "editing": "دەستکاریکردنی $1",
        "creating": "دروستکردنی $1",
        "editingsection": "دەستکاریکردنی $1 (بەش)",
        "copyrightwarning": "تکایە ئاگادار بە کە هەموو بەشدارییەکان لە {{SITENAME}} وا فەرز دەکرێت کە لە ژێر  $2دا بڵاودەبنەوە (سەیری $1 بکە بۆ وردەکاریەکان).\nئەگەر ناتەوێ نووسراوەکانت بە بێبەزەیی دەستکاری بکرێن و بە دڵخواز دابەشبکرێنەوە، مەینێرە بۆ ئێرە.<br />\nھەروەھا تۆ بەڵێنمان پێدەدەی کە خۆت ئەمەت نووسیوە یان لە پاوانێکی گشتی (public domain) یان سەرچاوە ئازادەکانی وەک ئەو وەرتگرتووە.\n'''ئەو کارانە کە مافی لەبەرگرتنەوەیان پارێزراوەکان بە بێ وەرگرتنی ئیجازە مەنێرە!'''",
        "copyrightwarning2": "ئاگادار بە کە هەموو بەشدارییەکان لە {{SITENAME}} لەوانەیە بەدەستی بەشداربووانی دیکەوە دەستکاری بکرێن، بگۆڕدرێن یا بسڕێنەوە.\nئەگەر ناتەوێ نووسراوەکانت بێبەزەیی دەستکاری بکرێن، ھەر مەینێرە بۆ ئێرە.<br />\nھەروەھا تۆ بەڵێنمان پێدەدەی کە خۆت ئەمەت نووسیوە یان لە پاوانێکی گشتی (public domain) یان سەرچاوە ئازادەکانی وەک ئەو وەرتگرتووە (سەیری $1 بکە بۆ وردەکاریەکان).\n'''ئەو کارانە کە مافی لەبەرگرتنەوەیان پارێزراوەکان بە بێ وەرگرتنی ئیجازە مەنێرە!'''",
        "longpageerror": "'''ھەڵە: ئەو دەقە تۆ ناردووتە {{PLURAL:$1|یەک کیلۆبایت|$1 کیلۆبایت}} درێژە، کە درێژترە لە زۆرینەی {{PLURAL:$2|یەک کیلۆبایت|$2 کیلۆبایت}}.'''\nئەمە پاشەکەوت ناکرێت.",
-       "readonlywarning": "<strong>ئاگادارÛ\8c: Ø¯Ø§ØªØ§Ø¨Û\95Û\8cس Ø¨Û\86 Ú\86اکسازÛ\8c Ø¯Ø§Ø®Ø±Ø§Ù\88Û\95Ø\8c Ø¨Û\86Û\8cÛ\95 Ø¦Û\8eستا Ù\86اتÙ\88اÙ\86Û\8c Ø¯Û\95ستکارÛ\8cÛ\95کاÙ\86ت Ù¾Ø§Ø´Û\95Ú©Û\95Ù\88ت Ø¨Ú©Û\95Û\8cت.</strong>\nدÛ\95تÙ\88اÙ\86Û\8cت Ø¯Û\95Ù\82Û\95Ú©Û\95ت Ú©Û\86Ù¾Û\8c Ø¨Ú©Û\95Û\8cت Ø¨Û\86 Ù\81اÛ\8cÙ\84Û\8eک و ھەڵی بگریت بۆ دوایی.\nئەو بەڕێوەبەرەی کە دای خستووە، ئەم هۆکارەی دەستنیشان کردووە: $1",
+       "readonlywarning": "<strong>ئاگادارÛ\8c: Ø¨Ù\86Ú©Û\95Û\8c Ø²Ø§Ù\86Û\8cارÛ\8c Ø¨Û\86 Ú\86اکسازÛ\8c Ø¯Ø§Ø®Ø±Ø§Ù\88Û\95Ø\8c Ø¨Û\86Û\8cÛ\95 Ø¦Û\8eستا Ù\86اتÙ\88اÙ\86Û\8c Ø¯Û\95ستکارÛ\8cÛ\95کاÙ\86ت Ù¾Ø§Ø´Û\95Ú©Û\95Ù\88ت Ø¨Ú©Û\95Û\8cت.</strong>\nدÛ\95تÙ\88اÙ\86Û\8cت Ø¯Û\95Ù\82Û\95Ú©Û\95ت Ù\84Û\95بÛ\95ر Ø¨Ú¯Ø±Û\8cتÛ\95Ù\88Û\95 Ø¨Û\86 Ù¾Û\95Ú\95Ú¯Û\95Û\8cÛ\95ک و ھەڵی بگریت بۆ دوایی.\nئەو بەڕێوەبەرەی کە دای خستووە، ئەم هۆکارەی دەستنیشان کردووە: $1",
        "protectedpagewarning": "'''وشیار بە: ئەم پەڕە پارێزراوە بۆ ئەوی تەنیا ئەو بەکارھێنەرانە کە مافەکانی بەڕێوەبەرایەتییان ھەیە بتوانن دەستکاریی بکەن.'''\nدوایین لۆگ بۆ ژێدەر لە خوارەوەدا ھاتووە:",
        "semiprotectedpagewarning": "'''ئاگاداری:''' ئەم پەڕە داخراوە بۆ ئەوی تەنھا بەکارھێنەرە تۆمارکراوەکان بتوانن دەستکاریی بکەن.\nدوایین لۆگ بۆ ژێدەر لە خوارەوەدا ھاتووە:",
-       "cascadeprotectedwarning": "'''ئاگاداری:''' ئەم لاپەڕە داخراوە بۆیە تەنها ئەو کەسانەی مافی بەڕێوبەرایەتی‌یان هەیە ئەتوانن دەستکاری بکەن، چۆنکا ئەمە {{PLURAL:$1|لاپه‌ڕه‌|لاپه‌ڕانه‌}} لە زنجیرەی پارێزراوەکانی لە خۆ گرتووە‌:",
+       "cascadeprotectedwarning": "'''ئاگاداری:''' ئەم لاپەڕە داخراوە بۆ ئەوەی تەنھا ئەو کەسانەی کە مافی بەڕێوبەرایەتییان هەیە بتوانن دەستکاری بکەن، چوونکە ئەم {{PLURAL:$1|لاپه‌ڕه‌|لاپه‌ڕانه‌}} لە زنجیرەی پارێزراوەکانی لە خۆ گرتووە‌:",
        "titleprotectedwarning": "'''ئاگاداری: ئەم پەڕە داخراوە، بۆئەوەی بۆ درووست‌کردنی [[Special:ListGroupRights|مافە تایبەتەکانت]] پێویستن.'''\nبۆ چاوانە دوایین لۆگ لە خوارەوەدا ھاتووە:",
        "templatesused": "ئەو {{PLURAL:$1|داڕێژەیە کە لەم پەڕەیەدا بە کارھێنراوە|داڕێژانە کە لەم پەڕەیەدا بە کارھێنراون}}:",
        "templatesusedpreview": "ئەو {{PLURAL:$1|داڕێژەیە کە لەم پێشبینینەدا بە کارھێنراوە|داڕێژانە کە لەم پێشبینینەدا بە کارھێنراون}}:",
        "nocreate-loggedin": "ئیجازەی دروست کردنی پەڕەی نوێت نیە.",
        "sectioneditnotsupported-title": "بەش دەستکاریکردنی پشتیوانی ناکرێ",
        "sectioneditnotsupported-text": "دەستکاریکردنی بەش لە پەڕەدا پشتیوانی ناکرێ.",
-       "permissionserrors": "ھەڵەی ئیجازەکان",
+       "permissionserrors": "ھەڵە لە بە دەست ھێنان",
        "permissionserrorstext": "مافی ئەنجامی ئەوەت نیە لەبەر ئەم {{PLURAL:$1|هۆکار|هۆکارانە}} :",
        "permissionserrorstext-withaction": "دەسەڵاتت نییە بۆ $2، لەبەر ئەم {{PLURAL:$1|ھۆکارە|ھۆکارانە}}ی خوارەوە:",
        "recreate-moveddeleted-warn": "'''ھۆشیار بە: خەریکی پەڕەیەک دروست‌ دەکەیتەوە کە لە پێشدا سڕاوەتەوە.'''\n\nئەمە لەبەر چاو بگرە کە دەستکاریکردنی ئەم پەڕەیە بەقازانجە یان نا.\nلۆگی سڕینەوە و گواستنەوەی ئەم پەڕەیە بۆ سانایی لێرەدا ھاتووە:",
        "moveddeleted-notice": "ئەم پەڕەیە سڕاوەتەوە.\nلۆگی سڕینەوە و گواستنەوە بۆ پەڕەکە لە ژێرەوە دابین کراوە.",
+       "moveddeleted-notice-recent": "ببورە، ئەم پەڕەیە بەم زووانە سڕدراوەتەوە (لە ماوەی ٢٤ کاتژمێری پێشوودا). \nلۆگی سڕینەوە و ڕەوانەکردنی پەڕەکە بەردەستن لە خوارەوە لە پەڕاوێزەکاندا.",
        "log-fulllog": "لۆگی تەواو ببینە",
        "edit-hook-aborted": "دەستکاری لە لایەن قولاپەوە ھەڵوەشێنرایەوە.\nھۆکارەکەی لەبەر دەست نییە.",
        "edit-gone-missing": "توانای نوێ‌کردنەوەی لاپەڕەکە نیە.<br />\nلەوە دەچی سڕدرابێتەوه.‌",
        "edit-conflict": "کێشەی دەستکاری.",
        "edit-no-change": "دەستکاریەکەت بەرچاو نەخرا، لەبەر ئەوەی هیچ گۆڕانکارییەکت لەسەر دەقەکە نەکردووە.",
+       "postedit-confirmation-created": "پەڕەکە دروست کرا.",
+       "postedit-confirmation-restored": "پەڕەکە ھێنرایەوە.",
        "postedit-confirmation-saved": "دەستکارییەکەت پاشەکەوت کرا.",
        "edit-already-exists": "تواناییی دروستکردنی پەڕەی نوێ نییە.\nئەمە پەڕەیە پێشتر هەبووە.",
        "defaultmessagetext": "دەقی پەیامی هەمیشەیی",
        "invalid-content-data": "دراوەی ناوەرۆکی نادروست",
-       "editwarning-warning": "بەجێ‌هێشتنی ئەم لاپەڕەیە دەبێتە هۆی لە‌دەست چوونی هەموو ئەو گۆڕانکاریانەی کردووتە.",
+       "content-not-allowed-here": "«$1» ڕێگە پێنەدراوە لەسەر پەڕەی [[$2]]",
+       "editwarning-warning": "بەجێھێشتنی ئەم لاپەڕەیە دەبێتە هۆی لە‌دەستدانی هەموو ئەو گۆڕانکاریانەی کە ئەنجامت داون. ئەگەر لە ژوورەوەیت، دەتوانیت ئەم ئاگادارییە لابەریت لە ھەڵبژاردەی بەکارھێنەرت.",
        "content-model-wikitext": "ویکیدەق",
        "content-model-text": "دەقی ساکار",
        "content-model-javascript": "جاڤاسکریپت",
        "content-model-css": "سی ئێس ئێس",
+       "deprecated-self-close-category": "ئەو پەڕانەی کە تاگی ئێچ تی ئێم ئێڵی خۆ-داخراوی ھەڵە بەکاردەھێنن",
+       "duplicate-args-warning": "<strong>ئاگاداری:</strong> ن [[:$1]] بانگی [[:$2]] دەکات بە بەکارھێنانی زیاتر لە یەک بەھا بۆ پارامەتری «$3.» تەنھا کۆتا بەھای کە پێشکەش کراوە بەکار دەھێندرێت.",
        "expensive-parserfunction-warning": "'''ئاگاداری:''' ئەم لاپەڕە ژمارەیەکی زۆر بانگ‌کەری فەنکشێنی لێک‌کەرەوەی لەخۆ گرتوو.<br /><br />\nئەوە دەبێ کەمتر بێت لە $2 {{PLURAL:$2|بانگ‌کەردن|بانگ‌کەردن}} کە ئێستا {{PLURAL:$1|بانگ‌کردنی|بانگ‌کردنی}} تێدایە.",
        "expensive-parserfunction-category": "ئەو لاپەڕانەی  ژمارەیەکی زۆر بانگ‌کەری فەنکشێنی لێک‌کەرەوەیان لەخۆ گرتووە.",
        "post-expand-template-inclusion-warning": "'''ئاگاداری:''' قەبارەی داڕێژەکە زۆر گەورەیە.\nلەوانەیە ھەندێک لە داڕێژەکان لەخۆنەگرێتەوە.",
        "undo-success": "دەکرێ دەستکاریەکە پووچەڵبکرێتەوە.\nتکایە چاو لەو هەڵسەنگاندنەی خوارەوە بکە تا دڵنیا بیت ئەمە ئەوەیە کە‌ دەتویست بیکەی و دواتر گۆڕانکارییەکانی خوارەوە پاشەکەوت بکە بۆ تەواوکردنی پووچەڵکردنەوەکە.",
        "undo-failure": "لەبەر کێشەی دەست‌تێ‌وەردان، ناتوانی دەستکاریەکە ئەنجام‌نەدراو بکەیت.",
        "undo-norev": "ناتوانی دەستکاریەکە ئەنجام‌نەدراو بکەی لەبەر ئەوەی بوونی نیە یا سڕدراوەتەوە.",
+       "undo-nochange": "وا دیارە دەستکارییەکە پووچەڵ کراوەتەوە.",
        "undo-summary": "گەڕاندنەوەی پێداچوونەوەی $1 لە لایەن [[Special:Contributions/$2|$2]] ([[User talk:$2|لێدوان]])",
+       "undo-summary-username-hidden": "پوچەڵکردنەوەی دەستکاری $1 لەلایەن بەکارھێنەرێکی شاردراوەوە.",
        "cantcreateaccount-text": "درووست‌کردنی هەژمارە بۆ ناونیشانی ئای‌پی ('''$1''') لە لایەن [[User:$3|$3]] داخراوە.<br /><br />\n$3 هۆکاری \"$2\" خستوەتەڕوو",
        "viewpagelogs": "لۆگەکانی ئەم پەڕەیە ببینە",
        "nohistory": "هیچ مێژوویەکی دەستکاری نییە بۆ ئەم پەڕەیە.",
        "action-viewmywatchlist": "دیتنی پێرستی چاودێریت",
        "action-viewmyprivateinfo": "زانیارییە تایبەتییەکانت ببینە",
        "action-editmyprivateinfo": "دەستکاری زانیارییە تایبەتییەکانت بکە",
+       "action-purge": "پاکسازی ئەم پەڕەیە بکە",
        "nchanges": "$1 {{PLURAL:$1|گۆڕانکاری}}",
        "enhancedrc-history": "مێژوو",
        "recentchanges": "دوایین گۆڕانکارییەکان",
        "exif-imagelength": "بەرزی",
        "exif-orientation": "ئاڕاستە",
        "exif-ycbcrpositioning": "شوێنی Y و C",
+       "exif-xresolution": "شێوازی ئاسۆیی",
+       "exif-yresolution": "شێوازی ستوونی",
        "exif-datetime": "ڕێکەوتی و کاتی گۆڕانی پەڕگە",
        "exif-imagedescription": "ناونیشانی وێنە",
        "exif-make": "بەرھەمھێنەری کامێرا",
index 22aa69e..fbd4af2 100644 (file)
        "rcfilters-invalid-filter": "Ungültiger Filter",
        "rcfilters-empty-filter": "Keine aktiven Filter. Es werden alle Beiträge angezeigt.",
        "rcfilters-filterlist-title": "Filter",
+       "rcfilters-filterlist-feedbacklink": "Rückmeldung zu den neuen (Beta-)Filtern hinterlassen",
        "rcfilters-highlightbutton-title": "Ergebnisse hervorheben",
        "rcfilters-highlightmenu-title": "Eine Farbe auswählen",
        "rcfilters-filterlist-noresults": "Keine Filter gefunden",
index c791ecf..7630b74 100644 (file)
        "viewdeleted_short": "{{PLURAL:$1|Jew vurnayış esternayi|$1 Vurnayışanê esternayan}} bımotne",
        "protect": "Bıstarnê",
        "protect_change": "bıvurne",
-       "protectthispage": "Ena perer bıpawe",
+       "protectthispage": "Ena perre şeveknê",
        "unprotect": "Starnayışi bıvurne",
-       "unprotectthispage": "Starnayışê ena perer bıvurne",
+       "unprotectthispage": "Şeveknayışê ena perre bıvırne",
        "newpage": "Perra newi",
        "talkpage": "Na per dı vatan kew",
        "talkpagelinktext": "Mesac",
        "edit-no-change": "Vırnayışê şıma qebul nêbı, çunke nuşte de yew vırnayış nêvıraziyo.",
        "postedit-confirmation-created": "Pele vıraziye.",
        "postedit-confirmation-restored": "Pele anciya vıraziye.",
-       "postedit-confirmation-saved": "Vırnayışê to qeyd bi.",
+       "postedit-confirmation-saved": "Vırnayışê şıma qeyd bi.",
        "edit-already-exists": "Pelo newe nêvıraziyeno.\nPel ca ra esto.",
        "defaultmessagetext": "Metnê mesacê hesabiyayey",
        "content-failed-to-parse": "Qandê madela $3 zereyê $1, $2 sero nêagozyayo",
        "rev-suppressed-text-permission": "Çımraviyarnayışê ena pele '''degusneyayo'''.\nŞıma be idarekerina xo ra şenê ey bıvênê; beno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degusnayış] de teferruat esto.",
        "rev-deleted-text-unhide": "Çım ra viyarnayışê enê riperri <strong>esteriya</strong>.\nTeferruati [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qeydê esterıtışi] yenê diyene.\nŞıma hewna şenê [$1 nê vırnayışi bıvênê], eke wazenê dewam kerê.",
        "rev-suppressed-text-unhide": "Çımra viyarnayışê ena pele '''Degusneyayo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degustış] de teferruat esto.\nŞıma be idarekerina xo ra şenê hewna [$1 nê çımraviyarnayışi bıvênê], eke wazenê dewam kerê.",
-       "rev-deleted-text-view": "Çımra viyarnayışê ena pele '''besternêno'''.\nŞıma be idarekerina xo ra şenê ey bıvênê; beno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış] de teferruat esto.",
+       "rev-deleted-text-view": "Çım ra viyarnayışê enê riperri '''vındarnao'''.\nŞıma şenê bıvênê; teferruat nao naca [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış].",
        "rev-suppressed-text-view": "Çımraviyarnayışê ena pele '''degusneyayo'''.\nŞıma be idarekerina xo ra şenê ey bıvênê; beno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degusnayış] de teferruat esto.",
        "rev-deleted-no-diff": "Şıma nêşenê nê ferqi bıvênê, çıke çımraviyarnayışan ra  yew '''esteriyo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] de teferruat esto.",
        "rev-suppressed-no-diff": "Revizyon '''esteriyayo\"' aye ra ti nieşkeno ena diff bivine.",
        "search-error": "Cıgeyrayış de yew xeta emê meydan: $1",
        "preferences": "Tercihi",
        "mypreferences": "Tercihi",
-       "prefs-edits": "Amarê vurnayışan:",
+       "prefs-edits": "Amarê vırnayışan:",
        "prefsnologintext2": "Kerem ke, seba vurnayışê tercihanê xo cı kewe.",
        "prefs-skin": "Çerme",
        "skin-preview": "Verqayt",
        "action-deletelogentry": "roceka dekerdan bestern",
        "action-deletedhistory": "verora esteriya perrer bıvin",
        "action-browsearchive": "pelanê esterıteyan bıgeyre",
-       "action-undelete": "ena perer mestern",
+       "action-undelete": "Ena perre mesterê",
        "action-suppressrevision": "revizyonê nımnayi bıvin u timar kı.",
        "action-suppressionlog": "enê qeydê xısusi bıvêne",
        "action-block": "enê karberi vurnayışi ra bıreyne",
        "action-siteadmin": "database kilit bike ya zi a bike",
        "action-sendemail": "e-posta bırşe",
        "action-editmyoptions": "Tercihanê xo bıvurne",
-       "action-editmywatchlist": "Listeyseyran de xo bıvırne",
+       "action-editmywatchlist": "Lista xoya ewniyayışi bıvırnê",
        "action-viewmywatchlist": "Listeyseyran de xo bıvin",
        "action-viewmyprivateinfo": "Xısusi tercihane xo bıvin",
        "action-editmyprivateinfo": "Xısusi malumate xo bıvurne",
        "randomredirect-nopages": "Cayê nameyê \"$1\" de serşıkıtışi çıniyê.",
        "statistics": "İstatistiki",
        "statistics-header-pages": "İstatistikê perer",
-       "statistics-header-edits": "İstatistikê vurnayışan",
+       "statistics-header-edits": "İstatistikê vırnayışan",
        "statistics-header-users": "İstatistikê karberi",
        "statistics-header-hooks": "Yewbina istatistiki",
        "statistics-articles": "Perê zerreki",
        "tooltip-pt-anonuserpage": "pelê karberê IPyi",
        "tooltip-pt-mytalk": "Pela {{GENDER:|toya}} werênayışi",
        "tooltip-pt-anontalk": "vurnayiş ê ke no Ipadresi ra biyo muneqeşa bıker",
-       "tooltip-pt-preferences": "Tercihê {{GENDER:|to}}",
+       "tooltip-pt-preferences": "Tercihê {{GENDER:|şıma}}",
        "tooltip-pt-watchlist": "Listey peranê ke to gırotê seyr kerdış",
        "tooltip-pt-mycontris": "Yew lista iştırakanê {{GENDER:|şıma}}",
        "tooltip-pt-login": "Mayê şıma ronıştış akerdışi rê dawet keme; labelê ronıştış mecburi niyo",
        "expand_templates_generate_xml": "Dara XML arêdayoği bımocne",
        "expand_templates_generate_rawhtml": "Xam HTML'i bıvin",
        "expand_templates_preview": "Verqayt",
-       "pagelanguage": "Zıwanê perer bıvırnê",
+       "pagelanguage": "Zıwanê perre bıvırnê",
        "pagelang-name": "Pele",
        "pagelang-language": "Zıwan",
        "pagelang-use-default": "Zıwanê hesabiyayeyi bıgurene",
index 93c33eb..70705e5 100644 (file)
        "views": "Προβολές",
        "toolbox": "Εργαλεία",
        "tool-link-userrights": "Αλλαγή ομάδων {{GENDER:$1|χρήστη}}",
+       "tool-link-userrights-readonly": "Εμφάνιση {{GENDER:$1|ομάδων}}  χρηστών",
        "tool-link-emailuser": "Αποστολή e-mail {{GENDER:$1|στο|στη}} χρήστη",
        "userpage": "Προβολή σελίδας χρήστη",
        "projectpage": "Προβολή σελίδας εγχειρήματος",
        "botpasswords-label-delete": "Διαγραφή",
        "botpasswords-label-resetpassword": "Επαναφορά του συνθηματικού",
        "botpasswords-label-grants": "Ισχύουσες άδειες:",
-       "botpasswords-help-grants": "Î\9aάθε Ï\80αÏ\81αÏ\87Ï\8eÏ\81ηÏ\83η Î´Î¯Î½ÎµÎ¹ Ï\80Ï\81Ï\8cÏ\83βαÏ\83η Ï\83Ï\84α Î¿Ï\81ιÏ\83μένα Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\87Ï\81ήÏ\83Ï\84η Ï\80οÏ\85 Ï\80οÏ\85 Î®Î´Î· Î­Ï\87ει Î­Î½Î±Ï\82 Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Ï\87Ï\81ήÏ\83Ï\84η. Î\94είÏ\84ε Ï\84η [[Special:ListGrants|Ï\80ίνακαÏ\82 παραχωρήσεων]] για περισσότερες πληροφορίες.",
+       "botpasswords-help-grants": "ΠαÏ\81αÏ\87Ï\89Ï\81εί Ï\84ην Ï\80Ï\81Ï\8cÏ\83βαÏ\83η Ï\83ε Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\80οÏ\85 Î®Î´Î· ÎºÎ±Ï\84έÏ\87ονÏ\84αι Î±Ï\80Ï\8c Ï\84ο Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8c Ï\87Ï\81ήÏ\83Ï\84η Ï\83αÏ\82. Î\95νεÏ\81γοÏ\80οίηÏ\83η Î¼Î¹Î±Ï\82 Ï\80αÏ\81αÏ\87Ï\8eÏ\81ηÏ\83ηÏ\82 ÎµÎ´Ï\8e Î´ÎµÎ½ Ï\80αÏ\81έÏ\87ει Ï\80Ï\81Ï\8cÏ\83βαÏ\83η Ï\83ε Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\80οÏ\85 Î¿ Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Ï\87Ï\81ήÏ\83Ï\84ηÏ\82 Ï\83αÏ\82 Î´Î¹Î±Ï\86οÏ\81εÏ\84ικά Î´ÎµÎ½ Î¸Î± ÎµÎ¯Ï\87ε. Î\94είÏ\84ε Ï\84ον [[Special:ListGrants|Ï\80ίνακα παραχωρήσεων]] για περισσότερες πληροφορίες.",
        "botpasswords-label-grants-column": "Χορηγήθηκε",
        "botpasswords-bad-appid": "Το όνομα του ρομπότ «$1» δεν είναι έγκυρο.",
        "botpasswords-insert-failed": "Αποτυχία να προστεθεί το όνομα bot \"$1\". Έχει ήδη προστεθεί;",
        "passwordreset-emailsentemail": "Αν αυτή η διεύθυνση ηλεκτρονικού ταχυδρομείου συνδέεται με το  λογαριασμό σας, τότε  θα σας αποσταλεί μήνυμα ηλεκτρονικού ταχυδρομείου για την επαναφορά του κωδικού πρόσβασης.",
        "passwordreset-emailsentusername": "Αν υπάρχει μια διεύθυνση ηλεκτρονικού ταχυδρομείου που συνδέεται με αυτό το όνομα χρήστη, τότε θα σας αποσταλεί ένα μήνυμα ηλεκτρονικού ταχυδρομείου για την επαναφορά του κωδικού πρόσβασης.",
        "passwordreset-invalidemail": "Μη έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου",
+       "passwordreset-nodata": "Δεν δόθηκε όνομα χρήστη ή διεύθυνση email.",
        "changeemail": "Αλλαγή ή αφαίρεση της διεύθυνσης ηλεκτρονικού ταχυδρομείου",
        "changeemail-header": "Συμπληρώστε αυτήν τη φόρμα για να αλλάξετε τη διεύθυνσή σας ηλεκτρονικού ταχυδρομείου. Αν θέλετε να καταργήσετε τη σύνδεση οποιασδήποτε διεύθυνσης ηλεκτρονικού ταχυδρομείου με το λογαριασμό σας, αφήστε τη νέα διεύθυνση ηλεκτρονικού ταχυδρομείου κενή κατά την υποβολή της φόρμας.",
        "changeemail-no-info": "Πρέπει να έχετε συνδεθεί για άμεση πρόσβαση σε αυτήν τη σελίδα.",
        "selfredirect": "<strong>Προσοχή:</strong> Ανακατευθύνετε αυτή τη σελίδα στον εαυτό της. Μπορεί να δώσατε λάθος στόχο για την ανακατεύθυνση, ή μπορεί να επεξεργάζεστε λάθος σελίδα.\nΑν κάνε κλίκ στο \"{{int:savearticle}}\" ξανά, η ανακατεύθυνση θα δημιουργηθεί ούτως ή άλλως.",
        "missingcommenttext": "Παρακαλούμε εισαγάγετε σχόλιο παρακάτω.",
        "missingcommentheader": "<strong>Υπενθύμιση:</strong> δεν έχετε δώσει ένα θέμα γι' αυτό το σχόλιο.\nΕάν κάνετε κλικ στο κουμπί \"{{int:savearticle}}\" ξανά, η επεξεργασία σας θα αποθηκευτεί χωρίς αυτό.",
-       "summary-preview": "Προεπισκόπηση σύνοψης:",
+       "summary-preview": "Προεπισκόπηση σύνοψης επεξεργασίας:",
        "subject-preview": "Προεπισκόπηση θέματος:",
        "previewerrortext": "Παρουσιάστηκε σφάλμα κατά την προσπάθεια για να κάνετε προεπισκόπηση των αλλαγών σας.",
        "blockedtitle": "Ο χρήστης έχει υποστεί φραγή.",
        "blockedtext": "'''Το όνομα χρήστη σας ή η διεύθυνση IP σας έχει υποστεί φραγή.'''\n\nΗ φραγή έγινε από τον/την $1.\nΗ αιτιολογία που δόθηκε είναι: ''$2''.\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Η φραγή προορίζεται για το χρήστη: $7\n\nΜπορείτε να απευθυνθείτε στον/στην $1 ή σε κάποιον άλλον [[{{MediaWiki:Grouppage-sysop}}|διαχειριστή]] για να συζητήσετε τη φραγή.\nΔεν μπορείτε να χρησιμοποιήσετε την δυνατότητα «αποστολή e-mail σε αυτό το χρήστη» εκτός αν μια έγκυρη ηλεκτρονική διεύθυνση έχει οριστεί στις [[Special:Preferences|προτιμήσεις χρήστη]] σας.\nΗ τρέχουσα διεύθυνση IP σας είναι $3, και ο αριθμός αναγνώρισης της φραγής είναι #$5.\nΠαρακαλούμε περιλαμβάνετε οποιοδήποτε ή και τα δύο από αυτά σε οποιαδήποτε ερωτήματα σας.",
        "autoblockedtext": "Η διεύθυνση IP σας έχει υποστεί φραγή αυτόματα επειδή χρησιμοποιήθηκε από έναν άλλο χρήστη, ο οποίος και αποκλείστηκε από τον/την $1.\nΗ αιτιολόγηση που δόθηκε είναι η εξής:\n\n:<em>$2</em>\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Επιδιωκόμενος αποκλεισμένος: $7\n\nΜπορείτε να επικοινωνήσετε με τον/την $1 ή με κάποιον από τους άλλους [[{{MediaWiki:Grouppage-sysop}}|διαχειριστές]] για να συζητήσετε τη φραγή.\n\nΝα σημειωθεί ότι δεν μπορείτε να χρησιμοποιήσετε τη λειτουργία «αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου σε αυτόν τον χρήστη» εκτός αν έχετε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου καταχωρισμένη στις [[Special:Preferences|προτιμήσεις χρήστη]] σας.\n\nΗ τρέχουσα διεύθυνση IP σας είναι $3 και το αναγνωριστικό της φραγής σας είναι #$5. Παρακαλούμε συμπεριλάβετε τις παραπάνω λεπτομέρειες σε όποια ερωτήματα κάνετε.",
+       "systemblockedtext": "Το όνομα χρήστη σας ή η διεύθυνση IP έχει αποκλειστεί αυτόματα από το MediaWiki.\nΗ αιτία που δόθηκε είναι:\n\n:<em>$2</em>\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Στόχος φραγής: $7\n\nΗ τρέχουσα διεύθυνση IP σας είναι $3.\nΠαρακαλούμε να συμπεριλάβετε όλα τα παραπάνω στοιχεία σε τυχόν απορίες σας.",
        "blockednoreason": "δεν δόθηκε λόγος",
        "whitelistedittext": "Πρέπει να $1 για να επεξεργαστείτε σελίδες.",
        "confirmedittext": "Πρέπει να επιβεβαιώσετε την διεύθυνση ηλεκτρονικού σας ταχυδρομείου πριν μπορέσετε να επεξεργαστείτε σελίδες. Παρακαλούμε καθορίστε και επικυρώστε την διεύθυνση ηλεκτρονικού σας ταχυδρομείου μέσω των [[Special:Preferences|προτιμήσεων χρήστη]] σας.",
        "userpage-userdoesnotexist": "Ο λογαριασμός χρήστη «$1» δεν είναι εγγεγραμμένος. Παρακαλούμε ελέγξτε αν θα θέλατε να δημιουργήσετε/επεξεργαστείτε αυτήν τη σελίδα.",
        "userpage-userdoesnotexist-view": "Ο λογαριασμός χρήστη «$1» δεν είναι εγγεγραμμένος.",
        "blocked-notice-logextract": "Επί του παρόντος, αυτός ο χρήστης έχει υποστεί φραγή. Παρακάτω παρέχεται για αναφορά η πιο πρόσφατη καταχώρηση του αρχείου φραγών.",
-       "clearyourcache": "''' Σημείωση:''' μετά την αποθήκευση, ίσως χρειαστεί να παρακάμψετε την προσωρινή μνήμη του προγράμματος περιήγησής σας για να δείτε τις αλλαγές.\n * '''Firefox / Safari:''' Κρατήστε πατημένο το ''Shift'' κάνοντας ταυτόχρονα κλικ στο κουμπί ''Ανανέωση'' ή πιέστε ''Ctrl-F5'' ή ''Ctrl-R'' ('' ⌘-R'' σε Mac)\n * '''Google Chrome:''' Πιέστε ''Ctrl-Shift-R'' (''⌘-Shift-R'' σε Mac)\n * '''Internet Explorer:''' Κρατήστε πατημένο το ''Ctrl'' κάνοντας ταυτόχρονα κλικ στο κουμπί ''Ανανέωση'', ή πιέστε ''Ctrl-F5'' \n * '''Opera:''' Εκκαθαρίστε την προσωρινή μνήμη από το μενού ''Εργαλεία → Προτιμήσεις''",
+       "clearyourcache": "<strong>Σημείωση:</strong> μετά την αποθήκευση, ίσως χρειαστεί να παρακάμψετε την προσωρινή μνήμη του προγράμματος περιήγησής σας για να δείτε τις αλλαγές.\n* <strong>Firefox / Safari:</strong> Κρατήστε πατημένο το <em>Shift</em> κάνοντας ταυτόχρονα κλικ στο κουμπί <em>Ανανέωση</em> ή πιέστε <em>Ctrl-F5</em> ή <em>Ctrl-R</em> (<em>⌘-R</em> σε Mac)\n* <strong>Google Chrome:</strong> Πιέστε <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> σε Mac)\n* <strong>Internet Explorer:</strong> Κρατήστε πατημένο το <em>Ctrl</em> κάνοντας ταυτόχρονα κλικ στο κουμπί <em>Ανανέωση</em>, ή πιέστε <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Εκκαθαρίστε την προσωρινή μνήμη από το μενού <em>Εργαλεία → Προτιμήσεις</em>",
        "usercssyoucanpreview": "'''Χρήσιμη συμβουλή:''' Χρησιμοποιήστε το κουμπί \"{{int:showpreview}}\" για να ελέγξτε τα νέα σας CSS πριν τα αποθηκεύσετε.",
        "userjsyoucanpreview": "'''Χρήσιμη συμβουλή:''' Χρησιμοποιήστε το κουμπί \"{{int:showpreview}}\" για να ελέγξτε τη νέα σας JS πριν την αποθηκεύσετε.",
        "usercsspreview": "'''Σας υπενθυμίζουμε ότι κάνετε απλώς έλεγχο/προεπισκόπηση του CSS του χρήστη -δεν το έχετε ακόμα αποθηκεύσει! '''",
        "watchlistanontext": "Παρακαλούμε συνδεθείτε για να δείτε ή να επεξεργαστείτε αντικείμενα στη λίστα παρακολούθησής σας.",
        "watchnologin": "Δεν έχετε συνδεθεί.",
        "addwatch": "Προσθήκη στη λίστα παρακολούθησης",
-       "addedwatchtext": "Το Î»Î®Î¼Î¼Î± Â«[[:$1]]» ÎºÎ±Î¹ Î· Ï\83ελίδα Ï\83Ï\85ζήÏ\84ηÏ\83ήÏ\82 Ï\84οÏ\85 Î­Ï\87οÏ\85ν Ï\80Ï\81οÏ\83Ï\84εθεί Ï\83Ï\84η [[Special:Watchlist|λίÏ\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82]] Ï\83αÏ\82.",
+       "addedwatchtext": "Î\97 Ï\83ελίδα Â«[[:$1]]» ÎºÎ±Î¹ Î· Ï\83ελίδα Ï\83Ï\85ζήÏ\84ηÏ\83ήÏ\82 Ï\84ηÏ\82 Ï\80Ï\81οÏ\83Ï\84έθηκαν Ï\83Ï\84η [[Special:Watchlist|λίÏ\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82 Ï\83αÏ\82]].",
        "addedwatchtext-short": "Η σελίδα «$1» έχει προστεθεί στην λίστα παρακολούθησής σας.",
        "removewatch": "Αφαίρεση από τη λίστα παρακολούθησης",
        "removedwatchtext": "Το λήμμα «[[:$1]]» και η σελίδα συζήτησής του έχουν αφαιρεθεί από τη [[Special:Watchlist|λίστα παρακολούθησής]] σας.",
index abee4a9..098adb6 100644 (file)
        "rcfilters-invalid-filter": "Invalid filter",
        "rcfilters-empty-filter": "No active filters. All contributions are shown.",
        "rcfilters-filterlist-title": "Filters",
+       "rcfilters-filterlist-feedbacklink": "Provide feedback on the new (beta) filters",
        "rcfilters-highlightbutton-title": "Highlight results",
        "rcfilters-highlightmenu-title": "Select a color",
        "rcfilters-filterlist-noresults": "No filters found",
index 19a9c27..20ac8ae 100644 (file)
        "sp-contributions-blocked-notice-anon": "Esta dirección IP se encuentra actualmente bloqueada.\nA continuación se muestra la última entrada del registro de bloqueos para mayor referencia.",
        "sp-contributions-search": "Buscar contribuciones",
        "sp-contributions-username": "Dirección IP o nombre de usuario:",
-       "sp-contributions-toponly": "Solo mostrar últimas ediciones de página",
+       "sp-contributions-toponly": "Mostrar solo últimas ediciones de página",
        "sp-contributions-newonly": "Mostrar solo ediciones que son creaciones de páginas",
        "sp-contributions-hideminor": "Ocultar ediciones menores",
        "sp-contributions-submit": "Buscar",
index f9eb200..b0b5e1f 100644 (file)
        "logentry-patrol-patrol": "$1(e)k $3 orrialdearen $4 berrikuspena patruilatutzat {{GENDER:$2|markatu}} du",
        "logentry-newusers-newusers": "$1 erabiltzaile kontua {{GENDER:$2|sortu da}}",
        "logentry-newusers-create": "$1 erabiltzaile kontua {{GENDER:$2|sortu da}}",
-       "logentry-newusers-create2": "$1 wikilariak $3 erabiltzaile kontua sortu du",
+       "logentry-newusers-create2": "$1 wikilariak $3 erabiltzaile kontua {{GENDER:$2|sortu}} du",
        "logentry-newusers-byemail": "$1(e)k $3 erabiltzaile kontua {{GENDER:$2|sortu du}} eta pasahitza emailez bidali da",
        "logentry-newusers-autocreate": "$1 erabiltzaile kontua automatikoki {{GENDER:$2|sortu da}}",
        "logentry-upload-upload": "$1(e)k $3 {{GENDER:$2|igo du}}",
index dcc7244..ed13d41 100644 (file)
        "action-userrights-interwiki": "ویرایش اختیارات کاربری کاربران یک ویکی دیگر",
        "action-siteadmin": "قفل‌کردن و بازکردن پایگاه داده‌ها",
        "action-sendemail": "ارسال ایمیل",
+       "action-editmyoptions": "ویرایش ترجیحاتتان",
        "action-editmywatchlist": "فهرست پیگیری‌های خود را ویرایش کنید",
        "action-viewmywatchlist": "فهرست پیگیری‌های خود را ببینید",
        "action-viewmyprivateinfo": "اطلاعات خصوصی خود را ببینید",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنین به [[Special:NewPages|فهرست صفحات تازه]] نگاه کنید)",
        "recentchanges-legend-plusminus": "(<em>±۱۲۳</em>)",
        "recentchanges-submit": "نمایش",
+       "rcfilters-activefilters": "فعال‌کردن پالایه‌ها",
+       "rcfilters-restore-default-filters": "بازگردانی پالایه‌های پیش‌فرض",
+       "rcfilters-clear-all-filters": "پاک‌کردن پالایش‌ها",
+       "rcfilters-search-placeholder": "پالایش تغییرات اخیر (جستجو یا شروع به تایپ)",
+       "rcfilters-invalid-filter": "پالایهٔ نامعتبر",
+       "rcfilters-empty-filter": "پالایه‌ای فعال نیست. همهٔ مشارکت‌های دیده می‌شوند.",
+       "rcfilters-filterlist-title": "پالایه‌ها",
+       "rcfilters-filterlist-feedbacklink": "ارسال بازخورد برای پالایه‌های جدید (آزمایشی)",
+       "rcfilters-highlightbutton-title": "پررنگ کردن نتایج",
+       "rcfilters-highlightmenu-title": "انتخاب رنگ",
+       "rcfilters-filterlist-noresults": "پالایه‌ای یافت نشد",
+       "rcfilters-filtergroup-registration": "ثبت‌نام کاربر",
+       "rcfilters-filter-registered-label": "ثبت شده",
+       "rcfilters-filter-registered-description": "ورود ویرایشگران.",
+       "rcfilters-filter-unregistered-label": "ثبت‌نام نکرده",
+       "rcfilters-filter-unregistered-description": "ویرایشگرانی که به سامانه وارد نشده‌اند.",
+       "rcfilters-filter-editsbyself-label": "ویرایش‌های شما",
+       "rcfilters-filter-editsbyself-description": "ویرایش‌های انجام شده توسط شما.",
+       "rcfilters-filter-editsbyother-label": "ویرایش‌های دیگران",
+       "rcfilters-filter-editsbyother-description": "ویرایش‌های ایجاد شده توسط دیگران (نه شما).",
+       "rcfilters-filtergroup-userExpLevel": "درجهٔ تجربه (فقط برای کاربران ثبت‌نام کرده)",
+       "rcfilters-filter-userExpLevel-newcomer-label": "تازه‌واردها",
+       "rcfilters-filter-userExpLevel-newcomer-description": "کمتر از ۱۰ ویرایش یا ۴ روز فعالیت.",
+       "rcfilters-filter-userExpLevel-learner-label": "آموزندگان",
+       "rcfilters-filter-userExpLevel-experienced-label": "کاربران باتجربه",
+       "rcfilters-filter-userExpLevel-experienced-description": "بیشتر از ۳۰ روز فعالیت و ۵۰۰ ویرایش.",
+       "rcfilters-filtergroup-automated": "ویرایش‌های خودکار",
+       "rcfilters-filter-bots-label": "ربات",
+       "rcfilters-filter-bots-description": "ویرایش توسط ابزارهای خودکار.",
+       "rcfilters-filter-humans-label": "انسان (ربات نه)",
+       "rcfilters-filter-humans-description": "ویرایش توسط انسان.",
+       "rcfilters-filter-minor-label": "ویرایش‌های جزئی",
+       "rcfilters-filter-minor-description": "ویرایش‌هایی که به عنوان جزئی برچسب خورده‌اند.",
+       "rcfilters-filter-major-label": "ویرایش‌های غیرجزئی",
+       "rcfilters-filter-major-description": "ویرایش‌هایی که برچسب جزئی نخوردند.",
+       "rcfilters-filtergroup-changetype": "نوع تغییرات",
+       "rcfilters-filter-pageedits-label": "ویرایش‌های صفحه",
+       "rcfilters-filter-pageedits-description": "ویرایش‌های محتوای ویکی، بحث‌ها، توضیحات رده...",
+       "rcfilters-filter-newpages-label": "ایجاد صفحه",
+       "rcfilters-filter-newpages-description": "ویرایش‌هایی که منجر به ایجاد صفحه شده‌اند.",
+       "rcfilters-filter-categorization-label": "تغییرات رده",
+       "rcfilters-filter-categorization-description": "سیاههٔ صفحاتی که به رده افزوده یا حذف شده‌اند.",
+       "rcfilters-filter-logactions-label": "سیاههٔ فعالیت‌ها",
        "rcnotefrom": "در زیر تغییرات از <strong>$3, $4</strong> (تا <strong>$1</strong> {{PLURAL:$5|نشان داده شده‌است|نشان داده شده‌اند}}).",
        "rclistfrom": "نمایش تغییرات تازه با شروع از $3 $2",
        "rcshowhideminor": "$1 ویرایش‌های جزئی",
        "apisandbox-sending-request": "ارسال درخواست ای‌پی‌آی...",
        "apisandbox-loading-results": "دریافت درخواست‌های ای‌پی‌آی...",
        "apisandbox-results-error": "در زمان بارگیری پاسخ کوئری API خطایی رخ داده‌است: $1.",
+       "apisandbox-request-selectformat-label": "نمایش داده‌های مورد درخواست به عنوان:",
+       "apisandbox-request-format-url-label": "آدرس اینترنتی متن پرسمان",
        "apisandbox-request-url-label": "درخواست آدرس:",
+       "apisandbox-request-json-label": "درخواست JSON:",
        "apisandbox-request-time": "زمان درخواست: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "توکن را اصلاح کنید و از نو ارسال کنید",
        "apisandbox-results-fixtoken-fail": "خطا در دریافت توکن \"$1\"",
        "editcomment": "خلاصهٔ ویرایش این بود:  <em>«$1»</em>.",
        "revertpage": "ویرایش [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]]) به آخرین تغییری که [[User:$1|$1]] انجام داده بود واگردانده شد",
        "revertpage-nouser": "ویرایش‌های انجام‌شده توسط (نام کاربری حذف شده) به آخرین ویرایش [[User:$1|$1]] واگردانی شد.",
-       "rollback-success": "ویرایش‌های $1 واگردانی شد؛\nصفحه به آخرین ویرایش $2 برگردانده شد.",
+       "rollback-success": "ویرایش‌های {{GENDER:$3|$1}} واگردانی شد؛\nصفحه به آخرین ویرایش {{GENDER:$4|$2}} برگردانده شد.",
        "rollback-success-notify": "ویرایش‌های توسط $1 واگردانی شد؛\nبه آخرین نسخه توسط $2 بازگردانی شد. [$3 نمایش تغییرات]",
        "sessionfailure-title": "خطای نشست کاربری",
        "sessionfailure": "به نظر می‌رسد مشکلی در مورد نشست کاربری شما وجود دارد؛\nعمل درخواست شده در اقدامی پیشگیرانه در برابر ربوده‌شدن اطلاعات نشست کاربری، لغو شد.\nلطفاً دکمهٔ «بازگشت» را در مرورگر خود بفشارید و صفحه‌ای که از آن به اینجا رسیده‌اید را دوباره فراخوانی کنید، سپس مجدداً سعی کنید.",
        "pageinfo-length": "حجم صفحه  (بایت)",
        "pageinfo-article-id": "شناسهٔ صفحه",
        "pageinfo-language": "زبان محتوای صفحه",
+       "pageinfo-language-change": "تغییر",
        "pageinfo-content-model": "ساختار محتوای صفحه",
        "pageinfo-content-model-change": "تغییر",
        "pageinfo-robot-policy": "‌فهرست‌کردن توسط ربات‌ها",
        "pagelang-language": "زبان",
        "pagelang-use-default": "استفاده از زبان پیش‌فرض",
        "pagelang-select-lang": "انتخاب زبان",
+       "pagelang-reason": "دلیل",
        "pagelang-submit": "اعمال",
        "right-pagelang": "تغییر صفحهٔ زبان",
        "action-pagelang": "تغییر زبان صفحه",
        "mw-widgets-titleinput-description-new-page": "این صفحه هنوز وجود ندارد",
        "mw-widgets-titleinput-description-redirect": "تغییر مسیر به $1",
        "mw-widgets-categoryselector-add-category-placeholder": "در حال افزودن رده ...",
+       "mw-widgets-usersmultiselect-placeholder": "افزودن بیشتر...",
        "sessionmanager-tie": "نمی‌توان چندین نوع درخواست هویت‌سنجی را ترکیب کرد: $1.",
        "sessionprovider-generic": "$1 فصل",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "فصل‌های کوکی‌محور",
        "usercssispublic": "لطفاً توجه کنید: زیرصفحه‌های سی‌اس‌اس نباید حاوی اطلاعات محرمانه باشند چون توسط دیگران قابل مشاهده هستند.",
        "restrictionsfield-badip": "نشانی یا بازهٔ آی‌پی نامعتبر: $1",
        "restrictionsfield-label": "بازه‌های آی‌پی مجاز:",
-       "restrictionsfield-help": "یک نشانی آی‌پی یا بازهٔ سی‌آی‌دی‌ار در هر خط وارد کنید. برای فعال کردن همه‌چیز، این مقدار را استفاده کنید: <code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "یک نشانی آی‌پی یا بازهٔ سی‌آی‌دی‌ار در هر خط وارد کنید. برای فعال کردن همه‌چیز، این مقدار را استفاده کنید: <code>0.0.0.0/0</code><br><code>::/0</code>",
+       "revid": "نسخهٔ $1",
+       "pageid": "شناسهٔ صفحهٔ $1"
 }
index bbb0441..8e5c989 100644 (file)
        "rcfilters-invalid-filter": "Filtre non valide",
        "rcfilters-empty-filter": "Aucun filtre actif. Toutes les contributions sont affichées.",
        "rcfilters-filterlist-title": "Filtres",
+       "rcfilters-filterlist-feedbacklink": "Fournir un commentaire sur les nouveaux filtres (en bêta)",
        "rcfilters-highlightbutton-title": "Mettre en valeur les résultats",
        "rcfilters-highlightmenu-title": "Choisir une couleur",
        "rcfilters-filterlist-noresults": "Aucun filtre trouvé",
        "rcfilters-filtergroup-registration": "Inscription de l’utilisateur",
-       "rcfilters-filter-registered-label": "Enregistré",
+       "rcfilters-filter-registered-label": "Connectés",
        "rcfilters-filter-registered-description": "Éditeurs connectés.",
        "rcfilters-filter-unregistered-label": "Non connectés",
        "rcfilters-filter-unregistered-description": "Éditeurs qui ne sont pas connectés.",
index 46af76a..bb6c4bc 100644 (file)
        "recentchanges-label-unpatrolled": "اي دچينواچين هلئه گشتزني نۊبؤ",
        "recentchanges-label-plusminus": "ولگˇ حجم اي مقدار بايتˇ واويراز تغيير بؤده",
        "recentchanges-legend-heading": "<strong>اختصارؤن:</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}( [[Special:NewPages|تازه ولگؤنˇ ليسته]] بينين)",
        "rclistfrom": "تازه تغييرؤنˇ نۊشؤن دأنˇ سرأگيري $3 $2ˇ جي",
        "rcshowhideminor": "$1 نيميزگره دچينواچينؤن",
        "rcshowhideminor-show": "نۊشؤن دأن",
index 76e652a..67e2b68 100644 (file)
        "rcfilters-invalid-filter": "מסנן בלתי־תקין",
        "rcfilters-empty-filter": "אין מסננים פעילים. כל התרומות מוצגות.",
        "rcfilters-filterlist-title": "מסננים",
+       "rcfilters-filterlist-feedbacklink": "שליחת משוב על המסננים החדשים (בטא)",
        "rcfilters-highlightbutton-title": "הבלטת התוצאות",
        "rcfilters-highlightmenu-title": "בחירת צבע",
        "rcfilters-filterlist-noresults": "לא נמצאו מסננים",
index 6d32f1d..2ff30b1 100644 (file)
        "youhavenewmessages": "Imate $1 ($2).",
        "youhavenewmessagesfromusers": "Imate $1 {{PLURAL:$3||od $3 suradnika|od $3 suradnika}} ($2).",
        "youhavenewmessagesmanyusers": "Imate $1 od više suradnika ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|novu poruku|$1 nove poruke|999=novih poruka}}",
+       "newmessageslinkplural": "{{PLURAL:$1|novu poruku|999=nove poruke}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|posljednje uređivanje|posljednja $1 uređivanja|posljednjih $1 uređivanja}} na stranici za razgovor",
        "youhavenewmessagesmulti": "Imate nove poruke na $1",
        "editsection": "uredi",
        "recentchanges-label-minor": "Manja izmjena",
        "recentchanges-label-bot": "Izmjenu napravio bot",
        "recentchanges-label-unpatrolled": "Nepregledana izmjena",
-       "recentchanges-label-plusminus": "Promjena veličine stranice (u bajtovima)",
+       "recentchanges-label-plusminus": "Promjena veličine stranice u bajtovima",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "Nova stranica",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
index 6990ca0..7c5bc69 100644 (file)
@@ -38,7 +38,7 @@
        "tog-enotifminoredits": "ОагIонашта а файлашта даь хувцамаш геттара зIамига дале а хоам бе сога",
        "tog-enotifrevealaddr": "ДIахайта хоамбараш чу бIаргадейта са почта адрес",
        "tog-shownumberswatching": "Шоаш зем бу оагIонашта юкъе ер оагIув чуяьккха доакьошхоша таьрахь гойта",
-       "tog-oldsig": "ХIанзара яздаь кулг:",
+       "tog-oldsig": "Хьа карара кулг яздар:",
        "tog-fancysig": "Кулг яздара ший йола вики-разметка (автоматически тIахьожаярг йоацаш)",
        "tog-uselivepreview": "Пайда эца сиха дола хьалххе бIаргтохар",
        "tog-forceeditsummary": "ДIахьалхадаккха, нагахьа санна хувцама йоазонца сурт оттадара моттиг хьалъйизанза яле",
        "category-file-count-limited": "Укх категори чу {{PLURAL:$1|$1 файл|$1 файлаш|1=цаI мара файл яц}}.",
        "listingcontinuesabbrev": "(дIахо)",
        "index-category": "Индекс оттаеш оагIонаш",
-       "noindex-category": "Индекс ца оттаеш оагIонаш",
+       "noindex-category": "Индекс оттайинза оагIонаш",
        "broken-file-category": "Файла тIахьожаяргаш болхбеш йоаца оагIонаш",
        "about": "Сурт оттадар",
        "article": "Статья",
        "newwindow": "&nbsp;(керда кора чу)",
        "cancel": "Юхадаккха",
        "moredotdotdot": "ДIахо...",
-       "morenotlisted": "Ð\95Ñ\80 Ñ\81пиÑ\81ок Ñ\85Ñ\8cалйиза Ñ\8fÑ\86.",
+       "morenotlisted": "Ð\95Ñ\80 Ñ\85Ñ\8cаÑ\8fзÑ\8fÑ\8cÑ\80 Ñ\85Ñ\8cалйизанза Ñ\85ила Ð¼ÐµÐ³Ð°Ñ\88 Ñ\8f.",
        "mypage": "ОагIув",
        "mytalk": "Дувца оттадар",
        "anontalk": "Дувца оттадар",
        "showpreview": "Хьалххе бIаргтохар",
        "showdiff": "Даь дола хувцамаш",
        "anoneditwarning": "<strong>Теркам бе!</strong> Хьо автор хинна система чуваьннавац. Нагахьа санна Iа моллагIа хувцам бой, Хьа IP-адрес дийла массанен бIаргагуш хургда. Нагахьа санна Хьо <strong>[$1 хьачувоале]</strong> е <strong>[$2 дагара йоазув хьакхолле]</strong>, нийсдараш (хувцамаш) бувзам болаш хургда Хьа доакъашхой цIерца, иштта кхыдола толажагIи гIойленагIи дола дикаьш хургда Хьона.",
-       "summary-preview": "СÑ\83Ñ\80Ñ\82 Ð¾Ñ\82Ñ\82адаÑ\80 Ñ\85Ñ\83Ñ\80гда:",
-       "subject-preview": "Ð\94аÑ\8cкÑ\8aа Ñ\86Iи Ñ\85Ñ\83Ñ\80гÑ\8cÑ\8f Ð¸Ñ\88Ñ\82Ñ\82а:",
+       "summary-preview": "Ð¥Ñ\83вÑ\86ама Ñ\81Ñ\83Ñ\80Ñ\82 Ð¾Ñ\82Ñ\82адаÑ\80а Ñ\85Ñ\8cалÑ\85е Ð±IаÑ\80гÑ\82оÑ\85аÑ\80:",
+       "subject-preview": "Теман/коÑ\80Ñ\82баÑ\80а Ñ\85Ñ\8cалÑ\85Ñ\85е Ð±IаÑ\80гÑ\82оÑ\85аÑ\80:",
        "blockedtitle": "Доакъашхочун чIега техаб",
        "blockednoreason": "бахьан белгалдаьккха дац",
        "loginreqlink": "довзийта",
        "notextmatches": "ОагIонай тексташта юкъе цхьатара хилар дац",
        "prevn": "{{PLURAL:$1|1=хьалхайогIар|хьалхайогIараш}} $1",
        "nextn": "{{PLURAL:$1|1=тIехьайоагIар|тIехьайоагIараш}} $1",
-       "prevn-title": "{{PLURAL:$1|1=$1 хьалхара йоазув|$1 хьалхара йоазувнаш}}",
+       "prevn-title": "{{PLURAL:$1|ХьалхадоагIа $1 дIаяздар}}",
        "nextn-title": "{{PLURAL:$1|ТIадоагIа $1 яздар|ТIадоагIа $1 яздараш}}",
        "shown-title": "Гойта $1 {{PLURAL:$1|яздаьр|яздаьраш}} укх оáгIон тIа",
        "viewprevnext": "ДIахьажа ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchmenu-exists": "'''Укх вики чу йолаш я оагӀув «[[:$1]]»'''",
+       "searchmenu-exists": "'''Укх вики чу я иштта йола оагӀув «[[:$1]]»'''",
        "searchmenu-new": "<strong>Хьакхолла оагIув «[[:$1]]» укх вики-проекте!</strong>\n{{PLURAL:$2|0=|Иштта хьажа Iайха лийха оагIонга.|Иштта хьажа хьай лахара хьахиннарашка.}}",
        "searchprofile-articles": "Кертера оагIонаш",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything-tooltip": "Массайола оагIонаш тIа лахар (дувцар оттадара оагIонаш чулоацаш)",
        "searchprofile-advanced-tooltip": "Iочуязаяь цIерий аренашка лаха",
        "search-result-size": "$1 ({{PLURAL:$2|$2 дош|$2 дешаш}})",
-       "search-result-category-size": "{{PLURAL:$1|1=$1 дакъа|$1 дакъаш}} ({{PLURAL:$2|1=$2 кIалцатег|$2 кIалцатегаш}}, {{PLURAL:$3|1=$3 паьла|$3 паьлий}})",
+       "search-result-category-size": "$1 {{PLURAL:$1|юкъедахар}} ($2 {{PLURAL:$2|кIалкатегори}}, $3 {{PLURAL:$3|файл}})",
        "search-redirect": "(дIа-хьахьожадар $1 тIара)",
        "search-section": "(дáкъа «$1»)",
        "search-suggest": "Хьона эшар ер хила мега: $1",
        "prefs-signature": "Кулг яздар",
        "prefs-preview": "Хьалххе бIаргтохар",
        "userrights-user-editname": "Iочуязъе доакъашхочун цӀи:",
-       "editusergroup": "Ð¥Ñ\83вÑ\86а {{GENDER:$1|доакÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н}} тоабаш",
+       "editusergroup": "Ð\99оÑ\82Ñ\82а Ð´Ð¾Ð°ÐºÑ\8aаÑ\88Ñ\85ой тоабаш",
        "saveusergroups": "ДIаязъе {{GENDER:$1|доакъашхочун}} тоабаш",
        "userrights-groupsmember": "Дакъа лоаца тоабаш чу:",
        "userrights-reason": "Бахьан:",
        "recentchanges-label-plusminus": "байташкахь боарам хувцар",
        "recentchanges-legend-heading": "<strong>Легенда:&nbsp;</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (хьажа иштта [[Special:NewPages|керда оагIонашка]])",
-       "rcnotefrom": "КIалхагIа хувцамаш хьахьекха я <strong>$2</strong> денза (<strong>$1</strong> кхачалца).",
+       "rcnotefrom": "КIалхагIа {{PLURAL:$5|хувцам белгалбаьккхаб}} <strong>$3, $4</strong> тIера (хьахьекхабац <strong>$1</strong>-л дукхагIа).",
        "rclistfrom": "$3 $2 денза даь хувцамаш хьахьокха",
        "rcshowhideminor": "$1 зIамига нийсдараш",
        "rcshowhideminor-show": "Хьахьокха",
        "newpages": "Керда оагIонаш",
        "move": "ЦIи хувца",
        "movethispage": "ЦIи хувца укх оагIон",
-       "pager-newer-n": "{{PLURAL:$1|кердагIа дара|кердагIа дараш|кердагIа долачаьрахь}} $1",
+       "pager-newer-n": "$1 дукхагIа {{PLURAL:$1|керда}}",
        "pager-older-n": "{{PLURAL:$1|къаьнара дара|къаьнара дараш|къаьнара долaчарех}} $1",
        "booksources": "Джейнай хьасташ (источники)",
        "booksources-search-legend": "Джейнах лаьца хоам лахар",
        "protect_expiry_old": "Чакхадалара ха — дахáр да.",
        "protect-text": "Хьа йиш я оагIон '''$1''' лорадара лагIа бIаргтоха a, хувца a .",
        "protect-locked-access": "Хьа дагара йоазонга тоъал бокъо яц оагIон лорадара лагIа хувца. '''$1''' оагIон карара оттадараш:",
-       "protect-cascadeon": "{{PLURAL:$1|1=КIалхахь хьагойташ йола оагIувчу|КIалхахь хьагойташ йола оагIувнашчу}} ер оагIув чуяккха халарахь, лорам Iоттая я, хурхала лорам Iоттая я. Укх оагIувни лорама лагIа хувца йийш йолаш я, амма хурхала лорам хувцлургдац.",
+       "protect-cascadeon": "Каскадни лорадар оттадаь йолча {{PLURAL:$1|1=кIалхагIа белгалъяь оагIон чу|кIалхагIа белгалъяь оагIонаш чу}} юкъеяьккха хилара бахьане ер оагIув хIанза лораяь я. Укх оагIон лорадара дарж хувцаро каскадни лорадар меттахдоаккхадац.",
        "protect-default": "Лорадар доацаш",
        "protect-fallback": "Могадаьд алхха ше «$1» волача доакъашхошта",
        "protect-level-autoconfirmed": "Могадаьд алхха ше-ше къоабалбаь хинна доакъашхошта",
        "unblocklogentry": "чIега баьстаб $1",
        "block-log-flags-nocreate": "дагара йоазонаш кхоллар пурам деннадац",
        "move-page-legend": "ОагIон цIи хувцар",
-       "movepagetext": "КIалхара кепаца болхабеча, оаш оагIувни цIи хувцаргья, цунна хувцамий тептар кхыйола меттиге дIачудоаккхаш.\nКIаьнара цIерахь керда цIерий дIачудаккхам хургда.\nКIаьнара цIера тIа даь дола дIачудаккхамаш, шун ший лоIамахь кердадаккха йийш хургья.\nИз оаш ца дой, дехар да, [[Special:DoubleRedirects|шолха]] кхы [[Special:BrokenRedirects|вIашагIаяккха дIачудаккхамий]] кардоламахь хьажа.\nОаш жоп лу, шоай чуяккха йола Iинкаш, даим болхбеш хургдолга.\n\nЗем бахка, оагIувни цIи хувцалургьяц, изза мо цIи йолаш оагIув хилача. \nЙолаш йола оагIув хувца йийш яц, амма хийца йола оагIув юха хьахувца йийш я. \n\n'''Хоамхайтар'''\n\nЦIи хувцар, йовзаш йола оагIувнаший, доккха а цаьхха а хувцамшка дIатIадала мегаш да.\nДехар да, оаш дIахо болх белаьхь, хургдола хIама кхеташ долга, кхеталаш.",
-       "movepagetalktext": "ТIаÑ\82еÑ\85а Ð´Ñ\83вÑ\86ама Ð¾Ð°Ð³IÑ\83в, Ñ\88ий Ð»Ð¾IамаÑ\85Ñ\8c Ñ\86Iи Ñ\85Ñ\83влÑ\83Ñ\80гÑ\8cÑ\8f, '''еÑ\80 Ð´Ð°Ð³Ð° Ð° Ð´Ð¾Ð°Ñ\86аÑ\80, Ð´Ð¾Ð°Ñ\86а:'''\n\n*Ð\98зза Ð¼Ð¾ Ñ\86Iи Ð¹Ð¾Ð»Ð°Ñ\88 Ñ\8fÑ\8cÑ\81Ñ\81а Ð´Ñ\83вÑ\86ама Ð¾Ð°Ð³IÑ\83в Ñ\8f Ðµ\n*Ð\9eаÑ\88 ÐºIалÑ\85аÑ\85Ñ\8c Ð±ÐµÐ»Ð³Ð°Ð»Ð¾ Ð´Ð°Ñ\8cдаÑ\86.\n\nÐ\98з Ð¸Ñ\88Ñ\82Ñ\82а Ð´Ð°Ð»Ðµ, ÐºÑ\83лги Ð½Ð¾Ð²ÐºÑ\8aоÑ\81Ñ\82алÑ\86а Ð¾Ð°Ð³IÑ\83внаÑ\88 Ð²IаÑ\88агIаÑ\82оÑ\85а  Ðµ Ð´IадеÑ\85Ñ\8cаÑ\8fккÑ\85а Ð´ÐµÐ·Ð° Ñ\88Ñ\83н.",
+       "movepagetext": "КIалха белгаляьча формах пайда ийца Iа оагIон цIи хувцаргья, цун хувцамий тептар кхыйола моттиге оттаярца цхьанна.\nКъаьнарча цIерах хургья кердача цIера дIа-сахьожадар.\nХьа аьттув ба къаьнарча цIера хинна дIа-сахьожадараш ше-ше кердадаккха.\nНагахьа санна Iа из ца дой, дехар ду, [[Special:DoubleRedirects|шолха]]  а [[Special:BrokenRedirects|хеттанза дIа-сахьожадараш]] долаш дий тахка.\nХьо бехктокхаме ва тIахьожаяргаш шоаш тIахьожаде дезача нийса хилар.\n\nТеркам бе, оагIон цIи <strong>хувцалургьйоацалга</strong> нагахьа санна изза мо цIи йола оагIув йолаш яле. Чу хIама доацача оагIонашта е дIа-сахьожадарашта, кхы а цар хувцамий истори йице, из новкъа дац. Из яхилга да, нагахьа Iа харца цIи хувцар даь дале, ше хинна цIи юхадIахувца йиш я, амма бакъда йолаш йола оагIув ца ховш дIаяккха аьттув бац. \n\n<strong>Белгалдоахар:</strong>\nГIоряьннача оагIонай цIи хувцаро тIехдоккхеи цIаьххеи хувцамаш доаладе мега.\nБоккъала, дIахо хье дIавахалехьа, кхета, хила мегаш дар хургдолга.",
+       "movepagetalktext": "Ð\9dагаÑ\85Ñ\8cа Ñ\81анна Iа ÐµÑ\80 Ð¿Ñ\83нкÑ\82 Ð±ÐµÐ»Ð³Ð°Ð»Ñ\8aйой, Ñ\86Ñ\83нÑ\86а Ð±Ñ\83взам Ð±Ð¾Ð»Ð° Ð´Ñ\83вÑ\86а Ð¾Ñ\82Ñ\82адаÑ\80а Ð¾Ð°Ð³IÑ\83в Ð¸Ñ\88Ñ\82Ñ\82а Ñ\88е-Ñ\88е Ñ\86Iи Ñ\85ийÑ\86а Ñ\85Ñ\83Ñ\80гÑ\8cÑ\8f, Ð½Ð°Ð³Ð°Ñ\85Ñ\8cа Ñ\81анна Ð¸Ð·Ð·Ð° Ð¼Ð¾ Ñ\86Iи Ð¹Ð¾Ð»Ð° Ñ\8fÑ\8cÑ\81Ñ\81а Ð¹Ð¾Ð°Ñ\86а Ð´Ñ\83вÑ\86а Ð¾Ñ\82Ñ\82адаÑ\80а Ð¾Ð°Ð³IÑ\83в Ð¹Ð¾Ð»Ð°Ñ\88 Ð¹Ð¸Ñ\86е.\n\nÐ\98з Ð¸Ñ\88Ñ\82Ñ\82а Ð´Ð°Ð»Ðµ, Ð½Ð°Ð³Ð°Ñ\85Ñ\8cа Ð¸Ð· Ñ\8dÑ\88аÑ\88 Ð´Ð°Ð»Ðµ, IайÑ\85а Ð¾Ð°Ð³Iон  Ñ\86Iи Ð´IаÑ\85Ñ\83вÑ\86а.",
        "newtitle": "Керда цIи:",
        "move-watch": "Ер оагIув зем бара хьаязъяьра юкъеяьккха",
        "movepagebtn": "ОагIон цIи хувца",
index 2b0e7fc..d3590d9 100644 (file)
        "nextn-title": "{{PLURAL:$1|Risultato successivo|$1 risultati successivi}}",
        "shown-title": "Mostra {{PLURAL:$1|un risultato|$1 risultati}} per pagina",
        "viewprevnext": "Vedi ($1 {{int:pipe-separator}} $2) ($3).",
-       "searchmenu-exists": "'''Sul sito esiste una pagina il cui nome è \"[[:$1]]\"'''",
+       "searchmenu-exists": "<strong>Su questo wiki esiste una pagina il cui nome è \"[[:$1]]\".</strong> {{PLURAL:$2|0=|Vedi anche gli altri risultati trovati.}}",
        "searchmenu-new": "<strong>Crea la pagina \"[[:$1]]\" su questo wiki!</strong> {{PLURAL:$2|0=|Vedi anche la pagina trovata con la tua ricerca|Vedi anche i risultati della ricerca}}",
        "searchprofile-articles": "Pagine di contenuti",
        "searchprofile-images": "Multimedia",
        "largefileserver": "Il file supera le dimensioni consentite dalla configurazione del server.",
        "emptyfile": "Il file appena caricato sembra essere vuoto. Ciò potrebbe essere dovuto ad un errore nel nome del file. Verificare che si intenda realmente caricare questo file.",
        "windows-nonascii-filename": "Questo wiki non supporta nomi di file con caratteri speciali.",
-       "fileexists": "Un file con questo nome esiste già.\nVerificare prima <strong>[[:$1]]</strong> se non si è sicuri di volerlo sovrascrivere.\n[[$1|thumb]]",
+       "fileexists": "Un file con questo nome esiste già, verifica prima <strong>[[:$1]]</strong> se non si è sicuri di volerlo sovrascrivere.\n[[$1|thumb]]",
        "filepageexists": "La pagina di descrizione di questo file è già stata creata all'indirizzo <strong>[[:$1]]</strong>, anche se non esiste ancora un file con questo nome. La descrizione dell'oggetto inserita in fase di caricamento non apparirà sulla pagina di descrizione. Per far sì che l'oggetto compaia sulla pagina di descrizione, sarà necessario modificarla manualmente.\n[[$1|thumb]]",
        "fileexists-extension": "Un file con nome simile a questo esiste già: [[$2|thumb]]\n* Nome del file caricato: <strong>[[:$1]]</strong>\n* Nome del file esistente: <strong>[[:$2]]</strong>\nForse vuoi scegliere un nome più caratteristico?.",
        "fileexists-thumbnail-yes": "Il file caricato sembra essere una miniatura ''(thumbnail)''. [[$1|thumb]]\nVerificare, per confronto, il file <strong>[[:$1]]</strong>.\nSe si tratta della stessa immagine, nelle dimensioni originali, non è necessario caricarne altre miniature.",
index 8e1aa69..9fde977 100644 (file)
@@ -27,7 +27,8 @@
                        "Gi777ga",
                        "Matma Rex",
                        "Sopopruidze",
-                       "Dixtosa"
+                       "Dixtosa",
+                       "OpusDEI"
                ]
        },
        "tog-underline": "ბმულების ხაზგასმა:",
@@ -72,7 +73,7 @@
        "tog-showhiddencats": "დამალული კატეგორიების ჩვენება",
        "tog-norollbackdiff": "ცვლილების გაუქმებისას არ მანახო ცვლილებათა განსხვავება",
        "tog-useeditwarning": "გამაფრთხილე, როდესაც დავტოვებ რედაქტირებად გვერდს, დაუმახსოვრებელი ცვლილებებით",
-       "tog-prefershttps": "á\83£á\83¡á\83\90á\83¤á\83 á\83\97á\83®á\83\9d á\83\99á\83\90á\83\95á\83¨á\83\98á\83 á\83\98á\83¡ á\83\9bá\83£á\83\93á\83\90á\83\9b გამოყენება ავტორიზაციის შემდეგ",
+       "tog-prefershttps": "á\83\9bá\83£á\83\93á\83\90á\83\9b á\83£á\83¡á\83\90á\83¤á\83 á\83\97á\83®á\83\9d á\83\99á\83\90á\83\95á\83¨á\83\98á\83 á\83\98á\83¡ გამოყენება ავტორიზაციის შემდეგ",
        "underline-always": "მუდამ",
        "underline-never": "არასდროს",
        "underline-default": "დამოკიდებული მომხმარებელზე ან ბრაუზერის არჩევანზე",
        "category-file-count-limited": "შემდეგი {{PLURAL:$1|ფაილი|$1 ფაილები}} ამ კატეგორიაშია.",
        "listingcontinuesabbrev": "გაგრძ.",
        "index-category": "გვერდების ინდექსაცია",
-       "noindex-category": "არ არსებობს ინდექსირებული გვერდები",
+       "noindex-category": "არინდექსირებული გვერდები",
        "broken-file-category": "გვერდები ფაილების არასწორი ბმულებით",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "category-header-numerals": "$1–$2",
        "newwindow": "(ახალ ფანჯარაში)",
        "cancel": "გაუქმება",
        "moredotdotdot": "ვრცლად...",
-       "morenotlisted": "á\83\94á\83¡ á\83\90á\83 á\83\90á\83¡á\83 á\83£á\83\9aá\83\98 á\83¡á\83\98á\83\90á\83\90.",
+       "morenotlisted": "á\83\94á\83¡ á\83¡á\83\98á\83\90 á\83¨á\83\94á\83\98á\83«á\83\9aá\83\94á\83\91á\83\90 á\83\98á\83§á\83\9dá\83¡ á\83\90á\83 á\83\90á\83¡á\83 á\83£á\83\9aá\83\98.",
        "mypage": "გვერდი",
        "mytalk": "განხილვა",
        "anontalk": "განხილვა",
        "searcharticle": "გვერდი",
        "history": "გვერდის ისტორია",
        "history_short": "ისტორია",
+       "history_small": "ისტორია",
        "updatedmarker": "განახლდა ჩემი ბოლო შემოსვლის შემდეგ",
        "printableversion": "დასაბეჭდი ვერსია",
        "permalink": "მუდმივი ბმული",
        "viewyourtext": "თქვენ შეგიძლიათ იხილოთ და დააკოპიროთ  <strong>თქვენი რედაქტირებების</strong> საწყისი ტექსტი ამ გვერდზე:",
        "protectedinterface": "ეს გვერდი წარმოადგენს ტექსტურ ინტერფეისს პროგრამული უზრუნველყოფისათვის და დაცულია ვანდალიზმის აღკვეთის მიზნით.",
        "editinginterface": "'''ყურადღება:''' თქვენ არედაქტირებთ გვერდს, რომელიც პროგრამის ინტერფეისის ტექსტს შეიცავს. \nამ გვერდზე განხორციელებული რედაქტირება გამოიწვევს ამ ვიკის სხვა მომხმარებელთა სამუშაო ინტერფეისის შეცვლასაც. \nიმისათვის, რომ დაამატოთ ან შეცვალოთ თარგმანები ყველა ვიკიში, გთხოვთ, გამოიყენოთ მედიავიკის ლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
-       "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკებისლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
+       "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკების ლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
        "cascadeprotected": "ეს გვერდი რედაქტირებისგან დაცულია, რადგან იგი ჩართულია შემდეგ {{PLURAL:$1|გვერდში, რომლის|გვერდებში, რომელთა}} დასაცავადაც ჩართულია პარამეტრი \"იერარქიული\":\n$2",
        "namespaceprotected": "თქვენ არ გაქვთ '''$1''' სახელთა სივრცეში გვერდების რედაქტირების უფლება.",
        "customcssprotected": "თქვენ არ გაქვთ ამ CSS გვერდის რედაქტირების უფლება, ვინაიდან ის სხვა მომხმარებლის პირად კონფიგურაციას შეიცავს.",
index 52ff8e6..497bf06 100644 (file)
        "rcfilters-invalid-filter": "유효하지 않은 필터",
        "rcfilters-empty-filter": "활성화된 필터가 없습니다. 모든 기여가 표시됩니다.",
        "rcfilters-filterlist-title": "필터",
+       "rcfilters-filterlist-feedbacklink": "새로운 (베타) 필터에 대한 의견을 주세요",
+       "rcfilters-highlightbutton-title": "결과 강조",
+       "rcfilters-highlightmenu-title": "색 선택",
        "rcfilters-filterlist-noresults": "필터를 찾을 수 없습니다",
        "rcfilters-filtergroup-registration": "사용자 등록",
        "rcfilters-filter-registered-label": "등록됨",
        "editcomment": "편집 요약: <em>$1</em>",
        "revertpage": "[[Special:Contributions/$2|$2]]([[User talk:$2|토론]])의 편집을 [[User:$1|$1]]의 마지막 판으로 되돌림",
        "revertpage-nouser": "숨긴 사용자의 편집을 {{GENDER:$1|[[User:$1|$1]]}}의 마지막 판으로 되돌림",
-       "rollback-success": "$1의 편집을 되돌렸습니다.\n$2의 마지막 판으로 바뀌었습니다.",
+       "rollback-success": "{{GENDER:$3|$1}}의 편집을 되돌렸습니다.\n{{GENDER:$4|$2}}의 마지막 판으로 바뀌었습니다.",
        "rollback-success-notify": "$1의 편집을 되돌렸습니다.\n$2의 마지막 판으로 바뀌었습니다. [$3 차이 보기]",
        "sessionfailure-title": "세션 실패",
        "sessionfailure": "로그인 세션에 문제가 발생한 것 같습니다.\n세션 하이재킹을 막기 위해 동작이 취소되었습니다.\n브라우저의 뒤로 버튼을 누르고 문서를 새로 고침한 후에 다시 시도해 주세요.",
index 7021f60..9bedbe9 100644 (file)
        "group-bot-member": "бот",
        "grouppage-bot": "{{ns:project}}:Бот-влак",
        "grouppage-sysop": "{{ns:project}}:Сайтвиктарыше-влак",
+       "right-writeapi": "Возымашлан API-ым кучылтмаш",
        "newuserlogpage": "У пайдаланыше регистрацийым эртарыме журнал",
        "rightslog": "Участникын праваже-влакым ончыктышо журнал",
        "action-edit": "тиде лаштыкым тӧрлаташ",
        "minoreditletter": "и",
        "newpageletter": "У",
        "boteditletter": "б",
+       "rc-change-size-new": "Вашталтымаш деч вара $1 {{PLURAL:$1|байт}} лийын",
        "rc-enhanced-expand": "Тичмашын ончыкташ",
        "rc-enhanced-hide": "Рашлык-влакым шылташ",
        "recentchangeslinked": "Ваш кылдалтше тӧрлатымаш-влак",
        "file-nohires": "Кугурак чаплык уке.",
        "svg-long-desc": "SVG файл, шкенжын кугытшо: $1 × $2 пиксел, файлын кугытшо: $3",
        "show-big-image": "Тӱҥалтыш файл",
+       "show-big-image-preview": "Ончылгоч ончымо годым кугыт: $1",
        "show-big-image-size": "$1 × $2 пиксел",
        "newimages-legend": "Фильтр",
        "ilsubmit": "Кычал",
        "specialpages-group-pagetools": "Лаштык ӱзгар-влак",
        "specialpages-group-redirects": "Вес вере колтышо спецлаштык-влак",
        "external_image_whitelist": " #Оставьте эту строчку такой, как она есть<pre>\n#Разместите здесь фрагменты регулярных выражений (ту часть, что находится между //)\n#они будут соотнесены с URL внешних изображений.\n#Подходящие будут показаны как изображения, остальные будут показаны как ссылки на изображения.\n#Строки, начинающиеся с # считаются комментариями.\n#Строки не чувствительны к регистру\n\n#Размещайте фрагменты регулярных выражений над этой строчкой. Оставьте эту строчку такой, как она есть.</pre>",
+       "tag-filter": "[[Special:Tags|Метке]] фильтр:",
        "logentry-delete-delete": "$1 {{GENDER:$2|шӧрен|шӧрен}} лаштыкым $3",
+       "logentry-newusers-create": "Пайдаланыше {{GENDER:$2}} $1 лаштыкым ыштен.",
        "revdelete-summary": "тӧрлатымаш-влакым возен ончыктымаш",
        "searchsuggest-search": "{{SITENAME}} сайтым кычалаш",
        "expand_templates_ok": "Йӧра",
index dd0f45a..8c1cd1a 100644 (file)
        "eauthentsent": "На назначената адреса е испратена потврдна порака.\nПред да се испрати друга порака на корисничката сметка, ќе морате да ги проследите напатствијата во пораката, за да потврдите дека таа корисничка сметка е навистина ваша.",
        "throttled-mailpassword": "Веќе е испратена порака за измена на лозинката во {{PLURAL:$1|изминатиов час|изминативе $1 часа}}.\nЗа да се спречи злоупотреба, само едно потсетување може да се праќа на {{PLURAL:$1|секој час|секои $1 часа}}.",
        "mailerror": "Грешка при испраќање на е-поштата: $1",
-       "acct_creation_throttle_hit": "Посетители на ова вики користејќи ја вашата IP-адреса создале {{PLURAL:$1|1 сметка|$1 сметки}} во последниве $2, при што е достигнат најголемиот допуштен број на кориснички сметки предвиден и овозможен за овој период.\nКако резултат на ова, посетителите кои ја користат оваа IP-адреса во моментов нема да можат да создаваат нови сметки.",
+       "acct_creation_throttle_hit": "Посетители на ова вики користејќи ја вашата IP-адреса создале {{PLURAL:$1|1 сметка|$1 сметки}} во последниве $2, при што е достигнат најголемиот допуштен број на кориснички сметки предвиден и овозможен за овој период.\nКако последица на ова, посетителите кои ја користат оваа IP-адреса во моментов нема да можат да создаваат нови сметки.",
        "emailauthenticated": "Вашата е-пошта адреса е потврдена на $2 во $3 ч.",
        "emailnotauthenticated": "Вашата е-поштенска адреса сè уште не е потврдена.\nНема да биде испратена е-пошта во ниту еден од следниве случаи.",
        "noemailprefs": "Наведете е-поштенска адреса за да функционираат следниве својства.",
        "nextn": "{{PLURAL:следна $1|следни $1}}",
        "prev-page": "претходна страница",
        "next-page": "следна страница",
-       "prevn-title": "{{PLURAL:$1|Ð\9fÑ\80еÑ\82Ñ\85оден|Ð\9fÑ\80еÑ\82Ñ\85одни}} $1 {{PLURAL:$1|Ñ\80езÑ\83лÑ\82аÑ\82\80езÑ\83лÑ\82аÑ\82и}}",
-       "nextn-title": "{{PLURAL:$1|Следен|Следни}} $1 {{PLURAL:$1|Ñ\80езÑ\83лÑ\82аÑ\82\80езÑ\83лÑ\82аÑ\82и}}",
-       "shown-title": "Ð\9fÑ\80икажи $1 {{PLURAL:$1|Ñ\80езÑ\83лÑ\82аÑ\82\80езÑ\83лÑ\82аÑ\82и}} Ð½Ð° страница",
+       "prevn-title": "{{PLURAL:$1|Ð\9fÑ\80еÑ\82Ñ\85одна|Ð\9fÑ\80еÑ\82Ñ\85одни}} $1 {{PLURAL:$1|Ñ\81Ñ\82авка|Ñ\81Ñ\82авки}}",
+       "nextn-title": "{{PLURAL:$1|Следна|Следни}} $1 {{PLURAL:$1|Ñ\81Ñ\82авка|Ñ\81Ñ\82авки}}",
+       "shown-title": "Ð\9fÑ\80икажи $1 {{PLURAL:$1|Ñ\81Ñ\82авка|Ñ\81Ñ\82авки}} Ð¿Ð¾ страница",
        "viewprevnext": "Погледајте ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''На ова вики има страница со наслов „[[:$1]]“'''",
        "searchmenu-new": "<strong>Создајте ја страницата „[[:$1]]“ на ова вики!</strong> {{PLURAL:$2|0=|Погледајте ја и страницата најдена со пребарувањето.|Погледајте го и најденото од пребарувањето.}}",
        "search-relatedarticle": "Поврзано",
        "searchrelated": "поврзано",
        "searchall": "сè",
-       "showingresults": "Подолу {{PLURAL:$1|е прикажан '''1''' резултат|се прикажани '''$1''' резултати}} почнувајќи од бр. '''$2'''.",
-       "showingresultsinrange": "Ð\94олÑ\83 {{PLURAL:$1|е Ð¿Ñ\80икажан Ð´Ð¾ <strong>еден</strong> Ñ\80езÑ\83лÑ\82аÑ\82\81е Ð¿Ñ\80икажани Ð´Ð¾ <strong>$1</strong> Ñ\80езÑ\83лÑ\82аÑ\82и}} во опсег од <strong>$2</strong> до <strong>$3</strong>.",
-       "search-showingresults": "{{PLURAL:$4|РезÑ\83лÑ\82аÑ\82 <strong>$1</strong> Ð¾Ð´ <strong>$3</strong>|РезÑ\83лÑ\82аÑ\82и <strong>$1 - $2</strong> од <strong>$3</strong>}}",
-       "search-nonefound": "Нема резултати што одговараат на бараното.",
-       "search-nonefound-thiswiki": "Ð\9dема Ñ\80езÑ\83лÑ\82аÑ\82и што одговараат на бараното на ова мрежно место.",
+       "showingresults": "Подолу {{PLURAL:$1|е прикажана <strong>1</strong> ставка|се прикажани <strong>$1</strong> ставки}} почнувајќи од бр. <strong>$2</strong>.",
+       "showingresultsinrange": "Ð\9fодолÑ\83 {{PLURAL:$1|е Ð¿Ñ\80икажана Ð´Ð¾ <strong>една</strong> Ñ\81Ñ\82авка|Ñ\81е Ð¿Ñ\80икажани Ð´Ð¾ <strong>$1</strong> Ñ\81Ñ\82авки}} во опсег од <strong>$2</strong> до <strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|СÑ\82авка <strong>$1</strong> Ð¾Ð´ <strong>$3</strong>|СÑ\82авки <strong>$1 - $2</strong> од <strong>$3</strong>}}",
+       "search-nonefound": "Нема исходни ставки што одговараат на бараното.",
+       "search-nonefound-thiswiki": "Ð\9dема Ñ\81Ñ\82авки што одговараат на бараното на ова мрежно место.",
        "powersearch-legend": "Напредно пребарување",
        "powersearch-ns": "Пребарај во следниве именски простори:",
        "powersearch-togglelabel": "Избор:",
        "rcfilters-invalid-filter": "Неважечки филтер",
        "rcfilters-empty-filter": "Нема активни филтри. Прикажани се сите придонеси.",
        "rcfilters-filterlist-title": "Филтри",
+       "rcfilters-filterlist-feedbacklink": "Дајте мислење за новите (бета) филтри",
        "rcfilters-highlightbutton-title": "Истакнување на исход",
        "rcfilters-highlightmenu-title": "Изберете боја",
        "rcfilters-filterlist-noresults": "Не пронајдов ниеден филтер",
        "wantedcategories": "Потребни категории",
        "wantedpages": "Потребни страници",
        "wantedpages-summary": "Список на непостоечки страници со највеќе врски што водат до нив, исклучувајќи страниците до кои водат само пренасочувања. Список на непостоечки страници до кои водат пренасочувања ќе најдете на [[{{#special:BrokenRedirects}}|списокот на прекинати пренасочувања]].",
-       "wantedpages-badtitle": "Ð\9dевалиден Ð½Ð°Ñ\81лов Ð²Ð¾ Ñ\80езÑ\83лÑ\82аÑ\82ите: $1",
+       "wantedpages-badtitle": "Ð\9dеважеÑ\87ки Ð½Ð°Ñ\81лов Ð²Ð¾ Ñ\81Ñ\82авките: $1",
        "wantedfiles": "Потребни податотеки",
        "wantedfiletext-cat": "Следниве податотеки се користат, но не постојат. Податотеките од други складишта може да се наведени дури и ако постојат. Таквите ќе бидат <del>поништени</del> од списокот. Покрај ова, страниците што содржат податотеки кои не постојат се наведени на [[:$1]].",
        "wantedfiletext-cat-noforeign": "Следниве податотеки се користат, но не постојат. Покрај ова, страниците што ги содржат непостоечките податотеки се наведени во [[:$1]].",
        "feedback-external-bug-report-button": "Поднеси техничка задача",
        "feedback-dialog-title": "Поднеси мислење",
        "feedback-dialog-intro": "Послужете се со едноставниот образец подолу за да го поднесете вашето мислење. Коментарот ќе ви биде додаден на страницата „$1“, заедно со вашето корисничко име.",
-       "feedback-error1": "Грешка: Непрепознаен резултат од извршникот",
+       "feedback-error1": "Грешка: Непрепознаен исход од извршникот",
        "feedback-error2": "Грешка: Уредувањето не успеа",
        "feedback-error3": "Грешка: Извршникот не одговара",
        "feedback-error4": "Грешка: Не можам да објавам под дадениот наслов",
        "expand_templates_html_output": "Сиров HTML-извод",
        "expand_templates_ok": "ОК",
        "expand_templates_remove_comments": "Отстрани коментари",
-       "expand_templates_remove_nowiki": "Притаи <nowiki> ознаки во резултатот",
+       "expand_templates_remove_nowiki": "Притаи <nowiki> ознаки во исходот",
        "expand_templates_generate_xml": "Прикажи XML-дрво на расчленувањето",
        "expand_templates_generate_rawhtml": "Прикажувај сиров HTML",
        "expand_templates_preview": "Преглед",
index fd5ac54..ea443c5 100644 (file)
        "rcfilters-invalid-filter": "Ongeldig filter",
        "rcfilters-empty-filter": "Geen actieve filters. Alle bijdragen worden weergeven.",
        "rcfilters-filterlist-title": "Filters",
+       "rcfilters-filterlist-feedbacklink": "Geef feedback op de nieuwe (beta) filters",
        "rcfilters-highlightbutton-title": "Resultaten markeren",
        "rcfilters-highlightmenu-title": "Kies een kleur",
        "rcfilters-filterlist-noresults": "Geen filters gevonden",
index 3cfbe34..1c27d45 100644 (file)
        "undo-failure": "Aquesta modificacion a pas pogut èsser desfaita a causa de conflictes amb de modificacions intermediàrias.",
        "undo-norev": "La modificacion a pas pogut èsser desfaita perque siá es inexistenta siá es estada suprimida.",
        "undo-nochange": "Sembla que la modificacion es ja estada anullada.",
-       "undo-summary": "Anullacion de las modificacions $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discutir]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])",
+       "undo-summary": "Anullacion de las modificacions $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]])",
        "undo-summary-username-hidden": "Anullar la revision $1 per un utilizaire amagat",
        "cantcreateaccount-text": "La creacion de compte dempuèi aquesta adreça IP ('''$1''') es estada blocada per [[User:$3|$3]].\n\nLa rason balhada per $3 èra ''$2''.",
        "cantcreateaccount-range-text": "La creacion de compte dempuèi las adreças IP dins la plaja <strong>$1</strong>, que compren vòstra agreça IP (<strong>$4</strong>) son estadas blocadas per [[User:$3|$3]].\n\nLo motiu provesit per $3 es <em>$2</em>",
index 69f8df1..2250b88 100644 (file)
        "selfredirect": "<strong>Aviso:</strong> Você esta redirecionando esta pagina para ela mesmo. Você pode ter especificado o caminho errado para redirecionar, ou você pode estar editando a pagina errada. Se você clicar \"{{int:savearticle}}\" novamente, o redirecionamento será criado de qualquer modo.",
        "missingcommenttext": "Por favor, introduzida um comentário abaixo.",
        "missingcommentheader": "'''Lembrete:''' Você não introduziu um assunto/título para este comentário.\nSe você clicar novamente \"{{int:savearticle}}\", a sua edição será salva sem um assunto/título.",
-       "summary-preview": "Previsão do resumo:",
+       "summary-preview": "Previsão do resumo de edição:",
        "subject-preview": "Previsão do assunto/título:",
        "previewerrortext": "Ocorreu um erro ao tentar pré-visualizar suas alterações.",
        "blockedtitle": "O usuário está bloqueado",
        "rcfilters-invalid-filter": "Filtro inválido",
        "rcfilters-empty-filter": "Nenhum filtro ativo. Todas as contribuições são mostradas.",
        "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-feedbacklink": "Forneça feedback sobre os novos filtros (beta)",
+       "rcfilters-highlightbutton-title": "Realçar os resultados",
+       "rcfilters-highlightmenu-title": "Selecione uma cor",
        "rcfilters-filterlist-noresults": "Nenhum filtro encontrado",
        "rcfilters-filtergroup-registration": "Registro de usuário",
        "rcfilters-filter-registered-label": "Registrado",
index 7665f80..ea280ab 100644 (file)
        "rcfilters-invalid-filter": "A label for an invalid filter.",
        "rcfilters-empty-filter": "Placeholder for the filter list when no filters were chosen.",
        "rcfilters-filterlist-title": "Title for the filters list.\n{{Identical|Filter}}",
+       "rcfilters-filterlist-feedbacklink": "Caption for the link to the feedback page about the filters beta feature.",
        "rcfilters-highlightbutton-title": "Title for the highlight button used to toggle the highlight feature on and off.",
        "rcfilters-highlightmenu-title": "Title for the highlight menu used to select the highlight color for an individual filter.",
        "rcfilters-filterlist-noresults": "Message showing no results found for searching a filter.",
index bfb370f..32725d3 100644 (file)
                        "Аль-Гимравий",
                        "Gamliel Fishkin",
                        "Ping08",
-                       "Yuryleb"
+                       "Yuryleb",
+                       "Redredsonia"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "broken-file-category": "Страницы с неработающими файловыми ссылками",
        "about": "Описание",
        "article": "Статья",
-       "newwindow": "&nbsp;(в новом окне)",
+       "newwindow": "(в новом окне)",
        "cancel": "Отменить",
        "moredotdotdot": "Далее…",
        "morenotlisted": "Этот список может быть неполным.",
        "rcfilters-invalid-filter": "Недопустимый фильтр",
        "rcfilters-empty-filter": "Нет активных фильтров. Показываются все правки.",
        "rcfilters-filterlist-title": "Фильтры",
+       "rcfilters-filterlist-feedbacklink": "Оставить отзыв о новых (бета) фильтрах",
        "rcfilters-highlightbutton-title": "Выделить результаты",
        "rcfilters-highlightmenu-title": "Выберите цвет",
        "rcfilters-filterlist-noresults": "Фильтры не найдены",
index 0718281..ee45af3 100644 (file)
        "rcfilters-invalid-filter": "Neveljaven filter",
        "rcfilters-empty-filter": "Ni dejavnih filtrov. Prikazani so vsi prispevki.",
        "rcfilters-filterlist-title": "Filtri",
+       "rcfilters-filterlist-feedbacklink": "Podajte povratne informacije o novih (preizkusnih) filtrih",
        "rcfilters-highlightbutton-title": "Označi rezultate",
        "rcfilters-highlightmenu-title": "Izberite barvo",
        "rcfilters-filterlist-noresults": "Nismo našli nobenega filtra",
index 12fc4fa..e31dd7b 100644 (file)
        "virus-scanfailed": "неуспешно скенирање (код $1)",
        "virus-unknownscanner": "непознати антивирус:",
        "logouttext": "<strong>Одјављени сте.</strong>\n\nИмајте на уму да неке странице могу наставити да се приказују као да сте још пријављени, све док не очистите привремену меморију свог прегледача.",
+       "cannotlogoutnow-title": "Одјава тренутно није могућа",
+       "cannotlogoutnow-text": "Одјава није могућа током употребе $1.",
        "welcomeuser": "Добро дошли, $1!",
        "welcomecreation-msg": "Ваш налог је отворен.\nНе заборавите да промените своја [[Special:Preferences|подешавања]].",
        "yourname": "Корисничко име:",
        "changepassword-success": "Ваша лозинка је успешно промењена!",
        "changepassword-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
        "botpasswords": "Лозинке ботова",
+       "botpasswords-disabled": "Лозинке ботова су онемогућене.",
        "botpasswords-label-appid": "Име бота:",
        "botpasswords-label-create": "Направи",
        "botpasswords-label-update": "Ажурирај",
        "hr_tip": "Водоравна линија (користити ретко)",
        "summary": "Опис измене:",
        "subject": "Тема:",
-       "minoredit": "мања измена",
-       "watchthis": "надгледај ову страницу",
+       "minoredit": "Ð\9eво Ñ\98е Ð¼Ð°Ñ\9aа Ð¸Ð·Ð¼ÐµÐ½Ð°",
+       "watchthis": "Ð\9dадгледај ову страницу",
        "savearticle": "Сачувај страницу",
        "savechanges": "Сачувај измене",
        "publishpage": "Објави страницу",
        "difference-multipage": "(разлике између страница)",
        "lineno": "Ред $1:",
        "compareselectedversions": "Упореди изабране измене",
-       "showhideselectedversions": "Ð\9fÑ\80икажи/Ñ\81акÑ\80иÑ\98 Ð¸Ð·Ð°Ð±Ñ\80ане Ð¸Ð·Ð¼ÐµÐ½Ðµ",
+       "showhideselectedversions": "Ð\9fÑ\80омени Ð²Ð¸Ð´Ñ\99ивоÑ\81Ñ\82 Ð¸Ð·Ð°Ð±Ñ\80аниÑ\85 Ð¸Ð·Ð¼ÐµÐ½Ð°",
        "editundo": "поништи",
        "diff-empty": "(Нема разлике)",
        "diff-multi-sameuser": "({{PLURAL:$1|Једна међуизмена истог корисника није приказана|$1 међуизмене истог корисника није приказано|$1 међуизмена истог корисника није приказано}})",
        "saveusergroups": "Сачувај {{GENDER:$1|корисничке}} групе",
        "userrights-groupsmember": "Члан:",
        "userrights-groupsmember-auto": "Подразумевано члан и:",
-       "userrights-groups-help": "Можете променити групе којима овај корисник припада.\n* Означен квадратић означава да се корисник налази у тој групи.\n* Неозначен квадратић означава да се корисник не налази у тој групи.\n* Звездица означава да не можете уклонити групу ако је додате и обратно.",
+       "userrights-groups-help": "Можете променити групе којима овај корисник припада.\n* Означен квадратић означава да се корисник налази у тој групи.\n* Неозначен квадратић означава да се корисник не налази у тој групи.\n* Звездица (*) означава да не можете уклонити групу ако је додате и обратно.\n* Тараба (#) означава да једино можете одложити време истека ове групе; не можете га убрзати.",
        "userrights-reason": "Разлог:",
        "userrights-no-interwiki": "Немате овлашћења да мењате корисничка права на другим викијима.",
        "userrights-nodatabase": "База података $1 не постоји или није локална.",
        "recentchangeslinked-page": "Назив странице:",
        "recentchangeslinked-to": "Прикажи измене страница које су повезане с датом страницом",
        "recentchanges-page-added-to-category": "[[:$1]] је додата у категорију",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] и још [[Special:WhatLinksHere/$1|{{PLURAL:$2|једна страница|$2 странице}}]] су додате у категорију",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] је додана у категорију, [[Special:WhatLinksHere/$1|ова страница је повезана са другим страницама]]",
        "recentchanges-page-removed-from-category": "[[:$1]] је уклоњена из категорије",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] и још [[Special:WhatLinksHere/$1|{{PLURAL:$2|једна страница|$2 странице}}]] су уклоњене из категорије",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] је уклоњена из категорије, [[Special:WhatLinksHere/$1|ова страница је повезана са другим страницама]]",
        "autochange-username": "Медијавики аутоматска измена",
        "upload": "Отпреми датотеку",
        "uploadbtn": "Отпреми датотеку",
        "emailccsubject": "Копија ваше поруке кориснику $1: $2",
        "emailsent": "Имејл је послат",
        "emailsenttext": "Ваша имејл порука је послата.",
-       "emailuserfooter": "Овај имејл је {{GENDER:$1|послао|послала}} $1 {{GENDER:$2|кориснику|корисници}} $2 помоћу „{{int:emailuser}}“ с викија {{SITENAME}}.",
+       "emailuserfooter": "Овај имејл је {{GENDER:$1|послао|послала}} $1 {{GENDER:$2|кориснику|корисници}} $2 помоћу „{{int:emailuser}}“ с викија {{SITENAME}}. Ако одговорите на овај имејл, {{GENDER:$2|Ваш}} имејл ће бити непосредно прослеђен ка {{GENDER:$1|првобитном пошиљаоцу}}, чиме ће те {{GENDER:$2|му|јој}} открити {{GENDER:$2|Вашу}} имејл адресу.",
        "usermessage-summary": "Слање системске поруке.",
        "usermessage-editor": "Уређивач системских порука",
        "usermessage-template": "MediaWiki:UserMessage",
        "editcomment": "Опис измене: <em>$1</em>.",
        "revertpage": "Враћене измене [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]]) на последњу измену корисника [[User:$1|$1]]",
        "revertpage-nouser": "Враћене су измене скривеног корисника на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]",
-       "rollback-success": "Враћене су измене {{GENDER:$1|корисника|кориснице}} $1\nна последњу измену {{GENDER:$2|корисника|кориснице}} $2.",
+       "rollback-success": "Враћене су измене {{GENDER:$1|корисника|кориснице}} {{GENDER:$3|$1}}\nна последњу измену {{GENDER:$2|корисника|кориснице}} {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Сесија је окончана",
        "sessionfailure": "Изгледа да постоји проблем с вашом сесијом;\nова радња је отказана да би се избегла злоупотреба.\nВратите се на претходну страницу, поново је учитајте и покушајте поново.",
        "changecontentmodel": "Промени модел садржаја странице",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 наслов је уклоњен|$1 наслова су уклоњена|$1 наслова је уклоњено}}:",
        "watchlistedit-too-many": "Има превише страница за приказ овде.",
        "watchlisttools-clear": "испразни списак надгледања",
-       "watchlisttools-view": "прикажи сродне измене",
+       "watchlisttools-view": "Ð\9fрикажи сродне измене",
        "watchlisttools-edit": "прикажи и уреди списак надгледања",
        "watchlisttools-raw": "измени сиров списак надгледања",
        "iranian-calendar-m1": "Фарвардин",
        "special-characters-group-ipa": "ИПА",
        "special-characters-group-symbols": "симболи",
        "special-characters-group-greek": "грчки",
+       "special-characters-group-greekextended": "проширени грчки",
        "special-characters-group-cyrillic": "ћирилица",
        "special-characters-group-arabic": "арапски",
        "special-characters-group-arabicextended": "проширени арапски",
index 45a83ca..29ae013 100644 (file)
@@ -40,6 +40,7 @@
        "tog-watchdefault": "Dodaj stranice i datoteke koje izmenim u spisak nadgledanja",
        "tog-watchmoves": "Dodaj stranice i datoteke koje premestim u spisak nadgledanja",
        "tog-watchdeletion": "Dodaj stranice i datoteke koje obrišem u spisak nadgledanja",
+       "tog-watchuploads": "Dodaj datoteke koje otpremim u spisak nadgledanja",
        "tog-watchrollback": "Dodaj stranice na kojima sam vratio izmene u spisak nadgledanja",
        "tog-minordefault": "Označavaj sve izmene kao manje",
        "tog-previewontop": "Prikaži pregled pre okvira za uređivanje",
@@ -51,7 +52,7 @@
        "tog-shownumberswatching": "Prikaži broj korisnika koji nadgledaju",
        "tog-oldsig": "Tekući potpis:",
        "tog-fancysig": "Smatraj potpis kao vikitekst (bez samopovezivanja)",
-       "tog-uselivepreview": "Koristi trenutan pregled",
+       "tog-uselivepreview": "Koristi trenutni pregled",
        "tog-forceeditsummary": "Upozori me kada ne unesem opis izmene",
        "tog-watchlisthideown": "Sakrij moje izmene sa spiska nadgledanja",
        "tog-watchlisthidebots": "Sakrij izmene botova sa spiska nadgledanja",
@@ -64,7 +65,7 @@
        "tog-ccmeonemails": "Pošalji mi kopije imejlova koje pošaljem drugim korisnicima",
        "tog-diffonly": "Ne prikazuj sadržaj stranice ispod razlika",
        "tog-showhiddencats": "Prikaži skrivene kategorije",
-       "tog-norollbackdiff": "Izostavi razliku nakon izvršenog vraćanja",
+       "tog-norollbackdiff": "Ne prikazuj razliku nakon izvršenog vraćanja",
        "tog-useeditwarning": "Upozori me kada napuštam stranicu sa nesačuvanim promenama",
        "tog-prefershttps": "Uvek koristi sigurnu konekciju kada sam prijavljen.",
        "underline-always": "uvek podvlači",
        "hr_tip": "Vodoravna linija (koristiti retko)",
        "summary": "Opis izmene:",
        "subject": "Tema:",
-       "minoredit": "manja izmena",
-       "watchthis": "nadgledaj ovu stranicu",
+       "minoredit": "Ovo je manja izmena",
+       "watchthis": "Nadgledaj ovu stranicu",
        "savearticle": "Sačuvaj stranicu",
        "savechanges": "Sačuvaj izmene",
        "publishpage": "Objavi stranicu",
        "difference-multipage": "(razlike između stranica)",
        "lineno": "Red $1:",
        "compareselectedversions": "Uporedi izabrane izmene",
-       "showhideselectedversions": "Prikaži/sakrij izabrane izmene",
+       "showhideselectedversions": "Promeni vidljivost izabranih izmena",
        "editundo": "poništi",
        "diff-empty": "(Nema razlike)",
        "diff-multi-sameuser": "({{PLURAL:$1|Jedna međuizmena istog korisnika nije prikazana|$1 međuizmene istog korisnika nije prikazano|$1 međuizmena istog korisnika nije prikazano}})",
        "username": "{{GENDER:$1|Korisničko ime}}:",
        "prefs-memberingroups": "{{PLURAL:$1|Grupa|Grupe}}:",
        "prefs-memberingroups-type": "$1",
-       "prefs-registration": "Vreme upisa:",
+       "prefs-registration": "Vreme registracije:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "Pravo ime:",
        "yourlanguage": "Jezik:",
        "tooltip-watchlistedit-raw-submit": "Ažuriraj spisak",
        "tooltip-recreate": "Ponovo napravite stranicu iako je obrisana",
        "tooltip-upload": "Započnite otpremanje",
-       "tooltip-rollback": "Opcija „Vrati“ vraća izmene poslednjeg korisnika",
+       "tooltip-rollback": "„Vrati“ vraća izmene poslednjeg korisnika jednim klikom",
        "tooltip-undo": "Poništava ovu izmenu i otvara obrazac za uređivanje.",
        "tooltip-preferences-save": "Sačuvaj postavke",
        "tooltip-summary": "Unesite kratak opis",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 naslov je uklonjen|$1 naslova su uklonjena|$1 naslova je uklonjeno}}:",
        "watchlistedit-too-many": "Ima previše stranica za prikaz ovde.",
        "watchlisttools-clear": "isprazni spisak nadgledanja",
-       "watchlisttools-view": "prikaži srodne izmene",
+       "watchlisttools-view": "Prikaži srodne izmene",
        "watchlisttools-edit": "prikaži i uredi spisak nadgledanja",
        "watchlisttools-raw": "izmeni sirov spisak nadgledanja",
        "iranian-calendar-m1": "Farvardin",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Simboli",
        "special-characters-group-greek": "grčki",
+       "special-characters-group-greekextended": "prošireni grčki",
        "special-characters-group-cyrillic": "ćirilica",
        "special-characters-group-arabic": "arapski",
        "special-characters-group-arabicextended": "prošireni arapski",
index 868b7b3..b9ae2be 100644 (file)
        "rcfilters-invalid-filter": "Ogiltigt filter",
        "rcfilters-empty-filter": "Inga aktiva filter. Alla bidrag visas.",
        "rcfilters-filterlist-title": "Filter",
+       "rcfilters-filterlist-feedbacklink": "Ge återkoppling på nya (beta)filter",
        "rcfilters-highlightbutton-title": "Markera resultat",
        "rcfilters-highlightmenu-title": "Välj en färg",
        "rcfilters-filterlist-noresults": "Inga filter hittades",
index bac27db..c357658 100644 (file)
        "saveprefs": "Шыгжаары",
        "restoreprefs": "Шупту баштайгы ниити шилилгелерни restore",
        "prefs-editing": "Өскертир",
-       "rows": "Одуруглар:",
-       "columns": "Баганалар:",
        "searchresultshead": "Дилээр",
        "timezoneuseserverdefault": "Викиниң ниити шилилгезин ажыглаары ($1)",
        "servertime": "Серверниң шагы:",
        "hours": "{{PLURAL:$1|1=$1 шак|$1 шак}}",
        "days": "{{PLURAL:$1|1=$1 хүн|$1 хүн}}",
        "ago": "$1 бурунгаар",
-       "bad_image_list": "ФоÑ\80мадÑ\8b Ð¼Ñ\8bндÑ\8bг Ð±Ð¾Ð¾Ñ\80 Ñ\83жÑ\83Ñ\80лÑ\83г:\n\nЧүгле Ð´Ð°Ò£Ð·Ñ\8bнÑ\8bÒ£ Ð¸Ð´ÐµÐ³ÐµÑ\82Ñ\82еÑ\80и (Ñ\8dлеменÑ\82илеÑ\80и) Ñ\81анаÑ\82Ñ\8bнаÑ\80 Ð±Ð¾Ð¾Ñ\80 (* Ð´ÐµÐ¿ Ð´ÐµÐ¼Ð´ÐµÐºÑ\82ен Ñ\8dгелÑ\8dÑ\8dн Ð¾Ð´Ñ\83Ñ\80Ñ\83глаÑ\80).\nÐ\9eдÑ\83Ñ\80Ñ\83гнÑ\83Ò£ Ð±Ð¸Ñ\80ги Ñ\88өлүдүү Ñ\81алдÑ\8bнмаÑ\81 Ñ\87Ñ\83Ñ\80Ñ\83малÑ\87е Ñ\88өлүдүг Ð±Ð¾Ð»Ñ\83Ñ\80Ñ\83 Ð°Ð»Ð±Ð°Ð½.\nÐ\9eл-ла Ð¾Ð´Ñ\83Ñ\80Ñ\83гнÑ\83Ò£ Ð°Ñ\80Ñ\82кан Ñ\88өлүдүглеÑ\80и Ð¾Ð½Ð·Ð°Ð³Ð°Ð¹ ÐºÑ\8bлдÑ\8bÑ\80 Ð°Ð·Ñ\8b Ñ\87Ñ\83Ñ\80Ñ\83мал ÐºÐ°Ð¿Ñ\81Ñ\8bÑ\80Ñ\8bп Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\87үүлдеÑ\80 ÐºÑ\8bлдÑ\8bÑ\80 Ñ\81анаÑ\82Ñ\82Ñ\8bнар.",
+       "bad_image_list": "ФоÑ\80мадÑ\8b Ð¼Ñ\8bндÑ\8bг Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\83жÑ\83Ñ\80лÑ\83г:\n\nÐ\94аңзÑ\8bда Ñ\87үгле Ñ\8dлеменÑ\82илеÑ\80 Ñ\81анаÑ\82Ñ\8bнаÑ\80 (* Ð´ÐµÐ¿ Ð´ÐµÐ¼Ð´ÐµÐºÑ\82ен Ñ\8dгелÑ\8dÑ\8dн Ð¾Ð´Ñ\83Ñ\80Ñ\83глаÑ\80).\nÐ\9eдÑ\83Ñ\80Ñ\83гда Ð±Ð¸Ñ\80 Ð´Ñ\83гааÑ\80 Ð°Ð¹Ñ\82Ñ\8bг Ð±Ð¾Ð»Ð·Ð° ÐºÐ¸Ð¸Ñ\80 Ð±Ð¸Ð¶Ð¸Ñ\82Ñ\82инмеÑ\81 Ñ\87Ñ\83Ñ\80Ñ\83кÑ\87е Ð°Ð¹Ñ\82Ñ\8bÑ\80 Ñ\83жÑ\83Ñ\80лÑ\83г.\nÐ\9eл-ла Ð¾Ð´Ñ\83Ñ\80Ñ\83гнÑ\83Ò£ Ó©Ñ\81ке Ð°Ð¹Ñ\82Ñ\8bглаÑ\80Ñ\8b, Ñ\87Ñ\83Ñ\80Ñ\83кÑ\82аÑ\80нÑ\8b ÐºÐ¸Ð¸Ñ\80 Ð±Ð¸Ð¶Ð¸Ð´Ð¸Ð¿ Ð±Ð¾Ð»Ñ\83Ñ\80 Ð°Ñ\80Ñ\8bннаÑ\80же Ð°Ð¹Ñ\82Ñ\8bп Ñ\82Ñ\83Ñ\80ар.",
        "metadata": "Чурумал дугайында медээлер",
        "metadata-help": "Бо файлда цифралыг камераларның болгаш сканерлерниң немеп каары немелде медээлер бар. Файлды кылган соонда эдип турган болза, ооң чамдык параметрлери ооң амгы чуруунга дүүшпес бооп болур.",
        "metadata-fields": "Бо даңзыда айыткан чурумалдар метаданныйларның кезектери чурумалдың арынынга көстүп кээр, метаданныйлар таблицазын дүрүп каан болур. \nАрткан кезектер аайлаан ёзугаар чажыт көстүр.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
index 6b8e5a5..8093c68 100644 (file)
@@ -16,7 +16,8 @@
                        "Silovan",
                        "David1010",
                        "Macofe",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Otogi"
                ]
        },
        "tog-underline": "რცხუეფიშ ათოღაზუა:",
        "viewyourtext": "თქვა შეილებუნა ქოძირათ '''თქვანი რედაქტირაფეფიშ''' დაჭყაფური ტექსტი თე ხასჷლას დო გეჭოფათ თიშ ანგი.",
        "protectedinterface": "ეს გვერდი წარმოადგენს ტექსტურ ინტერფეისს პროგრამული უზრუნველყოფისათვის და დაცულია ვანდალიზმის აღკვეთის მიზნით.",
        "editinginterface": "<strong>ყურადღება:</strong> თქვენ არედაქტირებთ გვერდს, რომელიც პროგრამის ინტერფეისის ტექსტს შეიცავს. \nამ გვერდზე განხორციელებული რედაქტირება გამოიწვევს ამ ვიკის სხვა მომხმარებელთა სამუშაო ინტერფეისის შეცვლასაც.",
-       "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკებისლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
+       "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკების ლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
        "cascadeprotected": "ეს გვერდი რედაქტირებისგან დაცულია, რადგან იგი ჩართულია შემდეგ {{PLURAL:$1|გვერდში, რომლის |გვერდებში, რომელთა}} დასაცავადაც ჩართულია პარამეტრი \"იერარქიული\":\n$2",
        "namespaceprotected": "თქვენ არ გაქვთ '''$1''' სახელთა სივრცეში გვერდების რედაქტირების უფლება.",
        "customcssprotected": "თქვენ არ გაქვთ ამ CSS გვერდის რედაქტირების უფლება, ვინაიდან ის სხვა მომხმარებლის პირად კონფიგურაციას შეიცავს.",
index 1837c4b..0dfae47 100644 (file)
        "rcfilters-invalid-filter": "无效过滤器",
        "rcfilters-empty-filter": "没有活跃的过滤器。已显示所有贡献。",
        "rcfilters-filterlist-title": "过滤器",
+       "rcfilters-filterlist-feedbacklink": "在新(测试版)过滤器中提供反馈",
        "rcfilters-highlightbutton-title": "高亮结果",
        "rcfilters-highlightmenu-title": "选择颜色",
        "rcfilters-filterlist-noresults": "找不到过滤器",
index e39cb1c..a511365 100644 (file)
        "editusergroup": "載入使用者群組",
        "editinguser": "變更{{GENDER:$1|使用者}} <strong>[[User:$1|$1]]</strong> 的使用者權限 $2",
        "viewinguserrights": "檢視{{GENDER:$1|使用者}}<strong>[[User:$1|$1]]</strong>的使用者權限 $2",
-       "userrights-editusergroup": "編輯使用者群組",
+       "userrights-editusergroup": "編輯{{GENDER:$1|使用者}}群組",
        "userrights-viewusergroup": "檢視{{GENDER:$1|使用者}}群組",
        "saveusergroups": "儲存{{GENDER:$1|使用者}}群組",
        "userrights-groupsmember": "所屬群組:",
        "userrights-nodatabase": "資料庫 $1 不存在或不在本地主機的。",
        "userrights-changeable-col": "您可變更的群組",
        "userrights-unchangeable-col": "您不可變更的群組",
+       "userrights-expiry": "期限:",
        "userrights-expiry-othertime": "其他時間:",
        "userrights-conflict": "使用者權限變更發生衝突!請檢閱並確認你的變更。",
        "group": "群組:",
        "rcfilters-filter-userExpLevel-learner-description": "活躍的天數以及編輯數比「新手」多,但比「有經驗的使用者」少。",
        "rcfilters-filter-userExpLevel-experienced-label": "有經驗的使用者",
        "rcfilters-filter-userExpLevel-experienced-description": "活躍超過 30 天,編輯超過 500 次。",
+       "rcfilters-filter-bots-label": "機器人",
+       "rcfilters-filter-humans-label": "人類(非機器人)",
+       "rcfilters-filter-humans-description": "由人類編者做出的編輯",
+       "rcfilters-filter-minor-label": "小修改",
+       "rcfilters-filter-major-label": "非小編輯",
+       "rcfilters-filter-major-description": "未標記小修改的編輯。",
+       "rcfilters-filter-pageedits-label": "頁面編輯",
+       "rcfilters-filter-newpages-label": "頁面創建",
+       "rcfilters-filter-newpages-description": "創立新頁面的編緝。",
+       "rcfilters-filter-categorization-label": "分類變更",
        "rcnotefrom": "以下{{PLURAL:$5|為}}自 <strong>$3 $4</strong> 以來的變更 (最多顯示 <strong>$1</strong> 筆)。",
        "rclistfrom": "顯示自 $3 $2 以來的新變更",
        "rcshowhideminor": "$1 小修訂",
        "editcomment": "編輯摘要為:<em>$1</em>。",
        "revertpage": "已還原 [[Special:Contributions/$2|$2]] ([[User talk:$2|對話]]) 的編輯為最後由 [[User:$1|$1]] 所修訂的版本",
        "revertpage-nouser": "已還隱藏使用者的編輯為最後 {{GENDER:$1|[[User:$1|$1]]}} 修訂的版本",
-       "rollback-success": "已還原 $1 所做的編輯;\n變更回由 $2 修訂的最後一個版本。",
+       "rollback-success": "已還原 {{GENDER:$3|$1}} 所做的編輯;\n變更回由 {{GENDER:$4|$2}} 修訂的最後一個版本。",
        "rollback-success-notify": "已還原 $1 所做的編輯;\n變更回由 $2 修訂的最後一個版本。[$3 顯示變更]",
        "sessionfailure-title": "連線階段失敗",
        "sessionfailure": "您的登入連線階段似乎有問題,\n為了預防連線階段受到劫持攻擊,此動作已經被取消。\n請返回上一頁,重新讀取該頁面再試一次。",
        "mw-widgets-titleinput-description-new-page": "頁面不存在",
        "mw-widgets-titleinput-description-redirect": "重新導向至 $1",
        "mw-widgets-categoryselector-add-category-placeholder": "加入分類...",
+       "mw-widgets-usersmultiselect-placeholder": "添加更多...",
        "sessionmanager-tie": "無法合併多個請求認証類型:$1。",
        "sessionprovider-generic": "$1 連線階段",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "以 cookie 為基礎的連線階段",
index 863d74a..83ab35c 100644 (file)
@@ -38,31 +38,43 @@ class CleanupRemovedModules extends Maintenance {
                parent::__construct();
                $this->addDescription(
                        'Remove cache entries for removed ResourceLoader modules from the database' );
-               $this->addOption( 'batchsize', 'Delete rows in batches of this size. Default: 500', false, true );
+               $this->setBatchSize( 500 );
        }
 
        public function execute() {
+               $this->output( "Cleaning up module_deps table...\n" );
+
                $dbw = $this->getDB( DB_MASTER );
                $rl = new ResourceLoader( MediaWikiServices::getInstance()->getMainConfig() );
                $moduleNames = $rl->getModuleNames();
-               $moduleList = implode( ', ', array_map( [ $dbw, 'addQuotes' ], $moduleNames ) );
-               $limit = max( 1, intval( $this->getOption( 'batchsize', 500 ) ) );
+               $res = $dbw->select( 'module_deps',
+                       [ 'md_module', 'md_skin' ],
+                       $moduleNames ? 'md_module NOT IN (' . $dbw->makeList( $moduleNames ) . ')' : '1=1',
+                       __METHOD__
+               );
+               $rows = iterator_to_array( $res, false );
 
-               $this->output( "Cleaning up module_deps table...\n" );
-               $i = 1;
                $modDeps = $dbw->tableName( 'module_deps' );
-               do {
-                       // $dbw->delete() doesn't support LIMIT :(
-                       $where = $moduleList ? "md_module NOT IN ($moduleList)" : '1=1';
-                       $dbw->query( "DELETE FROM $modDeps WHERE $where LIMIT $limit", __METHOD__ );
+               $i = 1;
+               foreach ( array_chunk( $rows, $this->mBatchSize ) as $chunk ) {
+                       // WHERE ( mod=A AND skin=A ) OR ( mod=A AND skin=B) ..
+                       $conds = array_map( function ( stdClass $row ) use ( $dbw ) {
+                               return $dbw->makeList( (array)$row, IDatabase::LIST_AND );
+                       }, $chunk );
+                       $conds = $dbw->makeList( $conds, IDatabase::LIST_OR );
+
+                       $this->beginTransaction( $dbw, __METHOD__ );
+                       $dbw->query( "DELETE FROM $modDeps WHERE $conds", __METHOD__ );
                        $numRows = $dbw->affectedRows();
                        $this->output( "Batch $i: $numRows rows\n" );
+                       $this->commitTransaction( $dbw, __METHOD__ );
+
                        $i++;
-                       wfWaitForSlaves();
-               } while ( $numRows > 0 );
-               $this->output( "done\n" );
+               }
+
+               $this->output( "Done\n" );
        }
 }
 
-$maintClass = "CleanupRemovedModules";
+$maintClass = 'CleanupRemovedModules';
 require_once RUN_MAINTENANCE_IF_MAIN;
index b8001a4..70f3654 100644 (file)
@@ -23,6 +23,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Maintenance script to convert user options to the new `user_properties` table.
  *
diff --git a/maintenance/initUserPreference.php b/maintenance/initUserPreference.php
new file mode 100644 (file)
index 0000000..f4da570
--- /dev/null
@@ -0,0 +1,84 @@
+<?php
+/**
+ * Initialize a user preference based on the value
+ * of another preference.
+ *
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script that initializes a user preference
+ * based on the value of another preference.
+ *
+ * @ingroup Maintenance
+ */
+class InitUserPreference extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addOption(
+                       'target',
+                       'Name of the user preference to initialize',
+                       true,
+                       true,
+                       't'
+               );
+               $this->addOption(
+                       'source',
+                       'Name of the user preference to take the value from',
+                       true,
+                       true,
+                       's'
+               );
+               $this->setBatchSize( 300 );
+       }
+
+       public function execute() {
+               $target = $this->getOption( 'target' );
+               $source = $this->getOption( 'source' );
+               $this->output( "Initializing '$target' based on the value of '$source'\n" );
+
+               $dbr = $this->getDB( DB_REPLICA );
+               $dbw = $this->getDB( DB_MASTER );
+
+               $iterator = new BatchRowIterator(
+                       $dbr,
+                       'user_properties',
+                       [ 'up_user', 'up_property' ],
+                       $this->mBatchSize
+               );
+               $iterator->setFetchColumns( [ 'up_user', 'up_value' ] );
+               $iterator->addConditions( [
+                       'up_property' => $source,
+                       'up_value IS NOT NULL',
+                       'up_value != 0',
+               ] );
+
+               $processed = 0;
+               foreach ( $iterator as $batch ) {
+                       foreach ( $batch as $row ) {
+                               $values = [
+                                       'up_user' => $row->up_user,
+                                       'up_property' => $target,
+                                       'up_value' => $row->up_value,
+                               ];
+                               $dbw->upsert(
+                                       'user_properties',
+                                       $values,
+                                       [ 'up_user', 'up_property' ],
+                                       $values,
+                                       __METHOD__
+                               );
+
+                               $processed += $dbw->affectedRows();
+                       }
+               }
+
+               $this->output( "Processed $processed user(s)\n" );
+               $this->output( "Finished!\n" );
+       }
+}
+
+$maintClass = 'InitUserPreference'; // Tells it to run the class
+require_once RUN_MAINTENANCE_IF_MAIN;
index 522871d..80e8011 100644 (file)
@@ -26,6 +26,7 @@
 
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 require_once __DIR__ . '/Maintenance.php';
 
@@ -571,7 +572,7 @@ class NamespaceConflictChecker extends Maintenance {
        /**
         * Merge page histories
         *
-        * @param integer $id The page_id
+        * @param stdClass $row Page row
         * @param Title $newTitle The new title
         * @return bool
         */
index b354399..cf65c69 100644 (file)
@@ -23,6 +23,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Maintenance script that sends purge requests for pages edited in a date
  * range to squid/varnish.
diff --git a/maintenance/purgeModuleDeps.php b/maintenance/purgeModuleDeps.php
new file mode 100644 (file)
index 0000000..3088baa
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Remove all cache entries for ResourceLoader modules from the database.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ * @author Timo Tijhof
+ */
+
+use MediaWiki\MediaWikiServices;
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script to purge the module_deps database cache table.
+ *
+ * @ingroup Maintenance
+ */
+class PurgeModuleDeps extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription(
+                       'Remove all cache entries for ResourceLoader modules from the database' );
+               $this->setBatchSize( 500 );
+       }
+
+       public function execute() {
+               $this->output( "Cleaning up module_deps table...\n" );
+
+               $dbw = $this->getDB( DB_MASTER );
+               $res = $dbw->select( 'module_deps', [ 'md_module', 'md_skin' ], [], __METHOD__ );
+               $rows = iterator_to_array( $res, false );
+
+               $modDeps = $dbw->tableName( 'module_deps' );
+               $i = 1;
+               foreach ( array_chunk( $rows, $this->mBatchSize ) as $chunk ) {
+                       // WHERE ( mod=A AND skin=A ) OR ( mod=A AND skin=B) ..
+                       $conds = array_map( function ( stdClass $row ) use ( $dbw ) {
+                               return $dbw->makeList( (array)$row, IDatabase::LIST_AND );
+                       }, $chunk );
+                       $conds = $dbw->makeList( $conds, IDatabase::LIST_OR );
+
+                       $this->beginTransaction( $dbw, __METHOD__ );
+                       $dbw->query( "DELETE FROM $modDeps WHERE $conds", __METHOD__ );
+                       $numRows = $dbw->affectedRows();
+                       $this->output( "Batch $i: $numRows rows\n" );
+                       $this->commitTransaction( $dbw, __METHOD__ );
+
+                       $i++;
+               }
+
+               $this->output( "Done\n" );
+       }
+}
+
+$maintClass = 'PurgeModuleDeps';
+require_once RUN_MAINTENANCE_IF_MAIN;
index fb24a1d..06fcbaf 100644 (file)
@@ -272,7 +272,9 @@ class RefreshLinks extends Maintenance {
                        return;
                }
 
-               foreach ( $content->getSecondaryDataUpdates( $page->getTitle() ) as $update ) {
+               $updates = $content->getSecondaryDataUpdates(
+                       $page->getTitle(), /* $old = */ null, /* $recursive = */ false );
+               foreach ( $updates as $update ) {
                        DeferredUpdates::addUpdate( $update );
                }
        }
index e42a8ef..58472e9 100644 (file)
@@ -24,6 +24,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Maintenance script that sends SQL queries from the specified file to the database.
  *
@@ -50,7 +52,7 @@ class MwSql extends Maintenance {
                $wiki = $this->hasOption( 'wikidb' ) ? $this->getOption( 'wikidb' ) : false;
                // Get the appropriate load balancer (for this wiki)
                if ( $this->hasOption( 'cluster' ) ) {
-                       $lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ), $wiki );
+                       $lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ) );
                } else {
                        $lb = wfGetLB( $wiki );
                }
@@ -159,7 +161,7 @@ class MwSql extends Maintenance {
 
        /**
         * Print the results, callback for $db->sourceStream()
-        * @param ResultWrapper $res The results object
+        * @param ResultWrapper|bool $res The results object
         * @param IDatabase $db
         */
        public function sqlPrintResult( $res, $db ) {
index 10a6de8..ea5835d 100644 (file)
 }
 
 .config-plainlink a {
-       background: none !important;
-       padding: 0 !important;
+       background: none !important; /* stylelint-disable-line declaration-no-important */
+       padding: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 .config-download-link {
index d6cb43f..ea97337 100644 (file)
@@ -251,7 +251,6 @@ return [
                'scripts' => 'resources/src/jquery/jquery.highlightText.js',
                'dependencies' => [
                        'mediawiki.RegExp',
-                       'dom-level2-shim',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -345,7 +344,6 @@ return [
                'styles' => 'resources/src/jquery/jquery.tablesorter.less',
                'messages' => [ 'sort-descending', 'sort-ascending' ],
                'dependencies' => [
-                       'dom-level2-shim',
                        'mediawiki.RegExp',
                        'mediawiki.language.months',
                ],
@@ -736,7 +734,7 @@ return [
 
        // Deprecated since MediaWiki 1.29.0
        'json' => [
-               'deprecated' => 'Use of the "json" MediaWiki module is deprecated since MediaWiki 1.29.0',
+               'deprecated' => 'Use of the "json" module is deprecated since MediaWiki 1.29.0',
                'targets' => [ 'desktop', 'mobile' ],
        ],
 
@@ -937,7 +935,6 @@ return [
        'mediawiki.api.upload' => [
                'scripts' => 'resources/src/mediawiki/api/upload.js',
                'dependencies' => [
-                       'dom-level2-shim',
                        'mediawiki.api',
                        'mediawiki.api.edit',
                ],
@@ -1220,7 +1217,6 @@ return [
        'mediawiki.Upload' => [
                'scripts' => 'resources/src/mediawiki/mediawiki.Upload.js',
                'dependencies' => [
-                       'dom-level2-shim',
                        'mediawiki.api.upload',
                ],
        ],
@@ -1612,7 +1608,6 @@ return [
                        'mediawiki.util',
                        'mediawiki.language',
                        'user.options',
-                       'dom-level2-shim',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -1751,6 +1746,11 @@ return [
 
        /* MediaWiki Special pages */
 
+       'mediawiki.rcfilters.filters.base.styles' => [
+               'styles' => [
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less',
+               ],
+       ],
        'mediawiki.rcfilters.filters.dm' => [
                'scripts' => [
                        'resources/src/mediawiki.rcfilters/mw.rcfilters.js',
@@ -1805,6 +1805,7 @@ return [
                        'rcfilters-invalid-filter',
                        'rcfilters-empty-filter',
                        'rcfilters-filterlist-title',
+                       'rcfilters-filterlist-feedbacklink',
                        'rcfilters-filterlist-noresults',
                        'rcfilters-filtergroup-registration',
                        'rcfilters-filter-registered-label',
@@ -1851,6 +1852,7 @@ return [
                        'mediawiki.rcfilters.filters.dm',
                        'oojs-ui.styles.icons-moderation',
                        'oojs-ui.styles.icons-editing-core',
+                       'oojs-ui.styles.icons-interactions',
                ],
        ],
        'mediawiki.special' => [
@@ -2483,11 +2485,10 @@ return [
        ],
 
        /* dom-level2-shim */
-       // IE 8
+       // Deprecated since MediaWiki 1.29.0
        'dom-level2-shim' => [
-               'scripts' => 'resources/src/polyfill-nodeTypes.js',
+               'deprecated' => 'Use of the "dom-level2-shim" module is deprecated since MediaWiki 1.29.0',
                'targets' => [ 'desktop', 'mobile' ],
-               'skipFunction' => 'resources/src/dom-level2-skip.js',
        ],
 
        /* OOjs */
index 8b85a20..a84374a 100644 (file)
@@ -12,5 +12,6 @@
        "ooui-dialog-process-retry": "ز نۉ تلاش کونين",
        "ooui-dialog-process-continue": "ديندا گرهڌن",
        "ooui-selectfile-button-select": "گولإڤورچين کردن جانیا",
-       "ooui-selectfile-placeholder": "هيژ جانيایي گولإ ڤورچين نڤابيڌإ"
+       "ooui-selectfile-placeholder": "هيژ جانيایي گولإ ڤورچين نڤابيڌإ",
+       "ooui-selectfile-dragdrop-placeholder": "جانيانأ ڤأنين ايچو"
 }
index 83af863..cbfcab0 100644 (file)
@@ -18,5 +18,9 @@
        "ooui-dialog-process-error": "Un dra bennak a-dreuz a zo bet",
        "ooui-dialog-process-dismiss": "Disteurel",
        "ooui-dialog-process-retry": "Klask en-dro",
-       "ooui-dialog-process-continue": "Kenderc'hel"
+       "ooui-dialog-process-continue": "Kenderc'hel",
+       "ooui-selectfile-button-select": "Diuzañ ur restr",
+       "ooui-selectfile-not-supported": "N'eo ket skoret an diuzañ restroù",
+       "ooui-selectfile-placeholder": "N'eus bet diuzet restr ebet",
+       "ooui-selectfile-dragdrop-placeholder": "Lezel ar restr amañ"
 }
index af97d17..722b3e2 100644 (file)
@@ -3,5 +3,21 @@
                "authors": [
                        "Jagwar"
                ]
-       }
+       },
+       "ooui-outline-control-move-down": "Hampidina ilay zavatra",
+       "ooui-outline-control-move-up": "Hampiakatra ilay zavatra",
+       "ooui-outline-control-remove": "Hanala iay zavatra",
+       "ooui-toolbar-more": "Be kokoa",
+       "ooui-toolgroup-expand": "Be kokoa",
+       "ooui-toolgroup-collapse": "Kely kokoa",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Avela",
+       "ooui-dialog-process-error": "Nisy hadisoana nitranga",
+       "ooui-dialog-process-dismiss": "Esorina",
+       "ooui-dialog-process-retry": "Andramana indray",
+       "ooui-dialog-process-continue": "Tohizana",
+       "ooui-selectfile-button-select": "Misafidia rakitra iray",
+       "ooui-selectfile-not-supported": "Tsy zaka ny fisafidiana rakitra",
+       "ooui-selectfile-placeholder": "Tsy misy rakitra voafidy",
+       "ooui-selectfile-dragdrop-placeholder": "Hametraka rakitra eto"
 }
index c8fba3d..e3f3e11 100644 (file)
@@ -7,7 +7,13 @@
        },
        "ooui-outline-control-move-down": "Flytt element ned",
        "ooui-outline-control-move-up": "Flytt element opp",
-       "ooui-toolbar-more": "Fleire",
+       "ooui-toolbar-more": "Meir",
+       "ooui-toolgroup-expand": "Meir",
+       "ooui-toolgroup-collapse": "Færre",
+       "ooui-dialog-message-reject": "Bryt av",
+       "ooui-dialog-process-error": "Noko gjekk gale",
+       "ooui-dialog-process-dismiss": "Lat att",
+       "ooui-dialog-process-continue": "Hald fram",
        "ooui-selectfile-button-select": "Vel ei fil",
        "ooui-selectfile-placeholder": "Inga fil er vald"
 }
index 8bd4be8..386871c 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Saanvel"
+                       "Saanvel",
+                       "Abbas dhothar"
                ]
        },
        "ooui-outline-control-move-down": "شیہ تھلے کرو",
@@ -9,6 +10,7 @@
        "ooui-outline-control-remove": "شیہ مٹاؤ",
        "ooui-toolbar-more": "ہور",
        "ooui-toolgroup-expand": "ہور",
+       "ooui-toolgroup-collapse": "گھٹ",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "مکاؤ",
        "ooui-dialog-process-error": "کوئی رپھڑ پے گیا اے۔",
index f206a72..84048e7 100644 (file)
@@ -18,6 +18,7 @@
        "ooui-dialog-process-dismiss": "צומאַכן",
        "ooui-dialog-process-retry": "פרובירט נאכאמאל",
        "ooui-dialog-process-continue": "פֿארזעצן",
+       "ooui-selectfile-button-select": "קלויבט א טעקע",
        "ooui-selectfile-not-supported": "טעקע אויסווייל נישט געשטיצט",
        "ooui-selectfile-placeholder": "קיין טעקע נישט אויסגעוויילט"
 }
index 2307413..541462f 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:20Z
+ * Date: 2017-02-28T23:19:40Z
  */
 ( function ( OO ) {
 
index 524c16b..0818782 100644 (file)
@@ -1,13 +1,15 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-02-28T23:19:44Z
  */
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
 .oo-ui-element-hidden {
   display: none !important;
   /* stylelint-disable-line declaration-no-important */
@@ -41,8 +43,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-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   display: inline-block;
   vertical-align: middle;
 }
@@ -67,7 +69,7 @@
 }
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
-  outline: none;
+  outline: 0;
 }
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-iconElement-icon {
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
   border-color: #aaa;
-  outline: none;
+  outline: 0;
 }
 .oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   margin-left: -0.5em;
   margin-right: -0.5em;
+  display: inline-block;
+  vertical-align: middle;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   margin-right: 0.3em;
@@ -472,7 +476,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: relative;
 }
 .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
+  overflow: auto;
   -webkit-transform: translateZ(0);
           transform: translateZ(0);
 }
@@ -650,7 +654,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-popupWidget {
   position: absolute;
-  left: 0;
 }
 .oo-ui-popupWidget-popup {
   position: relative;
@@ -665,7 +668,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: block;
   position: absolute;
   /* `top` property is to be set in theme's selector due to specific `@size-anchor` values */
-  left: 0;
   background-repeat: no-repeat;
 }
 .oo-ui-popupWidget-head {
@@ -807,7 +809,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover,
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:focus {
   border-color: rgba(0, 0, 0, 0.2);
-  outline: none;
+  outline: 0;
 }
 .oo-ui-dropdownInputWidget.oo-ui-widget-disabled select {
   color: #ccc;
@@ -929,14 +931,41 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   -webkit-transition: border-color 250ms ease, box-shadow 250ms ease;
      -moz-transition: border-color 250ms ease, box-shadow 250ms ease;
           transition: border-color 250ms ease, box-shadow 250ms ease;
+  /* stylelint-disable indentation */
+  /* stylelint-enable indentation */
 }
 .oo-ui-textInputWidget input.oo-ui-pendingElement-pending,
 .oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
   background-color: transparent;
 }
+.oo-ui-textInputWidget input::-webkit-input-placeholder,
+.oo-ui-textInputWidget textarea::-webkit-input-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-textInputWidget input:-ms-input-placeholder,
+.oo-ui-textInputWidget textarea:-ms-input-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-textInputWidget input::-moz-placeholder,
+.oo-ui-textInputWidget textarea::-moz-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-textInputWidget input:-moz-placeholder,
+.oo-ui-textInputWidget textarea:-moz-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-textInputWidget input::placeholder,
+.oo-ui-textInputWidget textarea::placeholder {
+  color: #72777d;
+  opacity: 1;
+}
 .oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
-  outline: none;
+  outline: 0;
   border-color: #a7dcff;
   box-shadow: 0 0 0.3em #a7dcff, 0 0 0 #fff;
 }
@@ -1058,9 +1087,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
      -moz-box-sizing: border-box;
           box-sizing: border-box;
 }
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon,
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
   position: absolute;
+  top: 0;
+  height: 100%;
 }
 .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
   cursor: pointer;
@@ -1076,20 +1107,18 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-dropdownWidget-handle:hover {
   border-color: rgba(0, 0, 0, 0.2);
 }
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
-  top: 0;
-  right: 0;
-  margin: 0.775em;
-}
 .oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-  top: 0;
   left: 0.25em;
-  margin: 0.3em;
+  margin: 0 0.3em;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
   line-height: 2.5em;
   margin: 0 0.5em;
 }
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
+  right: 0;
+  margin: 0 0.775em;
+}
 .oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
   color: #ccc;
   text-shadow: 0 1px 1px #fff;
index f3b3fce..f468d17 100644 (file)
@@ -1,13 +1,15 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-02-28T23:19:44Z
  */
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
 .oo-ui-element-hidden {
   display: none !important;
   /* stylelint-disable-line declaration-no-important */
@@ -41,8 +43,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-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   display: inline-block;
   vertical-align: middle;
 }
@@ -64,9 +66,6 @@
 .oo-ui-buttonElement > .oo-ui-buttonElement-button:focus::-moz-focus-inner {
   border-color: transparent;
 }
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-left: 0;
-}
 .oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
   margin-right: 0.25em;
   margin-left: 0.46875em;
   padding-left: 2.4em;
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-  padding: 0.546875em 1em;
+  position: relative;
   min-height: 2.5em;
-  min-width: 3.125em;
   border-radius: 2px;
-  position: relative;
+  padding: 0.546875em 1em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button {
+  min-width: 3.125em;
+}
+.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
+  min-width: 0;
 }
 .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.25;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: block;
   position: absolute;
-  top: 0.2em;
+  top: 0;
+  height: 100%;
   left: 0.5625em;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
@@ -613,7 +620,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: relative;
 }
 .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
+  overflow: auto;
   -webkit-transform: translateZ(0);
           transform: translateZ(0);
 }
@@ -654,7 +661,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-right: 0;
 }
 .oo-ui-horizontalLayout > .oo-ui-layout {
-  margin-bottom: 0;
+  margin-top: 0;
 }
 .oo-ui-optionWidget {
   position: relative;
@@ -806,7 +813,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-popupWidget {
   position: absolute;
-  left: 0;
 }
 .oo-ui-popupWidget-popup {
   position: relative;
@@ -821,7 +827,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: block;
   position: absolute;
   /* `top` property is to be set in theme's selector due to specific `@size-anchor` values */
-  left: 0;
   background-repeat: no-repeat;
 }
 .oo-ui-popupWidget-head {
@@ -1044,17 +1049,23 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
      -moz-box-sizing: border-box;
           box-sizing: border-box;
 }
+.oo-ui-dropdownInputWidget-php {
+  border-right: 1px solid #a2a9b1;
+  border-radius: 2px;
+  overflow-x: hidden;
+}
 .oo-ui-dropdownInputWidget select {
-  background-color: #fff;
-  height: 2.275em;
-  font-size: inherit;
-  font-family: inherit;
+  -webkit-appearance: none;
+     -moz-appearance: none;
+          appearance: none;
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
-  padding-left: 1em;
+  padding: 0.5em 1em;
+  font-size: inherit;
+  font-family: inherit;
   vertical-align: middle;
 }
 .oo-ui-dropdownInputWidget option {
@@ -1063,14 +1074,42 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   height: 1.5em;
   padding: 0.5em 1em;
 }
-.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover,
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select {
+  background-color: #f8f9fa;
+  background-position: -9999em 0;
+  background-repeat: no-repeat;
+  color: #222;
+  -webkit-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
+     -moz-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
+          transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover {
+  background-color: #fff;
+  color: #444;
+  border-color: #a2a9b1;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:active {
+  color: #000;
+  border-color: #72777d;
+}
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:focus {
+  border-color: #36c;
   outline: 0;
+  box-shadow: inset 0 0 0 1px #36c;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select::-ms-expand {
+  display: none;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:not( [no-ie] ) {
+  background-position: right 1.75em center;
+  width: calc( 100% + 1em );
+  height: 2.5em;
+  padding: 0 0 0 1em;
 }
 .oo-ui-dropdownInputWidget.oo-ui-widget-disabled select {
+  background-color: #eaecf0;
   color: #72777d;
   border-color: #c8ccd1;
-  background-color: #eaecf0;
 }
 .oo-ui-radioInputWidget {
   position: relative;
@@ -1304,6 +1343,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   -webkit-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
      -moz-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
           transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+  /* stylelint-disable indentation */
+  /* stylelint-enable indentation */
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input:hover,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:hover {
@@ -1328,28 +1369,36 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-color: #c8ccd1;
   box-shadow: inset 0 0 0 1px #c8ccd1;
 }
-@media screen and (min-width: 0) {
-  .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
-    outline: 1px solid #36c;
-    outline-offset: -2px;
-  }
-}
-.oo-ui-textInputWidget.oo-ui-widget-enabled :-moz-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input::-webkit-input-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea::-webkit-input-placeholder {
   color: #72777d;
   opacity: 1;
 }
-.oo-ui-textInputWidget.oo-ui-widget-enabled ::-moz-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:-ms-input-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:-ms-input-placeholder {
   color: #72777d;
   opacity: 1;
 }
-.oo-ui-textInputWidget.oo-ui-widget-enabled :-ms-input-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input::-moz-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea::-moz-placeholder {
   color: #72777d;
+  opacity: 1;
 }
-.oo-ui-textInputWidget.oo-ui-widget-enabled ::-webkit-input-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:-moz-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:-moz-placeholder {
   color: #72777d;
+  opacity: 1;
 }
-.oo-ui-textInputWidget.oo-ui-widget-enabled :placeholder-shown {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input::placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea::placeholder {
   color: #72777d;
+  opacity: 1;
+}
+@media screen and (min-width: 0) {
+  .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
+    outline: 1px solid #36c;
+    outline-offset: -2px;
+  }
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input,
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea {
@@ -1385,7 +1434,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
   left: 0;
-  height: 100%;
   max-height: 2.375em;
   margin-left: 0.5em;
   background-position: right center;
@@ -1401,8 +1449,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-textInputWidget > .oo-ui-labelElement-label {
   color: #72777d;
-  padding: 0.4em;
-  line-height: 1.5;
+  margin-top: 1px;
+  padding: 0.625em 0.546875em 0.546875em;
+  line-height: 1.172em;
 }
 .oo-ui-textInputWidget-labelPosition-after.oo-ui-indicatorElement > .oo-ui-labelElement-label {
   margin-right: 2.0875em;
@@ -1490,9 +1539,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
      -moz-box-sizing: border-box;
           box-sizing: border-box;
 }
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon,
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
   position: absolute;
+  top: 0;
+  height: 100%;
 }
 .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
   cursor: pointer;
@@ -1508,14 +1559,12 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-radius: 2px;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
-  top: 0;
   right: 0;
-  margin: 0.775em;
+  margin: 0 0.775em;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-  top: 0;
   left: 0.25em;
-  margin: 0.3em;
+  margin: 0 0.3em;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
   margin: 0 1em;
@@ -1614,8 +1663,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-comboBoxInputWidget-php > .oo-ui-indicatorElement-indicator {
   pointer-events: none;
 }
-.oo-ui-comboBoxInputWidget input,
-.oo-ui-comboBoxInputWidget textarea {
+.oo-ui-comboBoxInputWidget input {
   height: 2.5em;
   border-top-right-radius: 0;
   border-bottom-right-radius: 0;
@@ -1635,8 +1683,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-top-left-radius: 0;
   border-bottom-left-radius: 0;
 }
-.oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty input,
-.oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty textarea {
+.oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty input {
   border-right-width: 1px;
 }
 .oo-ui-comboBoxInputWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
index e327e5f..9eb8716 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:20Z
+ * Date: 2017-02-28T23:19:40Z
  */
 ( function ( OO ) {
 
@@ -1072,6 +1072,73 @@ OO.ui.Element.static.getDimensions = function ( el ) {
        }
 };
 
+/**
+ * Get the number of pixels that an element's content is scrolled to the left.
+ *
+ * Adapted from <https://github.com/othree/jquery.rtl-scroll-type>.
+ * Original code copyright 2012 Wei-Ko Kao, licensed under the MIT License.
+ *
+ * This function smooths out browser inconsistencies (nicely described in the README at
+ * <https://github.com/othree/jquery.rtl-scroll-type>) and produces a result consistent
+ * with Firefox's 'scrollLeft', which seems the sanest.
+ *
+ * @static
+ * @method
+ * @param {HTMLElement|Window} el Element to measure
+ * @return {number} Scroll position from the left.
+ *  If the element's direction is LTR, this is a positive number between `0` (initial scroll position)
+ *  and `el.scrollWidth - el.clientWidth` (furthest possible scroll position).
+ *  If the element's direction is RTL, this is a negative number between `0` (initial scroll position)
+ *  and `-el.scrollWidth + el.clientWidth` (furthest possible scroll position).
+ */
+OO.ui.Element.static.getScrollLeft = ( function () {
+       var rtlScrollType = null;
+
+       function test() {
+               var $definer = $( '<div dir="rtl" style="font-size: 14px; width: 1px; height: 1px; position: absolute; top: -1000px; overflow: scroll">A</div>' ),
+                       definer = $definer[ 0 ];
+
+               $definer.appendTo( 'body' );
+               if ( definer.scrollLeft > 0 ) {
+                       // Safari, Chrome
+                       rtlScrollType = 'default';
+               } else {
+                       definer.scrollLeft = 1;
+                       if ( definer.scrollLeft === 0 ) {
+                               // Firefox, old Opera
+                               rtlScrollType = 'negative';
+                       } else {
+                               // Internet Explorer, Edge
+                               rtlScrollType = 'reverse';
+                       }
+               }
+               $definer.remove();
+       }
+
+       return function getScrollLeft( el ) {
+               var isRoot = el.window === el ||
+                               el === el.ownerDocument.body ||
+                               el === el.ownerDocument.documentElement,
+                       scrollLeft = isRoot ? $( window ).scrollLeft() : el.scrollLeft,
+                       // All browsers use the correct scroll type ('negative') on the root, so don't
+                       // do any fixups when looking at the root element
+                       direction = isRoot ? 'ltr' : $( el ).css( 'direction' );
+
+               if ( direction === 'rtl' ) {
+                       if ( rtlScrollType === null ) {
+                               test();
+                       }
+                       if ( rtlScrollType === 'reverse' ) {
+                               scrollLeft = -scrollLeft;
+                       } else if ( rtlScrollType === 'default' ) {
+                               scrollLeft = scrollLeft - el.scrollWidth + el.clientWidth;
+                       }
+               }
+
+               return scrollLeft;
+       };
+}() );
+
 /**
  * Get scrollable object parent
  *
@@ -1117,7 +1184,8 @@ OO.ui.Element.static.getRootScrollableElement = function ( el ) {
  */
 OO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension ) {
        var i, val,
-               // props = [ 'overflow' ] doesn't work due to https://bugzilla.mozilla.org/show_bug.cgi?id=889091
+               // Browsers do not correctly return the computed value of 'overflow' when 'overflow-x' and
+               // 'overflow-y' have different values, so we need to check the separate properties.
                props = [ 'overflow-x', 'overflow-y' ],
                $parent = $( el ).parent();
 
@@ -1132,6 +1200,11 @@ OO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension )
                i = props.length;
                while ( i-- ) {
                        val = $parent.css( props[ i ] );
+                       // We assume that elements with 'overflow' (in any direction) set to 'hidden' will never be
+                       // scrolled in that direction, but they can actually be scrolled programatically. The user can
+                       // unintentionally perform a scroll in such case even if the application doesn't scroll
+                       // programatically, e.g. when jumping to an anchor, or when using built-in find functionality.
+                       // This could cause funny issues...
                        if ( val === 'auto' || val === 'scroll' ) {
                                return $parent[ 0 ];
                        }
@@ -3818,6 +3891,11 @@ OO.ui.LabelWidget = function OoUiLabelWidget( config ) {
        if ( this.input instanceof OO.ui.InputWidget ) {
                if ( this.input.getInputId() ) {
                        this.$element.attr( 'for', this.input.getInputId() );
+               } else {
+                       this.$label.on( 'click', function () {
+                               this.fieldWidget.focus();
+                               return false;
+                       }.bind( this ) );
                }
        }
        this.$element.addClass( 'oo-ui-labelWidget' );
@@ -3971,8 +4049,8 @@ OO.ui.mixin.PendingElement.prototype.popPending = function () {
 };
 
 /**
- * Element that will stick under a specified container, even when it is inserted elsewhere in the
- * document (for example, in a OO.ui.Window's $overlay).
+ * Element that will stick adjacent to a specified container, even when it is inserted elsewhere
+ * in the document (for example, in an OO.ui.Window's $overlay).
  *
  * The elements's position is automatically calculated and maintained when window is resized or the
  * page is scrolled. If you reposition the container manually, you have to call #position to make
@@ -3988,7 +4066,19 @@ OO.ui.mixin.PendingElement.prototype.popPending = function () {
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {jQuery} [$floatable] Node to position, assigned to #$floatable, omit to use #$element
- * @cfg {jQuery} [$floatableContainer] Node to position below
+ * @cfg {jQuery} [$floatableContainer] Node to position adjacent to
+ * @cfg {string} [verticalPosition='below'] Where to position $floatable vertically:
+ *  'below': Directly below $floatableContainer, aligning f's top edge with fC's bottom edge
+ *  'above': Directly above $floatableContainer, aligning f's bottom edge with fC's top edge
+ *  'top': Align the top edge with $floatableContainer's top edge
+ *  'bottom': Align the bottom edge with $floatableContainer's bottom edge
+ *  'center': Vertically align the center with $floatableContainer's center
+ * @cfg {string} [horizontalPosition='start'] Where to position $floatable horizontally:
+ *  'before': Directly before $floatableContainer, aligning f's end edge with fC's start edge
+ *  'after': Directly after $floatableContainer, algining f's start edge with fC's end edge
+ *  'start': Align the start (left in LTR, right in RTL) edge with $floatableContainer's start edge
+ *  'end': Align the end (right in LTR, left in RTL) edge with $floatableContainer's end edge
+ *  'center': Horizontally align the center with $floatableContainer's center
  */
 OO.ui.mixin.FloatableElement = function OoUiMixinFloatableElement( config ) {
        // Configuration initialization
@@ -4005,6 +4095,8 @@ OO.ui.mixin.FloatableElement = function OoUiMixinFloatableElement( config ) {
        // Initialization
        this.setFloatableContainer( config.$floatableContainer );
        this.setFloatableElement( config.$floatable || this.$element );
+       this.setVerticalPosition( config.verticalPosition || 'below' );
+       this.setHorizontalPosition( config.horizontalPosition || 'start' );
 };
 
 /* Methods */
@@ -4029,7 +4121,7 @@ OO.ui.mixin.FloatableElement.prototype.setFloatableElement = function ( $floatab
 /**
  * Set floatable container.
  *
- * The element will be always positioned under the specified container.
+ * The element will be positioned relative to the specified container.
  *
  * @param {jQuery|null} $floatableContainer Container to keep visible, or null to unset
  */
@@ -4040,6 +4132,36 @@ OO.ui.mixin.FloatableElement.prototype.setFloatableContainer = function ( $float
        }
 };
 
+/**
+ * Change how the element is positioned vertically.
+ *
+ * @param {string} position 'below', 'above', 'top', 'bottom' or 'center'
+ */
+OO.ui.mixin.FloatableElement.prototype.setVerticalPosition = function ( position ) {
+       if ( [ 'below', 'above', 'top', 'bottom', 'center' ].indexOf( position ) === -1 ) {
+               throw new Error( 'Invalid value for vertical position: ' + position );
+       }
+       this.verticalPosition = position;
+       if ( this.$floatable ) {
+               this.position();
+       }
+};
+
+/**
+ * Change how the element is positioned horizontally.
+ *
+ * @param {string} position 'before', 'after', 'start', 'end' or 'center'
+ */
+OO.ui.mixin.FloatableElement.prototype.setHorizontalPosition = function ( position ) {
+       if ( [ 'before', 'after', 'start', 'end', 'center' ].indexOf( position ) === -1 ) {
+               throw new Error( 'Invalid value for horizontal position: ' + position );
+       }
+       this.horizontalPosition = position;
+       if ( this.$floatable ) {
+               this.position();
+       }
+};
+
 /**
  * Toggle positioning.
  *
@@ -4057,11 +4179,20 @@ OO.ui.mixin.FloatableElement.prototype.togglePositioning = function ( positionin
 
        positioning = positioning === undefined ? !this.positioning : !!positioning;
 
+       if ( positioning && !this.warnedUnattached && !this.isElementAttached() ) {
+               OO.ui.warnDeprecation( 'FloatableElement#togglePositioning: Before calling this method, the element must be attached to the DOM.' );
+               this.warnedUnattached = true;
+       }
+
        if ( this.positioning !== positioning ) {
                this.positioning = positioning;
 
+               this.needsCustomPosition =
+                       this.verticalPostion !== 'below' ||
+                       this.horizontalPosition !== 'start' ||
+                       !OO.ui.contains( this.$floatableContainer[ 0 ], this.$floatable[ 0 ] );
+
                closestScrollableOfContainer = OO.ui.Element.static.getClosestScrollableContainer( this.$floatableContainer[ 0 ] );
-               this.needsCustomPosition = !OO.ui.contains( this.$floatableContainer[ 0 ], this.$floatable[ 0 ] );
                // If the scrollable is the root, we have to listen to scroll events
                // on the window because of browser inconsistencies.
                if ( $( closestScrollableOfContainer ).is( 'html, body' ) ) {
@@ -4104,10 +4235,9 @@ OO.ui.mixin.FloatableElement.prototype.togglePositioning = function ( positionin
  * @return {boolean}
  */
 OO.ui.mixin.FloatableElement.prototype.isElementInViewport = function ( $element, $container ) {
-       var elemRect, contRect,
-               leftEdgeInBounds = false,
-               bottomEdgeInBounds = false,
-               rightEdgeInBounds = false;
+       var elemRect, contRect, topEdgeInBounds, bottomEdgeInBounds, leftEdgeInBounds, rightEdgeInBounds,
+               startEdgeInBounds, endEdgeInBounds,
+               direction = $element.css( 'direction' );
 
        elemRect = $element[ 0 ].getBoundingClientRect();
        if ( $container[ 0 ] === window ) {
@@ -4121,20 +4251,35 @@ OO.ui.mixin.FloatableElement.prototype.isElementInViewport = function ( $element
                contRect = $container[ 0 ].getBoundingClientRect();
        }
 
-       // For completeness, if we still cared about topEdgeInBounds, that'd be:
-       // elemRect.top >= contRect.top && elemRect.top <= contRect.bottom
-       if ( elemRect.left >= contRect.left && elemRect.left <= contRect.right ) {
-               leftEdgeInBounds = true;
+       topEdgeInBounds = elemRect.top >= contRect.top && elemRect.top <= contRect.bottom;
+       bottomEdgeInBounds = elemRect.bottom >= contRect.top && elemRect.bottom <= contRect.bottom;
+       leftEdgeInBounds = elemRect.left >= contRect.left && elemRect.left <= contRect.right;
+       rightEdgeInBounds = elemRect.right >= contRect.left && elemRect.right <= contRect.right;
+       if ( direction === 'rtl' ) {
+               startEdgeInBounds = rightEdgeInBounds;
+               endEdgeInBounds = leftEdgeInBounds;
+       } else {
+               startEdgeInBounds = leftEdgeInBounds;
+               endEdgeInBounds = rightEdgeInBounds;
        }
-       if ( elemRect.bottom >= contRect.top && elemRect.bottom <= contRect.bottom ) {
-               bottomEdgeInBounds = true;
+
+       if ( this.verticalPosition === 'below' && !bottomEdgeInBounds ) {
+               return false;
        }
-       if ( elemRect.right >= contRect.left && elemRect.right <= contRect.right ) {
-               rightEdgeInBounds = true;
+       if ( this.verticalPosition === 'above' && !topEdgeInBounds ) {
+               return false;
+       }
+       if ( this.horizontalPosition === 'before' && !startEdgeInBounds ) {
+               return false;
+       }
+       if ( this.horizontalPosition === 'after' && !endEdgeInBounds ) {
+               return false;
        }
 
-       // We only care that any part of the bottom edge is visible
-       return bottomEdgeInBounds && ( leftEdgeInBounds || rightEdgeInBounds );
+       // The other positioning values are all about being inside the container,
+       // so in those cases all we care about is that any part of the container is visible.
+       return elemRect.top <= contRect.bottom && elemRect.bottom >= contRect.top &&
+               elemRect.left <= contRect.right && elemRect.right >= contRect.left;
 };
 
 /**
@@ -4145,7 +4290,9 @@ OO.ui.mixin.FloatableElement.prototype.isElementInViewport = function ( $element
  * @chainable
  */
 OO.ui.mixin.FloatableElement.prototype.position = function () {
-       var pos;
+       var containerPos, direction, $offsetParent, isBody, scrollableX, scrollableY,
+               horizScrollbarHeight, vertScrollbarWidth, scrollTop, scrollLeft,
+               newPos = { top: '', left: '', bottom: '', right: '' };
 
        if ( !this.positioning ) {
                return this;
@@ -4162,16 +4309,106 @@ OO.ui.mixin.FloatableElement.prototype.position = function () {
                return;
        }
 
-       pos = OO.ui.Element.static.getRelativePosition( this.$floatableContainer, this.$floatable.offsetParent() );
-       // Position under container
-       pos.top += this.$floatableContainer.height();
-       // In LTR, we position from the left, and pos.left is already set
-       // In RTL, we position from the right instead.
-       if ( this.$floatableContainer.css( 'direction' ) === 'rtl' ) {
-               pos.right = this.$floatable.offsetParent().width() - pos.left - this.$floatableContainer.outerWidth();
-               delete pos.left;
+       direction = this.$floatableContainer.css( 'direction' );
+       $offsetParent = this.$floatable.offsetParent();
+       if ( $offsetParent.is( 'html' ) ) {
+               // The innerHeight/Width and clientHeight/Width calculations don't work well on the
+               // <html> element, but they do work on the <body>
+               $offsetParent = $( $offsetParent[ 0 ].ownerDocument.body );
+       }
+       isBody = $offsetParent.is( 'body' );
+       scrollableX = $offsetParent.css( 'overflow-x' ) === 'scroll' || $offsetParent.css( 'overflow-x' ) === 'auto';
+       scrollableY = $offsetParent.css( 'overflow-y' ) === 'scroll' || $offsetParent.css( 'overflow-y' ) === 'auto';
+
+       vertScrollbarWidth = $offsetParent.innerWidth() - $offsetParent.prop( 'clientWidth' );
+       horizScrollbarHeight = $offsetParent.innerHeight() - $offsetParent.prop( 'clientHeight' );
+       // We don't need to compute and add scrollTop and scrollLeft if the scrollable container is the body,
+       // or if it isn't scrollable
+       scrollTop = scrollableY && !isBody ? $offsetParent.scrollTop() : 0;
+       scrollLeft = scrollableX && !isBody ? OO.ui.Element.static.getScrollLeft( $offsetParent[ 0 ] ) : 0;
+
+       // Avoid passing the <body> to getRelativePosition(), because it won't return what we expect
+       // if the <body> has a margin
+       containerPos = isBody ?
+               this.$floatableContainer.offset() :
+               OO.ui.Element.static.getRelativePosition( this.$floatableContainer, $offsetParent );
+       containerPos.bottom = containerPos.top + this.$floatableContainer.outerHeight();
+       containerPos.right = containerPos.left + this.$floatableContainer.outerWidth();
+       containerPos.start = direction === 'rtl' ? containerPos.right : containerPos.left;
+       containerPos.end = direction === 'rtl' ? containerPos.left : containerPos.right;
+
+       if ( this.verticalPosition === 'below' ) {
+               newPos.top = containerPos.bottom;
+       } else if ( this.verticalPosition === 'above' ) {
+               newPos.bottom = $offsetParent.outerHeight() - containerPos.top;
+       } else if ( this.verticalPosition === 'top' ) {
+               newPos.top = containerPos.top;
+       } else if ( this.verticalPosition === 'bottom' ) {
+               newPos.bottom = $offsetParent.outerHeight() - containerPos.bottom;
+       } else if ( this.verticalPosition === 'center' ) {
+               newPos.top = containerPos.top +
+                       ( this.$floatableContainer.height() - this.$floatable.height() ) / 2;
+       }
+
+       if ( this.horizontalPosition === 'before' ) {
+               newPos.end = containerPos.start;
+       } else if ( this.horizontalPosition === 'after' ) {
+               newPos.start = containerPos.end;
+       } else if ( this.horizontalPosition === 'start' ) {
+               newPos.start = containerPos.start;
+       } else if ( this.horizontalPosition === 'end' ) {
+               newPos.end = containerPos.end;
+       } else if ( this.horizontalPosition === 'center' ) {
+               newPos.left = containerPos.left +
+                       ( this.$floatableContainer.width() - this.$floatable.width() ) / 2;
+       }
+
+       if ( newPos.start !== undefined ) {
+               if ( direction === 'rtl' ) {
+                       newPos.right = ( isBody ? $( $offsetParent[ 0 ].ownerDocument.documentElement ) : $offsetParent ).outerWidth() - newPos.start;
+               } else {
+                       newPos.left = newPos.start;
+               }
+               delete newPos.start;
+       }
+       if ( newPos.end !== undefined ) {
+               if ( direction === 'rtl' ) {
+                       newPos.left = newPos.end;
+               } else {
+                       newPos.right = ( isBody ? $( $offsetParent[ 0 ].ownerDocument.documentElement ) : $offsetParent ).outerWidth() - newPos.end;
+               }
+               delete newPos.end;
+       }
+
+       // Account for scroll position
+       if ( newPos.top !== '' ) {
+               newPos.top += scrollTop;
+       }
+       if ( newPos.bottom !== '' ) {
+               newPos.bottom -= scrollTop;
+       }
+       if ( newPos.left !== '' ) {
+               newPos.left += scrollLeft;
+       }
+       if ( newPos.right !== '' ) {
+               newPos.right -= scrollLeft;
        }
-       this.$floatable.css( pos );
+
+       // Account for scrollbar gutter
+       if ( newPos.bottom !== '' ) {
+               newPos.bottom -= horizScrollbarHeight;
+       }
+       if ( direction === 'rtl' ) {
+               if ( newPos.left !== '' ) {
+                       newPos.left -= vertScrollbarWidth;
+               }
+       } else {
+               if ( newPos.right !== '' ) {
+                       newPos.right -= vertScrollbarWidth;
+               }
+       }
+
+       this.$floatable.css( newPos );
 
        // We updated the position, so re-evaluate the clipping state.
        // (ClippableElement does not listen to 'scroll' events on $floatableContainer's parent, and so
@@ -4281,6 +4518,11 @@ OO.ui.mixin.ClippableElement.prototype.setClippableContainer = function ( $clipp
 OO.ui.mixin.ClippableElement.prototype.toggleClipping = function ( clipping ) {
        clipping = clipping === undefined ? !this.clipping : !!clipping;
 
+       if ( clipping && !this.warnedUnattached && !this.isElementAttached() ) {
+               OO.ui.warnDeprecation( 'ClippableElement#toggleClipping: Before calling this method, the element must be attached to the DOM.' );
+               this.warnedUnattached = true;
+       }
+
        if ( this.clipping !== clipping ) {
                this.clipping = clipping;
                if ( clipping ) {
@@ -4476,6 +4718,8 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
  * By default, each popup has an anchor that points toward its origin.
  * Please see the [OOjs UI documentation on Mediawiki] [1] for more information and examples.
  *
+ * Unlike most widgets, PopupWidget is initially hidden and must be shown by calling #toggle.
+ *
  *     @example
  *     // A popup widget.
  *     var popup = new OO.ui.PopupWidget( {
@@ -4717,6 +4961,14 @@ OO.ui.PopupWidget.prototype.hasAnchor = function () {
 };
 
 /**
+ * Toggle visibility of the popup. The popup is initially hidden and must be shown by calling
+ * `.toggle( true )` after its #$element is attached to the DOM.
+ *
+ * Do not show the popup while it is not attached to the DOM. The calculations required to display
+ * it in the right place and with the right dimensions only work correctly while it is attached.
+ * Side-effects may include broken interface and exceptions being thrown. This wasn't always
+ * strictly enforced, so currently it only generates a warning in the browser console.
+ *
  * @inheritdoc
  */
 OO.ui.PopupWidget.prototype.toggle = function ( show ) {
@@ -4725,6 +4977,11 @@ OO.ui.PopupWidget.prototype.toggle = function ( show ) {
 
        change = show !== this.isVisible();
 
+       if ( show && !this.warnedUnattached && !this.isElementAttached() ) {
+               OO.ui.warnDeprecation( 'PopupWidget#toggle: Before calling this method, the popup must be attached to the DOM.' );
+               this.warnedUnattached = true;
+       }
+
        // Parent method
        OO.ui.PopupWidget.parent.prototype.toggle.call( this, show );
 
@@ -6362,6 +6619,8 @@ OO.ui.MenuSectionOptionWidget.static.highlightable = false;
  * - Down-arrow key: highlight the next menu option
  * - Esc key: hide the menu
  *
+ * Unlike most widgets, MenuSelectWidget is initially hidden and must be shown by calling #toggle.
+ *
  * Please see the [OOjs UI documentation on MediaWiki][1] for more information.
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options
  *
@@ -6381,6 +6640,7 @@ OO.ui.MenuSectionOptionWidget.static.highlightable = false;
  *  that toggles the menu's visibility on click, the menu will be hidden then re-shown when the user clicks
  *  that button, unless the button (or its parent widget) is passed in here.
  * @cfg {boolean} [autoHide=true] Hide the menu when the mouse is pressed outside the menu.
+ * @cfg {boolean} [hideOnChoose=true] Hide the menu when the user chooses an option.
  * @cfg {boolean} [filterFromInput=false] Filter the displayed options from the input
  */
 OO.ui.MenuSelectWidget = function OoUiMenuSelectWidget( config ) {
@@ -6395,6 +6655,7 @@ OO.ui.MenuSelectWidget = function OoUiMenuSelectWidget( config ) {
 
        // Properties
        this.autoHide = config.autoHide === undefined || !!config.autoHide;
+       this.hideOnChoose = config.hideOnChoose === undefined || !!config.hideOnChoose;
        this.filterFromInput = !!config.filterFromInput;
        this.$input = config.$input ? config.$input : config.input ? config.input.$input : null;
        this.$widget = config.widget ? config.widget.$element : null;
@@ -6548,7 +6809,7 @@ OO.ui.MenuSelectWidget.prototype.unbindKeyPressListener = function () {
 /**
  * Choose an item.
  *
- * When a user chooses an item, the menu is closed.
+ * When a user chooses an item, the menu is closed, unless the hideOnChoose config option is set to false.
  *
  * Note that ‘choose’ should never be modified programmatically. A user can choose an option with the keyboard
  * or mouse and it becomes selected. To select an item programmatically, use the #selectItem method.
@@ -6558,7 +6819,9 @@ OO.ui.MenuSelectWidget.prototype.unbindKeyPressListener = function () {
  */
 OO.ui.MenuSelectWidget.prototype.chooseItem = function ( item ) {
        OO.ui.MenuSelectWidget.parent.prototype.chooseItem.call( this, item );
-       this.toggle( false );
+       if ( this.hideOnChoose ) {
+               this.toggle( false );
+       }
        return this;
 };
 
@@ -6602,6 +6865,14 @@ OO.ui.MenuSelectWidget.prototype.clearItems = function () {
 };
 
 /**
+ * Toggle visibility of the menu. The menu is initially hidden and must be shown by calling
+ * `.toggle( true )` after its #$element is attached to the DOM.
+ *
+ * Do not show the menu while it is not attached to the DOM. The calculations required to display
+ * it in the right place and with the right dimensions only work correctly while it is attached.
+ * Side-effects may include broken interface and exceptions being thrown. This wasn't always
+ * strictly enforced, so currently it only generates a warning in the browser console.
+ *
  * @inheritdoc
  */
 OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
@@ -6610,6 +6881,11 @@ OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
        visible = ( visible === undefined ? !this.visible : !!visible ) && !!this.items.length;
        change = visible !== this.isVisible();
 
+       if ( visible && !this.warnedUnattached && !this.isElementAttached() ) {
+               OO.ui.warnDeprecation( 'MenuSelectWidget#toggle: Before calling this method, the menu must be attached to the DOM.' );
+               this.warnedUnattached = true;
+       }
+
        // Parent method
        OO.ui.MenuSelectWidget.parent.prototype.toggle.call( this, visible );
 
@@ -10077,6 +10353,7 @@ OO.ui.ComboBoxInputWidget.prototype.setOptions = function ( options ) {
  * @cfg {string|OO.ui.HtmlSnippet} [help] Help text. When help text is specified, a "help" icon will appear
  *  in the upper-right corner of the rendered field; clicking it will display the text in a popup.
  *  For important messages, you are advised to use `notices`, as they are always shown.
+ * @cfg {jQuery} [$overlay] Passed to OO.ui.PopupButtonWidget for help popup, if `help` is given.
  *
  * @throws {Error} An error is thrown if no widget is specified
  */
@@ -10115,6 +10392,7 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
        this.align = null;
        if ( config.help ) {
                this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
+                       $overlay: config.$overlay,
                        popup: {
                                padded: true
                        },
@@ -10139,6 +10417,11 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
        if ( fieldWidget.constructor.static.supportsSimpleLabel ) {
                if ( this.fieldWidget.getInputId() ) {
                        this.$label.attr( 'for', this.fieldWidget.getInputId() );
+               } else {
+                       this.$label.on( 'click', function () {
+                               this.fieldWidget.focus();
+                               return false;
+                       }.bind( this ) );
                }
        }
        this.$element
@@ -10419,6 +10702,7 @@ OO.inheritClass( OO.ui.ActionFieldLayout, OO.ui.FieldLayout );
  * @cfg {string|OO.ui.HtmlSnippet} [help] Help text. When help text is specified, a "help" icon will appear
  *  in the upper-right corner of the rendered field; clicking it will display the text in a popup.
  *  For important messages, you are advised to use `notices`, as they are always shown.
+ * @cfg {jQuery} [$overlay] Passed to OO.ui.PopupButtonWidget for help popup, if `help` is given.
  */
 OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
        // Configuration initialization
@@ -10436,6 +10720,7 @@ OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
        this.$header = $( '<div>' );
        if ( config.help ) {
                this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
+                       $overlay: config.$overlay,
                        popup: {
                                padded: true
                        },
index 3989caa..b39010c 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:20Z
+ * Date: 2017-02-28T23:19:40Z
  */
 ( function ( OO ) {
 
index b154288..4d7f9d7 100644 (file)
@@ -1,13 +1,15 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-02-28T23:19:44Z
  */
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
   z-index: 4;
index 5d313ab..59de29b 100644 (file)
@@ -1,13 +1,15 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-02-28T23:19:44Z
  */
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
 .oo-ui-tool.oo-ui-widget-enabled {
   -webkit-transition: background-color 100ms;
      -moz-transition: background-color 100ms;
@@ -37,9 +39,6 @@
   height: 2.5em;
   width: 1.875em;
 }
-.oo-ui-toolGroupTool > .oo-ui-popupToolGroup.oo-ui-labelElement > .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  line-height: 2.1;
-}
 .oo-ui-toolGroup {
   display: inline-block;
   vertical-align: middle;
   width: 1.875em;
   min-width: 1.875em;
 }
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title,
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel {
-  line-height: 2;
-}
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
   padding-left: 0.5em;
   color: #222;
index e89a734..777debf 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:20Z
+ * Date: 2017-02-28T23:19:40Z
  */
 ( function ( OO ) {
 
index b8445e9..a1064bb 100644 (file)
@@ -1,13 +1,15 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-02-28T23:19:44Z
  */
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
   cursor: move;
@@ -33,7 +35,7 @@
   display: inline-block;
 }
 .oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous > .oo-ui-panelLayout-scrollable {
-  overflow-y: hidden;
+  overflow: hidden;
 }
 .oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout {
   width: 100%;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
 }
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-padded {
-  padding: 2em;
-}
 .oo-ui-bookletLayout-outlinePanel-editable > .oo-ui-outlineSelectWidget {
   position: absolute;
   top: 0;
   left: 0;
   right: 0;
   bottom: 3em;
-  overflow-y: auto;
+  overflow: auto;
 }
 .oo-ui-bookletLayout-outlinePanel > .oo-ui-outlineControlsWidget {
   position: absolute;
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
   position: absolute;
+  top: 0;
+  height: 100%;
 }
 .oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
   cursor: default;
   border-width: 1px 0 1px 1px;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
-  top: 0;
   left: 0;
-  height: 2.3em;
   margin-left: 0.3em;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
-  top: 0;
   right: 0;
-  height: 2.3em;
   margin-right: 0.775em;
 }
 .oo-ui-selectFileWidget-label {
   background-color: #a7dcff;
   text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
 }
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
-  font-weight: bold;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
-  opacity: 0.5;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
-  color: #777;
-}
 .oo-ui-outlineControlsWidget {
   height: 3em;
   background-color: #fff;
   display: block;
   position: relative;
 }
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon,
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+}
 .oo-ui-capsuleMultiselectWidget-content {
   position: relative;
 }
 .oo-ui-capsuleMultiselectWidget-handle:last-child {
   margin-right: 0;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator,
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
-  position: absolute;
-}
 .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input {
   border: 0;
   line-height: 1.675em;
   background-color: transparent;
   color: #000;
   vertical-align: middle;
+  /* stylelint-disable indentation */
+  /* stylelint-enable indentation */
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:focus {
-  outline: none;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-webkit-input-placeholder {
+  color: #72777d;
+  opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
-  padding-right: 2.4875em;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-ms-input-placeholder {
+  color: #72777d;
+  opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
-  right: 0;
-  top: 0;
-  margin: 0.775em;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-moz-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-moz-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:focus {
+  outline: 0;
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle {
   padding-left: 2.475em;
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
   left: 0;
-  top: 0;
-  margin: 0.3em;
+  margin: 0 0.3em;
+}
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
+  padding-right: 2.4875em;
+}
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  right: 0;
+  margin: 0 0.775em;
 }
 .oo-ui-capsuleMultiselectWidget:hover .oo-ui-capsuleMultiselectWidget-handle {
   border-color: rgba(0, 0, 0, 0.2);
   cursor: text;
 }
 .oo-ui-capsuleItemWidget:focus {
-  outline: none;
+  outline: 0;
   border-color: #087ecc;
 }
 .oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
index aab3b62..495cbfe 100644 (file)
@@ -1,13 +1,15 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-02-28T23:19:44Z
  */
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
   cursor: move;
 .oo-ui-draggableGroupElement-horizontal .oo-ui-draggableElement {
   display: inline-block;
 }
+.oo-ui-draggableElement-handle:focus {
+  border-radius: 2px;
+  box-shadow: inset 0 0 0 1px #36c, 0 0 0 1px #36c;
+  outline: 0;
+}
 .oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous > .oo-ui-panelLayout-scrollable {
-  overflow-y: hidden;
+  overflow: hidden;
 }
 .oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout {
   width: 100%;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
 }
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-padded {
-  padding: 2em;
-}
 .oo-ui-bookletLayout-outlinePanel-editable > .oo-ui-outlineSelectWidget {
   position: absolute;
   top: 0;
   left: 0;
   right: 0;
   bottom: 3em;
-  overflow-y: auto;
+  overflow: auto;
 }
 .oo-ui-bookletLayout-outlinePanel > .oo-ui-outlineControlsWidget {
   position: absolute;
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
   position: absolute;
+  top: 0;
+  height: 100%;
 }
 .oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
   cursor: default;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
   left: 0;
-  top: 0;
-  height: 2.3em;
   margin-left: 0.5em;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
-  top: 0;
   right: 0;
-  height: 2.3em;
   margin-right: 0.775em;
 }
 .oo-ui-selectFileWidget-label {
 .oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-label {
   right: 2em;
 }
-.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop.oo-ui-selectFileWidget-dropTarget {
-  background-color: #eaf3ff;
-}
 .oo-ui-selectFileWidget-dropTarget {
   background-color: #fff;
   border: 1px solid #a2a9b1;
+  border-radius: 2px;
   vertical-align: middle;
   overflow: hidden;
-  border-radius: 2px;
 }
 .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button {
   border-radius: 2px;
   white-space: normal;
 }
 .oo-ui-selectFileWidget-empty.oo-ui-widget-enabled.oo-ui-selectFileWidget-dropTarget {
-  background-color: #eee;
+  background-color: #fff;
   border-style: dashed;
+  -webkit-transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+     -moz-transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+          transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+}
+.oo-ui-selectFileWidget-empty.oo-ui-widget-enabled.oo-ui-selectFileWidget-dropTarget:hover {
+  border-color: #72777d;
+}
+.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop.oo-ui-selectFileWidget-dropTarget {
+  background-color: #eaf3ff;
+  color: #36c;
 }
 .oo-ui-selectFileWidget.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
 .oo-ui-outlineOptionWidget-level-2 .oo-ui-iconElement-icon {
   left: 4em;
 }
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
-  font-weight: bold;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
-  opacity: 0.5;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
-  color: #777;
-}
 .oo-ui-outlineControlsWidget {
   height: 3em;
   background-color: #fff;
   display: block;
   position: relative;
 }
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon,
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+}
 .oo-ui-capsuleMultiselectWidget-content {
   position: relative;
 }
 .oo-ui-capsuleMultiselectWidget-handle:last-child {
   margin-right: 0;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator,
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
-  position: absolute;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input {
+  border: 0;
+  line-height: 1.675;
+  margin: 0 0 0 0.2em;
+  padding: 0;
+  font-size: inherit;
+  font-family: inherit;
+  background-color: transparent;
+  color: #000;
+  vertical-align: middle;
+  /* stylelint-disable indentation */
+  /* stylelint-enable indentation */
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content :-moz-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-webkit-input-placeholder {
   color: #72777d;
   opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content ::-moz-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-ms-input-placeholder {
   color: #72777d;
   opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content :-ms-input-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-moz-placeholder {
   color: #72777d;
+  opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content ::-webkit-input-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-moz-placeholder {
   color: #72777d;
+  opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content :placeholder-shown {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::placeholder {
   color: #72777d;
-}
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input {
-  border: 0;
-  line-height: 1.675;
-  margin: 0 0 0 0.2em;
-  padding: 0;
-  font-size: inherit;
-  font-family: inherit;
-  background-color: transparent;
-  color: #000;
-  vertical-align: middle;
+  opacity: 1;
 }
 .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:focus {
   outline: 0;
 }
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
-  padding-right: 2.4875em;
-}
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
-  right: 0;
-  top: 0;
-  margin: 0.775em;
-}
 .oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle {
   padding-left: 2.475em;
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
   left: 0;
-  top: 0;
-  margin: 0.3em;
+  margin: 0 0.3em;
+}
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
+  padding-right: 2.4875em;
+}
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  right: 0;
+  margin: 0 0.775em;
 }
 .oo-ui-capsuleMultiselectWidget-popup {
   margin-top: -1px;
   display: inline-block;
   cursor: default;
   white-space: nowrap;
-  width: auto;
-  max-width: 100%;
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
-  vertical-align: middle;
+  width: auto;
+  max-width: 100%;
   height: 1.7em;
-  line-height: 1.7;
-  background-color: #eee;
-  color: #222;
   margin: 0.1em;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
   padding: 0 0.4em;
+  line-height: 1.7;
+  vertical-align: middle;
 }
 .oo-ui-capsuleItemWidget.oo-ui-labelElement .oo-ui-labelElement-label {
   display: inline-block;
   overflow: hidden;
   cursor: text;
 }
-.oo-ui-capsuleItemWidget:focus {
-  outline: 0;
-  border-color: #36c;
-  box-shadow: inset 0 0 0 1px #36c;
-}
-.oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
-  background-color: #eaecf0;
-  color: #72777d;
-  border-color: #c8ccd1;
-  text-shadow: 0 1px 1px #fff;
-}
-.oo-ui-capsuleItemWidget > .oo-ui-buttonElement {
-  display: none;
-}
 .oo-ui-capsuleItemWidget.oo-ui-widget-enabled {
+  background-color: #f8f9fa;
+  color: #222;
   padding-right: 1.5375em;
+  -webkit-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+     -moz-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+          transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+}
+.oo-ui-capsuleItemWidget.oo-ui-widget-enabled:hover {
+  background-color: #fff;
+  color: #444;
+  border-color: #a2a9b1;
+}
+.oo-ui-capsuleItemWidget.oo-ui-widget-enabled:focus {
+  border-color: #36c;
+  box-shadow: inset 0 0 0 1px #36c;
+  outline: 0;
 }
 .oo-ui-capsuleItemWidget.oo-ui-widget-enabled > .oo-ui-buttonElement {
   display: block;
   bottom: 0;
   height: auto;
 }
+.oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
+  background-color: #eaecf0;
+  color: #72777d;
+  border-color: #c8ccd1;
+  text-shadow: 0 1px 1px #fff;
+}
+.oo-ui-capsuleItemWidget.oo-ui-widget-disabled > .oo-ui-buttonElement {
+  display: none;
+}
 .oo-ui-searchWidget-query {
   position: absolute;
   top: 0;
index d5a796b..b89262d 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:20Z
+ * Date: 2017-02-28T23:19:40Z
  */
 ( function ( OO ) {
 
index 310d616..b546dd1 100644 (file)
@@ -1,13 +1,15 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-02-28T23:19:44Z
  */
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
 .oo-ui-actionWidget.oo-ui-pendingElement-pending {
   background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
 }
index 4b99fa6..701c058 100644 (file)
@@ -1,13 +1,15 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-02-28T23:19:44Z
  */
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
 .oo-ui-window {
   background: transparent;
 }
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless:active {
   background-color: rgba(0, 0, 0, 0.1);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:hover,
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover {
   background-color: rgba(8, 126, 204, 0.05);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:active,
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active {
   background-color: rgba(8, 126, 204, 0.1);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label {
   font-weight: bold;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive:hover,
index c842c62..ad3c226 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:20Z
+ * Date: 2017-02-28T23:19:40Z
  */
 ( function ( OO ) {
 
index ec755a1..ea2e2ec 100644 (file)
@@ -56,6 +56,7 @@
                        "rtl": "images/icons/articleRedirect-rtl.svg"
                } },
                "searchCaseSensitive": { "file": "images/icons/case-sensitive.svg" },
+               "searchDiacritics": { "file": "images/icons/diacritic.svg" },
                "searchRegularExpression": { "file": "images/icons/regular-expression.svg" },
                "specialCharacter": { "file": "images/icons/specialCharacter.svg" },
                "table": { "file": "images/icons/table.svg" },
index 449cb77..d68e70c 100644 (file)
                } },
                "clear": { "file": "images/icons/clear.svg" },
                "clock": { "file": "images/icons/clock.svg" },
+               "feedback": { "file": {
+                       "ltr": "images/icons/feedback-ltr.svg",
+                       "rtl": "images/icons/feedback-rtl.svg"
+               } },
                "funnel": { "file": {
                        "ltr": "images/icons/funnel-ltr.svg",
                        "rtl": "images/icons/funnel-rtl.svg"
index 46cd9b0..749e38f 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="regular-expression">
+    <g id="case-sensitive">
         <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
         <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
     </g>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.png b/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.png
new file mode 100644 (file)
index 0000000..2359b19
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.svg b/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.svg
new file mode 100644 (file)
index 0000000..4565101
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="diacritic">
+      <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+      <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.png
new file mode 100644 (file)
index 0000000..f49ebeb
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.svg
new file mode 100644 (file)
index 0000000..d32e478
--- /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"><g fill="#FFFFFF">
+    <path d="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.png
new file mode 100644 (file)
index 0000000..ac5787b
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.svg
new file mode 100644 (file)
index 0000000..0fdeed9
--- /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">
+    <path d="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.png
new file mode 100644 (file)
index 0000000..efba220
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.svg
new file mode 100644 (file)
index 0000000..14be7ff
--- /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"><g fill="#FFFFFF">
+    <path d="M15.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.png
new file mode 100644 (file)
index 0000000..fdbe5e1
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.svg
new file mode 100644 (file)
index 0000000..022d86d
--- /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">
+    <path d="M15.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
+</svg>
index 21efb82..7cbbced 100644 (file)
@@ -76,6 +76,7 @@
                        "rtl": "images/icons/articleRedirect-rtl.svg"
                } },
                "searchCaseSensitive": { "file": "images/icons/case-sensitive.svg" },
+               "searchDiacritics": { "file": "images/icons/diacritic.svg" },
                "searchRegularExpression": { "file": "images/icons/regular-expression.svg" },
                "specialCharacter": { "file": "images/icons/specialCharacter.svg" },
                "table": { "file": "images/icons/table.svg" },
index e040ffb..3436446 100644 (file)
                } },
                "clear": { "file": "images/icons/clear.svg" },
                "clock": { "file": "images/icons/clock.svg" },
+               "feedback": {
+                       "file": {
+                               "ltr": "images/icons/feedback-ltr.svg",
+                               "rtl": "images/icons/feedback-rtl.svg"
+                       },
+                       "variants": [ "progressive" ]
+               },
                "funnel": { "file": {
                        "ltr": "images/icons/funnel-ltr.svg",
                        "rtl": "images/icons/funnel-rtl.svg"
index dbd98d2..e5590a3 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
-    <g id="regular-expression">
+    <g id="case-sensitive">
         <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
         <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
     </g>
index c5f35b0..ff6e102 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
-    <g id="regular-expression">
+    <g id="case-sensitive">
         <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
         <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
     </g>
index 46cd9b0..749e38f 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="regular-expression">
+    <g id="case-sensitive">
         <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
         <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
     </g>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.png
new file mode 100644 (file)
index 0000000..7bb19e3
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.svg
new file mode 100644 (file)
index 0000000..b19dd0d
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+    <g id="diacritic">
+      <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+      <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+    </g>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.png
new file mode 100644 (file)
index 0000000..eb76fd0
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.svg
new file mode 100644 (file)
index 0000000..fed1164
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+    <g id="diacritic">
+      <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+      <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+    </g>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.png
new file mode 100644 (file)
index 0000000..2359b19
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.svg
new file mode 100644 (file)
index 0000000..4565101
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="diacritic">
+      <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+      <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.png
new file mode 100644 (file)
index 0000000..f49ebeb
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.svg
new file mode 100644 (file)
index 0000000..8ed4be9
--- /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"><g fill="#fff">
+    <path d="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.png
new file mode 100644 (file)
index 0000000..28405a8
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..49425d0
--- /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"><g fill="#36c">
+    <path d="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.png
new file mode 100644 (file)
index 0000000..ac5787b
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.svg
new file mode 100644 (file)
index 0000000..0fdeed9
--- /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">
+    <path d="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.png
new file mode 100644 (file)
index 0000000..efba220
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.svg
new file mode 100644 (file)
index 0000000..f4e7932
--- /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"><g fill="#fff">
+    <path d="M15.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.png
new file mode 100644 (file)
index 0000000..27bcc2d
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..413ea34
--- /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"><g fill="#36c">
+    <path d="M15.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.png
new file mode 100644 (file)
index 0000000..fdbe5e1
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.svg
new file mode 100644 (file)
index 0000000..022d86d
--- /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">
+    <path d="M15.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
+</svg>
diff --git a/resources/src/dom-level2-skip.js b/resources/src/dom-level2-skip.js
deleted file mode 100644 (file)
index 484c295..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
- * Skip function for dom-level2-shim module.
- *
- * Tests for window.Node because that's the only thing that this shim is adding.
- */
-return !!window.Node;
index f4ef540..11f472e 100644 (file)
@@ -1,4 +1,4 @@
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 /* Table Sorting */
 
index fd5dbc9..f3ea163 100644 (file)
@@ -1,6 +1,6 @@
 /* Styles for the JavaScript enhancements of the history page */
 
-#pagehistory li.before input[name="oldid"],
-#pagehistory li.after input[name="diff"] {
+#pagehistory li.before input[name='oldid'],
+#pagehistory li.after input[name='diff'] {
        visibility: hidden;
 }
index 6e0010c..a5ca65e 100644 (file)
@@ -32,7 +32,7 @@
 }
 
 .skin-monobook .postedit {
-       top: 6em !important;
+       top: 6em !important; /* stylelint-disable-line declaration-no-important */
 }
 
 .postedit-faded {
index a6cd650..dccbacc 100644 (file)
        display: inline;
        /* shared.css has some very weird directionality-specific rules for 'ul' we need to override,
         * search for "Correct directionality when page dir is different from site/user dir" */
+       /* stylelint-disable declaration-no-important */
        margin: 0 !important;
        padding: 0 !important;
+       /* stylelint-enable declaration-no-important */
 }
 
 /* @noflip */
index 7c2f92b..b047f62 100644 (file)
@@ -99,26 +99,26 @@ img {
  * MediaWiki-specific elements
  */
 #globalWrapper {
-       width: 100% !important;
-       min-width: 0 !important;
+       width: 100% !important; /* stylelint-disable-line declaration-no-important */
+       min-width: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 .mw-body {
        background: #fff;
        color: #000;
-       border: 0 !important;
-       padding: 0 !important;
-       margin: 0 !important;
+       border: 0 !important; /* stylelint-disable-line declaration-no-important */
+       padding: 0 !important; /* stylelint-disable-line declaration-no-important */
+       margin: 0 !important; /* stylelint-disable-line declaration-no-important */
        direction: ltr;
 }
 
 #column-content {
-       margin: 0 !important;
+       margin: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 #column-content .mw-body {
        padding: 1em;
-       margin: 0 !important;
+       margin: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 #toc {
@@ -164,14 +164,14 @@ img {
  * Links
  */
 a {
-       background: none !important;
-       padding: 0 !important;
+       background: none !important; /* stylelint-disable-line declaration-no-important */
+       padding: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 /* Expand URLs for printing */
 .mw-body a.external.text:after,
 .mw-body a.external.autonumber:after {
-       content: " (" attr( href ) ")";
+       content: ' (' attr( href ) ')';
        word-break: break-all;
        word-wrap: break-word;
 }
@@ -179,7 +179,7 @@ a {
 /* Expand protocol-relative URLs for printing */
 .mw-body a.external.text[href^='//']:after,
 .mw-body a.external.autonumber[href^='//']:after {
-       content: " (https:" attr( href ) ")";
+       content: ' (https:' attr( href ) ')';
 }
 
 a,
@@ -187,11 +187,11 @@ a.external,
 a.new,
 a.stub {
        /* IE 6 & 7 don't understand `inherit` */
-       color: #000 !important;
-       text-decoration: none !important;
+       color: #000 !important; /* stylelint-disable-line declaration-no-important */
+       text-decoration: none !important; /* stylelint-disable-line declaration-no-important */
        /* Modern browser will apply this, IE 6 & 7 ignore the unknown */
-       color: inherit !important; /* stylelint-disable-line declaration-block-no-duplicate-properties */
-       text-decoration: inherit !important; /* stylelint-disable-line declaration-block-no-duplicate-properties */
+       color: inherit !important; /* stylelint-disable-line declaration-block-no-duplicate-properties, declaration-no-important */
+       text-decoration: inherit !important; /* stylelint-disable-line declaration-block-no-duplicate-properties, declaration-no-important */
 }
 
 /**
index 8f4ac7d..ff0c0e3 100644 (file)
@@ -56,22 +56,22 @@ wbr {
 
 /* Input types that should follow user direction, like buttons */
 /* TODO: What about buttons in wikipage content ? */
-input[type="submit"],
-input[type="button"],
-input[type="reset"],
-input[type="file"] {
+input[type='submit'],
+input[type='button'],
+input[type='reset'],
+input[type='file'] {
        direction: ltr;
 }
 
 /* Override default values */
-textarea[dir="ltr"],
-input[dir="ltr"] {
+textarea[dir='ltr'],
+input[dir='ltr'] {
        /* @noflip */
        direction: ltr;
 }
 
-textarea[dir="rtl"],
-input[dir="rtl"] {
+textarea[dir='rtl'],
+input[dir='rtl'] {
        /* @noflip */
        direction: rtl;
 }
@@ -325,8 +325,8 @@ a.new {
 /* Plainlinks - this can be used to switch
  * off special external link styling */
 .plainlinks a.external {
-       background: none !important;
-       padding: 0 !important;
+       background: none !important; /* stylelint-disable-line declaration-no-important */
+       padding: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 /* External URLs should always be treated as LTR (T6330) */
@@ -540,7 +540,7 @@ table.wikitable > caption {
 }
 
 .mw-small-spinner {
-       padding: 10px !important;
+       padding: 10px !important; /* stylelint-disable-line declaration-no-important */
        margin-right: 0.6em;
        background-image: url( images/spinner.gif );
        background-position: center center;
@@ -570,7 +570,7 @@ h1:lang( pi ),
 h1:lang( sa ),
 h1:lang( ta ),
 h1:lang( te ) {
-       line-height: 1.6em !important;
+       line-height: 1.6em !important; /* stylelint-disable-line declaration-no-important */
 }
 
 /* stylelint-disable selector-list-comma-newline-after */
index 4cca1a6..1e952b0 100644 (file)
@@ -1,7 +1,7 @@
 // Common Less mixin library for MediaWiki
 //
 // By default the folder containing this file is included in $wgResourceLoaderLESSImportPaths,
-// which makes this file importable by all less files via '@import "mediawiki.mixins";'.
+// which makes this file importable by all less files via `@import 'mediawiki.mixins';`.
 //
 // The mixins included below are considered a public interface for MediaWiki extensions.
 // The signatures of parametrized mixins should be kept as stable as possible.
@@ -88,9 +88,9 @@
 }
 
 .flex-display( @display: flex ) {
-       display: ~"-webkit-@{display}"; // iOS 6-, Safari 3.1-6
-       display: ~"-moz-@{display}"; // Firefox 21-
-       display: ~"-ms-@{display}box"; // IE 10
+       display: ~'-webkit-@{display}'; // iOS 6-, Safari 3.1-6
+       display: ~'-moz-@{display}'; // Firefox 21-
+       display: ~'-ms-@{display}box'; // IE 10
        display: @display;
 }
 
 // Screen Reader Helper Mixin
 .mixin-screen-reader-text() {
        display: block;
-       position: absolute !important;
+       position: absolute !important; /* stylelint-disable-line declaration-no-important */
        clip: rect( 1px, 1px, 1px, 1px );
        width: 1px;
        height: 1px;
index a404286..64d6b3d 100644 (file)
@@ -1,7 +1,7 @@
 // This is a separate file because importing the mixin causes
 // the keyframes blocks to be included in the output, regardless
 // of whether .rotation is used.
-@import "mediawiki.mixins.animation";
+@import 'mediawiki.mixins.animation';
 
 .rotate-frames() {
        from {
index 1bfa3a3..a0ff767 100644 (file)
@@ -17,8 +17,8 @@
        line-height: normal;
        font-weight: normal;
 
-       & > input[type="checkbox"],
-       & > input[type="radio"] {
+       & > input[type='checkbox'],
+       & > input[type='radio'] {
                width: auto;
                height: auto;
                margin: 0 0.1em 0 0;
index edb6744..d6ce734 100644 (file)
         * Update the model with an updated list of changes
         *
         * @param {jQuery|string} changesListContent
+        * @param {jQuery} $fieldset
         */
-       mw.rcfilters.dm.ChangesListViewModel.prototype.update = function ( changesListContent ) {
+       mw.rcfilters.dm.ChangesListViewModel.prototype.update = function ( changesListContent, $fieldset ) {
                this.valid = true;
-               this.emit( 'update', changesListContent );
+               this.emit( 'update', changesListContent, $fieldset );
        };
 
 }( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/images/pending.gif b/resources/src/mediawiki.rcfilters/images/pending.gif
new file mode 100644 (file)
index 0000000..1194eed
Binary files /dev/null and b/resources/src/mediawiki.rcfilters/images/pending.gif differ
index 1df31a2..c0f453c 100644 (file)
@@ -62,7 +62,6 @@
                // Check all filter interactions
                this.filtersModel.reassessFilterInteractions();
 
-               this.updateURL();
                this.updateChangesList();
        };
 
@@ -75,7 +74,6 @@
                // Check all filter interactions
                this.filtersModel.reassessFilterInteractions();
 
-               this.updateURL();
                this.updateChangesList();
        };
 
@@ -93,7 +91,6 @@
                        obj[ filterName ] = isSelected;
                        this.filtersModel.updateFilters( obj );
 
-                       this.updateURL();
                        this.updateChangesList();
 
                        // Check filter interactions
 
        /**
         * Update the URL of the page to reflect current filters
+        *
+        * This should not be called directly from outside the controller.
+        * If an action requires changing the URL, it should either use the
+        * highlighting actions below, or call #updateChangesList which does
+        * the uri corrections already.
+        *
+        * @private
+        * @param {Object} [params] Extra parameters to add to the API call
         */
-       mw.rcfilters.Controller.prototype.updateURL = function () {
-               var uri = this.getUpdatedUri();
+       mw.rcfilters.Controller.prototype.updateURL = function ( params ) {
+               var uri;
+
+               params = params || {};
+
+               uri = this.getUpdatedUri();
+               uri.extend( params );
+
                window.history.pushState( { tag: 'rcfilters' }, document.title, uri.toString() );
        };
 
         * Fetch the list of changes from the server for the current filters
         *
         * @return {jQuery.Promise} Promise object that will resolve with the changes list
+        *  or with a string denoting no results.
         */
        mw.rcfilters.Controller.prototype.fetchChangesList = function () {
                var uri = this.getUpdatedUri(),
                        latestRequest = function () {
                                return requestId === this.requestCounter;
                        }.bind( this );
-               uri.extend( this.filtersModel.getParametersFromFilters() );
+
                return $.ajax( uri.toString(), { contentType: 'html' } )
-                       .then( function ( html ) {
-                               return latestRequest() ?
-                                       $( $.parseHTML( html ) ).find( '.mw-changeslist' ).first().contents() :
-                                       null;
-                       } ).then( null, function () {
-                               return latestRequest() ? 'NO_RESULTS' : null;
-                       } );
+                       .then(
+                               // Success
+                               function ( html ) {
+                                       var $parsed;
+                                       if ( !latestRequest() ) {
+                                               return $.Deferred().reject();
+                                       }
+
+                                       $parsed = $( $.parseHTML( html ) );
+
+                                       return {
+                                               // Changes list
+                                               changes: $parsed.find( '.mw-changeslist' ).first().contents(),
+                                               // Fieldset
+                                               fieldset: $parsed.find( 'fieldset.rcoptions' ).first()
+                                       };
+                               },
+                               // Failure
+                               function ( responseObj ) {
+                                       var $parsed;
+
+                                       if ( !latestRequest() ) {
+                                               return $.Deferred().reject();
+                                       }
+
+                                       $parsed = $( $.parseHTML( responseObj.responseText ) );
+
+                                       // Force a resolve state to this promise
+                                       return $.Deferred().resolve( {
+                                               changes: 'NO_RESULTS',
+                                               fieldset: $parsed.find( 'fieldset.rcoptions' ).first()
+                                       } ).promise();
+                               }
+                       );
        };
 
        /**
         * Update the list of changes and notify the model
+        *
+        * @param {Object} [params] Extra parameters to add to the API call
         */
-       mw.rcfilters.Controller.prototype.updateChangesList = function () {
+       mw.rcfilters.Controller.prototype.updateChangesList = function ( params ) {
+               this.updateURL( params );
                this.changesListModel.invalidate();
                this.fetchChangesList()
-                       .always( function ( changesListContent ) {
-                               if ( changesListContent ) {
-                                       this.changesListModel.update( changesListContent );
-                               }
-                       }.bind( this ) );
+                       .then(
+                               // Success
+                               function ( pieces ) {
+                                       var $changesListContent = pieces.changes,
+                                               $fieldset = pieces.fieldset;
+
+                                       this.changesListModel.update( $changesListContent, $fieldset );
+                               }.bind( this )
+                               // Do nothing for failure
+                       );
        };
 
        /**
index 745273c..746907b 100644 (file)
@@ -23,7 +23,7 @@
 
                        // eslint-disable-next-line no-new
                        new mw.rcfilters.ui.FormWrapperWidget(
-                               changesListModel, $( '.rcoptions form' ) );
+                               changesListModel, controller, $( 'fieldset.rcoptions' ) );
 
                        controller.initialize( {
                                registration: {
                                }
                        } );
 
-                       $( '.rcoptions' ).before( filtersWidget.$element );
+                       $( '.rcfilters-container' ).append( filtersWidget.$element );
                        $( 'body' ).append( $overlay );
 
                        // HACK: Remove old-style filter links for filters handled by the widget
                        } );
 
                        window.addEventListener( 'popstate', function () {
-                               controller.updateFromURL();
                                controller.updateChangesList();
                        } );
 
index 8423363..897a9e8 100644 (file)
@@ -1,9 +1,35 @@
 // Corrections for the standard special page
-.rcoptions {
-       border: 0;
-       border-bottom: 1px solid #a2a9b1;
+.client-js{
+       .rcoptions {
+               border: 0;
+               border-bottom: 1px solid #a2a9b1;
 
-       legend {
-               display: none;
+               legend {
+                       display: none;
+               }
+
+               &:not( .mw-rcfilters-ui-ready ) {
+                       /* @embed */
+                       background-image: url( ../images/pending.gif );
+                       margin: 0;
+
+                       * {
+                               visibility: hidden;
+                       }
+               }
        }
+
+       .rcfilters-container {
+               min-height: 100px;
+               margin: 0;
+
+               &:not( .mw-rcfilters-ui-ready ) {
+                       /* @embed */
+                       background-image: url( ../images/pending.gif );
+               }
+       }
+}
+
+.mw-rcfilters-staticfilters-selected {
+       font-weight: bold;
 }
index 5c31b5d..2ce2c7f 100644 (file)
@@ -1,5 +1,5 @@
-@import "mediawiki.mixins";
-@import "mw.rcfilters.variables";
+@import 'mediawiki.mixins';
+@import 'mw.rcfilters.variables';
 
 // This is a general mixin for a color circle
 .mw-rcfilters-mixin-circle( @color: white, @diameter: 2em, @padding: 0.5em, @border: false ) {
@@ -23,7 +23,7 @@
 // a color class on its parent element
 .result-circle( @colorName: 'none' ) {
        &-@{colorName} {
-               .mw-rcfilters-mixin-circle( ~"@{highlight-@{colorName}}", @result-circle-diameter, 0 );
+               .mw-rcfilters-mixin-circle( ~'@{highlight-@{colorName}}', @result-circle-diameter, 0 );
                display: none;
 
                .mw-rcfilters-highlight-color-@{colorName} & {
 
 // This mixin produces color mixes for two, three and four colors
 .highlight-color-mix( @color1, @color2, @color3: false, @color4: false ) {
-       @highlight-color-class-var: ~".mw-rcfilters-highlight-color-@{color1}.mw-rcfilters-highlight-color-@{color2}";
+       @highlight-color-class-var: ~'.mw-rcfilters-highlight-color-@{color1}.mw-rcfilters-highlight-color-@{color2}';
 
        // The nature of these variables and them being inside
        // a 'tint' and 'average' LESS functions is such where
        // the parsing is failing if it is done inside those functions.
        // Instead, we first construct their LESS variable names,
        // and then we call them inside those functions by calling @@var
-       @c1var: ~"highlight-@{color1}";
-       @c2var: ~"highlight-@{color2}";
+       @c1var: ~'highlight-@{color1}';
+       @c2var: ~'highlight-@{color2}';
 
        // Two colors
        @{highlight-color-class-var} when ( @color3 = false ) and ( @color4 = false ) and not ( @color1 = false ), ( @color2 = false ) {
        }
        // Three colors
        @{highlight-color-class-var}.mw-rcfilters-highlight-color-@{color3} when ( @color4 = false ) and not ( @color3 = false ) {
-               @c3var: ~"highlight-@{color3}";
+               @c3var: ~'highlight-@{color3}';
                background-color: tint( mix( @@c1var, average( @@c2var, @@c3var ), 33% ), 30% );
        }
 
        // Four colors
        @{highlight-color-class-var}.mw-rcfilters-highlight-color-@{color3}.mw-rcfilters-highlight-color-@{color4} when not ( @color4 = false ) {
-               @c3var: ~"highlight-@{color3}";
-               @c4var: ~"highlight-@{color4}";
+               @c3var: ~'highlight-@{color3}';
+               @c4var: ~'highlight-@{color4}';
                background-color: tint( mix( @@c1var, mix( @@c2var, average( @@c3var, @@c4var ), 25% ), 25% ), 25% );
        }
 }
index 2521899..c70da38 100644 (file)
@@ -1,6 +1,28 @@
-@import "mw.rcfilters.mixins";
+@import 'mw.rcfilters.mixins';
 
 .mw-rcfilters-ui-capsuleItemWidget {
+       background-color: #fff;
+       border-color: #979797;
+       color: #222;
+
+       &-muted {
+               // Muted state
+               background-color: #eaecf0;
+               border-color: #c8ccd1;
+               .oo-ui-labelElement-label {
+                       color: #72777d;
+               }
+
+               .oo-ui-buttonWidget {
+                       opacity: @muted-opacity;
+               }
+       }
+
+       &-selected {
+               background-color: #eaf3ff;
+               border-color: #36c;
+       }
+
        &-popup-content {
                padding: 0.5em;
                color: #54595d;
                cursor: pointer;
        }
 
-       &-muted {
-               // Muted state
-               // We want everything muted except the circle
-               background-color: rgba( 255, 255, 255, @muted-opacity );
-
-               .oo-ui-labelElement-label,
-               .oo-ui-buttonWidget {
-                       opacity: @muted-opacity;
-               }
-       }
-
        &-highlight {
                display: none;
                padding-right: 0.5em;
 
                }
 
-               &[data-color="c1"] {
-                       .mw-rcfilters-mixin-circle( @highlight-c1, 0.7em, ~"0 0.5em 0 0" );
+               &[data-color='c1'] {
+                       .mw-rcfilters-mixin-circle( @highlight-c1, 0.7em, ~'0 0.5em 0 0' );
                }
-               &[data-color="c2"] {
-                       .mw-rcfilters-mixin-circle( @highlight-c2, 0.7em, ~"0 0.5em 0 0" );
+               &[data-color='c2'] {
+                       .mw-rcfilters-mixin-circle( @highlight-c2, 0.7em, ~'0 0.5em 0 0' );
                }
-               &[data-color="c3"] {
-                       .mw-rcfilters-mixin-circle( @highlight-c3, 0.7em, ~"0 0.5em 0 0" );
+               &[data-color='c3'] {
+                       .mw-rcfilters-mixin-circle( @highlight-c3, 0.7em, ~'0 0.5em 0 0' );
                }
-               &[data-color="c4"] {
-                       .mw-rcfilters-mixin-circle( @highlight-c4, 0.7em, ~"0 0.5em 0 0" );
+               &[data-color='c4'] {
+                       .mw-rcfilters-mixin-circle( @highlight-c4, 0.7em, ~'0 0.5em 0 0' );
                }
-               &[data-color="c5"] {
-                       .mw-rcfilters-mixin-circle( @highlight-c5, 0.7em, ~"0 0.5em 0 0" );
+               &[data-color='c5'] {
+                       .mw-rcfilters-mixin-circle( @highlight-c5, 0.7em, ~'0 0.5em 0 0' );
                }
        }
 }
index 5ad2a19..fcd5f67 100644 (file)
@@ -6,14 +6,14 @@
                        list-style: none;
                        // Each li's margin-left should be the width of the highlights
                        // element + the margin
-                       margin-left: ~"calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 + @{result-circle-general-margin} )";
+                       margin-left: ~'calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 + @{result-circle-general-margin} )';
                }
        }
 
        // Correction for Enhanced RC
        // This is outside the scope of the 'highlights' wrapper
        table.mw-enhanced-rc {
-               margin-left: ~"calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 + @{result-circle-general-margin} )";
+               margin-left: ~'calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 + @{result-circle-general-margin} )';
 
                td:last-child {
                        width: 100%;
@@ -26,7 +26,7 @@
                text-align: right;
                // The width is 5 circles times their diameter + individual margin
                // and then plus the general margin
-               width: ~"calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 )";
+               width: ~'calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 )';
                // And we want to shift the entire block to the left of the li
                position: absolute;
                left: 0;
index 8921f7a..a0ef293 100644 (file)
@@ -25,9 +25,4 @@
                text-align: right;
                padding-left: 0.5em;
        }
-
-       .oo-ui-capsuleItemWidget {
-               color: #222;
-               background-color: #fff;
-       }
 }
index 4619b6b..3f70125 100644 (file)
@@ -1,8 +1,8 @@
-@import "mw.rcfilters.mixins";
+@import 'mw.rcfilters.mixins';
 
 .mw-rcfilters-ui-filterItemHighlightButton {
 
-       &-circle {
+       .oo-ui-buttonWidget.oo-ui-popupButtonWidget .oo-ui-buttonElement-button > &-circle {
                display: inline-block;
                vertical-align: middle;
                background-image: none;
                        &-c1 {
                                // These values duplicate the sizing of the icon
                                // width/height 1.875em
-                               .mw-rcfilters-mixin-circle( @highlight-c1, 1.875em, 0 );
+                               .mw-rcfilters-mixin-circle( @highlight-c1, 1.875em, 0.2em 0 );
                        }
                        &-c2 {
-                               .mw-rcfilters-mixin-circle( @highlight-c2, 1.875em, 0 );
+                               .mw-rcfilters-mixin-circle( @highlight-c2, 1.875em, 0.2em 0 );
                        }
                        &-c3 {
-                               .mw-rcfilters-mixin-circle( @highlight-c3, 1.875em, 0 );
+                               .mw-rcfilters-mixin-circle( @highlight-c3, 1.875em, 0.2em 0 );
                        }
                        &-c4 {
-                               .mw-rcfilters-mixin-circle( @highlight-c4, 1.875em, 0 );
+                               .mw-rcfilters-mixin-circle( @highlight-c4, 1.875em, 0.2em 0 );
                        }
                        &-c5 {
-                               .mw-rcfilters-mixin-circle( @highlight-c5, 1.875em, 0 );
+                               .mw-rcfilters-mixin-circle( @highlight-c5, 1.875em, 0.2em 0 );
                        }
                }
        }
index 21953da..e45ed60 100644 (file)
@@ -1,4 +1,4 @@
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 .mw-rcfilters-ui-filterItemWidget {
        padding: 0 0.5em;
@@ -23,7 +23,7 @@
        &-label {
                &-title {
                        font-weight: bold;
-                       font-size: 1.2em;
+                       font-size: 1.15em;
                        color: #222;
                }
                &-desc {
@@ -34,9 +34,8 @@
        &-filterCheckbox {
                .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
                        // Override margin-top and -bottom rules from FieldLayout
-                       margin: 0 !important;
+                       margin: 0 !important; /* stylelint-disable-line declaration-no-important */
                }
-
        }
 
        &-highlightButton {
index da6fa46..970d140 100644 (file)
@@ -6,12 +6,18 @@
        &-popup {
                // We have to override OOUI's definition, which is set
                // on the inline style of the popup
-               margin-top: 2.4em !important;
+               margin-top: 2.4em !important; /* stylelint-disable-line declaration-no-important */
                max-width: 650px;
 
                .oo-ui-popupWidget-body {
                        max-height: 70vh;
                }
+
+               .oo-ui-popupWidget-footer {
+                       background-color: #f8f9fa;
+                       text-align: right;
+                       padding: 0.5em;
+               }
        }
 
        &-search {
index 933a500..800e7ea 100644 (file)
                this.popupTimeoutShow = null;
        };
 
+       /**
+        * Set selected state on this widget
+        *
+        * @param {boolean} [isSelected] Widget is selected
+        */
+       mw.rcfilters.ui.CapsuleItemWidget.prototype.toggleSelected = function ( isSelected ) {
+               isSelected = isSelected !== undefined ? isSelected : !this.selected;
+
+               if ( this.selected !== isSelected ) {
+                       this.selected = isSelected;
+
+                       this.$element.toggleClass( 'mw-rcfilters-ui-capsuleItemWidget-selected', this.selected );
+               }
+       };
+
        /**
         * Remove and destroy external elements of this widget
         */
index 8e0b259..a06b103 100644 (file)
@@ -31,6 +31,7 @@
                this.model = model;
                this.filterInput = filterInput;
                this.isSelecting = false;
+               this.selected = null;
 
                this.resetButton = new OO.ui.ButtonWidget( {
                        icon: 'trash',
                this.emptyFilterMessage.toggle( currFiltersAreEmpty );
        };
 
+       /**
+        * Mark an item widget as selected
+        *
+        * @param {mw.rcfilters.ui.CapsuleItemWidget} item Capsule widget
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.select = function ( item ) {
+               if ( this.selected !== item ) {
+                       // Unselect previous
+                       if ( this.selected ) {
+                               this.selected.toggleSelected( false );
+                       }
+
+                       // Select new one
+                       this.selected = item;
+                       if ( this.selected ) {
+                               item.toggleSelected( true );
+                       }
+               }
+       };
+
+       /**
+        * Reset selection and remove selected states from all items
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.resetSelection = function () {
+               if ( this.selected !== null ) {
+                       this.selected = null;
+                       this.getItems().forEach( function ( capsuleWidget ) {
+                               capsuleWidget.toggleSelected( false );
+                       } );
+               }
+       };
+
        /**
         * @inheritdoc
         */
index 32db0b6..34fa82e 100644 (file)
@@ -22,6 +22,8 @@
                                anchor: false,
                                padded: true,
                                align: 'backwards',
+                               horizontalPosition: 'end',
+                               $floatableContainer: this.$element,
                                width: 290,
                                $content: this.colorPickerWidget.$element
                        }
index bb213fd..5d6c30d 100644 (file)
@@ -13,6 +13,7 @@
         * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
         */
        mw.rcfilters.ui.FilterWrapperWidget = function MwRcfiltersUiFilterWrapperWidget( controller, model, config ) {
+               var $footer = $( '<div>' );
                config = config || {};
 
                // Parent
                        }
                );
 
+               $footer.append(
+                       new OO.ui.ButtonWidget( {
+                               framed: false,
+                               icon: 'feedback',
+                               flags: [ 'progressive' ],
+                               label: mw.msg( 'rcfilters-filterlist-feedbacklink' ),
+                               href: 'https://www.mediawiki.org/wiki/Help_talk:New_filters_for_edit_review'
+                       } ).$element
+               );
+
                this.textInput = new OO.ui.TextInputWidget( {
                        classes: [ 'mw-rcfilters-ui-filterWrapperWidget-search' ],
                        icon: 'search',
@@ -43,6 +54,7 @@
                        $overlay: this.$overlay,
                        popup: {
                                $content: this.filterPopup.$element,
+                               $footer: $footer,
                                classes: [ 'mw-rcfilters-ui-filterWrapperWidget-popup' ],
                                width: 650
                        }
@@ -62,6 +74,7 @@
                // Initialize
                this.$element
                        .addClass( 'mw-rcfilters-ui-filterWrapperWidget' )
+                       .addClass( 'mw-rcfilters-ui-ready' )
                        .append( this.capsule.$element, this.textInput.$element );
        };
 
@@ -82,6 +95,7 @@
 
                // Highlight item
                this.filterPopup.select( filterName );
+               this.capsule.select( item );
 
                this.scrollToTop( filterWidget.$element );
        };
        mw.rcfilters.ui.FilterWrapperWidget.prototype.onCapsulePopupToggle = function ( isVisible ) {
                if ( !isVisible ) {
                        this.filterPopup.resetSelection();
+                       this.capsule.resetSelection();
                } else {
                        this.scrollToTop( this.capsule.$element, 10 );
                }
index 2513b07..3c81ff1 100644 (file)
         *
         * @constructor
         * @param {mw.rcfilters.dm.ChangesListViewModel} model Changes list view model
+        * @param {mw.rcfilters.Controller} controller RCfilters controller
         * @param {jQuery} $formRoot Root element of the form to attach to
         * @param {Object} config Configuration object
         */
-       mw.rcfilters.ui.FormWrapperWidget = function MwRcfiltersUiFormWrapperWidget( model, $formRoot, config ) {
+       mw.rcfilters.ui.FormWrapperWidget = function MwRcfiltersUiFormWrapperWidget( model, controller, $formRoot, config ) {
                config = config || {};
 
                // Parent
                mw.rcfilters.ui.FormWrapperWidget.parent.call( this, $.extend( {}, config, {
                        $element: $formRoot
                } ) );
+               // Mixin constructors
+               OO.ui.mixin.PendingElement.call( this, config );
 
                this.model = model;
-               this.$submitButton = this.$element.find( 'input[type=submit]' );
+               this.controller = controller;
+               this.$submitButton = this.$element.find( 'form input[type=submit]' );
+
+               this.$element
+                       .on( 'click', 'a[data-params]', this.onLinkClick.bind( this ) );
+
+               this.$element
+                       .on( 'submit', 'form', this.onFormSubmit.bind( this ) );
 
                // Events
                this.model.connect( this, {
                        invalidate: 'onModelInvalidate',
                        update: 'onModelUpdate'
                } );
+
+               // Initialize
+               this.cleanupForm();
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-FormWrapperWidget' )
+                       .addClass( 'mw-rcfilters-ui-ready' );
        };
 
        /* Initialization */
 
        OO.inheritClass( mw.rcfilters.ui.FormWrapperWidget, OO.ui.Widget );
+       OO.mixinClass( mw.rcfilters.ui.FormWrapperWidget, OO.ui.mixin.PendingElement );
+
+       /**
+        * Clean up the base form we're getting from the back-end.
+        * Remove <strong> tags and replace those with classes, so
+        * we can toggle those on click.
+        */
+       mw.rcfilters.ui.FormWrapperWidget.prototype.cleanupForm = function () {
+               this.$element.find( '[data-keys] strong' ).each( function () {
+                       $( this )
+                               .parent().addClass( 'mw-rcfilters-staticfilters-selected' );
+
+                       $( this )
+                               .replaceWith( $( this ).contents() );
+               } );
+       };
+
+       /**
+        * Respond to link click
+        *
+        * @param {jQuery.Event} e Event
+        * @return {boolean} false
+        */
+       mw.rcfilters.ui.FormWrapperWidget.prototype.onLinkClick = function ( e ) {
+               var $element = $( e.target ),
+                       data = $element.data( 'params' ),
+                       keys = $element.data( 'keys' ),
+                       $similarElements = $element.parent().find( '[data-keys="' + keys + '"]' );
+
+               // Only highlight choice if this link isn't a show/hide link
+               if ( !$element.parents( '.rcshowhideoption' ).length ) {
+                       // Remove the class from similar elements
+                       $similarElements.removeClass( 'mw-rcfilters-staticfilters-selected' );
+                       // Add the class to this element
+                       $element.addClass( 'mw-rcfilters-staticfilters-selected' );
+               }
+
+               e.stopPropagation();
+
+               this.controller.updateChangesList( data );
+               return false;
+       };
+
+       /**
+        * Respond to form submit event
+        *
+        * @param {jQuery.Event} e Event
+        * @return {boolean} false
+        */
+       mw.rcfilters.ui.FormWrapperWidget.prototype.onFormSubmit = function ( e ) {
+               var data = {};
+
+               // Collect all data from form
+               $( e.target ).find( 'input:not([type="hidden"],[type="submit"]), select' ).each( function () {
+                       if ( !$( this ).is( ':checkbox' ) || $( this ).is( ':checked' ) ) {
+                               data[ $( this ).prop( 'name' ) ] = $( this ).val();
+                       }
+               } );
+
+               this.controller.updateChangesList( data );
+               return false;
+       };
 
        /**
         * Respond to model invalidate
         */
        mw.rcfilters.ui.FormWrapperWidget.prototype.onModelInvalidate = function () {
+               this.pushPending();
                this.$submitButton.prop( 'disabled', true );
        };
 
        /**
-        * Respond to model update
+        * Respond to model update, replace the show/hide links with the ones from the
+        * server so they feature the correct state.
+        *
+        * @param {jQuery|string} $changesList Updated changes list
+        * @param {jQuery} $fieldset Updated fieldset
         */
-       mw.rcfilters.ui.FormWrapperWidget.prototype.onModelUpdate = function () {
+       mw.rcfilters.ui.FormWrapperWidget.prototype.onModelUpdate = function ( $changesList, $fieldset ) {
                this.$submitButton.prop( 'disabled', false );
+
+               // Replace the links we have in the content
+               // We don't want to replace the entire thing, because there is a big difference between
+               // the links in the backend and the links we have initialized, since we are removing
+               // the ones that are implemented in the new system
+               this.$element.find( '.rcshowhide' ).children().each( function () {
+                       // Go over existing links and replace only them
+                       var classes = $( this ).attr( 'class' ).split( ' ' ),
+                               // Look for that item in the fieldset from the server
+                               $remoteItem = $fieldset.find( '.' + classes.join( '.' ) );
+
+                       if ( $remoteItem ) {
+                               $( this ).replaceWith( $remoteItem );
+                       }
+               } );
+
+               this.popPending();
        };
 }( mediaWiki ) );
index 823ce05..b392259 100644 (file)
@@ -19,7 +19,7 @@
        padding-right: 15px;
 }
 
-.mw-body a.external[href^="mailto:"],
+.mw-body a.external[href^='mailto:'],
 .link-mailto {
        background: url( images/mail.png ) center right no-repeat;
        /* @embed */
@@ -27,7 +27,7 @@
        padding-right: 15px;
 }
 
-.mw-body a.external[href^="ftp://"],
+.mw-body a.external[href^='ftp://'],
 .link-ftp {
        background: url( images/ftp-ltr.png ) center right no-repeat;
        /* @embed */
@@ -35,8 +35,8 @@
        padding-right: 15px;
 }
 
-.mw-body a.external[href^="irc://"],
-.mw-body a.external[href^="ircs://"],
+.mw-body a.external[href^='irc://'],
+.mw-body a.external[href^='ircs://'],
 .link-irc {
        background: url( images/chat-ltr.png ) center right no-repeat;
        /* @embed */
        padding-right: 15px;
 }
 
-.mw-body a.external[href$=".ogg"],
-.mw-body a.external[href$=".OGG"],
-.mw-body a.external[href$=".mid"],
-.mw-body a.external[href$=".MID"],
-.mw-body a.external[href$=".midi"],
-.mw-body a.external[href$=".MIDI"],
-.mw-body a.external[href$=".mp3"],
-.mw-body a.external[href$=".MP3"],
-.mw-body a.external[href$=".wav"],
-.mw-body a.external[href$=".WAV"],
-.mw-body a.external[href$=".wma"],
-.mw-body a.external[href$=".WMA"],
+.mw-body a.external[href$='.ogg'],
+.mw-body a.external[href$='.OGG'],
+.mw-body a.external[href$='.mid'],
+.mw-body a.external[href$='.MID'],
+.mw-body a.external[href$='.midi'],
+.mw-body a.external[href$='.MIDI'],
+.mw-body a.external[href$='.mp3'],
+.mw-body a.external[href$='.MP3'],
+.mw-body a.external[href$='.wav'],
+.mw-body a.external[href$='.WAV'],
+.mw-body a.external[href$='.wma'],
+.mw-body a.external[href$='.WMA'],
 .link-audio {
        background: url( images/audio-ltr.png ) center right no-repeat;
        /* @embed */
        padding-right: 15px;
 }
 
-.mw-body a.external[href$=".ogm"],
-.mw-body a.external[href$=".OGM"],
-.mw-body a.external[href$=".avi"],
-.mw-body a.external[href$=".AVI"],
-.mw-body a.external[href$=".mpeg"],
-.mw-body a.external[href$=".MPEG"],
-.mw-body a.external[href$=".mpg"],
-.mw-body a.external[href$=".MPG"],
+.mw-body a.external[href$='.ogm'],
+.mw-body a.external[href$='.OGM'],
+.mw-body a.external[href$='.avi'],
+.mw-body a.external[href$='.AVI'],
+.mw-body a.external[href$='.mpeg'],
+.mw-body a.external[href$='.MPEG'],
+.mw-body a.external[href$='.mpg'],
+.mw-body a.external[href$='.MPG'],
 .link-video {
        background: url( images/video.png ) center right no-repeat;
        /* @embed */
        padding-right: 15px;
 }
 
-.mw-body a.external[href$=".pdf"],
-.mw-body a.external[href$=".PDF"],
-.mw-body a.external[href*=".pdf#"],
-.mw-body a.external[href*=".PDF#"],
-.mw-body a.external[href*=".pdf?"],
-.mw-body a.external[href*=".PDF?"],
+.mw-body a.external[href$='.pdf'],
+.mw-body a.external[href$='.PDF'],
+.mw-body a.external[href*='.pdf#'],
+.mw-body a.external[href*='.PDF#'],
+.mw-body a.external[href*='.pdf?'],
+.mw-body a.external[href*='.PDF?'],
 .link-document {
        background: url( images/document-ltr.png ) center right no-repeat;
        /* @embed */
index 0f8ae45..b3d1613 100644 (file)
  * automatically when content is modified.
  */
 .mw-body-content {
-       counter-reset: mw-NumberedExtLink;
+       counter-reset: mw-numbered-ext-link;
 }
 
-.mw-body-content a[rel~="mw:ExtLink"]:empty:after {
-       content: "[" counter( mw-NumberedExtLink ) "]";
-       counter-increment: mw-NumberedExtLink;
+.mw-body-content a[rel~='mw:ExtLink']:empty:after {
+       content: '[' counter( mw-numbered-ext-link ) ']';
+       counter-increment: mw-numbered-ext-link;
 }
 
 /**
@@ -133,7 +133,7 @@ figure[typeof~='mw:Image/Frame'] > *:first-child > img,
 }
 
 /* Hide the caption for frameless and plain floated images */
-figure[typeof~="mw:Image/Frameless"] > figcaption,
-figure[typeof~="mw:Image"] > figcaption {
+figure[typeof~='mw:Image/Frameless'] > figcaption,
+figure[typeof~='mw:Image'] > figcaption {
        display: none;
 }
index a30a15d..ae557b4 100644 (file)
@@ -2,7 +2,7 @@
  * Styling for Special:Block
  */
 
-label[for="mw-input-wpConfirm"] {
+label[for='mw-input-wpConfirm'] {
        font-weight: bold;
 }
 
index 8d63902..5504883 100644 (file)
@@ -32,7 +32,7 @@
        visibility: hidden;
        display: block;
        font-size: 0;
-       content: " ";
+       content: ' ';
        clear: both;
        height: 0;
 }
@@ -84,7 +84,7 @@ to resemble a traditional dictionary definition */
        visibility: hidden;
        display: block;
        font-size: 0;
-       content: " ";
+       content: ' ';
        clear: both;
        height: 0;
 }
@@ -199,6 +199,7 @@ span the interwiki results across the bottom of the page.
 }
 
 /* mobile */
+/* stylelint-disable declaration-no-important */
 @media only screen and ( max-width: 768px ) {
        #mw-interwiki-results {
                width: 100%;
@@ -222,3 +223,4 @@ span the interwiki results across the bottom of the page.
                max-width: none !important;
        }
 }
+/* stylelint-enable declaration-no-important */
index d65b284..93ea294 100644 (file)
@@ -1,42 +1,42 @@
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 #mw-editbutton-bold {
-       .background-image("images/@{button-bold}");
+       .background-image('images/@{button-bold}');
 }
 
 #mw-editbutton-italic {
-       .background-image("images/@{button-italic}");
+       .background-image('images/@{button-italic}');
 }
 
 #mw-editbutton-link {
-       .background-image("images/@{button-link}");
+       .background-image('images/@{button-link}');
 }
 
 #mw-editbutton-extlink {
-       .background-image("images/@{button-extlink}");
+       .background-image('images/@{button-extlink}');
 }
 
 #mw-editbutton-headline {
-       .background-image("images/@{button-headline}");
+       .background-image('images/@{button-headline}');
 }
 
 #mw-editbutton-image {
-       .background-image("images/@{button-image}");
+       .background-image('images/@{button-image}');
 }
 
 #mw-editbutton-media {
-       .background-image("images/@{button-media}");
+       .background-image('images/@{button-media}');
 }
 
 #mw-editbutton-nowiki {
-       .background-image("images/@{button-nowiki}");
+       .background-image('images/@{button-nowiki}');
 }
 
 // Who decided to make only this single one different than the name of the data item?
 #mw-editbutton-signature {
-       .background-image("images/@{button-sig}");
+       .background-image('images/@{button-sig}');
 }
 
 #mw-editbutton-hr {
-       .background-image("images/@{button-hr}");
+       .background-image('images/@{button-hr}');
 }
index 6397c73..8e97c3e 100644 (file)
@@ -1,6 +1,6 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 // Helpers
 .mixin-mw-ui-anchor-styles( @mainColor ) {
index 52c797b..abe7c46 100644 (file)
@@ -1,6 +1,6 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 // Buttons
 //
index f983087..2ca20a5 100644 (file)
@@ -1,5 +1,5 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
 
 // Checkbox
 //
                vertical-align: middle;
        }
 
-       input[type="checkbox"] {
+       input[type='checkbox'] {
                // we hide the input element as instead we will style the label that follows
                // we use opacity so that VoiceOver software can still identify it
                opacity: 0;
-               // Render "on top of" the label, so that it's still clickable (T98905)
+               // Render *on top of* the label, so that it's still clickable (T98905)
                z-index: 1;
                position: relative;
                // ensure the invisible checkbox takes up the required width
@@ -68,7 +68,7 @@
                }
 
                // the pseudo before element of the label after the checkbox now looks like a checkbox
-               & + label::before {
+               & + label:before {
                        content: '';
                        background-color: #fff;
                        .background-image-svg( 'images/checked.svg', 'images/checked.png' );
                }
 
                // when the input is checked, style the label pseudo before element that followed as a checked checkbox
-               &:checked + label::before {
+               &:checked + label:before {
                        .background-size( 100%, 100% );
                }
 
-               &:active + label::before {
+               &:active + label:before {
                        background-color: @colorGray13;
                        border-color: @colorGray13;
                }
 
-               &:focus + label::before {
+               &:focus + label:before {
                        border-width: 2px;
                }
 
-               &:focus:hover + label::before,
-               &:hover + label::before {
+               &:focus:hover + label:before,
+               &:hover + label:before {
                        border-bottom-width: 3px;
                }
 
                // disabled checkboxes have a gray background
-               &:disabled + label::before {
+               &:disabled + label:before {
                        cursor: default;
                        background-color: @colorGray14;
                        border-color: @colorGray14;
                }
 
                // disabled and checked checkboxes have a white circle
-               &:disabled:checked + label::before {
+               &:disabled:checked + label:before {
                        .background-image-svg( 'images/checked_disabled.svg', 'images/checked_disabled.png' );
                }
        }
index 2327efc..d3c76d0 100644 (file)
@@ -1,8 +1,8 @@
 // Form elements and layouts
 
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 // --------------------------------------------------------------------------
 // Layouts
@@ -66,7 +66,7 @@
        }
 
        // Override input styling just for checkboxes and radio inputs.
-       input[type="radio"] {
+       input[type='radio'] {
                display: inline;
                .box-sizing( content-box );
                width: auto;
index efb04ae..f169d1b 100644 (file)
@@ -1,5 +1,5 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
 
 // Mixins
 .mixin-mw-ui-icon-bgimage( @iconSvg, @iconPng ) {
index a9aa046..cc9c65a 100644 (file)
@@ -1,8 +1,8 @@
 // Inputs
 
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 // Text inputs
 //
@@ -73,7 +73,7 @@
        }
 
        // Normalize styling for `<input type="search">`
-       &[type="search"] {
+       &[type='search'] {
                // Correct the odd appearance in Chrome and Safari 5
                -webkit-appearance: textfield;
 
@@ -103,7 +103,7 @@ textarea.mw-ui-input {
 // <button class="mw-ui-button mw-ui-progressive">Submit</button>
 //
 // Styleguide 1.2.
-input[type="number"],
+input[type='number'],
 .mw-ui-input-inline {
        display: inline-block;
        width: auto;
index 7538ff4..7cb2849 100644 (file)
@@ -1,5 +1,5 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
 
 // Radio
 //
@@ -48,7 +48,7 @@
                vertical-align: middle;
        }
 
-       input[type="radio"] {
+       input[type='radio'] {
                // we hide the input element as instead we will style the label that follows
                // we use opacity so that VoiceOver software can still identify it
                opacity: 0;
@@ -60,7 +60,7 @@
                margin-right: 0.4em;
 
                // the pseudo before element of the label after the radio now looks like a radio
-               & + label::before {
+               & + label:before {
                        content: '';
                        background-color: #fff;
                        .background-image-svg( 'images/radio_checked.svg', 'images/radio_checked.png' );
                }
 
                // when the input is checked, style the label pseudo before element that followed as a checked radio
-               &:checked + label::before {
+               &:checked + label:before {
                        .background-size( 100%, 100% );
                }
 
-               &:active + label::before {
+               &:active + label:before {
                        background-color: @colorGray13;
                        border-color: @colorGray13;
                }
 
-               &:focus + label::before {
+               &:focus + label:before {
                        border-width: 2px;
                }
 
-               &:focus:hover + label::before,
-               &:hover + label::before {
+               &:focus:hover + label:before,
+               &:hover + label:before {
                        border-bottom-width: 3px;
                }
 
                // disabled radios have a gray background
-               &:disabled + label::before {
+               &:disabled + label:before {
                        background-color: @colorGray14;
                        border-color: @colorGray14;
                        cursor: default;
                }
 
                // disabled and checked radios have a white circle
-               &:disabled:checked + label::before {
+               &:disabled:checked + label:before {
                        .background-image-svg( 'images/radio_disabled.svg', 'images/radio_disabled.png' );
                }
        }
index c0684d9..a07aa68 100644 (file)
@@ -1,6 +1,6 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 /*
 Text & Anchors
index c9d6208..0589d39 100644 (file)
@@ -1,5 +1,5 @@
 /**
  * Provide Agora appearance for mw-ui-* classes.
  */
-@import "components/forms";
-@import "components/utilities";
+@import 'components/forms';
+@import 'components/utilities';
index b5b9cbe..093c58b 100644 (file)
@@ -1,5 +1,5 @@
 /* stylelint-disable no-duplicate-selectors */
-@import "mediawiki.widgets.datetime.definitions";
+@import 'mediawiki.widgets.datetime.definitions';
 
 .mw-widgets-datetime-calendarWidget {
        display: inline-block;
index 1c6c490..f205da3 100644 (file)
@@ -1,5 +1,5 @@
 /* stylelint-disable no-duplicate-selectors */
-@import "mediawiki.widgets.datetime.definitions";
+@import 'mediawiki.widgets.datetime.definitions';
 
 .mw-widgets-datetime-dateTimeInputWidget {
        display: inline-block;
index bdade36..fa45d5a 100644 (file)
@@ -25,7 +25,7 @@
 }
 
 .oo-ui-transition( @value1, @value2: X, ... ) {
-       @value: ~`"@{arguments}".replace(/[\[\]]|\,\sX/g, '')`; // stylelint-disable-line function-comma-space-after, function-parentheses-space-inside, function-whitespace-after
+       @value: ~`'@{arguments}'.replace(/[\[\]]|\,\sX/g, '')`; // stylelint-disable-line function-comma-space-after, function-parentheses-space-inside, function-whitespace-after, value-keyword-case
        -webkit-transition: @value;
        -moz-transition: @value;
        transition: @value;
index b929a5a..395f80b 100644 (file)
@@ -68,8 +68,8 @@
        }
 
        .mw-widget-calendarWidget-body:not( .mw-widget-calendarWidget-old-body ):first-child {
-               margin-top: -@calendarHeight;
-               margin-left: -@calendarWidth;
+               margin-top: -@calendarHeight; /* stylelint-disable-line value-keyword-case */
+               margin-left: -@calendarWidth; /* stylelint-disable-line value-keyword-case */
        }
 
        .mw-widget-calendarWidget-body:not( .mw-widget-calendarWidget-old-body ):last-child {
@@ -83,8 +83,8 @@
        height: @calendarHeight;
 
        .mw-widget-calendarWidget-body:first-child {
-               margin-top: 0 !important;
-               margin-left: 0 !important;
+               margin-top: 0 !important; /* stylelint-disable-line declaration-no-important */
+               margin-left: 0 !important; /* stylelint-disable-line declaration-no-important */
                .transition( margin-left 500ms );
        }
 }
@@ -94,8 +94,8 @@
        height: @calendarHeight;
 
        .mw-widget-calendarWidget-body:first-child {
-               margin-left: -@calendarWidth !important;
-               margin-top: 0 !important;
+               margin-left: -@calendarWidth !important; /* stylelint-disable-line value-keyword-case, declaration-no-important */
+               margin-top: 0 !important; /* stylelint-disable-line declaration-no-important */
                .transition( margin-left 500ms );
        }
 }
        }
 
        .mw-widget-calendarWidget-body:first-child {
-               margin-left: 0 !important;
-               margin-top: 0 !important;
+               margin-left: 0 !important; /* stylelint-disable-line declaration-no-important */
+               margin-top: 0 !important; /* stylelint-disable-line declaration-no-important */
                .transition( margin-top 500ms );
        }
 }
        }
 
        .mw-widget-calendarWidget-body:first-child {
-               margin-left: 0 !important;
-               margin-top: -@calendarHeight !important;
+               margin-left: 0 !important; /* stylelint-disable-line declaration-no-important */
+               margin-top: -@calendarHeight !important; /* stylelint-disable-line value-keyword-case, declaration-no-important */
                .transition( margin-top 500ms );
        }
 }
index a53e863..a36b379 100644 (file)
@@ -26,7 +26,7 @@ table.mw-htmlform-nolabel td.mw-label {
 }
 
 tr.mw-htmlform-vertical-label td.mw-label {
-       text-align: left !important;
+       text-align: left !important; /* stylelint-disable-line declaration-no-important */
 }
 
 .mw-icon-question {
index af9eb36..f93df3c 100644 (file)
@@ -115,6 +115,6 @@ td.diff-deletedline .diffchange {
 .diff-otitle,
 .diff-ntitle,
 .diff-lineno {
-       direction: ltr !important;
+       direction: ltr !important; /* stylelint-disable-line declaration-no-important */
        unicode-bidi: embed;
 }
index 89efae3..2c3e137 100644 (file)
@@ -1,4 +1,4 @@
-@import "mediawiki.ui/variables";
+@import 'mediawiki.ui/variables';
 
 .mediawiki-filewarning {
        visibility: hidden;
index dd6bf74..4eed90a 100644 (file)
@@ -1,4 +1,4 @@
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 #mw-indicator-mw-helplink a {
        .background-image-svg('images/help.svg', 'images/help.png');
index 5a37f45..9c7064f 100644 (file)
 }
 /* Generate interpuncts */
 .hlist dt:after {
-       content: ":";
+       content: ':';
 }
 .hlist dd:after,
 .hlist li:after {
-       content: " ·";
+       content: ' ·';
        font-weight: bold;
 }
 .hlist dd:last-child:after,
@@ -57,7 +57,7 @@
 .hlist li dd:first-child:before,
 .hlist li dt:first-child:before,
 .hlist li li:first-child:before {
-       content: "(";
+       content: '(';
        font-weight: normal;
 }
 .hlist dd dd:last-child:after,
@@ -69,7 +69,7 @@
 .hlist li dd:last-child:after,
 .hlist li dt:last-child:after,
 .hlist li li:last-child:after {
-       content: ")";
+       content: ')';
        font-weight: normal;
 }
 /* For IE8 */
@@ -82,7 +82,7 @@
 .hlist li dd.hlist-last-child:after,
 .hlist li dt.hlist-last-child:after,
 .hlist li li.hlist-last-child:after {
-       content: ")";
+       content: ')';
        font-weight: normal;
 }
 /* Put ordinals in front of ordered list items */
        counter-increment: list-item;
 }
 .hlist ol > li:before {
-       content: counter( list-item ) " ";
+       content: counter( list-item ) ' ';
 }
 .hlist dd ol > li:first-child:before,
 .hlist dt ol > li:first-child:before,
 .hlist li ol > li:first-child:before {
-       content: "(" counter( list-item ) " ";
+       content: '(' counter( list-item ) ' ';
 }
index 49f0f70..c692538 100644 (file)
@@ -1,6 +1,6 @@
 /* General-purpose icons via CSS. Classes here should be named "mw-icon-*". */
 
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 /* For the collapsed and expanded arrows, we also provide selectors to make it
  * easy to use them with jquery.makeCollapsible. */
index 822c814..216cd5a 100644 (file)
@@ -3,7 +3,7 @@
  * in MediaWiki (used e.g. on Special:ListFiles).
  */
 
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 .TablePager {
        min-width: 80%;
index c4c91f9..d1fa84a 100644 (file)
                },
 
                /**
-                * Get an automatically generated random ID (stored in a session cookie)
+                * Get an automatically generated random ID (persisted in sessionStorage)
                 *
-                * This ID is ephemeral for everyone, staying in their browser only until they close
-                * their browser.
+                * This ID is ephemeral for everyone, staying in their browser only until they
+                * close their browsing session.
                 *
                 * @return {string} Random session ID
                 */
                sessionId: function () {
-                       var sessionId = mw.cookie.get( 'mwuser-sessionId' );
-                       if ( sessionId === null ) {
+                       var sessionId = mw.storage.session.get( 'mwuser-sessionId' );
+                       if ( !sessionId ) {
                                sessionId = mw.user.generateRandomSessionId();
-                               mw.cookie.set( 'mwuser-sessionId', sessionId, { expires: null } );
+                               mw.storage.session.set( 'mwuser-sessionId', sessionId );
                        }
                        return sessionId;
                },
diff --git a/resources/src/polyfill-nodeTypes.js b/resources/src/polyfill-nodeTypes.js
deleted file mode 100644 (file)
index c8acc86..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Adds window.Node with node types according to:
- * https://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247
- */
-
-window.Node = window.Node || {
-       ELEMENT_NODE: 1,
-       ATTRIBUTE_NODE: 2,
-       TEXT_NODE: 3,
-       CDATA_SECTION_NODE: 4,
-       ENTITY_REFERENCE_NODE: 5,
-       ENTITY_NODE: 6,
-       PROCESSING_INSTRUCTION_NODE: 7,
-       COMMENT_NODE: 8,
-       DOCUMENT_NODE: 9,
-       DOCUMENT_TYPE_NODE: 10,
-       DOCUMENT_FRAGMENT_NODE: 11,
-       NOTATION_NODE: 12
-};
index 7edde2a..35c2480 100644 (file)
@@ -974,10 +974,9 @@ class ParserTestRunner {
                        'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
                        'wgLanguageCode' => $langCode,
                        'wgRawHtml' => self::getOptionValue( 'wgRawHtml', $opts, false ),
-                       'wgNamespacesWithSubpages' => [
-                               0 => isset( $opts['subpage'] ),
-                               2 => isset( $opts['subpage'] ),
-                       ],
+                       'wgNamespacesWithSubpages' => array_fill_keys(
+                               MWNamespace::getValidNamespaces(), isset( $opts['subpage'] )
+                       ),
                        'wgMaxTocLevel' => $maxtoclevel,
                        'wgAllowExternalImages' => self::getOptionValue( 'wgAllowExternalImages', $opts, true ),
                        'wgThumbLimits' => [ self::getOptionValue( 'thumbsize', $opts, 180 ) ],
index 4227693..d7ad1d1 100644 (file)
@@ -1,6 +1,40 @@
 <?php
 
 class DeferredUpdatesTest extends MediaWikiTestCase {
+
+       /**
+        * @covers DeferredUpdates::getPendingUpdates
+        */
+       public function testGetPendingUpdates() {
+               # Prevent updates from running
+               $this->setMwGlobals( 'wgCommandLineMode', false );
+
+               $pre = DeferredUpdates::PRESEND;
+               $post = DeferredUpdates::POSTSEND;
+               $all = DeferredUpdates::ALL;
+
+               $update = $this->getMockBuilder( 'DeferrableUpdate' )
+                             ->getMock();
+               $update->expects( $this->never() )
+                       ->method( 'doUpdate' );
+
+               DeferredUpdates::addUpdate( $update, $pre );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $pre ) );
+               $this->assertCount( 0, DeferredUpdates::getPendingUpdates( $post ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $all ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates() );
+               DeferredUpdates::clearPendingUpdates();
+               $this->assertCount( 0, DeferredUpdates::getPendingUpdates() );
+
+               DeferredUpdates::addUpdate( $update, $post );
+               $this->assertCount( 0, DeferredUpdates::getPendingUpdates( $pre ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $post ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $all ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates() );
+               DeferredUpdates::clearPendingUpdates();
+               $this->assertCount( 0, DeferredUpdates::getPendingUpdates() );
+       }
+
        public function testDoUpdatesWeb() {
                $this->setMwGlobals( 'wgCommandLineMode', false );
 
diff --git a/tests/phpunit/includes/libs/time/ConvertibleTimestampTest.php b/tests/phpunit/includes/libs/time/ConvertibleTimestampTest.php
deleted file mode 100644 (file)
index d48caf3..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-<?php
-
-/**
- * Tests timestamp parsing and output.
- */
-class ConvertibleTimestampTest extends PHPUnit_Framework_TestCase {
-       /**
-        * @covers ConvertibleTimestamp::__construct
-        */
-       public function testConstructWithNoTimestamp() {
-               $timestamp = new ConvertibleTimestamp();
-               $this->assertInternalType( 'string', $timestamp->getTimestamp() );
-               $this->assertNotEmpty( $timestamp->getTimestamp() );
-               $this->assertNotEquals( false, strtotime( $timestamp->getTimestamp( TS_MW ) ) );
-       }
-
-       /**
-        * @covers ConvertibleTimestamp::__toString
-        */
-       public function testToString() {
-               $timestamp = new ConvertibleTimestamp( '1406833268' ); // Equivalent to 20140731190108
-               $this->assertEquals( '1406833268', $timestamp->__toString() );
-       }
-
-       public static function provideValidTimestampDifferences() {
-               return [
-                       [ '1406833268', '1406833269', '00 00 00 01' ],
-                       [ '1406833268', '1406833329', '00 00 01 01' ],
-                       [ '1406833268', '1406836929', '00 01 01 01' ],
-                       [ '1406833268', '1406923329', '01 01 01 01' ],
-               ];
-       }
-
-       /**
-        * @dataProvider provideValidTimestampDifferences
-        * @covers ConvertibleTimestamp::diff
-        */
-       public function testDiff( $timestamp1, $timestamp2, $expected ) {
-               $timestamp1 = new ConvertibleTimestamp( $timestamp1 );
-               $timestamp2 = new ConvertibleTimestamp( $timestamp2 );
-               $diff = $timestamp1->diff( $timestamp2 );
-               $this->assertEquals( $expected, $diff->format( '%D %H %I %S' ) );
-       }
-
-       /**
-        * Test parsing of valid timestamps and outputing to MW format.
-        * @dataProvider provideValidTimestamps
-        * @covers ConvertibleTimestamp::getTimestamp
-        */
-       public function testValidParse( $format, $original, $expected ) {
-               $timestamp = new ConvertibleTimestamp( $original );
-               $this->assertEquals( $expected, $timestamp->getTimestamp( TS_MW ) );
-       }
-
-       /**
-        * Test outputting valid timestamps to different formats.
-        * @dataProvider provideValidTimestamps
-        * @covers ConvertibleTimestamp::getTimestamp
-        */
-       public function testValidOutput( $format, $expected, $original ) {
-               $timestamp = new ConvertibleTimestamp( $original );
-               $this->assertEquals( $expected, (string)$timestamp->getTimestamp( $format ) );
-       }
-
-       /**
-        * Test an invalid timestamp.
-        * @expectedException TimestampException
-        * @covers ConvertibleTimestamp
-        */
-       public function testInvalidParse() {
-               new ConvertibleTimestamp( "This is not a timestamp." );
-       }
-
-       /**
-        * @dataProvider provideValidTimestamps
-        * @covers ConvertibleTimestamp::convert
-        */
-       public function testConvert( $format, $expected, $original ) {
-               $this->assertSame( $expected, ConvertibleTimestamp::convert( $format, $original ) );
-       }
-
-       /**
-        * Format an invalid timestamp.
-        * @covers ConvertibleTimestamp::convert
-        */
-       public function testConvertInvalid() {
-               $this->assertSame( false, ConvertibleTimestamp::convert( 'Not a timestamp', 0 ) );
-       }
-
-       /**
-        * Test an out of range timestamp
-        * @dataProvider provideOutOfRangeTimestamps
-        * @expectedException TimestampException
-        * @covers       ConvertibleTimestamp
-        */
-       public function testOutOfRangeTimestamps( $format, $input ) {
-               $timestamp = new ConvertibleTimestamp( $input );
-               $timestamp->getTimestamp( $format );
-       }
-
-       /**
-        * Test requesting an invalid output format.
-        * @expectedException TimestampException
-        * @covers ConvertibleTimestamp::getTimestamp
-        */
-       public function testInvalidOutput() {
-               $timestamp = new ConvertibleTimestamp( '1343761268' );
-               $timestamp->getTimestamp( 98 );
-       }
-
-       /**
-        * Returns a list of valid timestamps in the format:
-        * [ type, timestamp_of_type, timestamp_in_MW ]
-        */
-       public static function provideValidTimestamps() {
-               return [
-                       // Various formats
-                       [ TS_UNIX, '1343761268', '20120731190108' ],
-                       [ TS_MW, '20120731190108', '20120731190108' ],
-                       [ TS_DB, '2012-07-31 19:01:08', '20120731190108' ],
-                       [ TS_ISO_8601, '2012-07-31T19:01:08Z', '20120731190108' ],
-                       [ TS_ISO_8601_BASIC, '20120731T190108Z', '20120731190108' ],
-                       [ TS_EXIF, '2012:07:31 19:01:08', '20120731190108' ],
-                       [ TS_RFC2822, 'Tue, 31 Jul 2012 19:01:08 GMT', '20120731190108' ],
-                       [ TS_ORACLE, '31-07-2012 19:01:08.000000', '20120731190108' ],
-                       [ TS_POSTGRES, '2012-07-31 19:01:08 GMT', '20120731190108' ],
-                       // Some extremes and weird values
-                       [ TS_ISO_8601, '9999-12-31T23:59:59Z', '99991231235959' ],
-                       [ TS_UNIX, '-62135596801', '00001231235959' ]
-               ];
-       }
-
-       /**
-        * Returns a list of out of range timestamps in the format:
-        * [ type, timestamp_of_type ]
-        */
-       public static function provideOutOfRangeTimestamps() {
-               return [
-                       // Various formats
-                       [ TS_MW, '-62167219201' ], // -0001-12-31T23:59:59Z
-                       [ TS_MW, '253402300800' ], // 10000-01-01T00:00:00Z
-               ];
-       }
-}
index 94d25ee..0bd190b 100644 (file)
@@ -32,7 +32,6 @@ return [
                        'mediawiki.page.ready',
                        'mediawiki.page.startup',
                        'test.sinonjs',
-                       'dom-level2-shim',
                ],
                'position' => 'top',
                'targets' => [ 'desktop', 'mobile' ],
index 7f6efa0..bc12642 100644 (file)
 
                result2 = mw.user.generateRandomSessionId();
                assert.notEqual( result, result2, 'different when called multiple times' );
+       } );
 
+       QUnit.test( 'sessionId', function ( assert ) {
+               var result = mw.user.sessionId(),
+                       result2 = mw.user.sessionId();
+               assert.equal( typeof result, 'string', 'type' );
+               assert.equal( $.trim( result ), result, 'no leading or trailing whitespace' );
+               assert.equal( result2, result, 'retained' );
        } );
 }( mediaWiki, jQuery ) );