Merge "MediaWiki\Shell: log stderr"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 27 Oct 2017 14:43:28 +0000 (14:43 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 27 Oct 2017 14:43:28 +0000 (14:43 +0000)
126 files changed:
RELEASE-NOTES-1.30
RELEASE-NOTES-1.31
autoload.php
includes/Block.php
includes/DefaultSettings.php
includes/NoLocalSettings.php
includes/OutputPage.php
includes/PreConfigSetup.php [deleted file]
includes/Setup.php
includes/WebStart.php
includes/actions/HistoryAction.php
includes/actions/RawAction.php
includes/api/ApiParse.php
includes/api/ApiPurge.php
includes/api/i18n/ja.json
includes/api/i18n/zh-hant.json
includes/auth/CheckBlocksSecondaryAuthenticationProvider.php
includes/collation/IcuCollation.php
includes/deferred/DataUpdate.php
includes/deferred/LinksUpdate.php
includes/filerepo/file/LocalFile.php
includes/installer/Installer.php
includes/installer/i18n/eu.json
includes/installer/i18n/ia.json
includes/installer/i18n/ja.json
includes/installer/i18n/tokipona.json [deleted file]
includes/jobqueue/jobs/RefreshLinksJob.php
includes/libs/filebackend/SwiftFileBackend.php
includes/libs/objectcache/WANObjectCache.php
includes/page/Article.php
includes/page/WikiPage.php
includes/registration/ExtensionProcessor.php
includes/resourceloader/ResourceLoaderSkinModule.php
includes/specialpage/ChangesListSpecialPage.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialUndelete.php
includes/utils/ExecutableFinder.php [new file with mode: 0644]
languages/Language.php
languages/data/Names.php
languages/i18n/ar.json
languages/i18n/ast.json
languages/i18n/az.json
languages/i18n/ba.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bs.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/ko.json
languages/i18n/lt.json
languages/i18n/mk.json
languages/i18n/mwl.json
languages/i18n/nb.json
languages/i18n/pt-br.json
languages/i18n/qqq.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sl.json
languages/i18n/sv.json
languages/i18n/tg-cyrl.json
languages/i18n/th.json
languages/i18n/tokipona.json [deleted file]
languages/i18n/tr.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/yo.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/Maintenance.php
maintenance/doMaintenance.php
maintenance/populateContentModel.php
maintenance/runJobs.php
package.json
resources/Resources.php
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js
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.ui.ChangesListWrapperWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListItemWidget.less
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js
resources/src/mediawiki.special/mediawiki.special.changeslist.enhanced.css
resources/src/mediawiki.ui/components/images/checked.png [deleted file]
resources/src/mediawiki.ui/components/images/checked.svg [deleted file]
resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.js
resources/src/mediawiki/api.js
resources/src/mediawiki/images/pager-arrow-disabled-fastforward-ltr.png [deleted file]
resources/src/mediawiki/images/pager-arrow-disabled-fastforward-ltr.svg [deleted file]
resources/src/mediawiki/images/pager-arrow-disabled-fastforward-rtl.png [deleted file]
resources/src/mediawiki/images/pager-arrow-disabled-fastforward-rtl.svg [deleted file]
resources/src/mediawiki/images/pager-arrow-disabled-forward-ltr.png [deleted file]
resources/src/mediawiki/images/pager-arrow-disabled-forward-ltr.svg [deleted file]
resources/src/mediawiki/images/pager-arrow-disabled-forward-rtl.png [deleted file]
resources/src/mediawiki/images/pager-arrow-disabled-forward-rtl.svg [deleted file]
resources/src/mediawiki/images/pager-arrow-fastforward-ltr.png [deleted file]
resources/src/mediawiki/images/pager-arrow-fastforward-ltr.svg [deleted file]
resources/src/mediawiki/images/pager-arrow-fastforward-rtl.png [deleted file]
resources/src/mediawiki/images/pager-arrow-fastforward-rtl.svg [deleted file]
resources/src/mediawiki/images/pager-arrow-forward-ltr.png [deleted file]
resources/src/mediawiki/images/pager-arrow-forward-ltr.svg [deleted file]
resources/src/mediawiki/images/pager-arrow-forward-rtl.png [deleted file]
resources/src/mediawiki/images/pager-arrow-forward-rtl.svg [deleted file]
tests/parser/TidySupport.php
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/RevisionIntegrationTest.php
tests/phpunit/includes/api/ApiParseTest.php
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/page/ArticleTest.php
tests/phpunit/includes/registration/ExtensionProcessorTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderSkinModuleTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/maintenance/DumpTestCase.php

index bec7b86..f79ae83 100644 (file)
@@ -124,6 +124,7 @@ changes to languages because of Phabricator reports.
 * Added: kbp (Kabɩyɛ / Kabiyè)
 * Added: skr (Saraiki, سرائیکی)
 * Added: tay (Tayal / Atayal)
+* Removed: tokipona (Toki Pona)
 
 ==== Pig Latin added ====
 * (T45547) Added Pig Latin, a made-up English variant (en-x-piglatin),
@@ -240,6 +241,9 @@ changes to languages because of Phabricator reports.
 * (T138166) SpecialEmailUser::getTarget() now requires a second argument, the sending
   user object. Using the method without the second argument is deprecated.
 * (T67297) Browsers that don't support Unicode will have their edits rejected.
+* (T178450) The module 'jquery.badge' is deprecated and will be removed in a future
+  release. For notifying the user of an event, the Notifications ("Echo") system
+  should be used instead.
 
 == Compatibility ==
 MediaWiki 1.30 requires PHP 5.5.9 or later. There is experimental support for
index 3c22e78..a4ce481 100644 (file)
@@ -11,6 +11,8 @@ production.
   essential.
 * $wgUsejQueryThree was removed, as it is now the default. This was documented as a
   temporary variable during the migration period, deprecated since 1.29.
+* $wgLogoHD has been updated to support svg images and uses $wgLogo where
+  possible for fallback images such as png.
 * …
 
 === New features in 1.31 ===
@@ -53,6 +55,13 @@ changes to languages because of Phabricator reports.
 * The OutputPage class constructor now requires a context parameter,
   (instantiating without context was deprecated in 1.18)
 * mw.page (deprecated in 1.30) was removed.
+* Article::getLastPurgeTimestamp(), WikiPage::getLastPurgeTimestamp(), and the
+  related WikiPage::PURGE_* constants, deprecated in 1.29, were removed.
+* The Article::selectFields(), Article::onArticleCreate(),
+  Article::onArticleDelete(), and Article::onArticleEdit() methods, deprecated
+  in 1.24, were removed.
+* Installer::locateExecutable() and Installer::locateExecutableInDefaultPaths()
+  were removed, use ExecutableFinder::findInDefaultPaths() instead.
 
 == Compatibility ==
 MediaWiki 1.31 requires PHP 5.5.9 or later. There is experimental support for
index cf4a115..3bee411 100644 (file)
@@ -441,6 +441,7 @@ $wgAutoloadLocalClasses = [
        'EventRelayerGroup' => __DIR__ . '/includes/EventRelayerGroup.php',
        'EventRelayerKafka' => __DIR__ . '/includes/libs/eventrelayer/EventRelayerKafka.php',
        'EventRelayerNull' => __DIR__ . '/includes/libs/eventrelayer/EventRelayerNull.php',
+       'ExecutableFinder' => __DIR__ . '/includes/utils/ExecutableFinder.php',
        'Exif' => __DIR__ . '/includes/media/Exif.php',
        'ExifBitmapHandler' => __DIR__ . '/includes/media/ExifBitmap.php',
        'ExplodeIterator' => __DIR__ . '/includes/libs/ExplodeIterator.php',
index 5a4c43e..8d69d9a 100644 (file)
@@ -709,7 +709,7 @@ class Block {
                // than getting the msg raw and explode()'ing it.
                $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
                $lines = $cache->getWithSetCallback(
-                       $cache->makeKey( 'ipb', 'autoblock', 'whitelist' ),
+                       $cache->makeKey( 'ip-autoblock', 'whitelist' ),
                        $cache::TTL_DAY,
                        function ( $curValue, &$ttl, array &$setOpts ) {
                                $setOpts += Database::getCacheSetOptions( wfGetDB( DB_REPLICA ) );
index c1a518a..040f1ce 100644 (file)
@@ -290,6 +290,17 @@ $wgLogo = false;
  * ];
  * @endcode
  *
+ * SVG is also supported but when enabled, it
+ * disables 1.5x and 2x as svg will already
+ * be optimised for screen resolution.
+ *
+ * @par Example:
+ * @code
+ * $wgLogoHD = [
+ *     "svg" => "path/to/svg_version.svg",
+ * ];
+ * @endcode
+ *
  * @since 1.25
  */
 $wgLogoHD = false;
index 50950ef..b8bfd6a 100644 (file)
@@ -50,6 +50,7 @@ $templateParser = new TemplateParser();
 
 # Render error page if no LocalSettings file can be found
 try {
+       global $wgVersion;
        echo $templateParser->processTemplate(
                'NoLocalSettings',
                [
index 7a2b7df..500be8d 100644 (file)
@@ -4021,6 +4021,13 @@ class OutputPage extends ContextSource {
                        return;
                }
 
+               if ( isset( $logo['svg'] ) ) {
+                       // No media queries required if we only have a 1x and svg variant
+                       // because all preload-capable browsers support SVGs
+                       $this->addLinkHeader( '<' . $logo['svg'] . '>;rel=preload;as=image' );
+                       return;
+               }
+
                foreach ( $logo as $dppx => $src ) {
                        // Keys are in this format: "1.5x"
                        $dppx = substr( $dppx, 0, -1 );
diff --git a/includes/PreConfigSetup.php b/includes/PreConfigSetup.php
deleted file mode 100644 (file)
index bda7886..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-/**
- * File-scope setup actions, loaded before LocalSettings.php, shared by
- * WebStart.php and doMaintenance.php
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- *
- * @file
- */
-
-if ( !defined( 'MEDIAWIKI' ) ) {
-       // Not an entry point
-       exit( 1 );
-}
-
-// Grab profiling functions
-require_once "$IP/includes/profiler/ProfilerFunctions.php";
-
-// Start the autoloader, so that extensions can derive classes from core files
-require_once "$IP/includes/AutoLoader.php";
-
-// Load up some global defines.
-require_once "$IP/includes/Defines.php";
-
-// Start the profiler
-$wgProfiler = [];
-if ( file_exists( "$IP/StartProfiler.php" ) ) {
-       require "$IP/StartProfiler.php";
-}
-
-// Load default settings
-require_once "$IP/includes/DefaultSettings.php";
-
-// Load global functions
-require_once "$IP/includes/GlobalFunctions.php";
-
-// Load composer's autoloader if present
-if ( is_readable( "$IP/vendor/autoload.php" ) ) {
-       require_once "$IP/vendor/autoload.php";
-}
index d4612dd..e4396ba 100644 (file)
@@ -33,6 +33,85 @@ if ( !defined( 'MEDIAWIKI' ) ) {
        exit( 1 );
 }
 
+/**
+ * Pre-config setup: Before loading LocalSettings.php
+ */
+
+// Grab profiling functions
+require_once "$IP/includes/profiler/ProfilerFunctions.php";
+
+// Start the autoloader, so that extensions can derive classes from core files
+require_once "$IP/includes/AutoLoader.php";
+
+// Load up some global defines
+require_once "$IP/includes/Defines.php";
+
+// Start the profiler
+$wgProfiler = [];
+if ( file_exists( "$IP/StartProfiler.php" ) ) {
+       require "$IP/StartProfiler.php";
+}
+
+// Load default settings
+require_once "$IP/includes/DefaultSettings.php";
+
+// Load global functions
+require_once "$IP/includes/GlobalFunctions.php";
+
+// Load composer's autoloader if present
+if ( is_readable( "$IP/vendor/autoload.php" ) ) {
+       require_once "$IP/vendor/autoload.php";
+}
+
+// Assert that composer dependencies were successfully loaded
+// Purposely no leading \ due to it breaking HHVM RepoAuthorative mode
+// PHP works fine with both versions
+// See https://github.com/facebook/hhvm/issues/5833
+if ( !interface_exists( 'Psr\Log\LoggerInterface' ) ) {
+       $message = (
+               'MediaWiki requires the <a href="https://github.com/php-fig/log">PSR-3 logging ' .
+               "library</a> to be present. This library is not embedded directly in MediaWiki's " .
+               "git repository and must be installed separately by the end user.\n\n" .
+               'Please see <a href="https://www.mediawiki.org/wiki/Download_from_Git' .
+               '#Fetch_external_libraries">mediawiki.org</a> for help on installing ' .
+               'the required components.'
+       );
+       echo $message;
+       trigger_error( $message, E_USER_ERROR );
+       die( 1 );
+}
+
+// Install a header callback
+MediaWiki\HeaderCallback::register();
+
+/**
+ * Load LocalSettings.php
+ */
+
+if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
+       call_user_func( MW_CONFIG_CALLBACK );
+} else {
+       if ( !defined( 'MW_CONFIG_FILE' ) ) {
+               define( 'MW_CONFIG_FILE', "$IP/LocalSettings.php" );
+       }
+       require_once MW_CONFIG_FILE;
+}
+
+/**
+ * Customization point after all loading (constants, functions, classes,
+ * DefaultSettings, LocalSettings). Specifically, this is before usage of
+ * settings, before instantiation of Profiler (and other singletons), and
+ * before any setup functions or hooks run.
+ */
+
+if ( defined( 'MW_SETUP_CALLBACK' ) ) {
+       call_user_func( MW_SETUP_CALLBACK );
+}
+
+/**
+ * Main setup
+ */
+
 $fname = 'Setup.php';
 $ps_setup = Profiler::instance()->scopedProfileIn( $fname );
 
index 8a58e6f..e4d93f9 100644 (file)
@@ -59,56 +59,39 @@ if ( $IP === false ) {
        $IP = realpath( '.' ) ?: dirname( __DIR__ );
 }
 
-require_once "$IP/includes/PreConfigSetup.php";
-
-# Assert that composer dependencies were successfully loaded
-# Purposely no leading \ due to it breaking HHVM RepoAuthorative mode
-# PHP works fine with both versions
-# See https://github.com/facebook/hhvm/issues/5833
-if ( !interface_exists( 'Psr\Log\LoggerInterface' ) ) {
-       $message = (
-               'MediaWiki requires the <a href="https://github.com/php-fig/log">PSR-3 logging ' .
-               "library</a> to be present. This library is not embedded directly in MediaWiki's " .
-               "git repository and must be installed separately by the end user.\n\n" .
-               'Please see <a href="https://www.mediawiki.org/wiki/Download_from_Git' .
-               '#Fetch_external_libraries">mediawiki.org</a> for help on installing ' .
-               'the required components.'
-       );
-       echo $message;
-       trigger_error( $message, E_USER_ERROR );
-       die( 1 );
-}
-
-# Install a header callback
-MediaWiki\HeaderCallback::register();
-
-if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
-       # Use a callback function to configure MediaWiki
-       call_user_func( MW_CONFIG_CALLBACK );
-} else {
+// If no LocalSettings file exists, try to display an error page
+// (use a callback because it depends on TemplateParser)
+if ( !defined( 'MW_CONFIG_CALLBACK' ) ) {
        if ( !defined( 'MW_CONFIG_FILE' ) ) {
                define( 'MW_CONFIG_FILE', "$IP/LocalSettings.php" );
        }
-
-       # LocalSettings.php is the per site customization file. If it does not exist
-       # the wiki installer needs to be launched or the generated file uploaded to
-       # the root wiki directory. Give a hint, if it is not readable by the server.
        if ( !is_readable( MW_CONFIG_FILE ) ) {
-               require_once "$IP/includes/NoLocalSettings.php";
-               die();
+               function wfWebStartNoLocalSettings() {
+                       # LocalSettings.php is the per-site customization file. If it does not exist
+                       # the wiki installer needs to be launched or the generated file uploaded to
+                       # the root wiki directory. Give a hint, if it is not readable by the server.
+                       global $IP;
+                       require_once "$IP/includes/NoLocalSettings.php";
+                       die();
+               }
+               define( 'MW_CONFIG_CALLBACK', 'wfWebStartNoLocalSettings' );
        }
-
-       # Include site settings. $IP may be changed (hopefully before the AutoLoader is invoked)
-       require_once MW_CONFIG_FILE;
 }
 
-# Initialise output buffering
-# Check that there is no previous output or previously set up buffers, because
-# that would cause us to potentially mix gzip and non-gzip output, creating a
-# big mess.
-if ( ob_get_level() == 0 ) {
-       require_once "$IP/includes/OutputHandler.php";
-       ob_start( 'wfOutputHandler' );
+// Custom setup for WebStart entry point
+if ( !defined( 'MW_SETUP_CALLBACK' ) ) {
+       function wfWebStartSetup() {
+               # Initialise output buffering
+               # Check that there is no previous output or previously set up buffers, because
+               # that would cause us to potentially mix gzip and non-gzip output, creating a
+               # big mess.
+               global $IP;
+               if ( ob_get_level() == 0 ) {
+                       require_once "$IP/includes/OutputHandler.php";
+                       ob_start( 'wfOutputHandler' );
+               }
+       }
+       define( 'MW_SETUP_CALLBACK', 'wfWebStartSetup' );
 }
 
 require_once "$IP/includes/Setup.php";
index fe84852..a9a504d 100644 (file)
@@ -385,6 +385,9 @@ class HistoryPager extends ReverseChronologicalPager {
        /** @var bool Whether to show the tag editing UI */
        protected $showTagEditUI;
 
+       /** @var string */
+       private $tagFilter;
+
        /**
         * @param HistoryAction $historyPage
         * @param string $year
index d8c8bc3..be10ae4 100644 (file)
@@ -236,7 +236,13 @@ class RawAction extends FormlessAction {
                        }
                }
 
-               $allowedCTypes = [ 'text/x-wiki', 'text/javascript', 'text/css', 'application/x-zope-edit' ];
+               $allowedCTypes = [
+                       'text/x-wiki',
+                       'text/javascript',
+                       'text/css',
+                       'application/x-zope-edit',
+                       'application/json'
+               ];
                if ( $ctype == '' || !in_array( $ctype, $allowedCTypes ) ) {
                        $ctype = 'text/x-wiki';
                }
index 7cbd353..15b94fb 100644 (file)
@@ -329,6 +329,8 @@ class ApiParse extends ApiBase {
                        $context->setOutput( $outputPage );
 
                        if ( $skin ) {
+                               // Based on OutputPage::headElement()
+                               $skin->setupSkinUserCss( $outputPage );
                                // Based on OutputPage::output()
                                foreach ( $skin->getDefaultModules() as $group ) {
                                        $outputPage->addModules( $group );
index 35f93e0..4b8ce7f 100644 (file)
@@ -93,6 +93,7 @@ class ApiPurge extends ApiBase {
                                                $updates = $content->getSecondaryDataUpdates(
                                                        $title, null, $forceRecursiveLinkUpdate, $p_result );
                                                foreach ( $updates as $update ) {
+                                                       $update->setCause( 'api-purge', $this->getUser()->getName() );
                                                        DeferredUpdates::addUpdate( $update, DeferredUpdates::PRESEND );
                                                }
 
index e637be3..4e102cf 100644 (file)
        "apihelp-paraminfo-example-1": "<kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd>, and <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> に関する情報を表示する。",
        "apihelp-parse-param-title": "文字列が属するページのページ名。これを省略する場合、必ず <var>$1contentmodel</var> を指定しなければなりません。また、その場合 [[API]] がページ名として使用されます。",
        "apihelp-parse-param-text": "構文解析する文字列。コンテンツ・モデルを制御するためには<var>$1title</var> または <var>$1contentmodel</var> を使用してください。",
-       "apihelp-parse-param-summary": "æ§\8bæ\96\87解æ\9e\90ã\81®ã\81\9fã\82\81ã\81®要約",
+       "apihelp-parse-param-summary": "æ§\8bæ\96\87解æ\9e\90ã\81\99ã\82\8b要約",
        "apihelp-parse-param-page": "このページの内容を構文解析します。<var>$1text</var> および <var>$1title</var> とは同時に使用できません。",
        "apihelp-parse-param-pageid": "このページの内容を構文解析する。<var>$1page</var> をオーバーライドします。",
        "apihelp-parse-param-redirects": "もし <var>$1page</var> や <var>$1pageid</var> に転送ページが指定された場合、それを解決する。",
index 105a19c..ea5f2dd 100644 (file)
@@ -13,7 +13,8 @@
                        "烈羽",
                        "Corainn",
                        "A2093064",
-                       "Wwycheuk"
+                       "Wwycheuk",
+                       "Wbxshiori"
                ]
        },
        "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|說明文件]]\n* [[mw:Special:MyLanguage/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:Special:MyLanguage/API:Errors_and_warnings|API: 錯誤與警告]]。\n\n<strong>測試:</strong>要簡化API請求的測試過程,請見[[Special:ApiSandbox]]。",
        "apihelp-protect-param-protections": "保護層級清單,格式為 <kbd>action=level</kbd> (例如 <kbd>edit=sysop</kbd>)。<kbd>all</kbd> 層級代表所有人都可以進行行動,亦即無限制。\n\n<strong>注意:</strong>未列入清單項目的限制皆會移除。",
        "apihelp-protect-param-expiry": "期限時間戳記,若只設定一個時間戳記,該時間戳記將會套用至所有的保護層級。 使用 <kbd>infinite</kbd>、<kbd>indefinite</kbd>、<kbd>infinity</kbd> 或 <kbd>never</kbd> 來設定保護層級期限為永遠。",
        "apihelp-protect-param-reason": "(解除)保護的原因。",
+       "apihelp-protect-param-tags": "修改標籤以套用於保護日誌裡的項目。",
+       "apihelp-protect-param-cascade": "啟用連鎖保護(也就是保護包含於此頁面的頁面)。如果所有提供的保護等級不支援連鎖,就將其忽略。",
+       "apihelp-protect-param-watch": "如果被設定,就將被(解除)保護的頁面加至目前使用者的監視列表。",
+       "apihelp-protect-param-watchlist": "無條件地將該頁面加入至或移除自目前使用者的監視列表、使用偏好設定或不更改監視。",
+       "apihelp-protect-example-protect": "保護一個頁面。",
+       "apihelp-purge-summary": "為指定標題清除快取。",
+       "apihelp-purge-example-generator": "重新整理主要命名空間的前10個頁面。",
        "apihelp-query-summary": "擷取來自及有關MediaWiki的數據。",
        "apihelp-query+allcategories-param-limit": "要回傳的分類數量。",
        "apihelp-query+allfileusages-param-limit": "要回傳的項目總數。",
index f7a7ec1..7488fba 100644 (file)
@@ -77,9 +77,19 @@ class CheckBlocksSecondaryAuthenticationProvider extends AbstractSecondaryAuthen
        public function testUserForCreation( $user, $autocreate, array $options = [] ) {
                $block = $user->isBlockedFromCreateAccount();
                if ( $block ) {
+                       if ( $block->mReason ) {
+                               $reason = $block->mReason;
+                       } else {
+                               $msg = \Message::newFromKey( 'blockednoreason' );
+                               if ( !\RequestContext::getMain()->getUser()->isSafeToLoad() ) {
+                                       $msg->inContentLanguage();
+                               }
+                               $reason = $msg->text();
+                       }
+
                        $errorParams = [
                                $block->getTarget(),
-                               $block->mReason ?: \Message::newFromKey( 'blockednoreason' )->text(),
+                               $reason,
                                $block->getByName()
                        ];
 
index efda596..23f02de 100644 (file)
@@ -551,6 +551,8 @@ class IcuCollation extends Collation {
                $versionPrefix = substr( $icuVersion, 0, 3 );
                // Source: http://site.icu-project.org/download
                $map = [
+                       '59.' => '9.0',
+                       '58.' => '9.0',
                        '57.' => '8.0',
                        '56.' => '8.0',
                        '55.' => '7.0',
index d2d8bd7..ed9a746 100644 (file)
 abstract class DataUpdate implements DeferrableUpdate {
        /** @var mixed Result from LBFactory::getEmptyTransactionTicket() */
        protected $ticket;
+       /** @var string Short update cause action description */
+       protected $causeAction = 'unknown';
+       /** @var string Short update cause user description */
+       protected $causeAgent = 'unknown';
 
        public function __construct() {
                // noop
@@ -41,6 +45,29 @@ abstract class DataUpdate implements DeferrableUpdate {
                $this->ticket = $ticket;
        }
 
+       /**
+        * @param string $action Action type
+        * @param string $user User name
+        */
+       public function setCause( $action, $user ) {
+               $this->causeAction = $action;
+               $this->causeAgent = $user;
+       }
+
+       /**
+        * @return string
+        */
+       public function getCauseAction() {
+               return $this->causeAction;
+       }
+
+       /**
+        * @return string
+        */
+       public function getCauseAgent() {
+               return $this->causeAgent;
+       }
+
        /**
         * Convenience method, calls doUpdate() on every DataUpdate in the array.
         *
index dfe89ba..c27826d 100644 (file)
@@ -306,10 +306,13 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
         * using the job queue.
         */
        protected function queueRecursiveJobs() {
-               self::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks' );
+               $action = $this->getCauseAction();
+               $agent = $this->getCauseAgent();
+
+               self::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks', $action, $agent );
                if ( $this->mTitle->getNamespace() == NS_FILE ) {
                        // Process imagelinks in case the title is or was a redirect
-                       self::queueRecursiveJobsForTable( $this->mTitle, 'imagelinks' );
+                       self::queueRecursiveJobsForTable( $this->mTitle, 'imagelinks', $action, $agent );
                }
 
                $bc = $this->mTitle->getBacklinkCache();
@@ -320,7 +323,13 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
                // Which ever runs first generally no-ops the other one.
                $jobs = [];
                foreach ( $bc->getCascadeProtectedLinks() as $title ) {
-                       $jobs[] = RefreshLinksJob::newPrioritized( $title, [] );
+                       $jobs[] = RefreshLinksJob::newPrioritized(
+                               $title,
+                               [
+                                       'causeAction' => $action,
+                                       'causeAgent' => $agent
+                               ]
+                       );
                }
                JobQueueGroup::singleton()->push( $jobs );
        }
@@ -330,8 +339,12 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
         *
         * @param Title $title Title to do job for
         * @param string $table Table to use (e.g. 'templatelinks')
+        * @param string $action Triggering action
+        * @param string $userName Triggering user name
         */
-       public static function queueRecursiveJobsForTable( Title $title, $table ) {
+       public static function queueRecursiveJobsForTable(
+               Title $title, $table, $action = 'unknown', $userName = 'unknown'
+       ) {
                if ( $title->getBacklinkCache()->hasLinks( $table ) ) {
                        $job = new RefreshLinksJob(
                                $title,
@@ -340,7 +353,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
                                        'recursive' => true,
                                ] + Job::newRootJobParams( // "overall" refresh links job info
                                        "refreshlinks:{$table}:{$title->getPrefixedText()}"
-                               )
+                               ) + [ 'causeAction' => $action, 'causeAgent' => $userName ]
                        );
 
                        JobQueueGroup::singleton()->push( $job );
@@ -1156,6 +1169,8 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
                                        'useRecursiveLinksUpdate' => $this->mRecursive,
                                        'triggeringUser' => $userInfo,
                                        'triggeringRevisionId' => $triggeringRevisionId,
+                                       'causeAction' => $this->getCauseAction(),
+                                       'causeAgent' => $this->getCauseAgent()
                                ],
                                [ 'removeDuplicates' => true ],
                                $this->getTitle()
index 410a794..3271c96 100644 (file)
@@ -1646,7 +1646,12 @@ class LocalFile extends File {
                                                );
                                        } else {
                                                # Update backlink pages pointing to this title if created
-                                               LinksUpdate::queueRecursiveJobsForTable( $this->getTitle(), 'imagelinks' );
+                                               LinksUpdate::queueRecursiveJobsForTable(
+                                                       $this->getTitle(),
+                                                       'imagelinks',
+                                                       'upload-image',
+                                                       $user->getName()
+                                               );
                                        }
 
                                        $this->prerenderThumbnails();
@@ -2463,7 +2468,7 @@ class LocalFileDeleteBatch {
        }
 
        function doDBDeletes() {
-               global $wgUpdateCompatibleMetadata;
+               global $wgCommentTableSchemaMigrationStage;
 
                $dbw = $this->file->repo->getMasterDB();
                list( $oldRels, $deleteCurrent ) = $this->getOldRels();
@@ -2478,7 +2483,7 @@ class LocalFileDeleteBatch {
 
                if ( $deleteCurrent ) {
                        $dbw->delete( 'image', [ 'img_name' => $this->file->getName() ], __METHOD__ );
-                       if ( $wgUpdateCompatibleMetadata > MIGRATION_OLD ) {
+                       if ( $wgCommentTableSchemaMigrationStage > MIGRATION_OLD ) {
                                $dbw->delete(
                                        'image_comment_temp', [ 'imgcomment_name' => $this->file->getName() ], __METHOD__
                                );
index 012b477..e99ea7c 100644 (file)
@@ -893,10 +893,13 @@ abstract class Installer {
         * @return bool
         */
        protected function envCheckDiff3() {
-               $names = [ "gdiff3", "diff3", "diff3.exe" ];
-               $versionInfo = [ '$1 --version 2>&1', 'GNU diffutils' ];
+               $names = [ "gdiff3", "diff3" ];
+               if ( wfIsWindows() ) {
+                       $names[] = 'diff3.exe';
+               }
+               $versionInfo = [ '--version', 'GNU diffutils' ];
 
-               $diff3 = self::locateExecutableInDefaultPaths( $names, $versionInfo );
+               $diff3 = ExecutableFinder::findInDefaultPaths( $names, $versionInfo );
 
                if ( $diff3 ) {
                        $this->setVar( 'wgDiff3', $diff3 );
@@ -913,9 +916,9 @@ abstract class Installer {
         * @return bool
         */
        protected function envCheckGraphics() {
-               $names = [ wfIsWindows() ? 'convert.exe' : 'convert' ];
-               $versionInfo = [ '$1 -version', 'ImageMagick' ];
-               $convert = self::locateExecutableInDefaultPaths( $names, $versionInfo );
+               $names = wfIsWindows() ? 'convert.exe' : 'convert';
+               $versionInfo = [ '-version', 'ImageMagick' ];
+               $convert = ExecutableFinder::findInDefaultPaths( $names, $versionInfo );
 
                $this->setVar( 'wgImageMagickConvertCommand', '' );
                if ( $convert ) {
@@ -939,10 +942,10 @@ abstract class Installer {
         * @return bool
         */
        protected function envCheckGit() {
-               $names = [ wfIsWindows() ? 'git.exe' : 'git' ];
-               $versionInfo = [ '$1 --version', 'git version' ];
+               $names = wfIsWindows() ? 'git.exe' : 'git';
+               $versionInfo = [ '--version', 'git version' ];
 
-               $git = self::locateExecutableInDefaultPaths( $names, $versionInfo );
+               $git = ExecutableFinder::findInDefaultPaths( $names, $versionInfo );
 
                if ( $git ) {
                        $this->setVar( 'wgGitBin', $git );
@@ -1191,88 +1194,6 @@ abstract class Installer {
                $this->setVar( 'IP', $IP );
        }
 
-       /**
-        * Get an array of likely places we can find executables. Check a bunch
-        * of known Unix-like defaults, as well as the PATH environment variable
-        * (which should maybe make it work for Windows?)
-        *
-        * @return array
-        */
-       protected static function getPossibleBinPaths() {
-               return array_merge(
-                       [ '/usr/bin', '/usr/local/bin', '/opt/csw/bin',
-                               '/usr/gnu/bin', '/usr/sfw/bin', '/sw/bin', '/opt/local/bin' ],
-                       explode( PATH_SEPARATOR, getenv( 'PATH' ) )
-               );
-       }
-
-       /**
-        * Search a path for any of the given executable names. Returns the
-        * executable name if found. Also checks the version string returned
-        * by each executable.
-        *
-        * Used only by environment checks.
-        *
-        * @param string $path Path to search
-        * @param array $names Array of executable names
-        * @param array|bool $versionInfo False or array with two members:
-        *   0 => Command to run for version check, with $1 for the full executable name
-        *   1 => String to compare the output with
-        *
-        * If $versionInfo is not false, only executables with a version
-        * matching $versionInfo[1] will be returned.
-        * @return bool|string
-        */
-       public static function locateExecutable( $path, $names, $versionInfo = false ) {
-               if ( !is_array( $names ) ) {
-                       $names = [ $names ];
-               }
-
-               foreach ( $names as $name ) {
-                       $command = $path . DIRECTORY_SEPARATOR . $name;
-
-                       MediaWiki\suppressWarnings();
-                       $file_exists = is_executable( $command );
-                       MediaWiki\restoreWarnings();
-
-                       if ( $file_exists ) {
-                               if ( !$versionInfo ) {
-                                       return $command;
-                               }
-
-                               $file = str_replace( '$1', wfEscapeShellArg( $command ), $versionInfo[0] );
-                               if ( strstr( wfShellExec( $file ), $versionInfo[1] ) !== false ) {
-                                       return $command;
-                               }
-                       }
-               }
-
-               return false;
-       }
-
-       /**
-        * Same as locateExecutable(), but checks in getPossibleBinPaths() by default
-        * @see locateExecutable()
-        * @param array $names Array of possible names.
-        * @param array|bool $versionInfo Default: false or array with two members:
-        *   0 => Command to run for version check, with $1 for the full executable name
-        *   1 => String to compare the output with
-        *
-        * If $versionInfo is not false, only executables with a version
-        * matching $versionInfo[1] will be returned.
-        * @return bool|string
-        */
-       public static function locateExecutableInDefaultPaths( $names, $versionInfo = false ) {
-               foreach ( self::getPossibleBinPaths() as $path ) {
-                       $exe = self::locateExecutable( $path, $names, $versionInfo );
-                       if ( $exe !== false ) {
-                               return $exe;
-                       }
-               }
-
-               return false;
-       }
-
        /**
         * Checks if scripts located in the given directory can be executed via the given URL.
         *
index 492da03..4d6095c 100644 (file)
@@ -17,7 +17,7 @@
        "config-localsettings-badkey": "Sartu duzun eguneratze-gakoa ez da zuzena.",
        "config-upgrade-key-missing": "Detektatu egin da dagoeneko MediaWiki instalatu dagoela.\n\nInstalazio hau gaurkotzeko, jarri hurrengo lerroa behekoaldean <code> LocalSettings.php </code>\n\n$1",
        "config-localsettings-incomplete": "Existitzen den <code>LocalSettings.php</code> bukatu gabe dagoela ematen du.\n$1 aldagaia ez dago finkatuta.\nMesedez, aldatu <code>LocalSettings.php</code>, aldagaia aldatzeko eta gero klikatu {{int:Config-continue}}\".",
-       "config-localsettings-connection-error": "Arazo bat sortu da datu-basearekin konektatzen <code>LocalSettings.php</code>-ean zehaztutako ezarpenak erabilita. Mesedez konpondu ezarpen hauek eta berriro saiatu.",
+       "config-localsettings-connection-error": "Arazo bat sortu da datu-basearekin konektatzen <code>LocalSettings.php</code>-ean zehaztutako ezarpenak erabilita. Mesedez konpondu ezarpen hauek eta berriro saiatu.\n\n$1",
        "config-session-error": "Saio hasierako errorea: $1",
        "config-session-expired": "Saioren informazio galdu egin dela ematen du.\nSaioak konfiguratutak daude $1 -eko iraupenerako.\nHau handitu ahal duzu <code>code>session.gc_maxlifetime</code> jartzen  php.ini -n.\n\nBerrabiatu instalazio prozesua.",
        "config-no-session": "Saioren informazio galdu egin da!\nEgiaztatu zure php.ini eta ziurtatu <code>session.save_path</code> egoki zaion direktorioan kokatu dagoela.",
@@ -70,6 +70,9 @@
        "config-diff3-bad": "GNU diff3 ez da aurkitu.",
        "config-git": "Git bertsio-kontrol software aurkitu da: <code>$1</code>",
        "config-git-bad": "Git bertsio-kontrol software ez da aurkitu.",
+       "config-imagemagick": "ImageMagick aurkitu da: <code>$1</code>.\nIrudi koadro txikiak gaitu egingo dira igoerak gaitzen badituzu.",
+       "config-gd": "Liburutegiko GD grafiko integratua aurkitu da.\nIrudi koadro txikiak gaitu egingo dira igoerak gaitzen badituzu.",
+       "config-no-scaling": "Ezin izan da GD liburutegia edo ImageMagick aurkitu.\nIrudiaren miniatura desgaitu egingo da.",
        "config-no-uri": "<strong>Errore:</strong> Ezin izan da zehaztu URI. Instalazio geldiarazi egin da.",
        "config-no-cli-uri": "<strong>Oharra</strong>. Ez da zehaztu <code>--scriptpath</code>, erabiltzen estandar <code>$1</code> .",
        "config-using-server": "\"<nowiki>$1</nowiki>\" zerbitzari-izena erabiltzen.",
        "config-brokenlibxml": "Zure sistemak dauka PHP-ko eta libxml2-ko konbinazio akastun bat eta eragin ahal du korrupzioa datarekin MediaWikin eta beste web aplikazioetan.\nAktualizatu libxml2 2.7.3-era edo berrietara ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]).\nInstalazioa geldiarazi egin da.",
        "config-db-type": "Datu-base mota:",
        "config-db-host": "Datu-basearen zerbitzaria:",
+       "config-db-host-help": "Zure datu-basearen zerbitzaria beste zerbitzari batean badago, sartu ostalariaren izena edo IP helbidea hemen.\n\nPartekatutako web-ostatua erabiltzen ari bazara, zure ostalaritza-hornitzaileak dokumentazio-ostalariaren izen egokia eman beharko lizuke.\n\nWindows zerbitzari batean instalatzen bazara eta MySQL erabiliz, \"localhost\" agian ez du zerbitzariaren izenerako funtzionatuko. Ez badago, saiatu \"127.0.0.1\" tokiko IP helbideetarako.\n\nPostgreSQL erabiltzen ari bazara, utzi eremu hau hutsik Unix socket bidez konektatzeko.",
        "config-db-host-oracle": "Datu-baseko TNS:",
        "config-db-wiki-settings": "Wiki hau identifikatu",
        "config-db-name": "Datu-base izena:",
        "config-db-name-help": "Aukeratu zure Wikia identifikatzen duen izena.\nEzin dira espazioak eabili.\n\nErabiltzen ari bazara web hosting partekatua, hostin-eko hornitzaileak emango dizu datu-basearen izen espezifikoa edo kontrol panel baten bitzrtez zure datu-basea sortzea utziko dizu.",
        "config-db-name-oracle": "Datu-baseko eskema:",
+       "config-db-account-oracle-warn": "Hiru euskarri onartzen dira Oracle datu-basearen euskarri gisa instalatzeko:\n\nInstalazio-prozesuaren zati gisa datu-basearen kontua sortu nahi baduzu, hornitu kontu bat SYSDBA rol datu-baseko kontu gisa instalatzeko eta webgunerako sarbide konturako nahi dituzun kredentzialak zehazteko; bestela, web-sarbideen kontua eskuz sortu eta hornitu kontu hori bakarrik (eskemaren objektuak sortzeko baimenak behar baditu) edo bi kontu ezberdin, bi pribilegio sortu eta sarbide mugatua eskaintzen dutenak.\n\nBeharrezko baimenak dituen kontu bat sortzeko gidoia instalazio honen \"mantentze/orakulu/\" direktorioan aurki daiteke. Kontuan izan kontu mugatu bat erabiliz kontu lehenetsiarekin mantentze-gaitasun guztiak desgaituko dituela.",
        "config-db-install-account": "Instalazio prozesuan erabili erabiltzaile kontua.",
        "config-db-username": "Datu-base lankide izena:",
        "config-db-password": "Datu-base pasahitza:",
        "config-db-schema-help": "Patroi hau normalean egokia da. Bakarrik aldatu beharrezkoa bada.",
        "config-pg-test-error": "Ezin da datu-basearekin konektatu <strong>$1</strong>: $2",
        "config-sqlite-dir": "SQLite -eko informazioaren direktorioa:",
+       "config-oracle-def-ts": "Taula-toki lehenetsia:",
        "config-oracle-temp-ts": "Aldi baterako taula:",
        "config-type-mysql": "MySQL (edo bateragarria)",
        "config-type-postgres": "PostgreSQL",
        "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki-k onartzen du hurrengo datu-base sistemak:\n\n$1\n\nListan ez baduzu ikusten erabili nahi duzun sistema, jarraitu goiko argibideak aktibatzeko.",
+       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] MediaWikiren lehenengoko helburua da eta primeran babesturik dago. MediaWikik ere [{{int:version-db-mariadb-url}} MariaDB]-rekin egiten du lan baita [{{int:version-db-percona-url}} Percona Server]-kin, MySQL-rekin balio dutenak. ([http://www.php.net/manual/en/mysqli.installation.php How to compile PHP with MySQL support])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] iturburu irekiko datu basea sistema famatua da MySQL-rako alternatiba bezala. ([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] oso ondo onartzen duen datu-basearen sistema arina da.\n ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], uses PDO)",
+       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] enpresa komertzial baten datu-basea da. ([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] Windows-entzako enpresa komertzial baten datu-basea da.  ([http://www.php.net/manual/en/sqlsrv.installation.php How to compile PHP with SQLSRV support])",
        "config-header-mysql": "MySQL hobespenak",
        "config-header-postgres": "PostgreSQL hobespenak",
        "config-header-sqlite": "SQLite hobespenak",
        "config-missing-db-name": "\"{{int:config-db-name}}\"-rentzako balioa sartu behar duzu.",
        "config-missing-db-host": "\"{{int:config-db-host}}\"-rentzako balioa sartu behar duzu.",
        "config-missing-db-server-oracle": "\"{{int:config-db-host-oracle}}\"-rentzako balioa sartu behar duzu.",
+       "config-invalid-db-server-oracle": "\"$1\" TNS datu basea baliogabea.\nErabili \"TNS izena\" edo \"Konektagarritasun erraza\" katea ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]).",
        "config-connection-error": "$1\n\nHost-a, erabiltzaile izena eta pasahitza egiaztatu eta saiatu berriro.",
        "config-db-sys-create-oracle": "Instalatzaileak bakarrik jasaten du SYSBDA kontu bat erabiltzaile kontu berri bat sortzeko.",
        "config-db-sys-user-exists-oracle": "$1 erabiltzaile kontua dagoeneko existitzen da. SYSDBA kontu berri bat sortzeko erabili daiteke soilik!",
        "config-sqlite-connection-error": "$1.\n\nDatu direktorioa eta datu-basea egiaztatu eta berriro saiatu.",
        "config-sqlite-readonly": "Ezin da idatzi <code>$1</code> fitxategian.",
        "config-sqlite-cant-create-db": "Ezin izan da <code>$1</code> datu-basearen artxiboa sortu.",
+       "config-sqlite-fts3-downgrade": "PHPn FTS3 laguntza falta da, taulen gradua jeisten.",
+       "config-can-upgrade": "Datu base honetan MediaWiki taulak daude.\nMediaWiki $1ra graduz igotzeko, <strong>Jarraitu</strong> klikatu.",
        "config-upgrade-done-no-regenerate": "Eguneratze prozesua amaitu egin da.\n\nHasi ahal zara [ $1 wikia arabiltzen]",
        "config-regenerate": "Birsortu LocalSettings.php →",
        "config-show-table-status": "<code>SHOW TABLE STATUS</code> kontsulta huts egin du!",
        "config-mysql-engine": "Biltegiratze motorea:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
+       "config-mysql-myisam-dep": "<strong>Oharra:</strong> MyISAM MySQL biltegiratze-motor gisa aukeratu duzu, MediaWikirekin erabiltzeko gomendagarria ez dena honengatik:\n*taula blokeoak direla-eta gauza gutxi onartu ohi du\n*beste motore batzuek baino ustelkeria gehiago izateko aukerak ditu\n*MediaWiki-ren kode baseak ez du beti kudeatzen MyISAM behar bezala\n\nZure MySQL instalazioa InnoDB onartzen badu, hori aukeratzeko gomendatzen da.\nZure MySQL instalazioa InnoDB ez badu onartzen, baliteke bertsioa berritzeko ordua izatea.",
+       "config-mysql-only-myisam-dep": "<strong> Oharra: </strong> MyISAM makinaren MySQL biltegiratze motarako bakarra da, eta hau ez da MediaWiki-rekin erabiltzeko gomendatzen, honengatik:\n* maiztasunez taula blokeoek konkurrentzia ez dute onartzen \n* Beste motore batzuek baino ustelkeria gehiago izaten dute\n* MediaWiki-ren kodekak ez du beti kudeatzen MyISAM behar bezala\n\nZure MySQL instalazioak ez du InnoDB onartzen, agian bertsio berritzeko ordua da.",
        "config-mysql-binary": "Bitarra",
        "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "Autentifikazio mota:",
index 13e7a6b..e1625fb 100644 (file)
@@ -79,6 +79,7 @@
        "config-no-cli-uploads-check": "'''Attention:''' Le directorio predefinite pro files incargate (<code>$1</code>) non es verificate contra le vulnerabilitate\nal execution arbitrari de scripts durante le installation de CLI.",
        "config-brokenlibxml": "Vostre systema ha un combination de versiones de PHP e libxml2 que es defectuose e pote causar corruption celate de datos in MediaWiki e altere applicationes web.\nActualisa a libxml2 2.7.3 o plus recente ([https://bugs.php.net/bug.php?id=45996 problema reportate presso PHP]).\nInstallation abortate.",
        "config-suhosin-max-value-length": "Suhosin es installate e limita parametro <code>length</code> de GET a $1 bytes.\nLe componente ResourceLoader de MediaWiki va contornar iste limite, ma isto prejudicara le rendimento.\nSi possibile, tu deberea mitter <code>suhosin.get.max_value_length</code> a 1024 o superior in <code>php.ini</code>, e mitter <code>$wgResourceLoaderMaxQueryLength</code> al mesme valor in <code>LocalSettings.php</code>.",
+       "config-using-32bit": "<strong>Attention:</strong> tu systema pare operar con integres de 32 bits. Isto [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit non es recommendate].",
        "config-db-type": "Typo de base de datos:",
        "config-db-host": "Servitor de base de datos:",
        "config-db-host-help": "Si tu servitor de base de datos es in un altere servitor, entra hic le nomine o adresse IP del servitor.\n\nSi tu usa un servitor web usate in commun, tu providitor deberea dar te le correcte nomine de servitor in su documentation.\n\nSi tu face le installation in un servitor Windows e usa MySQL, le nomine \"localhost\" possibilemente non functiona como nomine de servitor. In tal caso, essaya \"127.0.0.1\", i.e. le adresse IP local.\n\nSi tu usa PostgreSQL, lassa iste campo vacue pro connecter via un \"socket\" de Unix.",
        "config-help-tooltip": "clicca pro displicar",
        "config-nofile": "Le file \"$1\" non poteva esser trovate. Ha illo essite delite?",
        "config-extension-link": "Sapeva tu que tu wiki supporta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nTu pote explorar le [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensiones per category] o le [https://www.mediawiki.org/wiki/Extension_Matrix matrice de extensiones] pro vider le lista complete de extensiones.",
+       "config-skins-screenshots": "$1 (capturas de schermo: $2)",
+       "config-screenshot": "captura de schermo",
        "mainpagetext": "<strong>MediaWiki ha essite installate.</strong>",
        "mainpagedocfooter": "Consulta le [https://meta.wikimedia.org/wiki/Help:Contents Guida del usator] pro information sur le uso del software wiki.\n\n== Pro initiar ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de configurationes]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ a proposito de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de diffusion pro annuncios de nove versiones de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducer MediaWiki in tu lingua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Como combatter le spam in tu wiki]"
 }
index ef286e3..f0c121c 100644 (file)
        "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>\nMediaWikiのインストールに成功しました。\n\n<code>LocalSettings.php</code>ファイルが生成されました。\nこのファイルはすべての設定を含んでいます。\n\nこれをダウンロードして、ウィキをインストールした基準ディレクトリ (index.phpと同じディレクトリ) に設置する必要があります。ダウンロードは自動的に開始されるはずです。\n\nダウンロードが開始されていない場合、またはダウンロードをキャンセルした場合は、下記のリンクをクリックしてダウンロードを再開できます:\n\n$3\n\n<strong>注意:</strong> この生成された設定ファイルをダウンロードせずにインストールを終了すると、このファイルは利用できなくなります。\n\n上記の作業が完了すると、<strong>[$2 ウィキに入る]</strong>ことができます。",
        "config-help-tooltip": "クリックで展開",
        "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 カテゴリ別で拡張機能を見る]か[https://www.mediawiki.org/wiki/Extension_Matrix 拡張機能のマトリックス]で拡張機能すべてのリストをご覧になれます。",
+       "config-skins-screenshots": "$1 (スクリーンショット: $2)",
+       "config-screenshot": "スクリーンショット",
        "mainpagetext": "<strong>MediaWiki はインストール済みです。</strong>",
        "mainpagedocfooter": "ウィキソフトウェアの使い方に関する情報は[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents 利用者案内]を参照してください。\n\n== はじめましょう ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/ja 設定の一覧]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ja MediaWiki よくある質問と回答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation/ja MediaWiki のあなたの言語へのローカライズ]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam あなたのウィキでスパムと戦う方法を学ぶ]"
 }
diff --git a/includes/installer/i18n/tokipona.json b/includes/installer/i18n/tokipona.json
deleted file mode 100644 (file)
index 348380f..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-       "@metadata": {
-               "authors": [
-                       "Robin0van0der0vliet"
-               ]
-       },
-       "config-page-language": "toki"
-}
index 51e964d..8854c65 100644 (file)
@@ -53,6 +53,7 @@ class RefreshLinksJob extends Job {
                        // Multiple pages per job make matches unlikely
                        !( isset( $params['pages'] ) && count( $params['pages'] ) != 1 )
                );
+               $this->params += [ 'causeAction' => 'unknown', 'causeAgent' => 'unknown' ];
        }
 
        /**
@@ -102,6 +103,9 @@ class RefreshLinksJob extends Job {
                        // Carry over information for de-duplication
                        $extraParams = $this->getRootJobParams();
                        $extraParams['triggeredRecursive'] = true;
+                       // Carry over cause information for logging
+                       $extraParams['causeAction'] = $this->params['causeAction'];
+                       $extraParams['causeAgent'] = $this->params['causeAgent'];
                        // Convert this into no more than $wgUpdateRowsPerJob RefreshLinks per-title
                        // jobs and possibly a recursive RefreshLinks job for the rest of the backlinks
                        $jobs = BacklinkJobUtils::partitionBacklinkJob(
@@ -254,6 +258,8 @@ class RefreshLinksJob extends Job {
                $lbFactory->commitAndWaitForReplication( __METHOD__, $ticket );
 
                foreach ( $updates as $update ) {
+                       // Carry over cause in case so the update can do extra logging
+                       $update->setCause( $this->params['causeAction'], $this->params['causeAgent'] );
                        // FIXME: This code probably shouldn't be here?
                        // Needed by things like Echo notifications which need
                        // to know which user caused the links update
@@ -288,6 +294,8 @@ class RefreshLinksJob extends Job {
 
        public function getDeduplicationInfo() {
                $info = parent::getDeduplicationInfo();
+               unset( $info['causeAction'] );
+               unset( $info['causeAgent'] );
                if ( is_array( $info['params'] ) ) {
                        // For per-pages jobs, the job title is that of the template that changed
                        // (or similar), so remove that since it ruins duplicate detection
index 4212ff5..e54e8da 100644 (file)
@@ -714,7 +714,8 @@ class SwiftFileBackend extends FileBackendStore {
 
                /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
-               $this->logger->error( __METHOD__ . ": $path was not stored with SHA-1 metadata." );
+               $this->logger->error( __METHOD__ . ": {path} was not stored with SHA-1 metadata.",
+                       [ 'path' => $path ] );
 
                $objHdrs['x-object-meta-sha1base36'] = false;
 
index 15e5759..0531d7f 100644 (file)
@@ -686,8 +686,11 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         * having to inspect a "current time left" variable (e.g. $curTTL, $curTTLs), a cache
         * regeneration will automatically be triggered using the callback.
         *
-        * The simplest way to avoid stampedes for hot keys is to use
-        * the 'lockTSE' option in $opts. If cache purges are needed, also:
+        * The $ttl argument and "hotTTR" option (in $opts) use time-dependant randomization
+        * to avoid stampedes. Keys that are slow to regenerate and either heavily used
+        * or subject to explicit (unpredictable) purges, may need additional mechanisms.
+        * The simplest way to avoid stampedes for such keys is to use 'lockTSE' (in $opts).
+        * If explicit purges are needed, also:
         *   - a) Pass $key into $checkKeys
         *   - b) Use touchCheckKey( $key ) instead of delete( $key )
         *
@@ -839,11 +842,13 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         *      This is useful if the source of a key is suspected of having possibly changed
         *      recently, and the caller wants any such changes to be reflected.
         *      Default: WANObjectCache::MIN_TIMESTAMP_NONE.
-        *   - hotTTR: Expected time-till-refresh for keys that average ~1 hit/second.
-        *      This should be greater than "ageNew". Keys with higher hit rates will regenerate
-        *      more often. This is useful when a popular key is changed but the cache purge was
-        *      delayed or lost. Seldom used keys are rarely affected by this setting, unless an
-        *      extremely low "hotTTR" value is passed in.
+        *   - hotTTR: Expected time-till-refresh (TTR) for keys that average ~1 hit/second (1 Hz).
+        *      Keys with a hit rate higher than 1Hz will refresh sooner than this TTR and vise versa.
+        *      Such refreshes won't happen until keys are "ageNew" seconds old. The TTR is useful at
+        *      reducing the impact of missed cache purges, since the effect of a heavily referenced
+        *      key being stale is worse than that of a rarely referenced key. Unlike simply lowering
+        *      $ttl, seldomly used keys are largely unaffected by this option, which makes it possible
+        *      to have a high hit rate for the "long-tail" of less-used keys.
         *      Default: WANObjectCache::HOT_TTR.
         *   - lowTTL: Consider pre-emptive updates when the current TTL (seconds) of the key is less
         *      than this. It becomes more likely over time, becoming certain once the key is expired.
@@ -964,6 +969,10 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
 
                // A deleted key with a negative TTL left must be tombstoned
                $isTombstone = ( $curTTL !== null && $value === false );
+               if ( $isTombstone && $lockTSE <= 0 ) {
+                       // Use the INTERIM value for tombstoned keys to reduce regeneration load
+                       $lockTSE = 1;
+               }
                // Assume a key is hot if requested soon after invalidation
                $isHot = ( $curTTL !== null && $curTTL <= 0 && abs( $curTTL ) <= $lockTSE );
                // Use the mutex if there is no value and a busy fallback is given
@@ -1032,7 +1041,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
 
                if ( $lockAcquired ) {
                        // Avoid using delete() to avoid pointless mcrouter broadcasting
-                       $this->cache->changeTTL( self::MUTEX_KEY_PREFIX . $key, 1 );
+                       $this->cache->changeTTL( self::MUTEX_KEY_PREFIX . $key, (int)$preCallbackTime - 60 );
                }
 
                return $value;
@@ -1534,7 +1543,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        }
 
        /**
-        * Check if a key should be regenerated (using random probability)
+        * Check if a key is nearing expiration and thus due for randomized regeneration
         *
         * This returns false if $curTTL >= $lowTTL. Otherwise, the chance
         * of returning true increases steadily from 0% to 100% as the $curTTL
@@ -1751,7 +1760,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                return array_diff( $keys, $keysFound );
        }
 
-               /**
+       /**
         * @param array $keys
         * @param array $checkKeys
         * @return array Map of (cache key => mixed)
index b91bd9a..3767ecc 100644 (file)
@@ -2116,16 +2116,6 @@ class Article implements Page {
                return $this->mPage->doPurge();
        }
 
-       /**
-        * Call to WikiPage function for backwards compatibility.
-        * @see WikiPage::getLastPurgeTimestamp
-        * @deprecated since 1.29
-        */
-       public function getLastPurgeTimestamp() {
-               wfDeprecated( __METHOD__, '1.29' );
-               return $this->mPage->getLastPurgeTimestamp();
-       }
-
        /**
         * Call to WikiPage function for backwards compatibility.
         * @see WikiPage::doViewUpdates
@@ -2648,45 +2638,5 @@ class Article implements Page {
                return $handler->getAutoDeleteReason( $title, $hasHistory );
        }
 
-       /**
-        * @return array
-        *
-        * @deprecated since 1.24, use WikiPage::selectFields() instead
-        */
-       public static function selectFields() {
-               wfDeprecated( __METHOD__, '1.24' );
-               return WikiPage::selectFields();
-       }
-
-       /**
-        * @param Title $title
-        *
-        * @deprecated since 1.24, use WikiPage::onArticleCreate() instead
-        */
-       public static function onArticleCreate( $title ) {
-               wfDeprecated( __METHOD__, '1.24' );
-               WikiPage::onArticleCreate( $title );
-       }
-
-       /**
-        * @param Title $title
-        *
-        * @deprecated since 1.24, use WikiPage::onArticleDelete() instead
-        */
-       public static function onArticleDelete( $title ) {
-               wfDeprecated( __METHOD__, '1.24' );
-               WikiPage::onArticleDelete( $title );
-       }
-
-       /**
-        * @param Title $title
-        *
-        * @deprecated since 1.24, use WikiPage::onArticleEdit() instead
-        */
-       public static function onArticleEdit( $title ) {
-               wfDeprecated( __METHOD__, '1.24' );
-               WikiPage::onArticleEdit( $title );
-       }
-
        // ******
 }
index d0a04c0..146c054 100644 (file)
@@ -88,12 +88,6 @@ class WikiPage implements Page, IDBAccessObject {
         */
        protected $mLinksUpdated = '19700101000000';
 
-       /** @deprecated since 1.29. Added in 1.28 for partial purging, no longer used. */
-       const PURGE_CDN_CACHE = 1;
-       const PURGE_CLUSTER_PCACHE = 2;
-       const PURGE_GLOBAL_PCACHE = 4;
-       const PURGE_ALL = 7;
-
        /**
         * Constructor and clear the article
         * @param Title $title Reference to a Title object.
@@ -512,7 +506,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $cache = ObjectCache::getMainWANInstance();
 
                        return $cache->getWithSetCallback(
-                               $cache->makeKey( 'page', 'content-model', $this->getLatest() ),
+                               $cache->makeKey( 'page-content-model', $this->getLatest() ),
                                $cache::TTL_MONTH,
                                function () {
                                        $rev = $this->getRevision();
@@ -1134,18 +1128,6 @@ class WikiPage implements Page, IDBAccessObject {
                return true;
        }
 
-       /**
-        * Get the last time a user explicitly purged the page via action=purge
-        *
-        * @return string|bool TS_MW timestamp or false
-        * @since 1.28
-        * @deprecated since 1.29. It will always return false.
-        */
-       public function getLastPurgeTimestamp() {
-               wfDeprecated( __METHOD__, '1.29' );
-               return false;
-       }
-
        /**
         * Insert a new empty page record for this article.
         * This *must* be followed up by creating a revision
@@ -2171,6 +2153,7 @@ class WikiPage implements Page, IDBAccessObject {
                                $this->getTitle(), null, $recursive, $editInfo->output
                        );
                        foreach ( $updates as $update ) {
+                               $update->setCause( 'edit-page', $user->getName() );
                                if ( $update instanceof LinksUpdate ) {
                                        $update->setRevision( $revision );
                                        $update->setTriggeringUser( $user );
@@ -2913,7 +2896,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                $dbw->endAtomic( __METHOD__ );
 
-               $this->doDeleteUpdates( $id, $content, $revision );
+               $this->doDeleteUpdates( $id, $content, $revision, $user );
 
                Hooks::run( 'ArticleDeleteComplete', [
                        &$wikiPageBeforeDelete,
@@ -2964,8 +2947,11 @@ class WikiPage implements Page, IDBAccessObject {
         *   the required updates. This may be needed because $this->getContent()
         *   may already return null when the page proper was deleted.
         * @param Revision|null $revision The latest page revision
+        * @param User|null $user The user that caused the deletion
         */
-       public function doDeleteUpdates( $id, Content $content = null, Revision $revision = null ) {
+       public function doDeleteUpdates(
+               $id, Content $content = null, Revision $revision = null, User $user = null
+       ) {
                try {
                        $countable = $this->isCountable();
                } catch ( Exception $ex ) {
@@ -2983,12 +2969,14 @@ class WikiPage implements Page, IDBAccessObject {
                        DeferredUpdates::addUpdate( $update );
                }
 
+               $causeAgent = $user ? $user->getName() : 'unknown';
                // Reparse any pages transcluding this page
-               LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks' );
-
+               LinksUpdate::queueRecursiveJobsForTable(
+                       $this->mTitle, 'templatelinks', 'delete-page', $causeAgent );
                // Reparse any pages including this image
                if ( $this->mTitle->getNamespace() == NS_FILE ) {
-                       LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'imagelinks' );
+                       LinksUpdate::queueRecursiveJobsForTable(
+                               $this->mTitle, 'imagelinks', 'delete-page', $causeAgent );
                }
 
                // Clear caches
index ffc7a7e..5dc0b40 100644 (file)
@@ -450,7 +450,7 @@ class ExtensionProcessor implements Processor {
                        }
                        foreach ( $info['config'] as $key => $val ) {
                                if ( $key[0] !== '@' ) {
-                                       $this->globals["$prefix$key"] = $val;
+                                       $this->addConfigGlobal( "$prefix$key", $val );
                                }
                        }
                }
@@ -478,11 +478,26 @@ class ExtensionProcessor implements Processor {
                                if ( isset( $data['path'] ) && $data['path'] ) {
                                        $value = "$dir/$value";
                                }
-                               $this->globals["$prefix$key"] = $value;
+                               $this->addConfigGlobal( "$prefix$key", $value );
                        }
                }
        }
 
+       /**
+        * Helper function to set a value to a specific global, if it isn't set already.
+        *
+        * @param string $key The config key with the prefix and anything
+        * @param mixed $value The value of the config
+        */
+       private function addConfigGlobal( $key, $value ) {
+               if ( array_key_exists( $key, $this->globals ) ) {
+                       throw new RuntimeException(
+                               "The configuration setting '$key' was already set by another extension,"
+                               . " and cannot be set again." );
+               }
+               $this->globals[$key] = $value;
+       }
+
        protected function extractServiceWiringFiles( $dir, array $info ) {
                if ( isset( $info['ServiceWiringFiles'] ) ) {
                        foreach ( $info['ServiceWiringFiles'] as $path ) {
index ca6e59f..fbd0a24 100644 (file)
@@ -32,7 +32,7 @@ class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
         * @return array
         */
        public function getStyles( ResourceLoaderContext $context ) {
-               $logo = $this->getLogo( $this->getConfig() );
+               $logo = $this->getLogoData( $this->getConfig() );
                $styles = parent::getStyles( $context );
                $this->normalizeStyles( $styles );
 
@@ -42,25 +42,34 @@ class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
                                '; }';
 
                if ( is_array( $logo ) ) {
-                       if ( isset( $logo['1.5x'] ) ) {
-                               $styles[
-                                       '(-webkit-min-device-pixel-ratio: 1.5), ' .
-                                       '(min--moz-device-pixel-ratio: 1.5), ' .
+                       if ( isset( $logo['svg'] ) ) {
+                               $styles['all'][] = '.mw-wiki-logo { ' .
+                                       'background-image: -webkit-linear-gradient(transparent, transparent), ' .
+                                               CSSMin::buildUrlValue( $logo['svg'] ) . '; ' .
+                                       'background-image: linear-gradient(transparent, transparent), ' .
+                                               CSSMin::buildUrlValue( $logo['svg'] ) . ';' .
+                                       'background-size: 135px auto; }';
+                       } else {
+                               if ( isset( $logo['1.5x'] ) ) {
+                                       $styles[
+                                               '(-webkit-min-device-pixel-ratio: 1.5), ' .
+                                               '(min--moz-device-pixel-ratio: 1.5), ' .
                                        '(min-resolution: 1.5dppx), ' .
-                                       '(min-resolution: 144dpi)'
-                               ][] = '.mw-wiki-logo { background-image: ' .
-                               CSSMin::buildUrlValue( $logo['1.5x'] ) . ';' .
-                               'background-size: 135px auto; }';
-                       }
-                       if ( isset( $logo['2x'] ) ) {
-                               $styles[
-                                       '(-webkit-min-device-pixel-ratio: 2), ' .
-                                       '(min--moz-device-pixel-ratio: 2),' .
-                                       '(min-resolution: 2dppx), ' .
-                                       '(min-resolution: 192dpi)'
-                               ][] = '.mw-wiki-logo { background-image: ' .
-                               CSSMin::buildUrlValue( $logo['2x'] ) . ';' .
-                               'background-size: 135px auto; }';
+                                               '(min-resolution: 144dpi)'
+                                       ][] = '.mw-wiki-logo { background-image: ' .
+                                       CSSMin::buildUrlValue( $logo['1.5x'] ) . ';' .
+                                       'background-size: 135px auto; }';
+                               }
+                               if ( isset( $logo['2x'] ) ) {
+                                       $styles[
+                                               '(-webkit-min-device-pixel-ratio: 2), ' .
+                                               '(min--moz-device-pixel-ratio: 2), ' .
+                                               '(min-resolution: 2dppx), ' .
+                                               '(min-resolution: 192dpi)'
+                                       ][] = '.mw-wiki-logo { background-image: ' .
+                                       CSSMin::buildUrlValue( $logo['2x'] ) . ';' .
+                                       'background-size: 135px auto; }';
+                               }
                        }
                }
 
@@ -83,11 +92,21 @@ class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
                }
        }
 
+       /**
+        * @since 1.31
+        * @param Config $conf
+        * @return string|array
+        */
+       protected function getLogoData( Config $conf ) {
+               return static::getLogo( $conf );
+       }
+
        /**
         * @param Config $conf
-        * @return string|array Single url if no variants are defined
-        *  or array of logo urls keyed by dppx in form "<float>x".
-        *  Key "1x" is always defined.
+        * @return string|array Single url if no variants are defined,
+        *  or an array of logo urls keyed by dppx in form "<float>x".
+        *  Key "1x" is always defined. Key "svg" may also be defined,
+        *  in which case variants other than "1x" are omitted.
         */
        public static function getLogo( Config $conf ) {
                $logo = $conf->get( 'Logo' );
@@ -103,18 +122,25 @@ class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
                        '1x' => $logo1Url,
                ];
 
-               // Only 1.5x and 2x are supported
-               if ( isset( $logoHD['1.5x'] ) ) {
-                       $logoUrls['1.5x'] = OutputPage::transformResourcePath(
+               if ( isset( $logoHD['svg'] ) ) {
+                       $logoUrls['svg'] = OutputPage::transformResourcePath(
                                $conf,
-                               $logoHD['1.5x']
-                       );
-               }
-               if ( isset( $logoHD['2x'] ) ) {
-                       $logoUrls['2x'] = OutputPage::transformResourcePath(
-                               $conf,
-                               $logoHD['2x']
+                               $logoHD['svg']
                        );
+               } else {
+                       // Only 1.5x and 2x are supported
+                       if ( isset( $logoHD['1.5x'] ) ) {
+                               $logoUrls['1.5x'] = OutputPage::transformResourcePath(
+                                       $conf,
+                                       $logoHD['1.5x']
+                               );
+                       }
+                       if ( isset( $logoHD['2x'] ) ) {
+                               $logoUrls['2x'] = OutputPage::transformResourcePath(
+                                       $conf,
+                                       $logoHD['2x']
+                               );
+                       }
                }
 
                return $logoUrls;
index 67f68ea..eab31bc 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup SpecialPage
  */
 use MediaWiki\Logger\LoggerFactory;
+use Wikimedia\Rdbms\DBQueryTimeoutError;
 use Wikimedia\Rdbms\ResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
@@ -542,45 +543,57 @@ abstract class ChangesListSpecialPage extends SpecialPage {
 
                $this->considerActionsForDefaultSavedQuery();
 
-               $rows = $this->getRows();
                $opts = $this->getOptions();
-               if ( $rows === false ) {
-                       $rows = new FakeResultWrapper( [] );
-               }
+               try {
+                       $rows = $this->getRows();
+                       if ( $rows === false ) {
+                               $rows = new FakeResultWrapper( [] );
+                       }
 
-               // Used by Structured UI app to get results without MW chrome
-               if ( $this->getRequest()->getVal( 'action' ) === 'render' ) {
-                       $this->getOutput()->setArticleBodyOnly( true );
-               }
+                       // Used by Structured UI app to get results without MW chrome
+                       if ( $this->getRequest()->getVal( 'action' ) === 'render' ) {
+                               $this->getOutput()->setArticleBodyOnly( true );
+                       }
 
-               // Used by "live update" and "view newest" to check
-               // if there's new changes with minimal data transfer
-               if ( $this->getRequest()->getBool( 'peek' ) ) {
+                       // Used by "live update" and "view newest" to check
+                       // if there's new changes with minimal data transfer
+                       if ( $this->getRequest()->getBool( 'peek' ) ) {
                        $code = $rows->numRows() > 0 ? 200 : 204;
-                       $this->getOutput()->setStatusCode( $code );
-                       return;
-               }
+                               $this->getOutput()->setStatusCode( $code );
+                               return;
+                       }
 
-               $batch = new LinkBatch;
-               foreach ( $rows as $row ) {
-                       $batch->add( NS_USER, $row->rc_user_text );
-                       $batch->add( NS_USER_TALK, $row->rc_user_text );
-                       $batch->add( $row->rc_namespace, $row->rc_title );
-                       if ( $row->rc_source === RecentChange::SRC_LOG ) {
-                               $formatter = LogFormatter::newFromRow( $row );
-                               foreach ( $formatter->getPreloadTitles() as $title ) {
-                                       $batch->addObj( $title );
+                       $batch = new LinkBatch;
+                       foreach ( $rows as $row ) {
+                               $batch->add( NS_USER, $row->rc_user_text );
+                               $batch->add( NS_USER_TALK, $row->rc_user_text );
+                               $batch->add( $row->rc_namespace, $row->rc_title );
+                               if ( $row->rc_source === RecentChange::SRC_LOG ) {
+                                       $formatter = LogFormatter::newFromRow( $row );
+                                       foreach ( $formatter->getPreloadTitles() as $title ) {
+                                               $batch->addObj( $title );
+                                       }
                                }
                        }
-               }
-               $batch->execute();
+                       $batch->execute();
+
+                       $this->setHeaders();
+                       $this->outputHeader();
+                       $this->addModules();
+                       $this->webOutput( $rows, $opts );
 
-               $this->setHeaders();
-               $this->outputHeader();
-               $this->addModules();
-               $this->webOutput( $rows, $opts );
+                       $rows->free();
+               } catch ( DBQueryTimeoutError $timeoutException ) {
+                       MWExceptionHandler::logException( $timeoutException );
 
-               $rows->free();
+                       $this->setHeaders();
+                       $this->outputHeader();
+                       $this->addModules();
+
+                       $this->getOutput()->setStatusCode( 500 );
+                       $this->webOutputHeader( 0, $opts );
+                       $this->outputTimeout();
+               }
 
                if ( $this->getConfig()->get( 'EnableWANCacheReaper' ) ) {
                        // Clean up any bad page entries for titles showing up in RC
@@ -791,6 +804,17 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                );
        }
 
+       /**
+        * Add the "timeout" message to the output
+        */
+       protected function outputTimeout() {
+               $this->getOutput()->addHTML(
+                       '<div class="mw-changeslist-timeout">' .
+                       $this->msg( 'recentchanges-timeout' )->parse() .
+                       '</div>'
+               );
+       }
+
        /**
         * Get the database result for this special page instance. Used by ApiFeedRecentChanges.
         *
@@ -1437,16 +1461,26 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        }
 
        /**
-        * Send output to the OutputPage object, only called if not used feeds
+        * Send header output to the OutputPage object, only called if not using feeds
         *
-        * @param ResultWrapper $rows Database rows
+        * @param int $rowCount Number of database rows
         * @param FormOptions $opts
         */
-       public function webOutput( $rows, $opts ) {
+       private function webOutputHeader( $rowCount, $opts ) {
                if ( !$this->including() ) {
                        $this->outputFeedLinks();
-                       $this->doHeader( $opts, $rows->numRows() );
+                       $this->doHeader( $opts, $rowCount );
                }
+       }
+
+       /**
+        * Send output to the OutputPage object, only called if not used feeds
+        *
+        * @param ResultWrapper $rows Database rows
+        * @param FormOptions $opts
+        */
+       public function webOutput( $rows, $opts ) {
+               $this->webOutputHeader( $rows->numRows(), $opts );
 
                $this->outputChangesList( $rows, $opts );
        }
index 249be7f..30eb38d 100644 (file)
@@ -280,7 +280,9 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        return "blockedemailuser";
                }
 
-               if ( $user->pingLimiter( 'emailuser' ) ) {
+               // Check the ping limiter without incrementing it - we'll check it
+               // again later and increment it on a successful send
+               if ( $user->pingLimiter( 'emailuser', 0 ) ) {
                        wfDebug( "Ping limiter triggered.\n" );
 
                        return 'actionthrottledtext';
@@ -376,6 +378,11 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                $text .= $context->msg( 'emailuserfooter',
                        $from->name, $to->name )->inContentLanguage()->text();
 
+               // Check and increment the rate limits
+               if ( $context->getUser()->pingLimiter( 'emailuser' ) ) {
+                       throw new ThrottledError();
+               }
+
                $error = false;
                if ( !Hooks::run( 'EmailUser', [ &$to, &$from, &$subject, &$text, &$error ] ) ) {
                        if ( $error instanceof Status ) {
index 740207d..62a48c6 100644 (file)
@@ -969,7 +969,7 @@ class SpecialUndelete extends SpecialPage {
                        $key = urlencode( $row->fa_storage_key );
                        $pageLink = $this->getFileLink( $file, $this->getPageTitle(), $ts, $key );
                } else {
-                       $pageLink = $this->getLanguage()->userTimeAndDate( $ts, $user );
+                       $pageLink = htmlspecialchars( $this->getLanguage()->userTimeAndDate( $ts, $user ) );
                }
                $userLink = $this->getFileUser( $file );
                $data = $this->msg( 'widthheight' )->numParams( $row->fa_width, $row->fa_height )->text();
@@ -1049,7 +1049,7 @@ class SpecialUndelete extends SpecialPage {
                $time = $this->getLanguage()->userTimeAndDate( $ts, $user );
 
                if ( !$file->userCan( File::DELETED_FILE, $user ) ) {
-                       return '<span class="history-deleted">' . $time . '</span>';
+                       return '<span class="history-deleted">' . htmlspecialchars( $time ) . '</span>';
                }
 
                $link = $this->getLinkRenderer()->makeKnownLink(
diff --git a/includes/utils/ExecutableFinder.php b/includes/utils/ExecutableFinder.php
new file mode 100644 (file)
index 0000000..93f635d
--- /dev/null
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Copyright (C) 2017 Kunal Mehta <legoktm@member.fsf.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * 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.
+ *
+ */
+
+use MediaWiki\Shell\Shell;
+
+/**
+ * Utility class to find executables in likely places
+ *
+ * @since 1.31
+ */
+class ExecutableFinder {
+
+       /**
+        * Get an array of likely places we can find executables. Check a bunch
+        * of known Unix-like defaults, as well as the PATH environment variable
+        * (which should maybe make it work for Windows?)
+        *
+        * @return array
+        */
+       protected static function getPossibleBinPaths() {
+               return array_unique( array_merge(
+                       [ '/usr/bin', '/bin', '/usr/local/bin', '/opt/csw/bin',
+                               '/usr/gnu/bin', '/usr/sfw/bin', '/sw/bin', '/opt/local/bin' ],
+                       explode( PATH_SEPARATOR, getenv( 'PATH' ) )
+               ) );
+       }
+
+       /**
+        * Search a path for any of the given executable names. Returns the
+        * executable name if found. Also checks the version string returned
+        * by each executable.
+        *
+        * Used only by environment checks.
+        *
+        * @param string $path Path to search
+        * @param string $name Executable name to look for
+        * @param array|bool $versionInfo False or array with two members:
+        *   0 => Parameter to pass to binary for version check (e.g. --version)
+        *   1 => String to compare the output with
+        *
+        * If $versionInfo is not false, only executables with a version
+        * matching $versionInfo[1] will be returned.
+        * @return bool|string
+        */
+       protected static function findExecutable( $path, $name, $versionInfo = false ) {
+               $command = $path . DIRECTORY_SEPARATOR . $name;
+
+               MediaWiki\suppressWarnings();
+               $file_exists = is_executable( $command );
+               MediaWiki\restoreWarnings();
+
+               if ( $file_exists ) {
+                       if ( !$versionInfo ) {
+                               return $command;
+                       }
+
+                       $output = Shell::command( $command, $versionInfo[0] )
+                               ->includeStderr()->execute()->getStdout();
+                       if ( strstr( $output, $versionInfo[1] ) !== false ) {
+                               return $command;
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * Same as locateExecutable(), but checks in getPossibleBinPaths() by default
+        * @see locateExecutable()
+        * @param string|string[] $names Array of possible names.
+        * @param array|bool $versionInfo Default: false or array with two members:
+        *   0 => Parameter to run for version check, e.g. '--version'
+        *   1 => String to compare the output with
+        *
+        * If $versionInfo is not false, only executables with a version
+        * matching $versionInfo[1] will be returned.
+        * @return bool|string
+        */
+       public static function findInDefaultPaths( $names, $versionInfo = false ) {
+               $paths = self::getPossibleBinPaths();
+               foreach ( (array)$names as $name ) {
+                       foreach ( $paths as $path ) {
+                               $exe = self::findExecutable( $path, $name, $versionInfo );
+                               if ( $exe !== false ) {
+                                       return $exe;
+                               }
+                       }
+               }
+
+               return false;
+       }
+
+}
index 435f058..8517f26 100644 (file)
@@ -178,6 +178,7 @@ class Language {
        /**
         * Get a cached or new language object for a given language code
         * @param string $code
+        * @throws MWException
         * @return Language
         */
        static function factory( $code ) {
index 1266561..281be2b 100644 (file)
@@ -418,7 +418,6 @@ class Names {
                'tly' => 'толышә зывон', # Talysh
                'tn' => 'Setswana', # Setswana
                'to' => 'lea faka-Tonga', # Tonga (Tonga Islands)
-               'tokipona' => 'Toki Pona', # Toki Pona
                'tpi' => 'Tok Pisin', # Tok Pisin
                'tr' => 'Türkçe', # Turkish
                'tru' => 'Ṫuroyo', # Turoyo
index e72bda0..ddec822 100644 (file)
        "anonpreviewwarning": "''أنت غير مسجل الدخول. الحفظ سيسجل عنوان الأيبي الخاص بك في تاريخ هذه الصفحة.''",
        "missingsummary": "'''تنبيه:''' لم تقم بكتابة ملخص للتعديل.\nإذا قمت بضغط حفظ الصفحة مرة أخرى، فيتم حفظ تعديلك بدون ملخص.",
        "selfredirect": "<strong>تحذير:</strong> أنت تقوم بتحويل الصفحة إلى نفسها.\nربما حددت الهدف الخطأ للتحويلة أو أنك تقوم بتحرير الصفحة الخطأ.\n\nإذا نقرت على «$1» مرة أخرى، سيتم إنشاء التحويلة رغم الخطأ.",
-       "missingcommenttext": "من فضلك أدخل تعليقا في الأسفل.",
+       "missingcommenttext": "من فضلك أدخل تعليقا.",
        "missingcommentheader": "<strong>تنبيه:</strong>  لم تقم بوضع موضوع/عنوان لهذا التعليق.\nإذا قمت بالضغط على \"$1\" مجددا، سيتم حفظ تعليقك بدون عنوان.",
        "summary-preview": "معاينة ملخص تحرير",
        "subject-preview": "معاينة الموضوع:",
        "recentchanges-legend": "خيارات أحدث التغييرات",
        "recentchanges-summary": "تابع آخر التغييرات في الويكي من هذه الصفحة.",
        "recentchanges-noresult": "لا توجد تغييرات خلال الفترة المحددة تطابق هذه المعايير.",
+       "recentchanges-timeout": "البحث انتهى بدون نتائج. ربما تحب تجربة مدخلات بحث مختلفة.",
        "recentchanges-feed-description": "تابع أحدث التغييرات للويكي عبر هذه التلقيمة.",
        "recentchanges-label-newpage": "أنشأ هذا التعديل صفحة جديدة",
        "recentchanges-label-minor": "هذا تعديل طفيف",
        "rcfilters-days-show-hours": "{{PLURAL:$1|ساعة واحدة|ساعتان|$1 ساعات|$1 ساعة}}",
        "rcfilters-highlighted-filters-list": "معلمة: $1",
        "rcfilters-quickfilters": "المرشحات المحفوظة",
-       "rcfilters-quickfilters-placeholder-title": "Ù\84ا Ù\88صÙ\84ات تم حفظها بعد",
+       "rcfilters-quickfilters-placeholder-title": "Ù\84ا Ù\85رشحات تم حفظها بعد",
        "rcfilters-quickfilters-placeholder-description": "لحفظ إعدادات الفلتر وإعادة استخدامها في وقت لاحق; انقر فوق رمز الإشارة المرجعية في منطقة الفلتر النشط أدناه.",
        "rcfilters-savedqueries-defaultlabel": "مرشحات محفوظة",
        "rcfilters-savedqueries-rename": "أعد التسمية",
        "rcfilters-filter-user-experience-level-unregistered-label": "غير المسجلين",
        "rcfilters-filter-user-experience-level-unregistered-description": "المحررون الذين لم يسجلوا الدخول.",
        "rcfilters-filter-user-experience-level-newcomer-label": "القادمون الجدد",
-       "rcfilters-filter-user-experience-level-newcomer-description": "المحررون المسجلون الذين لديهم أقل من 10 تعديلات و 4 أيام من النشاط.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "المحررون المسجلون الذين لديهم أقل من 10 تعديلات أو 4 أيام من النشاط.",
        "rcfilters-filter-user-experience-level-learner-label": "المتعلمون",
        "rcfilters-filter-user-experience-level-learner-description": "المحررون المسجلون الذين تقع تجربتهم بين \"القادمين الجدد\" و \"المستخدمين ذوي الخبرة\".",
        "rcfilters-filter-user-experience-level-experienced-label": "المستخدمون ذوو الخبرة",
index 5971a8e..e9d42dd 100644 (file)
        "recentchanges-legend": "Opciones de cambios recientes",
        "recentchanges-summary": "Sigui los cambios más recientes na wiki nesta páxina.",
        "recentchanges-noresult": "Nengún cambiu nel periodu conseñáu coincide con esos criterios.",
+       "recentchanges-timeout": "Esta gueta escosó'l tiempu. Escurque quieras tentar con parámetros de gueta distintos.",
        "recentchanges-feed-description": "Sigui nesta canal los últimos cambios de la wiki.",
        "recentchanges-label-newpage": "Esta edición creó una páxina nueva",
        "recentchanges-label-minor": "Esta ye una edición menor",
index 1e34a73..5385ddb 100644 (file)
        "views": "Görünüş",
        "toolbox": "Alətlər",
        "tool-link-userrights": "{{GENDER:$1|İstifadəçi}} qruplarını dəyişdir",
-       "tool-link-userrights-readonly": "İstifadəçi qruplarına bax",
+       "tool-link-userrights-readonly": "{{GENDER:$1|İstifadəçi}} qruplarına bax",
        "imagepage": "Fayl səhifəsini göstər",
        "mediawikipage": "Mesaj səhifəsini göstər",
        "templatepage": "Şablon səhifəsini göstər",
        "currentevents-url": "Project:Aktual hadisələr",
        "disclaimers": "Məsuliyyətdən imtina",
        "disclaimerpage": "Project:Məsuliyyətdən imtina",
-       "edithelp": "Redaktə kömək",
+       "edithelp": "Redaktədə köməklik",
        "helppage-top-gethelp": "Kömək",
        "mainpage": "Ana Səhifə",
        "mainpage-description": "Ana Səhifə",
        "password-login-forbidden": "Bu istifadəçi adından və paroldan istifadə qadağan olunub.",
        "mailmypassword": "E-mail ilə yeni parol göndər",
        "passwordremindertitle": "{{SITENAME}} parol xatırladıcı",
-       "passwordremindertext": "Kimsə (ehtimal ki siz özünüz, $1 IP ünvanından) {{SITENAME}} ($4) layihəsi \nüçün yeni bir parol göndərilməsini istəyib. \"$2\" adlı istifadəçi üçün müvəqqəti \nolaraq \"$3\" parolu yaradılıb. Əgər bu sizin istəyiniz əsasında olubsa, \nhesabınıza daxil olaraq yeni bir parol yaratmağınız vacibdir. Müvəqqəti parolunuz\n{{PLURAL:$5|1 gün|$5 gün}} ərzində qüvvədə olacaqdır.\n\nParol dəyişdirməni siz istəməmisinizsə və ya parolunuzu xatırladınızsa \nvə artıq parolunuzu dəyişdirmək istəmirsinizsə, bu mesaja əhəmiyyət vermədən \nəvvəlki parolunuzdan istifadə etməyə davam edə bilərsiniz.",
+       "passwordremindertext": "Kimsə (ehtimal ki, siz özünüz, $1 IP ünvanından) {{SITENAME}} ($4) layihəsi \nüçün yeni bir parol göndərilməsini istəyib. \"$2\" adlı istifadəçi üçün müvəqqəti \nolaraq \"$3\" parolu yaradılıb. Əgər bu sizin istəyiniz əsasında olubsa, \nhesabınıza daxil olaraq yeni bir parol yaratmağınız vacibdir. Müvəqqəti parolunuz\n{{PLURAL:$5|1 gün|$5 gün}} ərzində qüvvədə olacaqdır.\n\nParol dəyişdirməni siz istəməmisinizsə və ya parolunuzu xatırladınızsa \nvə artıq parolunuzu dəyişdirmək istəmirsinizsə, bu mesaja əhəmiyyət vermədən \nəvvəlki parolunuzdan istifadə etməyə davam edə bilərsiniz.",
        "noemail": "\"$1\" adlı istifadəçi e-poçt ünvanını qeyd etməmişdir.",
        "noemailcreate": "Düzgün e-poçt ünvanı qeyd etməlisiniz",
        "passwordsent": "Yeni parol \"$1\" üçün qeydiyyata alınan e-poçt ünvanına göndərilmişdir.\nXahiş edirik, e-məktubu aldıqdan sonra yenidən daxil olasınız.",
        "anoneditwarning": "<strong>Diqqət:</strong> Siz sistemə daxil olmamısınız. Hər hansı dəyişiklik etsəniz, sizin IP-ünvanınız hamıya görünəcək. Əgər <strong>[$1 daxil olsanız]</strong> və ya <strong>[$2 hesab yaratsanız]</strong>, redaktələriniz sizin istifadəçi adınıza yazılacaq və digər üstünlüklər də qazanacaqsınız.",
        "anonpreviewwarning": "Sistemə daxil olmamısınız. \"Səhifəni qeyd et\" düyməsini bassanız IP ünvanınız səhifənin tarixçəsində qeyd olunacaq.",
        "missingsummary": "'''Xatırlatma.''' Siz dəyişikliklərin qısa şərhini verməmisiniz. \"Səhifəni qeyd et\" düyməsinə təkrar basandan sonra sizin dəyişiklikləriniz şərhsiz qeyd olunacaq.",
-       "missingcommenttext": "Zəhmət olmasa, aşağıda şərhinizi yazın.",
+       "missingcommenttext": "Zəhmət olmasa, şərh yazın.",
        "summary-preview": "Dəyişikliyin izahının görünüşü:",
        "subject-preview": "Sərlövhə belə olacaq:",
        "blockedtitle": "İstifadəçi bloklanıb",
        "timezoneregion-europe": "Avropa",
        "timezoneregion-indian": "Hind Okeanı",
        "timezoneregion-pacific": "Sakit Okean",
-       "allowemail": "Digər istifadəçilər mənə e-məktub göndərə bilər",
+       "allowemail": "Digər istifadəçilərin mənə e-məktub göndərməsinə icazə ver",
        "prefs-searchoptions": "Axtar",
        "prefs-namespaces": "Adlar fəzası",
        "default": "boş",
        "prefs-custom-css": "Xüsusi CSS",
        "prefs-custom-js": "Xüsusi JavaScript",
        "prefs-common-css-js": "Bütün skinlər üçün ümumi CSS/JavaScript:",
+       "prefs-reset-intro": "Bu səhifəni nizamlamalarınızı ilkin vəziyyətə gətirmək üçün istifadə edə bilərsiniz. Bu əməliyyat geri qaytarıla bilməz.",
        "prefs-emailconfirm-label": "E-poçtun təsdiqlənməsi:",
        "youremail": "E-məktub:",
        "username": "{{GENDER:$1|İstifadəçi adı}}:",
        "editusergroup": "İstifadəçi qruplarını yüklə",
        "editinguser": "İstifadəçi <strong>[[User:$1|$1]]</strong> $2 üçün istifadəçi hüquqları dəyişdirilir",
        "userrights-editusergroup": "İstifadəçinin qruplarını redaktə et",
-       "userrights-viewusergroup": "İstifadəçi qruplarına bax",
+       "userrights-viewusergroup": "{{GENDER:$1|İstifadəçi}} qruplarına bax",
        "saveusergroups": "{{GENDER:$1|İstifadəçi}} qruplarını qeyd et",
        "userrights-groupsmember": "Daxil olduğu qruplar:",
        "userrights-groupsmember-auto": "Güman edilən üzv:",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|gün|gün}}",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|saat|saat}}",
        "rcfilters-quickfilters": "Yaddaşdakı filtrlər",
-       "rcfilters-quickfilters-placeholder-title": "Yaddaşa verilmiş keçid yoxdur",
+       "rcfilters-quickfilters-placeholder-title": "Yaddaşa verilmiş filtr yoxdur",
        "rcfilters-quickfilters-placeholder-description": "Filtr nizamlamalarını yaddaşda saxlamaq və sonradan təkrar istifadə etmək üçün aşağıdakı Aktiv Filtrlər bölməsindəki əlfəcin nişanını tıqlayın.",
        "rcfilters-savedqueries-rename": "Adını dəyiş",
        "rcfilters-savedqueries-setdefault": "Standart filtr et",
        "exbeforeblank": "Silinmədən əvvəlki məzmun: '$1'",
        "delete-confirm": "Silinən səhifə: \"$1\"",
        "delete-legend": "Sil",
-       "historywarning": "'''Xəbərdarlıq:''' Silinəcək səhifənin tarixçəsində qeyd olunmuş $1 {{PLURAL:$1|redaktə|redaktə}} var:",
+       "historywarning": "'''Xəbərdarlıq:''' Silmək istədiyiniz səhifənin tarixçəsində qeyd olunmuş $1 {{PLURAL:$1|redaktə|redaktə}} var:",
        "historyaction-submit": "Göstər",
        "confirmdeletetext": "Bu səhifə və ya fayl bütün tarixçəsi ilə birlikdə birdəfəlik silinəcək. Bunu [[{{MediaWiki:Policy-url}}|qaydalara]] uyğun etdiyinizi və əməliyyatın nəticələrini başa düşdüyünüzü təsdiq edin.",
        "actioncomplete": "Fəaliyyət tamamlandı",
        "rollbackfailed": "Geri qaytarma uğursuzdur",
        "cantrollback": "Redaktə geri qaytarıla bilməz; axırıncı redaktə səhifədə olan yeganə fəaliyyətdir.",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|Müzakirə]]) tərəfindən edilmiş dəyişikliklər [[User:$1|$1]] tərəfindən edilmiş dəyişikliklərə qaytarıldı.",
-       "revertpage-nouser": "(istifadəçi adı çıxarılmış) tərəfindən edilən dəyişikliklər [[User:$1|$1]] tərəfindən edilən son dəyişikliyə geri alındı",
+       "revertpage-nouser": "İstifadəçi adı gizlədilmiş istifadəçi tərəfindən edilən dəyişikliklər  {{GENDER:$1|[[User:$1|$1]]}} tərəfindən edilmiş son redaktəyə geri qaytarıldı",
        "rollback-success": "$1 tərəfindən edilmiş redaktələr geri qaytarıldı; $2 tərəfindən yaradılmış son versiya bərpa olundu.",
        "sessionfailure-title": "Giriş səhvi",
        "changecontentmodel-reason-label": "Səbəb:",
index e78f50f..fc13b81 100644 (file)
        "rcfilters-activefilters": "Әүҙем фильтрҙар",
        "rcfilters-advancedfilters": "Киңәйтелгән фильтрҙар",
        "rcfilters-limit-title": "Күрһәтеү өсөн үҙгәртеүҙәр",
-       "rcfilters-limit-shownum": "Һуңғы {{PLURAL:$1}} үҙгәреште күрһәтергә",
+       "rcfilters-limit-shownum": "Һуңғы $1 үҙгәреште күрһәтергә",
        "rcfilters-days-title": "Аҙаҡҡы көндәр",
        "rcfilters-hours-title": "Аҙаҡҡы сәғәттәр",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|көн}}",
index edab7c0..2e85dc4 100644 (file)
        "recentchanges-legend": "Налады апошніх зьменаў",
        "recentchanges-summary": "Сачыце за апошнімі зьменамі ў {{GRAMMAR:месны|{{SITENAME}}}} на гэтай старонцы.",
        "recentchanges-noresult": "Зьмены, што пасуюць дадзенаму пэрыяду і крытэрам, ня знойдзеныя.",
+       "recentchanges-timeout": "Адведзены на гэты пошук час скончыўся. Вы можаце паспрабаваць іншыя парамэтры пошуку.",
        "recentchanges-feed-description": "Сачыце за апошнімі зьменамі ў вікі праз гэтую стужку.",
        "recentchanges-label-newpage": "Гэтым рэдагаваньнем была створаная новая старонка",
        "recentchanges-label-minor": "Гэта дробнае рэдагаваньне",
index f7d6085..352aaec 100644 (file)
        "action-editcontentmodel": "редактиране на модела на съдържанието на страница",
        "action-managechangetags": "създаване и (де)активиране на етикети",
        "action-applychangetags": "прилагане на етикетите заедно с промените ви",
-       "action-deletechangetags": "изтриване на етикети от базата данни",
+       "action-deletechangetags": "изÑ\82Ñ\80иване Ð½Ð° ÐµÑ\82икеÑ\82и Ð¾Ñ\82 Ð±Ð°Ð·Ð°Ñ\82а Ð¾Ñ\82 Ð´Ð°Ð½Ð½Ð¸",
        "action-purge": "почисти кеша на тази страница",
        "nchanges": "$1 {{PLURAL:$1|промяна|промени}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|от последното посещение}}",
        "changecontentmodel-submit": "Променяне",
        "changecontentmodel-success-title": "Моделът на съдържанието беше променен",
        "changecontentmodel-success-text": "Типът на съдържанието на [[:$1]] е успешно променен.",
-       "changecontentmodel-cannot-convert": "СÑ\8aдÑ\8aÑ\80жаниеÑ\82о Ð½Ð° [[:$1]] Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð¿Ñ\80евÑ\8aÑ\80наÑ\82о в тип $2.",
+       "changecontentmodel-cannot-convert": "СÑ\8aдÑ\8aÑ\80жаниеÑ\82о Ð½Ð° [[:$1]] Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð¿Ñ\80еобÑ\80азÑ\83вано в тип $2.",
        "changecontentmodel-nodirectediting": "Моделът на съдържание $1 не поддържа пряко редактиране",
        "changecontentmodel-emptymodels-title": "Не са налични модели на съдържание",
        "changecontentmodel-emptymodels-text": "Съдържанието в [[:$1]] не може да бъде превърнато в никакъв тип.",
        "watchlistedit-clear-submit": "Изчистване на списъка за наблюдение (Необратимо!)",
        "watchlistedit-clear-done": "Списъкът за наблюдение беше изчистен.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 заглавие беше премахнато|$1 заглавия бяха премахнати}}:",
-       "watchlistedit-too-many": "Има твърде много страници за показване тук.",
+       "watchlistedit-too-many": "Има твърде много страници за показване.",
        "watchlisttools-clear": "Изчистване на списъка за наблюдение",
        "watchlisttools-view": "Преглед на списъка за наблюдение",
        "watchlisttools-edit": "Преглед и редактиране на списъка за наблюдение",
index f4e9098..e20ea0a 100644 (file)
        "mergelog": "Zapisnik spajanja",
        "revertmerge": "Vrati spajanje",
        "mergelogpagetext": "Ispod je spisak nedavnih spajanja historija stranica.",
-       "history-title": "$1: Historija izmjena",
-       "difference-title": "$1: Razlike između izmjena",
+       "history-title": "Historija izmjena stranice \"$1\"",
+       "difference-title": "Razlika između izmjena na stranici \"$1\"",
        "difference-title-multipage": "$1 i $2: Razlike između stranica",
        "difference-multipage": "(Razlika između stranica)",
        "lineno": "Red $1:",
index b87a717..86ef5ef 100644 (file)
        "recentchanges-legend": "Možnosti posledních změn",
        "recentchanges-summary": "Na této stránce sledujte poslední změny na {{grammar:6sg|{{SITENAME}}}}.",
        "recentchanges-noresult": "V daném období neodpovídaly zadaným kritériím žádné změny.",
+       "recentchanges-timeout": "Časový limit vyhledávání vypršel. Můžete ho zkusit znovu s jinými parametry.",
        "recentchanges-feed-description": "Na tomto kanále sledujte poslední změny na {{grammar:6sg|{{SITENAME}}}}.",
        "recentchanges-label-newpage": "Touto editací byla založena nová stránka",
        "recentchanges-label-minor": "Toto je malá editace",
index 136e4f3..48024fe 100644 (file)
        "recentchanges-legend": "Anzeigeoptionen",
        "recentchanges-summary": "Auf dieser Seite kannst du die letzten Änderungen in diesem Wiki nachverfolgen.",
        "recentchanges-noresult": "Keine Änderungen während des angegebenen Zeitraums entsprechen diesen Kriterien.",
+       "recentchanges-timeout": "Die Zeit für diese Suche wurde überschritten. Du kannst verschiedene Suchparameter ausprobieren.",
        "recentchanges-feed-description": "Verfolge mit diesem Feed die letzten Änderungen in {{SITENAME}}.",
        "recentchanges-label-newpage": "Neue Seite",
        "recentchanges-label-minor": "Kleine Änderung",
index 60d2df4..341c800 100644 (file)
        "histlast": "Peyênêr",
        "historysize": "({{PLURAL:$1|1 bayt|$1 bayti}})",
        "historyempty": "(veng)",
-       "history-feed-title": "Tarixê çım eştışi",
+       "history-feed-title": "Tarixê çımraviyarnayışi",
        "history-feed-description": "Wiki de tarixê çım ra viyarnayışë na perer",
        "history-feed-item-nocomment": "$1 miyanê $2i de",
        "history-feed-empty": "Pela cıgeyrayiye çıniya.\nBeno ke ena esteriya, ya zi namê cı vuriyo.\nSeba pelanê muhimanê newan [[Special:Search|cıgeyrayışê wiki de]] bıcerebne.",
index 995d15e..de493ef 100644 (file)
        "recentchanges-summary": "Track the most recent changes to the wiki on this page.",
        "recentchangestext": "-",
        "recentchanges-noresult": "No changes during the given period match these criteria.",
+       "recentchanges-timeout": "This search has timed out. You may wish to try different search parameters.",
        "recentchanges-feed-description": "Track the most recent changes to the wiki in this feed.",
        "recentchanges-label-newpage": "This edit created a new page",
        "recentchanges-label-minor": "This is a minor edit",
index 700f337..5d3e0bc 100644 (file)
        "upload_directory_missing": "El directorio de subida de archivos ($1) no existe, y el servidor no ha podido crearlo.",
        "upload_directory_read_only": "El servidor web no puede escribir en el directorio de subida de archivos ($1).",
        "uploaderror": "Error al intentar subir",
-       "upload-recreate-warning": "<strong>Aviso: Un archivo con ese nombre ha sido eliminado o renombrado.</strong>\n\nA continuación se muestra el registro de borrados y traslados de esta página:",
+       "upload-recreate-warning": "<strong>Atención: se ha borrado o cambiado el nombre de un archivo con ese nombre.</strong>\n\nA continuación se muestra el registro de borrados y traslados de esta página:",
        "uploadtext": "Utiliza el siguiente formulario para subir archivos.\nPara ver o buscar archivos subidos con anterioridad, ve a la [[Special:FileList|lista de archivos subidos]].\nLos archivos subidos también quedarán registrados en el [[Special:Log/upload|registro de archivos subidos]], y los borrados en el [[Special:Log/delete|registro de borrados]].\n\nPara incluir un archivo en una página, usa un enlace como los mostrados a continuación:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> para usar la versión a tamaño completo del archivo\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|texto alternativo]]</nowiki></code></strong> para una versión de 200 píxeles de ancho situada en una caja en el margen izquierdo con \"texto alternativo\" como descripción\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> para enlazar directamente al archivo sin mostrarlo.",
        "upload-permitted": "{{PLURAL:$2|Tipo de archivo permitido|Tipos de archivo permitidos}}: $1.",
        "upload-preferred": "{{PLURAL:$2|Tipo de archivo preferido|Tipos de archivo preferidos}}: $1.",
        "newtitle": "Título nuevo:",
        "move-watch": "Vigilar páginas de origen y destino",
        "movepagebtn": "Trasladar la página",
-       "pagemovedsub": "Renombrado realizado con éxito",
+       "pagemovedsub": "Traslado realizado con éxito",
        "movepage-moved": "<strong>«$1» ha sido trasladada a «$2»</strong>",
        "movepage-moved-redirect": "Se ha creado una redirección.",
        "movepage-moved-noredirect": "Se ha suprimido la creación de la redirección.",
        "movetalk": "Renombrar la página de discusión asociada",
        "move-subpages": "Intentar trasladar las subpáginas (hasta $1)",
        "move-talk-subpages": "Intentar trasladar las subpáginas de discusión (hasta $1)",
-       "movepage-page-exists": "La página $1 ya existe, por lo que no puede ser renombrada automáticamente.",
+       "movepage-page-exists": "La página $1 ya existe, por lo que no se puede cambiarle el nombre automáticamente.",
        "movepage-page-moved": "La página $1 ha sido trasladada a $2.",
        "movepage-page-unmoved": "La página $1 no se ha podido trasladar a $2.",
        "movepage-max-pages": "Se {{PLURAL:$1|ha trasladado un máximo de una página|han trasladado un máximo de $1 páginas}}, y no van a trasladarse más automáticamente.",
index fe26028..0092884 100644 (file)
        "diff-multi-sameuser": "(Erabiltzaile berdinaren {{PLURAL:$1|erdiko ekarpen bat ez da|$1 erdiko ekarpen ez dira}} erakusten)",
        "diff-multi-otherusers": "({{PLURAL:$1|Tarteko berrikusketa bat|$1 tarteko berrikusketak}}  {{PLURAL:$2|beste erabiltzaile bat|$2 erabiltzaileak}} egina ez da erakusten)",
        "diff-multi-manyusers": "({{PLURAL:$1|Tarteko berrikusketa bat|$1 tarteko berrikusketak}} by more than $2 {{PLURAL:$2|erabiltzaile batek|erabiltzaile batzuek}} baino gehiagok egina ez erakutsia)",
+       "difference-missing-revision": " ($1) ezberdinatasunaren  {{PLURAL:$2|Berrikusketa bat|$2 berrikusketa}} ez {{PLURAL:$2|da|dira}} aurkitu.\n\nHau, orokorrean ezabatu egin den orri batera deskonektatua dagoen esteka desegonkor baten ondorioz gertatzen da.\n\nHemen xehetasunak aurki daitezke: [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
        "searchresults": "Bilaketaren emaitzak",
        "searchresults-title": "«$1» bilaketaren  emaitzak",
        "titlematches": "Emaitzak artikuluen izenburuetan",
        "recentchanges-legend": "Azken aldaketen aukerak",
        "recentchanges-summary": "Orrialde honetan ikus ditzakezu wiki honetan egindako azken aldaketak.",
        "recentchanges-noresult": "Ez da egon aldaketarik emandako tartean irizpide hau betetzen dutenik.",
+       "recentchanges-timeout": "Bilaketa honek denbora muga gainditu du. Agian beste parametro batzuekin bilatu nahi duzu.",
        "recentchanges-feed-description": "Sindikazio honetan wikian eginiko azkeneko aldaketak jarrai daitezke.",
        "recentchanges-label-newpage": "Aldaketa honek orri berri bat sortu du",
        "recentchanges-label-minor": "Aldaketa hau txikia da",
        "uploaded-script-svg": "Igotako SVG fitxategian \"$1\" elementu aldagarria aurkitu egin da.",
        "uploaded-hostile-svg": "Igotako SVG fitxategiko estilo elementuan segurua ez den CSS-a aurkitu da.",
        "uploaded-event-handler-on-svg": "Ekitaldiaren <code>$1=\"$2\"</code> kudeatze-atributuak ezartzea ez da onartzen SVG fitxategietan.",
+       "uploaded-href-attribute-svg": "<a> elementuek soilik (href) datuei lotu diezaiekete: (fitxategi kapsulatua), http: // edo https: //, edo fragment (#, same-document) helburuak. Beste elementu batzuetarako, adibidez, <image>, soilik datuak eta zatiak onartzen dira. Saiatu zure irudiak SVG esportatzerakoan txikiagotzen. <code>&lt;$1 $2=\"$3\"&gt; </code> aurkitua.",
        "uploaded-href-unsafe-target-svg": "Babesgabeko datuentzako aurkitutako href-a: URI <code>&lt;$1 $2=\"$3\"&gt;</code> xedea igotako SVG fitxategian.",
+       "uploaded-animate-svg": "Igotako SVG fitxategian <code>&lt;$1 $2=\"$3\"&gt;</code> atributua erabiltzen ari da, href aldatzen ari daitekeen \"animate\" aurkitu den etiketarekin.",
        "uploaded-setting-event-handler-svg": "Ekitaldi-kudeatzailearen atributuak ezartzea blokeatuta, bilatu <code>&lt;$1 $2=\"$3\"&gt;</code> igotako SVG fitxategian.",
        "uploaded-setting-href-svg": "\"set\" etiketa \"href\" atributua guraso elementuetara gehitzeko blokeatuta dago.",
        "uploaded-wrong-setting-svg": "\"Set\" etiketa erabiltzea urruneko/datu/script helburu bat gehitzeko edozein atributurako blokeatuta, bilatu <code>&lt;set to=\"$1\"&gt;</code> igotako SVG fitxategian.",
+       "uploaded-setting-handler-svg": "Urruneko/datu/scriptarekin \"eskuliburua\" atributua  ezartzen duen SVGa blokeatuta dago. <code>$1=\"$2\"</ code> aurkitu da SVG kargatutako fitxategian.",
+       "uploaded-remote-url-svg": "Edozein estiloko atributua kanpoko URL-arekin ezartzen duen SVGa blokeatuta dago. SVG fitxategian <code>$1=\"$2\"</code> aurkitu da.",
        "uploaded-image-filter-svg": "Irudi iragazkia aurkitua URL-arekin: <code>&lt;$1 $2=\"$3\"&gt;</code> igotako SVG fitxategian.",
        "uploadscriptednamespace": "SVG fitxategi hau legez kanpoko \"<nowiki>$1</nowiki>\" izen eremua dauka.",
        "uploadinvalidxml": "Ezin izan da analizatu XMLa igotako fitxategian.",
        "img-auth-nofile": "Ez dago \"$1\" fitxategirik.",
        "img-auth-isdir": "\"$1\" direktorio batera iristen saiatzen ari zara.\nFitxategien sarbidea baino ez da onartzen.",
        "img-auth-streaming": "\"$1\" sekuentziatzen.",
+       "img-auth-public": "Img_auth.php-ren funtzioa wiki pribatuetako fitxategiak irteerazteko da.\nWiki hau wiki publiko gisa konfiguratuta dago.\nSegurtasun ezin hobea lortzeko, img_auth.php desgaituta dago.",
        "img-auth-noread": "Erabiltzaileak ez du \"$1\" irakurtzeko sarbiderik.",
        "http-invalid-url": "URL baliogabea: $1",
        "http-invalid-scheme": "\"$1\" eskema duten URLak ez dira baliagarriak.",
        "deadendpagestext": "Jarraian zerrendatutako orrialdeek ez daukate wikiko beste edozein orrialdetarako loturarik.",
        "protectedpages": "Babestutako orrialdeak",
        "protectedpages-indef": "Babes mugagabeak bakarrik",
+       "protectedpages-summary": "Orrialde honetan unean babestutako orriak zerrendatzen dira. Sorkuntza babesten duten izenen zerrenda lortzeko, ikusi [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Kaskada moduko babesak bakarrik",
        "protectedpages-noredirect": "Birzuzenketak ezkutatu",
        "protectedpagesempty": "Ez dago parametro horiek dituen babesturiko orrialderik oraintxe.",
        "protectedpages-unknown-timestamp": "Ezezaguna",
        "protectedpages-unknown-performer": "Erabiltzaile ezezaguna",
        "protectedtitles": "Babestutako tituluak",
+       "protectedtitles-summary": "Orrialde honetan sorkuntzatik babesturiko izenburuak zerrendatzen dira. Babestutako orrialdeen zerrenda ikusteko, ikusi [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Ez dago parametro horiek dituen babesturiko izenbururik oraintxe.",
        "protectedtitles-submit": "Izenburuak erakutsi",
        "listusers": "Erabiltzaileen zerrenda",
        "apisandbox": "API proba orria",
        "apisandbox-jsonly": "API sandbox-a erabiltzeko JavaScript eskatzen da.",
        "apisandbox-api-disabled": "APIa desgaituta dago gune honetan.",
+       "apisandbox-intro": "Erabili orri hau <strong>MediaWiki web zerbitzuen APIa</ strong>rekin esperimentatzeko.\nIkusi [[mw:API:Main page|API dokumentazioa]] API erabilerari buruzko xehetasun gehiago lortzeko. Adibidez: [https://www.mediawiki.org/wiki/API#A_simple_example orri nagusiko edukia lortu]. Hautatu ekintza bat adibide gehiago ikusteko.\n\nKontuan izan, hau da sandbox bat bada ere, orri honetan egiten dituzun ekintzak wikiak alda ditzaketela.",
        "apisandbox-fullscreen": "Zabaldu panela",
        "apisandbox-fullscreen-tooltip": "Zabaldu sandbox panela arakatzailearen leihoa betetzeko.",
        "apisandbox-unfullscreen": "Erakutsi orria",
        "apisandbox-sending-request": "APIari eskaera bidaltzen...",
        "apisandbox-loading-results": "APIaren emaitzak jasotzen...",
        "apisandbox-results-error": "Errore bat gertatu da API kontsulta-erantzuna kargatzean: $1",
+       "apisandbox-results-login-suppressed": "Eskaera hau erregistratu gabeko erabiltzaile bezala prozesatu da, Same-Originaren segurtasuna arakatzailean nabigatzeko erabil daitekelako bestela. Kontuan izan API sandboxeko token automatikoko manipulazioa ez dela behar bezala funtzionatzen horrelako eskaerekin, eskuz bete itzazu mesedez.",
        "apisandbox-request-selectformat-label": "Erakutsi eskaera datuak horrela:",
        "apisandbox-request-format-url-label": "URL kontsulta katea",
        "apisandbox-request-url-label": "Eskatutako URLa:",
        "apisandbox-alert-field": "Zelai honetako balioak ez du balio.",
        "apisandbox-continue": "Jarraitu",
        "apisandbox-continue-clear": "Garbitu",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continue] azken eskaera prozesatuko du; {{int:apisandbox-continue-clear}} jarraipenarekin zerikusia duten parametroak ezabatuko ditu.",
        "apisandbox-param-limit": "<kbd>max</kbd> sartu gehienezko muga erabiltzeko.",
        "apisandbox-multivalue-all-namespaces": "$1 (Izen eremu guztiak)",
        "apisandbox-multivalue-all-values": "$1 (balio guztiak)",
        "trackingcategories-desc": "Kategoria inklusio irizpideak",
        "restricted-displaytitle-ignored": "Bistaratze izen ezezagunak dituzten orriak",
        "restricted-displaytitle-ignored-desc": "Orriak <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> ez du kontuan hartu orriaren oraingo izenburuarekin bat ez datorrelako.",
+       "noindex-category-desc": "Orri honek sarrera erroboten eskutik ez dauka eginda hitz magikoa daukalako <code><nowiki>__NOINDEX__</nowiki></code> barruan eta banderatxoa onartzen ez duen izen-eremuan dagoelako.",
+       "index-category-desc": "Orriak <code><nowiki>__INDEX__</nowiki></code> darama (eta banderatxoa onartua dagoen izen-eremuan dago), beraz, sarrera erroboten esku dago nahiz eta normalean horrela izan behar ez den.",
+       "post-expand-template-inclusion-category-desc": "Orri hau  <code>$wgMaxArticleSize</code> baino handiagoa txantilioi guztiak zabaldu eta gero, horregatik batzuk ez dira zabaldu.",
+       "post-expand-template-argument-category-desc": "Orrialdea <code>$wgMaxArticleSize</ code> baino handiagoa da, txantiloiaren argumentua zabaldu ondoren (triple giltza duen zerbait, <code>{{{Foo}}}</ code> bezalakoa).",
+       "expensive-parserfunction-category-desc": "Orriak analisi funtzional garesti gehiegi erabiltzen ditu (like <code>#ifexist</code>). \nIkusi [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "Orriak fitxategi hautsitako esteka bat du (fitxategi bat txertatzeko esteka fitxategia ez denean existitzen).",
        "hidden-category-category-desc": "Kategoriak <code><nowiki>__HIDDENCAT__</nowiki></code> darama bere orrialde edukian, orrien esteken kutxa orrian lehenespenez erakusteko saihesten duena.",
        "trackingcategories-nodesc": "Ez dago deskribapenik eskuragarri.",
        "undeletehistorynoadmin": "Artikulua ezabatu egin da. Ezabatzeko azalpena beheko laburpenean erakusten da, ezabatu aurretik parte hartu zuten erabiltzaileen xehetasunekin batera. Ezabatutako berrikuspenen oraingo testua administratzaileek bakarrik ikus dezakete.",
        "undelete-revision": "$1(e)n berrikuspen $3(e)k ezabatu du ($4(e)ko $5(e)tan):",
        "undeleterevision-missing": "Baliogabeko berrikuspena. Baliteke lotura ezegokia izatea, edo berriskupena leheneratu edo kendu izana.",
+       "undeleterevision-duplicate-revid": "{{PLURAL:$1|Berrikusketa bat ezin izan da|$1 berrikusketa ezin izan dira}} berregin, {{PLURAL:$1|bere|beraien}} <code>rev_id</code> erabiltzen zegoelako jada.",
        "undelete-nodiff": "Ez da aurkitu aurreko berrikuspenik.",
        "undeletebtn": "Leheneratu",
        "undeletelink": "ikusi/leheneratu",
        "import-nonewrevisions": "Ez da berrikuspenik inportatu (guztiak aurretiaz aurkeztu dira edo akatsengatik behertan behera utzi ziren).",
        "xml-error-string": "$1 $2 lerroan, $3 zutabean ($4 byte): $5",
        "import-upload": "Igo XML datuak",
-       "import-token-mismatch": "Sesio data galdu da. Saia saitez berriro ere, mesedez.",
+       "import-token-mismatch": "Saioaren datuen galera.\n\nBaliteke saioa amaituta egotea. '''Egiaztatu oraindik saioa hasita duzula eta saiatu berriro'''.\nOraindik ez badu funtzionatzen, saiatu [[Special:UserLogout|logout out]] eta saioa hasi berriro, eta egiaztatu zure nabigatzaileak gune honetako cookieak onartzen dituela.",
        "import-invalid-interwiki": "Ezin da esandako wikitik inportatu.",
        "import-error-edit": "\"$1\" orrialdea ez da inportatu aldatzeko baimenik ez duzulako.",
        "import-error-create": "\"$1\" orrialdea ez da inportatu sortzeko baimenik ez duzulako.",
        "import-error-interwiki": "\"$1\" orrialdea ez da inportatu bere izena kanpo loturetarako gordeta dagoelako (interwiki).",
        "import-error-special": "\"$1\" orrialdea ez da inportatu izen-tarte berezi bati dagokiolako eta horretan orrialderik ezin delako egon.",
        "import-error-invalid": "\"$1\" orrialdea ez da inportatu horretarako dagokion izena ez delako baliagarria wiki honetan.",
+       "import-error-unserialize": "\"$1\" orriko $2 berrikusketa ezin izan da deskategorizatu. Berrikusketa $4 bezala sailkatutako $3 eduki eredua erabiltzeko txostena bidali da.",
+       "import-error-bad-location": "$3 eduki eredua erabiltzen duen $2 berrikusketak ezin da wiki honetako $1 lekuan bildu, orri horretan eredu hori ez delako onartzen.",
        "import-options-wrong": "Aukera {{PLURAL:$2|ez-egokia|ez-egokiak}}:<nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Emandako jatorri orrialdea izenburu ez-baliagarria da.",
        "import-rootpage-nosubpage": "Jatorri orrialdearen «$1» izen-tarteak ez du baimentzen azpi-orrialderik.",
        "file-info-png-repeat": "{{PLURAL:$1|Behin|$1 aldiz}} ikusia",
        "file-info-png-frames": "{{PLURAL:$1|Frame bat|$1 frame}}",
        "file-no-thumb-animation": "'''Oharra: Muga teknikoak direla eta, fitxategi honen iruditxoak ezin dira animatu.'''",
+       "file-no-thumb-animation-gif": "<strong>Oharra: muga teknikoak direla eta, erresoluzio handiko GIF irudi hau bezalakoak ez dira animatuak izango. </strong>",
        "newimages": "Fitxategi berrien galeria",
        "imagelisttext": "Jarraian duzu $2(e)z ordenatutako {{PLURAL:$1|fitxategi baten|'''$1''' fitxategiren}} zerrenda.",
        "newimages-summary": "Orrialde berezi honek igotako azkeneko fitxategiak erakusten ditu.",
        "scarytranscludetoolong": "[URLa luzeegia da]",
        "deletedwhileediting": "'''Oharra''': Zu aldaketak egiten hasi ondoren orrialdea ezabatua izan da!",
        "confirmrecreate": "[[User:$1|$1]] erabiltzaileak ([[User talk:$1|eztabaida]]) {{GENDER:$1|deleted}} orrialde hau ezabatu zu aldatzen hasi eta gero arrazoi honekin:\n: <em>$2</em>\nMesedez, baieztatu benetan orrialde hau berriz sortu nahi duzula.",
+       "confirmrecreate-noreason": "[[User:$1|$1]] wikilariak ([[User talk:$1|talk]]) orri hau {{GENDER:$1|ezabatu}} du zuk aldatzen hasi eta gero. Mesedez, konfirmatu ezazu orri hau berregin nahi duzula.",
        "recreate": "Birsortu",
        "confirm-purge-title": "Orri hau purgatu",
        "confirm_purge_button": "Ados",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|eztabaida]])",
        "timezone-local": "Lokala",
        "duplicate-defaultsort": "Adi: Berezko \"$2\" antolatzeak aurreko berezko \"$1\" antolatzea gainditzen du.",
+       "duplicate-displaytitle": "<strong>Abisua:</strong> \"$2\" aurkezpen izenburua aurretiazko \"$1\"  aurkezpen izenburua baliogabetzen du.",
+       "restricted-displaytitle": "<strong>Abisua:</strong> \"$1\" aurkezpen izenburua ez da kontuan hartu orriak orain daukan izenburuarekin ez delako baliokidea.",
+       "invalid-indicator-name": "<strong>Akatsa:</strong> Orriaren egoera indikatzaileen atributu <code>izena</code> ezin da hutsik egon.",
        "version": "Bertsioa",
        "version-extensions": "Instalatutako luzapenak",
        "version-skins": "Instalatutako itxurak",
        "version-poweredby-others": "beste batzuk",
        "version-poweredby-translators": "translatewiki.net itzultzaileak",
        "version-credits-summary": "Hurrengo pertsonak gogoan izan nahi ditugu [[Special:Version|MediaWikiri]] egindako ekarpena dela eta.",
+       "version-license-info": "MediaWiki software librea da; birbanatu daitekena edota alda dezakezuna GNU Lizentzia Publiko Orokorraren baldintzapean, Free Software Foundation-ek argitaratutakoaren arabera; Lizentziaren 2. bertsioa edo (nahiago baduzu) bertsio berriago bat.\n\nMediaWiki partekatzen da erabilgarria izango delakoan, baina BERMERIK GABE; MERKATURATZEKO ez dela bermerik gabe edo HELBURU PARTIKULARRETARAKO izango den jakin gabe. Ikus GNU Lizentzia Publiko Orokorra xehetasun gehiagorako.\n\n{{SERVER}}{{SCRIPTPATH}}/COPYING lizentzia programa publiko orokorraren kopia bat jaso beharko zenuke honekin batera; bestela, idatzi Free Software Foundation-en, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, AEB edo [//www.gnu.org/licenses/old-licenses/gpl-2.0.html irakurri sarean].",
        "version-software": "Instalatutako softwarea",
        "version-software-product": "Produktua",
        "version-software-version": "Bertsioa",
        "tag-filter-submit": "Iragazkia",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etiketa|Etiketak}}]]: $2)",
        "tag-mw-contentmodelchange": "Eduki eredu aldaketa",
+       "tag-mw-contentmodelchange-description": "Orri baten [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel change the content model] aldaketak",
        "tags-title": "Etiketak",
        "tags-intro": "Orri honek softwareak aldatzeko bezala marka ditzazkeen etiketak zerrendatzen ditu, eta berauen esanahia.",
        "tags-tag": "Etiketaren izena",
        "tags-create-invalid-chars": "Etiketak izenek ezin dezakete komak (<code>,</code>), hodi (<code>|</code>), edo barruti aurreraturik (<code>/</code>) eraman.",
        "tags-create-invalid-title-chars": "Etiketa izenak ezin du orri-tituluetan erabili ezin diren karaktererik eduki.",
        "tags-create-already-exists": "\"$1\" etiketa badago.",
+       "tags-create-warnings-above": "Hurrengo {{PLURAL:$2|abisua aurkitu da|abisuak aurkitu dira}} \"$1\" etiketa sortzen saiatzerakoan:",
        "tags-create-warnings-below": "Etiketaren sorrerarekin jarraitu nahi duzu?",
        "tags-delete-title": "Etiketa ezabatu",
        "tags-delete-explanation-initial": "Datu-basetik \"$1\" etiketa ezabatzera zoaz",
+       "tags-delete-explanation-in-use": "{{PLURAL:$2|$2 berrikusketa edo erregistro sarrera kenduko da|all $2 berrikusketa edota erregistro sarrera guztiak kenduko dira}} orain aplikatutako lekutik.",
+       "tags-delete-explanation-warning": "Akzio hau <strong>atzeraezina</strong> eta <strong>desegin</strong>ezin daitekeena da, ezta datu baseak antolatzen dituzten administratzaileen partez.Ezabatu nahi duzun etiketa hau dela ziurtatu.",
+       "tags-delete-explanation-active": "<strong>\"$1\" etiketa aktibo dago oraindik, eta etorkizunean aplikatzen jarraituko da.</strong> Hau ez gertatzea nahi bada, etiketa aplikatzeko jarrita dagoen leku(eta)ra jo, bertan ezgaitutzeko.",
        "tags-delete-reason": "Arrazoia:",
        "tags-delete-submit": "Betirako ezabatu etiketa hau",
        "tags-delete-not-allowed": "Luzapen batek definitutako etiketak ezin dira ezabatu, luzapenak bereziki baimendu ezean.",
        "tags-delete-not-found": "\"$1\" etiketa  ez da existitzen.",
+       "tags-delete-too-many-uses": "\"$1\" etiketa $2 {{PLURAL:$2|berrikusketa bat|berrikusketa}} baino gehiagotan aplikatu egin denez ezingo da ezabatu",
        "tags-delete-warnings-after-delete": "\"$1\" etiketa ezabatu egin da, baina hurrengo {{PLURAL:$2|abisua|abisuak}} aurkitu d(ir)a:",
        "tags-delete-no-permission": "Ez daukazu baimenik etiketa aldaketak ezabatzeko.",
        "tags-activate-title": "Etiketa aktibatu",
        "logentry-managetags-activate": "$1 {{GENDER:$2|erabiltzaileak}} \"$4\" etiketa erabiltzaile eta errobotek erabiltzeko aktibatu du",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|erabiltzaileak}} \"$4\" etiketa erabiltzaile eta errobotek erabiltzeko desaktibatu du",
        "log-name-tag": "Etiketen erregistroa",
+       "log-description-tag": "Orrialde honek erabiltzaileek [[Special:Tags|tags]] berrikuspenak bakarko edo erregistroko sarreretan gehitu edo kendu duten erakusten du. Erregistroak ez ditu zerrendatzen etiketatze-ekintzak editatzean, ezabatzean edo antzeko ekintzetan.",
        "logentry-tag-update-add-revision": "$1 wikilariak $6 {{PLURAL:$7|etiketa|etiketak}} $3 orriko $4 berrikusketara  {{GENDER:$2|gehitu}} egin d(it)u",
        "logentry-tag-update-add-logentry": "$1 wikilariak $6 {{PLURAL:$7|etiketa|etiketak}} $3 orriko $5 erregistro sarrerara  {{GENDER:$2|gehitu}} egin d(it)u",
        "logentry-tag-update-remove-revision": "$1 wikilariak $8 {{PLURAL:$9|etiketa|etiketak}} $3 orriko $4 berrikusketatik  {{GENDER:$2|kendu}} egin d(it)u",
        "logentry-tag-update-remove-logentry": "$1 wikilariak $8 {{PLURAL:$9|etiketa|etiketak}} $3 orriko $5 erregistro sarreratik  {{GENDER:$2|kendu}} egin d(it)u",
        "logentry-tag-update-revision": "$1 wikilariak $3 orriko $4 berrikusketan etiketak  {{GENDER:$2|eguneratu}} egin ditu ({{PLURAL:$7|gehitutakoak}}$6; {{PLURAL:$9|kendutakoak}} $8)",
+       "logentry-tag-update-logentry": "$1 wikilariak etiketak {{GENDER:$2|igo}} egin ditu $3 orriko $5 sarreran. ({{PLURAL:$7|gehituak}} $6; {{PLURAL:$9|kenduak}} $8)",
        "rightsnone": "(bat ere ez)",
        "rightslogentry-temporary-group": "$1 (momentuz, $2rarte)",
        "feedback-adding": "Orriari feedbacka gehitzen...",
        "feedback-back": "Atzera",
        "feedback-bugcheck": "Primeran! Soilik egiaztatu ez dagoela [$1 ezagututako zomorroak] barruan.",
        "feedback-bugnew": "Txekeatu dut. Bug berria bidaliko",
+       "feedback-bugornote": "Arazo tekniko bat xehetasunez deskribatzeko prest bazaude [bug baten berri eman $1] mesedez. Bestela, beheko formulario erraza erabil dezakezu. Zure iruzkina \"[$3 $2]\" orrialdean gehituko da, zure erabiltzaile-izenarekin batera.",
        "feedback-cancel": "Utzi",
        "feedback-close": "Egina",
        "feedback-external-bug-report-button": "Artxibatu lan tekniko bat",
        "expand_templates_generate_xml": "Erakutsi XML parse zuhaitza",
        "expand_templates_generate_rawhtml": "Erakutsi HTML gordina",
        "expand_templates_preview": "Aurreikusi",
+       "expand_templates_preview_fail_html": "<em> {{SITENAME}} HTML morroia gaituta duelako eta saio datuak galdu direnez,  aurrebista ezkutuko gisa ezkutatuta dago javascript-erasoen aurka babesteko. \n</em>\n\n<strong> Aurreikuspen saiakera bidezko bat bada, saiatu berriro mesedez. </strong>\nOraindik ez badu funtzionatzen, saiatu [[Special:UserLogout|logging out]] eta saioa berriro hasiz, eta egiaztatu zure nabigatzaileak gune honetako cookieak onartzen dituela.",
+       "expand_templates_preview_fail_html_anon": "<em> {{SITENAME}} HTML morroia gaituta duenez eta ez duzulako saioa hasi, aurrebista ezkutuan ezkutatuta dago javascript erasoen aurka. </em>\n\n<strong> Bidezkoa den aurrebista saiakera bat bada, mesedez [[Special:UserLogin|log in]] eta saiatu berriro. </strong>",
        "expand_templates_input_missing": "Gutxienez sarrera testuren bat eman behar duzu.",
        "pagelanguage": "Orriaren hizkuntza aldatu",
        "pagelang-name": "Orria",
        "log-name-pagelang": "Hizkuntza aldatu:",
        "log-description-pagelang": "Orrialdeetako hizkuntzen aldaketa saioa da hau.",
        "logentry-pagelang-pagelang": "$1k {{GENDER:$2|}} $3ren hizkuntza $4tik $5ra aldatu du",
+       "default-skin-not-found": "Whoops! Zure wikiaren azala lehenetsia, <code dir=\"ltr\">$wgDefaultSkin </code>n<code>$1</code> gisa definitua, ez dago erabilgarri.\n\nZure instalazioa {{PLURAL:$4|azal|azalak}} d(it)uela badirudi. Ikusi [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuala: Skin konfigurazioa] {{PLURAL:$4|it|horiek gaitu eta aukeratu lehenetsia}}.\n\n$2\n\n;MediaWiki instalatu baduzu:\n:Git-etik edo beste iturri kode batetik zuzenean instalatu duzu. Hau espero da. Saiatu larruazal batzuk instalatzen [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org-en azala direktorioa], honela:\n:* [Https://www.mediawiki.org/wiki/Download tarball installer] deskargatzen du, hainbat motatako eta luzapenekin dator. Kopiatu eta itsatsi dezakezu <code>skins/</code> direktorioan.\n:* Azaleko tarballs banakako deskargatzea [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git erabiliz pantaila deskargatzeko].\n: Egiteko hau ez du zure git biltegian oztopatuko MediaWiki garatzailea bada.\n\n; MediaWiki bertsioa berritua baduzu:\n: MediaWiki 1.24 eta bertsio berriagoak ez dituzte automatikoki instalatutako pantailak automatikoki gaitzen (ikus [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). {{PLURAL:$5| linea|lineak}} ondorengoa itsats dezakezu <code>LocalSettings.php</code> sisteman {{PLURAL:$5|hori|guztiak}} instalatuta izateko {{PLURAL: $5|azala|azalak}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Aldatu baduzu <code>LocalSettings.php</code>:\n: Egiaztatu erroreen azalaren izenak bi aldiz.",
+       "default-skin-not-found-no-skins": "Whoops! Zure wikierako azala lehenetsia, <code>$wgDefaultSkin</code>, <code>$1</code> gisa definituta dagoena, ez dago erabilgarri.\n\nEz dago instalatutako egiturarik.\n\n; MediaWiki instalatu edo berritu baduzu:\n: Git-etik edo beste iturri kode batetik zuzenean instalatu duzu seguruenik. Hau espero da. MediaWiki 1.24 eta berriagoak ez dira biltegi nagusiko inongo azalpenik espero. Saiatu larruazal batzuk instalatzen [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org-en azala direktorioa], honela:\n: * [Https://www.mediawiki.org/wiki/Download tarball installer] deskargatzen du, hainbat motatako luzapenekin datorrena. Kopiatu eta itsatsi dezakezu <code>skins/</code> direktorioa hortik.\n: * Azaleko tarballs banaka deskargatzea [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n: * [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git erabiliz pantaila deskargatzeko].\n:Egiteko hau ez du zure git biltegian oztopatuko MediaWiki garatzailea bada. Ikusi [https://www.mediawiki.org/wiki/Manual:Skin_configuration eskuliburua: Skin konfigurazioa] larruen gaitasunak nola egin jakiteko eta lehenetsi aukeratzeko.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (gaituta)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>desgaituta</strong>)",
        "mediastatistics": "Media estatistikak",
index 16a2cd8..19ba617 100644 (file)
        "anonpreviewwarning": "''شما به سامانه وارد نشده‌اید. ذخیره کردن باعث می‌شود که نشانی آی‌پی شما در تاریخچهٔ این صفحه ثبت گردد.''",
        "missingsummary": "'''یادآوری:''' شما خلاصهٔ ویرایش ننوشته‌اید.\nاگر دوباره دکمهٔ «$1» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
        "selfredirect": "<strong>هشدار:</strong> شما در حال تغییرمسیر صفحه به خودش هستید.\nامکان دارد هدف اشتباهی را برای تغییرمسیر انتخاب کردید، یا ممکن است صفحهٔ اشتباهی را ویرایش می‌کنید.\n\nاگر بر روی «$1» دوباره کلیک کنید، تغییرمسیر ساخته خواهد شد.",
-       "missingcommenttext": "Ù\84Ø·Ù\81اÙ\8b ØªÙ\88ضÛ\8cØ­Û\8c Ø¯Ø± Ø²Û\8cر Ø¨Û\8cÙ\81زاÛ\8cÛ\8cد.",
+       "missingcommenttext": "لطفاً توضیحی بیفزایید.",
        "missingcommentheader": "<strong>یادآوری:</strong> شما موضوع/عنوان این یادداشت را مشخص نکرده‌اید.\nاگر دوباره دکمهٔ «$1» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
        "summary-preview": "پیش‌نمایش خلاصه:",
        "subject-preview": "پیش‌نمایش موضوع:",
        "recentchanges-legend": "گزینه‌های تغییرات اخیر",
        "recentchanges-summary": "آخرین تغییرات ویکی را در این صفحه پی‌گیری کنید.",
        "recentchanges-noresult": "در فاصله زمانی ارائه شده هیچ تغییری با این معیارهای صورت نگرفته است",
+       "recentchanges-timeout": "این جستجو زمانش تمام شد. اگر مایلید کلیدواژه‌های دیگری را جستجو کنید.",
        "recentchanges-feed-description": "آخرین تغییرات ویکی را در این خوراک پی‌گیری کنید.",
        "recentchanges-label-newpage": "این ویرایش صفحه‌ای تازه ایجاد کرد",
        "recentchanges-label-minor": "این یک ویرایش جزئی است",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|ساعت|ساعت}}",
        "rcfilters-highlighted-filters-list": "پررنگ شده: $1",
        "rcfilters-quickfilters": "پالایه‌های ذخیره‌شده",
-       "rcfilters-quickfilters-placeholder-title": "هنوز پیوندی ذخیره نشده‌است",
+       "rcfilters-quickfilters-placeholder-title": "هنوز پالایه‌ای ذخیره نشده‌است",
        "rcfilters-quickfilters-placeholder-description": "برای ذخیره پالایه‌هایتان و استفاده مجدد آنها، در محیط فعال پالایه در پایین بر روی دکمهٔ بوک‌مارک کلیک کنید.",
        "rcfilters-savedqueries-defaultlabel": "پالایه‌های ذخیره‌شده",
        "rcfilters-savedqueries-rename": "تغییر نام",
index f5eab1e..28c580e 100644 (file)
        "anonpreviewwarning": "''Et ole kirjautunut sisään. Tallentaminen kirjaa IP-osoitteesi tämän sivun muutoshistoriaan.''",
        "missingsummary": "Et ole antanut yhteenvetoa. Jos valitset Tallenna uudelleen, niin muokkauksesi tallennetaan ilman yhteenvetoa.",
        "selfredirect": "<strong>Varoitus:</strong> Olet tekemässä uudelleenohjausta, joka johtaa tästä sivusta tähän samaan sivuun. \n\nOlet ehkä määrittänyt ohjauksen kohteen väärin tai kenties muokkaat parhaillaan väärää sivua.\n\nJos painat toimintoa \"$1\" uudestaan, tämä ohjaussivu luodaan joka tapauksessa.",
-       "missingcommenttext": "Kirjoita viesti alle.",
+       "missingcommenttext": "Kirjoita kommentti.",
        "missingcommentheader": "<strong>Muistutus:</strong> Et ole antanut aiheotsikkoa tälle kommentille. Napsauta ”$1”, jos haluat tallentaa kommenttisi ilman sellaista.",
        "summary-preview": "Yhteenvedon esikatselu:",
        "subject-preview": "Aiheotsikon esikatselu:",
        "grant-editprotected": "Muokata suojattuja sivuja",
        "grant-highvolume": "Suorittaa paljon muokkauksia",
        "grant-oversight": "Piilottaa käyttäjiä ja häivyttää yksittäisiä versioita",
-       "grant-patrol": "Partioida sivuihin tehtyjä muutoksia",
+       "grant-patrol": "Tarkastaa sivuihin tehtyjä muutoksia",
        "grant-privateinfo": "Päästä näkemään yksityiset tiedot",
        "grant-protect": "Suojata sivuja tai poistaa suojauksia",
        "grant-rollback": "Palauttaa sivuun tehtyjä muutoksia",
        "rcfilters-filter-user-experience-level-unregistered-label": "Rekisteröimätön",
        "rcfilters-filter-user-experience-level-unregistered-description": "Muokkaajat, jotka eivät ole kirjautuneet sisään.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Tulokkaat",
-       "rcfilters-filter-user-experience-level-newcomer-description": "Rekisteröityneet muokkaajat, joilla vähemmän kuin 10 muokkausta ja 4 päivää aktiivisuutta.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Rekisteröityneet muokkaajat, joilla vähemmän kuin 10 muokkausta tai 4 päivää aktiivisuutta.",
        "rcfilters-filter-user-experience-level-learner-label": "Oppijat",
        "rcfilters-filter-user-experience-level-learner-description": "Rekisteröityneet muokkaajat, joiden kokemus on välillä \"tulokas\" ja \"kokenut käyttäjä\".",
        "rcfilters-filter-user-experience-level-experienced-label": "Kokeneet käyttäjät",
        "delete-warning-toobig": "Tällä sivulla on pitkä muutoshistoria – yli $1 {{PLURAL:$1|versio|versiota}}. Näin suurien muutoshistorioiden poistaminen voi haitata sivuston suorituskykyä.",
        "deleteprotected": "Et voi poistaa tätä sivua, koska se on suojattu.",
        "deleting-backlinks-warning": "<strong>Varoitus:</strong> Sivulle, jota olet poistamassa, johtaa [[Special:WhatLinksHere/{{FULLPAGENAME}}|linkkejä muilta sivuilta]], taikka sivu on sisällytetty muuhun sivuun.",
+       "deleting-subpages-warning": "<strong>Varoitus:</strong> Sivu jota olet poistamassa on [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|alasivu|$1 alasivua|51=yli 50 alasivua}}]].",
        "rollback": "palauta aiempaan versioon",
        "rollbacklink": "palauta",
        "rollbacklinkcount": "palauta $1 {{PLURAL:$1|muutos|muutosta}}",
        "undelete-search-title": "Etsi poistettuja sivuja",
        "undelete-search-box": "Etsi poistettuja sivuja",
        "undelete-search-prefix": "Näytä sivut, jotka alkavat merkkijonolla:",
+       "undelete-search-full": "Näytä sivut, joiden otsikko sisältää:",
        "undelete-search-submit": "Hae",
        "undelete-no-results": "Poistoarkistosta ei löytynyt haettuja sivuja.",
        "undelete-filename-mismatch": "Tiedoston versiota, jonka aikaleima on $1, ei voi palauttaa, koska tiedostonimi ei ole sama.",
        "compare-title-not-exists": "Määrittämääsi sivua ei ole.",
        "compare-revision-not-exists": "Määrittämääsi versiota ei ole.",
        "diff-form": "Eroavaisuudet",
+       "permanentlink": "Pysyvä linkki",
        "dberr-problems": "Tällä sivustolla on teknisiä ongelmia.",
        "dberr-again": "Odota hetki ja lataa sivu uudelleen.",
        "dberr-info": "(Tietokantaan ei saada yhteyttä: $1)",
index 4cce904..202f247 100644 (file)
        "recentchanges-legend": "Options des modifications récentes",
        "recentchanges-summary": "Suivez les changements les plus récents du wiki sur cette page.",
        "recentchanges-noresult": "Aucune modification correspondant à ces critères sur la période indiquée.",
+       "recentchanges-timeout": "Cette recherche a dépassé le délai imparti. Vous pouvez vouloir essayer avec des paramètres de recherche différents.",
        "recentchanges-feed-description": "Suivez les dernières modifications du wiki dans ce flux.",
        "recentchanges-label-newpage": "Cette modification a créé une nouvelle page",
        "recentchanges-label-minor": "Cette modification est mineure.",
index e7d8bfb..455ecac 100644 (file)
        "recentchanges-legend": "אפשרויות בשינויים האחרונים",
        "recentchanges-summary": "ניתן לעקוב אחרי השינויים האחרונים באתר בדף זה.",
        "recentchanges-noresult": "לא היו בתקופה זו שינויים המתאימים לאפשרויות שנבחרו.",
+       "recentchanges-timeout": "נגמר זמן ההמתנה לקבלת תוצאות החיפוש. ניתן לנסות פרמטרים אחרים לחיפוש.",
        "recentchanges-feed-description": "ניתן לעקוב אחרי השינויים האחרונים באתר בדף זה.",
        "recentchanges-label-newpage": "בעריכה זו נוצר דף חדש",
        "recentchanges-label-minor": "זוהי עריכה משנית",
index a43a7a1..547a2fd 100644 (file)
        "prefs-email": "Mogućnosti e-maila",
        "prefs-rendering": "Izgled",
        "saveprefs": "Spremi",
-       "restoreprefs": "Vrati sve postavke na prvotno zadane",
+       "restoreprefs": "Vrati sve postavke na prvobitno zadane (u svim odjeljcima)",
        "prefs-editing": "Uređivanje",
        "searchresultshead": "Prikaz rezultata pretrage",
        "stub-threshold": "Prag za formatiranje poveznice na mrve ($1):",
        "email-blacklist-label": "Zabrani sljedećim suradnicima da mi šalju e-poruke:",
        "prefs-searchoptions": "Način traženja",
        "prefs-namespaces": "Imenski prostori",
-       "default": "prvotno",
+       "default": "predodređeno",
        "prefs-files": "Datoteke",
        "prefs-custom-css": "Prilagođen CSS",
        "prefs-custom-js": "Prilagođen JS",
index 8832651..5544c4e 100644 (file)
        "anonpreviewwarning": "<em>ログインしていません。投稿を保存すると、ご使用中のIPアドレスがこのページの履歴に記録されます。</em>",
        "missingsummary": "<strong>注意:</strong> 編集内容の要約が空欄です。\n「$1」をもう一度クリックすると、編集内容は要約なしで保存されます。",
        "selfredirect": "<strong>警告:</strong> あなたはこのページを自身に転送させようとしています。\n転送先の設定を間違ったか、あるいは間違ったページを編集しているかもしれません。\n「$1」を再度クリックすると、そのままの転送ページが作成されます。",
-       "missingcommenttext": "以下にコメントを入力してください。",
+       "missingcommenttext": "コメントを入力してください。",
        "missingcommentheader": "<strong>注意:</strong> このコメントに対する題名が空欄です。\n「$1」ボタンをもう一度押すと、空のまま編集が保存されます。",
        "summary-preview": "要約のプレビュー:",
        "subject-preview": "題名のプレビュー:",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|時間}}",
        "rcfilters-highlighted-filters-list": "強調表示中: $1",
        "rcfilters-quickfilters": "保存したフィルター",
-       "rcfilters-quickfilters-placeholder-title": "ã\83ªã\83³ã\82¯はまだ保存されていません",
+       "rcfilters-quickfilters-placeholder-title": "ã\83\95ã\82£ã\83«ã\82¿ã\83¼はまだ保存されていません",
        "rcfilters-quickfilters-placeholder-description": "フィルターの設定を保存し、後で再び使用するためには、下のアクティブフィルター内のブックマークアイコンをクリックしてください。",
        "rcfilters-savedqueries-defaultlabel": "保存したフィルター",
        "rcfilters-savedqueries-rename": "名称を変更",
        "rcfilters-savedqueries-new-name-label": "名称",
        "rcfilters-savedqueries-new-name-placeholder": "このフィルターの目的を説明してください",
        "rcfilters-savedqueries-apply-label": "フィルターを作成",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "既定フィルターを作成",
        "rcfilters-savedqueries-cancel-label": "キャンセル",
        "rcfilters-savedqueries-add-new-title": "現在のフィルター設定を保存する",
        "rcfilters-restore-default-filters": "標準設定の絞り込み条件を適用",
index f0cddab..7cae851 100644 (file)
        "rev-delundel": "owah pakatonan",
        "rev-showdeleted": "tuduhaké",
        "revisiondelete": "Busak/wurung busak révisi",
-       "revdelete-nooldid-title": "Rèvisi tujuan ora sah",
+       "revdelete-nooldid-title": "Révisi tujuan ora trep",
        "revdelete-nooldid-text": "Panjenengan durung mènèhi target revisi kanggo nglakoni fungsi iki.",
        "revdelete-no-file": "Barkas sing dipéngini ora ana.",
        "revdelete-show-file-confirm": "Apa panjenengan yakin arep mirsani révisi sing wis kabusak saka berkas \"<nowiki>$1</nowiki>\" ing $2, jam $3?",
        "revdelete-log": "Alesan:",
        "revdelete-submit": "Trapna ing {{PLURAL:$1|révisi|révisi}} kapilih",
        "revdelete-success": "Kekatonan owahan wis dianyari.",
-       "revdelete-failure": "'''Panampakan rèvisi ora bisa dianyari:'''\n$1",
+       "revdelete-failure": "Pakatonané révisiné ora bisa dianyari:\n$1",
        "logdelete-success": "Kekatonan log wis disetèl.",
        "logdelete-failure": "'''Aturan pandhelikan ora bisa disèt:'''\n$1",
        "revdel-restore": "Ngowahi visiblitas (pangatonan)",
        "mergehistory-fail": "Ora bisa nggabung sajarah, coba dipriksa manèh kacané lan paramèter wektuné.",
        "mergehistory-fail-invalid-source": "Kaca sumber ora trep.",
        "mergehistory-fail-invalid-dest": "Kaca paran ora trep.",
-       "mergehistory-fail-no-change": "Panggabung sajarah ora nggabungaké rèvisi. Mangga priksanen kaca lan paramèter wektuné.",
+       "mergehistory-fail-no-change": "Panggabung ing kala kawuri ora kasil nggabungaké révisi babar blas. Mangga priksanen manèh kaca lan paramèter wektuné.",
        "mergehistory-fail-self-merge": "Kaca asal lan kaca paran padha.",
-       "mergehistory-fail-timestamps-overlap": "Rèvisi asal tumpuk-undhung utawa njedhul sawisé révisi paran.",
+       "mergehistory-fail-timestamps-overlap": "Révisi asal tumpuk-undhung utawa njedhul sawisé révisi tujuan.",
        "mergehistory-fail-toobig": "Ora bisa nggabungaké sajarah amarga {{PLURAL:$1|révisi}} sing arep dilih munjuli $1.",
        "mergehistory-no-source": "Kaca sumber $1 ora ana.",
        "mergehistory-no-destination": "Kaca paran $1 ora ana.",
        "difference-title-multipage": "Béda antarané kaca \"$1\" lan \"$2\"",
        "difference-multipage": "(Prabédhan antar kaca)",
        "lineno": "Larik $1:",
-       "compareselectedversions": "Bandhingaké rèvisi sing kapilih",
+       "compareselectedversions": "Bandhingaké révisi sing kapilih",
        "showhideselectedversions": "Tampilaké/dhelikaké révisi kapilih",
        "editundo": "wurung",
        "diff-empty": "(Ora ana béda)",
        "diff-multi-sameuser": "({{PLURAL:$1|Sarévisi antara|$1 révisi antara}} déning panganggo sing padha sing ora katuduhaké)",
        "diff-multi-otherusers": "({{PLURAL:$1|Siji révisi langsung|$1 révisi langsung}} déning {{PLURAL:$2|siji panganggo liyané|$2 panganggo}} ora dituduhaké)",
-       "diff-multi-manyusers": "({{PLURAL:$1Siji rèvisi sedhengan|$1 rèvisi sedhengan}} déning luwih saka $2 {{PLURAL:$2|panganggo|panganggo}} ora dituduhaké)",
+       "diff-multi-manyusers": "({{PLURAL:$1|Siji révisi langsung|$1 révisi langsung}} déning {{PLURAL:$2|panganggo|panganggo}} $2 ora katuduhaké)",
        "difference-missing-revision": "{{PLURAL:$2|Sak pambenahan|$2 pambenahan}} saka prabédan iki ($1) {{PLURAL:$2|ora ditemokaké|ora ditemokaké}}.\n\nIki biasané kasebab pranala prabedan sing wis ora kanggo saka kaca isi wis dibusak.\nRinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].",
        "searchresults": "Kasiling golèk",
        "searchresults-title": "Kasiling golèk \"$1\"",
        "undeletepagetitle": "'''Ing ngisor iki kapacak daftar révisi sing dibusak saka [[:$1]]'''.",
        "viewdeletedpage": "Deleng kaca sing wis dibusak",
        "undeletepagetext": "{{PLURAL:$1|kaca iki wis dibusak nanging isih|$1 kaca iki wis dibusak nanging isih}} ana ing arsip lan bisa dibalèkaké.\nArsip bisa diresiki sakala-kala.",
-       "undelete-fieldset-title": "Mulihaké rèvisi",
+       "undelete-fieldset-title": "Pulihaké révisi",
        "undeleteextrahelp": "Saperlu mulihaké kabèh surajah kaca, jaraké kothak cèk kosong banjur klik <strong><em>{{int:undeletebtn}}</em></strong>.\nSaperlu ngayahi réstorasi sèlèktif, cèk kothak sing magepokan karo révisi sing arep dipulihaké, banjur klik <strong><em>{{int:undeletebtn}}</em></strong>.",
        "undeleterevisions": "$1 {{PLURAL:$1|révisi|révisi}} diarsipaké",
        "undeletehistory": "Yèn panjenengan mbalèkaké kaca, kabèh révisi bakal dibalèkaké jroning sajarah.\nYèn sawijining kaca anyar kanthi jeneng sing padha wis digawé wiwit nalika pambusakan, révisi sing wis dibalèkaké bakal katon jroning sajarah sadurungé.",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|ngalih}} kaca $3 menyang $4 tanpa ninggal alihan",
        "logentry-move-move_redir": "$1 {{GENDER:$2|ngalih}} kaca $3 menyang $4 kanthi nindhihi alihan",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|ngalih}} kaca $3 menyang $4 kanthi nindhihi alihan tanpa nginggal alihan",
-       "logentry-patrol-patrol": "$1 {{GENDER:$2|nengeri}} rèvisi $4 saka kaca $3 sing diawasi",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|nengeri}} révisi $4 saka kaca $3 sing diawasi",
        "logentry-patrol-patrol-auto": "$1 otomatis {{GENDER:$2|nandhani}} benahan $4 saka kaca $3 kaawasake",
        "logentry-newusers-newusers": "Akun panganggo $1 {{GENDER:$2|digawé}}",
        "logentry-newusers-create": "Akun panganggo $1 {{GENDER:$2|digawé}}",
index 8d8a713..0f0e806 100644 (file)
        "anonpreviewwarning": "''თქვენ არ შესულხართ სისტემაში. თქვენი IP მისამართი შეინახება გვერდის ისტორიაში. ''",
        "missingsummary": "'''შეხსენება:''' თქვენ არ მიგითითებიათ რედაქტირების რეზიუმე.\nთუ ისევ დააწკაპუნებთ შენახვაზე, თქვენი რედაქტირება რეზიუმეს გარეშე დამახსოვრდება.",
        "selfredirect": "გაფრთხილება: თქვენ გადამისამართებას იმავე გვერდზე ქმნით. შესაძლოა, თქვენ გადამისამართებისთვის აირჩიეთ არასწორი სამიზნე გვერდი ან არედაქტირებთ არასამიზნე გვერდს. \n\nთუ თქვენ კიდევ ერთხელ დააჭერთ ღილაკს \"$1\", გადამისამართება შეიქმნება.",
-       "missingcommenttext": "á\83\92á\83\97á\83®á\83\9dá\83\95á\83\97 á\83\99á\83\9dá\83\9bá\83\94á\83\9cá\83¢á\83\90á\83 á\83\98 á\83¨á\83\94á\83\98á\83§á\83\95á\83\90á\83\9cá\83\9dá\83\97 á\83¥á\83\95á\83\94á\83\9bá\83\9dá\83\97.",
+       "missingcommenttext": "á\83\92á\83\97á\83®á\83\9dá\83\95á\83\97 á\83¨á\83\94á\83\98á\83§á\83\95á\83\90á\83\9cá\83\9dá\83\97 á\83\99á\83\9dá\83\9bá\83\94á\83\9cá\83¢á\83\90á\83 á\83\98.",
        "missingcommentheader": "<strong>შეხსენება:</strong> თქვენ ამ კომენტარისთვის თემა არ მიგითითებიათ. თუ შენახვაზე \"$1\" დააწკაპუნებთ, თქვენი ცვლილება მის გარეშე იქნება შენახული.",
        "summary-preview": "რეზიუმეს წინასწარი გადახედვა:",
        "subject-preview": "თემის გადახედვა:",
        "recentchanges-legend": "ბოლო ცვლილებების პარამეტრები",
        "recentchanges-summary": "ამ გვერდზე შეგიძლიათ თვალი ადევნოთ ვიკის ბოლო ცვლილებებს.",
        "recentchanges-noresult": "მითითებულ პერიოდსა და სახელთა სივრცეში ცვლილებები არ არის.",
+       "recentchanges-timeout": "ძიებას ვადა გაუვიდა. შეგიძლიათ სცადოთ ძიების სხვა პარამეტრები.",
        "recentchanges-feed-description": "ვიკის უახლესი ცვლილებების მეთვალყურეობა ამ არხში.",
        "recentchanges-label-newpage": "ამ რედაქტირებით შეიქმნა ახალი გვერდი",
        "recentchanges-label-minor": "ეს არის მცირე შესწორება",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|საათი|საათი}}",
        "rcfilters-highlighted-filters-list": "ნაჩვენებია: $1",
        "rcfilters-quickfilters": "შენახული ფილტრები",
-       "rcfilters-quickfilters-placeholder-title": "á\83¨á\83\94á\83\9cá\83\90á\83®á\83£á\83\9aá\83\98 á\83\91á\83\9bá\83£á\83\9aá\83\94á\83\91á\83\98 á\83\90á\83  á\83\90á\83 á\83\98á\83¡ á\83¯á\83\94á\83 ",
+       "rcfilters-quickfilters-placeholder-title": "á\83¨á\83\94á\83\9cá\83\90á\83®á\83£á\83\9aá\83\98 á\83¤á\83\98á\83\9aá\83¢á\83 á\83\94á\83\91á\83\98 á\83¯á\83\94á\83  á\83\90á\83  á\83\90á\83 á\83\98á\83¡",
        "rcfilters-quickfilters-placeholder-description": "ფილტრის პარამეტრების შენახვისთვის და მოგვიანებით მათი გამოყენებისთვის, დააჭირეთ ჩანართის ხატულას აქტიური ფილტრის არეში, ქვემოთ.",
        "rcfilters-savedqueries-defaultlabel": "შენახული ფილტრები",
        "rcfilters-savedqueries-rename": "გადარქმევა",
index e404fda..3ba1eaf 100644 (file)
        "recentchanges-legend": "최근 바뀜 설정",
        "recentchanges-summary": "이 페이지에서 위키의 최근 바뀜을 추적합니다.",
        "recentchanges-noresult": "지정한 조건과 일치하는 주어진 기간 동안 바뀜이 없습니다.",
+       "recentchanges-timeout": "이 검색의 시간이 초과되었습니다. 다른 검색 변수를 사용할 수 있습니다.",
        "recentchanges-feed-description": "이 피드에 위키의 최근 바뀜을 추적합니다.",
        "recentchanges-label-newpage": "새 문서",
        "recentchanges-label-minor": "사소한 편집",
index 49aa82f..a29f1ad 100644 (file)
        "movedarticleprotection": "perkelti apsaugos nustatymai iš „[[$2]]“ į „[[$1]]“",
        "protectedarticle-comment": "{{GENDER:$2|Užrakino}} „[[$1]]“",
        "modifiedarticleprotection-comment": "{{GENDER:$2|Pakeitė „[[$1]]“ apsaugos lygį}}",
-       "unprotectedarticle-comment": "{{GENDER:$2|Pašalino apsaugą}} iš „[[$1]]“",
+       "unprotectedarticle-comment": "{{GENDER:$2|Atrakino}} „[[$1]]“",
        "protect-title": "Nustatomas apsaugos lygis puslapiui „$1“",
        "protect-title-notallowed": "Peržiūrėti \"$1\" apsaugos lygį",
        "prot_1movedto2": "[[$1]] pervadintas į [[$2]]",
index f8fd147..138bda1 100644 (file)
        "anonpreviewwarning": "''Не сте најавени. Ако ја зачувате, Вашата IP-адреса ќе биде заведена во историјата на уредување на страницата.''",
        "missingsummary": "'''Потсетник:''' Не внесовте опис на измените. Ако притиснете Зачувај повторно, вашите измени ќе се зачуваат без опис.",
        "selfredirect": "<strong>Предупредување:</strong> Создавате пренасочување кон истата статија.\nМоже да сте укажале грешна целна страница, или пак уредувате погрешна страница.\nАко стиснете на „$1“ повторно, тогаш пренасочувањето бездруго ќе се создаде.",
-       "missingcommenttext": "Ð\92е Ð¼Ð¾Ð»Ð¸Ð¼Ðµ Ð²Ð½ÐµÑ\81еÑ\82е ÐºÐ¾Ð¼ÐµÐ½Ñ\82аÑ\80 Ð¿Ð¾Ð´Ð¾Ð»Ñ\83.",
+       "missingcommenttext": "Ð\92неÑ\81еÑ\82е ÐºÐ¾Ð¼ÐµÐ½Ñ\82аÑ\80.",
        "missingcommentheader": "<strong>Потсетување:</strong> Не внесовте наслов за овој коментар.\nАко повторно стиснете на „$1“, уредувањето ќе биде зачувано без наслов.",
        "summary-preview": "Преглед на описот:",
        "subject-preview": "Преглед на насловот:",
        "recentchanges-legend": "Нагодувања за скорешни промени",
        "recentchanges-summary": "На оваа страница ги следите скорешните промени на викито.",
        "recentchanges-noresult": "Нема промени од дадениот период што одговараат на бараното.",
+       "recentchanges-timeout": "Ова пребарување истече. Пробајте со поинакви параметри.",
        "recentchanges-feed-description": "Следење на најскорешните промени на викито во овие емитувања.",
        "recentchanges-label-newpage": "Нова страница",
        "recentchanges-label-minor": "Ова е ситна промена",
index dbfbdb2..4a3ecee 100644 (file)
        "badaccess": "Erro de premisson",
        "versionrequired": "Ye percisa la beson $1 de l MediaWiki",
        "ok": "OK",
+       "pagetitle": "$1 - {{SITENAME}}",
        "retrievedfrom": "Sacado an \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|Tu tenes}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Ten}} $1 de {{PLURAL:$3|outro outelizador|$3 outelizadores}} ($2).",
        "yourtext": "L tou testo",
        "storedversion": "berson guardada",
        "yourdiff": "Defréncias",
-       "copyrightwarning": "Por fabor, bei que todas las tues cuntribuiçones an {{SITENAME}} son cunsideradas cumo feitas ne ls termos de la lhicença $2 (bei $1 pa detailhes).\nSe nun quieres que l tou testo seia eiditado sin piedade i reçtribuído cunsante la gana, nun l ambies.<br />\nTu stás, al mesmo tiempo, a garantir-mos qu'esto ye algo screbido por ti, ó algo copiado d'ua fuonte de testos an domínio público ó parecido de teor lhibre.\n<strong>Nun ambies trabalho portegido por dreitos d'outor sien l debido permisso!</strong>",
+       "copyrightwarning": "Por fabor, bei que todas las tues cuntrebuiçones an {{SITENAME}} son cunsideradas cumo feitas ne ls termos de la licença $2 (bei $1 pa detailhes).\nSe nun quieres que l tou testo seia eiditado sin piedade i reçtribuído cunsante la gana, nun l ambies.<br />\nTu stás, al mesmo tiempo, a garantir-mos que esto ye algo screbido por ti, ó algo copiado dua fuonte de testos an domínio público ó parecido de teor lhibre.\n<strong>Nun ambies trabalho portegido por dreitos de outor sien l debido permisson!</strong>",
        "templatesused": "{{PLURAL:$1|Modelo ousado|Modelos ousados}} nesta páigina:",
        "templatesusedpreview": "{{PLURAL:$1|Modelo outelizado|Modelos outelizados}} neste amostra:",
        "template-protected": "(portegida)",
        "categories": "Catadories",
        "categories-submit": "Amostrar",
        "deletedcontributions": "Eidiçones botadas fuora",
-       "deletedcontributions-title": "Cuntribuiçones botadas fuora",
+       "deletedcontributions-title": "Cuntrebuiçones botadas fuora",
        "linksearch": "Percura de lhigaçones sternas",
        "linksearch-ok": "Percurar",
        "listusers-submit": "Amostrar",
        "namespace_association": "Domínio associado",
        "tooltip-namespace_association": "Marque esta caixa pa ancluir tamien l domínio de cuntenido ó de cumbersa associado a la sue seleçon",
        "blanknamespace": "(Percipal)",
-       "contributions": "Cuntribuiçones {{GENDER:$1|de l outelizador|de la outelizadora|de l(a) outelizador(a)}}",
+       "contributions": "Cuntrebuiçones {{GENDER:$1|de l outelizador|de la outelizadora|de l(a) outelizador(a)}}",
        "contributions-title": "Upas {{GENDER:$1|de l outelizador|de la outelizadora}} $1",
        "mycontris": "Las mies upas",
        "anoncontribs": "Cuntrebuiçones",
        "uctop": "(rebison atual)",
        "month": "De l més (i atrasados):",
        "year": "De l anho (i atrasados):",
-       "sp-contributions-newbies": "Percurar solo an las cuntribuiçones de nuobas cuontas",
+       "sp-contributions-newbies": "Amostrar solo las cuntrebuiçones de cuontas recientes",
        "sp-contributions-newbies-sub": "Pa cuontas nuobas",
+       "sp-contributions-newbies-title": "Cuntrebuiçones de cuontas nuobas",
        "sp-contributions-blocklog": "registro de bloqueios",
        "sp-contributions-uploads": "cargaduras",
        "sp-contributions-logs": "registros",
        "sp-contributions-talk": "cumbersa",
-       "sp-contributions-search": "Percurar cuntribuiçones",
+       "sp-contributions-search": "Percurar cuntrebuiçones",
        "sp-contributions-username": "Morada de IP ó outelizador:",
        "sp-contributions-toponly": "Amostrar solo las eidiçones mais recientes",
        "sp-contributions-newonly": "Amostrar solo eidiçones que son criaçones de páiginas",
        "tooltip-t-recentchangeslinked": "Redadeiras altaraçones an páiginas que ténen a ber cun esta",
        "tooltip-feed-rss": "Feed RSS pa esta páigina",
        "tooltip-feed-atom": "Feed Atom pa esta páigina",
-       "tooltip-t-contributions": "Ber las cuntribuiçones {{GENDER:$1|deste outelizador|desta outelizadora|deste(a) outelizador(a)}}",
+       "tooltip-t-contributions": "Ber las cuntrebuiçones {{GENDER:$1|deste outelizador|desta outelizadora|deste(a) outelizador(a)}}",
        "tooltip-t-emailuser": "Ambiar ua carta eiletrónica a {{GENDER:$1|este outelizador|esta outelizadora|este(a) outelizador(a)}}",
        "tooltip-t-upload": "Cargar eimaiges ó fexeiros",
        "tooltip-t-specialpages": "Todas las páiginas speciales",
index c9bdf45..c0ca479 100644 (file)
        "recentchanges-legend": "Alternativer for siste endringer",
        "recentchanges-summary": "På denne siden vises de siste endringene i wikien.",
        "recentchanges-noresult": "Ingen endringer i perioden passer med kriteriene.",
+       "recentchanges-timeout": "Tidsfristen for søket har løpt ut. Du bør prøve andre søkeparametere.",
        "recentchanges-feed-description": "Følg med på siste endringer i denne wikien med denne matingen.",
        "recentchanges-label-newpage": "Denne redigeringen opprettet en ny side",
        "recentchanges-label-minor": "Dette er en mindre endring",
index ba89a66..712b00c 100644 (file)
        "recentchanges-legend": "Opções das mudanças recentes",
        "recentchanges-summary": "Acompanhe nesta página as mudanças mais recentes deste wiki.",
        "recentchanges-noresult": "Nenhuma alteração correspondente a esses critérios foi realizada durante o período selecionado.",
+       "recentchanges-timeout": "Esta pesquisa expirou. Você pode tentar diferentes parâmetros de pesquisa.",
        "recentchanges-feed-description": "Acompanhe neste feed as mudanças mais recentes do wiki.",
        "recentchanges-label-newpage": "Esta edição criou uma nova página",
        "recentchanges-label-minor": "Esta é uma edição menor",
index 5ef9e66..d731322 100644 (file)
        "recentchanges-summary": "Summary of [[Special:RecentChanges]].",
        "recentchangestext": "Text in [[Special:RecentChanges]]",
        "recentchanges-noresult": "Used in [[Special:RecentChanges]], [[Special:RecentChangesLinked]], and [[Special:Watchlist]] when there are no changes to be shown.",
+       "recentchanges-timeout": "Used in [[Special:RecentChanges]], [[Special:RecentChangesLinked]], and [[Special:Watchlist]] when a query times out.",
        "recentchanges-feed-description": "Used in feed of RecentChanges. See example [{{canonicalurl:Special:RecentChanges|feed=atom}} feed].",
        "recentchanges-label-newpage": "# Used as tooltip for {{msg-mw|Newpageletter}}.\n# Also used as legend. Preceded by {{msg-mw|Newpageletter}} and followed by {{msg-mw|Recentchanges-legend-newpage}}.",
        "recentchanges-label-minor": "# Used as tooltip for {{msg-mw|Minoreditletter}}\n# Also used as legend. Preceded by {{msg-mw|Minoreditletter}}",
index c1d219f..3dd7689 100644 (file)
        "databaseerror-query": "Inderrogazione: $1",
        "databaseerror-function": "Funzione: $1",
        "databaseerror-error": "Errore: $1",
+       "transaction-duration-limit-exceeded": "Pe evità 'nu retarde ierte de repliche, sta operazzione ha state inderrotte peurcé 'a durate d'u tiembe de scretture ($1) ave supranate 'u limite de $2 {{PLURAL:$2|seconde}}.\n\nCe se ste cange 'nu sbuénne de vôsce jndr'à 'na botta sole, pruève a ffà cchiù operazziune cu mene vôsce a vote.",
        "laggedslavemode": "Attenzione: 'A pàgene no ge tène cangiaminde recente.",
        "readonly": "Archivie blocchete",
        "enterlockreason": "Mitte 'na raggione p'u blocche, 'ncludenne 'na stime de quanne 'u blocche avène luate.",
        "rcfilters-filter-user-experience-level-unregistered-description": "Cangiature ca non g'onne trasute.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Utinde nuève",
        "rcfilters-filter-user-experience-level-learner-label": "Uecchieachiuse",
+       "rcfilters-filter-user-experience-level-experienced-label": "Utinde cu esperienze",
+       "rcfilters-filter-user-experience-level-experienced-description": "Utinde reggistrate cu cchiù de 500 cangiaminde e 30 sciurne de attivitate.",
+       "rcfilters-filtergroup-automated": "Condrebbute automatece",
        "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Cangiaminde fatte da struminde automatece.",
+       "rcfilters-filter-humans-label": "Umane (none bot)",
+       "rcfilters-filter-humans-description": "Cangiaminde fatte da condrebbuture umane.",
+       "rcfilters-filtergroup-reviewstatus": "State d'a revisione",
        "rcfilters-filter-patrolled-label": "Condrollate",
        "rcfilters-filter-patrolled-description": "Cangiaminde signate cumme condrollate.",
        "rcfilters-filter-unpatrolled-label": "Non condrollate",
index d15f30f..2de638c 100644 (file)
        "anonpreviewwarning": "''Вы не представились системе. Сохранение приведёт к записи вашего IP-адреса в историю изменений страницы.''",
        "missingsummary": "'''Напоминание.''' Вы не дали краткого описания изменений. При повторном нажатии на кнопку «$1» ваши изменения будут сохранены без комментария.",
        "selfredirect": "<strong>Внимание:</strong> Вы создаёте перенаправление на ту же самую статью.\nВозможно, Вы выбрали неправильную целевую страницу для перенаправления или редактируете не ту страницу.\nЕсли Вы нажмёте кнопку «$1» ещё раз, перенаправление всё же будет создано.",
-       "missingcommenttext": "Ð\9fожалÑ\83йÑ\81Ñ\82а, Ð²Ð²ÐµÐ´Ð¸Ñ\82е Ð½Ð¸Ð¶Ðµ Ð²Ð°Ñ\88е Ñ\81ообÑ\89ение.",
+       "missingcommenttext": "Ð\9fожалÑ\83йÑ\81Ñ\82а, Ð²Ð²ÐµÐ´Ð¸Ñ\82е ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82аÑ\80ий.",
        "missingcommentheader": "<strong>Напоминание.</strong> Вы не указали тему/заголовок для этого комментария.\nПри повторном нажатии на кнопку «$1», ваша правка будет записана без заголовка.",
        "summary-preview": "Предпросмотр описания изменения:",
        "subject-preview": "Предпросмотр темы/заголовка:",
        "timezoneregion-europe": "Европа",
        "timezoneregion-indian": "Индийский океан",
        "timezoneregion-pacific": "Тихий океан",
-       "allowemail": "РазÑ\80еÑ\88иÑ\82Ñ\8c Ð¿Ð¾Ð»Ñ\83Ñ\87ение Ñ\8dлекÑ\82Ñ\80онной Ð¿Ð¾Ñ\87Ñ\82Ñ\8b Ð¾Ñ\82 Ð´Ñ\80Ñ\83гиÑ\85 Ñ\83Ñ\87аÑ\81Ñ\82ников",
-       "email-blacklist-label": "Ð\97апÑ\80еÑ\82иÑ\82Ñ\8c Ñ\8dÑ\82им Ñ\83Ñ\87аÑ\81Ñ\82никам Ð¾Ñ\82пÑ\80авлÑ\8fÑ\82Ñ\8c Ð¼Ð½Ðµ Ñ\8dлекÑ\82Ñ\80оннÑ\8bе Ð¿Ð¸Ñ\81Ñ\8cма:",
+       "allowemail": "РазÑ\80еÑ\88иÑ\82Ñ\8c Ð´Ñ\80Ñ\83гим Ñ\83Ñ\87аÑ\81Ñ\82никам Ð¾Ñ\82пÑ\80авлÑ\8fÑ\82Ñ\8c Ð¼Ð½Ðµ Ñ\8dлекÑ\82Ñ\80оннÑ\83Ñ\8e Ð¿Ð¾Ñ\87Ñ\82Ñ\83",
+       "email-blacklist-label": "Ð\97апÑ\80еÑ\82иÑ\82Ñ\8c Ñ\8dÑ\82им Ñ\83Ñ\87аÑ\81Ñ\82никам Ð¾Ñ\82пÑ\80авлÑ\8fÑ\82Ñ\8c Ð¼Ð½Ðµ Ñ\8dлекÑ\82Ñ\80оннÑ\83Ñ\8e Ð¿Ð¾Ñ\87Ñ\82Ñ\83:",
        "prefs-searchoptions": "Поиск",
        "prefs-namespaces": "Пространства имён",
        "default": "по умолчанию",
        "recentchanges-legend": "Настройки свежих правок",
        "recentchanges-summary": "Ниже в хронологическом порядке перечислены последние изменения на страницах {{grammar:genitive|{{SITENAME}}}}.",
        "recentchanges-noresult": "Изменений в указанный период, соответствующих указанным условиям, нет.",
+       "recentchanges-timeout": "Время ожидания этого поиска истекло. Вы можете попробовать задать другие параметры поиска.",
        "recentchanges-feed-description": "Отслеживание последних изменений в вики.",
-       "recentchanges-label-newpage": "Этой правкой была создана новая страница.",
+       "recentchanges-label-newpage": "Этой правкой была создана новая страница",
        "recentchanges-label-minor": "Это незначительное изменение",
        "recentchanges-label-bot": "Эта правка сделана ботом",
        "recentchanges-label-unpatrolled": "Эта правка ещё никем не патрулировалась",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|час|часа|часов}}",
        "rcfilters-highlighted-filters-list": "Подсвечено: $1",
        "rcfilters-quickfilters": "Сохранённые фильтры",
-       "rcfilters-quickfilters-placeholder-title": "Сохраненных ссылок еще нет",
+       "rcfilters-quickfilters-placeholder-title": "Сохранённых фильтров ещё нет",
        "rcfilters-quickfilters-placeholder-description": "Чтобы сохранить настройки фильтра и повторно использовать их позже, щелкните значок закладки в области «Активный фильтр» ниже.",
        "rcfilters-savedqueries-defaultlabel": "Сохранённые фильтры",
        "rcfilters-savedqueries-rename": "Переименовать",
        "rcfilters-filter-user-experience-level-unregistered-label": "Незарегистрированные",
        "rcfilters-filter-user-experience-level-unregistered-description": "Редакторы, которые не вошли в систему.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Новички",
-       "rcfilters-filter-user-experience-level-newcomer-description": "Зарегистрированные редакторы с менее чем 10 правками и 4 днями работы.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Зарегистрированные редакторы, у которых менее 10 правок или 4 дней работы.",
        "rcfilters-filter-user-experience-level-learner-label": "Учащиеся",
        "rcfilters-filter-user-experience-level-learner-description": "Зарегистрированные редакторы, чей опыт находится где-то между уровнями «Новичок» и «Опытные пользователи».",
        "rcfilters-filter-user-experience-level-experienced-label": "Опытные пользователи",
        "uploaded-script-svg": "Найден небезопасный элемент с поддержкой сценариев «$1» в загруженном SVG-файле.",
        "uploaded-hostile-svg": "Найден небезопасный CSS-код в элементе стиля загруженного SVG-файла.",
        "uploaded-event-handler-on-svg": "Установка атрибутов обработчика событий <code>$1=\"$2\"</code> не разрешено для SVG-файлов.",
-       "uploaded-href-attribute-svg": "Ð\92 SVG-Ñ\84айлаÑ\85 href-аÑ\82Ñ\80ибÑ\83Ñ\82Ñ\8b Ð´Ð»Ñ\8f Ñ\81Ñ\81Ñ\8bлки, Ð½Ð°Ð¹Ð´ÐµÐ½Ð½Ð¾Ð¹ Ð² <code><$1 $2=\"$3\"></code>, Ñ\80азÑ\80еÑ\88енÑ\8b Ñ\82олÑ\8cко Ñ\86ели, Ð½Ð°Ñ\87инаÑ\8eÑ\89иеÑ\81Ñ\8f Ð½Ð° http:// Ð¸Ð»Ð¸ https://.",
+       "uploaded-href-attribute-svg": "ЭлеменÑ\82Ñ\8b <a> Ð¼Ð¾Ð³Ñ\83Ñ\82 Ñ\81Ñ\81Ñ\8bлаÑ\82Ñ\8cÑ\81Ñ\8f (href) Ñ\82олÑ\8cко Ð½Ð° data: (вÑ\81Ñ\82Ñ\80оеннÑ\8bй Ñ\84айл), Ñ\81Ñ\81Ñ\8bлки http:// Ð¸Ð»Ð¸ https:// Ð¸Ð»Ð¸ Ñ\84Ñ\80агменÑ\82 (#, Ð² Ñ\82ом Ð¶Ðµ Ð´Ð¾ÐºÑ\83менÑ\82е). Ð\94лÑ\8f Ð´Ñ\80Ñ\83гиÑ\85 Ñ\8dлеменÑ\82ов, Ñ\82акиÑ\85 ÐºÐ°Ðº <image>, Ñ\80азÑ\80еÑ\88енÑ\8b Ñ\82олÑ\8cко data: Ð¸ Ñ\84Ñ\80агменÑ\82. Ð\9fопÑ\80обÑ\83йÑ\82е Ð²Ð½ÐµÐ´Ñ\80иÑ\82Ñ\8c Ð¸Ð·Ð¾Ð±Ñ\80ажениÑ\8f Ð¿Ñ\80и Ñ\8dкÑ\81поÑ\80Ñ\82е SVG. Ð\9dайдено <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-href-unsafe-target-svg": "В загруженном SVG-файле найдены небезопасные данные: URI <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-animate-svg": "Найден тег «animate», который может изменять ссылку с помощью «from»-атрибута <code>&lt;$1 $2=\"$3\"&gt;</code> в загруженном SVG-файле.",
        "uploaded-setting-event-handler-svg": "Установка атрибутов обработчика событий заблокирована, в загруженном SVG-файле найден код <code>&lt;$1 $2=\"$3\"&gt;</code>.",
index e9ca049..89ff58d 100644 (file)
        "recentchanges-legend": "Možnosti zadnjih sprememb",
        "recentchanges-summary": "Na tej strani lahko spremljate najnovejše spremembe wikija.",
        "recentchanges-noresult": "V danem obdobju nobena sprememba ne ustreza tem merilom.",
+       "recentchanges-timeout": "Čas iskanja je potekel. Poskusite uporabiti drugačne parametre iskanja.",
        "recentchanges-feed-description": "Spremljajte zadnje spremembe wikija prek tega vira.",
        "recentchanges-label-newpage": "To urejanje je ustvarilo novo stran",
        "recentchanges-label-minor": "To je manjše urejanje",
index facf480..300a037 100644 (file)
        "rcfilters-filter-user-experience-level-unregistered-label": "Oregistrerade",
        "rcfilters-filter-user-experience-level-unregistered-description": "Redigerare som inte är inloggade.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Nykomlingar",
-       "rcfilters-filter-user-experience-level-newcomer-description": "Registrerade redigerare med färre än 10 redigeringar och 4 dagars aktivitet.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Registrerade redigerare som har färre än 10 redigeringar eller 4 dagars aktivitet.",
        "rcfilters-filter-user-experience-level-learner-label": "Nybörjare",
        "rcfilters-filter-user-experience-level-learner-description": "Registrerade redigerare vars erfarenhet hamnar mellan \"Nybörjare\" och \"Erfarna användare\".",
        "rcfilters-filter-user-experience-level-experienced-label": "Erfarna användare",
index 973741b..c9845d6 100644 (file)
        "ncategories": "$1 {{PLURAL:$1|гурӯҳ|гурӯҳҳо}}",
        "nlinks": "$1 {{PLURAL:$1|пайванд|пайвандҳо}}",
        "nmembers": "$1 {{PLURAL:$1|узв}}",
-       "nrevisions": "$1 {{PLURAL:$1|вироиш|вироиш}}",
+       "nrevisions": "{{PLURAL:$1|вироиш|вироиши}} $1",
        "specialpage-empty": "Барои ин ҳисобот натиҷае вуҷуд надорад.",
        "lonelypages": "Саҳифаҳои ятим",
        "lonelypagestext": "Ба саҳифаҳои зерин дар дигар саҳифаи {{SITENAME}} пайванд дода нашудааст.",
        "import-comment": "Тавзеҳ:",
        "importtext": "Лутфан парвандаро аз вики манбаъ содир кунед, аз тариқи саҳифа [[Special:Export|абзори содирот]].\nПас онро ба компютератон захира карда инҷо боргузорӣ кунед.",
        "importstart": "Дар ҳоли ворид кардани саҳифаҳо...",
-       "import-revision-count": "$1 {{PLURAL:$1|вироиш|вироиш}}",
+       "import-revision-count": "{{PLURAL:$1|вироиш|вироиши}} $1",
        "importnopages": "Саҳифаҳо барои ворид кардан нест.",
        "importfailed": "Ворид кардани саҳифаҳо шикаст хӯрд: $1",
        "importunknownsource": "Навъи манбаи номаълум барои воридкуни",
index 3dc3b49..f662c07 100644 (file)
        "compare-invalid-title": "ชื่อเรื่องที่คุณระบุไม่ถูกต้อง",
        "compare-title-not-exists": "ชื่อเรื่องที่คุณระบุไม่มีอยู่",
        "compare-revision-not-exists": "รุ่นที่คุณระบุไม่มีอยู่",
-       "diff-form": "'''แบบฟอร์ม'''",
+       "diff-form": "ความแตกต่าง",
        "dberr-problems": "ขออภัย เว็บไซต์นี้กำลังพบกับข้อผิดพลาดทางเทคนิค",
        "dberr-again": "กรุณารอสักครู่แล้วจึงโหลดใหม่",
        "dberr-info": "(ไม่สามารถเข้าถึงฐานข้อมูล: $1)",
diff --git a/languages/i18n/tokipona.json b/languages/i18n/tokipona.json
deleted file mode 100644 (file)
index 67f4b5f..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-{
-       "@metadata": {
-               "authors": [
-                       "http://tokipona.wikia.com sysops"
-               ]
-       },
-       "january": "tenpo mun pi nanpa wan",
-       "february": "tenpo mun pi nanpa tu",
-       "march": "tenpo mun pi nanpa tu wan",
-       "april": "tenpo mun pi nanpa tu tu",
-       "may_long": "tenpo mun pi nanpa luka",
-       "june": "tenpo mun pi nanpa luka wan",
-       "july": "tenpo mun pi nanpa luka tu",
-       "august": "tenpo mun pi nanpa luka tu wan",
-       "september": "tenpo mun pi nanpa luka tu tu",
-       "october": "tenpo mun pi nanpa luka luka",
-       "november": "tenpo mun pi nanpa luka luka wan",
-       "december": "tenpo mun pi nanpa luka luka tu",
-       "category_header": "lipu lon kulupu lipu \"$1\"",
-       "subcategories": "kulupu lipu lili",
-       "listingcontinuesabbrev": " li awen",
-       "article": "lipu sona",
-       "newwindow": "(ona li open e lupa sin)",
-       "cancel": "ike",
-       "mytalk": "toki mi",
-       "navigation": "lipu suli",
-       "help": "mi sona ala",
-       "search": "o lukin jo",
-       "go": "o tawa",
-       "history": "o lukin e lipu ni pi tenpo pini",
-       "history_short": "lipu ni pi tenpo pini",
-       "printableversion": "lipu ni o kama lipu len",
-       "permalink": "nimi open kiwen",
-       "edit": "o ante",
-       "editthispage": "o ante e lipu ni",
-       "delete": "o weka",
-       "deletethispage": "o weka e lipu ni",
-       "protect": "mi taso o ken ante",
-       "protectthispage": "mi taso o ken ante e lipu ni",
-       "unprotect": "jan ali o ken ante",
-       "unprotectthispage": "jan ale o ken ante e lipu ni",
-       "talkpage": "Talk page",
-       "specialpage": "lipu suli",
-       "talk": "o toki",
-       "toolbox": "ilo",
-       "otherlanguages": "toki ante",
-       "redirectedfrom": "(tan $1)",
-       "aboutsite": "lipu sona pi toki pona li seme?",
-       "aboutpage": "Project:lipu sona pi toki pona li seme?",
-       "copyright": "lipu ken $1 li lawa e lipu ni.",
-       "currentevents": "seme li sin lon ma?",
-       "disclaimers": "wile ala",
-       "edithelp": "mi sona ala e ante",
-       "mainpage": "lipu lawa",
-       "mainpage-description": "lipu lawa",
-       "portal": "lipu pi kulupu ni",
-       "privacy": "ken pi awen weka",
-       "ok": "pona",
-       "retrievedfrom": "tan $1",
-       "editsection": "o ante",
-       "toc": "poki lawa",
-       "showtoc": "o suli e poki ni.",
-       "hidetoc": "o lili e poki ni",
-       "nstab-main": "lipu sona",
-       "nstab-user": "lipu jan",
-       "nstab-special": "suli",
-       "nstab-image": "lipu nanpa",
-       "nstab-mediawiki": "nimi",
-       "nstab-template": "lipu mama",
-       "nstab-help": "pana pona",
-       "nstab-category": "kulupu lipu",
-       "logout": "mi o tawa",
-       "userlogout": "mi o tawa",
-       "summary": "ante li seme:",
-       "minoredit": "ante ni li lili taso",
-       "watchthis": "mi wile sona e ante ale pi lipu ni lon tenpo kama",
-       "savearticle": "o awen",
-       "preview": "lukin taso",
-       "showpreview": "mi wile lukin taso e ante",
-       "editing": "mi ante e: $1",
-       "editingcomment": "mi ante e lipu $1 (wan sin)",
-       "copyrightwarning": "o sona e ni: ken $2 (o lukin e $1) li lawa tawa ante ali lon {{SITENAME}} li. jan li ken ante e toki sina li ken pana e ona tawa jan ante. sina wile ala e ni la, o sitelen ala lon lipu ni.<br />\nkin la sina toki e ni: toki sina ni li tan sina taso anu lipu pi ken ali.\n'''SINA KEN ALA LA, O PANA ALA E TOKI PI KEN LILI TAWA LIPU NI!'''",
-       "templatesused": "{{PLURAL:$1|Template|Templates}} used on this page:",
-       "histfirst": "pini taso",
-       "histlast": "sin taso",
-       "prevn": "nanpa {{PLURAL:$1|$1}} pini",
-       "nextn": "nanpa {{PLURAL:$1|$1}} kama",
-       "viewprevnext": "o lukin e ($1 {{int:pipe-separator}} $2) ($3).",
-       "preferences": "seme li pona tawa mi",
-       "recentchanges": "lipu seme li ante?",
-       "minoreditletter": "ante lili",
-       "newpageletter": "lipu sin",
-       "recentchangeslinked": "ante sama",
-       "recentchangeslinked-feed": "ante sama",
-       "recentchangeslinked-toolbox": "ante sama",
-       "upload": "o pana e lipu nanpa",
-       "filedesc": "ante li seme",
-       "fileuploadsummary": "ante li seme:",
-       "file-anchor-link": "Lipu nanpa",
-       "randompage": "mi wile lukin e lipu ante",
-       "lonelypages": "lipu ni li jo ala e lipu sama",
-       "move": "o tawa",
-       "movethispage": "o pana e nimi sin",
-       "allpages": "lipu ale",
-       "categories": "kulupu lipu",
-       "watchlist": "mi sona e ante pi lipu seme",
-       "watch": "o sona e ante",
-       "watchthispage": "mi wile sona e ante ale pi lipu ni lon tenpo kama",
-       "unwatchthispage": "mi wile ala sona e ante ale pi lipu ni lon tenpo kama",
-       "mycontris": "mi ante e lipu seme",
-       "whatlinkshere": "lipu seme li tawa ni?",
-       "specialpages": "lipu suli"
-}
index 9c737b5..8564c55 100644 (file)
        "tooltip-pt-login": "Oturum açmanız tavsiye edilmektedir; ancak bu zorunlu değildir",
        "tooltip-pt-logout": "Sistemden çık",
        "tooltip-pt-createaccount": "Bir hesap oluşturup oturum açmanız tavsiye edilmektedir ancak bu zorunlu değildir",
-       "tooltip-ca-talk": "İçerik ile ilgili tartışma",
+       "tooltip-ca-talk": "Kullanıcı mesaj sayfası",
        "tooltip-ca-edit": "Bu sayfayı düzenleyin",
        "tooltip-ca-addsection": "Yeni bir altbaşlık aç",
        "tooltip-ca-viewsource": "Bu sayfa koruma altında. Sadece kaynağını görebilirsiniz.",
index 4f72f70..04faef2 100644 (file)
        "anonpreviewwarning": "''Ви не увійшли в систему. Якщо ви виконаєте збереження, то в історію сторінки буде записана ваша IP-адреса.''",
        "missingsummary": "'''Нагадування''': Ви не дали короткого опису змін.\nНатиснувши кнопку «Зберегти» ще раз, ви збережете зміни без коментаря.",
        "selfredirect": "<strong>Попередження:</strong> Ви створюєте перенаправлення на цю ж сторінку.\nВи могли вказати невірну цільову сторінку, або ж редагуєте хибну сторінку.\nЯкщо Ви натиснете \"$1\" ще раз, перенаправлення буде створено.",
-       "missingcommenttext": "Ð\91Ñ\83дÑ\8c Ð»Ð°Ñ\81ка, Ð²Ð²ÐµÐ´Ñ\96Ñ\82Ñ\8c Ð½Ð¸Ð¶Ñ\87е Ð²Ð°Ñ\88е Ð¿Ð¾Ð²Ñ\96домленнÑ\8f.",
+       "missingcommenttext": "Ð\91Ñ\83дÑ\8c Ð»Ð°Ñ\81ка, Ð²Ð²ÐµÐ´Ñ\96Ñ\82Ñ\8c ÐºÐ¾Ð¼ÐµÐ½Ñ\82аÑ\80.",
        "missingcommentheader": "<strong>Нагадування</strong>: Ви не вказали тему для цього коментаря.\nНатиснувши кнопку «$1» ще раз, Ви збережете редагування без заголовка.",
        "summary-preview": "Попередній перегляд опису редагування:",
        "subject-preview": "Попередній перегляд теми:",
        "recentchanges-legend": "Налаштування нових редагувань",
        "recentchanges-summary": "Відстеження останніх змін на сторінках {{grammar:genitive|{{SITENAME}}}}.",
        "recentchanges-noresult": "Немає змін за даний період, що відповідають цим критеріям.",
+       "recentchanges-timeout": "Час, відведений на цей пошук, вичерпано. Можливо, Ви захочете спробувати інші пошукові параметри.",
        "recentchanges-feed-description": "Відстежувати останні зміни у вікі в цьому потоці.",
        "recentchanges-label-newpage": "Цим редагуванням створена нова сторінка",
        "recentchanges-label-minor": "Це незначна зміна",
        "rcfilters-filter-user-experience-level-unregistered-label": "Незареєстровані",
        "rcfilters-filter-user-experience-level-unregistered-description": "Користувачі, які не ввійшли в систему.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Новачки",
-       "rcfilters-filter-user-experience-level-newcomer-description": "Зареєстровані редактори, які мають менш ніж 10 редагувань і 4 дні активності.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Зареєстровані редактори, які мають менш ніж 10 редагувань або менш ніж 4 дні активності.",
        "rcfilters-filter-user-experience-level-learner-label": "Учні",
        "rcfilters-filter-user-experience-level-learner-description": "Зареєстровані редактори, рівень досвіду яких перебуває між «новачками» та «досвідченими користувачами».",
        "rcfilters-filter-user-experience-level-experienced-label": "Досвідчені користувачі",
index 206dea8..1ef0e3e 100644 (file)
@@ -32,7 +32,8 @@
                        "قیصرانی",
                        "Junaid Ahmad",
                        "Abuaneeqa",
-                       "Saraiki"
+                       "Saraiki",
+                       "BukhariSaeed"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
        "feedback-thanks": "شکریہ! آپ کا تبصرہ صفحہ «[$1 $2]» میں درج کر دیا گیا ہے۔",
        "feedback-thanks-title": "شکریہ!",
        "feedback-useragent": "یوزر ایجنٹ:",
-       "searchsuggest-search": "تلاش",
+       "searchsuggest-search": "{{SITENAME}} میں تلاش کریں",
        "searchsuggest-containing": "نتائج...",
        "api-error-badtoken": "داخلی نقص: غلط ٹوکن۔",
        "api-error-emptypage": "نئے خالی صفحات بنانے کی اجازت نہیں ہے۔",
index 5963590..ebd66e0 100644 (file)
@@ -55,7 +55,6 @@
        "underline-never": "Rárá",
        "underline-default": "Ti àwọ tàbí ẹrọ́ ìtọ́kùn",
        "editfont-style": "Oge fọ́ntì ààlà àtúnṣe:",
-       "editfont-default": "Ti agbétàkùn",
        "editfont-monospace": "Fọ́ntì aláàyè kan",
        "editfont-sansserif": "Fọnti san-sẹrif",
        "editfont-serif": "Fọnti sẹrif",
        "morenotlisted": "Àtòjọ yìí kò kúnrẹ́rẹ́.",
        "mypage": "Ojúewé",
        "mytalk": "Ọ̀rọ̀",
-       "anontalk": "Ọ̀rọ̀ fún IP yí",
+       "anontalk": "Ọ̀rọ̀",
        "navigation": "Atọ́ka",
        "and": "&#32;àti",
-       "qbfind": "Wíwárí",
-       "qbbrowse": "Ìṣíwò",
-       "qbedit": "Àtúnṣe",
-       "qbpageoptions": "Ojúewé yi",
-       "qbmyoptions": "Àwọn ojúewé mi",
        "faq": "FAQ",
-       "faqpage": "Project:FAQ",
        "actions": "Àwọn ìgbéṣe",
        "namespaces": "Àwọn orúkọàyè",
        "variants": "Àwọn oriṣiríṣi",
        "searcharticle": "Lọ",
        "history": "Ìtàn ojúewé",
        "history_short": "Ìtàn",
+       "history_small": "ìtàn",
        "updatedmarker": "jẹ́ títúnṣe lẹ́yìn àbẹ̀wò mi",
        "printableversion": "Àtẹ̀jáde tóṣeétẹ̀síìwé",
        "permalink": "Ìjápọ̀ tíkòníyípadà",
        "edit-local": "Àtúnṣe ìjúwe ìhàhín",
        "create": "Ṣèdá",
        "create-local": "Ìfikún ìjúwe ìhàhín",
-       "editthispage": "S'àtúnṣe ojúewé yi",
-       "create-this-page": "Ṣè'dá ojúewé yìí",
        "delete": "Ìparẹ́",
-       "deletethispage": "Pa ojúewé yi rẹ́",
-       "undeletethispage": "Mú ìparẹ́ kúrò fún ojúewé yìí",
        "undelete_short": "Ìdápadà ìparẹ́ {{PLURAL:$1|àtúnṣe kan|àwọn àtúnṣe $1}}",
        "viewdeleted_short": "Ìwòran {{PLURAL:$1|àtúnṣe ajẹ́píparẹ́ kan|àwọn àtúnṣe ajẹ́píparẹ́ $1}}",
        "protect": "Àbò",
        "protect_change": "yípadà",
-       "protectthispage": "Dá àbò bo ojúewé yìí",
        "unprotect": "Ìyípadà àbò",
-       "unprotectthispage": "Ìyípadà àbò ojúewé yìí",
        "newpage": "Ojúewé tuntun",
-       "talkpage": "Ìfọ̀rọ̀wérọ̀ nípa ojúewé yìí",
        "talkpagelinktext": "Ọ̀rọ̀",
        "specialpage": "Ojúewé Pàtàkì",
        "personaltools": "Àwọn irinṣẹ́ àdáni",
-       "articlepage": "Ìfihàn àkóónú ojúewé",
        "talk": "Ìfọ̀rọ̀wérọ̀",
        "views": "Àwọn ìwò",
        "toolbox": "Àwọn irinṣẹ́",
-       "userpage": "Wo ojúewé oníṣe",
-       "projectpage": "Wo ojúewé iṣẹ́ọwọ́",
+       "tool-link-userrights": "Yí àwọn ẹgbẹ́ {{GENDER:$1|oníṣe}} padà",
+       "tool-link-userrights-readonly": "Ìgbéwò àwọn ẹgbẹ́ {{GENDER:$1|oníṣe}}",
+       "tool-link-emailuser": "Fi email ránṣẹ́ sí {{GENDER:$1|oníṣe}} yìí",
        "imagepage": "Wo ojúewé fáìlì",
        "mediawikipage": "Wo ojúewé ìránṣẹ́",
        "templatepage": "Wo ojúewé àdàkọ",
        "jumptonavigation": "atọ́ka",
        "jumptosearch": "àwárí",
        "view-pool-error": "Àforíjì, ẹ̀rọ ìwọ̀fà ti kún lọ́wọ́ báyìí.\nÀwọn oníṣe ọ̀pọ̀lọpọ̀ úngbìyànjú láti wo ojúewé yìí.\nẸ jọ̀wọ́ ẹ dúro ná díẹ̀ kí ẹ tó tún gbìyànjú láti wo ojúewé yìí.\n\n$1",
+       "generic-pool-error": "Àforíjì, àwọn ẹ̀rọ ìwọ̀fà ti kúnjubóṣẹyẹlọ lọ́wọ́ báyìí.\nÀwọn oníṣe tóúngbìyànjú láti wo ohun ìtìlẹ́hìn yìí ti pọ̀jù.\nẸ jọ̀wọ́ ẹ dúro díẹ̀ kí ẹ tó tún gbìyànjú láti wo ohun ìtìlẹ́hìn yìí.",
        "pool-timeout": "Ìsinmi ìgbàdíẹ̀ láti dúro de ìtìpadé",
        "pool-queuefull": "Oríìlà dátà ti kún",
        "pool-errorunknown": "Àsìṣe àwámárìdí",
        "disclaimers": "Ikìlọ̀",
        "disclaimerpage": "Project:Ìkìlọ̀ gbogbo",
        "edithelp": "Ìrànlọ́wọ́ fún àtúnṣe",
+       "helppage-top-gethelp": "Ìrànwọ́",
        "mainpage": "Ojúewé Àkọ́kọ́",
        "mainpage-description": "Ojúewé Àkọ́kọ́",
        "policy-url": "Project:Ìpinu",
        "hidetoc": "bòmọ́lẹ̀",
        "collapsible-collapse": "Kálura",
        "collapsible-expand": "Fẹ̀hàn",
+       "confirmable-confirm": "Ṣé ó dá {{GENDER:$1|ọ}} lójú?",
+       "confirmable-yes": "Bẹ́ẹ̀ni",
+       "confirmable-no": "Bẹ́ẹ̀kọ́",
        "thisisdeleted": "Ìfihàn tàbí ìmúpadà $1?",
        "viewdeleted": "Ẹ wo $1?",
        "restorelink": "{{PLURAL:$1|àtúnṣe ajẹ́píparẹ́ kan|àwọn àtúnṣe ajẹ́píparẹ́ $1}}",
        "actionthrottled": "Ìgbése bíntín",
        "actionthrottledtext": "Láti dènà spam, ìgbése yìí kò ní ṣe é ṣe lọ́nà iye púpọ̀ láàrin àsìkò bíntín, ẹ̀yin sì ti kọjá iye náà.\nẸjọ̀wọ́ ẹ gbíyànjú síi ní ìsẹ́jú díẹ̀.",
        "protectedpagetext": "Ojúewé yìí ti jẹ́ dídáàbòbò láti dínà ìṣàtúnṣe tàbí ìṣe míràn.",
-       "viewsourcetext": "Ẹ lè wo ati ẹ lè se àwòkọ ọ̀rọ̀àmì ojúewé yi:",
-       "viewyourtext": "Ẹ le wò bẹ́ẹ̀sìni ẹ le ṣe àwòkọ orísun '''àwọn àtúnṣe yín''' sí ojúewé yìí:",
+       "viewsourcetext": "Ẹ lè wo ati ẹ lè se àwòkọ ọ̀rọ̀àmì ojúewé yi.",
+       "viewyourtext": "Ẹ le wò bẹ́ẹ̀sìni ẹ le ṣe àwòkọ ọ̀rọ̀àmì <strong>àwọn àtúnṣe yín</strong> sí ojúewé yìí.",
        "protectedinterface": "Ojúewé yìí únpèsè ìfojúkojú ìkọ̀wé fún atòlànà, ó ti jẹ́ dídáàbòbò láti dínà ìlòkulò.",
        "editinginterface": "'''Ìkìlọ̀:''' Ẹ ún ṣàtúnṣe ojúewé tó jẹ́ lílò láti pèsè ìkọ ìfojúkojú fún àtòlànà kọ̀mpútà.\nÀwọn ìyípadà sí ojúewé yìí yíò kan ìhànsí ìfojúkojú oníṣe fún àwọn oníṣe míràn lọ́rí wiki yìí.\nLáti ṣ'àfikún tàbí ṣ'àyípadà àwọn ìyédèpadà fún gbogbo àwọn wiki, ẹ jọ̀wọ́ ẹ lo [https://translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], iṣẹ́-ọwọ́ ìṣọdìbílẹ̀ MediaWiki.",
-       "cascadeprotected": "Ojúewé yìí ti jẹ́ dídáàbòbò sí àtùnṣe, nítorípé ó wà nínú {{PLURAL:$1|ojúewé ìsàlẹ̀ yìí, tó jẹ́|àwọn ojúewé ìsàlẹ̀ wọ̀nyí, tí wọ́n jẹ́}} dídáàbòbò pẹ̀lú ìyàn \"ajámọ́ra\" ní títàn: $2",
+       "translateinterface": "Láti ṣe àfikún tàbí ìyédèpadà fún gbogbo wiki, jọ̀wọ́ lo [https://translatewiki.net/ translatewiki.net], iṣẹ́ọwọ́ ìsèdèabínibí MediaWiki.",
+       "cascadeprotected": "Ojúewé yìí ti jẹ́ dídáàbòbò sí àtùnṣe, nítorípé ó wà nínú {{PLURAL:$1|ojúewé ìsàlẹ̀ yìí, tó jẹ́|àwọn ojúewé ìsàlẹ̀ wọ̀nyí, tí wọ́n jẹ́}} dídáàbòbò pẹ̀lú ìyàn \"ajámọ́ra\" ní títàn: \n$2",
        "namespaceprotected": "A kò gbàyín ní ààyè láti ṣ'àtúnṣe àwọn ojúewé tó wà nínú orúkọàyè '''$1'''.",
        "customcssprotected": "Ẹ kò ní ìyọ̀nda láti ṣàtúnṣe ojúewé CSS yìí nítorípé ó ní àwọn ìtòjọ oníṣe ẹlòmíràn.",
        "customjsprotected": "Ẹ kò ní ìyọ̀nda láti ṣàtúnṣe ojúewé JavaScript yìí nítorípé ó ní àwọn ìtòjọ oníṣe ẹlòmíràn.",
        "invalidtitle-knownnamespace": "Àkọlé àìyẹ tó ní orúkọààyè \"$2\" àti ìkọ̀rọ̀ \"$3\"",
        "invalidtitle-unknownnamespace": "Àkọlé àìyẹ tó ní nọ́mbà orúkọààyè àìmọ̀ \"$1\" àti ìkọ̀rọ̀ \"$2\"",
        "exception-nologin": "Kò tí ì wọlé",
-       "exception-nologin-text": "Ẹ jọ̀wọ́ ẹ [[Special:Userlogin|jáwọlé]] láti le bọ́ sí ojúewé tàbí ìgbéṣe yìí.",
+       "exception-nologin-text": "Jọ̀wọ́ forúkọ wọlé láti le bọ́ sí ojúewé tàbí ìgbéṣe yìí.",
+       "exception-nologin-text-manual": "Jọ̀wọ́ $1 láti le bọ́sí ojúewé tàbí ìgbéṣe yìí.",
        "virus-badscanner": "Ìtorapọ̀ búburú: awáìpasẹ̀ èràn aláìmọ̀n : ''$1''",
        "virus-scanfailed": "ìkúnà scan (àmìọ̀rọ̀ $1)",
        "virus-unknownscanner": "ògùn-kòkòrò àìmọ̀:",
        "nocookieslogin": "{{SITENAME}} ún lo cookies láti gba àwọn oníṣe wọlé.\nẸ ti dínà sí cookies.\nẸjọ̀wọ́ ẹ fún cookies láàyè kí ẹ tún tó gbìyànjú láti wọlé.",
        "nocookiesfornew": "Àpamọ́ oníṣe kò jẹ́ dídá torípé a kò le ṣèmúdájú ibi tó ti wá.\nẸ ríidájú pé ẹ gba cookies láàyè, ẹ túnraṣe ojúewé yìí kí ẹ tó tún gbìyànjú.",
        "noname": "Ẹ kò tọ́kasí orúkọ oníṣe tó ní ìbámu.",
-       "loginsuccesstitle": "Ìwọlé ti yọrí sí rere",
+       "loginsuccesstitle": "O ti forúkọ wọlé",
        "loginsuccess": "'''Ẹ ti wọlé sínú {{SITENAME}} gẹ́gẹ́ bi \"$1\".'''",
-       "nosuchuser": "Kò sí oníṣe kankan pẹ̀lú orúkọ \"$1\".\nÀwọn lẹ́tà àwọn orúkọ oníṣe gbọ́dọ̀ jẹ́ irúkanna.\nẸ yẹ lẹ́tà yín wò, tàbí [[Special:CreateAccount|kí ẹ dá àkópamọ́ tuntun]].",
+       "nosuchuser": "Kò sí oníṣe kankan pẹ̀lú orúkọ \"$1\".\nÀwọn lẹ́tà àwọn orúkọ oníṣe gbọ́dọ̀ jẹ́ kíkọ bákanna.\nẸ yẹ lẹ́tà yín wò, tàbí [[Special:CreateAccount|kí ẹ dá àkópamọ́ tuntun]].",
        "nosuchusershort": "Kò sí oníṣe t'ón jẹ́ $1.\nẸ yẹ lẹ́tà ọ̀rọ̀ yín wò.",
        "nouserspecified": "Ẹ gbọ́dọ̀ tọ́kasí orúkọ oníṣe kan.",
        "login-userblocked": "Oníṣe yìí jẹ́ dídínà. Ìwọlé kò jẹ́ gbígbà láyè.",
        "wrongpassword": "Ọ̀rọ̀ìpamọ́ tí ẹ kìbọlé kòtọ́.\nẸ jọ̀wọ́ ẹ gbìyànjú lẹ́ẹ̀kansí.",
        "wrongpasswordempty": "Ọ̀ròìpamọ́ jẹ́ òfo.\nẸ gbìyànjú lẹ́ ẹ̀kan síi.",
        "passwordtooshort": "Ọ̀rọ̀ìpamọ́ kò gbọ́dọ̀ dín ju {{PLURAL:$1|àmìlẹ́tà kan|àmìlẹ́tà $1}} lọ.",
+       "passwordtoolong": "Àwọn àmììwọlé kò le pọ̀ ju {{PLURAL:$1|àmìlẹ́tà kan|àmìlẹ́tà $1}} lọ.",
        "password-name-match": "Ọ̀rọ̀ìpamọ́ yín gbọ́dọ̀ yàtọ̀ sí orúkọ oníṣe yín.",
        "password-login-forbidden": "Lílo orúkọ oníṣe àti ọ̀rọ̀ìpamọ́ yìí ti jẹ́ dídálẹ́kun.",
        "mailmypassword": "Ìtúntò ọ̀rọ̀ìpamọ́",
        "createaccount-title": "Ìforúkọ sílẹ̀ fún {{SITENAME}}",
        "createaccount-text": "Ẹnìkan dá àpamọ́ kan fún àdírẹ́sì e-mail yín sórí {{SITENAME}} ($4) tóún jẹ́ \"$2\", pẹ̀kú ọ̀rọ̀ìpamọ́ ''$3''.\nẸ gbọ́dọ̀ wọlé kí ẹ sì ṣàyípadà ọ́rọ́ìpamọ́ yín nísinsìyí.\n\nẸ le fojúfo ìránṣẹ́ yìí, tó bá jẹ́ pé àpamọ́ yìí jẹ́ dídá nítorí àsìṣe.",
        "login-throttled": "Ẹ ti gbìyànjú lọ́pọ̀ bó ṣe yẹ lọ láti jáwọlé.\nẸ jọ̀wọ́ ẹ dúró fún $1 ná kí ẹ tó tún gbìyànjú lẹ́ẹ̀kan síi.",
-       "login-abort-generic": "Ìwọlé yín kò yọrísírere - ó ti jẹ́ kíkáwọ́dà",
+       "login-abort-generic": "Ìforúkọwọlé yín ti kùnà - Ó ti jẹ́ dídádúró",
        "loginlanguagelabel": "Èdè: $1",
        "suspicious-userlogout": "Ìtọrọ tí ẹ ṣe láti bọ́sóde jẹ̀ kíkọ̀ nítorípé ó dà bí pé ó jẹ́ fífiránṣẹ́ látọ̀dọ̀ awòtakùn (browser) àìdára tàbí ẹ̀rọ-ìwọ̀fà ìmúpamọ́ onígbàdíẹ̀.",
-       "pt-login": "Ìjáwọlé",
+       "pt-login": "Forúkọ wọlé",
        "pt-login-button": "Ìjáwọlé",
        "pt-createaccount": "Ìdásílẹ̀ àpamọ́",
        "pt-userlogout": "Ìjáde",
        "newpassword": "Ọ̀rọ̀ìpamọ́ tuntun:",
        "retypenew": "Àtúntẹ̀ ọ̀rọ̀ìpamọ́ tuntun:",
        "resetpass_submit": "Ẹ ṣe àtúntò ọ̀rọ̀ìpamọ́ kí ẹ tó wọlé",
-       "changepassword-success": "Ã\8cyípadà á»\8dÌ\80rá»\8dÌ\80ìpamá»\8dÌ\81 yín ti já sí rere!",
+       "changepassword-success": "Ã\80mììwá»\8dlé yín ti jẹÌ\81 yíyípadà!",
        "changepassword-throttled": "Ẹ ti gbìyànjú lọ́pọ̀ bó ṣe yẹ lọ láti jáwọlé.\nẸ jọ̀wọ́ ẹ dúró fún $1 ná kí ẹ tó tún gbìyànjú lẹ́ẹ̀kan síi.",
+       "botpasswords": "Àwọn àmììwọlé bot",
+       "botpasswords-label-appid": "Orúkọ bot:",
+       "botpasswords-label-create": "Dáálẹ̀",
        "botpasswords-label-cancel": "Fagilé",
        "botpasswords-label-delete": "Ìparẹ́",
        "botpasswords-label-resetpassword": "Ìtúntò ọ̀rọ̀ìpamọ́",
        "resetpass_forbidden": "Àwọn ọ̀rọ̀ìpamọ́ kò ṣe é yípadà",
-       "resetpass-no-info": "Ẹ gbọ́dọ̀ wọlẹ́ láti le lọ sí ojúewé yìí tààrà.",
+       "resetpass-no-info": "Ẹ gbọ́dọ̀ ti forúkọ wọlẹ́ láti le lọ sí ojúewé yìí tààrà.",
        "resetpass-submit-loggedin": "Ìyípadà ọ̀rọ̀ìpamọ́",
        "resetpass-submit-cancel": "Fagilé",
        "resetpass-wrong-oldpass": "Ọ̀rọ̀ìpamọ́ ìgbàdíẹ̀ tàbí tìsinsìnyí àìtọ́.\nÓ le jẹ́ pé ẹ ti yí ọ̀rọ̀ìpamọ́ yín padà sí òmíràn tàbí ẹ ti tọrọ ọ́rọ́ìpamọ́ tuntun ìgbàdíẹ̀.",
        "passwordreset-emailtext-user": "Oníṣe $1 lórí {{SITENAME}} tọrọ àtúntò ọ̀rọ̀ìpamọ́ yín fùn {{SITENAME}} ($4). {{PLURAL:$3|Àkópamọ́|Àwọn àkópamọ́}} oníṣe ìsàlẹ̀ yìí ní ìbáṣe pọ̀ mọ́ àdírẹ̀sì e-mail yìí:\n\n$2\n\n{{PLURAL:$3|Ọ̀rọ̀ìpamọ́ onígbàdíẹ̀ yìí|Àwọn ọ̀rọ̀ìpamọ́ onígbàdíẹ̀ wọ̀nyí}} yíò dópin lẹ́yìn {{PLURAL:$5|ọjọ́ kan|ọjọ́ $5}}.\nẸ gbọ́dọ̀ lọ yan ọ̀rọ̀ìpamọ́ tuntun báyìí. Tóbá jẹ́ pé ẹ̀lòmíràn ló ṣe ìtọrọ yìí, tàbí tọ́bá jẹ́ pé ẹ ti rántí ọ̀rọ̀ìpamọ́ àtètèkọ́ṣe yín, tí ẹ kọ̀ sí fẹ́ yíipadà mọ́, ẹ lé ṣàìkàsí ìránṣẹ́ yìí, kí ẹ sì tẹ̀síwájú ní lo ọ̀rọ̀ìpamọ́ àtijọ́ yín.",
        "passwordreset-emailelement": "Orúkọ oníṣe: \n$1\n\nỌ̀rọ̀ìpamọ́ ìgbàdíẹ̀: \n$2",
        "passwordreset-emailsentemail": "E-mail àtúntò ọ̀rọ̀ìpamọ́ ti jẹ́ fífiránṣẹ́.",
-       "changeemail": "Ìyípadà àdírẹ̀sì E-mail",
+       "changeemail": "Ìyípadà tàbí ìmúkúrò àdírẹ̀sì email",
        "changeemail-header": "Ìyípadà àdírẹ̀sì e-mail àkópamọ́",
-       "changeemail-no-info": "Ẹ gbódọ̀ wọlé láti bósí ojúewé yìí tààrà.",
+       "changeemail-no-info": "Ẹ gbódọ̀ ti forúkọ wọlé láti bósí ojúewé yìí tààrà.",
        "changeemail-oldemail": "Àdírẹ̀sì E-mail ìsinsìnyí:",
        "changeemail-newemail": "Àdírẹ̀sì E-mail tuntun:",
        "changeemail-none": "(kòsí)",
        "anoneditwarning": "<strong>Ìkìlọ̀:</strong> Ẹ kò tíì wọlé.\nÀdírẹ́ẹ̀sì IP yín yíò hàn jáde tí ẹ bá ṣe àtùnṣe. Tí ẹ bá <strong>[$1 wọlé]</strong> tàbí <strong>[$2 dá àkópamọ́]</strong>, àwọn àtúnṣe yín yíò hàn pẹ̀lú orúkọ-oníṣe yín, pẹ̀lú àwọn ànfàní míràn.",
        "anonpreviewwarning": "''Ẹ kò tíì wọlé. Àdírẹ́ẹ̀sì IP yín yíò jẹ́ kíkọsílẹ̀ sínú ìwé ìtàn àtúnṣe ojúewé yìí tí ẹ bá ṣàmúpamọ́ rẹ̀.''",
        "missingsummary": "'''Ìránlétí:''' Ẹ kò pèsè àkótán fún àtúnṣe yìí\nTí ẹ bá tẹ Ìmúpamọ́ lẹ́ẹ̀kansi, àtúnṣe yín yíò jẹ̀ mímúpamọ́ láìní kankan.",
-       "missingcommenttext": "Ẹjọ̀wọ́ ẹ ṣe áríwí ní ìsàlẹ̀",
+       "missingcommenttext": "Jọ̀wọ́ fi èrò ọkàn rẹ sílẹ̀.",
        "missingcommentheader": "'''Ìránlétí:''' Ẹ kò pèsè àkọlé/oríọ̀rọ̀ kankan fún àríwí yìí.\nTí ẹ bá tẹ \"$1\" lẹ́ẹ̀kansi, àtúnṣe yín yíò jẹ́ mímúpamọ́ láìní kankan.",
-       "summary-preview": "Àkọ́yẹ̀wò àkótán:",
-       "subject-preview": "Àyẹ̀wò àkọlé",
+       "summary-preview": "Àkọ́yẹ̀wò àkótán àtúnṣe:",
+       "subject-preview": "Àkọ́yẹ̀wò àkọlé ọ̀rọ̀:",
        "blockedtitle": "Ìdínà oníṣe",
        "blockedtext": "'''Orúkọ oníṣe yín tàbí àdírẹ́sì IP yín ti jẹ́ dídílọ́nà.'''\n\n$1 ni ó ṣe ìdínà.\nÌdí tó fun ni ''$2''.\n\n* Ìbẹ̀rẹ̀ ìdínà: $8\n* Ìparí ìdínà: $6\n* Ẹni tí a fẹ́ dínà: $7\n\nẸ ṣ'èránṣẹ́ sí $1 tàbí [[{{MediaWiki:Grouppage-sysop}}|alámùójútó]] mìíràn láti fọ̀rọ̀wérọ̀ lórí ìdínà ọ̀ún.\nẸ kò le è 'ránṣẹ́ sí oníṣe yìí pẹ̀lú e-mail' àyàfi tí ojúọ̀nà e-mail tó dájú wà ní [[Special:Preferences|àwọn ìfẹ́ràn àpamọ́]] yín tí wọn kò sì ti dínà yín láti lò ó.\nÀdírẹ́sì IP yín lọ́wọ́lọ́wọ́ ni $3, bẹ́ ẹ̀ sì ni ID fún ìdínà yín ni #$5.\nẸ jọ̀wọ́ ẹ fi gbogbo ẹ̀kúnrẹ́rẹ́ òkè yìí kún ìbérè tí ẹ bá ṣe.",
        "autoblockedtext": "Àdírẹ́sì IP yín ti jẹ́ dídílọ́nà ní fúnrararẹ̀ nítorí pé ó jẹ́ lílò látọwọ́ oníṣe míràn tí ó jẹ́ dídílọ́nà látọwọ́ $1.\nÌdíẹ̀ tó ṣe jẹ́ bẹ́ẹ̀ nìyí:\n\n:''$2''\n\n\n* Ìbẹ̀rẹ̀ ìdínà: $8\n* Ìparí ìdínà: $6\n* Ẹni tí a fẹ́ dínà: $7\n\nẸ le ránṣẹ́ sí $1 tàbí ìkan láàrin [[{{MediaWiki:Grouppage-sysop}}|àwọn olùmójútó]] mìíràn láti fọ̀rọ̀wérọ̀ lórí ìdínà ọ̀ún.\n\nÀkíyèsí pé ẹ le mọ́ le lo ìní ''Ẹ fi e-mail ránṣẹ́ sí oníṣe yìí'' tí àdírẹ́sì e-mail tó tọ́ jẹ́ fífilórúkọsílẹ̀ sínú [[Special:Preferences|àwọn ìfẹ́ràn oníṣe]] yín tí wọn kò sì ti dínà yín láti lò ó.\n\nÀdírẹ́sì IP yín lọ́wọ́lọ́wọ́ ni $3, bẹ́ ẹ̀ sì ni ID fún ìdínà yín ni #$5.\nẸ jọ̀wọ́ ẹ fi gbogbo ẹ̀kúnrẹ́rẹ́ òkè yìí pọ̀mọ́ ìbérè tí ẹ bá ṣe.",
        "nosuchsectiontitle": "Kò le rí abala báun",
        "nosuchsectiontext": "Ẹ ti gbìyànjú láti ṣàtúnṣe abala tí kòsí.\nÓ ti le jẹ́ yíyípò tàbí píparẹ́ nígbà tí ẹ ún bojúwo ojúewé náà.",
        "loginreqtitle": "Ẹ gbọ́dọ̀ kọ́kọ́ w'ọlé ná",
-       "loginreqlink": "wọlé",
+       "loginreqlink": "forúkọ wọlé",
        "loginreqpagetext": "Ẹ gbọ́dọ̀ $1 láti wo àwọn ojúewé míràn.",
        "accmailtitle": "Ti fi ọ̀rọ̀ìpamọ́ ránṣẹ́.",
        "accmailtext": "A ti fi ọ̀rọ̀ìpamọ́ àrìnàkò tí a pèsè fún [[User talk:$1|$1]] ránṣẹ́ sí $2. Ẹ le ṣe àyípadà ọ̀rọ̀ìpamọ́ fún àpamọ́ tuntun yìí ní ibi ''[[Special:ChangePassword|àyípadà ọ̀rọ̀ìpamọ́]]'' lẹ́yìn tí ẹ bá ti jáwọlé.",
        "newarticle": "(Tuntun)",
        "newarticletext": "Ẹ ti tẹ̀lé ìjápọ̀ mọ́ ojúewé tí kò sí.\nLáti dá ojúewé yí ẹ bẹ̀rẹ̀ síní tẹ́kọ sí inú àpótí ìsàlẹ̀ yí (ẹ wo [$1 ojúewé ìrànlọ́wọ́ ] fun ẹ̀kúnrẹ́rẹ́ ).\nT'óbá sepé àsìse ló gbé yin dé bi, ẹ kọn bọ́tìnì ìpadàsẹ́yìn.",
-       "anontalkpagetext": "''Ojúewé ìfọ̀rọ̀wérọ̀ yìí wà fún oníṣe aláílórúkọ tí kò tíì dá àkópamọ́, tàbí tí kò lò ó rárá.\nBí bẹ́ẹ̀ laṣe únlo àdírẹ́ẹ̀sì IP oníyenọ́mbà láti dáamọ̀.\nIrú àdírẹ́ẹ̀sì IP báun ṣeéṣe kó jẹ́ pínpínlọ̀ pẹ̀lú àwọn oníṣe míràn.\nTó bá jẹ́ pé oníṣe aláìlórúkọ ni yín, tí ẹ sì ri pé wọ́n ùnsọ̀rọ̀ tí kò kàn yín sí i yín, ẹ jọ̀wọ́ [[Special:CreateAccount|ẹ dá àkópamọ́ kan]] tàbí [[Special:UserLogin|kí ẹ wọlẹ́]] kó mọ́ baà sí ìdàrúpọ̀ lọ́jọ́ọwájú mọ́ àwọn oníṣe aláìlórúkọ mírán.''",
+       "anontalkpagetext": "----\n<em>Ojúewé ìfọ̀rọ̀wérọ̀ yìí wà fún oníṣe aláílórúkọ tí kò tíì dá àkópamọ́, tàbí tí kò lò ó rárá.</em>\nBí bẹ́ẹ̀ laṣe únlo àdírẹ́ẹ̀sì IP oníyenọ́mbà láti dáamọ̀.\nIrú àdírẹ́ẹ̀sì IP báun ṣeéṣe kó jẹ́ pínpínlọ̀ pẹ̀lú àwọn oníṣe míràn.\nTó bá jẹ́ pé oníṣe aláìlórúkọ ni yín, tí ẹ sì ri pé wọ́n ùnsọ̀rọ̀ tí kò kàn yín sí i yín, ẹ jọ̀wọ́ [[Special:CreateAccount|ẹ dá àkópamọ́ kan]] tàbí [[Special:UserLogin|kí ẹ forúkọ wọlẹ́]] kó mọ́ baà sí ìdàrúpọ̀ lọ́jọ́ọwájú mọ́ àwọn oníṣe aláìlórúkọ mírán.",
        "noarticletext": "Lọ́wọ́lọ́wọ́ kò sí ìkọ̀ nínú ojúewé yìí.\nẸ le [[Special:Search/{{PAGENAME}}|wá àkọlé ojúewé yìí]] nínú àwọn ojúewé mìíràn,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} wá àkọọ́lẹ̀ rẹ̀], tàbí [{{fullurl:{{FULLPAGENAME}}|action=edit}} kí ẹ ṣ'àtúnṣe ojúewé òún]</span>.",
        "noarticletext-nopermission": "Lọ́wọ́lọ́wọ́ kò sí ìkọ̀ nínú ojúewé yìí.\nẸ le [[Special:Search/{{PAGENAME}}|wá àkọlé ojúewé yìí]] nínú àwọn ojúewé mìíràn, tàbí\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} wá àwọn àkọọ́lẹ̀ tó bámu]</span>, sùgbọ́n ẹ kò ní àṣẹ láti ṣ'ẹ̀dá ojúewé yìí.",
        "missing-revision": "Àtúnyẹ̀wò #$1 ojúewé tó únjẹ́ \"{{FULLPAGENAME}}\" kò sí.\n\nÈyí únsábà ṣẹlẹ̀ nítorípé ẹ tẹ̀lé ìtàn àjápọ̀ tí kò ṣiṣẹ́ mọ́ wá sí orí ojúewé tó ti jẹ́ píparẹ́.\nẸ̀kúnrẹ́rẹ́ wà nínú [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} àkọọ́lẹ̀ ìparẹ́].",
        "explainconflict": "Ẹlòmíràn ti ṣàyípadà ojúewé yìí látìgbà tí ẹ ti bèrẹ̀ àtúnṣẹ rẹ̀.\nÀlà ìkọ̀rọ̀ òkè lóní ìkọ̀rọ̀ ojúewé bó ṣe wà lọ́wọ́lọ́wọ́ báyìí.\nÀwọn àtúnṣe yín ni wọ́n hàn yìí nínú àlà ìkọ̀rọ̀ ìsàlẹ̀.\nẸ gbọdọ̀ kó àwọn àtúnṣe yín papọ̀ sínú ìkọ̀rọ̀ tó wà lọ́wọ́lọ́wọ́ báyìí.\nÌkọ̀rọ̀ inú àlà ìkọ̀rọ̀ òkè '''nìkan''' ni yíò jẹ́ mímúpamọ́ tí ẹ bá tẹ \"$1\".",
        "yourtext": "Ìkọ̀ yín",
        "storedversion": "Àtúnyẹ̀wò tí à múpamọ́",
-       "nonunicodebrowser": "'''Ìkìlọ̀: Awòtakùn yín kò ṣe é lò fún unicode.'''\nBáyìí ná ẹ le ṣàtúnṣe àwọn ojúewé láì ṣéwu: áwọn àmììkọ̀rọ̀ àìjẹ́-ASCII yíò hàn nínú àpótí àtúnṣe bíi àmíọ̀rọ̀ onímẹ́rìndínlọ́gún.",
        "editingold": "'''Ìkìlọ̀: Ẹ únṣàtúnṣe ojúewé yìí sí àtúnyẹ̀wọ̀ tótipẹ́ kọjá sẹ́yìn.'''\nTí ẹ bá múupamọ́, àwọn àtúnṣe yìówú tó wáyé látìgbà àtúnyẹ̀wò yìí yíò sọnù.",
        "yourdiff": "Àwọn ìyàtọ̀",
        "copyrightwarning": "Ẹ jọ̀wọ́ ẹ kíyèsi wípé gbogbo àwọn àfikún sí {{SITENAME}} jẹ́ bẹ̀ lábẹ́  $2 (Ẹ wo $1 fún ẹkunrẹrẹ).\nTí ẹ kò bá fẹ́ kí ìkọọ́lẹ̀ yín ó jẹ́ títúnṣe tàbí kì ó jẹ́ pípìn kiri lọ́ná tí kò wù yín, ẹ mọ́ mù wá síbí.<br />\nBákannà ẹ tún ṣèlérí fún wa wípé ẹ̀yin lẹkọ́ fúnra arayín, tàbí ẹ wòókọ láti agbègbè ìgboro tàbí irú ìtìlẹ́yín ọ̀fẹ́ bíi bẹ́ẹ̀.\n'''Ẹ MỌ́ MÚ IṢẸ́ TÓ NÍ Ẹ̀TỌ́ÀWÒKỌ SÍLẸ̀ LÁÌ GBÀṢẸ!'''",
        "permissionserrorstext": "Ẹ kò ní ìyọ̀nda láti ṣè yí nítorí {{PLURAL:$1|ìdí ìsàlẹ̀ yìí|àwọn ìdí ìsàlẹ̀ wọ̀nyí}}:",
        "permissionserrorstext-withaction": "Ẹ kò ní ìyọ̀nda láti $2, fún {{PLURAL:$1|ìdí yìí|àwọn ìdí wọ̀nyí}}:",
        "recreate-moveddeleted-warn": "'''Ìkìlọ̀: Ẹ̀ ún ṣ'èdá ojúewé tí a ti parẹ́ tẹ́lẹ̀.'''\n\nẸ gbọ́dọ̀ gberò bóyá ó bójúmu láti tẹ̀síwájú pẹ̀lú àtúnṣe ojúewé yìí.\nÀkọsílẹ̀ ìparẹ́ àti ìyípò fún ojúewé yìí nìyí fún ìrọ̀rùn:",
-       "moveddeleted-notice": "Ojúewé yìí tijẹ́ píparẹ́.\nÀkọọ́lẹ̀ ìparẹ́ àti ìyípò fún ojúewé náà wà nísàlẹ̀ fún ìtákasí.",
+       "moveddeleted-notice": "Ojúewé yìí tijẹ́ píparẹ́.\nÀkọọ́lẹ̀ ìparẹ́, àbò àti ìyípò fún ojúewé náà wà nísàlẹ̀ fún ìtọ́kasí.",
        "log-fulllog": "Ẹ wo gbogbo àkọọ́lẹ̀",
        "edit-hook-aborted": "Hook ti ṣe ìdádúró àtúnṣe.\nKò ṣe àlàyé kankan.",
        "edit-gone-missing": "A kò le ṣe títúnṣe ojúewé.\nÓ dà bíi pé a ti paárẹ́.",
        "edit-conflict": "Ìtakora áwọn àtúnṣe",
        "edit-no-change": "A ṣe àìkàsí àtúnṣe yín, nítorípé ìkọ̀wé kò ní àtúnṣe kankan.",
+       "postedit-confirmation-created": "Ojúewé ti jẹ́ dídáàlẹ̀.",
+       "postedit-confirmation-restored": "Ojúewé ti jẹ́ mímúwápadà.",
        "postedit-confirmation-saved": "Àtúnṣe yín ti jẹ́ gbígbépamọ́.",
        "edit-already-exists": "A kò le è ṣè'dá ojúewé tuntun.\nÓ pilẹ̀ ti wà.",
        "defaultmessagetext": "Ìkọ ìránṣẹ́ àtìbẹ̀rẹ̀",
        "content-failed-to-parse": "Ìkùnà láti ṣàtúwò àkóónú $2 fún àfijúwe $1: $3",
        "invalid-content-data": "Àkóónú dátà tí kò yẹ",
        "content-not-allowed-here": "Àkóónú \"$1\" kò ní ìyọ̀nda lórí ojúewé [[$2]]",
-       "editwarning-warning": "Kíkúrò ní ojúewé yìí yíò jẹ́ kí ẹ pòfo àwọn àtúnṣe tí ẹ ti ṣe.\nTó bá jẹ́ pé ẹ ti wọlé, ẹ lè dẹ́kun ìkìlọ̀ yìí nínù abala \"Àtúnṣe ṣíṣe\" ti àwọn ìfẹ́ràn yín.",
+       "editwarning-warning": "Kíkúrò ní ojúewé yìí yíò jẹ́ kí ẹ pòfo àwọn àtúnṣe tí ẹ ti ṣe.\nTó bá jẹ́ pé ẹ ti forúkọ wọlé, ẹ lè dẹ́kun ìkìlọ̀ yìí nínù abala \"{{int:prefs-editing}}\" ti àwọn ìfẹ́ràn yín.",
        "content-model-wikitext": "ìkọ̀rọ̀ wiki",
        "content-model-text": "ìkọ̀rọ̀ kedere",
        "content-model-javascript": "JavaScript",
        "page_first": "àkọ́kọ́",
        "page_last": "tógbẹ̀yìn",
        "histlegend": "Àṣàyàn ìyàtọ̀: ẹ fagi sínú àpótí àwọn átúnyẹ̀wò tí ẹ fẹ́ ṣàfiwè, lẹ́yìn náà ẹ tẹ enter tàbí bọ́tìnì ìsàlẹ̀.<br />\nÀlàyé: '''({{int:cur}})''' = ìyàtọ̀ sí àtúnyẹ̀wò tìsinyìí, '''({{int:last}})''' = ìyàtọ̀ sí àtúnyẹ̀wò tókọjá, '''{{int:minoreditletter}}''' = àtúnṣe kékeré.",
-       "history-fieldset-title": "Ìṣíwò ìwé ìtàn àtúnṣe",
+       "history-fieldset-title": "Ìwádìí fún àwọn àtùnyẹ̀wò",
        "history-show-deleted": "Ajẹ́píparẹ́ níkan",
        "histfirst": "pípẹ́jùlọ",
        "histlast": "tuntunjùlọ",
        "notextmatches": "Kò sí ọ̀rọ̀ ojúewé tóbáramu",
        "prevn": "{{PLURAL:$1|$1}} tókọjá",
        "nextn": "{{PLURAL:$1|$1}} tókàn",
+       "prev-page": "ojúewé tókọjá",
+       "next-page": "ojúewé tóúnbọ̀",
        "prevn-title": "{{PLURAL:$1|Èsì $1 sẹ́yìn|Àwọn èsì $1 sẹ́yìn}}",
        "nextn-title": "{{PLURAL:$1|Èsì $1 tóúnbọ̀|Àwọn èsì $1 tóúnbọ̀}}",
        "shown-title": "{{PLURAL:$1|Ìfihàn èsì $1|Ìfihàn àwọn èsì $1}} nínú ojúewé kọ̀ọ̀kan",
        "searchprofile-advanced-tooltip": "Ṣàwáàrí nínú àwọn orúkọàyè pàtó",
        "search-result-size": "$1 ({{PLURAL:$2|ọ̀rọ̀ 1|àwọn ọ̀rọ̀ $2}})",
        "search-result-category-size": "{{PLURAL:$1|ẹlẹgbẹ́ 1|àwọn ẹlẹgbẹ́ $1}} ({{PLURAL:$2|ẹ̀kà abẹ́ 1|àwọn ẹ̀kà abẹ́ $2}}, {{PLURAL:$3|fáìlì 1|àwọn fáìlì $3}})",
-       "search-redirect": "(àtúnjúwe $1)",
+       "search-redirect": "(àtúnjúwe láti $1)",
        "search-section": "(abala $1)",
+       "search-category": "(ẹ̀ka $1)",
+       "search-file-match": "(ó bá ohun inú fáìlì mu)",
        "search-suggest": "Ṣé ẹ fẹ́: $1",
-       "search-interwiki-caption": "Àwọn iṣẹ́-ọwọ́ mìràn",
+       "search-rewritten": "Ìfihàn àwọn èsì fún $1. Wáàdí fún $2 dípò rẹ̀.",
+       "search-interwiki-caption": "Àwọn èsì láti ọ̀dọ̀ àwọn ibi iṣẹ́-ọwọ́ mìràn",
        "search-interwiki-default": "Áwọn èsì láti $1:",
        "search-interwiki-more": "(tókù)",
+       "search-interwiki-more-results": "àwọn èsì pípọ̀ si",
        "search-relatedarticle": "Tóbáramu",
        "searchrelated": "tóbáramu",
        "searchall": "gbogbo",
        "showingresults": "Ìfihàn nísàlẹ̀ títí dé {{PLURAL:$1|èsì '''1'''|àwọn èsì '''$1'''}} láti ìbẹ̀rẹ̀ ní #'''$2'''.",
+       "showingresultsinrange": "Ìfihàn n'ísàlẹ̀ títí dé {{PLURAL:$1|èsì <strong>1</strong>|àwọn èsì <strong>$1</strong>}} tó bẹ̀rẹ̀ láti #<strong>$2</strong> dé #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Èsì <strong>$1</strong> fún <strong>$3</strong>|Àwọn èsì <strong>$1 - $2</strong> fún <strong>$3</strong>}}",
        "search-nonefound": "Kò sí àwọn èsì kankan tóbáramu mọ́ ìtọrọ.",
        "powersearch-legend": "Àwárí kíkúnrẹ́rẹ́",
        "preferences": "Àwọn ìfẹ́ràn",
        "mypreferences": "Àwọn ìfẹ́ràn",
        "prefs-edits": "Iye àwọn àtúnṣe:",
-       "prefsnologintext2": "Ẹ jọ̀wọ́ ẹ $1 láti ṣe ìyípadà àwọn ìfẹ́ràn yín.",
+       "prefsnologintext2": "Jọ̀wọ́ forúkọ wọlé láti ṣe ìyípadà àwọn ìfẹ́ràn rẹ.",
        "prefs-skin": "Skin (Àwọ̀)",
        "skin-preview": "Àkọ́yẹ̀wò",
        "datedefault": "Kò sí ìfẹ́ràn",
        "prefs-user-pages": "Àwọn ojúewé oníṣe",
        "prefs-personal": "Ọ̀rọ̀ nípa oníṣe",
        "prefs-rc": "Àwọn àtúnṣe tuntun",
-       "prefs-watchlist": "Ìmójútó",
+       "prefs-watchlist": "Ìtòjọ àmójútó",
+       "prefs-editwatchlist": "Àtúnṣe ìtòjọ àmójútò",
        "prefs-watchlist-days": "Ọjọ́ láti fihàn nínú ìmójútó:",
        "prefs-watchlist-days-max": "{{PLURAL:$1|Ọjọ́|Ọjọ́}} $1 púpọ̀jùlọ",
        "prefs-watchlist-edits": "Iye àwọn àtúnṣe láti fìhàn nínú ìmójútó kíkúnrẹ́rẹ́:",
        "rcshowhidebots-show": "Ìfihàn",
        "rcshowhidebots-hide": "Fi pamọ́",
        "rcshowhideliu": "$1 àwọn oníṣe aforúkọsílẹ̀",
+       "rcshowhideliu-show": "Ìfihàn",
        "rcshowhideliu-hide": "Ìbòmọ́lẹ̀",
        "rcshowhideanons": "$1 àwọn oníṣe aláìlórúkọ",
        "rcshowhideanons-show": "Fi hàn",
        "emailuserfooter": "E-mail yìí wá látọ̀dọ̀ $1 sí $2 pẹ̀lú ìfigbéṣe \"E-mail oníṣe\" ní {{SITENAME}}.",
        "usermessage-summary": "Ẹ̀ únfi sístẹ́mù ìránṣẹ́ sílẹ̀.",
        "usermessage-editor": "Sìstẹ́mú olúránṣẹ́",
-       "watchlist": "Ìmójútó",
-       "mywatchlist": "Ìmójútó",
+       "watchlist": "Ìtòjọ àmójútó",
+       "mywatchlist": "Ìtòjọ àmójútó",
        "watchlistfor2": "Fún $1 $2",
        "nowatchlist": "Ẹ kò ní ohun kankan nínú ìmójútó yín.",
        "watchlistanontext": "Ẹ jọ̀wọ́ $1 láti wò tàbí ṣàtúnṣe àwọn ohun inú ìmójútó yín.",
        "unwatchthispage": "Já'wọ́ ìmójútó ojúewé yi",
        "notanarticle": "Kìí ṣe ojúewé àkóónú",
        "notvisiblerev": "Àtúnyẹ̀wò gbígbẹ̀yìn látọwọ́ oníṣe míràn ti jẹ́ píparẹ́",
-       "watchlist-details": "{{PLURAL:$1|Ojúewé $1|Àwọn ojúewé $1}} ló wà nínú ìmójútó yín, tí a kò bá ka àwọn ojúewé ọ̀rọ̀.",
+       "watchlist-details": "{{PLURAL:$1|Ojúewé $1|Àwọn ojúewé $1}} ló wà nínú ìtòjọ àmójútó yín (pọ̀ mọ́ àwọn ojúewé ọ̀rọ̀).",
        "wlheader-enotif": "Ìfitónilétí e-mail wà ní gbígbàláyè.",
-       "wlheader-showupdated": "Àwọn ojúewé tí wọn ti yípadà látìgbà tí ẹ ṣàbẹ̀wò wọn gbẹ̀yìn jẹ́ fífihàn ní ''kedere'''",
-       "wlnote": "Lábẹ́ {{PLURAL:$1|ni àtúnṣe tó gbẹ̀yìn|ni àwọn àtúnṣe '''$1''' tí wọn gbẹ̀yìn}} ní {{PLURAL:$2|wákàtí kan|wákàtí '''$2'''}} sẹ́yìn, títí dí ọjọ́ $3, $4.",
-       "wlshowlast": "Ìfihàn wákàtí $1 sẹ́yìn ọjọ́ $2 sẹ́yìn",
+       "wlheader-showupdated": "Àwọn ojúewé tí wọn ti ní àtúnṣe láti ẹ̀yìn ìgbà tí ẹ ṣàbẹ̀wò si wọn gbẹ̀yìn jẹ́ fífihàn ní lẹ́tà <strong>kedere</strong>.",
+       "wlnote": "Lábẹ́ {{PLURAL:$1|ni àtúnṣe tó gbẹ̀yìn|ni àwọn àtúnṣe <strong>$1</strong> tí wọn gbẹ̀yìn}} ní {{PLURAL:$2|wákàtí kan|wákàtí <strong>$2</strong>}} sẹ́yìn, títí dí ọjọ́ $3, $4.",
+       "wlshowlast": "Ìfihàn wákàtí $1 ọjọ́ $2 gbẹ̀yìn",
        "watchlist-hide": "Ìbòmọ́lẹ̀",
        "watchlist-submit": "Ìfihàn",
        "wlshowhideminor": "àwọn àtúnṣe kékéèké",
        "sp-contributions-search": "Àwáàrí fún àwọn àfikún",
        "sp-contributions-username": "Àdírẹ́ẹ̀sì IP tàbí orúkọ oníṣe:",
        "sp-contributions-toponly": "Ìfihàn àwọn àtúnṣe tí wọn jẹ́ àtúnyẹ̀wò àìpẹ́ nìkan",
+       "sp-contributions-newonly": "Ìfihàn àwọn àtúnṣe tí wọn jẹ́ ìdá ojúewé nìkan",
        "sp-contributions-submit": "Ṣàwárí",
        "whatlinkshere": "Ìjápọ̀ mọ́ ojúewé yí",
        "whatlinkshere-title": "Àwọn ojúewé tó jápọ̀ mọ́ \"$1\"",
        "whatlinkshere-hideredirs": "$1 àtúnjúwe",
        "whatlinkshere-hidetrans": "$1 ìkómọ́ra",
        "whatlinkshere-hidelinks": "Ìjápọ̀ $1",
-       "whatlinkshere-hideimages": "$1 àwọn ìjápọ̀ fáìlì",
+       "whatlinkshere-hideimages": "Àwọn ìjápọ̀ fáìlì $1",
        "whatlinkshere-filters": "Ajọ̀",
        "whatlinkshere-submit": "Rìnsó",
        "autoblockid": "Ìdínàaláraẹni #$1",
        "block": "Dínà oníṣe",
        "unblock": "Ìmúkúrò ìdínà oníṣe",
        "blockip": "Dínà oníṣe",
-       "blockip-legend": "Ìdínà oníṣẹ",
        "blockiptext": "Ẹ lo fọ́ọ̀mù ìsàlẹ̀ láti dínà ìle kọ láti ọ̀dọ̀ àdírẹ́ẹ̀sì IP pàtó kan tàbí orúkọ oníṣe.\nẸyí gbọ́dọ̀ jẹ́ síṣe láti dínà ìṣèbàjẹ́ nìkan, àtí gẹ́gẹ́bí [[{{MediaWiki:Policy-url}}|ètò ìsiṣẹ́]].\nẸ sọ ìdí pàtó nísàlẹ̀ (fún àpẹrẹ, ìtọ́kasí àwọn ojúewé pàtó tí wọ́n jẹ́ bíbàjẹ́).",
        "ipaddressorusername": "Àdírẹ́ẹ̀sì IP tàbí orúkọ oníṣe:",
        "ipbexpiry": "Ìwásópin:",
        "tooltip-search": "Ṣ'àwáàrí nínú {{SITENAME}}",
        "tooltip-search-go": "Lọ sí ojúewé tó ní orúkọ yìí tí ọ́ bá wà",
        "tooltip-search-fulltext": "Ṣe àwáàrí nínú àwọn ojúewé fún ìkọ yìí",
-       "tooltip-p-logo": "Ojúewé Àkọ́kọ́",
+       "tooltip-p-logo": "Bẹ ojúewé àkọ́kọ́ wò",
        "tooltip-n-mainpage": "Ẹ ṣe àbẹ̀wò sí Ojúewé Àkọ́kọ́",
        "tooltip-n-mainpage-description": "Àbẹ̀wò sí ojúewé àkọ́kọ́",
        "tooltip-n-portal": "Ẹ̀kúnrẹ́rẹ́ nípa iṣẹ́ọwọ́ yìí",
        "tooltip-n-currentevents": "Ìròhìn lọ́wọ́lọ́wọ́",
        "tooltip-n-recentchanges": "Àkójọ àwọn àtúnṣe tuntun nínú wiki.",
-       "tooltip-n-randompage": "Ẹ ṣe àrìnàkò ojúewé kan",
+       "tooltip-n-randompage": "Gbé ojúewé àrìnàkò kan jáde",
        "tooltip-n-help": "Fún ìrànlọ́wọ́.",
        "tooltip-t-whatlinkshere": "Àkójọ gbogbo ojúewé wiki tó jápọ̀ s'íbí",
        "tooltip-t-recentchangeslinked": "Àwọn àtúnṣe tuntun nínú àwọn ojúewé tójápọ̀ láti inú ojúewé yìí",
        "tooltip-feed-rss": "RSS feed fùn ojúewé yìí",
        "tooltip-feed-atom": "Atom feed fún ojúewé yìí",
        "tooltip-t-contributions": "Àtòjọ àwọn àfikún {{GENDER:$1|oníṣe yìí}}",
-       "tooltip-t-emailuser": "Ẹ fi e-mail ránṣẹ́ sí oníṣe yìí",
+       "tooltip-t-emailuser": "Fi email ránṣẹ́ sí {{GENDER:$1|oníṣe yìí}}",
        "tooltip-t-upload": "Ìrùsókè àwọn fáìlì",
        "tooltip-t-specialpages": "Àkójọ gbogbo àwọn ojúewé pàtàkì",
-       "tooltip-t-print": "Ojúewé tí Ã³ á¹£e Ã© tẹÌ\80 á¹£'íwèé",
+       "tooltip-t-print": "Ojúewé tó á¹£e Ã© tẹÌ\80 á¹£Ã­ Ã¬wé",
        "tooltip-t-permalink": "Ìjápọ̀ tíkòyípadà sí àtúnyẹ̀wò fún ojúewé náà",
        "tooltip-ca-nstab-main": "Ìfihàn inú ojúewé",
        "tooltip-ca-nstab-user": "Ẹ wo ojúewé oníṣe",
        "pageinfo-article-id": "Nọ́mbà ìdámọ̀ ojúewé",
        "pageinfo-language": "Èdè àkóónú ojúewé",
        "pageinfo-robot-policy": "Ipò ẹ̀rọ ìṣàwárí",
-       "pageinfo-robot-index": "Ṣíṣeéwárí",
-       "pageinfo-robot-noindex": "Kò ṣeéwárí",
+       "pageinfo-robot-index": "Gbígbàláàyè",
+       "pageinfo-robot-noindex": "Àìgbàláàyè",
        "pageinfo-watchers": "Iye àwọn olùṣọ́ ojúewé",
+       "pageinfo-few-watchers": "Iye {{PLURAL:$1|olùwòran|àwọn olùwòran}} kò ju $1 lọ",
        "pageinfo-redirects-name": "Àwọn àtúnjúwe sí ojúewé yìí",
        "pageinfo-subpages-name": "Àwọn ojúewé tó wà lábẹ́ ojúewé yìí",
        "pageinfo-subpages-value": "$1 ({{PLURAL:$2|àtúnjúwe|àtúnjúwe}} $2; {{PLURAL:$3|àìjẹ́-àtúnjúwe|àìjẹ́-àtúnjúwe}} $3)",
        "watchlistedit-raw-done": "Àwọn àmójútó yín ti dọ̀tun.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Àkọlé 1|Àwọn àkọlẹ́ $1}} ti jẹ́ fífikún:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Àkọlé 1|Àwọn àkọlẹ́ $1}} ti jẹ́ yíyọkúrò:",
+       "watchlisttools-clear": "Kó ìtòjọ àmójútó kúrò",
        "watchlisttools-view": "Ẹ wo àwon àtúnṣe tóbaamu",
        "watchlisttools-edit": "Ìwò àti àtúnṣe ìmójútó",
        "watchlisttools-raw": "Ẹ ṣ'àtúnṣe àkójọ ìmójútó látìbẹ̀rẹ̀",
        "version-entrypoints": "Àwọn URL ojú ìwọlé",
        "version-entrypoints-header-entrypoint": "Ojú ìwọlé",
        "version-entrypoints-header-url": "URL",
+       "redirect": "Àþúnjúwe látọ̀dọ̀ fáìlì, oníṣe, ojúewé, àtúnwò, tàbí ID àkọọ́lẹ̀",
+       "redirect-submit": "Lọ",
+       "redirect-lookup": "Bojúwò:",
+       "redirect-value": "Iye:",
+       "redirect-user": "ID oníṣe",
+       "redirect-page": "ID ojúewé",
+       "redirect-revision": "Ìtúnyẹ̀wò ojúewé",
+       "redirect-file": "Orúkọ fáìlì",
        "fileduplicatesearch": "Ìṣàwárí fún àwọn fáìlì àdáwòkọ",
        "fileduplicatesearch-summary": "Ìṣàwárí fún àwọn fáìlì àdáwòkọ gẹ́gẹ́bí nọ́mbà hash",
        "fileduplicatesearch-filename": "Orúkọ fáìlì:",
        "fileduplicatesearch-result-n": "Fáìlì \"$1\" ní {{PLURAL:$2|ìdáwòkọ jíjọra 1|ìdáwòkọ jíjọra $2}}.",
        "fileduplicatesearch-noresults": "Kò sí fáìlì tó únjẹ́ \"$1\".",
        "specialpages": "Àwọn ojúewé pàtàkì",
-       "specialpages-note": "* Àwọn ojúewé pàtàkì onídéédé.\n* <span class=\"mw-specialpagerestricted\">Àwọn ojúewé pàtàkì àìgbàláyè.</span>",
        "specialpages-group-maintenance": "Àwọn ìjábọ̀ ìtọ́jú",
        "specialpages-group-other": "Àwọn ojúewé pàtàkì míràn",
        "specialpages-group-login": "Ìwọlé / ìdá àpamọ́",
        "tags-display-header": "Ìhàn lórí àtòjọ tuntun",
        "tags-description-header": "Ìjúwe kíkún ohun tó túmọ́sì",
        "tags-hitcount-header": "Àwọn àtúnṣe oníàlẹ̀mọ́",
+       "tags-active-yes": "Bẹ́ẹ̀ni",
+       "tags-active-no": "Bẹ́ẹ̀kọ́",
        "tags-edit": "àtúnṣe",
        "tags-hitcount": "{{PLURAL:$1|Àtúnṣe|Àwọn àtúnṣe}} $1",
        "comparepages": "Ìfiwéra àwọn ojúewé",
        "compare-invalid-title": "Àkọlè tí ẹ nàkasí kò tọ́.",
        "compare-title-not-exists": "Àkọlé tí ẹ tọ́kasí kò sí.",
        "compare-revision-not-exists": "Àtúnyẹ̀wò tí ẹ tọ́kasí kò sí.",
+       "diff-form": "'''fọ́ọ̀mù''' kan",
        "dberr-problems": "Àforìjì! Ibiìtakùn yìí únkojú ìsòro ìṣìṣẹ́ẹ̀rọ.",
        "dberr-again": "Ẹ mú sùúrù fún ìṣẹ́jú díẹ̀ kí ẹ tó tún ṣe ìrùsókè.",
        "dberr-info": "(Kò le farakan ẹ̀rọ-ìpèsè ibùdó dátà: $1)",
        "htmlform-reset": "Ìdápadà àwọn àtúnṣe",
        "htmlform-selectorother-other": "Òmíràn",
        "logentry-delete-delete": "$1 pa ojúewé $3 rẹ́",
-       "logentry-delete-restore": "$1 dá ojúewé $3 padà",
+       "logentry-delete-restore": "$1 ti mú ojúewé $3 ($4) {{GENDER:$2|padàwá}}",
        "logentry-delete-event": "$1 ṣe àyípadà ìhànsí {{PLURAL:$5|ìṣẹ̀lẹ̀ àkọọ́lẹ̀ kan|àwọn ìṣẹ̀lẹ̀ àkọọ́lẹ̀ $5}} lórí $3: $4",
-       "logentry-delete-revision": "$1 ṣe àyípadà ìhànsí {{PLURAL:$5|àtúnyẹ̀wò kan|àwọn àtúnyẹ̀wò $5}} lórí $3: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|ṣe àyípadà}} ìhàn {{PLURAL:$5|àtúnyẹ̀wò kan|àwọn àtúnyẹ̀wò $5}} lórí $3: $4",
        "logentry-delete-event-legacy": "$1 ṣe àyípadà ìhànsí àwọn ìṣẹ̀lẹ̀ àkọọ́lẹ̀ lórí $3",
        "logentry-delete-revision-legacy": "$1 ṣe àyípadà ìhànsí àwọn àtúnyẹ̀wò lórí ojúewé $3",
        "logentry-suppress-delete": "$1 fi ojúewé $3 sílẹ̀",
        "revdelete-restricted": "ṣe ìmúlò ìpàlà fún àwọn olúmójútó",
        "revdelete-unrestricted": "yọ ìpàlà fún àwọn olúmójútó",
        "logentry-move-move": "$1 {{GENDER:$2|ṣeyípòdà}} ojúewé $3 sí $4",
-       "logentry-move-move-noredirect": "$1 ṣeyípòdà ojúewé $3 sí $4 láìfi àtúnjúwe sílẹ̀",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|ṣeyípòdà}} ojúewé $3 sí $4 láìfi àtúnjúwe sílẹ̀",
        "logentry-move-move_redir": "$1 ṣeyípòdà ojúewé $3 sí $4 lórí àtúnjúwe",
        "logentry-move-move_redir-noredirect": "$1 ṣeyípòdà ojúewé $3 sí $4 lórí àtúnjúwe láìfi àtúnjúwe sílẹ̀",
        "logentry-patrol-patrol": "$1 ṣe àmí àtúnyẹ̀wò $4 ojúewé $3 bíi sísọ́",
-       "logentry-patrol-patrol-auto": "$1 fúnraẹni ṣàmì àtúnyẹ̀wò $4 ti ojúewé $3 bíi síṣọ́",
+       "logentry-patrol-patrol-auto": "$1 fúnraẹni {{GENDER:$2|ṣàmì}} àtúnyẹ̀wò $4 sí ojúewé $3 bíi síṣọ́",
        "logentry-newusers-newusers": "Àpamọ́ oníṣe $1 jẹ́ dídá",
        "logentry-newusers-create": "Àkọ́pamọ́ oníṣe $1 ti jẹ́ {{GENDER:$2|dídá}}",
        "logentry-newusers-create2": "Àpamọ́ oníṣe $3 jẹ́ dídá látọwọ́ $1",
-       "logentry-newusers-autocreate": "Àkópamọ́ $1 jẹ́ dídá fúnrarẹ̀",
+       "logentry-newusers-autocreate": "Àkópamọ́ oníṣe $1 {{GENDER:$2|jẹ́ dídá}} fúnrarẹ̀",
        "logentry-rights-rights": "$1 yí ìjọ́mọ ẹgbẹ́ padà fún $3 láti $4 sí $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|yí}} ọmọ ẹgbẹ́ padà fún $3",
        "logentry-rights-autopromote": "$1 jẹ́ {{GENDER:$2|gbígbénípòga}} nífúnraẹni láti $4 sí $5",
-       "logentry-upload-upload": "Ó dàfikún",
+       "logentry-upload-upload": "$1 {{GENDER:$2|ṣe ìkósókè}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|s'àkówọlé}} ẹ̀yà tuntun $3",
        "rightsnone": "(kòsí)",
        "feedback-adding": "Ìfikún ìdáhùn sí ojúewé...",
        "feedback-bugcheck": "Ó dáa bẹ́ẹ̀! Ẹ rí pé kò í ṣe ìkan nínú [$1 àwọn ìsòrò tí a ti mọ̀ tẹ́lẹ̀].",
        "feedback-subject": "Oríọ̀rọ̀:",
        "feedback-submit": "Fúnsílẹ̀",
        "feedback-thanks": "Adúpẹ́! Ìdáhùn yín ti jẹ́ fífikún sí ojúewé \"[$2 $1]\".",
-       "searchsuggest-search": "Ṣàwárí",
+       "searchsuggest-search": "Ṣ'àwáàrí nínú {{SITENAME}}",
        "searchsuggest-containing": "tó ní...",
        "api-error-badtoken": "Àsìṣe inú: Ìdáramọ̀ búburú.",
        "api-error-emptypage": "Ẹ kò ní àyè láti dá ojúewé tuntun tó jẹ́ òfo.",
        "special-characters-group-gujarati": "Gujarati",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
-       "special-characters-group-khmer": "Khmer"
+       "special-characters-group-khmer": "Khmer",
+       "randomrootpage": "Ojúewé ìtẹ́dìí àrìnàkò"
 }
index 2c161b8..e18e847 100644 (file)
        "recentchanges-legend": "最近更改选项",
        "recentchanges-summary": "在本页面追踪本wiki的最近更改。",
        "recentchanges-noresult": "在此期间没有符合这些条件的编辑",
+       "recentchanges-timeout": "此次搜索已超时。您可以尝试不同的搜索参数。",
        "recentchanges-feed-description": "用这个源跟踪本wiki的最近更改。",
        "recentchanges-label-newpage": "该编辑创建了新页面",
        "recentchanges-label-minor": "该编辑为小编辑",
index 335a236..564c932 100644 (file)
        "rcfilters-filter-newpages-label": "頁面建立",
        "rcfilters-filter-newpages-description": "建立新頁面的編輯。",
        "rcfilters-filter-categorization-label": "分類變更",
-       "rcfilters-filter-categorization-description": "å·²å\8a å\85¥å\88°å\88\86é¡\9eæ\88\96å¾\9eå\88\86é¡\9e中移é\99¤ç\9a\84é \81é\9d¢記錄。",
+       "rcfilters-filter-categorization-description": "å¾\9eå\88\86é¡\9e中添å\8a æ\88\96移é\99¤é \81é\9d¢ç\9a\84記錄。",
        "rcfilters-filter-logactions-label": "日誌動作",
        "rcfilters-filter-logactions-description": "管理動作、帳號建立、頁面刪除、上傳…",
        "rcfilters-hideminor-conflicts-typeofchange-global": "\"次要編輯\" 過濾條件與一個或多個變更類型過濾條件衝突,因為某些變更類型無法指定為 \"次要\"。衝突的過濾條件已在上方使用的過濾條件區域中標示。",
        "rcfilters-view-tags": "標記的編輯",
        "rcfilters-view-namespaces-tooltip": "按命名空間過濾結果",
        "rcfilters-view-tags-tooltip": "按編輯標籤過濾結果",
+       "rcfilters-view-return-to-default-tooltip": "返回主過濾選單",
        "rcfilters-view-tags-help-icon-tooltip": "了解更多關於標記編輯的資訊",
        "rcfilters-liveupdates-button": "實時更新",
        "rcfilters-liveupdates-button-title-on": "關閉實時更新",
index 7de0ae4..174b973 100644 (file)
@@ -1496,7 +1496,7 @@ abstract class Maintenance {
         * @return string
         */
        private static function readlineEmulation( $prompt ) {
-               $bash = Installer::locateExecutableInDefaultPaths( [ 'bash' ] );
+               $bash = ExecutableFinder::findInDefaultPaths( 'bash' );
                if ( !wfIsWindows() && $bash ) {
                        $retval = false;
                        $encPrompt = wfEscapeShellArg( $prompt );
index e87e024..b5beef6 100644 (file)
@@ -55,27 +55,30 @@ $maintenance->setup();
 // to $maintenance->mSelf. Keep that here for b/c
 $self = $maintenance->getName();
 
-require_once "$IP/includes/PreConfigSetup.php";
-
-if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
-       # Use a callback function to configure MediaWiki
-       call_user_func( MW_CONFIG_CALLBACK );
-} else {
-       // Require the configuration (probably LocalSettings.php)
-       require $maintenance->loadSettings();
+// Define how settings are loaded (e.g. LocalSettings.php)
+if ( !defined( 'MW_CONFIG_CALLBACK' ) && !defined( 'MW_CONFIG_FILE' ) ) {
+       define( 'MW_CONFIG_FILE', $maintenance->loadSettings() );
 }
 
-if ( $maintenance->getDbType() === Maintenance::DB_NONE ) {
-       if ( $wgLocalisationCacheConf['storeClass'] === false
-               && ( $wgLocalisationCacheConf['store'] == 'db'
-                       || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory ) )
-       ) {
-               $wgLocalisationCacheConf['storeClass'] = 'LCStoreNull';
+// Custom setup for Maintenance entry point
+if ( !defined( 'MW_SETUP_CALLBACK' ) ) {
+       function wfMaintenanceSetup() {
+               // @codingStandardsIgnoreLine MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
+               global $maintenance, $wgLocalisationCacheConf, $wgCacheDirectory;
+               if ( $maintenance->getDbType() === Maintenance::DB_NONE ) {
+                       if ( $wgLocalisationCacheConf['storeClass'] === false
+                               && ( $wgLocalisationCacheConf['store'] == 'db'
+                                       || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory ) )
+                       ) {
+                               $wgLocalisationCacheConf['storeClass'] = 'LCStoreNull';
+                       }
+               }
+
+               $maintenance->finalSetup();
        }
+       define( 'MW_SETUP_CALLBACK', 'wfMaintenanceSetup' );
 }
 
-$maintenance->finalSetup();
-// Some last includes
 require_once "$IP/includes/Setup.php";
 
 // Initialize main config instance
index 74a918a..d99f70a 100644 (file)
@@ -69,7 +69,7 @@ class PopulateContentModel extends Maintenance {
        }
 
        protected function clearCache( $page_id, $rev_id ) {
-               $contentModelKey = $this->wanCache->makeKey( 'page', 'content-model', $rev_id );
+               $contentModelKey = $this->wanCache->makeKey( 'page-content-model', $rev_id );
                $revisionKey =
                        $this->wanCache->makeGlobalKey( 'revision', $this->wikiId, $page_id, $rev_id );
 
index 929b5c9..af2a318 100644 (file)
@@ -42,7 +42,7 @@ class RunJobs extends Maintenance {
                $this->addOption( 'type', 'Type of job to run', false, true );
                $this->addOption( 'procs', 'Number of processes to use', false, true );
                $this->addOption( 'nothrottle', 'Ignore job throttling configuration', false, false );
-               $this->addOption( 'result', 'Set to JSON to print only a JSON response', false, true );
+               $this->addOption( 'result', 'Set to "json" to print only a JSON response', false, true );
                $this->addOption( 'wait', 'Wait for new jobs instead of exiting', false, false );
        }
 
index 96a425f..c30e150 100644 (file)
@@ -23,9 +23,9 @@
     "karma-chrome-launcher": "2.0.0",
     "karma-firefox-launcher": "1.0.1",
     "karma-mocha-reporter": "2.2.3",
-    "karma-qunit": "1.0.0",
+    "karma-qunit": "1.2.1",
     "nodemw": "0.10.1",
-    "qunitjs": "1.23.1",
+    "qunitjs": "2.4.0",
     "stylelint": "7.8.0",
     "stylelint-config-wikimedia": "0.4.1",
     "wdio-junit-reporter": "0.2.0",
index 7afd89d..b9986fe 100644 (file)
@@ -165,6 +165,7 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'jquery.badge' => [
+               'deprecated' => 'Please use Notifications instead.',
                'scripts' => 'resources/src/jquery/jquery.badge.js',
                'styles' => 'resources/src/jquery/jquery.badge.css',
                'dependencies' => 'mediawiki.language',
@@ -1911,6 +1912,7 @@ return [
                        'namespaces',
                        'invert',
                        'recentchanges-noresult',
+                       'recentchanges-timeout',
                        'quotation-marks',
                ],
                'dependencies' => [
index debe0b9..3c03c70 100644 (file)
@@ -33,6 +33,7 @@
         * @event update
         * @param {jQuery|string} $changesListContent List of changes
         * @param {jQuery} $fieldset Server-generated form
+        * @param {boolean} isDatabaseTimeout Whether this is an error state due to a database query
         * @param {boolean} isInitialDOM Whether the previous dom variables are from the initial page load
         * @param {boolean} fromLiveUpdate These are new changes fetched via Live Update
         *
         *
         * @param {jQuery|string} changesListContent
         * @param {jQuery} $fieldset
+        * @param {boolean} isDatabaseTimeout Whether this is an error state due to a database query
+        *   timeout.
         * @param {boolean} [isInitialDOM] Using the initial (already attached) DOM elements
         * @param {boolean} [separateOldAndNew] Whether a logical separation between old and new changes is needed
         * @fires update
         */
-       mw.rcfilters.dm.ChangesListViewModel.prototype.update = function ( changesListContent, $fieldset, isInitialDOM, separateOldAndNew ) {
+       mw.rcfilters.dm.ChangesListViewModel.prototype.update = function ( changesListContent, $fieldset, isDatabaseTimeout, isInitialDOM, separateOldAndNew ) {
                var from = this.nextFrom;
                this.valid = true;
                this.extractNextFrom( $fieldset );
                this.checkForUnseenWatchedChanges( changesListContent );
-               this.emit( 'update', changesListContent, $fieldset, isInitialDOM, separateOldAndNew ? from : null );
+               this.emit( 'update', changesListContent, $fieldset, isDatabaseTimeout, isInitialDOM, separateOldAndNew ? from : null );
        };
 
        /**
index ac998d7..8d36cf5 100644 (file)
         * @param {Object} [tagList] Tag definition
         */
        mw.rcfilters.Controller.prototype.initialize = function ( filterStructure, namespaceStructure, tagList ) {
-               var parsedSavedQueries,
+               var parsedSavedQueries, pieces,
                        displayConfig = mw.config.get( 'StructuredChangeFiltersDisplayConfig' ),
                        defaultSavedQueryExists = mw.config.get( 'wgStructuredChangeFiltersDefaultSavedQueryExists' ),
                        controller = this,
                        views = {},
                        items = [],
-                       uri = new mw.Uri(),
-                       $changesList = $( '.mw-changeslist' ).first().contents();
+                       uri = new mw.Uri();
 
                // Prepare views
                if ( namespaceStructure ) {
                        // again
                        this.updateStateFromUrl( false );
 
+                       pieces = this._extractChangesListInfo( $( '#mw-content-text' ) );
+
                        // Update the changes list with the existing data
                        // so it gets processed
                        this.changesListModel.update(
-                               $changesList.length ? $changesList : 'NO_RESULTS',
-                               $( 'fieldset.cloptions' ).first(),
+                               pieces.changes,
+                               pieces.fieldset,
+                               pieces.noResultsDetails === 'NO_RESULTS_TIMEOUT',
                                true // We're using existing DOM elements
                        );
                }
                }
        };
 
+       /**
+        * Extracts information from the changes list DOM
+        *
+        * @param {jQuery} $root Root DOM to find children from
+        * @return {Object} Information about changes list
+        * @return {Object|string} return.changes Changes list, or 'NO_RESULTS' if there are no results
+        *   (either normally or as an error)
+        * @return {string} [return.noResultsDetails] 'NO_RESULTS_NORMAL' for a normal 0-result set,
+        *   'NO_RESULTS_TIMEOUT' for no results due to a timeout, or omitted for more than 0 results
+        * @return {jQuery} return.fieldset Fieldset
+        */
+       mw.rcfilters.Controller.prototype._extractChangesListInfo = function ( $root ) {
+               var info, isTimeout,
+                       $changesListContents = $root.find( '.mw-changeslist' ).first().contents(),
+                       areResults = !!$changesListContents.length;
+
+               info = {
+                       changes: $changesListContents.length ? $changesListContents : 'NO_RESULTS',
+                       fieldset: $root.find( 'fieldset.cloptions' ).first()
+               };
+
+               if ( !areResults ) {
+                       isTimeout = !!$root.find( '.mw-changeslist-timeout' ).length;
+                       info.noResultsDetails = isTimeout ? 'NO_RESULTS_TIMEOUT' : 'NO_RESULTS_NORMAL';
+               }
+
+               return info;
+       };
+
        /**
         * Create filter data from a number, for the filters that are numerical value
         *
                                        this.changesListModel.update(
                                                $changesListContent,
                                                $fieldset,
+                                               pieces.noResultsDetails === 'NO_RESULTS_TIMEOUT',
                                                false,
                                                // separator between old and new changes
                                                updateMode === this.SHOW_NEW_CHANGES || updateMode === this.LIVE_UPDATE
                return this._queryChangesList( 'updateChangesList' )
                        .then(
                                function ( data ) {
-                                       var $parsed = $( '<div>' ).append( $( $.parseHTML( data.content ) ) ),
-                                               pieces = {
-                                                       // Changes list
-                                                       changes: $parsed.find( '.mw-changeslist' ).first().contents(),
-                                                       // Fieldset
-                                                       fieldset: $parsed.find( 'fieldset.cloptions' ).first()
-                                               };
-
-                                       if ( pieces.changes.length === 0 ) {
-                                               pieces.changes = 'NO_RESULTS';
-                                       }
+                                       var $parsed = $( '<div>' ).append( $( $.parseHTML( data.content ) ) );
 
-                                       return pieces;
-                               }
+                                       return this._extractChangesListInfo( $parsed );
+
+                               }.bind( this )
                        );
        };
 
index bab8ee5..dd095dd 100644 (file)
                                savedLinksListWidget = new mw.rcfilters.ui.SavedLinksListWidget(
                                        controller, savedQueriesModel, { $overlay: $overlay }
                                ),
-                               specialPage = mw.config.get( 'wgCanonicalSpecialPageName' );
+                               specialPage = mw.config.get( 'wgCanonicalSpecialPageName' ),
+                               $changesListRoot = $( '.mw-changeslist, .mw-changeslist-empty, .mw-changeslist-timeout' );
 
                        // TODO: The changesListWrapperWidget should be able to initialize
                        // after the model is ready.
+
                        // eslint-disable-next-line no-new
                        new mw.rcfilters.ui.ChangesListWrapperWidget(
-                               filtersModel, changesListModel, controller, $( '.mw-changeslist, .mw-changeslist-empty' ) );
+                               filtersModel, changesListModel, controller, $changesListRoot );
 
                        // Remove the -loading class that may have been added on the server side.
                        // If we are in fact going to load a default saved query, this .initialize()
index 7e2a67d..ef358e0 100644 (file)
        }
 
        .mw-changeslist {
-               &-empty {
-                       // Hide the 'empty' message when we load rcfilters
-                       // since we replace it anyways with a specific
-                       // message of our own
-                       display: none;
-               }
-
                // Reserve space for the highlight circles
                ul,
                table.mw-enhanced-rc {
                }
        }
 
+       // Temporarily hide any 'empty' or 'timeout' message while we
+       // load rcfilters.
+       .mw-changeslist-empty,
+       .mw-changeslist-timeout {
+               display: none;
+       }
+
        body.mw-rcfilters-ui-loading .mw-changeslist {
                opacity: 0.5;
        }
index 8f3bacf..0fa3137 100644 (file)
 
        // Correction for Enhanced RC
        // This is outside the scope of the 'highlights' wrapper
-       table.mw-enhanced-rc td {
-               vertical-align: middle;
-
-               &:last-child {
+       table.mw-enhanced-rc {
+               td:last-child {
                        width: 100%;
                }
        }
index a6f3644..701eb72 100644 (file)
@@ -42,6 +42,7 @@
                display: inline-block;
                vertical-align: middle;
                text-overflow: ellipsis;
+               white-space: nowrap;
                overflow: hidden;
                cursor: pointer;
                margin-left: 0.5px;
index 83e68a5..d4faf83 100644 (file)
@@ -46,6 +46,8 @@
                this.$element
                        .addClass( 'mw-rcfilters-ui-changesListWrapperWidget' )
                        // We handle our own display/hide of the empty results message
+                       // We keep the timeout class here and remove it later, since at this
+                       // stage it is still needed to identify that the timeout occurred.
                        .removeClass( 'mw-changeslist-empty' );
 
                this.setupNewChangesButtonContainer();
         *
         * @param {jQuery|string} $changesListContent The content of the updated changes list
         * @param {jQuery} $fieldset The content of the updated fieldset
+        * @param {boolean} isDatabaseTimeout Whether this is an error state due to a database query
         * @param {boolean} isInitialDOM Whether $changesListContent is the existing (already attached) DOM
         * @param {boolean} from Timestamp of the new changes
         */
        mw.rcfilters.ui.ChangesListWrapperWidget.prototype.onModelUpdate = function (
-               $changesListContent, $fieldset, isInitialDOM, from
+               $changesListContent, $fieldset, isDatabaseTimeout, isInitialDOM, from
        ) {
-               var conflictItem,
+               var conflictItem, noResultsKey,
                        $message = $( '<div>' )
                                .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-results' ),
                        isEmpty = $changesListContent === 'NO_RESULTS',
                                                        .text( mw.message( conflictItem.getCurrentConflictResultMessage() ).text() )
                                        );
                        } else {
+                               noResultsKey = isDatabaseTimeout ?
+                                       'recentchanges-timeout' :
+                                       'recentchanges-noresult';
+
                                $message
                                        .append(
                                                $( '<div>' )
                                                        .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-results-noresult' )
-                                                       .text( mw.message( 'recentchanges-noresult' ).text() )
+                                                       .text( mw.message( noResultsKey ).text() )
                                        );
+
+                               this.$element.removeClass( 'mw-changeslist-timeout' );
                        }
 
                        this.$element.append( $message );
index 83905d5..4edc272 100644 (file)
         *
         * @param {jQuery|string} $changesList Updated changes list
         * @param {jQuery} $fieldset Updated fieldset
+        * @param {boolean} isDatabaseTimeout Whether this is an error state due to a database query
         * @param {boolean} isInitialDOM Whether $changesListContent is the existing (already attached) DOM
         */
-       mw.rcfilters.ui.FormWrapperWidget.prototype.onChangesModelUpdate = function ( $changesList, $fieldset, isInitialDOM ) {
+       mw.rcfilters.ui.FormWrapperWidget.prototype.onChangesModelUpdate = function ( $changesList, $fieldset, isDatabaseTimeout, isInitialDOM ) {
                this.$submitButton.prop( 'disabled', false );
 
                // Replace the entire fieldset
index d6b06e6..cb11332 100644 (file)
@@ -48,6 +48,10 @@ table.mw-enhanced-rc td.mw-enhanced-rc-nested {
        display: none;
 }
 
+.mw-enhancedchanges-arrow {
+       padding-top: 2px;
+}
+
 .mw-enhancedchanges-arrow-space {
        display: inline-block;
        *display: inline; /* IE7 and below */
diff --git a/resources/src/mediawiki.ui/components/images/checked.png b/resources/src/mediawiki.ui/components/images/checked.png
deleted file mode 100644 (file)
index 672a824..0000000
Binary files a/resources/src/mediawiki.ui/components/images/checked.png and /dev/null differ
diff --git a/resources/src/mediawiki.ui/components/images/checked.svg b/resources/src/mediawiki.ui/components/images/checked.svg
deleted file mode 100644 (file)
index aca2b2b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path d="M4 12l5 5L20 5" stroke="#00B78C" stroke-width="3" fill="none"/></svg>
index f10c93d..9d2e93b 100644 (file)
                        format = llll.replace( lll.replace( ll, '' ), '' );
 
                        if ( this.longDisplayFormat ) {
-                               format = format.replace( 'MMM', 'MMMM' ).replace( 'ddd', 'dddd' );
+                               // Replace MMM to MMMM and ddd to dddd but don't change MMMM and dddd
+                               format = format.replace( /MMMM?/, 'MMMM' ).replace( /dddd?/, 'dddd' );
                        }
 
                        return format;
index f178698..0e9c19b 100644 (file)
                                        } else {
                                                parameters[ key ] = '\x1f' + parameters[ key ].join( '\x1f' );
                                        }
-                               }
-                               // Boolean values are only false when not given at all
-                               if ( parameters[ key ] === false || parameters[ key ] === undefined ) {
+                               } else if ( parameters[ key ] === false || parameters[ key ] === undefined ) {
+                                       // Boolean values are only false when not given at all
                                        delete parameters[ key ];
                                }
                        }
diff --git a/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-ltr.png b/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-ltr.png
deleted file mode 100644 (file)
index 2a64fd0..0000000
Binary files a/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-ltr.png and /dev/null differ
diff --git a/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-ltr.svg b/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-ltr.svg
deleted file mode 100644 (file)
index b34fb38..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   version="1.1"
-   width="30"
-   height="30"
-   id="svg2">
-  <defs
-     id="defs4" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="matrix(0.41333074,0,0,0.41333074,-183.39876,-197.95599)"
-     id="layer1">
-    <g
-       transform="translate(455.60433,484.94177)"
-       id="g3163">
-      <path
-         d="M 0,0.03543307 0,60.519684 43.192915,30.259842 z"
-         id="path3165"
-         style="fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none" />
-      <path
-         d="m 43.157481,0.03543307 5.633859,0 0,60.48425093 -5.633859,0 z"
-         id="path3167"
-         style="fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none" />
-    </g>
-  </g>
-</svg>
diff --git a/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-rtl.png b/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-rtl.png
deleted file mode 100644 (file)
index 78a493e..0000000
Binary files a/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-rtl.png and /dev/null differ
diff --git a/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-rtl.svg b/resources/src/mediawiki/images/pager-arrow-disabled-fastforward-rtl.svg
deleted file mode 100644 (file)
index 529e8d0..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   version="1.1"
-   width="30"
-   height="30"
-   id="svg2">
-  <defs
-     id="defs4" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="matrix(0.4132798,0,0,0.4132798,-87.72955,-233.35372)"
-     id="layer1">
-    <path
-       d="m 272.96237,570.69005 0,60.4894 -43.19393,-30.2447 z"
-       id="path3023-7"
-       style="fill:#cccccc;fill-opacity:1;stroke:none" />
-    <rect
-       width="5.6406202"
-       height="60.489399"
-       x="-229.82111"
-       y="570.68774"
-       transform="scale(-1,1)"
-       id="rect3799-9"
-       style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:20;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-  </g>
-</svg>
diff --git a/resources/src/mediawiki/images/pager-arrow-disabled-forward-ltr.png b/resources/src/mediawiki/images/pager-arrow-disabled-forward-ltr.png
deleted file mode 100644 (file)
index aa4fbf8..0000000
Binary files a/resources/src/mediawiki/images/pager-arrow-disabled-forward-ltr.png and /dev/null differ
diff --git a/resources/src/mediawiki/images/pager-arrow-disabled-forward-ltr.svg b/resources/src/mediawiki/images/pager-arrow-disabled-forward-ltr.svg
deleted file mode 100644 (file)
index 9fbcf20..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   version="1.1"
-   width="30"
-   height="30"
-   id="svg2">
-  <defs
-     id="defs4" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="matrix(0.41329555,0,0,0.41329555,-111.35036,-135.3531)"
-     id="layer1">
-    <path
-       d="m 284.11732,333.54605 0,60.4894 43.19395,-30.2447 z"
-       id="path3023-7-2"
-       style="fill:#cccccc;fill-opacity:1;stroke:none" />
-  </g>
-</svg>
diff --git a/resources/src/mediawiki/images/pager-arrow-disabled-forward-rtl.png b/resources/src/mediawiki/images/pager-arrow-disabled-forward-rtl.png
deleted file mode 100644 (file)
index 83df068..0000000
Binary files a/resources/src/mediawiki/images/pager-arrow-disabled-forward-rtl.png and /dev/null differ
diff --git a/resources/src/mediawiki/images/pager-arrow-disabled-forward-rtl.svg b/resources/src/mediawiki/images/pager-arrow-disabled-forward-rtl.svg
deleted file mode 100644 (file)
index 3130f10..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   version="1.1"
-   width="30"
-   height="30"
-   id="svg2">
-  <defs
-     id="defs4" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="matrix(0.41329555,0,0,0.41329555,-139.69062,-163.69336)"
-     id="layer1">
-    <path
-       d="m 395.88269,402.11748 0,60.4894 -43.19395,-30.2447 z"
-       id="path3023-7-2-8"
-       style="fill:#cccccc;fill-opacity:1;stroke:none" />
-  </g>
-</svg>
diff --git a/resources/src/mediawiki/images/pager-arrow-fastforward-ltr.png b/resources/src/mediawiki/images/pager-arrow-fastforward-ltr.png
deleted file mode 100644 (file)
index 8904b89..0000000
Binary files a/resources/src/mediawiki/images/pager-arrow-fastforward-ltr.png and /dev/null differ
diff --git a/resources/src/mediawiki/images/pager-arrow-fastforward-ltr.svg b/resources/src/mediawiki/images/pager-arrow-fastforward-ltr.svg
deleted file mode 100644 (file)
index 57df4c0..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   version="1.1"
-   width="30"
-   height="30"
-   id="svg2">
-  <defs
-     id="defs4" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="matrix(0.41327999,0,0,0.41327999,-98.356798,-226.26904)"
-     id="layer1">
-    <path
-       d="m 249.89477,553.5472 0,60.4894 43.19391,-30.2447 z"
-       id="path3023"
-       style="fill:#0000aa;fill-opacity:1;stroke:none" />
-    <rect
-       width="5.6406202"
-       height="60.489399"
-       x="293.03604"
-       y="553.54492"
-       id="rect3799"
-       style="color:#000000;fill:#0000aa;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:20;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-  </g>
-</svg>
diff --git a/resources/src/mediawiki/images/pager-arrow-fastforward-rtl.png b/resources/src/mediawiki/images/pager-arrow-fastforward-rtl.png
deleted file mode 100644 (file)
index 71d0819..0000000
Binary files a/resources/src/mediawiki/images/pager-arrow-fastforward-rtl.png and /dev/null differ
diff --git a/resources/src/mediawiki/images/pager-arrow-fastforward-rtl.svg b/resources/src/mediawiki/images/pager-arrow-fastforward-rtl.svg
deleted file mode 100644 (file)
index dbb473b..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   version="1.1"
-   width="30"
-   height="30"
-   id="svg2"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="pager-arrow-fastforward-rtl.svg">
-  <sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="1366"
-     inkscape:window-height="692"
-     id="namedview8"
-     showgrid="false"
-     inkscape:zoom="17.4"
-     inkscape:cx="7.0114943"
-     inkscape:cy="15"
-     inkscape:window-x="0"
-     inkscape:window-y="24"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="svg2" />
-  <defs
-     id="defs4" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="matrix(0.07055556,0,0,0.07055556,-9.1581596,-2.7587241)"
-     id="layer1">
-    <path
-       d="m 485.26916,74.546776 0,354.317014 -253.00859,-177.15851 z"
-       id="path3023-2"
-       style="fill:#0000aa;fill-opacity:1;stroke:none"
-       inkscape:connector-curvature="0" />
-    <rect
-       width="33.039963"
-       height="354.31699"
-       x="-232.56898"
-       y="74.533081"
-       transform="scale(-1,1)"
-       id="rect3799-6"
-       style="color:#000000;fill:#0000aa;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:20;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-  </g>
-</svg>
diff --git a/resources/src/mediawiki/images/pager-arrow-forward-ltr.png b/resources/src/mediawiki/images/pager-arrow-forward-ltr.png
deleted file mode 100644 (file)
index c68a4fc..0000000
Binary files a/resources/src/mediawiki/images/pager-arrow-forward-ltr.png and /dev/null differ
diff --git a/resources/src/mediawiki/images/pager-arrow-forward-ltr.svg b/resources/src/mediawiki/images/pager-arrow-forward-ltr.svg
deleted file mode 100644 (file)
index 1ebf9c1..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   version="1.1"
-   width="30"
-   height="30"
-   id="svg2">
-  <defs
-     id="defs4" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="matrix(0.41329555,0,0,0.41329555,-162.12666,-110.55537)"
-     id="layer1">
-    <path
-       d="m 406.97447,273.54605 0,60.4894 43.19391,-30.2447 z"
-       id="path3023-3-9"
-       style="fill:#0000aa;fill-opacity:1;stroke:none" />
-  </g>
-</svg>
diff --git a/resources/src/mediawiki/images/pager-arrow-forward-rtl.png b/resources/src/mediawiki/images/pager-arrow-forward-rtl.png
deleted file mode 100644 (file)
index d0a7030..0000000
Binary files a/resources/src/mediawiki/images/pager-arrow-forward-rtl.png and /dev/null differ
diff --git a/resources/src/mediawiki/images/pager-arrow-forward-rtl.svg b/resources/src/mediawiki/images/pager-arrow-forward-rtl.svg
deleted file mode 100644 (file)
index b494409..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   version="1.1"
-   width="30"
-   height="30"
-   id="svg2">
-  <defs
-     id="defs4" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="matrix(0.41329555,0,0,0.41329555,-78.28671,-153.06577)"
-     id="layer1">
-    <path
-       d="m 247.31124,376.4032 0,60.4894 -43.19391,-30.2447 z"
-       id="path3023-3"
-       style="fill:#0000aa;fill-opacity:1;stroke:none" />
-  </g>
-</svg>
index 6aed02f..c0a9312 100644 (file)
@@ -66,7 +66,7 @@ class TidySupport {
                                        $this->config['driver'] = 'RaggettExternal';
                                        $this->config['tidyBin'] = $wgTidyBin;
                                } else {
-                                       $path = Installer::locateExecutableInDefaultPaths( $wgTidyBin );
+                                       $path = ExecutableFinder::findInDefaultPaths( $wgTidyBin );
                                        if ( $path !== false ) {
                                                $this->config['driver'] = 'RaggettExternal';
                                                $this->config['tidyBin'] = $wgTidyBin;
index 63d05a0..c422b51 100644 (file)
@@ -6,69 +6,62 @@
  */
 class BlockTest extends MediaWikiLangTestCase {
 
-       /** @var Block */
-       private $block;
-       private $madeAt;
-
-       /* variable used to save up the blockID we insert in this test suite */
-       private $blockId;
-
-       function addDBData() {
-               $user = User::newFromName( 'UTBlockee' );
-               if ( $user->getId() == 0 ) {
-                       $user->addToDatabase();
-                       TestUser::setPasswordForUser( $user, 'UTBlockeePassword' );
-
-                       $user->saveSettings();
-               }
+       /**
+        * @return User
+        */
+       private function getUserForBlocking() {
+               $testUser = $this->getMutableTestUser();
+               $user = $testUser->getUser();
+               $user->addToDatabase();
+               TestUser::setPasswordForUser( $user, 'UTBlockeePassword' );
+               $user->saveSettings();
+               return $user;
+       }
 
+       /**
+        * @param User $user
+        *
+        * @return Block
+        * @throws MWException
+        */
+       private function addBlockForUser( User $user ) {
                // Delete the last round's block if it's still there
-               $oldBlock = Block::newFromTarget( 'UTBlockee' );
+               $oldBlock = Block::newFromTarget( $user->getName() );
                if ( $oldBlock ) {
                        // An old block will prevent our new one from saving.
                        $oldBlock->delete();
                }
 
                $blockOptions = [
-                       'address' => 'UTBlockee',
+                       'address' => $user->getName(),
                        'user' => $user->getId(),
                        'reason' => 'Parce que',
                        'expiry' => time() + 100500,
                ];
-               $this->block = new Block( $blockOptions );
-               $this->madeAt = wfTimestamp( TS_MW );
+               $block = new Block( $blockOptions );
 
-               $this->block->insert();
+               $block->insert();
                // save up ID for use in assertion. Since ID is an autoincrement,
                // its value might change depending on the order the tests are run.
                // ApiBlockTest insert its own blocks!
-               $newBlockId = $this->block->getId();
-               if ( $newBlockId ) {
-                       $this->blockId = $newBlockId;
-               } else {
+               if ( !$block->getId() ) {
                        throw new MWException( "Failed to insert block for BlockTest; old leftover block remaining?" );
                }
 
                $this->addXffBlocks();
-       }
 
-       /**
-        * debug function : dump the ipblocks table
-        */
-       function dumpBlocks() {
-               $v = $this->db->select( 'ipblocks', '*' );
-               print "Got " . $v->numRows() . " rows. Full dump follow:\n";
-               foreach ( $v as $row ) {
-                       print_r( $row );
-               }
+               return $block;
        }
 
        /**
         * @covers Block::newFromTarget
         */
        public function testINewFromTargetReturnsCorrectBlock() {
+               $user = $this->getUserForBlocking();
+               $block = $this->addBlockForUser( $user );
+
                $this->assertTrue(
-                       $this->block->equals( Block::newFromTarget( 'UTBlockee' ) ),
+                       $block->equals( Block::newFromTarget( $user->getName() ) ),
                        "newFromTarget() returns the same block as the one that was made"
                );
        }
@@ -77,8 +70,11 @@ class BlockTest extends MediaWikiLangTestCase {
         * @covers Block::newFromID
         */
        public function testINewFromIDReturnsCorrectBlock() {
+               $user = $this->getUserForBlocking();
+               $block = $this->addBlockForUser( $user );
+
                $this->assertTrue(
-                       $this->block->equals( Block::newFromID( $this->blockId ) ),
+                       $block->equals( Block::newFromID( $block->getId() ) ),
                        "newFromID() returns the same block as the one that was made"
                );
        }
@@ -87,8 +83,12 @@ class BlockTest extends MediaWikiLangTestCase {
         * per T28425
         */
        public function testBug26425BlockTimestampDefaultsToTime() {
+               $user = $this->getUserForBlocking();
+               $block = $this->addBlockForUser( $user );
+               $madeAt = wfTimestamp( TS_MW );
+
                // delta to stop one-off errors when things happen to go over a second mark.
-               $delta = abs( $this->madeAt - $this->block->mTimestamp );
+               $delta = abs( $madeAt - $block->mTimestamp );
                $this->assertLessThan(
                        2,
                        $delta,
@@ -105,9 +105,12 @@ class BlockTest extends MediaWikiLangTestCase {
         * @covers Block::newFromTarget
         */
        public function testBug29116NewFromTargetWithEmptyIp( $vagueTarget ) {
-               $block = Block::newFromTarget( 'UTBlockee', $vagueTarget );
+               $user = $this->getUserForBlocking();
+               $initialBlock = $this->addBlockForUser( $user );
+               $block = Block::newFromTarget( $user->getName(), $vagueTarget );
+
                $this->assertTrue(
-                       $this->block->equals( $block ),
+                       $initialBlock->equals( $block ),
                        "newFromTarget() returns the same block as the one that was made when "
                                . "given empty vagueTarget param " . var_export( $vagueTarget, true )
                );
@@ -351,6 +354,9 @@ class BlockTest extends MediaWikiLangTestCase {
         * @covers Block::chooseBlock
         */
        public function testBlocksOnXff( $xff, $exCount, $exResult ) {
+               $user = $this->getUserForBlocking();
+               $this->addBlockForUser( $user );
+
                $list = array_map( 'trim', explode( ',', $xff ) );
                $xffblocks = Block::getBlocksForIPList( $list, true );
                $this->assertEquals( $exCount, count( $xffblocks ), 'Number of blocks for ' . $xff );
@@ -411,8 +417,11 @@ class BlockTest extends MediaWikiLangTestCase {
        }
 
        public function testSystemBlocks() {
+               $user = $this->getUserForBlocking();
+               $this->addBlockForUser( $user );
+
                $blockOptions = [
-                       'address' => 'UTBlockee',
+                       'address' => $user->getName(),
                        'reason' => 'test system block',
                        'timestamp' => wfTimestampNow(),
                        'expiry' => $this->db->getInfinity(),
@@ -438,4 +447,5 @@ class BlockTest extends MediaWikiLangTestCase {
                        $this->assertSame( 'Cannot autoblock from a system block', $ex->getMessage() );
                }
        }
+
 }
index d29c79d..d5948ed 100644 (file)
@@ -640,6 +640,17 @@ class OutputPageTest extends MediaWikiTestCase {
                                'not all and (min-resolution: 2dppx),' .
                                '</img/two-x.png>;rel=preload;as=image;media=(min-resolution: 2dppx)'
                        ],
+                       [
+                               [
+                                       'ResourceBasePath' => '/w',
+                                       'Logo' => '/img/default.png',
+                                       'LogoHD' => [
+                                               'svg' => '/img/vector.svg',
+                                       ],
+                               ],
+                               'Link: </img/vector.svg>;rel=preload;as=image'
+
+                       ],
                        [
                                [
                                        'ResourceBasePath' => '/w',
index 9dcd0cf..10186ed 100644 (file)
@@ -151,6 +151,78 @@ class RevisionIntegrationTest extends MediaWikiTestCase {
                $this->assertEquals( $orig->getSha1(), $rev->getSha1() );
        }
 
+       /**
+        * @covers Revision::insertOn
+        */
+       public function testInsertOn_success() {
+               $parentId = $this->testPage->getLatest();
+
+               // If an ExternalStore is set don't use it.
+               $this->setMwGlobals( 'wgDefaultExternalStore', false );
+
+               $rev = new Revision( [
+                       'page' => $this->testPage->getId(),
+                       'title' => $this->testPage->getTitle(),
+                       'text' => 'Revision Text',
+                       'comment' => 'Revision comment',
+               ] );
+
+               $revId = $rev->insertOn( wfGetDB( DB_MASTER ) );
+
+               $this->assertInternalType( 'integer', $revId );
+               $this->assertInternalType( 'integer', $rev->getTextId() );
+               $this->assertSame( $revId, $rev->getId() );
+
+               $this->assertSelect(
+                       'text',
+                       [ 'old_id', 'old_text' ],
+                       "old_id = {$rev->getTextId()}",
+                       [ [ strval( $rev->getTextId() ), 'Revision Text' ] ]
+               );
+               $this->assertSelect(
+                       'revision',
+                       [
+                               'rev_id',
+                               'rev_page',
+                               'rev_text_id',
+                               'rev_user',
+                               'rev_minor_edit',
+                               'rev_deleted',
+                               'rev_len',
+                               'rev_parent_id',
+                               'rev_sha1',
+                       ],
+                       "rev_id = {$rev->getId()}",
+                       [ [
+                               strval( $rev->getId() ),
+                               strval( $this->testPage->getId() ),
+                               strval( $rev->getTextId() ),
+                               '0',
+                               '0',
+                               '0',
+                               '13',
+                               strval( $parentId ),
+                               's0ngbdoxagreuf2vjtuxzwdz64n29xm',
+                       ] ]
+               );
+       }
+
+       /**
+        * @covers Revision::insertOn
+        */
+       public function testInsertOn_exceptionOnNoPage() {
+               // If an ExternalStore is set don't use it.
+               $this->setMwGlobals( 'wgDefaultExternalStore', false );
+               $this->setExpectedException(
+                       MWException::class,
+                       "Cannot insert revision: page ID must be nonzero"
+               );
+
+               $rev = new Revision( [] );
+
+               $rev->insertOn( wfGetDB( DB_MASTER ) );
+       }
+
        /**
         * @covers Revision::newFromTitle
         */
index 028d3b4..07bf299 100644 (file)
@@ -129,4 +129,46 @@ class ApiParseTest extends ApiTestCase {
                        );
                }
        }
+
+       public function testSkinModules() {
+               $factory = new SkinFactory();
+               $factory->register( 'testing', 'Testing', function () {
+                       $skin = $this->getMockBuilder( SkinFallback::class )
+                               ->setMethods( [ 'getDefaultModules', 'setupSkinUserCss' ] )
+                               ->getMock();
+                       $skin->expects( $this->once() )->method( 'getDefaultModules' )
+                               ->willReturn( [
+                                       'core' => [ 'foo', 'bar' ],
+                                       'content' => [ 'baz' ]
+                               ] );
+                       $skin->expects( $this->once() )->method( 'setupSkinUserCss' )
+                               ->will( $this->returnCallback( function ( OutputPage $out ) {
+                                       $out->addModuleStyles( 'foo.styles' );
+                               } ) );
+                       return $skin;
+               } );
+               $this->setService( 'SkinFactory', $factory );
+
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'pageid' => self::$pageId,
+                       'useskin' => 'testing',
+                       'prop' => 'modules',
+               ] );
+               $this->assertSame(
+                       [ 'foo', 'bar', 'baz' ],
+                       $res[0]['parse']['modules'],
+                       'resp.parse.modules'
+               );
+               $this->assertSame(
+                       [],
+                       $res[0]['parse']['modulescripts'],
+                       'resp.parse.modulescripts'
+               );
+               $this->assertSame(
+                       [ 'foo.styles' ],
+                       $res[0]['parse']['modulestyles'],
+                       'resp.parse.modulestyles'
+               );
+       }
 }
index c5a1759..e23f318 100644 (file)
@@ -159,8 +159,9 @@ class WANObjectCacheTest extends PHPUnit_Framework_TestCase {
                $this->assertEquals( 9, $hit, "Values evicted" );
 
                $key = reset( $keys );
-               // Get into cache
+               // Get into cache (default process cache group)
                $this->cache->getWithSetCallback( $key, 100, $callback, [ 'pcTTL' => 5 ] );
+               $this->assertEquals( 10, $hit, "Value calculated" );
                $this->cache->getWithSetCallback( $key, 100, $callback, [ 'pcTTL' => 5 ] );
                $this->assertEquals( 10, $hit, "Value cached" );
                $outerCallback = function () use ( &$callback, $key ) {
@@ -168,7 +169,8 @@ class WANObjectCacheTest extends PHPUnit_Framework_TestCase {
 
                        return 43 + $v;
                };
-               $this->cache->getWithSetCallback( $key, 100, $outerCallback );
+               // Outer key misses and refuses inner key process cache value
+               $this->cache->getWithSetCallback( "$key-miss-outer", 100, $outerCallback );
                $this->assertEquals( 11, $hit, "Nested callback value process cache skipped" );
        }
 
index 7d0813d..df4a281 100644 (file)
@@ -54,26 +54,4 @@ class ArticleTest extends MediaWikiTestCase {
                $this->assertEquals( -8, $this->article->ext_someNewProperty,
                        "Article get/set magic on update to new field" );
        }
-
-       /**
-        * Checks for the existence of the backwards compatibility static functions
-        * (forwarders to WikiPage class)
-        *
-        * @covers Article::selectFields
-        * @covers Article::onArticleCreate
-        * @covers Article::onArticleDelete
-        * @covers Article::onArticleEdit
-        */
-       public function testStaticFunctions() {
-               $this->hideDeprecated( 'Article::selectFields' );
-
-               $this->assertEquals( WikiPage::selectFields(), Article::selectFields(),
-                       "Article static functions" );
-               $this->assertEquals( true, is_callable( "Article::onArticleCreate" ),
-                       "Article static functions" );
-               $this->assertEquals( true, is_callable( "Article::onArticleDelete" ),
-                       "Article static functions" );
-               $this->assertEquals( true, is_callable( "ImagePage::onArticleEdit" ),
-                       "Article static functions" );
-       }
 }
index 7b56def..5ef30e8 100644 (file)
@@ -220,6 +220,48 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                $this->assertEquals( 'somevalue', $extracted['globals']['egBar'] );
        }
 
+       /**
+        * @covers ExtensionProcessor::addConfigGlobal()
+        * @expectedException RuntimeException
+        */
+       public function testDuplicateConfigKey1() {
+               $processor = new ExtensionProcessor;
+               $info = [
+                       'config' => [
+                               'Bar' => '',
+                       ]
+               ] + self::$default;
+               $info2 = [
+                       'config' => [
+                               'Bar' => 'g',
+                       ],
+                       'name' => 'FooBar2',
+               ];
+               $processor->extractInfo( $this->dir, $info, 1 );
+               $processor->extractInfo( $this->dir, $info2, 1 );
+       }
+
+       /**
+        * @covers ExtensionProcessor::addConfigGlobal()
+        * @expectedException RuntimeException
+        */
+       public function testDuplicateConfigKey2() {
+               $processor = new ExtensionProcessor;
+               $info = [
+                       'config' => [
+                               'Bar' => [ 'value' => 'somevalue' ],
+                       ]
+               ] + self::$default;
+               $info2 = [
+                       'config' => [
+                               'Bar' => [ 'value' => 'somevalue' ],
+                       ],
+                       'name' => 'FooBar2',
+               ];
+               $processor->extractInfo( $this->dir, $info, 2 );
+               $processor->extractInfo( $this->dir, $info2, 2 );
+       }
+
        public static function provideExtractExtensionMessagesFiles() {
                $dir = __DIR__ . '/FooBar/';
                return [
index c567698..be17a69 100644 (file)
@@ -1,15 +1,16 @@
 <?php
 
 /**
- * @group Database
  * @group ResourceLoader
  */
 class ResourceLoaderSkinModuleTest extends PHPUnit_Framework_TestCase {
 
+       // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
        public static function provideGetStyles() {
                return [
                        [
                                'parent' => [],
+                               'logo' => '/logo.png',
                                'expected' => [
                                        'all' => [ '.mw-wiki-logo { background-image: url(/logo.png); }' ],
                                ],
@@ -18,38 +19,77 @@ class ResourceLoaderSkinModuleTest extends PHPUnit_Framework_TestCase {
                                'parent' => [
                                        'screen' => '.example {}',
                                ],
+                               'logo' => '/logo.png',
                                'expected' => [
                                        'screen' => [ '.example {}' ],
                                        'all' => [ '.mw-wiki-logo { background-image: url(/logo.png); }' ],
                                ],
                        ],
+                       [
+                               'parent' => [],
+                               'logo' => [
+                                       '1x' => '/logo.png',
+                                       '1.5x' => '/logo@1.5x.png',
+                                       '2x' => '/logo@2x.png',
+                               ],
+                               'expected' => [
+                                       'all' => [ <<<CSS
+.mw-wiki-logo { background-image: url(/logo.png); }
+CSS
+                                       ],
+                                       '(-webkit-min-device-pixel-ratio: 1.5), (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx), (min-resolution: 144dpi)' => [ <<<CSS
+.mw-wiki-logo { background-image: url(/logo@1.5x.png);background-size: 135px auto; }
+CSS
+                                       ],
+                                       '(-webkit-min-device-pixel-ratio: 2), (min--moz-device-pixel-ratio: 2), (min-resolution: 2dppx), (min-resolution: 192dpi)' => [ <<<CSS
+.mw-wiki-logo { background-image: url(/logo@2x.png);background-size: 135px auto; }
+CSS
+                                       ],
+                               ],
+                       ],
+                       [
+                               'parent' => [],
+                               'logo' => [
+                                       '1x' => '/logo.png',
+                                       'svg' => '/logo.svg',
+                               ],
+                               'expected' => [
+                                       'all' => [ <<<CSS
+.mw-wiki-logo { background-image: url(/logo.png); }
+CSS
+                                       , <<<CSS
+.mw-wiki-logo { background-image: -webkit-linear-gradient(transparent, transparent), url(/logo.svg); background-image: linear-gradient(transparent, transparent), url(/logo.svg);background-size: 135px auto; }
+CSS
+                                       ],
+                               ],
+                       ],
                ];
        }
+       // @codingStandardsIgnoreEnd
 
        /**
         * @dataProvider provideGetStyles
         * @covers ResourceLoaderSkinModule::normalizeStyles
         * @covers ResourceLoaderSkinModule::getStyles
         */
-       public function testGetStyles( $parent, $expected ) {
+       public function testGetStyles( $parent, $logo, $expected ) {
                $module = $this->getMockBuilder( ResourceLoaderSkinModule::class )
                        ->disableOriginalConstructor()
-                       ->setMethods( [ 'readStyleFiles' ] )
+                       ->setMethods( [ 'readStyleFiles', 'getConfig', 'getLogoData' ] )
                        ->getMock();
                $module->expects( $this->once() )->method( 'readStyleFiles' )
                        ->willReturn( $parent );
-               $module->setConfig( new HashConfig( [
-                       'ResourceBasePath' => '/w',
-                       'Logo' => '/logo.png',
-                       'LogoHD' => false,
-               ] ) );
+               $module->expects( $this->once() )->method( 'getConfig' )
+                       ->willReturn( new HashConfig() );
+               $module->expects( $this->once() )->method( 'getLogoData' )
+                       ->willReturn( $logo );
 
                $ctx = $this->getMockBuilder( ResourceLoaderContext::class )
                        ->disableOriginalConstructor()->getMock();
 
                $this->assertEquals(
-                       $module->getStyles( $ctx ),
-                       $expected
+                       $expected,
+                       $module->getStyles( $ctx )
                );
        }
 
@@ -64,4 +104,102 @@ class ResourceLoaderSkinModuleTest extends PHPUnit_Framework_TestCase {
 
                $this->assertFalse( $module->isKnownEmpty( $ctx ) );
        }
+
+       /**
+        * @dataProvider provideGetLogo
+        * @covers ResourceLoaderSkinModule::getLogo
+        */
+       public function testGetLogo( $config, $expected, $baseDir = null ) {
+               if ( $baseDir ) {
+                       $oldIP = $GLOBALS['IP'];
+                       $GLOBALS['IP'] = $baseDir;
+                       $teardown = new Wikimedia\ScopedCallback( function () use ( $oldIP ) {
+                               $GLOBALS['IP'] = $oldIP;
+                       } );
+               }
+
+               $this->assertEquals(
+                       $expected,
+                       ResourceLoaderSkinModule::getLogo( new HashConfig( $config ) )
+               );
+       }
+
+       public function provideGetLogo() {
+               return [
+                       'simple' => [
+                               'config' => [
+                                       'ResourceBasePath' => '/w',
+                                       'Logo' => '/img/default.png',
+                                       'LogoHD' => false,
+                               ],
+                               'expected' => '/img/default.png',
+                       ],
+                       'default and 2x' => [
+                               'config' => [
+                                       'ResourceBasePath' => '/w',
+                                       'Logo' => '/img/default.png',
+                                       'LogoHD' => [
+                                               '2x' => '/img/two-x.png',
+                                       ],
+                               ],
+                               'expected' => [
+                                       '1x' => '/img/default.png',
+                                       '2x' => '/img/two-x.png',
+                               ],
+                       ],
+                       'default and all HiDPIs' => [
+                               'config' => [
+                                       'ResourceBasePath' => '/w',
+                                       'Logo' => '/img/default.png',
+                                       'LogoHD' => [
+                                               '1.5x' => '/img/one-point-five.png',
+                                               '2x' => '/img/two-x.png',
+                                       ],
+                               ],
+                               'expected' => [
+                                       '1x' => '/img/default.png',
+                                       '1.5x' => '/img/one-point-five.png',
+                                       '2x' => '/img/two-x.png',
+                               ],
+                       ],
+                       'default and SVG' => [
+                               'config' => [
+                                       'ResourceBasePath' => '/w',
+                                       'Logo' => '/img/default.png',
+                                       'LogoHD' => [
+                                               'svg' => '/img/vector.svg',
+                                       ],
+                               ],
+                               'expected' => [
+                                       '1x' => '/img/default.png',
+                                       'svg' => '/img/vector.svg',
+                               ],
+                       ],
+                       'everything' => [
+                               'config' => [
+                                       'ResourceBasePath' => '/w',
+                                       'Logo' => '/img/default.png',
+                                       'LogoHD' => [
+                                               '1.5x' => '/img/one-point-five.png',
+                                               '2x' => '/img/two-x.png',
+                                               'svg' => '/img/vector.svg',
+                                       ],
+                               ],
+                               'expected' => [
+                                       '1x' => '/img/default.png',
+                                       'svg' => '/img/vector.svg',
+                               ],
+                       ],
+                       'versioned url' => [
+                               'config' => [
+                                       'ResourceBasePath' => '/w',
+                                       'Logo' => '/w/test.jpg',
+                                       'LogoHD' => false,
+                                       'UploadPath' => '/w/images',
+                               ],
+                               'expected' => '/w/test.jpg?edcf2',
+                               'baseDir' => dirname( dirname( __DIR__ ) ) . '/data/media',
+                       ],
+               ];
+       }
 }
index a474f20..cd52366 100644 (file)
@@ -479,7 +479,6 @@ class LanguageTest extends LanguageClassesTestCase {
                        [ 'fr', true, 'Two letters, minor case' ],
                        [ 'EN', false, 'Two letters, upper case' ],
                        [ 'tyv', true, 'Three letters' ],
-                       [ 'tokipona', true, 'long language code' ],
                        [ 'be-tarask', true, 'With dash' ],
                        [ 'be-x-old', true, 'With extension (two dashes)' ],
                        [ 'be_tarask', false, 'Reject underscores' ],
index 99bd427..58cb6f3 100644 (file)
@@ -35,7 +35,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
         */
        protected function checkHasGzip() {
                if ( self::$hasGzip === null ) {
-                       self::$hasGzip = ( Installer::locateExecutableInDefaultPaths( 'gzip' ) !== false );
+                       self::$hasGzip = ( ExecutableFinder::findInDefaultPaths( 'gzip' ) !== false );
                }
 
                if ( !self::$hasGzip ) {