Merge "Install cache/integration-tests as require-dev"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 20 Jul 2018 10:21:48 +0000 (10:21 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 20 Jul 2018 10:21:48 +0000 (10:21 +0000)
266 files changed:
RELEASE-NOTES-1.32
autoload.php
composer.json
docs/hooks.txt
docs/uidesign/table-layout.html [deleted file]
includes/Category.php
includes/DefaultSettings.php
includes/GlobalFunctions.php
includes/MediaWikiServices.php
includes/PageProps.php
includes/Preferences.php
includes/PrefixSearch.php
includes/ServiceWiring.php
includes/actions/HistoryAction.php
includes/api/ApiMain.php
includes/api/ApiQuerySearch.php
includes/api/i18n/ru.json
includes/auth/AuthManager.php
includes/auth/ConfirmLinkSecondaryAuthenticationProvider.php
includes/changes/EnhancedChangesList.php
includes/config/ConfigRepository.php [new file with mode: 0644]
includes/deferred/LinksDeletionUpdate.php
includes/filerepo/FileBackendDBRepoWrapper.php
includes/filerepo/RepoGroup.php
includes/htmlform/fields/HTMLTitleTextField.php
includes/htmlform/fields/HTMLUserTextField.php
includes/installer/i18n/ar.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/bn.json
includes/installer/i18n/gl.json
includes/installer/i18n/nb.json
includes/jobqueue/JobQueueGroup.php
includes/jobqueue/JobQueueSecondTestQueue.php [deleted file]
includes/libs/CSSMin.php
includes/libs/MapCacheLRU.php
includes/libs/lockmanager/MemcLockManager.php
includes/libs/objectcache/MultiWriteBagOStuff.php
includes/libs/objectcache/WANObjectCache.php
includes/libs/rdbms/database/Database.php
includes/logging/LogEventsList.php
includes/page/WikiPage.php
includes/pager/TablePager.php
includes/preferences/DefaultPreferencesFactory.php
includes/preferences/Filter.php [new file with mode: 0644]
includes/preferences/IntvalFilter.php [new file with mode: 0644]
includes/preferences/MultiUsernameFilter.php [new file with mode: 0644]
includes/preferences/TimezoneFilter.php [new file with mode: 0644]
includes/registration/ExtensionJsonValidator.php
includes/registration/ExtensionProcessor.php
includes/registration/ExtensionRegistry.php
includes/registration/Processor.php
includes/registration/VersionChecker.php
includes/search/SearchDatabase.php
includes/search/SearchEngine.php
includes/search/SearchMssql.php
includes/search/SearchMySQL.php
includes/search/SearchOracle.php
includes/search/SearchPostgres.php
includes/search/SearchSqlite.php
includes/shell/Command.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specials/SpecialEditTags.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialSearch.php
includes/specials/pagers/ContribsPager.php
includes/specials/pagers/DeletedContribsPager.php
includes/user/PasswordReset.php
includes/user/User.php
includes/widget/search/SearchFormWidget.php
languages/Language.php
languages/data/README.md [new file with mode: 0644]
languages/data/normalize-ar.php
languages/data/normalize-ml.php
languages/i18n/af.json
languages/i18n/ais.json
languages/i18n/am.json
languages/i18n/an.json
languages/i18n/ar.json
languages/i18n/arc.json
languages/i18n/ary.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ase.json
languages/i18n/ast.json
languages/i18n/awa.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/bcc.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bjn.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/cdo.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/frp.json
languages/i18n/frr.json
languages/i18n/ga.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/grc.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ilo.json
languages/i18n/inh.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kab.json
languages/i18n/khw.json
languages/i18n/kk-cyrl.json
languages/i18n/km.json
languages/i18n/ko.json
languages/i18n/krc.json
languages/i18n/ksh.json
languages/i18n/la.json
languages/i18n/lb.json
languages/i18n/lfn.json
languages/i18n/lg.json
languages/i18n/li.json
languages/i18n/lij.json
languages/i18n/lki.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/lus.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/mai.json
languages/i18n/mdf.json
languages/i18n/mg.json
languages/i18n/min.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mn.json
languages/i18n/mni.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/my.json
languages/i18n/myv.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/oc.json
languages/i18n/or.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.json
languages/i18n/prg.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/rm.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sd.json
languages/i18n/ses.json
languages/i18n/sgs.json
languages/i18n/sh.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sli.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/stq.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/szl.json
languages/i18n/ta.json
languages/i18n/tay.json
languages/i18n/te.json
languages/i18n/th.json
languages/i18n/tk.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/tt-latn.json
languages/i18n/ug-arab.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/vec.json
languages/i18n/vep.json
languages/i18n/vi.json
languages/i18n/vo.json
languages/i18n/war.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/yue.json
languages/i18n/zgh.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/i18n/zh-hk.json
maintenance/interwiki.list
maintenance/interwiki.sql
maintenance/language/generateNormalizerDataAr.php
maintenance/mysql.php
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ItemMenuOptionWidget.less
tests/parser/ParserTestRunner.php
tests/parser/parserTests.php
tests/phpunit/data/registration/duplicate_keys.json [new file with mode: 0644]
tests/phpunit/includes/GlobalFunctions/wfArrayFilterTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiOptionsTest.php
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/libs/MapCacheLRUTest.php
tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php
tests/phpunit/includes/preferences/FiltersTest.php [new file with mode: 0644]
tests/phpunit/includes/registration/ExtensionJsonValidatorTest.php
tests/phpunit/includes/registration/VersionCheckerTest.php
tests/phpunit/includes/search/SearchEngineTest.php
tests/phpunit/includes/specials/SpecialPreferencesTest.php
tests/phpunit/mocks/search/MockCompletionSearchEngine.php

index da317de..5435213 100644 (file)
@@ -92,6 +92,9 @@ production.
 * Assertion failures from the 'assert' and 'assertuser' parameters will no
   longer use the action module's custom response format, for the few modules
   that use custom formatters that handle errors.
+* (T198935) User list preferences such as `email-blacklist` and similar
+  extension preferences are no longer represented as arrays when returned by
+  action=query&meta=userinfo&uiprop=options.
 
 === Action API internal changes in 1.32 ===
 * Added 'ApiParseMakeOutputPage' hook.
@@ -189,8 +192,6 @@ because of Phabricator reports.
   CapsuleMultiselectWidget. The following methods may no longer be used:
   * setItemsFromData: Use setValue instead
   * getItemsData: Use getItems instead and get the data property
-* The hook 'LogEventsListGetExtraInputs' now needs a form descriptor array
-  and not plain HTML.
 * LanguageCode::bcp47() now always returns a valid BCP 47 code.  This means
   that some MediaWiki-specific language codes, such as `simple`, are mapped
   into valid BCP 47 codes (eg `en-simple`).
@@ -264,6 +265,20 @@ because of Phabricator reports.
 * (T100681) Use of the Parsoid v1 API with the VirtualRESTService, deprecated in
   MediaWiki 1.26,  is now hard-deprecated. All known clients were converted to
   the Parsoid v3 API in May 2015.
+* $input is deprecated in hook 'LogEventsListGetExtraInputs'. Use
+  $formDescriptor instead.
+* SearchEngine::transformSearchTerm( $term ) should no longer be called prior
+  to running searchText. This method was mainly implemented to support the
+  'prefix' URI param in SpecialSearch, but there are no reasons to expose this
+  logic as it should be handled internally by SearchEngine implementations
+  supporting this feature. SearchEngine implementations should no longer
+  override this methods.
+* SearchEngine::replacePrefixes( $query ) should no longer be called prior
+  to running searchText/searchTitle.
+* (T199657) Messages for $wgFilterLogTypes labels should be no longer be in the
+  'log-show-hide-[type]' format. Instead use 'logeventslist-[type]-log'.
+* Global functions  wfArrayFilter() and wfArrayFilterByKey() are deprecated.
+  use array_filter() directly.
 
 === Other changes in 1.32 ===
 * (T198811) The following tables have had their UNIQUE indexes turned into
index 40b8acf..64c34b5 100644 (file)
@@ -703,7 +703,6 @@ $wgAutoloadLocalClasses = [
        'JobQueueMemory' => __DIR__ . '/includes/jobqueue/JobQueueMemory.php',
        'JobQueueReadOnlyError' => __DIR__ . '/includes/jobqueue/JobQueue.php',
        'JobQueueRedis' => __DIR__ . '/includes/jobqueue/JobQueueRedis.php',
-       'JobQueueSecondTestQueue' => __DIR__ . '/includes/jobqueue/JobQueueSecondTestQueue.php',
        'JobRunner' => __DIR__ . '/includes/jobqueue/JobRunner.php',
        'JobSpecification' => __DIR__ . '/includes/jobqueue/JobSpecification.php',
        'JpegHandler' => __DIR__ . '/includes/media/JpegHandler.php',
@@ -889,6 +888,7 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Auth\\Throttler' => __DIR__ . '/includes/auth/Throttler.php',
        'MediaWiki\\Auth\\UserDataAuthenticationRequest' => __DIR__ . '/includes/auth/UserDataAuthenticationRequest.php',
        'MediaWiki\\Auth\\UsernameAuthenticationRequest' => __DIR__ . '/includes/auth/UsernameAuthenticationRequest.php',
+       'MediaWiki\\Config\\ConfigRepository' => __DIR__ . '/includes/config/ConfigRepository.php',
        'MediaWiki\\DB\\PatchFileLocation' => __DIR__ . '/includes/db/PatchFileLocation.php',
        'MediaWiki\\Diff\\ComplexityException' => __DIR__ . '/includes/diff/ComplexityException.php',
        'MediaWiki\\Diff\\WordAccumulator' => __DIR__ . '/includes/diff/WordAccumulator.php',
index 06cd70d..b16983f 100644 (file)
@@ -64,6 +64,7 @@
                "mediawiki/mediawiki-codesniffer": "20.0.0",
                "monolog/monolog": "~1.22.1",
                "nikic/php-parser": "3.1.3",
+               "seld/jsonlint": "1.7.1",
                "nmred/kafka-php": "0.1.5",
                "phpunit/phpunit": "4.8.36 || ^6.5",
                "psy/psysh": "0.9.6",
index fff5b24..40777da 100644 (file)
@@ -2187,6 +2187,7 @@ $autocreated: Boolean, whether this was an auto-creation
 Special:Log for a specific log type
 $type: String of log type being displayed
 $logEventsList: LogEventsList object for context and access to the WebRequest
+&$input: string HTML of an input element (deprecated, use $formDescriptor instead)
 &$formDescriptor: array HTMLForm's form descriptor
 
 'LogEventsListShowLogExtract': Called before the string is added to OutputPage.
diff --git a/docs/uidesign/table-layout.html b/docs/uidesign/table-layout.html
deleted file mode 100644 (file)
index 2c26819..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-       <style>
-               /** This is just for coloring: */
-               table { border: 1px solid #CC0; }
-               td { border: 1px solid  #CCC; }
-
-               table {
-                       width: 100%;
-                       table-layout: fixed;
-               }
-
-               #first {
-                       width: 300px;
-               }
-       </style>
-</head>
-<body>
-
-<p>
-This play with table-layout:fixed; and applying the width to colgroup or col element. Firefox only recongize the width if it is applied on col element!</p>
-<p>
-On a perfect browser, both tables should look the same</p>
-
-<dl>
-       <dt>colgroup</dt>
-       <dd>300 px width is applied to the first colgroup element</dd>
-</dl>
-<div style="width: 400px;">
-<table>
-       <colgroup id="first" /></colgroup>
-       <colgroup id="second"/></colgroup>
-       <colgroup id="third" /></colgroup>
-       <tr>
-               <td>Very long?</td>
-               <td>#</td>
-               <td>$</td>
-       </tr>
-</table>
-</div>
-
-<dl>
-       <dt>col</dt>
-       <dd>Each colgroup has an additional col element. The first col element is applied the 300 px width</dd>
-</dl>
-
-<div style="width: 400px;">
-<table>
-       <colgroup><col id="first" /></colgroup>
-       <colgroup><col id="second"/></colgroup>
-       <colgroup><col id="third" /></colgroup>
-       <tr>
-               <td>Very long?</td>
-               <td>#</td>
-               <td>$</td>
-       </tr>
-</table>
-</div>
index f8ac8ae..3352c2c 100644 (file)
@@ -420,4 +420,45 @@ class Category {
 
                return true;
        }
+
+       /**
+        * Call refreshCounts() if there are no entries in the categorylinks table
+        * or if the category table has a row that states that there are no entries
+        *
+        * Due to lock errors or other failures, the precomputed counts can get out of sync,
+        * making it hard to know when to delete the category row without checking the
+        * categorylinks table.
+        *
+        * @return bool Whether links were refreshed
+        * @since 1.32
+        */
+       public function refreshCountsIfEmpty() {
+               $dbw = wfGetDB( DB_MASTER );
+
+               $hasLink = $dbw->selectField(
+                       'categorylinks',
+                       '1',
+                       [ 'cl_to' => $this->getName() ],
+                       __METHOD__
+               );
+               if ( !$hasLink ) {
+                       $this->refreshCounts(); // delete any category table entry
+
+                       return true;
+               }
+
+               $hasBadRow = $dbw->selectField(
+                       'category',
+                       '1',
+                       [ 'cat_title' => $this->getName(), 'cat_pages <= 0' ],
+                       __METHOD__
+               );
+               if ( $hasBadRow ) {
+                       $this->refreshCounts(); // clean up this row
+
+                       return true;
+               }
+
+               return false;
+       }
 }
index 9e366d5..2811613 100644 (file)
@@ -7766,8 +7766,8 @@ $wgLogRestrictions = [
  * hidden by default unless the link is clicked. Import logs will be shown by
  * default, and hidden when the link is clicked.
  *
- * A message of the form log-show-hide-[type] should be added, and will be used
- * for the link text.
+ * A message of the form logeventslist-[type]-log should be added, and will be
+ * used for the link text.
  */
 $wgFilterLogTypes = [
        'patrol' => true,
@@ -8975,7 +8975,7 @@ $wgCommentTableSchemaMigrationStage = MIGRATION_OLD;
  * @since 1.32
  * @var int An appropriate combination of SCHEMA_COMPAT_XXX flags.
  */
-$wgMultiContentRevisionSchemaMigrationStage = MIGRATION_OLD;
+$wgMultiContentRevisionSchemaMigrationStage = SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD;
 
 /**
  * Actor table schema migration stage.
index 3ea020f..eec4216 100644 (file)
@@ -141,7 +141,7 @@ function wfArrayDiff2_cmp( $a, $b ) {
 }
 
 /**
- * Like array_filter with ARRAY_FILTER_USE_BOTH, but works pre-5.6.
+ * @deprecated since 1.32, use array_filter() with ARRAY_FILTER_USE_BOTH directly
  *
  * @param array $arr
  * @param callable $callback Will be called with the array value and key (in that order) and
@@ -149,17 +149,11 @@ function wfArrayDiff2_cmp( $a, $b ) {
  * @return array
  */
 function wfArrayFilter( array $arr, callable $callback ) {
-       if ( defined( 'ARRAY_FILTER_USE_BOTH' ) ) {
-               return array_filter( $arr, $callback, ARRAY_FILTER_USE_BOTH );
-       }
-       $filteredKeys = array_filter( array_keys( $arr ), function ( $key ) use ( $arr, $callback ) {
-               return call_user_func( $callback, $arr[$key], $key );
-       } );
-       return array_intersect_key( $arr, array_fill_keys( $filteredKeys, true ) );
+       return array_filter( $arr, $callback, ARRAY_FILTER_USE_BOTH );
 }
 
 /**
- * Like array_filter with ARRAY_FILTER_USE_KEY, but works pre-5.6.
+ * @deprecated since 1.32, use array_filter() with ARRAY_FILTER_USE_KEY directly
  *
  * @param array $arr
  * @param callable $callback Will be called with the array key and should return a bool which
@@ -167,9 +161,7 @@ function wfArrayFilter( array $arr, callable $callback ) {
  * @return array
  */
 function wfArrayFilterByKey( array $arr, callable $callback ) {
-       return wfArrayFilter( $arr, function ( $val, $key ) use ( $callback ) {
-               return call_user_func( $callback, $key );
-       } );
+       return array_filter( $arr, $callback, ARRAY_FILTER_USE_KEY );
 }
 
 /**
@@ -874,20 +866,13 @@ function wfParseUrl( $url ) {
 function wfExpandIRI( $url ) {
        return preg_replace_callback(
                '/((?:%[89A-F][0-9A-F])+)/i',
-               'wfExpandIRI_callback',
+               function ( array $matches ) {
+                       return urldecode( $matches[1] );
+               },
                wfExpandUrl( $url )
        );
 }
 
-/**
- * Private callback for wfExpandIRI
- * @param array $matches
- * @return string
- */
-function wfExpandIRI_callback( $matches ) {
-       return urldecode( $matches[1] );
-}
-
 /**
  * Make URL indexes, appropriate for the el_index field of externallinks.
  *
index a756d50..7a4c2df 100644 (file)
@@ -27,6 +27,7 @@ use Wikimedia\Rdbms\LBFactory;
 use LinkCache;
 use Wikimedia\Rdbms\LoadBalancer;
 use MediaHandlerFactory;
+use MediaWiki\Config\ConfigRepository;
 use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\Linker\LinkRendererFactory;
 use MediaWiki\Services\SalvageableService;
@@ -855,6 +856,13 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'OldRevisionImporter' );
        }
 
+       /**
+        * @return ConfigRepository
+        */
+       public function getConfigRepository() {
+               return $this->getService( 'ConfigRepository' );
+       }
+
        ///////////////////////////////////////////////////////////////////////////
        // NOTE: When adding a service getter here, don't forget to add a test
        // case for it in MediaWikiServicesTest::provideGetters() and in
index ff8deee..df2451c 100644 (file)
@@ -81,7 +81,7 @@ class PageProps {
         * Create a PageProps object
         */
        private function __construct() {
-               $this->cache = new ProcessCacheLRU( self::CACHE_SIZE );
+               $this->cache = new MapCacheLRU( self::CACHE_SIZE );
        }
 
        /**
@@ -89,8 +89,8 @@ class PageProps {
         * @param int $size
         */
        public function ensureCacheSize( $size ) {
-               if ( $this->cache->getSize() < $size ) {
-                       $this->cache->resize( $size );
+               if ( $this->cache->getMaxSize() < $size ) {
+                       $this->cache->setMaxSize( $size );
                }
        }
 
@@ -267,11 +267,11 @@ class PageProps {
         * @return string|bool property value array or false if not found
         */
        private function getCachedProperty( $pageID, $propertyName ) {
-               if ( $this->cache->has( $pageID, $propertyName, self::CACHE_TTL ) ) {
-                       return $this->cache->get( $pageID, $propertyName );
+               if ( $this->cache->hasField( $pageID, $propertyName, self::CACHE_TTL ) ) {
+                       return $this->cache->getField( $pageID, $propertyName );
                }
-               if ( $this->cache->has( 0, $pageID, self::CACHE_TTL ) ) {
-                       $pageProperties = $this->cache->get( 0, $pageID );
+               if ( $this->cache->hasField( 0, $pageID, self::CACHE_TTL ) ) {
+                       $pageProperties = $this->cache->getField( 0, $pageID );
                        if ( isset( $pageProperties[$propertyName] ) ) {
                                return $pageProperties[$propertyName];
                        }
@@ -286,8 +286,8 @@ class PageProps {
         * @return string|bool property value array or false if not found
         */
        private function getCachedProperties( $pageID ) {
-               if ( $this->cache->has( 0, $pageID, self::CACHE_TTL ) ) {
-                       return $this->cache->get( 0, $pageID );
+               if ( $this->cache->hasField( 0, $pageID, self::CACHE_TTL ) ) {
+                       return $this->cache->getField( 0, $pageID );
                }
                return false;
        }
@@ -300,7 +300,7 @@ class PageProps {
         * @param mixed $propertyValue value of property
         */
        private function cacheProperty( $pageID, $propertyName, $propertyValue ) {
-               $this->cache->set( $pageID, $propertyName, $propertyValue );
+               $this->cache->setField( $pageID, $propertyName, $propertyValue );
        }
 
        /**
@@ -311,6 +311,6 @@ class PageProps {
         */
        private function cacheProperties( $pageID, $pageProperties ) {
                $this->cache->clear( $pageID );
-               $this->cache->set( 0, $pageID, $pageProperties );
+               $this->cache->setField( 0, $pageID, $pageProperties );
        }
 }
index c458af0..a8a312c 100644 (file)
@@ -300,30 +300,6 @@ class Preferences {
                throw new Exception( __METHOD__ . '() is deprecated and does nothing' );
        }
 
-       /**
-        * Handle the form submission if everything validated properly
-        *
-        * @deprecated since 1.31, use PreferencesFactory
-        *
-        * @param array $formData
-        * @param HTMLForm $form
-        * @return bool|Status|string
-        */
-       public static function tryFormSubmit( $formData, $form ) {
-               $preferencesFactory = self::getDefaultPreferencesFactory();
-               return $preferencesFactory->legacySaveFormData( $formData, $form );
-       }
-
-       /**
-        * @param array $formData
-        * @param HTMLForm $form
-        * @return Status
-        */
-       public static function tryUISubmit( $formData, $form ) {
-               $preferencesFactory = self::getDefaultPreferencesFactory();
-               return $preferencesFactory->legacySubmitForm( $formData, $form );
-       }
-
        /**
         * Get a list of all time zones
         * @param Language $language Language used for the localized names
index 5127158..63a4d9c 100644 (file)
@@ -58,54 +58,14 @@ abstract class PrefixSearch {
                        return []; // Return empty result
                }
 
-               $hasNamespace = $this->extractNamespace( $search );
-               if ( $hasNamespace ) {
-                       list( $namespace, $search ) = $hasNamespace;
-                       $namespaces = [ $namespace ];
-               } else {
-                       $namespaces = $this->validateNamespaces( $namespaces );
-                       Hooks::run( 'PrefixSearchExtractNamespace', [ &$namespaces, &$search ] );
+               $hasNamespace = SearchEngine::parseNamespacePrefixes( $search, false, true );
+               if ( $hasNamespace !== false ) {
+                       list( $search, $namespaces ) = $hasNamespace;
                }
 
                return $this->searchBackend( $namespaces, $search, $limit, $offset );
        }
 
-       /**
-        * Figure out if given input contains an explicit namespace.
-        *
-        * @param string $input
-        * @return false|array Array of namespace and remaining text, or false if no namespace given.
-        */
-       protected function extractNamespace( $input ) {
-               if ( strpos( $input, ':' ) === false ) {
-                       return false;
-               }
-
-               // Namespace prefix only
-               $title = Title::newFromText( $input . 'Dummy' );
-               if (
-                       $title &&
-                       $title->getText() === 'Dummy' &&
-                       !$title->inNamespace( NS_MAIN ) &&
-                       !$title->isExternal()
-               ) {
-                       return [ $title->getNamespace(), '' ];
-               }
-
-               // Namespace prefix with additional input
-               $title = Title::newFromText( $input );
-               if (
-                       $title &&
-                       !$title->inNamespace( NS_MAIN ) &&
-                       !$title->isExternal()
-               ) {
-                       // getText provides correct capitalization
-                       return [ $title->getNamespace(), $title->getText() ];
-               }
-
-               return false;
-       }
-
        /**
         * Do a prefix search for all possible variants of the prefix
         * @param string $search
index 6da537d..7d49080 100644 (file)
@@ -38,6 +38,7 @@
  */
 
 use MediaWiki\Auth\AuthManager;
+use MediaWiki\Config\ConfigRepository;
 use MediaWiki\Interwiki\ClassicInterwikiLookup;
 use MediaWiki\Linker\LinkRendererFactory;
 use MediaWiki\Logger\LoggerFactory;
@@ -104,6 +105,10 @@ return [
                return $factory;
        },
 
+       'ConfigRepository' => function ( MediaWikiServices $services ) {
+               return new ConfigRepository( $services->getConfigFactory() );
+       },
+
        'MainConfig' => function ( MediaWikiServices $services ) {
                // Use the 'main' config from the ConfigFactory service.
                return $services->getConfigFactory()->makeConfig( 'main' );
index bd64a41..20637fc 100644 (file)
@@ -788,7 +788,10 @@ class HistoryPager extends ReverseChronologicalPager {
                $attribs = [ 'data-mw-revid' => $rev->getId() ];
 
                Hooks::run( 'PageHistoryLineEnding', [ $this, &$row, &$s, &$classes, &$attribs ] );
-               $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] );
+               $attribs = array_filter( $attribs,
+                       [ Sanitizer::class, 'isReservedDataAttribute' ],
+                       ARRAY_FILTER_USE_KEY
+               );
 
                if ( $classes ) {
                        $attribs['class'] = implode( ' ', $classes );
index 610ecf5..b398ecd 100644 (file)
@@ -486,7 +486,7 @@ class ApiMain extends ApiBase {
         * @return ApiFormatBase
         */
        public function createPrinterByName( $format ) {
-               $printer = $this->mModuleMgr->getModule( $format, 'format' );
+               $printer = $this->mModuleMgr->getModule( $format, 'format', /* $ignoreCache */ true );
                if ( $printer === null ) {
                        $this->dieWithError(
                                [ 'apierror-unknownformat', wfEscapeWikiText( $format ) ], 'unknown_format'
index 3d87a5f..f5461e0 100644 (file)
@@ -66,9 +66,19 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                $search->setFeatureData( 'rewrite', (bool)$params['enablerewrites'] );
                $search->setFeatureData( 'interwiki', (bool)$interwiki );
 
-               $query = $search->transformSearchTerm( $query );
-               $query = $search->replacePrefixes( $query );
+               $nquery = $search->transformSearchTerm( $query );
+               if ( $nquery !== $query ) {
+                       $query = $nquery;
+                       wfDeprecated( 'SearchEngine::transformSearchTerm() (overridden by ' .
+                               get_class( $search ) . ')', '1.32' );
+               }
 
+               $nquery = $search->replacePrefixes( $query );
+               if ( $nquery !== $query ) {
+                       $query = $nquery;
+                       wfDeprecated( 'SearchEngine::replacePrefixes() (overridden by ' .
+                                                 get_class( $search ) . ')', '1.32' );
+               }
                // Perform the actual search
                if ( $what == 'text' ) {
                        $matches = $search->searchText( $query );
index 4df71ba..05f7557 100644 (file)
@@ -34,7 +34,8 @@
                        "AttemptToCallNil",
                        "Movses",
                        "Stjn",
-                       "Edward Chernenko"
+                       "Edward Chernenko",
+                       "Vlad5250"
                ]
        },
        "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> MediaWiki API — зрелый и стабильный интерфейс, активно поддерживаемый и улучшаемый. Мы стараемся избегать ломающих изменений, однако изредка они могут быть необходимы. Подпишитесь на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ почтовую рассылку mediawiki-api-announce], чтобы быть в курсе обновлений.\n\n<strong>Ошибочные запросы:</strong> Если API получает запрос с ошибкой, вернётся заголовок HTTP с ключом «MediaWiki-API-Error», после чего значение заголовка и код ошибки будут отправлены обратно и установлены в то же значение. Более подробную информацию см. [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Ошибки и предупреждения]].\n\n<p class=\"mw-apisandbox-link\"><strong>Тестирование:</strong> для удобства тестирования API-запросов, см. [[Special:ApiSandbox]].</p>",
        "apihelp-query+filearchive-example-simple": "Список всех удалённых файлов.",
        "apihelp-query+filerepoinfo-summary": "Возвращает мета-информацию о файловых репозиториях, настроенных в вики.",
        "apihelp-query+filerepoinfo-param-prop": "Какие свойства хранилища получить (доступность свойств может отличаться в разных вики).",
+       "apihelp-query+filerepoinfo-paramvalue-prop-rootUrl": "Корневой URL для изображений.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-url": "URL путь публичной зоны.",
        "apihelp-query+filerepoinfo-example-simple": "Получить информацию о файловых репозиториях.",
        "apihelp-query+fileusage-summary": "Поиск всех страниц, использующих данный файл.",
        "apihelp-query+fileusage-param-prop": "Какие свойства получить:",
index ca59ec7..d3fd5fc 100644 (file)
@@ -886,8 +886,11 @@ class AuthManager implements LoggerAwareInterface {
         * returned success.
         *
         * @param AuthenticationRequest $req
+        * @param bool $isAddition Set true if this represents an addition of
+        *  credentials rather than a change. The main difference is that additions
+        *  should not invalidate BotPasswords. If you're not sure, leave it false.
         */
-       public function changeAuthenticationData( AuthenticationRequest $req ) {
+       public function changeAuthenticationData( AuthenticationRequest $req, $isAddition = false ) {
                $this->logger->info( 'Changing authentication data for {user} class {what}', [
                        'user' => is_string( $req->username ) ? $req->username : '<no name>',
                        'what' => get_class( $req ),
@@ -897,7 +900,9 @@ class AuthManager implements LoggerAwareInterface {
 
                // When the main account's authentication data is changed, invalidate
                // all BotPasswords too.
-               \BotPassword::invalidateAllPasswordsForUser( $req->username );
+               if ( !$isAddition ) {
+                       \BotPassword::invalidateAllPasswordsForUser( $req->username );
+               }
        }
 
        /**@}*/
index 7f121cd..c2d730c 100644 (file)
@@ -119,7 +119,9 @@ class ConfirmLinkSecondaryAuthenticationProvider extends AbstractSecondaryAuthen
                                $status = $this->manager->allowsAuthenticationDataChange( $req );
                                $statuses[] = [ $req, $status ];
                                if ( $status->isGood() ) {
-                                       $this->manager->changeAuthenticationData( $req );
+                                       // We're not changing credentials, just adding a new link
+                                       // to an already-known user.
+                                       $this->manager->changeAuthenticationData( $req, /* $isAddition */ true );
                                } else {
                                        $anyFailed = true;
                                }
index cdfbf56..28b30d8 100644 (file)
@@ -472,7 +472,10 @@ class EnhancedChangesList extends ChangesList {
                        // skip entry if hook aborted it
                        return [];
                }
-               $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] );
+               $attribs = array_filter( $attribs,
+                       [ Sanitizer::class, 'isReservedDataAttribute' ],
+                       ARRAY_FILTER_USE_KEY
+               );
 
                $lineParams['recentChangesFlagsRaw'] = [];
                if ( isset( $data['recentChangesFlags'] ) ) {
@@ -704,9 +707,9 @@ class EnhancedChangesList extends ChangesList {
                }
                $attribs = $data['attribs'];
                unset( $data['attribs'] );
-               $attribs = wfArrayFilterByKey( $attribs, function ( $key ) {
+               $attribs = array_filter( $attribs, function ( $key ) {
                        return $key === 'class' || Sanitizer::isReservedDataAttribute( $key );
-               } );
+               }, ARRAY_FILTER_USE_KEY );
 
                $prefix = '';
                if ( is_callable( $this->changeLinePrefixer ) ) {
diff --git a/includes/config/ConfigRepository.php b/includes/config/ConfigRepository.php
new file mode 100644 (file)
index 0000000..c87a344
--- /dev/null
@@ -0,0 +1,224 @@
+<?php
+/**
+ * Copyright 2016
+ *
+ * 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
+ */
+
+namespace MediaWiki\Config;
+
+use MediaWiki\Services\SalvageableService;
+use Wikimedia\Assert\Assert;
+
+/**
+ * Object which holds currently registered configuration options.
+ *
+ * @since 1.32
+ */
+class ConfigRepository implements SalvageableService {
+       /** @var \ConfigFactory */
+       private $configFactory;
+
+       /** @var array */
+       private $configItems = [
+               'private' => [],
+               'public' => [],
+       ];
+
+       /**
+        * @param \ConfigFactory $configFactory
+        */
+       public function __construct( \ConfigFactory $configFactory ) {
+               $this->configFactory = $configFactory;
+       }
+
+       /**
+        * Returns true, if this repository contains a configuration with a specific name.
+        *
+        * @param string $name The name of the config to check the existence of
+        * @param bool $alsoPrivate If set to true, will check the private config options, too
+        * @return bool
+        */
+       public function has( $name, $alsoPrivate = false ) {
+               return isset( $this->configItems['public'][$name] ) ||
+                       ( $alsoPrivate && isset( $this->configItems['private'][$name] ) );
+       }
+
+       /**
+        * Returns the ConfigItem with the given name, if there's one. Throws a ConfigException
+        * otherwise.
+        *
+        * @param string $name The name of the configuration option to get
+        * @return array
+        * @throws \ConfigException
+        */
+       public function get( $name ) {
+               if ( !$this->has( $name, true ) ) {
+                       throw new \ConfigException( 'The configuration option ' . $name . ' does not exist.' );
+               }
+               if ( isset( $this->configItems['public'][$name] ) ) {
+                       return $this->configItems['public'][$name];
+               }
+               return $this->configItems['private'][$name];
+       }
+
+       /**
+        * Returns an array of all configuration items saved in this ConfigRepository. This includes
+        * all configuration options, including the ones marked as private and public.
+        *
+        * Note: This function does not do any permission checks or something similar. You should not
+        * use this function, if the output will be available to the public audience! Use
+        * ConfigRepository::getPublic() instead.
+        *
+        * @return array
+        */
+       public function getAll() {
+               return array_merge( $this->configItems['private'], $this->configItems['public'] );
+       }
+
+       /**
+        * Returns an array of all public configuration options saved in this ConfigRepository.
+        *
+        * @return array
+        */
+       public function getPublic() {
+               return $this->configItems['public'];
+       }
+
+       /**
+        * Returns the current value of the configuration option. If no ConfigRegistry was provided
+        * when the config was added to the repository, the default value will be returned.
+        *
+        * @param string $name The name of the configuration option to get the value of
+        * @return mixed
+        * @throws \ConfigException
+        */
+       public function getValueOf( $name ) {
+               $config = $this->get( $name );
+               if ( !isset( $config['configregistry'] ) ) {
+                       return $config['value'];
+               }
+
+               return $this->configFactory->makeConfig( $config['configregistry'] )->get( $name );
+       }
+
+       /**
+        * Returns the description of the given config option, This can be either a localized
+        * description, if one such, or the (maybe english only) description provided in the
+        * definition of the configuration. If both is not provided an empty string is returned.
+        *
+        * @param string $name The name of the configuration option to get the description of
+        * @return string HTML-escaped string
+        */
+       public function getDescriptionOf( $name ) {
+               $config = $this->get( $name );
+               if ( isset( $config['descriptionmsg'] ) ) {
+                       return wfMessage( $config['descriptionmsg'] )->escaped();
+               }
+               if ( isset( $config['description'] ) ) {
+                       return htmlspecialchars( $config['description'] );
+               }
+               return '';
+       }
+
+       /**
+        * Adds the definition of a configuration to this repository.
+        *
+        * @param string $name the name of the config
+        * @param array $config Options of this config. Values are:
+        *  - value: The default value of this configuration, required
+        *  - providedby: The name of the provider of this config (an extension, core, ...), required
+        *  - configregistry: The name of the config to retrieve the value with, required
+        *  - public: whether this option is public or not, if not set, the option is considered as
+        *    "private", optional
+        *  - description: the not localized description of this config option, optional
+        *  - descriptionmsg: The message key of the localized description of this configuration
+        *    option, optional
+        * @throws \ConfigException
+        */
+       public function add( $name, array $config ) {
+               if ( $this->has( $name ) ) {
+                       throw new \ConfigException( 'A configuration with the name ' . $name .
+                               'does already exist. It is provided by: ' .
+                               $this->get( $name )['providedby'] );
+               }
+               if ( isset( $config['public'] ) && $config['public'] ) {
+                       $this->configItems['public'][$name] = $config;
+               } else {
+                       $this->configItems['private'][$name] = $config;
+               }
+       }
+
+       /**
+        * Returns true, if there're no elements in this instance, otherwise false.
+        *
+        * @param bool $includePrivate Whether configuration options, that are marked as private
+        * should be included in this check.
+        * @return bool
+        */
+       public function isEmpty( $includePrivate = false ) {
+               if ( $includePrivate ) {
+                       return empty( $this->configItems['private'] ) &&
+                               empty( $this->configItems[ 'public'] );
+               }
+               return empty( $this->configItems['public'] );
+       }
+
+       /**
+        * Re-uses existing Cache objects from $other. Cache objects are only re-used if the
+        * registered factory function for both is the same.
+        *
+        * @see SalvageableService::salvage()
+        *
+        * @param SalvageableService $other The object to salvage state from. $other must have the
+        * exact same type as $this.
+        */
+       public function salvage( SalvageableService $other ) {
+               Assert::parameterType( self::class, $other, '$other' );
+
+               /** @var ConfigRepository $other */
+               $otherCurrentObj = $other->current();
+               foreach ( $other->configItems['public'] as $name => $otherConfig ) {
+                       if ( isset( $this->configItems['public'][$name] ) ) {
+                               continue;
+                       }
+
+                       $this->add( $name, $otherConfig );
+
+                       // recover the pointer of the other config repository
+                       if ( $otherCurrentObj === $otherConfig ) {
+                               end( $this->configItems['public'] );
+                       }
+               }
+               foreach ( $other->configItems['private'] as $name => $otherConfig ) {
+                       if ( isset( $this->configItems['private'][$name] ) ) {
+                               continue;
+                       }
+
+                       $this->add( $name, $otherConfig );
+
+                       // recover the pointer of the other config repository
+                       if ( $otherCurrentObj === $otherConfig ) {
+                               end( $this->configItems['private'] );
+                       }
+               }
+
+               // disable $other
+               $other->configItems = [];
+       }
+}
index 9f6257c..f370e43 100644 (file)
@@ -101,7 +101,8 @@ class LinksDeletionUpdate extends DataUpdate implements EnqueueableDataUpdate {
                if ( $title->getNamespace() === NS_CATEGORY ) {
                        // T166757: do the update after the main job DB commit
                        DeferredUpdates::addCallableUpdate( function () use ( $title ) {
-                               $this->refreshCategoryIfEmpty( $title );
+                               $cat = Category::newFromName( $title->getDBkey() );
+                               $cat->refreshCountsIfEmpty();
                        } );
                }
 
@@ -187,35 +188,6 @@ class LinksDeletionUpdate extends DataUpdate implements EnqueueableDataUpdate {
                ScopedCallback::consume( $scopedLock );
        }
 
-       /**
-        * @param Title $title
-        */
-       private function refreshCategoryIfEmpty( Title $title ) {
-               $dbw = $this->getDB();
-
-               $row = $dbw->selectRow(
-                       'category',
-                       [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ],
-                       [ 'cat_title' => $title->getDBkey(), 'cat_pages <= 100' ],
-                       __METHOD__
-               );
-
-               if ( !$row ) {
-                       return; // nothing to delete
-               }
-
-               $cat = Category::newFromRow( $row, $title );
-               $hasLink = $dbw->selectField(
-                       'categorylinks',
-                       '1',
-                       [ 'cl_to' => $title->getDBkey() ],
-                       __METHOD__
-               );
-               if ( !$hasLink ) {
-                       $cat->refreshCounts(); // delete the category table entry
-               }
-       }
-
        private function batchDeleteByPK( $table, array $conds, array $pk, $bSize ) {
                $services = MediaWikiServices::getInstance();
                $lbFactory = $services->getDBLoadBalancerFactory();
index dbb5421..b445487 100644 (file)
@@ -45,7 +45,7 @@ class FileBackendDBRepoWrapper extends FileBackend {
        protected $repoName;
        /** @var Closure */
        protected $dbHandleFunc;
-       /** @var ProcessCacheLRU */
+       /** @var MapCacheLRU */
        protected $resolvedPathCache;
        /** @var DBConnRef[] */
        protected $dbs;
@@ -59,7 +59,7 @@ class FileBackendDBRepoWrapper extends FileBackend {
                $this->backend = $config['backend'];
                $this->repoName = $config['repoName'];
                $this->dbHandleFunc = $config['dbHandleFactory'];
-               $this->resolvedPathCache = new ProcessCacheLRU( 100 );
+               $this->resolvedPathCache = new MapCacheLRU( 100 );
        }
 
        /**
@@ -102,8 +102,8 @@ class FileBackendDBRepoWrapper extends FileBackend {
                // @TODO: batching
                $resolved = [];
                foreach ( $paths as $i => $path ) {
-                       if ( !$latest && $this->resolvedPathCache->has( $path, 'target', 10 ) ) {
-                               $resolved[$i] = $this->resolvedPathCache->get( $path, 'target' );
+                       if ( !$latest && $this->resolvedPathCache->hasField( $path, 'target', 10 ) ) {
+                               $resolved[$i] = $this->resolvedPathCache->getField( $path, 'target' );
                                continue;
                        }
 
@@ -127,12 +127,12 @@ class FileBackendDBRepoWrapper extends FileBackend {
                                        continue;
                                }
                                $resolved[$i] = $this->getPathForSHA1( $sha1 );
-                               $this->resolvedPathCache->set( $path, 'target', $resolved[$i] );
+                               $this->resolvedPathCache->setField( $path, 'target', $resolved[$i] );
                        } elseif ( $container === "{$this->repoName}-deleted" ) {
                                $name = basename( $path ); // <hash>.<ext>
                                $sha1 = substr( $name, 0, strpos( $name, '.' ) ); // ignore extension
                                $resolved[$i] = $this->getPathForSHA1( $sha1 );
-                               $this->resolvedPathCache->set( $path, 'target', $resolved[$i] );
+                               $this->resolvedPathCache->setField( $path, 'target', $resolved[$i] );
                        } else {
                                $resolved[$i] = $path;
                        }
index fa4567e..f3fed57 100644 (file)
@@ -98,7 +98,7 @@ class RepoGroup {
        function __construct( $localInfo, $foreignInfo ) {
                $this->localInfo = $localInfo;
                $this->foreignInfo = $foreignInfo;
-               $this->cache = new ProcessCacheLRU( self::MAX_CACHE_SIZE );
+               $this->cache = new MapCacheLRU( self::MAX_CACHE_SIZE );
        }
 
        /**
@@ -125,10 +125,12 @@ class RepoGroup {
                if ( isset( $options['bypassCache'] ) ) {
                        $options['latest'] = $options['bypassCache']; // b/c
                }
+               $options += [ 'time' => false ];
 
                if ( !$this->reposInitialised ) {
                        $this->initialiseRepos();
                }
+
                $title = File::normalizeTitle( $title );
                if ( !$title ) {
                        return false;
@@ -136,17 +138,16 @@ class RepoGroup {
 
                # Check the cache
                $dbkey = $title->getDBkey();
+               $timeKey = is_string( $options['time'] ) ? $options['time'] : '';
                if ( empty( $options['ignoreRedirect'] )
                        && empty( $options['private'] )
                        && empty( $options['latest'] )
                ) {
-                       $time = $options['time'] ?? '';
-                       if ( $this->cache->has( $dbkey, $time, 60 ) ) {
-                               return $this->cache->get( $dbkey, $time );
+                       if ( $this->cache->hasField( $dbkey, $timeKey, 60 ) ) {
+                               return $this->cache->getField( $dbkey, $timeKey );
                        }
                        $useCache = true;
                } else {
-                       $time = false;
                        $useCache = false;
                }
 
@@ -166,7 +167,7 @@ class RepoGroup {
                $image = $image ?: false; // type sanity
                # Cache file existence or non-existence
                if ( $useCache && ( !$image || $image->isCacheable() ) ) {
-                       $this->cache->set( $dbkey, $time, $image );
+                       $this->cache->setField( $dbkey, $timeKey, $image );
                }
 
                return $image;
index 602ddee..0ad41d4 100644 (file)
@@ -41,6 +41,11 @@ class HTMLTitleTextField extends HTMLTextField {
                        return parent::validate( $value, $alldata );
                }
 
+               // Default value (from getDefault()) is null, which breaks Title::newFromTextThrow() below
+               if ( $value === null ) {
+                       $value = '';
+               }
+
                if ( !$this->mParams['required'] && $value === '' ) {
                        // If this field is not required and the value is empty, that's okay, skip validation
                        return parent::validate( $value, $alldata );
index e193970..d672314 100644 (file)
@@ -34,6 +34,11 @@ class HTMLUserTextField extends HTMLTextField {
        }
 
        public function validate( $value, $alldata ) {
+               // Default value (from getDefault()) is null, User::newFromName() expects a string
+               if ( $value === null ) {
+                       $value = '';
+               }
+
                // check, if a user exists with the given username
                $user = User::newFromName( $value, false );
                $rangeError = null;
@@ -43,7 +48,7 @@ class HTMLUserTextField extends HTMLTextField {
                } elseif (
                        // check, if the user exists, if requested
                        ( $this->mParams['exists'] && $user->getId() === 0 ) &&
-                       // check, if the username is a valid IP address, otherweise save the error message
+                       // check, if the username is a valid IP address, otherwise save the error message
                        !( $this->mParams['ipallowed'] && IP::isValid( $value ) ) &&
                        // check, if the username is a valid IP range, otherwise save the error message
                        !( $this->mParams['iprange'] && ( $rangeError = $this->isValidIPRange( $value ) ) === true )
index 856b44b..dcccd22 100644 (file)
        "config-sqlite-dir-help": "يخزن SQLite جميع البيانات في ملف واحد. \n\nيجب أن يكون الدليل الذي توفره قابلا للكتابة بواسطة خادم الويب أثناء التثبيت. \n\nيجب أن يكون <strong>غير</strong> متاحا عبر الويب؛ هذا هو سبب عدم وضعه في مكان ملفات PHP الخاصة بك. \n\nسيقوم المثبت بكتابة ملف <code>.htaccess</code> معه، ولكن إذا فشل ذلك، يمكن لشخص ما الوصول إلى قاعدة بياناتك الأولية، \nيتضمن ذلك بيانات المستخدم الأولية (عناوين البريد الإلكتروني وكلمات المرور المجزأة) بالإضافة إلى المراجعات المحذوفة والبيانات المحظورة الأخرى على الويكي. \n\nفكر في وضع قاعدة البيانات في مكان آخر تماما، على سبيل المثال في <code>/var/lib/mediawiki/yourwiki</code.",
        "config-oracle-def-ts": "جدولية افتراضية:",
        "config-oracle-temp-ts": "جدولية مؤقتة:",
-       "config-type-mysql": "MySQL (أو متوافق)",
+       "config-type-mysql": "MariaDB أو MySQL أو متوافق",
        "config-type-postgres": "بوستجر إس كيو إل",
        "config-type-sqlite": "إس كيو لايت",
        "config-type-oracle": "أوراكل",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] هو نظام قاعدة بيانات خفيف مدعوم بشكل جيد. ([https://secure.php.net/manual/en/pdo.installation.php كيفية ترجمة PHP باستخدام دعم SQLite]، يستخدم PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] هي قاعدة بيانات مؤسسة تجارية. ([https://secure.php.net/manual/en/oci8.installation.php كيفية تجميع PHP مع دعم OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] هي قاعدة بيانات مؤسسة تجارية لويندوز. ([https://secure.php.net/manual/en/sqlsrv.installation.php كيفية تجميع PHP مع دعم SQLSRV])",
-       "config-header-mysql": "إعدادات MySQL",
+       "config-header-mysql": "إعدادات MariaDB/MySQL",
        "config-header-postgres": "إعدادات PostgreSQL",
        "config-header-sqlite": "إعدادات SQLite",
        "config-header-oracle": "إعدادات أوراكل",
        "config-db-web-create": "إنشئ حساب إذا لم يكن موجودا بالفعل",
        "config-db-web-no-create-privs": "الحساب الذي حددته لتركيب ليس لديه امتيازات كافية لإنشاء حساب.\nالحساب الذي حددته هنا موجود بالفعل.",
        "config-mysql-engine": "محرك التخزين",
-       "config-mysql-innodb": "إنو دي بي",
+       "config-mysql-innodb": "InnoDB (مستحسن)",
        "config-mysql-myisam": "ماي إسام",
        "config-mysql-myisam-dep": "<strong>تحذير:</strong> لقد اخترت MyISAM كمحرك تخزين لـMySQL، والذي لا يُنصَح باستخدامه مع ميدياويكي; لأنه:\n* بالكاد يدعم التزامن بسبب قفل الجدول \n* أكثر عرضة للفساد من المحركات الأخرى\n* لا يقوم الكود الأساسي لميدياويكي بمعالجة MyISAM دائما كما يجب\n\nإذا كان تثبيت MySQL يدعم InnoDB، فمن المستحسن جدا أن تختاره بدلا منه، \nإذا كان تثبيت MySQL لا يدعم InnoDB، فربما حان الوقت للترقية.",
        "config-mysql-only-myisam-dep": "<strong>تحذير:</strong> MyISAMهو محرك التخزين الوحيد المتاح لـMySQL على هذا الجهاز، ولا يُنصَح باستخدامه مع ميدياويكي; لأنه:\n* بالكاد يدعم التزامن بسبب قفل الجدول \n* أكثر عرضة للفساد من المحركات الأخرى\n* لا يقوم الكود الأساسي لميدياويكي بمعالجة MyISAM دائما كما يجب\n\nتثبيت MySQL لا يدعم InnoDB; ربما حان الوقت للترقية.",
index 9b47a33..46d0aed 100644 (file)
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] — невялікая сыстэма базы зьвестак, якая мае вельмі добрую падтрымку. ([https://secure.php.net/manual/en/pdo.installation.php Як кампіляваць PHP з падтрымкай SQLite], выкарыстоўвае PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] зьяўляецца камэрцыйнай прафэсійнай базай зьвестак. ([https://secure.php.net/manual/en/oci8.installation.php Як скампіляваць PHP з падтрымкай OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] — камэрцыйная база зьвестак для Windows. ([https://secure.php.net/manual/en/sqlsrv.installation.php Як скампіляваць PHP з падтрымкай SQLSRV])",
-       "config-header-mysql": "Налады MySQL",
+       "config-header-mysql": "Налады MariaDB/MySQL",
        "config-header-postgres": "Налады PostgreSQL",
        "config-header-sqlite": "Налады SQLite",
        "config-header-oracle": "Налады Oracle",
index ebee20b..a98e013 100644 (file)
@@ -65,6 +65,7 @@
        "config-sqlite-dir": "এসকিউলাইট ডেটা ডিরেক্টরি:",
        "config-oracle-def-ts": "পূর্বনির্ধারিত টেবিলস্পেস",
        "config-oracle-temp-ts": "সাময়কি টেবিলস্পেস:",
+       "config-type-mysql": "MariaDB, MySQL, বা উপযুক্তগুলি",
        "config-type-mssql": "মাইক্রোসফট এসকিউএল সার্ভার",
        "config-dbsupport-postgres": "* MySQL-এর বিকল্প হিসেবে [{{int:version-db-postgres-url}} PostgreSQL] হচ্ছে একটি জনপ্রিয় ওপেন সোর্স ডাটাবেস ব্যবস্থা। ([https://secure.php.net/manual/en/pgsql.installation.php PostgreSQL সমর্থনসহ কিভাবে PHP সঙ্কলন করবেন])",
        "config-header-mysql": "MariaDB/MySQL সেটিং",
index e619978..b4658b6 100644 (file)
        "config-sqlite-dir-help": "SQLite recolle todos os datos nun ficheiro único.\n\nO servidor web debe ter permisos sobre o directorio para que poida escribir nel durante a instalación.\n\nAdemais, o servidor <strong>non</strong> debe ser accesible a través da web, motivo polo que non está no mesmo lugar ca os ficheiros PHP.\n\nAsemade, o programa de instalación escribirá un ficheiro <code>.htaccess</code>, pero se erra alguén pode obter acceso á súa base de datos.\nIsto inclúe datos de usuario (enderezos de correo electrónico, contrasinais codificados), así como revisións borradas e outros datos restrinxidos no wiki.\n\nConsidere poñer a base de datos nun só lugar, por exemplo en <code>/var/lib/mediawiki/oseuwiki</code>.",
        "config-oracle-def-ts": "Espazo de táboas por defecto:",
        "config-oracle-temp-ts": "Espazo de táboas temporal:",
-       "config-type-mysql": "MySQL (ou compatible)",
+       "config-type-mysql": "MariaDB, MySQL ou compatíbel",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
        "config-type-oracle": "Oracle",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] é un sistema de base de datos lixeiro moi ben soportado. ([http://www.php.net/manual/en/pdo.installation.php Como compilar o PHP con soporte SQLite], emprega PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] é un sistema comercial de xestión de base de datos de nivel empresarial. ([http://www.php.net/manual/en/oci8.installation.php Como compilar o PHP con compatibilidade OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] é un sistema comercial de xestión de base de datos de nivel empresarial para Windows. ([https://secure.php.net/manual/en/sqlsrv.installation.php Como compilar o PHP con compatibilidade SQLSRV])",
-       "config-header-mysql": "Configuración do MySQL",
+       "config-header-mysql": "Configuración MariaDB/MySQL",
        "config-header-postgres": "Configuración do PostgreSQL",
        "config-header-sqlite": "Configuración do SQLite",
        "config-header-oracle": "Configuración do Oracle",
        "config-db-web-create": "Crear a conta se aínda non existe",
        "config-db-web-no-create-privs": "A conta que especificou para a instalación non ten os privilexios suficientes para crear unha conta.\nA conta que se especifique aquí xa debe existir.",
        "config-mysql-engine": "Motor de almacenamento:",
-       "config-mysql-innodb": "InnoDB",
+       "config-mysql-innodb": "InnoDB (recomendado)",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-myisam-dep": "<strong>Atención:</strong> Seleccionou MyISAM como o motor de almacenamento para MySQL, unha combinación non recomendada para MediaWiki, porque:\n* practicamente non soporta os accesos simultáneos debido ao bloqueo de táboas\n* é máis propenso a corromperse ca outros motores\n* o código base de MediaWiki non sempre manexa o MyISAM como debera\n\nSe a súa instalación MySQL soporta InnoDB, recoméndase elixilo no canto de MyISAM.\nSe a súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
        "config-mysql-only-myisam-dep": "<strong>Atención:</strong> MyISAM é o único motor de almacenamento para MySQL nesta máquina, unha combinación non recomendada para MediaWiki, porque:\n* practicamente non soporta os accesos simultáneos debido ao bloqueo de táboas\n* é máis propenso a corromperse ca outros motores\n* o código base de MediaWiki non sempre manexa o MyISAM como debera\n\nA súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
        "config-nofile": "Non se puido atopar o ficheiro \"$1\". Se cadra, foi borrado.",
        "config-extension-link": "Sabía que o seu wiki soporta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensións]?\n\nPode explorar as [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensións por categoría] ou a [https://www.mediawiki.org/wiki/Extension_Matrix matriz de extensións] para ollar a lista completa de extensións.",
        "config-skins-screenshots": "$1 (capturas de pantalla: $2)",
+       "config-extensions-requires": "$1 (require $2)",
        "config-screenshot": "captura de pantalla",
        "mainpagetext": "<strong>Instalouse MediaWiki.</strong>",
        "mainpagedocfooter": "Consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents guía de usuario] para obter máis información sobre como usar o software wiki.\n\n== Primeiros pasos ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista das opcións de configuración]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas máis frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo dos lanzamentos de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localice MediaWiki á súa lingua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprenda como combater a publicidade na súa wiki]"
index 671127e..a9a51ef 100644 (file)
        "config-sqlite-dir-help": "SQLite lagrer alle data i en enkelt fil.\n\nMappen du oppgir må være skrivbar for nettjeneren under installasjonen.\n\nDen bør '''ikke''' være tilgjengelig fra nettet, dette er grunnen til at vi ikke legger det der PHP-filene dine er.\n\nInstallasjonsprogrammet vil skrive en <code>.htaccess</code>-fil sammen med det, men om det mislykkes kan noen få tilgang til din råe database. Dette inkluderer rå brukerdata (e-postadresser, hashede passord) samt slettede revisjoner og andre begrensede data på wikien.\n\nVurder å plassere databasen et helt annet sted, for eksempel i <code>/var/lib/mediawiki/yourwiki</code>.",
        "config-oracle-def-ts": "Standard tabellrom:",
        "config-oracle-temp-ts": "Midlertidig tabellrom:",
-       "config-type-mysql": "MySQL (eller kompatibelt)",
+       "config-type-mysql": "MariaDB, MySQL eller kompatibel",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
        "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQLServer",
        "config-support-info": "MediaWiki støtter følgende databasesystem:\n\n$1\n\nHvis du ikke ser databasesystemet du prøver å bruke i listen nedenfor, følg instruksjonene det er lenket til over for å aktivere støtte.",
-       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] er den foretrukne databasetypen for MediaWiki og har best støtte.  MediaWiki fungerer også med [{{int:version-db-mariadb-url}} MariaDB] og [{{int:version-db-percona-url}} Percona Server], som begge er MySQL-kompatible. ([https://secure.php.net/manual/en/mysqli.installation.php Hvordan kompilere PHP med MySQL-støtte])",
+       "config-dbsupport-mysql": "* [{{int:version-db-mariadb-url}} MariaDB] er den foretrukne databasetypen for MediaWiki og har best støtte.  MediaWiki fungerer også med [{{int:version-db-mysql-url}} MySQL] og [{{int:version-db-percona-url}} Percona Server], som begge er MariaDB-kompatible. ([https://secure.php.net/manual/en/mysqli.installation.php Hvordan kompilere PHP med MySQL-støtte])",
        "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] er et populært åpen kildekode-databasesystem og et alternativ til MySQL.  ([https://secure.php.net/manual/en/pgsql.installation.php Hvordan kompilere PHP med PostgreSQL-støtte])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] er et lettvekts-databasesystem som har veldig god støtte. ([http://www.php.net/manual/en/pdo.installation.php Hvordan kompilere PHP med SQLite-støtte], bruker PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] er en kommersiell database for bedrifter. ([https://secure.php.net/manual/en/oci8.installation.php Hvordan kompilere PHP med OCI8-støtte])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] er et kommersielt databasesystem under Windows for bedrifter. ([https://secure.php.net/manual/en/sqlsrv.installation.php Hvordan kompilere PHP med SQLSRV-støtte])",
-       "config-header-mysql": "MySQL-innstillinger",
+       "config-header-mysql": "MariadB/MySQL-innstillinger",
        "config-header-postgres": "PostgreSQL-innstillinger",
        "config-header-sqlite": "SQLite-innstillinger",
        "config-header-oracle": "Oracle-innstillinger",
        "config-db-web-create": "Opprett kontoen om den ikke finnes allerede",
        "config-db-web-no-create-privs": "Kontoen du oppga for installasjonen har ikke nok privilegier til å opprette en konto.\nKontoen du oppgir her må finnes allerede.",
        "config-mysql-engine": "Lagringsmotor:",
-       "config-mysql-innodb": "InnoDB",
+       "config-mysql-innodb": "InnoDB (anbefalt)",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-myisam-dep": "'''Advarsel:''' Du har valgt MyISAM som lagringsmotor for MySQL, noe som ikke er anbefalt for bruk med MediaWiki, fordi:\n* den knapt støtter samtidighet pga. tabell-låsing\n* den har større tilbøyelighet for å bli korrupt enn andre motorer\n* MediaWiki-koden håndterer ikke alltid MyISAM som den burde\n\nHvis din MySQL-installasjon støtter InnoDB, er det sterkt å anbefale at du i stedet velger den.\nHvis din MySQL-installasjon ikke støtter InnoDB, kan det være på tide med en oppgradering.",
        "config-mysql-only-myisam-dep": "'''Advarsel:''' MyISAM er den eneste tilgjengelig lagringsmotoren for MySQL på denne maskinen, og det er ikke anbefalt brukt for MediaWiki, fordi:\n* den knapt støtter samtidighet pga. tabell-låsing\n* den har større tilbøyelighet for å bli korrupt enn andre motorer\n* MediaWiki-koden håndterer ikke alltid MyISAM som den burde\n\nHvis din MySQL-installasjon ikke støtter InnoDB, kan det være på tide med en oppgradering.",
index addc7fc..37c8890 100644 (file)
@@ -62,7 +62,7 @@ class JobQueueGroup {
        protected function __construct( $wiki, $readOnlyReason ) {
                $this->wiki = $wiki;
                $this->readOnlyReason = $readOnlyReason;
-               $this->cache = new ProcessCacheLRU( 10 );
+               $this->cache = new MapCacheLRU( 10 );
        }
 
        /**
@@ -154,8 +154,8 @@ class JobQueueGroup {
                        $this->get( $type )->push( $jobs );
                }
 
-               if ( $this->cache->has( 'queues-ready', 'list' ) ) {
-                       $list = $this->cache->get( 'queues-ready', 'list' );
+               if ( $this->cache->hasField( 'queues-ready', 'list' ) ) {
+                       $list = $this->cache->getField( 'queues-ready', 'list' );
                        if ( count( array_diff( array_keys( $jobsByType ), $list ) ) ) {
                                $this->cache->clear( 'queues-ready' );
                        }
@@ -244,10 +244,10 @@ class JobQueueGroup {
                        }
                } else { // any job in the "default" jobs types
                        if ( $flags & self::USE_CACHE ) {
-                               if ( !$this->cache->has( 'queues-ready', 'list', self::PROC_CACHE_TTL ) ) {
-                                       $this->cache->set( 'queues-ready', 'list', $this->getQueuesWithJobs() );
+                               if ( !$this->cache->hasField( 'queues-ready', 'list', self::PROC_CACHE_TTL ) ) {
+                                       $this->cache->setField( 'queues-ready', 'list', $this->getQueuesWithJobs() );
                                }
-                               $types = $this->cache->get( 'queues-ready', 'list' );
+                               $types = $this->cache->getField( 'queues-ready', 'list' );
                        } else {
                                $types = $this->getQueuesWithJobs();
                        }
diff --git a/includes/jobqueue/JobQueueSecondTestQueue.php b/includes/jobqueue/JobQueueSecondTestQueue.php
deleted file mode 100644 (file)
index e63f01f..0000000
+++ /dev/null
@@ -1,290 +0,0 @@
-<?php
-
-/**
- * A wrapper for the JobQueue that delegates all the method calls to a single,
- * main queue, and also pushes all the jobs to a second job queue that's being
- * debugged.
- *
- * This class was temporary added to test transitioning to the JobQueueEventBus
- * and will removed after the transition is completed. This code is only needed
- * while we are testing the new infrastructure to be able to compare the results
- * between the queue implementations and make sure that they process the same jobs,
- * deduplicate correctly, compare the delays, backlogs and make sure no jobs are lost.
- * When the new infrastructure is well tested this will not be needed any more.
- *
- * @deprecated since 1.30
- * @since 1.30
- */
-class JobQueueSecondTestQueue extends JobQueue {
-
-       /**
-        * @var JobQueue
-        */
-       private $mainQueue;
-
-       /**
-        * @var JobQueue
-        */
-       private $debugQueue;
-
-       /**
-        * @var bool
-        */
-       private $onlyWriteToDebugQueue;
-
-       protected function __construct( array $params ) {
-               if ( !isset( $params['mainqueue'] ) ) {
-                       throw new MWException( "mainqueue parameter must be provided to the debug queue" );
-               }
-
-               if ( !isset( $params['debugqueue'] ) ) {
-                       throw new MWException( "debugqueue parameter must be provided to the debug queue" );
-               }
-
-               $conf = [ 'wiki' => $params['wiki'], 'type' => $params['type'] ];
-               $this->mainQueue = JobQueue::factory( $params['mainqueue'] + $conf );
-               $this->debugQueue = JobQueue::factory( $params['debugqueue'] + $conf );
-               $this->onlyWriteToDebugQueue = $params['readonly'] ?? false;
-
-               // We need to construct parent after creating the main and debug queue
-               // because super constructor calls some methods we delegate to the main queue.
-               parent::__construct( $params );
-       }
-
-       /**
-        * Get the allowed queue orders for configuration validation
-        *
-        * @return array Subset of (random, timestamp, fifo, undefined)
-        */
-       protected function supportedOrders() {
-               return $this->mainQueue->supportedOrders();
-       }
-
-       /**
-        * Get the default queue order to use if configuration does not specify one
-        *
-        * @return string One of (random, timestamp, fifo, undefined)
-        */
-       protected function optimalOrder() {
-               return $this->mainQueue->optimalOrder();
-       }
-
-       /**
-        * Find out if delayed jobs are supported for configuration validation
-        *
-        * @return bool Whether delayed jobs are supported
-        */
-       protected function supportsDelayedJobs() {
-               return $this->mainQueue->supportsDelayedJobs();
-       }
-
-       /**
-        * @see JobQueue::isEmpty()
-        * @return bool
-        */
-       protected function doIsEmpty() {
-               return $this->mainQueue->doIsEmpty();
-       }
-
-       /**
-        * @see JobQueue::getSize()
-        * @return int
-        */
-       protected function doGetSize() {
-               return $this->mainQueue->doGetSize();
-       }
-
-       /**
-        * @see JobQueue::getAcquiredCount()
-        * @return int
-        */
-       protected function doGetAcquiredCount() {
-               return $this->mainQueue->doGetAcquiredCount();
-       }
-
-       /**
-        * @see JobQueue::getDelayedCount()
-        * @return int
-        */
-       protected function doGetDelayedCount() {
-               return $this->mainQueue->doGetDelayedCount();
-       }
-
-       /**
-        * @see JobQueue::getAbandonedCount()
-        * @return int
-        */
-       protected function doGetAbandonedCount() {
-               return $this->mainQueue->doGetAbandonedCount();
-       }
-
-       /**
-        * @see JobQueue::batchPush()
-        * @param IJobSpecification[] $jobs
-        * @param int $flags
-        */
-       protected function doBatchPush( array $jobs, $flags ) {
-               if ( !$this->onlyWriteToDebugQueue ) {
-                       $this->mainQueue->doBatchPush( $jobs, $flags );
-               }
-
-               try {
-                       $this->debugQueue->doBatchPush( $jobs, $flags );
-               } catch ( Exception $exception ) {
-                       MWExceptionHandler::logException( $exception );
-               }
-       }
-
-       /**
-        * @see JobQueue::pop()
-        * @return Job|bool
-        */
-       protected function doPop() {
-               return $this->mainQueue->doPop();
-       }
-
-       /**
-        * @see JobQueue::ack()
-        * @param Job $job
-        * @return Job|bool
-        */
-       protected function doAck( Job $job ) {
-               return $this->mainQueue->doAck( $job );
-       }
-
-       /**
-        * @see JobQueue::deduplicateRootJob()
-        * @param IJobSpecification $job
-        * @throws MWException
-        * @return bool
-        */
-       protected function doDeduplicateRootJob( IJobSpecification $job ) {
-               return $this->mainQueue->doDeduplicateRootJob( $job );
-       }
-
-       /**
-        * @see JobQueue::isRootJobOldDuplicate()
-        * @param Job $job
-        * @return bool
-        */
-       protected function doIsRootJobOldDuplicate( Job $job ) {
-               return $this->mainQueue->doIsRootJobOldDuplicate( $job );
-       }
-
-       /**
-        * @param string $signature Hash identifier of the root job
-        * @return string
-        */
-       protected function getRootJobCacheKey( $signature ) {
-               return $this->mainQueue->getRootJobCacheKey( $signature );
-       }
-
-       /**
-        * @see JobQueue::delete()
-        * @return bool
-        * @throws MWException
-        */
-       protected function doDelete() {
-               return $this->mainQueue->doDelete();
-       }
-
-       /**
-        * @see JobQueue::waitForBackups()
-        * @return void
-        */
-       protected function doWaitForBackups() {
-               $this->mainQueue->doWaitForBackups();
-       }
-
-       /**
-        * @see JobQueue::flushCaches()
-        * @return void
-        */
-       protected function doFlushCaches() {
-               $this->mainQueue->doFlushCaches();
-       }
-
-       /**
-        * Get an iterator to traverse over all available jobs in this queue.
-        * This does not include jobs that are currently acquired or delayed.
-        * Note: results may be stale if the queue is concurrently modified.
-        *
-        * @return Iterator
-        * @throws JobQueueError
-        */
-       public function getAllQueuedJobs() {
-               return $this->mainQueue->getAllQueuedJobs();
-       }
-
-       /**
-        * Get an iterator to traverse over all delayed jobs in this queue.
-        * Note: results may be stale if the queue is concurrently modified.
-        *
-        * @return Iterator
-        * @throws JobQueueError
-        * @since 1.22
-        */
-       public function getAllDelayedJobs() {
-               return $this->mainQueue->getAllDelayedJobs();
-       }
-
-       /**
-        * Get an iterator to traverse over all claimed jobs in this queue
-        *
-        * Callers should be quick to iterator over it or few results
-        * will be returned due to jobs being acknowledged and deleted
-        *
-        * @return Iterator
-        * @throws JobQueueError
-        * @since 1.26
-        */
-       public function getAllAcquiredJobs() {
-               return $this->mainQueue->getAllAcquiredJobs();
-       }
-
-       /**
-        * Get an iterator to traverse over all abandoned jobs in this queue
-        *
-        * @return Iterator
-        * @throws JobQueueError
-        * @since 1.25
-        */
-       public function getAllAbandonedJobs() {
-               return $this->mainQueue->getAllAbandonedJobs();
-       }
-
-       /**
-        * Do not use this function outside of JobQueue/JobQueueGroup
-        *
-        * @return string
-        * @since 1.22
-        */
-       public function getCoalesceLocationInternal() {
-               return $this->mainQueue->getCoalesceLocationInternal();
-       }
-
-       /**
-        * @see JobQueue::getSiblingQueuesWithJobs()
-        * @param array $types List of queues types
-        * @return array|null (list of queue types) or null if unsupported
-        */
-       protected function doGetSiblingQueuesWithJobs( array $types ) {
-               return $this->mainQueue->doGetSiblingQueuesWithJobs( $types );
-       }
-
-       /**
-        * @see JobQueue::getSiblingQueuesSize()
-        * @param array $types List of queues types
-        * @return array|null (list of queue types) or null if unsupported
-        */
-       protected function doGetSiblingQueueSizes( array $types ) {
-               return $this->mainQueue->doGetSiblingQueueSizes( $types );
-       }
-
-       /**
-        * @throws JobQueueReadOnlyError
-        */
-       protected function assertNotReadOnly() {
-               $this->mainQueue->assertNotReadOnly();
-       }
-}
index 74e8b54..92a4f9e 100644 (file)
@@ -72,15 +72,24 @@ class CSSMin {
                                $url = $match['file'][0];
 
                                // Skip fully-qualified and protocol-relative URLs and data URIs
-                               // Also skips the rare `behavior` property specifying application's default behavior
                                if (
                                        substr( $url, 0, 2 ) === '//' ||
-                                       parse_url( $url, PHP_URL_SCHEME ) ||
-                                       substr( $url, 0, 9 ) === '#default#'
+                                       parse_url( $url, PHP_URL_SCHEME )
                                ) {
                                        break;
                                }
 
+                               // Strip trailing anchors - T115436
+                               $anchor = strpos( $url, '#' );
+                               if ( $anchor !== false ) {
+                                       $url = substr( $url, 0, $anchor );
+
+                                       // '#some-anchors' is not a file
+                                       if ( $url === '' ) {
+                                               break;
+                                       }
+                               }
+
                                $files[] = $path . $url;
                        }
                }
@@ -485,11 +494,11 @@ class CSSMin {
 
                // Pass thru fully-qualified and protocol-relative URLs and data URIs, as well as local URLs if
                // we can't expand them.
-               // Also skips the rare `behavior` property specifying application's default behavior
+               // Also skips anchors or the rare `behavior` property specifying application's default behavior
                if (
                        self::isRemoteUrl( $url ) ||
                        self::isLocalUrl( $url ) ||
-                       substr( $url, 0, 9 ) === '#default#'
+                       substr( $url, 0, 1 ) === '#'
                ) {
                        return $url;
                }
index e891c9e..ad5e58d 100644 (file)
@@ -135,7 +135,7 @@ class MapCacheLRU implements IExpiringStore, Serializable {
         * Check if a key exists
         *
         * @param string $key
-        * @param float $maxAge Ignore items older than this many seconds (since 1.32)
+        * @param float $maxAge Ignore items older than this many seconds [optional] (since 1.32)
         * @return bool
         */
        public function has( $key, $maxAge = 0.0 ) {
@@ -157,10 +157,11 @@ class MapCacheLRU implements IExpiringStore, Serializable {
         * If the item is already set, it will be pushed to the top of the cache.
         *
         * @param string $key
-        * @return mixed Returns null if the key was not found
+        * @param float $maxAge Ignore items older than this many seconds [optional] (since 1.32)
+        * @return mixed Returns null if the key was not found or is older than $maxAge
         */
-       public function get( $key ) {
-               if ( !$this->has( $key ) ) {
+       public function get( $key, $maxAge = 0.0 ) {
+               if ( !$this->has( $key, $maxAge ) ) {
                        return null;
                }
 
@@ -193,7 +194,7 @@ class MapCacheLRU implements IExpiringStore, Serializable {
        /**
         * @param string|int $key
         * @param string|int $field
-        * @param float $maxAge
+        * @param float $maxAge Ignore items older than this many seconds [optional] (since 1.32)
         * @return bool
         */
        public function hasField( $key, $field, $maxAge = 0.0 ) {
@@ -205,8 +206,18 @@ class MapCacheLRU implements IExpiringStore, Serializable {
                return ( $maxAge <= 0 || $this->getAge( $key, $field ) <= $maxAge );
        }
 
-       public function getField( $key, $field ) {
-               return $this->get( $key )[$field] ?? null;
+       /**
+        * @param string|int $key
+        * @param string|int $field
+        * @param float $maxAge Ignore items older than this many seconds [optional] (since 1.32)
+        * @return mixed Returns null if the key was not found or is older than $maxAge
+        */
+       public function getField( $key, $field, $maxAge = 0.0 ) {
+               if ( !$this->hasField( $key, $field, $maxAge ) ) {
+                       return null;
+               }
+
+               return $this->cache[$key][$field];
        }
 
        /**
index f1f749f..7f5f003 100644 (file)
@@ -46,7 +46,7 @@ class MemcLockManager extends QuorumLockManager {
 
        /** @var MemcachedBagOStuff[] Map of (server name => MemcachedBagOStuff) */
        protected $cacheServers = [];
-       /** @var HashBagOStuff Server status cache */
+       /** @var MapCacheLRU Server status cache */
        protected $statusCache;
 
        /**
@@ -81,7 +81,7 @@ class MemcLockManager extends QuorumLockManager {
                        $this->cacheServers[$name] = new $class( $params );
                }
 
-               $this->statusCache = new HashBagOStuff();
+               $this->statusCache = new MapCacheLRU( 100 );
        }
 
        protected function getLocksOnServer( $lockSrv, array $pathsByType ) {
@@ -252,13 +252,13 @@ class MemcLockManager extends QuorumLockManager {
                        throw new InvalidArgumentException( "Invalid cache server '$lockSrv'." );
                }
 
-               $online = $this->statusCache->get( "online:$lockSrv" );
-               if ( $online === false ) {
+               $online = $this->statusCache->get( "online:$lockSrv", 30 );
+               if ( $online === null ) {
                        $online = $this->cacheServers[$lockSrv]->set( __CLASS__ . ':ping', 1, 1 );
                        if ( !$online ) { // server down?
                                $this->logger->warning( __METHOD__ . ": Could not contact $lockSrv." );
                        }
-                       $this->statusCache->set( "online:$lockSrv", (int)$online, 30 );
+                       $this->statusCache->set( "online:$lockSrv", (int)$online );
                }
 
                return $online ? $this->cacheServers[$lockSrv] : null;
index 91f4167..043f8cb 100644 (file)
@@ -122,7 +122,7 @@ class MultiWriteBagOStuff extends BagOStuff {
                        && $missIndexes
                        && ( $flags & self::READ_VERIFIED ) == self::READ_VERIFIED
                ) {
-                       // Backfill the value to the lower (and often larger) cache tiers
+                       // Backfill the value to the higher (and often faster/smaller) cache tiers
                        $this->doWrite(
                                $missIndexes, $this->asyncWrites, 'set', $key, $value, self::UPGRADE_TTL
                        );
@@ -171,6 +171,23 @@ class MultiWriteBagOStuff extends BagOStuff {
                return $this->doWrite( $this->cacheIndexes, $this->asyncWrites, 'decr', $key, $value );
        }
 
+       public function merge( $key, callable $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
+               $asyncWrites = ( ( $flags & self::WRITE_SYNC ) == self::WRITE_SYNC )
+                       ? false
+                       : $this->asyncWrites;
+
+               return $this->doWrite(
+                       $this->cacheIndexes,
+                       $asyncWrites,
+                       'merge',
+                       $key,
+                       $callback,
+                       $exptime,
+                       $attempts,
+                       $flags
+               );
+       }
+
        public function lock( $key, $timeout = 6, $expiry = 6, $rclass = '' ) {
                // Only need to lock the first cache; also avoids deadlocks
                return $this->caches[0]->lock( $key, $timeout, $expiry, $rclass );
@@ -202,7 +219,7 @@ class MultiWriteBagOStuff extends BagOStuff {
                $ret = true;
                $args = array_slice( func_get_args(), 3 );
 
-               if ( array_diff( $indexes, [ 0 ] ) && $asyncWrites ) {
+               if ( array_diff( $indexes, [ 0 ] ) && $asyncWrites && $method !== 'merge' ) {
                        // Deep-clone $args to prevent misbehavior when something writes an
                        // object to the BagOStuff then modifies it afterwards, e.g. T168040.
                        $args = unserialize( serialize( $args ) );
index e30e061..2989c81 100644 (file)
@@ -87,7 +87,7 @@ use Psr\Log\NullLogger;
 class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        /** @var BagOStuff The local datacenter cache */
        protected $cache;
-       /** @var HashBagOStuff[] Map of group PHP instance caches */
+       /** @var MapCacheLRU[] Map of group PHP instance caches */
        protected $processCaches = [];
        /** @var string Purge channel name */
        protected $purgeChannel;
@@ -1061,7 +1061,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                if ( $pcTTL >= 0 && $this->callbackDepth == 0 ) {
                        $group = $opts['pcGroup'] ?? self::PC_PRIMARY;
                        $procCache = $this->getProcessCache( $group );
-                       $value = $procCache->get( $key );
+                       $value = $procCache->has( $key, $pcTTL ) ? $procCache->get( $key ) : false;
                } else {
                        $procCache = false;
                        $value = false;
@@ -1117,7 +1117,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
 
                        // Update the process cache if enabled
                        if ( $procCache && $value !== false ) {
-                               $procCache->set( $key, $value, $pcTTL );
+                               $procCache->set( $key, $value );
                        }
                }
 
@@ -1385,10 +1385,11 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        ) {
                $valueKeys = array_keys( $keyedIds->getArrayCopy() );
                $checkKeys = $opts['checkKeys'] ?? [];
+               $pcTTL = $opts['pcTTL'] ?? self::TTL_UNCACHEABLE;
 
                // Load required keys into process cache in one go
                $this->warmupCache = $this->getRawKeysForWarmup(
-                       $this->getNonProcessCachedKeys( $valueKeys, $opts ),
+                       $this->getNonProcessCachedKeys( $valueKeys, $opts, $pcTTL ),
                        $checkKeys
                );
                $this->warmupKeyMisses = 0;
@@ -1480,11 +1481,12 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                $idsByValueKey = $keyedIds->getArrayCopy();
                $valueKeys = array_keys( $idsByValueKey );
                $checkKeys = $opts['checkKeys'] ?? [];
+               $pcTTL = $opts['pcTTL'] ?? self::TTL_UNCACHEABLE;
                unset( $opts['lockTSE'] ); // incompatible
                unset( $opts['busyValue'] ); // incompatible
 
                // Load required keys into process cache in one go
-               $keysGet = $this->getNonProcessCachedKeys( $valueKeys, $opts );
+               $keysGet = $this->getNonProcessCachedKeys( $valueKeys, $opts, $pcTTL );
                $this->warmupCache = $this->getRawKeysForWarmup( $keysGet, $checkKeys );
                $this->warmupKeyMisses = 0;
 
@@ -2103,12 +2105,12 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
 
        /**
         * @param string $group
-        * @return HashBagOStuff
+        * @return MapCacheLRU
         */
        protected function getProcessCache( $group ) {
                if ( !isset( $this->processCaches[$group] ) ) {
                        list( , $n ) = explode( ':', $group );
-                       $this->processCaches[$group] = new HashBagOStuff( [ 'maxKeys' => (int)$n ] );
+                       $this->processCaches[$group] = new MapCacheLRU( (int)$n );
                }
 
                return $this->processCaches[$group];
@@ -2117,15 +2119,16 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        /**
         * @param array $keys
         * @param array $opts
+        * @param int $pcTTL
         * @return array List of keys
         */
-       private function getNonProcessCachedKeys( array $keys, array $opts ) {
+       private function getNonProcessCachedKeys( array $keys, array $opts, $pcTTL ) {
                $keysFound = [];
                if ( isset( $opts['pcTTL'] ) && $opts['pcTTL'] > 0 && $this->callbackDepth == 0 ) {
                        $pcGroup = $opts['pcGroup'] ?? self::PC_PRIMARY;
                        $procCache = $this->getProcessCache( $pcGroup );
                        foreach ( $keys as $key ) {
-                               if ( $procCache->get( $key ) !== false ) {
+                               if ( $procCache->has( $key, $pcTTL ) ) {
                                        $keysFound[] = $key;
                                }
                        }
index d11b51b..dc3260d 100644 (file)
@@ -3844,9 +3844,11 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                $this->assertOpen();
 
                $this->runOnTransactionPreCommitCallbacks();
+
                $writeTime = $this->pendingWriteQueryDuration( self::ESTIMATE_DB_APPLY );
                $this->doCommit( $fname );
                $this->trxStatus = self::STATUS_TRX_NONE;
+
                if ( $this->trxDoneWrites ) {
                        $this->lastWriteTime = microtime( true );
                        $this->trxProfiler->transactionWritingOut(
@@ -3894,14 +3896,18 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        // Avoid fatals if close() was called
                        $this->assertOpen();
 
+                       $writeTime = $this->pendingWriteQueryDuration( self::ESTIMATE_DB_APPLY );
                        $this->doRollback( $fname );
                        $this->trxStatus = self::STATUS_TRX_NONE;
                        $this->trxAtomicLevels = [];
+
                        if ( $this->trxDoneWrites ) {
                                $this->trxProfiler->transactionWritingOut(
                                        $this->server,
                                        $this->dbName,
-                                       $this->trxShortId
+                                       $this->trxShortId,
+                                       $writeTime,
+                                       $this->trxWriteAffectedRows
                                );
                        }
                }
index fdcaa1b..73aaa4f 100644 (file)
@@ -123,9 +123,19 @@ class LogEventsList extends ContextSource {
                $formDescriptor['page'] = $this->getTitleInputDesc( $title );
 
                // Add extra inputs if any
+               // This could either be a form descriptor array or a string with raw HTML.
+               // We need it to work in both cases and show a deprecation warning if it
+               // is a string. See T199495.
                $extraInputsDescriptor = $this->getExtraInputsDesc( $types );
-               if ( !empty( $extraInputsDescriptor ) ) {
+               if (
+                       is_array( $extraInputsDescriptor ) &&
+                       !empty( $extraInputsDescriptor )
+               ) {
                        $formDescriptor[ 'extra' ] = $extraInputsDescriptor;
+               } elseif ( is_string( $extraInputsDescriptor ) ) {
+                       // We'll add this to the footer of the form later
+                       $extraInputsString = $extraInputsDescriptor;
+                       wfDeprecated( 'Using $input in LogEventsListGetExtraInputs hook', '1.32' );
                }
 
                // Title pattern, if allowed
@@ -163,8 +173,18 @@ class LogEventsList extends ContextSource {
                $htmlForm = new HTMLForm( $formDescriptor, $this->getContext() );
                $htmlForm
                        ->setSubmitText( $this->msg( 'logeventslist-submit' )->text() )
+                       ->setMethod( 'get' )
                        ->setWrapperLegendMsg( 'log' );
 
+               // TODO This will should be removed at some point. See T199495.
+               if ( isset( $extraInputsString ) ) {
+                       $htmlForm->addFooterText( Html::rawElement(
+                               'div',
+                               null,
+                               $extraInputsString
+                       ) );
+               }
+
                $htmlForm->prepareForm()->displayForm( false );
        }
 
@@ -176,7 +196,12 @@ class LogEventsList extends ContextSource {
                $options = [];
                $default = [];
                foreach ( $filter as $type => $val ) {
-                       $options[ $this->msg( "logeventslist-{$type}-log" )->text() ] = $type;
+                       $message = $this->msg( "logeventslist-{$type}-log" );
+                       // FIXME: Remove this check once T199657 is fully resolved.
+                       if ( !$message->exists() ) {
+                               $message = $this->msg( "log-show-hide-{$type}" )->params( $this->msg( 'show' )->text() );
+                       }
+                       $options[ $message->text() ] = $type;
 
                        if ( $val === 0 ) {
                                $default[] = $type;
@@ -260,7 +285,6 @@ class LogEventsList extends ContextSource {
                        'class' => 'HTMLTitleTextField',
                        'label-message' => 'speciallogtitlelabel',
                        'name' => 'page',
-                       'value' => $title,
                        'required' => false
                ];
        }
@@ -279,27 +303,24 @@ class LogEventsList extends ContextSource {
 
        /**
         * @param array $types
-        * @return array Form descriptor
+        * @return array|string Form descriptor or string with HTML
         */
        private function getExtraInputsDesc( $types ) {
                if ( count( $types ) == 1 ) {
                        if ( $types[0] == 'suppress' ) {
-                               $offender = $this->getRequest()->getVal( 'offender' );
-                               $user = User::newFromName( $offender, false );
-                               if ( !$user || ( $user->getId() == 0 && !IP::isIPAddress( $offender ) ) ) {
-                                       $offender = ''; // Blank field if invalid
-                               }
                                return [
                                        'type' => 'text',
                                        'label-message' => 'revdelete-offender',
                                        'name' => 'offender',
-                                       'value' => $offender,
                                ];
                        } else {
                                // Allow extensions to add their own extra inputs
+                               // This could be an array or string. See T199495.
+                               $input = ''; // Deprecated
                                $formDescriptor = [];
-                               Hooks::run( 'LogEventsListGetExtraInputs', [ $types[0], $this, &$formDescriptor ] );
-                               return $formDescriptor;
+                               Hooks::run( 'LogEventsListGetExtraInputs', [ $types[0], $this, &$input, &$formDescriptor ] );
+
+                               return empty( $formDescriptor ) ? $input : $formDescriptor;
                        }
                }
 
@@ -402,7 +423,10 @@ class LogEventsList extends ContextSource {
 
                // Let extensions add data
                Hooks::run( 'LogEventsListLineEnding', [ $this, &$ret, $entry, &$classes, &$attribs ] );
-               $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] );
+               $attribs = array_filter( $attribs,
+                       [ Sanitizer::class, 'isReservedDataAttribute' ],
+                       ARRAY_FILTER_USE_KEY
+               );
                $attribs['class'] = implode( ' ', $classes );
 
                return Html::rawElement( 'li', $attribs, $ret ) . "\n";
index 7cc25bd..a1b2e57 100644 (file)
@@ -1470,7 +1470,7 @@ class WikiPage implements Page, IDBAccessObject {
                $bSlots = $b->getRevisionRecord()->getSlots();
                $changedRoles = $aSlots->getRolesWithDifferentContent( $bSlots );
 
-               return ( $changedRoles !== [ 'main' ] );
+               return ( $changedRoles !== [ 'main' ] && $changedRoles !== [] );
        }
 
        /**
@@ -3343,23 +3343,10 @@ class WikiPage implements Page, IDBAccessObject {
                foreach ( $deleted as $catName ) {
                        $cat = Category::newFromName( $catName );
                        Hooks::run( 'CategoryAfterPageRemoved', [ $cat, $this, $id ] );
-               }
-
-               // Refresh counts on categories that should be empty now
-               if ( count( $deleted ) ) {
-                       $rows = $dbw->select(
-                               'category',
-                               [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ],
-                               [ 'cat_title' => $deleted, 'cat_pages <= 100' ],
-                               __METHOD__
-                       );
-                       foreach ( $rows as $row ) {
-                               $cat = Category::newFromRow( $row );
-                               // T166757: do the update after this DB commit
-                               DeferredUpdates::addCallableUpdate( function () use ( $cat ) {
-                                       $cat->refreshCounts();
-                               } );
-                       }
+                       // Refresh counts on categories that should be empty now (after commit, T166757)
+                       DeferredUpdates::addCallableUpdate( function () use ( $cat ) {
+                               $cat->refreshCountsIfEmpty();
+                       } );
                }
        }
 
index 4f5cb67..f38ed27 100644 (file)
@@ -298,7 +298,6 @@ abstract class TablePager extends IndexPager {
                $types = [ 'first', 'prev', 'next', 'last' ];
 
                $queries = $this->getPagingQueries();
-               $links = [];
 
                $buttons = [];
 
index 8c113f4..830da06 100644 (file)
@@ -20,7 +20,6 @@
 
 namespace MediaWiki\Preferences;
 
-use CentralIdLookup;
 use Config;
 use DateTime;
 use DateTimeZone;
@@ -53,6 +52,7 @@ use SpecialPage;
 use SpecialPreferences;
 use Status;
 use Title;
+use UnexpectedValueException;
 use User;
 use UserGroupMembership;
 use Xml;
@@ -94,22 +94,6 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                $this->logger = new NullLogger();
        }
 
-       /**
-        * @return callable[]
-        */
-       protected function getSaveFilters() {
-               // Wrap intval() so that we can pass it multiple parameters and treat all filters the same.
-               $intvalFilter = function ( $value, $alldata ) {
-                       return intval( $value );
-               };
-               return [
-                       'timecorrection' => [ $this, 'filterTimezoneInput' ],
-                       'rclimit' => $intvalFilter,
-                       'wllimit' => $intvalFilter,
-                       'searchlimit' => $intvalFilter,
-               ];
-       }
-
        /**
         * @inheritDoc
         */
@@ -178,9 +162,11 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                $disable = !$user->isAllowed( 'editmyoptions' );
 
                $defaultOptions = User::getDefaultOptions();
+               $userOptions = $user->getOptions();
+               $this->applyFilters( $userOptions, $defaultPreferences, 'filterForForm' );
                # # Prod in defaults from the user
                foreach ( $defaultPreferences as $name => &$info ) {
-                       $prefFromUser = $this->getOptionFromUser( $name, $info, $user );
+                       $prefFromUser = $this->getOptionFromUser( $name, $info, $userOptions );
                        if ( $disable && !in_array( $name, $this->getSaveBlacklist() ) ) {
                                $info['disabled'] = 'disabled';
                        }
@@ -209,11 +195,11 @@ class DefaultPreferencesFactory implements PreferencesFactory {
         *
         * @param string $name
         * @param array $info
-        * @param User $user
+        * @param array $userOptions
         * @return array|string
         */
-       protected function getOptionFromUser( $name, $info, User $user ) {
-               $val = $user->getOption( $name );
+       protected function getOptionFromUser( $name, $info, array $userOptions ) {
+               $val = $userOptions[$name] ?? null;
 
                // Handling for multiselect preferences
                if ( ( isset( $info['type'] ) && $info['type'] == 'multiselect' ) ||
@@ -223,7 +209,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        $val = [];
 
                        foreach ( $options as $value ) {
-                               if ( $user->getOption( "$prefix$value" ) ) {
+                               if ( $userOptions["$prefix$value"] ?? false ) {
                                        $val[] = $value;
                                }
                        }
@@ -239,7 +225,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
 
                        foreach ( $columns as $column ) {
                                foreach ( $rows as $row ) {
-                                       if ( $user->getOption( "$prefix$column-$row" ) ) {
+                                       if ( $userOptions["$prefix$column-$row"] ?? false ) {
                                                $val[] = "$column-$row";
                                        }
                                }
@@ -653,16 +639,12 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                                ];
 
                                if ( $this->config->get( 'EnableUserEmailBlacklist' ) ) {
-                                       $lookup = CentralIdLookup::factory();
-                                       $ids = $user->getOption( 'email-blacklist', [] );
-                                       $names = $ids ? $lookup->namesFromCentralIds( $ids, $user ) : [];
-
                                        $defaultPreferences['email-blacklist'] = [
                                                'type' => 'usersmultiselect',
                                                'label-message' => 'email-blacklist-label',
                                                'section' => 'personal/email',
-                                               'default' => implode( "\n", $names ),
                                                'disabled' => $disableEmailPrefs,
+                                               'filter' => MultiUsernameFilter::class,
                                        ];
                                }
                        }
@@ -850,6 +832,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        'size' => 20,
                        'section' => 'rendering/timeoffset',
                        'id' => 'wpTimeCorrection',
+                       'filter' => TimezoneFilter::class,
                ];
        }
 
@@ -1010,6 +993,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        'label-message' => 'recentchangescount',
                        'help-message' => 'prefs-help-recentchangescount',
                        'section' => 'rc/displayrc',
+                       'filter' => IntvalFilter::class,
                ];
                $defaultPreferences['usenewrc'] = [
                        'type' => 'toggle',
@@ -1153,6 +1137,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        'label-message' => 'prefs-watchlist-edits',
                        'help' => $context->msg( 'prefs-watchlist-edits-max' )->escaped(),
                        'section' => 'watchlist/displaywatchlist',
+                       'filter' => IntvalFilter::class,
                ];
                $defaultPreferences['extendwatchlist'] = [
                        'type' => 'toggle',
@@ -1533,9 +1518,11 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                # Used message keys: 'accesskey-preferences-save', 'tooltip-preferences-save'
                $htmlForm->setSubmitTooltip( 'preferences-save' );
                $htmlForm->setSubmitID( 'prefcontrol' );
-               $htmlForm->setSubmitCallback( function ( array $formData, HTMLForm $form ) {
-                       return $this->submitForm( $formData, $form );
-               } );
+               $htmlForm->setSubmitCallback(
+                       function ( array $formData, HTMLForm $form ) use ( $formDescriptor ) {
+                               return $this->submitForm( $formData, $form, $formDescriptor );
+                       }
+               );
 
                return $htmlForm;
        }
@@ -1584,64 +1571,16 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                return $opt;
        }
 
-       /**
-        * @param string $tz
-        * @param array $alldata
-        * @return string
-        */
-       protected function filterTimezoneInput( $tz, array $alldata ) {
-               $data = explode( '|', $tz, 3 );
-               switch ( $data[0] ) {
-                       case 'ZoneInfo':
-                               $valid = false;
-
-                               if ( count( $data ) === 3 ) {
-                                       // Make sure this timezone exists
-                                       try {
-                                               new DateTimeZone( $data[2] );
-                                               // If the constructor didn't throw, we know it's valid
-                                               $valid = true;
-                                       } catch ( Exception $e ) {
-                                               // Not a valid timezone
-                                       }
-                               }
-
-                               if ( !$valid ) {
-                                       // If the supplied timezone doesn't exist, fall back to the encoded offset
-                                       return 'Offset|' . intval( $tz[1] );
-                               }
-                               return $tz;
-                       case 'System':
-                               return $tz;
-                       default:
-                               $data = explode( ':', $tz, 2 );
-                               if ( count( $data ) == 2 ) {
-                                       $data[0] = intval( $data[0] );
-                                       $data[1] = intval( $data[1] );
-                                       $minDiff = abs( $data[0] ) * 60 + $data[1];
-                                       if ( $data[0] < 0 ) {
-                                               $minDiff = - $minDiff;
-                                       }
-                               } else {
-                                       $minDiff = intval( $data[0] ) * 60;
-                               }
-
-                               # Max is +14:00 and min is -12:00, see:
-                               # https://en.wikipedia.org/wiki/Timezone
-                               $minDiff = min( $minDiff, 840 );  # 14:00
-                               $minDiff = max( $minDiff, -720 ); # -12:00
-                               return 'Offset|' . $minDiff;
-               }
-       }
-
        /**
         * Handle the form submission if everything validated properly
         *
         * @param array $formData
         * @param HTMLForm $form
+        * @param array[] $formDescriptor
         * @return bool|Status|string
         */
-       protected function saveFormData( $formData, HTMLForm $form ) {
+       protected function saveFormData( $formData, HTMLForm $form, array $formDescriptor ) {
+               /** @var \User $user */
                $user = $form->getModifiedUser();
                $hiddenPrefs = $this->config->get( 'HiddenPrefs' );
                $result = true;
@@ -1651,12 +1590,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                }
 
                // Filter input
-               foreach ( array_keys( $formData ) as $name ) {
-                       $filters = $this->getSaveFilters();
-                       if ( isset( $filters[$name] ) ) {
-                               $formData[$name] = call_user_func( $filters[$name], $formData[$name], $formData );
-                       }
-               }
+               $this->applyFilters( $formData, $formDescriptor, 'filterFromForm' );
 
                // Fortunately, the realname field is MUCH simpler
                // (not really "private", but still shouldn't be edited without permission)
@@ -1713,16 +1647,32 @@ class DefaultPreferencesFactory implements PreferencesFactory {
        }
 
        /**
-        * DO NOT USE. Temporary function to punch hole for the Preferences class.
-        *
-        * @deprecated since 1.31, its inception
+        * Applies filters to preferences either before or after form usage
         *
-        * @param array $formData
-        * @param HTMLForm $form
-        * @return bool|Status|string
+        * @param array &$preferences
+        * @param array $formDescriptor
+        * @param string $verb Name of the filter method to call, either 'filterFromForm' or
+        *              'filterForForm'
         */
-       public function legacySaveFormData( $formData, HTMLForm $form ) {
-               return $this->saveFormData( $formData, $form );
+       protected function applyFilters( array &$preferences, array $formDescriptor, $verb ) {
+               foreach ( $formDescriptor as $preference => $desc ) {
+                       if ( !isset( $desc['filter'] ) || !isset( $preferences[$preference] ) ) {
+                               continue;
+                       }
+                       $filterDesc = $desc['filter'];
+                       if ( $filterDesc instanceof Filter ) {
+                               $filter = $filterDesc;
+                       } elseif ( class_exists( $filterDesc ) ) {
+                               $filter = new $filterDesc();
+                       } elseif ( is_callable( $filterDesc ) ) {
+                               $filter = $filterDesc();
+                       } else {
+                               throw new UnexpectedValueException(
+                                       "Unrecognized filter type for preference '$preference'"
+                               );
+                       }
+                       $preferences[$preference] = $filter->$verb( $preferences[$preference] );
+               }
        }
 
        /**
@@ -1730,10 +1680,11 @@ class DefaultPreferencesFactory implements PreferencesFactory {
         *
         * @param array $formData
         * @param HTMLForm $form
+        * @param array $formDescriptor
         * @return Status
         */
-       protected function submitForm( array $formData, HTMLForm $form ) {
-               $res = $this->saveFormData( $formData, $form );
+       protected function submitForm( array $formData, HTMLForm $form, array $formDescriptor ) {
+               $res = $this->saveFormData( $formData, $form, $formDescriptor );
 
                if ( $res === true ) {
                        $context = $form->getContext();
@@ -1763,19 +1714,6 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                return ( $res === true ? Status::newGood() : $res );
        }
 
-       /**
-        * DO NOT USE. Temporary function to punch hole for the Preferences class.
-        *
-        * @deprecated since 1.31, its inception
-        *
-        * @param array $formData
-        * @param HTMLForm $form
-        * @return Status
-        */
-       public function legacySubmitForm( array $formData, HTMLForm $form ) {
-               return $this->submitForm( $formData, $form );
-       }
-
        /**
         * Get a list of all time zones
         * @param Language $language Language used for the localized names
diff --git a/includes/preferences/Filter.php b/includes/preferences/Filter.php
new file mode 100644 (file)
index 0000000..670dd5b
--- /dev/null
@@ -0,0 +1,39 @@
+<?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
+ */
+
+namespace MediaWiki\Preferences;
+
+/**
+ * Base interface for user preference flters that work as a middleware between
+ * storage and interface.
+ */
+interface Filter {
+       /**
+        * @param mixed $value
+        * @return mixed
+        */
+       public function filterForForm( $value );
+
+       /**
+        * @param mixed $value
+        * @return mixed
+        */
+       public function filterFromForm( $value );
+}
diff --git a/includes/preferences/IntvalFilter.php b/includes/preferences/IntvalFilter.php
new file mode 100644 (file)
index 0000000..0dd3fc5
--- /dev/null
@@ -0,0 +1,38 @@
+<?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
+ */
+
+namespace MediaWiki\Preferences;
+
+class IntvalFilter implements Filter {
+
+       /**
+        * @inheritDoc
+        */
+       public function filterForForm( $value ) {
+               return $value;
+       }
+
+       /**
+        * @inheritDoc
+        */
+       public function filterFromForm( $value ) {
+               return intval( $value );
+       }
+}
diff --git a/includes/preferences/MultiUsernameFilter.php b/includes/preferences/MultiUsernameFilter.php
new file mode 100644 (file)
index 0000000..2d8ae3c
--- /dev/null
@@ -0,0 +1,86 @@
+<?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
+ */
+
+namespace MediaWiki\Preferences;
+
+use CentralIdLookup;
+
+class MultiUsernameFilter implements Filter {
+       /**
+        * @var CentralIdLookup|null
+        */
+       private $lookup;
+       /** @var CentralIdLookup|int User querying central usernames or one of the audience constants */
+       private $userOrAudience;
+
+       /**
+        * @param CentralIdLookup|null $lookup
+        * @param int $userOrAudience
+        */
+       public function __construct( CentralIdLookup $lookup = null,
+               $userOrAudience = CentralIdLookup::AUDIENCE_PUBLIC
+       ) {
+               $this->lookup = $lookup;
+               $this->userOrAudience = $userOrAudience;
+       }
+
+       /**
+        * @inheritDoc
+        */
+       public function filterFromForm( $names ) {
+               $names = trim( $names );
+               if ( $names !== '' ) {
+                       $names = preg_split( '/\n/', $names, -1, PREG_SPLIT_NO_EMPTY );
+                       $ids = $this->getLookup()->centralIdsFromNames( $names, $this->userOrAudience );
+                       if ( $ids ) {
+                               return implode( "\n", $ids );
+                       }
+               }
+               // If the user list is empty, it should be null (don't save) rather than an empty string
+               return null;
+       }
+
+       /**
+        * @inheritDoc
+        */
+       public function filterForForm( $value ) {
+               $ids = self::splitIds( $value );
+               $names = $ids ? $this->getLookup()->namesFromCentralIds( $ids, $this->userOrAudience ) : [];
+               return implode( "\n", $names );
+       }
+
+       /**
+        * Splits a newline separated list of user ids into a
+        *
+        * @param string $str
+        * @return int[]
+        */
+       public static function splitIds( $str ) {
+               return array_map( 'intval', preg_split( '/\n/', $str, -1, PREG_SPLIT_NO_EMPTY ) );
+       }
+
+       /**
+        * @return CentralIdLookup
+        */
+       private function getLookup() {
+               $this->lookup = $this->lookup ?? CentralIdLookup::factory();
+               return $this->lookup;
+       }
+}
diff --git a/includes/preferences/TimezoneFilter.php b/includes/preferences/TimezoneFilter.php
new file mode 100644 (file)
index 0000000..53f12de
--- /dev/null
@@ -0,0 +1,84 @@
+<?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
+ */
+
+namespace MediaWiki\Preferences;
+
+use DateTimeZone;
+use Exception;
+
+class TimezoneFilter implements Filter {
+
+       /**
+        * @inheritDoc
+        */
+       public function filterForForm( $value ) {
+               return $value;
+       }
+
+       /**
+        * @inheritDoc
+        */
+       public function filterFromForm( $tz ) {
+               $data = explode( '|', $tz, 3 );
+               switch ( $data[0] ) {
+                       case 'ZoneInfo':
+                               $valid = false;
+
+                               if ( count( $data ) === 3 ) {
+                                       // Make sure this timezone exists
+                                       try {
+                                               new DateTimeZone( $data[2] );
+                                               // If the constructor didn't throw, we know it's valid
+                                               $valid = true;
+                                       } catch ( Exception $e ) {
+                                               // Not a valid timezone
+                                       }
+                               }
+
+                               if ( !$valid ) {
+                                       // If the supplied timezone doesn't exist, fall back to the encoded offset
+                                       return 'Offset|' . intval( $tz[1] );
+                               }
+                               return $tz;
+                       case 'System':
+                               return $tz;
+                       default:
+                               $data = explode( ':', $tz, 2 );
+                               if ( count( $data ) == 2 ) {
+                                       $data[0] = intval( $data[0] );
+                                       $data[1] = intval( $data[1] );
+                                       $minDiff = abs( $data[0] ) * 60 + $data[1];
+                                       if ( $data[0] < 0 ) {
+                                               $minDiff = - $minDiff;
+                                       }
+                               } else {
+                                       $minDiff = intval( $data[0] ) * 60;
+                               }
+
+                               # Max is +14:00 and min is -12:00, see:
+                               # https://en.wikipedia.org/wiki/Timezone
+                               # 14:00
+                               $minDiff = min( $minDiff, 840 );
+                               # -12:00
+                               $minDiff = max( $minDiff, -720 );
+                               return 'Offset|' . $minDiff;
+               }
+       }
+}
index 564ea6b..9d6c1a5 100644 (file)
 
 use Composer\Spdx\SpdxLicenses;
 use JsonSchema\Validator;
+use Seld\JsonLint\JsonParser;
+use Seld\JsonLint\ParsingException;
 
 /**
+ * Validate extension.json files against their JSON schema.
+ *
+ * This is used for static validation from the command-line via
+ * validateRegistrationFile.php, and the PHPUnit structure test suite
+ * (ExtensionJsonValidationTest).
+ *
+ * The files are normally read by the ExtensionRegistry
+ * and ExtensionProcessor classes.
+ *
  * @since 1.29
  */
 class ExtensionJsonValidator {
@@ -54,6 +65,10 @@ class ExtensionJsonValidator {
                                'The spdx-licenses library cannot be found, please install it through composer.'
                        );
                        return false;
+               } elseif ( !class_exists( JsonParser::class ) ) {
+                       call_user_func( $this->missingDepCallback,
+                               'The JSON lint library cannot be found, please install it through composer.'
+                       );
                }
 
                return true;
@@ -65,8 +80,14 @@ class ExtensionJsonValidator {
         * @throws ExtensionJsonValidationError on any failure
         */
        public function validate( $path ) {
-               $data = json_decode( file_get_contents( $path ) );
-               if ( !is_object( $data ) ) {
+               $contents = file_get_contents( $path );
+               $jsonParser = new JsonParser();
+               try {
+                       $data = $jsonParser->parse( $contents, JsonParser::DETECT_KEY_CONFLICTS );
+               } catch ( ParsingException $e ) {
+                       if ( $e instanceof \Seld\JsonLint\DuplicateKeyException ) {
+                               throw new ExtensionJsonValidationError( $e->getMessage() );
+                       }
                        throw new ExtensionJsonValidationError( "$path is not valid JSON" );
                }
 
index a803e3a..d0a9871 100644 (file)
@@ -162,6 +162,11 @@ class ExtensionProcessor implements Processor {
         */
        protected $credits = [];
 
+       /**
+        * @var array
+        */
+       protected $config = [];
+
        /**
         * Any thing else in the $info that hasn't
         * already been processed
@@ -290,6 +295,7 @@ class ExtensionProcessor implements Processor {
 
                return [
                        'globals' => $this->globals,
+                       'config' => $this->config,
                        'defines' => $this->defines,
                        'callbacks' => $this->callbacks,
                        'credits' => $this->credits,
@@ -493,6 +499,11 @@ class ExtensionProcessor implements Processor {
                                        $value = "$dir/$value";
                                }
                                $this->addConfigGlobal( "$prefix$key", $value, $info['name'] );
+                               $data['providedby'] = $info['name'];
+                               if ( isset( $info['ConfigRegistry'][0] ) ) {
+                                       $data['configregistry'] = array_keys( $info['ConfigRegistry'] )[0];
+                               }
+                               $this->config[$key] = $data;
                        }
                }
        }
index c58b55e..d21ae41 100644 (file)
@@ -36,7 +36,7 @@ class ExtensionRegistry {
        /**
         * Bump whenever the registration cache needs resetting
         */
-       const CACHE_VERSION = 6;
+       const CACHE_VERSION = 7;
 
        /**
         * Special key that defines the merge strategy
index 210deb1..636d3b3 100644 (file)
@@ -25,6 +25,7 @@ interface Processor {
         * @return array With following keys:
         *     'globals' - variables to be set to $GLOBALS
         *     'defines' - constants to define
+        *     'config' - configuration information
         *     'callbacks' - functions to be executed by the registry
         *     'credits' - metadata to be stored by registry
         *     'attributes' - registration info which isn't a global variable
index 9c673bc..59853b4 100644 (file)
@@ -117,7 +117,7 @@ class VersionChecker {
                                                }
                                                break;
                                        case 'extensions':
-                                       case 'skin':
+                                       case 'skins':
                                                foreach ( $values as $dependency => $constraint ) {
                                                        $extError = $this->handleExtensionDependency(
                                                                $dependency, $constraint, $extension, $dependencyType
@@ -169,7 +169,7 @@ class VersionChecker {
         * @param string $dependencyName The name of the dependency
         * @param string $constraint The required version constraint for this dependency
         * @param string $checkedExt The Extension, which depends on this dependency
-        * @param string $type Either 'extension' or 'skin'
+        * @param string $type Either 'extensions' or 'skins'
         * @return bool|array false for no errors, or an array of info
         */
        private function handleExtensionDependency( $dependencyName, $constraint, $checkedExt,
index f2929a3..93f8d23 100644 (file)
@@ -28,7 +28,7 @@ use Wikimedia\Rdbms\IDatabase;
  * @ingroup Search
  * @since 1.23
  */
-class SearchDatabase extends SearchEngine {
+abstract class SearchDatabase extends SearchEngine {
        /**
         * @var IDatabase Slave database for reading from for results
         */
@@ -45,6 +45,38 @@ class SearchDatabase extends SearchEngine {
                }
        }
 
+       /**
+        * @param string $term
+        * @return SearchResultSet|Status|null
+        */
+       final public function doSearchText( $term ) {
+               return $this->doSearchTextInDB( $this->extractNamespacePrefix( $term ) );
+       }
+
+       /**
+        * Perform a full text search query and return a result set.
+        *
+        * @param string $term Raw search term
+        * @return SqlSearchResultSet
+        */
+       abstract protected function doSearchTextInDB( $term );
+
+       /**
+        * @param string $term
+        * @return SearchResultSet|null
+        */
+       final public function doSearchTitle( $term ) {
+               return $this->doSearchTitleInDB( $this->extractNamespacePrefix( $term ) );
+       }
+
+       /**
+        * Perform a title-only search query and return a result set.
+        *
+        * @param string $term Raw search term
+        * @return SqlSearchResultSet
+        */
+       abstract protected function doSearchTitleInDB( $term );
+
        /**
         * Return a 'cleaned up' search string
         *
@@ -58,4 +90,19 @@ class SearchDatabase extends SearchEngine {
                $lc = $this->legalSearchChars( self::CHARS_ALL );
                return trim( preg_replace( "/[^{$lc}]/", " ", $text ) );
        }
+
+       /**
+        * Extract the optional namespace prefix and set self::namespaces
+        * accordingly and return the query string
+        * @param string $term
+        * @return string the query string without any namespace prefix
+        */
+       final protected function extractNamespacePrefix( $term ) {
+               $queryAndNs = self::parseNamespacePrefixes( $term );
+               if ( $queryAndNs === false ) {
+                       return $term;
+               }
+               $this->namespaces = $queryAndNs[1];
+               return $queryAndNs[0];
+       }
 }
index 63c4610..30c2271 100644 (file)
@@ -244,6 +244,8 @@ abstract class SearchEngine {
         * search=test&prefix=Main_Page/Archive -> test prefix:Main Page/Archive
         * @param string $term
         * @return string
+        * @deprecated since 1.32 this should now be handled internally by the
+        * search engine
         */
        public function transformSearchTerm( $term ) {
                return $term;
@@ -385,16 +387,12 @@ abstract class SearchEngine {
         * or namespace names and set the list of namespaces
         * of this class accordingly.
         *
+        * @deprecated since 1.32; should be handled internally by the search engine
         * @param string $query
         * @return string
         */
        function replacePrefixes( $query ) {
-               $queryAndNs = self::parseNamespacePrefixes( $query );
-               if ( $queryAndNs === false ) {
-                       return $query;
-               }
-               $this->namespaces = $queryAndNs[1];
-               return $queryAndNs[0];
+               return $query;
        }
 
        /**
@@ -402,11 +400,21 @@ abstract class SearchEngine {
         * or namespace names
         *
         * @param string $query
+        * @param bool $withAllKeyword activate support of the "all:" keyword and its
+        * translations to activate searching on all namespaces.
+        * @param bool $withPrefixSearchExtractNamespaceHook call the PrefixSearchExtractNamespace hook
+        *  if classic namespace identification did not match.
         * @return false|array false if no namespace was extracted, an array
         * with the parsed query at index 0 and an array of namespaces at index
         * 1 (or null for all namespaces).
-        */
-       public static function parseNamespacePrefixes( $query ) {
+        * @throws FatalError
+        * @throws MWException
+        */
+       public static function parseNamespacePrefixes(
+               $query,
+               $withAllKeyword = true,
+               $withPrefixSearchExtractNamespaceHook = false
+       ) {
                global $wgContLang;
 
                $parsed = $query;
@@ -414,40 +422,48 @@ abstract class SearchEngine {
                        return false;
                }
                $extractedNamespace = null;
-               $allkeywords = [];
-
-               $allkeywords[] = wfMessage( 'searchall' )->inContentLanguage()->text() . ":";
-               // force all: so that we have a common syntax for all the wikis
-               if ( !in_array( 'all:', $allkeywords ) ) {
-                       $allkeywords[] = 'all:';
-               }
 
                $allQuery = false;
-               foreach ( $allkeywords as $kw ) {
-                       if ( strncmp( $query, $kw, strlen( $kw ) ) == 0 ) {
-                               $extractedNamespace = null;
-                               $parsed = substr( $query, strlen( $kw ) );
-                               $allQuery = true;
-                               break;
+               if ( $withAllKeyword ) {
+                       $allkeywords = [];
+
+                       $allkeywords[] = wfMessage( 'searchall' )->inContentLanguage()->text() . ":";
+                       // force all: so that we have a common syntax for all the wikis
+                       if ( !in_array( 'all:', $allkeywords ) ) {
+                               $allkeywords[] = 'all:';
+                       }
+
+                       foreach ( $allkeywords as $kw ) {
+                               if ( strncmp( $query, $kw, strlen( $kw ) ) == 0 ) {
+                                       $extractedNamespace = null;
+                                       $parsed = substr( $query, strlen( $kw ) );
+                                       $allQuery = true;
+                                       break;
+                               }
                        }
                }
 
                if ( !$allQuery && strpos( $query, ':' ) !== false ) {
-                       // TODO: should we unify with PrefixSearch::extractNamespace ?
                        $prefix = str_replace( ' ', '_', substr( $query, 0, strpos( $query, ':' ) ) );
                        $index = $wgContLang->getNsIndex( $prefix );
                        if ( $index !== false ) {
                                $extractedNamespace = [ $index ];
                                $parsed = substr( $query, strlen( $prefix ) + 1 );
+                       } elseif ( $withPrefixSearchExtractNamespaceHook ) {
+                               $hookNamespaces = [ NS_MAIN ];
+                               $hookQuery = $query;
+                               Hooks::run( 'PrefixSearchExtractNamespace', [ &$hookNamespaces, &$hookQuery ] );
+                               if ( $hookQuery !== $query ) {
+                                       $parsed = $hookQuery;
+                                       $extractedNamespace = $hookNamespaces;
+                               } else {
+                                       return false;
+                               }
                        } else {
                                return false;
                        }
                }
 
-               if ( trim( $parsed ) == '' ) {
-                       $parsed = $query; // prefix was the whole query
-               }
-
                return [ $parsed, $extractedNamespace ];
        }
 
@@ -530,34 +546,11 @@ abstract class SearchEngine {
         * @return string Simplified search string
         */
        protected function normalizeNamespaces( $search ) {
-               // Find a Title which is not an interwiki and is in NS_MAIN
-               $title = Title::newFromText( $search );
-               $ns = $this->namespaces;
-               if ( $title && !$title->isExternal() ) {
-                       $ns = [ $title->getNamespace() ];
-                       $search = $title->getText();
-                       if ( $ns[0] == NS_MAIN ) {
-                               $ns = $this->namespaces; // no explicit prefix, use default namespaces
-                               Hooks::run( 'PrefixSearchExtractNamespace', [ &$ns, &$search ] );
-                       }
-               } else {
-                       $title = Title::newFromText( $search . 'Dummy' );
-                       if ( $title && $title->getText() == 'Dummy'
-                                       && $title->getNamespace() != NS_MAIN
-                                       && !$title->isExternal()
-                       ) {
-                               $ns = [ $title->getNamespace() ];
-                               $search = '';
-                       } else {
-                               Hooks::run( 'PrefixSearchExtractNamespace', [ &$ns, &$search ] );
-                       }
+               $queryAndNs = self::parseNamespacePrefixes( $search, false, true );
+               if ( $queryAndNs !== false ) {
+                       $this->setNamespaces( $queryAndNs[1] );
+                       return $queryAndNs[0];
                }
-
-               $ns = array_map( function ( $space ) {
-                       return $space == NS_MEDIA ? NS_FILE : $space;
-               }, $ns );
-
-               $this->setNamespaces( $ns );
                return $search;
        }
 
index 30ac92d..289f925 100644 (file)
@@ -34,7 +34,7 @@ class SearchMssql extends SearchDatabase {
         * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
-       protected function doSearchText( $term ) {
+       protected function doSearchTextInDB( $term ) {
                $resultSet = $this->db->query( $this->getQuery( $this->filter( $term ), true ) );
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
@@ -45,7 +45,7 @@ class SearchMssql extends SearchDatabase {
         * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
-       protected function doSearchTitle( $term ) {
+       protected function doSearchTitleInDB( $term ) {
                $resultSet = $this->db->query( $this->getQuery( $this->filter( $term ), false ) );
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
index 9a03ebe..6253b55 100644 (file)
@@ -167,7 +167,7 @@ class SearchMySQL extends SearchDatabase {
         * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
-       protected function doSearchText( $term ) {
+       protected function doSearchTextInDB( $term ) {
                return $this->searchInternal( $term, true );
        }
 
@@ -177,7 +177,7 @@ class SearchMySQL extends SearchDatabase {
         * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
-       protected function doSearchTitle( $term ) {
+       protected function doSearchTitleInDB( $term ) {
                return $this->searchInternal( $term, false );
        }
 
index 7fe5b53..6d7e988 100644 (file)
@@ -64,7 +64,7 @@ class SearchOracle extends SearchDatabase {
         * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
-       protected function doSearchText( $term ) {
+       protected function doSearchTextInDB( $term ) {
                if ( $term == '' ) {
                        return new SqlSearchResultSet( false, '' );
                }
@@ -79,7 +79,7 @@ class SearchOracle extends SearchDatabase {
         * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
-       protected function doSearchTitle( $term ) {
+       protected function doSearchTitleInDB( $term ) {
                if ( $term == '' ) {
                        return new SqlSearchResultSet( false, '' );
                }
index 729e528..6d5f117 100644 (file)
@@ -37,7 +37,7 @@ class SearchPostgres extends SearchDatabase {
         * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
-       protected function doSearchTitle( $term ) {
+       protected function doSearchTitleInDB( $term ) {
                $q = $this->searchQuery( $term, 'titlevector', 'page_title' );
                $olderror = error_reporting( E_ERROR );
                $resultSet = $this->db->query( $q, 'SearchPostgres', true );
@@ -45,7 +45,7 @@ class SearchPostgres extends SearchDatabase {
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
 
-       protected function doSearchText( $term ) {
+       protected function doSearchTextInDB( $term ) {
                $q = $this->searchQuery( $term, 'textvector', 'old_text' );
                $olderror = error_reporting( E_ERROR );
                $resultSet = $this->db->query( $q, 'SearchPostgres', true );
index 1dc37d2..0ed477a 100644 (file)
@@ -156,7 +156,7 @@ class SearchSqlite extends SearchDatabase {
         * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
-       protected function doSearchText( $term ) {
+       protected function doSearchTextInDB( $term ) {
                return $this->searchInternal( $term, true );
        }
 
@@ -166,7 +166,7 @@ class SearchSqlite extends SearchDatabase {
         * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
-       protected function doSearchTitle( $term ) {
+       protected function doSearchTitleInDB( $term ) {
                return $this->searchInternal( $term, false );
        }
 
index 8ae517e..1154e05 100644 (file)
@@ -437,12 +437,12 @@ class Command {
                        @trigger_error( '' );
                        restore_error_handler();
 
-                       $readPipes = wfArrayFilterByKey( $pipes, function ( $fd ) use ( $desc ) {
+                       $readPipes = array_filter( $pipes, function ( $fd ) use ( $desc ) {
                                return $desc[$fd][0] === 'pipe' && $desc[$fd][1] === 'r';
-                       } );
-                       $writePipes = wfArrayFilterByKey( $pipes, function ( $fd ) use ( $desc ) {
+                       }, ARRAY_FILTER_USE_KEY );
+                       $writePipes = array_filter( $pipes, function ( $fd ) use ( $desc ) {
                                return $desc[$fd][0] === 'pipe' && $desc[$fd][1] === 'w';
-                       } );
+                       }, ARRAY_FILTER_USE_KEY );
                        // stream_select parameter names are from the POV of us being able to do the operation;
                        // proc_open desriptor types are from the POV of the process doing it.
                        // So $writePipes is passed as the $read parameter and $readPipes as $write.
index d5c889a..e94f3db 100644 (file)
@@ -265,6 +265,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                         $this->getUser()->isLoggedIn()
                ) {
                        $this->successfulAction();
+                       return;
                }
 
                // If logging in and not on HTTPS, either redirect to it or offer a link.
index 3db7eda..b657335 100644 (file)
@@ -166,7 +166,7 @@ class SpecialEditTags extends UnlistedSpecialPage {
                                [],
                                [
                                        'page' => $this->targetObj->getPrefixedText(),
-                                       'hide_tag_log' => '0',
+                                       'wpfilters' => [ 'tag' ],
                                ]
                        );
                        if ( !$this->targetObj->isSpecialPage() ) {
index d7ce414..9248a40 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup SpecialPage
  */
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Preferences\MultiUsernameFilter;
 
 /**
  * A special page that allows users to send e-mails to other users
@@ -247,8 +248,9 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                }
 
                if ( $sender !== null ) {
-                       $blacklist = $target->getOption( 'email-blacklist', [] );
+                       $blacklist = $target->getOption( 'email-blacklist', '' );
                        if ( $blacklist ) {
+                               $blacklist = MultiUsernameFilter::splitIds( $blacklist );
                                $lookup = CentralIdLookup::factory();
                                $senderId = $lookup->centralIdFromLocalUser( $sender );
                                if ( $senderId !== 0 && in_array( $senderId, $blacklist ) ) {
index a93b522..da2b688 100644 (file)
@@ -398,7 +398,10 @@ class SpecialNewpages extends IncludableSpecialPage {
 
                // Let extensions add data
                Hooks::run( 'NewPagesLineEnding', [ $this, &$ret, $result, &$classes, &$attribs ] );
-               $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] );
+               $attribs = array_filter( $attribs,
+                       [ Sanitizer::class, 'isReservedDataAttribute' ],
+                       ARRAY_FILTER_USE_KEY
+               );
 
                if ( count( $classes ) ) {
                        $attribs['class'] = implode( ' ', $classes );
index 13259c9..2cff90e 100644 (file)
@@ -194,6 +194,9 @@ class SpecialSearch extends SpecialPage {
                $request = $this->getRequest();
                list( $this->limit, $this->offset ) = $request->getLimitOffset( 20, '' );
                $this->mPrefix = $request->getVal( 'prefix', '' );
+               if ( $this->mPrefix !== '' ) {
+                       $this->setExtraParam( 'prefix', $this->mPrefix );
+               }
 
                $user = $this->getUser();
 
@@ -300,7 +303,6 @@ class SpecialSearch extends SpecialPage {
                $search->setLimitOffset( $this->limit, $this->offset );
                $search->setNamespaces( $this->namespaces );
                $search->prefix = $this->mPrefix;
-               $term = $search->transformSearchTerm( $term );
 
                Hooks::run( 'SpecialSearchSetupEngine', [ $this, $this->profile, $search ] );
                if ( !Hooks::run( 'SpecialSearchResultsPrepend', [ $this, $out, $term ] ) ) {
@@ -312,9 +314,20 @@ class SpecialSearch extends SpecialPage {
                $showSuggestion = $title === null || !$title->isKnown();
                $search->setShowSuggestion( $showSuggestion );
 
-               // fetch search results
+               $rewritten = $search->transformSearchTerm( $term );
+               if ( $rewritten !== $term ) {
+                       $term = $rewritten;
+                       wfDeprecated( 'SearchEngine::transformSearchTerm() (overridden by ' .
+                               get_class( $search ) . ')', '1.32' );
+               }
+
                $rewritten = $search->replacePrefixes( $term );
+               if ( $rewritten !== $term ) {
+                       wfDeprecated( 'SearchEngine::replacePrefixes() (overridden by ' .
+                                                 get_class( $search ) . ')', '1.32' );
+               }
 
+               // fetch search results
                $titleMatches = $search->searchTitle( $rewritten );
                $textMatches = $search->searchText( $rewritten );
 
@@ -531,6 +544,28 @@ class SpecialSearch extends SpecialPage {
                        );
                }
 
+               if ( $this->mPrefix !== '' ) {
+                       $subtitle = $this->msg( 'search-filter-title-prefix' )->plaintextParams( $this->mPrefix );
+                       $params = $this->powerSearchOptions();
+                       unset( $params['prefix'] );
+                       $params += [
+                               'search' => $term,
+                               'fulltext' => 1,
+                       ];
+
+                       $subtitle .= ' (';
+                       $subtitle .= Xml::element(
+                               'a',
+                               [
+                                       'href' => $this->getPageTitle()->getLocalURL( $params ),
+                                       'title' => $this->msg( 'search-filter-title-prefix-reset' ),
+                               ],
+                               $this->msg( 'search-filter-title-prefix-reset' )
+                       );
+                       $subtitle .= ')';
+                       $out->setSubtitle( $subtitle );
+               }
+
                $out->addJsConfigVars( [ 'searchTerm' => $term ] );
                $out->addModules( 'mediawiki.special.search' );
                $out->addModuleStyles( [
@@ -712,6 +747,18 @@ class SpecialSearch extends SpecialPage {
                $this->extraParams[$key] = $value;
        }
 
+       /**
+        * The prefix value send to Special:Search using the 'prefix' URI param
+        * It means that the user is willing to search for pages whose titles start with
+        * this prefix value.
+        * (Used by the InputBox extension)
+        *
+        * @return string
+        */
+       public function getPrefix() {
+               return $this->mPrefix;
+       }
+
        protected function getGroupName() {
                return 'pages';
        }
index 205364f..59fa948 100644 (file)
@@ -593,7 +593,10 @@ class ContribsPager extends RangeChronologicalPager {
 
                // Let extensions add data
                Hooks::run( 'ContributionsLineEnding', [ $this, &$ret, $row, &$classes, &$attribs ] );
-               $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] );
+               $attribs = array_filter( $attribs,
+                       [ Sanitizer::class, 'isReservedDataAttribute' ],
+                       ARRAY_FILTER_USE_KEY
+               );
 
                // TODO: Handle exceptions in the catch block above.  Do any extensions rely on
                // receiving empty rows?
index f261b72..ee7eb3e 100644 (file)
@@ -221,7 +221,10 @@ class DeletedContribsPager extends IndexPager {
 
                // Let extensions add data
                Hooks::run( 'DeletedContributionsLineEnding', [ $this, &$ret, $row, &$classes, &$attribs ] );
-               $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] );
+               $attribs = array_filter( $attribs,
+                       [ Sanitizer::class, 'isReservedDataAttribute' ],
+                       ARRAY_FILTER_USE_KEY
+               );
 
                if ( $classes === [] && $attribs === [] && $ret === '' ) {
                        wfDebug( "Dropping Special:DeletedContribution row that could not be formatted\n" );
index 39c0c1b..f65bae5 100644 (file)
@@ -240,7 +240,9 @@ class PasswordReset implements LoggerAwareInterface {
 
                $passwords = [];
                foreach ( $reqs as $req ) {
-                       $this->authManager->changeAuthenticationData( $req );
+                       // This is adding a new temporary password, not intentionally changing anything
+                       // (even though it might technically invalidate an old temporary password).
+                       $this->authManager->changeAuthenticationData( $req, /* $isAddition */ true );
                }
 
                $this->logger->info(
index ea8cd57..2ba01ff 100644 (file)
@@ -5507,12 +5507,6 @@ class User implements IDBAccessObject, UserIdentity {
                                }
                        }
 
-                       // Convert the email blacklist from a new line delimited string
-                       // to an array of ids.
-                       if ( isset( $data['email-blacklist'] ) && $data['email-blacklist'] ) {
-                               $data['email-blacklist'] = array_map( 'intval', explode( "\n", $data['email-blacklist'] ) );
-                       }
-
                        foreach ( $data as $property => $value ) {
                                $this->mOptionOverrides[$property] = $value;
                                $this->mOptions[$property] = $value;
@@ -5540,26 +5534,6 @@ class User implements IDBAccessObject, UserIdentity {
                // Not using getOptions(), to keep hidden preferences in database
                $saveOptions = $this->mOptions;
 
-               // Convert usernames to ids.
-               if ( isset( $this->mOptions['email-blacklist'] ) ) {
-                       if ( $this->mOptions['email-blacklist'] ) {
-                               $value = $this->mOptions['email-blacklist'];
-                               // Email Blacklist may be an array of ids or a string of new line
-                               // delimnated user names.
-                               if ( is_array( $value ) ) {
-                                       $ids = array_filter( $value, 'is_numeric' );
-                               } else {
-                                       $lookup = CentralIdLookup::factory();
-                                       $ids = $lookup->centralIdsFromNames( explode( "\n", $value ), $this );
-                               }
-                               $this->mOptions['email-blacklist'] = $ids;
-                               $saveOptions['email-blacklist'] = implode( "\n", $this->mOptions['email-blacklist'] );
-                       } else {
-                               // If the blacklist is empty, set it to null rather than an empty string.
-                               $this->mOptions['email-blacklist'] = null;
-                       }
-               }
-
                // Allow hooks to abort, for instance to save to a global profile.
                // Reset options to default state before saving.
                if ( !Hooks::run( 'UserSaveOptions', [ $this, &$saveOptions ] ) ) {
index e40ae29..2302177 100644 (file)
@@ -100,6 +100,10 @@ class SearchFormWidget {
 
                $html .= $layout;
 
+               if ( $this->specialSearch->getPrefix() !== '' ) {
+                       $html .= Html::hidden( 'prefix', $this->specialSearch->getPrefix() );
+               }
+
                if ( $totalResults > 0 && $offset < $totalResults ) {
                        $html .= Xml::tags(
                                'div',
index 9792095..7f04a68 100644 (file)
@@ -3413,32 +3413,26 @@ class Language {
         * Take a list of strings and build a locale-friendly comma-separated
         * list, using the local comma-separator message.
         * The last two strings are chained with an "and".
-        * NOTE: This function will only work with standard numeric array keys (0, 1, 2…)
         *
-        * @param string[] $l
+        * @param string[] $list
         * @return string
         */
-       function listToText( array $l ) {
-               $m = count( $l ) - 1;
-               if ( $m < 0 ) {
+       public function listToText( array $list ) {
+               $itemCount = count( $list );
+               if ( $itemCount < 1 ) {
                        return '';
                }
-               if ( $m > 0 ) {
+               $text = array_pop( $list );
+               if ( $itemCount > 1 ) {
                        $and = $this->msg( 'and' )->escaped();
                        $space = $this->msg( 'word-separator' )->escaped();
-                       if ( $m > 1 ) {
+                       $comma = '';
+                       if ( $itemCount > 2 ) {
                                $comma = $this->msg( 'comma-separator' )->escaped();
                        }
+                       $text = implode( $comma, $list ) . $and . $space . $text;
                }
-               $s = $l[$m];
-               for ( $i = $m - 1; $i >= 0; $i-- ) {
-                       if ( $i == $m - 1 ) {
-                               $s = $l[$i] . $and . $space . $s;
-                       } else {
-                               $s = $l[$i] . $comma . $s;
-                       }
-               }
-               return $s;
+               return $text;
        }
 
        /**
diff --git a/languages/data/README.md b/languages/data/README.md
new file mode 100644 (file)
index 0000000..8a13fdc
--- /dev/null
@@ -0,0 +1,7 @@
+## normalize-ar.phpc
+
+Generated by `maintenance/language/generateNormalizerDataAr.php`.
+
+## normalize-ml.php
+
+Generated by `maintenance/language/generateNormalizerDataMl.php`.
index c1daf20..f54b231 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// File created by maintenance/generateNormalizerDataAr.php
+// File created by generateNormalizerDataAr.php
 return [
        'ﭐ' => 'ٱ',
        'ﭑ' => 'ٱ',
index ca89a5a..1cf8548 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// File created by maintenance/generateNormalizerDataMl.php
+// File created by generateNormalizerDataMl.php
 return [
        'ണ്‍' => 'ൺ',
        'ന്‍' => 'ൻ',
index c6e0c38..744400a 100644 (file)
        "markedaspatrollederrornotify": "Merk as gekontroleerd het misluk.",
        "patrol-log-page": "Kontroleringslogboek",
        "patrol-log-header": "Die logboek wys weergawes wat as gekontroleer gemerk is.",
-       "log-show-hide-patrol": "Nasienlogboek $1",
        "confirm-markpatrolled-button": "OK",
        "deletedrevision": "Ou weergawe $1 geskrap",
        "filedeleteerror-short": "Fout met verwydering van lêer: $1",
index be9ce98..b00e768 100644 (file)
        "markedaspatrollederrornotify": "silusi tayza-mikibi mungangaw.",
        "patrol-log-page": "tayza mikibi nasulitan nazipa’an",
        "patrol-log-header": "uyniyan sa u tayza-mikibi masumaday baziyong a nasulitan-nazipa’an.",
-       "log-show-hide-patrol": "$1 tayza mikibi nasulitan nazipa’an",
-       "log-show-hide-tag": "$1 tazihan-paya nasulitan nazipa’an",
        "confirm-markpatrolled-button": "malucekay",
        "confirm-markpatrolled-top": "silusi $2 a sumad $3 ku tayza-mikibi?",
        "deletedrevision": "masipu malumanay misumad nu ayaway $1",
index b174021..0612ee9 100644 (file)
        "markedaspatrollederrortext": "የተመለከተ ሆኖ ለማሳለፍ አንድን ዕትም መወሰን አለብዎት።",
        "markedaspatrollederror-noautopatrol": "የራስዎን ለውጥ የተመለከተ ሆኖ ለማሳለፍ አይችሉም።",
        "patrol-log-page": "የማሳለፊያ መዝገብ",
-       "log-show-hide-patrol": "ማሳለፊያ መዝገቦች",
        "deletedrevision": "የቆየው ዕትም $1 አጠፋ",
        "filedeleteerror-short": "የፋይል ማጥፋት ስኅተት፦ $1",
        "filedeleteerror-long": "ፋይሉን በማጥፋት ስህተቶች ተነስተዋል፦\n\n$1",
index 0c3da7e..6e2147d 100644 (file)
        "markedaspatrollederror-noautopatrol": "No tiene premisos ta sinyalar os suyos propios cambios como controlatos.",
        "patrol-log-page": "Rechistro de control de revisions",
        "patrol-log-header": "Iste ye un rechistro de revisions patrullatas.",
-       "log-show-hide-patrol": "$1 o rechistro de patrullache",
        "deletedrevision": "S'ha borrato a versión antiga $1",
        "filedeleteerror-short": "Error borrando o fichero: $1",
        "filedeleteerror-long": "Se troboron errors borrando o fichero:\n\n$1",
index 8d12ba0..5f04e02 100644 (file)
        "diff-paragraph-moved-toold": "الفقرة تم نقلها. اضغط للذهاب للموقع القديم.",
        "difference-missing-revision": "{{PLURAL:$2|مراجعة واحدة|$2 مراجعات}} لهذا الفرق ($1) {{PLURAL:$2|لم|لم}} يتم إيجادها.\n\nهذا يحدث عادة عن طريق اتباع وصلة فرق قديمة لصفحة تم حذفها.\nالتفاصيل يمكن إيجادها في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
        "searchresults": "نتائج البحث",
+       "search-filter-title-prefix": "البحث فقط في الصفحات التي يبدأ عنوانها بـ \"$1\"",
+       "search-filter-title-prefix-reset": "البحث في جميع الصفحات",
        "searchresults-title": "نتائج البحث عن \"$1\"",
        "titlematches": "عنوان الصفحة يطابق",
        "textmatches": "نص الصفحة يطابق",
        "speciallogtitlelabel": "الهدف (عنوان أو {{ns:user}}:اسم المستخدم للمستخدم):",
        "log": "سجلات",
        "logeventslist-submit": "أظهر",
-       "logeventslist-more-filters": "المزيد من المرشحات:",
+       "logeventslist-more-filters": "إظهار السجلات الإضافية:",
+       "logeventslist-patrol-log": "سجل الخفر",
+       "logeventslist-tag-log": "سجل الوسم",
        "all-logs-page": "كل السجلات العامة",
        "alllogstext": "عرض شامل لكل السجلات المتوفرة في {{SITENAME}}.\nباستطاعتك جعل القائمة أكثر تحديداً، وذلك باختيار نوع السجل واسم المستخدم (حساس لحالة الحروف)، أو الصفحة المتأثرة (أيضاً حساس لحالة الحروف).",
        "logempty": "لا توجد مدخلات مطابقة في السجل.",
        "uctop": "(حالية)",
        "month": "من شهر (وأقدم):",
        "year": "من سنة (وأقدم):",
+       "date": "من تاريخ (وأقدم).",
        "sp-contributions-newbies": "اعرض مساهمات الحسابات الجديدة فقط",
        "sp-contributions-newbies-sub": "للحسابات الجديدة",
        "sp-contributions-newbies-title": "مساهمات المستخدم للحسابات الجديدة",
        "markedaspatrollederrornotify": "لم ينجح وسم هذه النسخة بأنها مراجعة",
        "patrol-log-page": "سجل الخفر",
        "patrol-log-header": "هذا سجل بالمراجعات المراجعة.",
-       "log-show-hide-patrol": "$1 سجل الخفر",
-       "log-show-hide-tag": "$1 سجل الوسوم",
        "confirm-markpatrolled-button": "موافق",
        "confirm-markpatrolled-top": "علم على المراجعة $3 من $2 كمراجعة؟",
        "deletedrevision": "حذف المراجعة القديمة $1",
index 5e2e307..9c910c2 100644 (file)
        "markedaspatrollednotify": "ܫܘܚܠܦܐ ܗܢܐ ܥܠ $1 ܐܫܬܘܕܥ ܐܝܟ ܟܪܝܟܐ.",
        "markedaspatrollederrornotify": "ܠܐ ܐܬܢܨܚ ܫܘܘܕܥܐ ܐܝܟ ܟܪܝܟܬܐ",
        "patrol-log-page": "ܣܓܠܐ ܕܟܪܟܐ",
-       "log-show-hide-patrol": "$1 ܣܓܠܐ ܕܟܪܟܐ",
        "filedeleteerror-short": "ܦܘܕܐ ܒܫܝܦܐ ܕܠܦܦܐ: $1",
        "filedeleteerror-long": "ܦܘܕ̈ܐ ܐܫܟܚܬ ܟܕ ܫܝܦܐ ܠܦܦܐ:\n\n$1",
        "previousdiff": "← ܫܘܚܠܦܐ ܕܩܕܡ",
index fb7eec7..135dca5 100644 (file)
        "pageinfo-authors": "ĝadad l-mo'llifin l-mĥṫalfin",
        "pageinfo-toolboxlink": "معلومات على الصفحة",
        "markaspatrolleddiff": "marki kamorajaaa",
-       "log-show-hide-patrol": "$1 sijjil lkhafr",
        "previousdiff": "Ṫ-Ṫeĝdil li mbeĝd",
        "nextdiff": "Ṫ-Ṫeĝdila li mbeĝd",
        "thumbsize": "ḫajm l-miniatur:",
index 9152090..b1f5f84 100644 (file)
        "markedaspatrollederror-noautopatrol": "مش مسموح ليك تعلم على تغييراتك الشخصية كأنها متراجعة.",
        "patrol-log-page": "سجل المراجعة",
        "patrol-log-header": "دا سجل بالنسخ المتراجعة",
-       "log-show-hide-patrol": "$1 سجل المراجعة",
        "deletedrevision": "مسح النسخة القديمة $1",
        "filedeleteerror-short": "غلط مسح الملف: $1",
        "filedeleteerror-long": "حصلت غلطات و الملف دا بيتمسح :\n\n$1",
index 7158a62..fead6f8 100644 (file)
        "markedaspatrollederrornotify": "নিৰীক্ষণবিহীন ৰূপে চিহ্নিত কৰা হ’ল",
        "patrol-log-page": "নিৰীক্ষণ অভিলেখ",
        "patrol-log-header": "এইখন নিৰীক্ষিত সংশোধনসমূহৰ অভিলেখ ।",
-       "log-show-hide-patrol": "নিৰীক্ষণ অভিলেখ $1",
        "deletedrevision": "পুৰণি সংশোধনী $1 বিলোপ কৰা হ’ল",
        "filedeleteerror-short": "নথি বিলোপ কৰাত ত্ৰুটি: $1",
        "filedeleteerror-long": "এই নথিখন বিলোপ কৰাত সমস্যা হৈছে :\n\n$1",
index 1017e86..382ce27 100644 (file)
        "tooltip-summary": "M535x523S14c50508x492S14c58469x492S22520503x477S22520465x477 M529x528S11541487x496S11549471x501S20e00503x488S26507516x473 M554x523S14c40530x476S14c48446x492S26502515x489S26516468x507S20340495x489S20348487x506",
        "patrol-log-page": "M518x560S2035a492x545S10e50501x522S31500482x483 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
        "patrol-log-header": "M508x525S10004493x475S22a04494x510 M518x560S2035a492x545S10e50501x522S31500482x483 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
-       "log-show-hide-tag": "$1 M519x514S15a28482x487S11502489x498 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
        "filedeleteerror-short": "M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M520x523S14c19480x496S15a01497x497S20710483x477 M518x526S2ff00482x483S19a00487x506 S38700463x496 $1",
        "ilsubmit": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
        "metadata": "M520x523S14c19480x496S15a01497x497S20710483x477 M538x522S18517516x486S1851f461x495S2ff00482x483S14c00513x436S14c08461x445S26a00511x469S26a10459x478",
index 2b65a07..d49e1c5 100644 (file)
        "delete-hook-aborted": "Desaniciu albortáu pol enganche.\nNun conseñó esplicación.",
        "no-null-revision": "Nun pudo crease una nueva revisión nula pa la páxina «$1»",
        "badtitle": "Títulu incorreutu",
-       "badtitletext": "El títulu de páxina solicitáu nun ye válidu, ta baleru o tien enllaces interllingua o interwiki incorreutos.\nPue contener un caráuter o más que nun puen usase nos títulos.",
+       "badtitletext": "El títulu de páxina solicitáu nun ye válidu, ta vacíu o tien enllaces interllingua o interwiki incorreutos.\nPuede contener un caráuter o más que nun pueden usase nos títulos.",
        "title-invalid-empty": "El títulu de páxina solicitáu ta baleru o sólo contien el nome d'un espaciu de nomes.",
        "title-invalid-utf8": "El títulu de páxina solicitáu contien una secuencia UTF-8 inválida.",
        "title-invalid-interwiki": "El títulu de páxina solicitáu contien un enllaz interwiki que nun puede usase nos títulos.",
        "viewsource": "Ver fonte",
        "viewsource-title": "Ver la fonte de $1",
        "actionthrottled": "Aición llendada",
-       "actionthrottledtext": "Como midida escontra abusos, nun se pué repetir esta aición munches vegaes en pocu tiempu, y trespasasti esa llende.\nVuelve a intentalo n'unos minutos.",
+       "actionthrottledtext": "Como midida escontra abusos, nun puedes repetir esta aición munches vegaes en pocu tiempu, y trespasasti esa llende.\nVuelve a tentalo en dellos minutos.",
        "protectedpagetext": "Esta páxina ta candada pa torgar ediciones y otres aiciones.",
        "viewsourcetext": "Pues ver y copiar la fonte d'esta páxina.",
        "viewyourtext": "Pues ver y copiar la fonte de <strong>les tos ediciones</strong> d'esta páxina.",
        "newarticletext": "Siguisti un enllaz a un artículu qu'inda nun esiste.\nPa crear la páxina, empecipia a escribir nel cuadru d'embaxo (mira la [$1 páxina d'ayuda] pa más información).\nSi llegasti equí por enquivocu, calca nel botón <strong>atrás</strong> del to restolador.",
        "anontalkpagetext": "----\n''Esta ye la páxina d'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.''\nPola mor d'ello ha usase la direición numbérica IP pa identificalu/la.\nTala IP pue compartise por varios usuarios.\nSi yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:CreateAccount|crea una cuenta]] o [[Special:UserLogin|anicia sesiín]] pa torgar futures confusiones con otros usuarios anónimos.",
        "noarticletext": "Nestos momentos nun hai testu nesta páxina.\nPuedes [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n'otres páxines,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear esta páxina]</span>.",
-       "noarticletext-nopermission": "Nestos momentos nun hai testu nesta páxina.\nPue [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n'otres páxines o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos]</span>, pero nun tiene permisu pa crear esta páxina.",
+       "noarticletext-nopermission": "Nestos momentos nun hai testu nesta páxina.\nPuedes [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n'otres páxines o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos]</span>, pero nun tienes permisu pa crear esta páxina.",
        "missing-revision": "La revisión #$1 de la páxina llamada \"{{FULLPAGENAME}}\" nun esiste.\n\nDe vezu la causa d'esto ye siguir un enllaz antiguu del historial a una páxina que se desanició.\nSe puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistru de desanicios].",
        "userpage-userdoesnotexist": "La cuenta d'usuariu «$1» nun ta rexistrada.\nPor favor comprueba si quies crear/editar esta páxina.",
        "userpage-userdoesnotexist-view": "La cuenta d'usuariu «$1» nun ta rexistrada.",
        "yourdiff": "Diferencies",
        "copyrightwarning": "Por favor, ten en cuenta que toles collaboraciones de {{SITENAME}} considérense espublizaes baxo la $2 (ver $1 pa más detalles). Si nun quies que'l to trabayu s'edite ensin midida y se distribuya al debalu, nun lu pongas equí.<br />\nAmás tas prometiéndonos qu'escribisti esto tu mesmu, o que lo copiasti d'una fonte llibre, de dominiu públicu o asemeyada.\n<strong>¡Nun unvies obres con drechos d'autor ensin permisu!</strong>",
        "copyrightwarning2": "Por favor, ten en cuenta que toles contribuciones de {{SITENAME}} se puen editar, alterar o desaniciar por otros usuarios. Si nun quies que'l to trabayu s'edite ensin midida, nun lu pongas equí.<br />\nAmás tas dexándonos afitao qu'escribisti esto tu mesmu, o que lo copiasti d'una fonte llibre de dominiu públicu o asemeyao (ver $1 pa más detalles).\n'''¡Nun pongas trabayos con drechos d'autor ensin permisu!'''",
-       "editpage-cannot-use-custom-model": "El modelu de conteníu d'esta páxina nun pue cambiase.",
+       "editpage-cannot-use-custom-model": "El modelu de conteníu d'esta páxina nun puede cambiase.",
        "longpageerror": "'''ERROR: El testu qu'unviasti tien {{PLURAL:$1|un quilobyte|$1 quilobytes}}, que pasa del máximu de {{PLURAL:$2|un quilobyte|$2 quilobytes}}.'''\nNun se pue grabar.",
        "readonlywarning": "<strong>Avisu: La base de datos ta candada por mantenimientu, polo que nun vas poder guardar les tos ediciones nestos momentos.</strong>\nSeique habríes copiar y apegar el testu nun ficheru de testu y guardalu pa intentalo sero.\n\nL'alministrador del sistema que la candó dio esta esplicación: $1",
        "protectedpagewarning": "'''Avisu: Esta páxina ta candada pa que sólo los alministradores puean editala.'''\nLa cabera entrada del rexistru s'ufre darréu pa referencia:",
        "powersearch-togglenone": "Dengún",
        "powersearch-remember": "Recordar la seleición pa guetes futures",
        "search-external": "Busca esterna",
-       "searchdisabled": "La busca en {{SITENAME}} ta desactivada. Mentanto, pues buscar en Google.\nHas fixate en que'l conteníu de los sos índices de {{SITENAME}} pué tar desfasáu.",
+       "searchdisabled": "La busca en {{SITENAME}} ta desactivada. Mentanto, puedes buscar en Google.\nRepara en que'l conteníu de los sos índices de {{SITENAME}} puede tar desfasáu.",
        "search-error": "Hebo un error al buscar: $1",
        "search-warning": "Hebo un avisu al buscar: $1",
        "preferences": "Preferencies",
        "upload-form-label-not-own-work-local-generic-local": "Quiciabes tamién quieras tentar [[Special:Upload|la páxina de cargues predeterminada]].",
        "upload-form-label-own-work-message-generic-foreign": "Entiendo que toi xubiendo esti ficheru a un depósitu compartíu. Confirmo que toi faciéndolo cumpliendo les condiciones de serviciu y les polítiques de llicencies d'esi sitiu.",
        "upload-form-label-not-own-work-message-generic-foreign": "Si nun puedes xubir esti ficheru baxo les polítiques del depósitu compartíu, zarra esti diálogu y tenta otru métodu.",
-       "upload-form-label-not-own-work-local-generic-foreign": "Tamién pué interesate usar [[Special:Upload|la páxina de carga de {{SITENAME}}]] si esti ficheru pué xubise allí baxo les sos polítiques.",
+       "upload-form-label-not-own-work-local-generic-foreign": "Tamién puedes tentar usar [[Special:Upload|la páxina de carga de {{SITENAME}}]], si esti ficheru puede xubise allí baxo les sos polítiques.",
        "backend-fail-stream": "Nun se pudo tresmitir el ficheru $1.",
        "backend-fail-backup": "Nun se pudo facer copia de seguridá del ficheru $1.",
        "backend-fail-notexists": "El ficheru $1 nun esiste.",
        "listgrouprights-namespaceprotection-namespace": "Espaciu de nomes",
        "listgrouprights-namespaceprotection-restrictedto": "Permisu(os) d'edición del usuariu",
        "listgrants": "Permisos",
-       "listgrants-summary": "Esta ye la llista d'autorizaciones colos accesos asociaos a los permisos de usuario. los usuarios puen autorizar a les aplicaciones qu'usen la so cuenta, pero con permisos llendaos basándose nos permisos que'l usuariu diera a l'aplicación. Sicasí, una aplicación qu'actua nel nome d'un usuariu nun pué usar realmente permisos que nun tenga'l propiu usuariu.\nPué haber [[{{MediaWiki:Listgrouprights-helppage}}|más información]] tocante a los permisos individuales.",
+       "listgrants-summary": "Esta ye la llista d'autorizaciones colos accesos asociaos a los permisos d'usuariu. Los usuarios pueden autorizar que les aplicaciones usen la so cuenta, pero con permisos llendaos basándose nos permisos que'l usuariu diera a l'aplicación. Sicasí, una aplicación qu'actua nel nome d'un usuariu nun puede usar realmente permisos que nun tenga'l propiu usuariu.\nPuede haber [[{{MediaWiki:Listgrouprights-helppage}}|más información]] tocante a los permisos individuales.",
        "listgrants-grant": "Permisu",
        "listgrants-rights": "Permisos",
        "trackingcategories": "Categoríes de siguimientu",
        "changecontentmodel-cannot-convert": "El conteníu de [[:$1]] nun puede convertise a un tipu de $2.",
        "changecontentmodel-nodirectediting": "El modelu de conteníu $1 nun tien encontu pa edición direuta",
        "changecontentmodel-emptymodels-title": "Nun hai modelos de conteníu disponibles",
-       "changecontentmodel-emptymodels-text": "El conteníu de [[:$1]] nun pue convertise a nengún tipu.",
+       "changecontentmodel-emptymodels-text": "El conteníu de [[:$1]] nun puede convertise a nengún tipu.",
        "log-name-contentmodel": "Rexistru de cambios del modelu de conteníu",
        "log-description-contentmodel": "Esta páxina recueye los cambeos nel modelu de conteníu de les páxines, y les páxines creaes con un modelu de conteníu distintu del predetermináu.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|creó}} la páxina $3 usando un modelu de conteníu non predetermináu «$5»",
        "tooltip-ca-nstab-main": "Ver la páxina de conteníu",
        "tooltip-ca-nstab-user": "Ver la páxina d'usuariu",
        "tooltip-ca-nstab-media": "Ver la páxina de multimedia",
-       "tooltip-ca-nstab-special": "Esta ye una páxina especial y nun pué editase",
+       "tooltip-ca-nstab-special": "Esta ye una páxina especial que nun puede editase",
        "tooltip-ca-nstab-project": "Vera la páxina de proyeutu",
        "tooltip-ca-nstab-image": "Ver la páxina del ficheru",
        "tooltip-ca-nstab-mediawiki": "Ver el mensaxe del sistema",
        "markedaspatrollederrornotify": "Falló l'aición de marcar como revisáu.",
        "patrol-log-page": "Rexistru de supervisión",
        "patrol-log-header": "Esti ye un rexistru de les revisiones supervisaes.",
-       "log-show-hide-patrol": "$1 rexistru de supervisión",
-       "log-show-hide-tag": "$1 rexistru d'etiquetes",
        "confirm-markpatrolled-button": "Aceutar",
        "confirm-markpatrolled-top": "¿Marcar la revisión $3 de $2 como patrullada?",
        "deletedrevision": "Desaniciada la revisión antigua $1",
        "permanentlink-submit": "Dir a la revisión",
        "dberr-problems": "¡Sentímoslo! Esti sitiu ta esperimentando dificultaes téuniques.",
        "dberr-again": "Tenta esperar dellos minutos y recargar.",
-       "dberr-info": "(Nun se pue entrar na base de datos: $1)",
-       "dberr-info-hidden": "(Nun se pue entrar na base de datos)",
+       "dberr-info": "(Nun hai accesu a la base de datos: $1)",
+       "dberr-info-hidden": "(Nun hai accesu a la base de datos)",
        "dberr-usegoogle": "Pue probar a buscar con Google mentanto.",
        "dberr-outofdate": "Atalanta que los sos índices del nuesu conteníu seique nun tean actualizaos.",
        "dberr-cachederror": "Esta ye una copia na caché de la páxina que se pidiera, y pue que nun tea actualizada.",
index 48d79d2..dde8033 100644 (file)
        "markedaspatrollederrornotify": "जाँचा हुआ चिन्हित करना असफल रहा।",
        "patrol-log-page": "परीक्षण लॉग",
        "patrol-log-header": "यह परीक्षित अवतरणों की लॉग है।",
-       "log-show-hide-patrol": "परीक्षण लॉग $1",
-       "log-show-hide-tag": "$1 चिप्पी लग",
        "deletedrevision": "पुरान अवतरण $1 हटाय दिहा गा है",
        "filedeleteerror-short": "फ़ाईल हटावै मा समस्या: $1",
        "filedeleteerror-long": "फ़ाइल हटावै में आवा गल्ती:\n\n$1",
index 6cef2fb..f567f5d 100644 (file)
        "markedaspatrollednotify": "\"$1\" səhifəsindəki bu redaktə patrullanmış kimi işarələndi.",
        "patrol-log-page": "Patrul gündəliyi",
        "patrol-log-header": "Bu yoxlanmış dəyişikliklərin gündəliyidir.",
-       "log-show-hide-patrol": "$1 patrul gündəliyi",
        "deletedrevision": "Köhnə versiyaları silindi $1.",
        "filedeleteerror-short": "Fayl silinərkən xəta: $1",
        "filedeleteerror-long": "Fayl silinərkən üzə çıxan xətalar:\n\n$1",
index d3aeeb5..f3b60a1 100644 (file)
        "markedaspatrollederrornotify": "دولانماق برچسبی مووفقیت سیز اولدو",
        "patrol-log-page": "دولانما ژورنالی",
        "patrol-log-header": "بو یوخلانمیش دییشیک‌لیک‌لرین ژورنالی‌دیر.",
-       "log-show-hide-patrol": "$1 دولانما ژورنالی",
-       "log-show-hide-tag": "اِتیکت ژورنالی $1",
        "deletedrevision": "کؤهنه نوسخه لری سیلیندی $1.",
        "filedeleteerror-short": "فایل سیلینرکن ختا: $1",
        "filedeleteerror-long": "فایل سیلینرکن اوزه چیخان ختا‌لار:\n\n$1",
index 8a24243..79b9215 100644 (file)
        "markedaspatrollederrornotify": "Патрулләнгән тип билдәләү уңышһыҙ тамамланды.",
        "patrol-log-page": "Тикшереү яҙмалары журналы",
        "patrol-log-header": "Был — тикшерелгән өлгөләр яҙмалары журналы.",
-       "log-show-hide-patrol": "тикшереү яҙмалары журналын $1",
-       "log-show-hide-tag": "$1 билдәләр журналы",
        "confirm-markpatrolled-button": "Яҡшы",
        "confirm-markpatrolled-top": "$2 битенең $3 версияһын тикшерелгән тип һанарғамы?",
        "deletedrevision": "Иҫке $1 өлгөһө юйылды",
index bd8bac4..e0e4805 100644 (file)
        "markedaspatrollederror-noautopatrol": "شما را اجازت نیست وتی تغییراتء په عنوان نظارت بیتگین نشان کنیت.",
        "patrol-log-page": "آمار نظارت",
        "patrol-log-header": "شی آماری چه بازبینی آن گشتی انت.",
-       "log-show-hide-patrol": "$1  آمار گشت",
        "deletedrevision": "قدیمی بازبینی $1 حذف بوت",
        "filedeleteerror-short": "حطا حذف فایل: $1",
        "filedeleteerror-long": "حطای پیش آتک وهدی که فایل حذف بیگت:\n\n$1",
index ca68364..2913aa2 100644 (file)
        "markedaspatrollederrornotify": "Pagmamarka bilang patrolyado na nagpalya.",
        "patrol-log-page": "Laóg kan Pigpapatrolya",
        "patrol-log-header": "Ini an sarong talaan kan patrolyadong mga rebisyon.",
-       "log-show-hide-patrol": "$1 talaan sa patrolya",
        "deletedrevision": "Pigparâ an lumang pagribay na $1.",
        "filedeleteerror-short": "Salâ sa pagparà kan dokumento: $1",
        "filedeleteerror-long": "May mga nasabat na salâ mientras na pigpaparâ an ''file'':\n\n$1",
index 9f6cbda..43ef443 100644 (file)
        "diff-paragraph-moved-toold": "Параграф быў перанесены. Націсьніце, каб перайсьці ў першапачатковае месца.",
        "difference-missing-revision": "{{PLURAL:$2|$2 вэрсія|$2 вэрсіі|$2 вэрсіяў}} з гэтымі адрозьненьнямі ($1) {{PLURAL:$2|не была|не былі}} знойдзеныя.\n\nЗвычайна гэта здараецца з-за пераходу па састарэлай спасылцы на старонку, якая была выдаленая.\nПадрабязнасьці можна знайсьці ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
        "searchresults": "Вынікі пошуку",
+       "search-filter-title-prefix": "Шукаем толькі на старонках, назвы якіх пачынаюцца з «$1»",
+       "search-filter-title-prefix-reset": "Шукаць сярод усіх старонак",
        "searchresults-title": "Вынікі пошуку для «$1»",
        "titlematches": "Супадзеньні ў назвах старонак",
        "textmatches": "Супадзеньні ў тэкстах старонак",
        "uploadvirus": "Файл утрымлівае вірус! Падрабязнасьці: $1",
        "uploadjava": "Файл зьяўляецца ZIP-архівам, які зьмяшчае .class-файл Java.\nЗагрузка Java-файлаў забароненая, бо яны могуць быць прычынай абыходу абмежаваньняў бясьпекі.",
        "upload-source": "Крынічны файл",
-       "sourcefilename": "Пачатковая назва файла:",
+       "sourcefilename": "Пачатковая назва файлу:",
        "sourceurl": "URL-адрас крыніцы:",
        "destfilename": "Канчатковая назва файла:",
        "upload-maxfilesize": "Максымальны памер файла: $1",
        "speciallogtitlelabel": "Мэта (назва ці {{ns:user}}:імя_ўдзельніка для ўдзельніка):",
        "log": "Журналы падзеяў",
        "logeventslist-submit": "Паказаць",
-       "logeventslist-more-filters": "Ð\91олей Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80аÑ\9e:",
+       "logeventslist-more-filters": "Ð\9fаказаÑ\86Ñ\8c Ð´Ð°Ð´Ð°Ñ\82ковÑ\8bÑ\8f Ð¶Ñ\83Ñ\80налÑ\8b:",
        "logeventslist-patrol-log": "Журнал патруляваньня",
        "logeventslist-tag-log": "Журнал метак",
        "all-logs-page": "Усе публічныя журналы падзеяў",
        "markedaspatrollederrornotify": "Не атрымалася адпатруляваць старонку.",
        "patrol-log-page": "Журнал патруляваньняў",
        "patrol-log-header": "Гэта журнал патруляваных вэрсіяў.",
-       "log-show-hide-patrol": "$1 журнал патруляваньняў",
-       "log-show-hide-tag": "$1 журнал метак",
        "confirm-markpatrolled-button": "Добра",
        "confirm-markpatrolled-top": "Пазначыць вэрсію $3 старонкі $2 як патруляваную?",
        "deletedrevision": "Выдаленая старая вэрсія $1",
index 2277444..3d04e0e 100644 (file)
        "markedaspatrollederrornotify": "Не ўдалося пазначыць як ухваленую.",
        "patrol-log-page": "Журнал ухваленых",
        "patrol-log-header": "Журнал ухваленых версій",
-       "log-show-hide-patrol": "$1 журнал ухваленняў",
-       "log-show-hide-tag": "$1 журнал бірак",
        "confirm-markpatrolled-button": "Добра",
        "confirm-markpatrolled-top": "Пазначыць версію $3 старонкі $2 як патруляваную?",
        "deletedrevision": "Сцёрта старая версія $1",
index 480f28c..c6a539c 100644 (file)
        "rcfilters-other-review-tools": "Други инструменти за проверка",
        "rcfilters-group-results-by-page": "Групиране на резултатите по страница",
        "rcfilters-activefilters": "Активни филтри",
+       "rcfilters-activefilters-hide": "Скриване",
        "rcfilters-advancedfilters": "Разширени филтри",
        "rcfilters-limit-title": "Резултати за показване",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|промяна|промени}}, $2",
        "rcfilters-filter-humans-label": "Човек (не бот)",
        "rcfilters-filter-humans-description": "Редакции, направени от редактори.",
        "rcfilters-filtergroup-reviewstatus": "Проверка на статуса",
-       "rcfilters-filter-reviewstatus-unpatrolled-label": "Ð\9dепаÑ\82Ñ\80Ñ\83лиÑ\80ано",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Ð\9dепаÑ\82Ñ\80Ñ\83лиÑ\80ани",
        "rcfilters-filter-reviewstatus-manual-label": "Ръчно патрулирани",
        "rcfilters-filter-reviewstatus-auto-label": "Автоматично патрулирани",
        "rcfilters-filtergroup-significance": "Значимост",
        "rcfilters-filter-watchlist-notwatched-label": "Извън списъка за наблюдение",
        "rcfilters-filter-watchlist-notwatched-description": "Всички, освен промените в страници от списъка за наблюдение.",
        "rcfilters-filtergroup-watchlistactivity": "Активност по списъка за наблюдение",
-       "rcfilters-filter-watchlistactivity-unseen-label": "Невидяни промени",
+       "rcfilters-filter-watchlistactivity-unseen-label": "Невидeни промени",
        "rcfilters-filter-watchlistactivity-unseen-description": "Промени по страници, които не сте посетили откакто са настъпили промените.",
        "rcfilters-filter-watchlistactivity-seen-label": "Видени промени",
        "rcfilters-filter-watchlistactivity-seen-description": "Промени по страници, които сте посетили откакто са настъпили промените.",
        "dellogpage": "Дневник на изтриванията",
        "dellogpagetext": "Списък на последните изтривания.",
        "deletionlog": "дневник на изтриванията",
+       "log-name-create": "Дневник на създадените страници",
+       "log-description-create": "По-долу е показан списък на последно създадените страници.",
        "logentry-create-create": "$1 {{GENDER:$2|създаде}} страница $3",
        "reverted": "Възвръщане към предишна версия",
        "deletecomment": "Причина:",
        "markedaspatrollederrornotify": "Неуспешно отбелязване на редакция като патрулирана.",
        "patrol-log-page": "Дневник на патрула",
        "patrol-log-header": "Тази страница съдържа дневник на проверените версии.",
-       "log-show-hide-patrol": "$1 на дневника на патрула",
-       "log-show-hide-tag": "$1 на дневника на отбелязванията",
        "confirm-markpatrolled-button": "Добре",
        "confirm-markpatrolled-top": "Маркиране на редакция $3 на $2 като патрулирана?",
        "deletedrevision": "Изтрита стара версия $1",
        "tag-filter-submit": "Филтриране",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Етикет|Етикети}}]]: $2)",
        "tag-mw-contentmodelchange": "промяна на модела на съдържание",
+       "tag-mw-new-redirect": "Ново пренасочване",
+       "tag-mw-removed-redirect": "Премахнато пренасочване",
+       "tag-mw-blank": "Изтриване на съдържанието",
+       "tag-mw-replace": "Заменено",
        "tag-mw-rollback": "Отмяна",
        "tag-mw-undo": "Отмяна",
        "tags-title": "Етикети",
index b9500ab..4d9537c 100644 (file)
        "markedaspatrollederrornotify": "گشت وارته ئی برچسپ جتین ناکام ات.",
        "patrol-log-page": "گشتئ سیاه چال",
        "patrol-log-header": "ای سیاهه شه گشت وارته ئین ایڈیٹ ئان است.",
-       "log-show-hide-patrol": "$1 گشت جنوکین سیاهه",
-       "log-show-hide-tag": "$1 خالیجای ٹاپه",
        "deletedrevision": "$1 قدیمی پاک بوته ئین نخسه ئی است",
        "filedeleteerror-short": "خطا بئ فایلی پاک کورتین: $1",
        "filedeleteerror-long": "بی پدا  پاک کورتین ئی وختا خطا رخ دات:\n\n$1",
index f6da61e..d677a0b 100644 (file)
        "markedaspatrollederrornotify": "Manandai sabagai paitihan nang gagal.",
        "patrol-log-page": "Log pa-awasan",
        "patrol-log-header": "Ngini adalah sabuah log matan raralatan nang ta-awasi.",
-       "log-show-hide-patrol": "$1 log pa-awasan",
        "deletedrevision": "Raralatan lawas tahapus: $1",
        "filedeleteerror-short": "Kasalahan mahapus barakas: $1",
        "filedeleteerror-long": "Kasalahan tarikin parhatan mahapus barakas:\n\n$1",
index 5f5e085..6b86915 100644 (file)
        "actionthrottled": "কাজের গতি ধীরকরণ",
        "actionthrottledtext": "অপব্যবহার প্রতিরোধক সমাধান হিসেবে এই কাজটি খুব কম সময়ে অনেক বেশিবার সম্পাদন করার উপর সীমা বেঁধে দেওয়া হয়েছে, এবং আপনি সেই সীমা অতিক্রম করেছেন।\nঅনুগ্রহ করে কয়েক মিনিট পরে আবার চেষ্টা করুন।",
        "protectedpagetext": "সম্পাদনা অথবা অন্যান্য কাজে বাধা দিতে এই পাতাটিকে সুরক্ষিত করা হয়েছে।",
-       "viewsourcetext": "à¦\8f à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\86পনি দেখতে এবং উৎসের প্রতিলিপি করতে পারবেন।",
+       "viewsourcetext": "à¦\86পনি à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি দেখতে এবং উৎসের প্রতিলিপি করতে পারবেন।",
        "viewyourtext": "আপনি এই পাতায় করা <strong>আপনার সম্পাদনাগুলি</strong> দেখতে এবং প্রতিলিপি করতে পারেন।",
        "protectedinterface": "এই পাতার বিষয়বস্তু এই উইকি সফটওয়্যারের একটি ইন্টারফেস বার্তা প্রদান করে, তাই এটি যাতে অপব্যবহারে না করা হয়, সেজন্য এটিকে সুরক্ষিত করে রাখা হয়েছে।\nসকল উইকির অনুবাদে কোনো ধরনের সংযোজন বা পরিবর্তন করতে অনুগ্রহ করে মিডিয়াউইকি স্থানীয়করণ প্রকল্প [https://translatewiki.net/ translatewiki.net] ব্যবহার করুন।",
        "editinginterface": "<strong>সতর্ক বার্তা:</strong> আপনি এমন একটি পাতা সম্পাদনা করছেন যা সফটওয়্যারের জন্য ইন্টারফেস লেখা সরবরাহ করে।\nএই পাতাতে সংঘটিত পরিবর্তন এই উইকির অন্যান্য ব্যবহারকারীদের জন্য দৃশ্যমান ইন্টারফেসে প্রভাব ফেলবে।",
        "postedit-confirmation-published": "আপনার সম্পাদনা প্রকাশিত হয়েছে।",
        "edit-already-exists": "নতুন পাতা সৃষ্টি করা যায়নি।\nপাতাটি ইতিমধ্যেই বিদ্যমান।",
        "defaultmessagetext": "আদি টেক্সট",
-       "content-failed-to-parse": "$1 à¦®à¦¡à§\87লà§\87র à¦\9cনà§\8dয $2 à¦\95নà§\8dà¦\9fà§\87নà§\8dà¦\9f à¦ªà¦¾à¦°à§\8dস à¦\95রা à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾: $3",
+       "content-failed-to-parse": "$1 à¦®à¦¡à§\87লà§\87র à¦\9cনà§\8dয $2 à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦ªà¦¾à¦°à§\8dস à¦\95রতà§\87 à¦¬à§\8dযরà§\8dথ à¦¹à¦¯à¦¼à§\87à¦\9bà§\87: $3",
        "invalid-content-data": "ভুল কন্টেন্ট ডাটা",
-       "content-not-allowed-here": "\"$1\" à¦\95নà§\8dà¦\9fà§\87নà§\8dà¦\9fà¦\9fি [[$2]] পাতায় অনুমোদিত নয়",
+       "content-not-allowed-here": "\"$1\" à¦¸à¦¾à¦®à¦\97à§\8dরà§\80 [[$2]] পাতায় অনুমোদিত নয়",
        "editwarning-warning": "এই পাতাটি ত্যাগ করলে আপনার আপনার করা পরিবর্তনগুলো হারিয়ে যেতে পারে।\nআপনি যদি প্রবেশ করা থাকেন, আপনি এই সতর্কীকরণ বার্তাটি আপনার পছন্দের \"সম্পাদনা\" অনুচ্ছেদ থেকে নিস্ক্রিয় করতে পারেন।",
        "editpage-invalidcontentmodel-title": "বিষয়বস্তু মডেল সমর্থিত নয়",
        "editpage-invalidcontentmodel-text": "এই \"$1\" বিষয়বস্তু মডেলটি অসমর্থিত।",
        "editpage-notsupportedcontentformat-title": "উল্লেখিত পদ্ধতি সমর্থনযোগ্য নয়।",
        "editpage-notsupportedcontentformat-text": "$1 লেখার ফরম্যাট, $2 কন্টেন্ট মডেলের উপযোগী নয়।",
-       "content-model-wikitext": "à¦\89à¦\87à¦\95িà¦\9fà§\87à¦\95à§\8dসà¦\9f",
+       "content-model-wikitext": "à¦\89à¦\87à¦\95িপাঠà§\8dয",
        "content-model-text": "সাধারণ লেখা",
        "content-model-javascript": "জাভাস্ক্রিপ্ট",
        "content-model-css": "সিএসএস",
        "diff-paragraph-moved-toold": "অনুচ্ছেদ স্থানান্তর করা হয়েছে। পুরনো অবস্থানে যাওয়ার জন্য ক্লিক করুন।",
        "difference-missing-revision": "এই পার্থক্যের ($1) অন্তর্গত {{PLURAL:$2|একটি সংশোধিত সংস্করণ|$2টি সংশোধিত সংস্করণ}} খুঁজে পাওয়া যাচ্ছে না।\n\nসাধারণত মুছে ফেলা হয়েছে এমন পাতার মেয়াদ উত্তীর্ণ ইতিহাস পাতার লিংক খোলার কারণে এটি হতে পারে। \n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} পাতা অবলুপ্তি লগে] বিস্তারিত তথ্য জানা যাবে।",
        "searchresults": "অনুসন্ধানের ফলাফল",
+       "search-filter-title-prefix-reset": "সব পাতা অনুসন্ধান করুন",
        "searchresults-title": "\"$1\" অনুসন্ধানের ফলাফল",
        "titlematches": "নিবন্ধের শিরোনাম মিলেছে",
        "textmatches": "পাতার লেখার সাথে মিলেছে",
        "yourrealname": "আসল নাম *",
        "yourlanguage": "ভাষা:",
        "yourvariant": "বিষয়বস্তুর ভাষার বিকল্প:",
-       "prefs-help-variant": "à¦\89à¦\87à¦\95িতà§\87 à¦\95নà§\8dà¦\9fà§\87নà§\8dà¦\9f à¦ªà¦¾à¦¤à¦¾ à¦¦à§\87à¦\96ার à¦\9cনà§\8dয à¦\86পনার à¦ªà¦\9bনà§\8dদà§\87র à¦¬à§\88শিষà§\8dà¦\9f।",
+       "prefs-help-variant": "à¦\8fà¦\87 à¦\89à¦\87à¦\95িতà§\87 à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81র à¦ªà¦¾à¦¤à¦¾ à¦¦à§\87à¦\96ার à¦\9cনà§\8dয à¦\86পনার à¦ªà¦\9bনà§\8dদà§\87র à¦¬à§\88à¦\95লà§\8dপিà¦\95 à¦¬à¦¾ à¦¬à¦¾à¦¨à¦¾à¦¨।",
        "yournick": "স্বাক্ষর:",
        "prefs-help-signature": "আলাপ পাতায় আপনার মন্তব্য অবশ্যই \"<nowiki>~~~~</nowiki>\" চিহ্ন দ্বারা স্বাক্ষরিত হতে হবে, যা স্বয়ংক্রিয়ভাবে আপনার স্বাক্ষর ও সময় সংযুক্ত করবে।",
        "badsig": "অবৈধ স্বাক্ষর; এইচটিএমএল ট্যাগ পরীক্ষা করুন।",
        "action-viewmywatchlist": "আপনার নজরতালিকা দেখুন",
        "action-viewmyprivateinfo": "আপনার ব্যক্তিগত তথ্য দেখুন",
        "action-editmyprivateinfo": "আপনার ব্যক্তিগত তথ্য সম্পাদনা করুন",
-       "action-editcontentmodel": "পাতার à¦\95নà§\8dà¦\9fà§\87নà§\8dà¦\9f à¦®à¦¡à§\87ল à¦¸à¦®à§\8dপাদনা à¦\95রà§\81ন",
+       "action-editcontentmodel": "à¦\8fà¦\95à¦\9fি à¦ªà¦¾à¦¤à¦¾à¦° à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81র à¦®à¦¡à§\87ল à¦¸à¦®à§\8dপাদনা à¦\95রার",
        "action-managechangetags": "ট্যাগ তৈরি ও সক্রিয়/নিষ্ক্রিয়",
        "action-applychangetags": "আপনার পরিবর্তনগুলোর সাথে ট্যাগ সংযোজন করুন",
        "action-changetags": "নির্দিষ্ট সংস্করণ এবং লগ ভুক্তিগুলিতে যথেচ্ছভাবে ট্যাগ সংযোজন ও অপসারণ করা",
        "speciallogtitlelabel": "লক্ষ্য (ব্যবহারকারীর জন্য শিরোনাম বা {{ns:user}}:ব্যবহারকারী নাম):",
        "log": "লগগুলি",
        "logeventslist-submit": "দেখাও",
-       "logeventslist-more-filters": "à¦\86রà§\8b à¦\9bাà¦\81à¦\95নি:",
+       "logeventslist-more-filters": "à¦\85তিরিà¦\95à§\8dত à¦²à¦\97 à¦¦à§\87à¦\96ান:",
        "logeventslist-patrol-log": "পরীক্ষণ লগ",
        "logeventslist-tag-log": "ট্যাগ লগ",
        "all-logs-page": "সব প্রকাশ্য লগ",
        "trackingcategories-disabled": "বিষয়শ্রেণীটি বিকল",
        "mailnologin": "প্রাপকের ঠিকানা নেই",
        "mailnologintext": "অন্য ব্যবহারকারীদেরকে ই-মেইল পাঠাতে হলে আপনাকে অবশ্যই আগে [[Special:UserLogin|লগ-ইন]] করতে হবে এবং ''[[Special:Preferences|আপনার পছন্দ তালিকায়]] আপনার ই-মেইল ঠিকানাটি ঠিকমত দিতে হবে।",
-       "emailuser": "à¦\87মà§\87à¦\87ল à¦\95রà§\8b",
+       "emailuser": "à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦\87মà§\87à¦\87ল à¦\95রà§\81ন",
        "emailuser-title-target": "{{GENDER:$1|ব্যবহারকারীকে}} ইমেইল পাঠান",
        "emailuser-title-notarget": "ব্যবহারকারীকে ই-মেইল করুন",
        "emailpagetext": "আপনি নিচের ফর্মটি ব্যবহার করে এই {{GENDER:$1|ব্যবহারকারীকে}} একটি ই-মেইল পাঠাতে পারেন।\nআপনি [[Special:Preferences|আপনার ব্যবহারকারী পছন্দে]] যে ই-মেইল ঠিকানাটি প্রবেশ করিয়েছেন সেটিকে ই-মেইলের ''প্রেরক'' হিসেবে দেখানো হবে, যেনো মেইলের প্রাপক আপনাকে উত্তর দিতে পারেন।",
        "immobile-target-namespace-iw": "পাতা স্থানান্তরের ক্ষেত্রে ইন্টারউইকি লিংক ব্যবহার করা যাবে না।",
        "immobile-source-page": "এই পাতাটির স্থানান্তর সম্ভব নয়।",
        "immobile-target-page": "গন্তব্য শিরোনামে স্থানান্তর করা যাবে না।",
-       "bad-target-model": "à¦\86পনার à¦\89লà§\8dলà§\87à¦\96িত à¦\95নà§\8dà¦\9fà§\87নà§\8dà¦\9f à¦®à¦¡à§\87লà¦\9fি à¦\86লাদা। $1 à¦¥à§\87à¦\95à§\87 $2 à¦\95নভারà§\8dà¦\9f à¦\95রা à¦¯à¦¾à¦\9aà§\8dà¦\9bে না।",
+       "bad-target-model": "à¦\86à¦\95াà¦\99à§\8dà¦\95à§\8dষিত à¦\97নà§\8dতবà§\8dযà¦\9fি à¦\8fà¦\95à¦\9fি à¦­à¦¿à¦¨à§\8dন à¦¸à¦¾à¦®à¦\97à§\8dরà§\80র à¦®à¦¡à§\87ল à¦¬à§\8dযবহার à¦\95রà§\87। $1 à¦¥à§\87à¦\95à§\87 $2-à¦\8f à¦°à§\82পানà§\8dতর à¦\95রা à¦¯à¦¾à¦¬ে না।",
        "imagenocrossnamespace": "কোনো ফাইল ফাইলনয় এমন নামস্থানে স্থানান্তর সম্ভব নয়",
        "nonfile-cannot-move-to-file": "কোনো ফাইলনয় এমন কোনো পাতা ফাইল নামস্থানে স্থানান্তর সম্ভব নয়",
        "imagetypemismatch": "নতুন ফাইল এক্সটেনশনটি ফাইলের ধরনের সাথে মিলছে না",
        "import-error-interwiki": "\"$1\" পাতাটি আমদানি করা যায়নি কারণ এই নামটি বহিঃসংযোগর জন্য নির্ধারিত (আন্তঃউইকি)।",
        "import-error-special": "\"$1\" পাতাটি আমদানি করা যায়নি কারণ এটি একটি বিশেষ নামস্থানকে নির্দেশ করে যেটি সম্পাদনার জন্য অনুমোদিত নয়।",
        "import-error-invalid": "\"$1\" পাতাটি আমদানি করা যায়নি কারণ নামটি সঠিক নয়।",
-       "import-error-unserialize": "$1 à¦ªà¦¾à¦¤à¦¾à¦° $2 à¦¸à¦\82সà§\8dà¦\95রণà¦\9fি à¦¸à¦¿à¦°à¦¿à¦¯à¦¼à¦¾à¦²à¦¾à¦\87à¦\9c à¦\95রা à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾à¥¤ à¦\8fà¦\87 à¦°à¦¿à¦­à¦¿à¦¶à¦¨à§\87 $4 à¦¹à¦¿à¦¸à¦¾à¦¬à§\87 $3 à¦\95নà§\8dà¦\9fà§\87নà§\8dà¦\9f à¦®à¦¡à§\87লà§\87 à¦¸à¦¿à¦°à¦¿à¦¯à¦¼à¦¾à¦²à¦¾à¦\87à¦\9c করা আছে।",
+       "import-error-unserialize": "$1 à¦ªà¦¾à¦¤à¦¾à¦° $2 à¦¸à¦\82সà§\8dà¦\95রণà¦\9fি à¦§à¦¾à¦°à¦¾à¦¬à¦¾à¦¹à¦¿à¦\95ভাবà§\87 à¦ªà§\8dরà¦\95াশ à¦\95রা à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾à¥¤ à¦\8fà¦\87 à¦¸à¦\82সà§\8dà¦\95রণà§\87 $4 à¦¹à¦¿à¦¸à¦¾à¦¬à§\87 $3 à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81র à¦®à¦¡à§\87লà§\87 à¦§à¦¾à¦°à¦¾à¦¬à¦¾à¦¹à¦¿à¦\95ভাবà§\87 à¦ªà§\8dরà¦\95াশ করা আছে।",
        "import-error-bad-location": "বিষয়বস্তু মডেল $3 ব্যবহার করে সম্পাদিত $2 নং সংশোধনটি \"$1\" পাতায় সংরক্ষণ করা যাবে না, কারণ ঐ মডেলটি ঐ পাতাতে প্রযোজ্য নয়।",
        "import-options-wrong": "{{PLURAL:$2|পছন্দ}} নির্বাচনে ভুল: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "মূল পাতার ভুল শিরনাম দেয়া হয়েছে।",
        "markedaspatrollederrornotify": "পরীক্ষিত হিসাবে চিহ্নিত করতে ব্যর্থ।",
        "patrol-log-page": "পরীক্ষণ লগ",
        "patrol-log-header": "এটি যাচাইকৃত রিভিশনের তালিকা।",
-       "log-show-hide-patrol": "পরীক্ষণ লগ $1",
-       "log-show-hide-tag": "ট্যাগ লগ $1",
        "confirm-markpatrolled-button": "ঠিক আছে",
        "confirm-markpatrolled-top": "$2-এর $3 নং সংস্করণটি পরীক্ষিত হিসেবে চিহ্নিত করবেন?",
        "deletedrevision": "মুছে ফেলা পুরাতন সংশোধন $1",
index a552b16..48526f5 100644 (file)
        "markedaspatrollederrornotify": "N'eus ket bet gallet merkañ evel gwiriet.",
        "patrol-log-page": "Log gwiriañ",
        "patrol-log-header": "Setu ur marilh eus ar stummoù patrouilhet.",
-       "log-show-hide-patrol": "$1 istor ar stummoù gwiriet",
-       "log-show-hide-tag": "$1 marilh an dikedenn",
        "confirm-markpatrolled-button": "Mat eo",
        "confirm-markpatrolled-top": "Merkañ adweladenn $3 eus $2 evel gwiriet ?",
        "deletedrevision": "Diverket stumm kozh $1.",
index 0f18d91..e31278b 100644 (file)
        "markedaspatrollederrornotify": "Označavanje stranice pregledanom nije uspjelo.",
        "patrol-log-page": "Zapisnik patroliranja",
        "patrol-log-header": "Ovo je zapisnik patroliranih izmjena.",
-       "log-show-hide-patrol": "$1 zapisnik patroliranja",
-       "log-show-hide-tag": "$1 zapisnik oznaka",
        "confirm-markpatrolled-button": "U redu",
        "confirm-markpatrolled-top": "Označiti izmjenu $3 stranice $2 patroliranom?",
        "deletedrevision": "Obrisana stara izmjena $1",
index 3579d72..d2854d6 100644 (file)
        "markedaspatrollederrornotify": "Ha fallat la marca com a patrullat.",
        "patrol-log-page": "Registre de supervisió",
        "patrol-log-header": "Això és un registre de les revisions patrullades.",
-       "log-show-hide-patrol": "$1 el registre de patrulla",
-       "log-show-hide-tag": "$1 el registre d’etiquetes",
        "confirm-markpatrolled-button": "D'acord",
        "confirm-markpatrolled-top": "Voleu marcar la revisió $3 de $2 com a patrullada?",
        "deletedrevision": "S'ha eliminat la revisió antiga $1.",
index 9d04fa5..2516889 100644 (file)
        "nextn": "âu $1 bĭk",
        "shown-title": "Mūi hiĕk hiēng-sê $1{{PLURAL:$1|bĭk giék-guō}}",
        "viewprevnext": "Káng ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-exists": "cī siŏh bĭh wiki ī-gĭng ô „$1“ mìng-chĭng gì dèu-mŭk",
        "searchprofile-articles": "Nô̤i-ṳ̀ng hiĕk",
        "searchprofile-images": "Dŏ̤-mùi-tā̤",
        "searchprofile-everything": "Sū-iū-nó̤h",
index 32cb94b..21e3132 100644 (file)
        "markedaspatrollederrornotify": "Хийцамаш хьаьжжина сана билгал бан цабелира.",
        "patrol-log-page": "ТӀехьажаран тептар",
        "patrol-log-header": "Хьажжина версеш йолу тептар.",
-       "log-show-hide-patrol": "$1 тӀехьажаран тептар",
-       "log-show-hide-tag": "$1 билгалонийн тептар",
        "confirm-markpatrolled-button": "ХӀаъ",
        "deletedrevision": "ДӀаяьккхина шира верси $1",
        "filedeleteerror-short": "Файл дӀаяккхаран гӀалат: $1",
index 53337d1..4d64e06 100644 (file)
        "history-feed-item-nocomment": "$1 لە $2",
        "history-feed-empty": "لاپەڕەی داخوازی‌کراو بوونی نیە.<br />\nلەوانەیە لەسەر ویکی سڕدرابێتەوە یان ناوی گۆڕدرابێت.<br />\nبۆ لاپەڕەی وەک ئەوە هەوڵی [[Special:Search|گەڕان لەسەر ویکی]] بدە.",
        "rev-deleted-comment": "(کورتەی دەستکاری سڕایەوە)",
-       "rev-deleted-user": "(Ù\86اÙ\88Û\8c Ø¨Û\95کارÙ\87Û\8eÙ\86Û\95ر Ø³Ú\95اÛ\8cەوە)",
+       "rev-deleted-user": "(Ù\86اÙ\88Û\8c Ø¨Û\95کارÙ\87Û\8eÙ\86Û\95ر Ø³Ú\95دراÙ\88Û\95تەوە)",
        "rev-deleted-event": "(لۆگی کردەوە سڕایەوە)",
        "rev-deleted-text-permission": "ئەم پێداچوونەوەیە لەم پەڕەیە '''سڕدراوەتەوە'''.\nوردەکاری سەبارەت بەوە لە [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی سڕینەوە]دا دەست دەکەوێت.",
        "rev-deleted-text-unhide": "ئەم پێداچوونەوەیە لەم پەڕەیە '''سڕدراوەتەوە'''.\nوردەکاری سەبارەت بەوە لە [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی سڕینەوە]دا دەست دەکەوێت.\nھێشتا ئەگەر بتەوێ دەتوانی [$1 ئەم پێداچوونەوەیە ببینی].",
        "dellogpage": "لۆگی سڕینەوە",
        "dellogpagetext": "ئەوەی خوارەوە لیستێكە لە دوایین سڕینەوەکان",
        "deletionlog": "لۆگی سڕینەوە",
+       "log-name-create": "لۆگی دروستکردنی پەڕە",
+       "logentry-create-create": "$1 پەڕەی $3ی دروست کرد",
        "reverted": "گەڕێندراوە بۆ پێداچوونەوەی پێشووتر",
        "deletecomment": "ھۆکار:",
        "deleteotherreason": "ھۆکاری تر/زیاتر:",
        "markedaspatrollederrornotify": "نیشانکردن وەک پاس دراو سەرکەوتوو نەبوو.",
        "patrol-log-page": "لۆگی پاسدان",
        "patrol-log-header": "ئەمە لۆگێکی پێداچوونەوە پاس دراوەکانە.",
-       "log-show-hide-patrol": "لۆگی پاسدان $1",
        "confirm-markpatrolled-button": "باشە",
        "deletedrevision": "پێداچوونەوەی کۆنی سڕاوە $1",
        "filedeleteerror-short": "هەڵە لە سڕینەوەی پەڕگە: $1",
index c06c758..2241458 100644 (file)
        "spam_blanking": "Бар олгъан версияларда $1 сайтына багълантылар бар, темизлев",
        "pageinfo-language": "Саифе ичиндекисининъ тили",
        "patrol-log-page": "Тешкерюв журналы",
-       "log-show-hide-patrol": "Тешкерюв журналыны $1",
        "deletedrevision": "$1 сайылы эски версия ёкъ этильди.",
        "filedeleteerror-short": "Файл ёкъ эткенде хата чыкъты: $1",
        "filedelete-missing": "\"$1\" адлы файл ёкъ этилип оламай, чюнки ойле бир файл ёкъ.",
index 8728109..02405da 100644 (file)
        "spam_blanking": "Bar olğan versiyalarda $1 saytına bağlantılar bar, temizlev",
        "pageinfo-language": "Saife içindekisiniñ tili",
        "patrol-log-page": "Teşkerüv jurnalı",
-       "log-show-hide-patrol": "Teşkerüv jurnalını $1",
        "deletedrevision": "$1 sayılı eski versiya yoq etildi.",
        "filedeleteerror-short": "Fayl yoq etkende hata çıqtı: $1",
        "filedelete-missing": "\"$1\" adlı fayl yoq etilip olamay, çünki öyle bir fayl yoq.",
index d8e9640..e3cf411 100644 (file)
        "diff-paragraph-moved-toold": "Odstavec byl přesunut. Kliknutím skočíte na původní umístění.",
        "difference-missing-revision": "{{PLURAL:$2|Jedna z revizí|$2 revize|$2 revizí}} k požadovanému porovnání ($1) {{PLURAL:$2|neexistuje|neexistují|neexistuje}}.\n\nToto je obvykle způsobeno tím, že jste následovali zastaralý odkaz na historickou verzi stránky, jež byla smazána.\nPodrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} knize smazaných stránek].",
        "searchresults": "Výsledky hledání",
+       "search-filter-title-prefix": "Hledání pouze ve stránkách, jejichž název začíná na „$1“",
+       "search-filter-title-prefix-reset": "Hledat ve všech stránkách",
        "searchresults-title": "Výsledky hledání „$1“",
        "titlematches": "Stránky s odpovídajícím názvem",
        "textmatches": "Stránky s odpovídajícím textem",
        "speciallogtitlelabel": "Cíl (název nebo {{ns:user}}:Jméno pro uživatele):",
        "log": "Protokolovací záznamy",
        "logeventslist-submit": "Zobrazit",
-       "logeventslist-more-filters": "Další filtry:",
+       "logeventslist-more-filters": "Zobrazit další záznamy:",
        "logeventslist-patrol-log": "Kniha prověřených editací",
        "logeventslist-tag-log": "Kniha značek",
        "all-logs-page": "Všechny veřejné záznamy",
        "markedaspatrollederrornotify": "Nepodařilo se označit jako prověřené.",
        "patrol-log-page": "Kniha prověřených editací",
        "patrol-log-header": "Toto je kniha prověřených verzí.",
-       "log-show-hide-patrol": "$1 knihu záznamů patroly",
-       "log-show-hide-tag": "$1 knihu značek",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Označit revizi $3 stránky $2 jako prověřenou?",
        "deletedrevision": "Smazána stará revize $1",
index 5b2c82d..5ebb20d 100644 (file)
        "markedaspatrollederrornotify": "Methwyd rhoi marc ymweliad patrôl arni.",
        "patrol-log-page": "Lòg patrolio",
        "patrol-log-header": "Mae'r lòg hwn yn dangos y golygiadau sydd wedi derbyn ymweliad patrôl.",
-       "log-show-hide-patrol": "$1 lòg patrolio",
        "confirm-markpatrolled-button": "Iawn",
        "confirm-markpatrolled-top": "Nodi fod diwygiad $3 o $2 wedi cael sêl-bendith golygydd?",
        "deletedrevision": "Wedi dileu hen ddiwygiad $1.",
index 875e447..618c606 100644 (file)
        "markedaspatrollederrornotify": "Markering som patruljeret mislykkedes.",
        "patrol-log-page": "Kontrollog",
        "patrol-log-header": "Patruljerede versioner.",
-       "log-show-hide-patrol": "$1 patruljeringslog",
-       "log-show-hide-tag": "$1 taglog",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Marker version $3 af $2 som patruljeret?",
        "deletedrevision": "Slettede gammel version $1",
index 143f26c..5c67e95 100644 (file)
        "diff-paragraph-moved-toold": "Der Absatz wurde verschoben. Klicken, um zur alten Stelle zu springen.",
        "difference-missing-revision": "{{PLURAL:$2|Eine Version|$2 Versionen}} dieser Unterschiedsanzeige ($1) {{PLURAL:$2|wurde|wurden}} nicht gefunden.\n\nDieser Fehler wird normalerweise von einem veralteten Link zur Versionsgeschichte einer Seite verursacht, die zwischenzeitlich gelöscht wurde.\nEinzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch] vorhanden.",
        "searchresults": "Suchergebnisse",
+       "search-filter-title-prefix": "Nur in Seiten suchen, deren Titel mit „$1“ beginnt.",
+       "search-filter-title-prefix-reset": "Alle Seiten durchsuchen",
        "searchresults-title": "Suchergebnisse für „$1“",
        "titlematches": "Übereinstimmungen mit Seitentiteln",
        "textmatches": "Übereinstimmungen mit Inhalten",
        "speciallogtitlelabel": "Ziel (Titel oder {{ns:user}}:Benutzername für einen Benutzer):",
        "log": "Logbücher",
        "logeventslist-submit": "Anzeigen",
-       "logeventslist-more-filters": "Weitere Filter:",
+       "logeventslist-more-filters": "Zusätzliche Logbücher anzeigen:",
        "logeventslist-patrol-log": "Kontroll-Logbuch",
        "logeventslist-tag-log": "Markierungs-Logbuch",
        "all-logs-page": "Alle öffentlichen Logbücher",
        "markedaspatrollederrornotify": "Der Versuch, die Version als kontrolliert zu markieren, ist fehlgeschlagen.",
        "patrol-log-page": "Kontroll-Logbuch",
        "patrol-log-header": "Dies ist das Kontroll-Logbuch.",
-       "log-show-hide-patrol": "Kontroll-Logbuch $1",
-       "log-show-hide-tag": "Markierungs-Logbuch $1",
        "confirm-markpatrolled-button": "Okay",
        "confirm-markpatrolled-top": "Version $3 von $2 als kontrolliert markieren?",
        "deletedrevision": "alte Version $1 gelöscht",
index ba91d02..1ba6eec 100644 (file)
        "markedaspatrollederrornotify": "Nışan kerdışê dewriyey nêbı",
        "patrol-log-page": "Qeydé çımsernayoğan",
        "patrol-log-header": "Ena listeyê logi revizyonê devriyeyi mocneno.",
-       "log-show-hide-patrol": "Qeydé Çımsernayoğan $1",
-       "log-show-hide-tag": "$1 qeydê etiketi",
        "confirm-markpatrolled-button": "TEMAM",
        "deletedrevision": "Veriyono kihan $1 wederna",
        "filedeleteerror-short": "Wedarnayişê dosya de ğelati esto: $1",
index 1bd76b6..0cff6d9 100644 (file)
        "markedaspatrollederrornotify": "Markěrowanje ako doglědowane njejo se raźiło.",
        "patrol-log-page": "Protokol kontrolow",
        "patrol-log-header": "To jo protokol pśekontrolowanych wersijow.",
-       "log-show-hide-patrol": "Protokol doglědowanja $1",
        "deletedrevision": "wulašowana stara wersija: $1",
        "filedeleteerror-short": "Zmólka pśi wulašowanju dataje: $1",
        "filedeleteerror-long": "Pśi wulašowanju dataje su se zwěsćili zmólki:\n\n$1",
index 6b223f8..a0e9bca 100644 (file)
        "diff-paragraph-moved-toold": "Η παράγραφος αφαιρέθηκε. Πατήστε στο κουμπί για να πάτε σε προηγούμενη τοποθεσία.",
        "difference-missing-revision": "{{PLURAL:$2|Μία αναθεώρηση|$2 αναθεωρήσεις}} αυτής της διαφοράς ($1) δεν {{PLURAL:$2|μπόρεσε να βρεθεί|μπόρεσαν να βρεθούν}}.\n\nΑυτό συνήθως προκαλείται από παλιό σύνδεσμο διαφοράς προς σελίδα που έχει διαγραφεί.\nΛεπτομέρειες θα βρείτε στο [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ημερολόγιο καταγραφής διαγραφών].",
        "searchresults": "Αποτελέσματα αναζήτησης",
+       "search-filter-title-prefix-reset": "Αναζήτηση όλων των σελίδων",
        "searchresults-title": "Αποτελέσματα αναζήτησης για \"$1\"",
        "titlematches": "Τίτλοι άρθρων που ανταποκρίνονται",
        "textmatches": "Κείμενα σελίδων που ανταποκρίνονται:",
        "markedaspatrollederrornotify": "Σήμανση ως ελεγμένη απέτυχε.",
        "patrol-log-page": "Αρχείο καταγραφής περιπολιών",
        "patrol-log-header": "Αυτό είναι μητρώο ελεγμένων αναθεωρήσεων.",
-       "log-show-hide-patrol": "$1 μητρώου ελέγχου επεξεργασιών",
-       "log-show-hide-tag": "$1 ετικέττα καταγραφής",
        "confirm-markpatrolled-button": "Εντάξει",
        "deletedrevision": "Η παλιά έκδοση της $1 διαγράφτηκε",
        "filedeleteerror-short": "Σφάλμα κατά τη διαγραφή του αρχείου: $1",
index 8d5bc72..bc35c9e 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|One revision|$2 revisions}} of this difference ($1) {{PLURAL:$2|was|were}} not found.\n\nThis is usually caused by following an outdated diff link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
        "search-summary": "",
        "searchresults": "Search results",
+       "search-filter-title-prefix": "Only searching in pages whose title starts with \"$1\"",
+       "search-filter-title-prefix-reset": "Search all pages",
        "searchresults-title": "Search results for \"$1\"",
        "titlematches": "Page title matches",
        "textmatches": "Page text matches",
        "speciallogtitlelabel": "Target (title or {{ns:user}}:username for user):",
        "log": "Logs",
        "logeventslist-submit": "Show",
-       "logeventslist-more-filters": "More filters:",
+       "logeventslist-more-filters": "Show additional logs:",
        "logeventslist-patrol-log": "Patrol log",
        "logeventslist-tag-log": "Tag log",
        "all-logs-page": "All public logs",
        "markedaspatrollederrornotify": "Marking as patrolled failed.",
        "patrol-log-page": "Patrol log",
        "patrol-log-header": "This is a log of patrolled revisions.",
-       "log-show-hide-patrol": "$1 patrol log",
-       "log-show-hide-tag": "$1 tag log",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Mark revision $3 of $2 as patrolled?",
        "deletedrevision": "Deleted old revision $1",
index bf4dc22..8348065 100644 (file)
        "markedaspatrollederrornotify": "Malsukcesis marki la dosieron kiel patrolatan.",
        "patrol-log-page": "Protokolo pri patrolado",
        "patrol-log-header": "Jen protokolo de patrolitaj versioj.",
-       "log-show-hide-patrol": "$1 protokolo pri patrolado",
-       "log-show-hide-tag": "$1 etikedan protokolon",
        "confirm-markpatrolled-button": "Ek!",
        "confirm-markpatrolled-top": "Marki version $3 el $2 kiel patrolita?",
        "deletedrevision": "Forigita malnova versio $1",
index ff54ea7..dcf0c4a 100644 (file)
                        "Athena in Wonderland",
                        "Truebamateo",
                        "La Mantis",
-                       "Amaia"
+                       "Amaia",
+                       "Tiberius1701",
+                       "Astroemi"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "rcfilters-empty-filter": "No hay filtros activos. Se muestran todas las contribuciones.",
        "rcfilters-filterlist-title": "Filtros",
        "rcfilters-filterlist-whatsthis": "¿Cómo funcionan?",
-       "rcfilters-filterlist-feedbacklink": "Comparte tus comentarios sobre estas (nuevas) herramientas de filtrado",
+       "rcfilters-filterlist-feedbacklink": "Dinos lo que piensas sobre estas herramientas de filtrado",
        "rcfilters-highlightbutton-title": "Resaltar los resultados",
        "rcfilters-highlightmenu-title": "Selecciona un color",
        "rcfilters-highlightmenu-help": "Selecciona un color para resaltar esta propiedad",
        "rcfilters-watchlist-edit-watchlist-button": "Edita tu lista de seguimiento",
        "rcfilters-watchlist-showupdated": "Los cambios hechos a páginas que no has visitado desde que se efectuaron aparecen en <strong>negrita</strong>, acompañados de marcadores sólidos.",
        "rcfilters-preference-label": "Ocultar la versión mejorada de Cambios recientes",
-       "rcfilters-preference-help": "Revierte el rediseño de interfaz de 2017 y desactiva todas las herramientas añadidas desde entonces.",
+       "rcfilters-preference-help": "Revierte el rediseño de la interfaz de 2017 y desactiva todas las herramientas añadidas desde entonces.",
        "rcfilters-watchlist-preference-label": "Ocultar la versión mejorada de la lista de seguimiento",
-       "rcfilters-watchlist-preference-help": "Revierte el rediseño de la interfaz de 2017 e indisponibiliza todas las herramientas añadidas desde entonces.",
+       "rcfilters-watchlist-preference-help": "Revierte el rediseño de la interfaz de 2017 y desactiva todas las herramientas añadidas desde entonces.",
        "rcfilters-filter-showlinkedfrom-label": "Mostrar cambios en páginas enlazadas desde",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Páginas enlazadas desde</strong> la página seleccionada",
        "rcfilters-filter-showlinkedto-label": "Mostrar cambios en páginas que enlazan a",
        "speciallogtitlelabel": "Objetivo (título o {{ns:user}}:nombre de usuario):",
        "log": "Registros",
        "logeventslist-submit": "Mostrar",
-       "logeventslist-more-filters": "Más filtros:",
+       "logeventslist-more-filters": "Mostrar registros adicionales:",
        "logeventslist-patrol-log": "Registro de revisiones",
        "logeventslist-tag-log": "Registro de etiquetas",
        "all-logs-page": "Todos los registros públicos",
        "markedaspatrollederrornotify": "Error al marcar como verificado.",
        "patrol-log-page": "Registro de revisiones",
        "patrol-log-header": "Este es un registro de revisiones verificadas.",
-       "log-show-hide-patrol": "$1 registro de verificación",
-       "log-show-hide-tag": "$1 registro de etiquetas",
        "confirm-markpatrolled-button": "Aceptar",
        "confirm-markpatrolled-top": "¿Marcar la revisión $3 de $2 como verificada?",
        "deletedrevision": "Borrada revisión antigua $1",
index 74c4d97..a4ff0fb 100644 (file)
        "markedaspatrollederrornotify": "Kontrollituks märkimine ebaõnnestus.",
        "patrol-log-page": "Kontrollimislogi",
        "patrol-log-header": "See on kontrollitud redaktsioonide logi.",
-       "log-show-hide-patrol": "$1 kontrollimislogi",
-       "log-show-hide-tag": "$1 märgiste logi",
        "confirm-markpatrolled-button": "Sobib",
        "confirm-markpatrolled-top": "Kas märgid lehekülje $2 redaktsiooni $3 kontrollituks?",
        "deletedrevision": "Kustutatud vanem versioon $1",
index c547056..126d314 100644 (file)
        "log": "Erregistroak",
        "logeventslist-submit": "Erakutsi",
        "logeventslist-more-filters": "Iragazki gehiago:",
+       "logeventslist-tag-log": "Etiketen erregistroa",
        "all-logs-page": "Erregistro publiko guztiak",
        "alllogstext": "{{SITENAME}} orrialdearen erregistro guztien erakusketa konbinatua.\nErregistro mota, erabiltzailearen izena edota orrialdearen izena iragaziz bistaratu daiteke. Letra larriak eta xeheak bereizten dira.",
        "logempty": "Ez dago emaitzarik erregistroan.",
        "markedaspatrollederrornotify": "Patruilatu gisa markatzean akatsa egon da.",
        "patrol-log-page": "Patrullatze loga",
        "patrol-log-header": "Hau patruliatutako aldaketen log bat da.",
-       "log-show-hide-patrol": "$1 patruilatze loga",
-       "log-show-hide-tag": "$1 etiketa erregistroa",
        "confirm-markpatrolled-button": "Ados",
        "confirm-markpatrolled-top": "$2ren $3 berrikusketa patruilatu bezala markatu?",
        "deletedrevision": "$1 berrikuspen zaharra ezabatu da",
index 3eb42f9..329a19c 100644 (file)
        "markedaspatrollederrornotify": "زدن برچسب گشت، ناموفق بود.",
        "patrol-log-page": "سیاههٔ گشت",
        "patrol-log-header": "این سیاهه‌ای از ویرایش‌های گشت‌خورده است.",
-       "log-show-hide-patrol": "$1 سیاههٔ گشت‌زنی",
-       "log-show-hide-tag": "$1 سیاهه برچسب",
        "confirm-markpatrolled-button": "تأیید",
        "confirm-markpatrolled-top": "نسخهٔ $3 از $2 علامت گشت بخورد؟",
        "deletedrevision": "$1 نسخهٔ حذف شدهٔ قدیمی",
index d45e2e7..c11cc07 100644 (file)
        "content-model-css": "CSS",
        "content-json-empty-object": "Tyhjä objekti",
        "content-json-empty-array": "Tyhjä array",
-       "deprecated-self-close-category": "Sivut, joissa on virheellisiä itsensäsulkevia HTLM-tageja",
+       "deprecated-self-close-category": "Sivut, joissa on virheellisiä itsensäsulkevia HTML-tageja",
        "deprecated-self-close-category-desc": "Sivulla on virheellisiä itsensäsulkevia HTML-tageja, kuten <code>&lt;b/></code> tai <code>&lt;span/></code>. Niiden käyttäytyminen muuttuu pian HTLM5:n määritysten mukaiseksi, joten niiden käyttö wikitekstissä on vanhentunut.",
        "duplicate-args-warning": "<strong>Varoitus:</strong> [[:$1]] kutsuu mallinetta [[:$2]] niin, että parametrille \"$3\" on annettu enemmän kuin yksi arvo. Ainoastaan viimeksi annettu arvo otetaan huomioon.",
        "duplicate-args-category": "Sivut, jotka käyttävät kaksinkertaisia argumentteja mallinekutsuissa",
        "diff-paragraph-moved-toold": "Kappale siirrettiin. Klikkaa hypätäksesi vanhaan sijaintiin.",
        "difference-missing-revision": "{{PLURAL:$2|Yhtä versiota|$2 versiota}} tästä vertailusta ($1) {{PLURAL:$2|ei}} löytynyt.\n\nUseimmiten tämä johtuu vanhentuneesta vertailulinkistä poistettuun sivuun.\nLisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].",
        "searchresults": "Hakutulokset",
+       "search-filter-title-prefix": "Haetaan vain sivuista, joiden otsikko alkaa \"$1\"",
+       "search-filter-title-prefix-reset": "Hae kaikista sivuista",
        "searchresults-title": "Haun tulokset hakusanalle ”$1”",
        "titlematches": "Osumat sivujen otsikoissa",
        "textmatches": "Osumat sivujen teksteissä",
        "speciallogtitlelabel": "Kohde (sivu tai {{ns:user}}:käyttäjänimi):",
        "log": "Lokit",
        "logeventslist-submit": "Näytä",
-       "logeventslist-more-filters": "Lisää suodattimia:",
+       "logeventslist-more-filters": "Näytä lisää lokeja:",
        "logeventslist-patrol-log": "Partiointiloki",
        "logeventslist-tag-log": "Merkkausloki",
        "all-logs-page": "Kaikki julkiset lokit",
        "uctop": "(uusin)",
        "month": "Alkaen kuukaudesta (ja aiemmin):",
        "year": "Vuosi",
-       "date": "Alkaen päiväydestä (ja aiemmin):",
+       "date": "Alkaen päivämäärästä (tai sitä aikaisemmasta):",
        "sp-contributions-newbies": "Näytä uusien tulokkaiden muutokset",
        "sp-contributions-newbies-sub": "Uusien käyttäjien muokkaukset",
        "sp-contributions-newbies-title": "Uusien käyttäjien muokkaukset",
        "markedaspatrollederrornotify": "Tarkastetuksi merkitseminen epäonnistui.",
        "patrol-log-page": "Muutostentarkastusloki",
        "patrol-log-header": "Tämä on loki tarkastetuista muutoksista.",
-       "log-show-hide-patrol": "$1 muutostentarkastusloki",
-       "log-show-hide-tag": "$1 merkkausloki",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Merkitäänkö versio $3 kohdesivusta $2 partioiduksi?",
        "deletedrevision": "Poistettiin vanha versio $1",
index 86e2160..af388a4 100644 (file)
        "markedaspatrollederrornotify": "Tað miseydnaðist at merkja sum eftirkannað.",
        "patrol-log-page": "Eftirlitsloggur",
        "patrol-log-header": "Hetta er ein loggur yvir patruljeraðum síðuversjónum.",
-       "log-show-hide-patrol": "$1 patrulleringsloggur",
        "deletedrevision": "Slettaði gamla síðuversjón $1",
        "filedeleteerror-short": "Feilur hendi við sletting av fílu: $1",
        "previousdiff": "← Eldri broytingar",
index ab015fa..723ab6d 100644 (file)
        "diff-paragraph-moved-toold": "Le paragraphe a été déplacé. Cliquez pour accéder à l'ancien emplacement.",
        "difference-missing-revision": "{{PLURAL:$2|Une révision|$2 révisions}} de cette différence ($1) {{PLURAL:$2|n’a pas été trouvée|n’ont pas été trouvées}}.\n\nCela survient en général en suivant un lien de différence désuet vers une page qui a été supprimée.\nVous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
        "searchresults": "Résultats de la recherche",
+       "search-filter-title-prefix": "Recherche seulement des pages dont le titre commence par « $1 »",
+       "search-filter-title-prefix-reset": "Rechercher toutes les pages",
        "searchresults-title": "Résultats de recherche pour « $1 »",
        "titlematches": "Correspondances dans les titres des pages",
        "textmatches": "Correspondances dans le texte des pages",
        "speciallogtitlelabel": "Cible (titre ou {{ns:user}}:nom d'utilisateur) :",
        "log": "Journaux d’opérations",
        "logeventslist-submit": "Lister",
-       "logeventslist-more-filters": "Davantage de filtres:",
+       "logeventslist-more-filters": "Afficher des journaux supplémentaires :",
        "logeventslist-patrol-log": "Journal des relectures",
        "logeventslist-tag-log": "Journal des balises",
        "all-logs-page": "Tous les journaux publics",
        "markedaspatrollederrornotify": "Échec du marquage de la modification comme relue.",
        "patrol-log-page": "Journal des relectures",
        "patrol-log-header": "Voici l’historique des versions relues.",
-       "log-show-hide-patrol": "$1 l’historique des relectures",
-       "log-show-hide-tag": "$1 le journal des balises",
        "confirm-markpatrolled-button": "Valider",
        "confirm-markpatrolled-top": "Marquer la révision $3 de $2 comme relue ?",
        "deletedrevision": "Ancienne version $1 supprimée",
index 0057921..b10a3f6 100644 (file)
        "markedaspatrollederrornotify": "Falyita du marcâjo du changement coment gouardâ.",
        "patrol-log-page": "Jornâl de gouârda",
        "patrol-log-header": "Vê-que un jornâl de les vèrsions gouardâyes.",
-       "log-show-hide-patrol": "$1 lo jornâl de gouârda",
-       "log-show-hide-tag": "$1 lo jornâl de les balises",
        "deletedrevision": "Vielye vèrsion $1 suprimâye",
        "filedeleteerror-short": "Fôta pendent la suprèssion du fichiér : $1",
        "filedeleteerror-long": "Des fôtes sont étâyes rencontrâyes pendent la suprèssion du fichiér :\n\n$1",
index b69d49c..dffd28b 100644 (file)
        "markedaspatrollederrornotify": "Det werjuun küd ei üs kontroliaret kääntiakent wurd.",
        "patrol-log-page": "Kontrol-logbuk",
        "patrol-log-header": "Det as det kontrol-logbuk.",
-       "log-show-hide-patrol": "Kontrol-logbuk $1",
-       "log-show-hide-tag": "Markiarang-logbuk $1",
        "deletedrevision": "Ual werjuun $1 stregen",
        "filedeleteerror-short": "Bi't striken faan det datei $1 as wat skiaf gingen.",
        "filedeleteerror-long": "Bi't striken faan det datei as wat skiaf gingen:\n\n$1",
index 0747907..703d080 100644 (file)
        "rcpatroldisabled": "Mhíchumasaíodh Patról na n-Athruithe is Déanaí",
        "rcpatroldisabledtext": "Tá an tréith Patról na n-Athruithe is Déanaí míchumasaithe faoi láthair.",
        "patrol-log-page": "Log phatról",
-       "log-show-hide-patrol": "$1 log phatról",
        "deletedrevision": "Scriosadh an seanleagan $1",
        "filedeleteerror-short": "Earráid comhad a scriosadh: $1",
        "previousdiff": "← Gabh chuig an difear roimhe seo",
index e1f8fc2..9bdd762 100644 (file)
        "botpasswords-created-body": "Chaidh am facal-faire bot airson a’ bhot air a bheil “$1” aig a’ chleachdaiche “$2” a chruthachadh.",
        "botpasswords-updated-title": "Chaidh am facal-faire bot ùrachadh",
        "resetpass_forbidden": "Cha ghabh na faclan-faire atharrachadh",
+       "resetpass_forbidden-reason": "Cha ghabh na faclan-faire atharrachadh: $1",
        "resetpass-no-info": "Feumaidh tu logadh a-steach mus dèan thu inntrigeadh dìreach dhan duilleag seo.",
        "resetpass-submit-loggedin": "Atharraich am facal-faire",
        "resetpass-submit-cancel": "Sguir dheth",
        "resetpass-temp-password": "Facal-faire sealach:",
        "resetpass-abort-generic": "Chuir leudachan crìoch air atharrachadh an fhacail-fhaire.",
        "resetpass-expired": "Dh'fhalbh an ùine air an fhacal-fhaire agad. Suidhich facal-faire ùr airson logadh a-steach.",
-       "resetpass-expired-soft": "Dh'fhalbh an ùine air an fhacal-fhaire agad is feumaidh tu ath-shuidheachadh. Tagh fear ùr no briog air \"{{int:authprovider-resetpass-skip-label}}\" gus ath-shuidheachadh às a dhèidh seo.",
-       "resetpass-validity-soft": "Chan eil am facal-faire seo dligheach: $1\n\nTagh facal-faire ùr an-dràsta no briog air \"{{int:authprovider-resetpass-skip-label}}\" gus ath-shuidheachadh às a dhèidh seo.",
+       "resetpass-expired-soft": "Dh'fhalbh an ùine air an fhacal-fhaire agad is feumaidh tu atharrachadh. Tagh fear ùr no briog air “{{int:authprovider-resetpass-skip-label}}” gus atharrachadh às a dhèidh seo.",
+       "resetpass-validity-soft": "Chan eil am facal-faire seo dligheach: $1\n\nTagh facal-faire ùr an-dràsta no briog air “{{int:authprovider-resetpass-skip-label}}” gus atharrachadh às a dhèidh seo.",
        "passwordreset": "Ath-shuidhich am facal-faire",
        "passwordreset-text-one": "Lìon am foirm seo gus am facal-faire agad ath-shuidheachadh.",
        "passwordreset-text-many": "Lìon {{PLURAL:$1|an raon|aon dhe na raointean}} gus facal-faire sealach fhaighinn air a' phost-d.",
        "passwordreset-emailtext-user": "Dh'iarr an cleachdaiche $1 air {{SITENAME}} ath-shuidheachadh an fhacail-fhaire air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|na cunntasan-cleachdaiche}} a leanas co-cheangailte ris an t-seòladh puist-d seo:\n\n$2\n\nFalbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire shealach|na faclan-faire sealach}} seo an ceann $5 {{PLURAL:$5|latha|latha|làithean|latha}}.\nBu chòir dhut logadh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
        "passwordreset-emailelement": "Ainm-cleachdaiche: \n$1\n\nFacal-faire sealach: \n$2",
        "passwordreset-emailsentemail": "Ma tha am post-d seo co-cheangailte ris a’ chunntas agad, thèid post-d airson ath-shuidheachadh an fhacail-fhaire a chur.",
+       "passwordreset-emailsentusername": "Ma tha post-d co-cheangailte ris an ainm-chleachdaiche seo, thèid post-d airson ath-shuidheachadh an fhacail-fhaire a chur.",
+       "passwordreset-nocaller": "Feumaidh tu gairmear a chur ann",
+       "passwordreset-nosuchcaller": "Chan eil an gairmear seo ann: $1",
+       "passwordreset-ignored": "Cha b’ urrainn dhuinn ath-shuidheachadh an fhacail-fhaire a làimhseachadh. Dh’fhaoidte nach deach solaraiche a rèiteachadh.",
+       "passwordreset-invalidemail": "Seòladh puist-d mì-dhligheach",
+       "passwordreset-nodata": "Cha deach ainm-cleachdaiche no seòladh puist-d a thoirt seachad",
        "changeemail": "Atharraich no thoir air falbh an seòladh puist-d",
        "changeemail-header": "Lìon am foirm seo a dh’atharrachadh an t-seòlaidh phuist-d agad. Ma tha thu airson an co-cheangal eadar post-d sam bith is an cunntas agad a thoirt air falbh, fàg an seòladh ùr bàn nuair a chuireas tu am foirm.",
        "changeemail-no-info": "Feumaidh tu logadh a-steach mus dèan thu inntrigeadh dìreach dhan duilleag seo.",
        "changeemail-password": "Am facal-faire agad air {{SITENAME}}:",
        "changeemail-submit": "Atharraich am post-d",
        "changeemail-throttled": "Dh'fheuch thu ri logadh a-steach ro thric.\nFuirich ort $1 mus feuch thu ris a-rithist.",
+       "changeemail-nochange": "Cuir a-steach post-d ùr eile.",
        "resettokens": "Ath-shuidhich na tòcanan",
        "resettokens-text": "'S urrainn dhut tòcanan ath-shuidheachadh a bheir cothrom dhut air cuid a dhàta prìobhaideach a tha co-cheangailte ris a' chunntas agad.\n\nBu chòir dhut seo a dhèanamh ma thug thu do chuideigin e air mhearachd no ma bhris cuideigin a-steach air a' chunntas agad.",
        "resettokens-no-tokens": "Chan eil tòcan ann a ghabhas ath-shuidheachadh.",
        "savechanges": "Sàbhail na dh’atharraich thu",
        "publishpage": "Foillsich an duilleag",
        "publishchanges": "Foillsich na mùthaidhean",
+       "savearticle-start": "Sàbhail an duilleag...",
+       "savechanges-start": "Sàbhail na h-atharraichean...",
+       "publishpage-start": "Foillsich an duilleag...",
+       "publishchanges-start": "Foillsich na mùthaidhean...",
        "preview": "Ro-shealladh",
        "showpreview": "Seall an ro-shealladh",
        "showdiff": "Seall na mùthaidhean",
        "anonpreviewwarning": "<em>Chan eil thu air logadh a-steach. Ma nì thu sàbhaladh, thèid an seòladh IP agad a chlàradh ann an eachdraidh deasachadh na duilleige seo.</em>",
        "missingsummary": "<strong>Cuimhnich:</strong> Cha dug thu seachad gearr-chunntas air na dh'atharraich thu.\nMa bhriogas tu air \"$1\" a-rithist, thèid na dheasaich thu a shàbhaladh as aonais gearr-chunntais.",
        "selfredirect": "<strong>Rabhadh:</strong> Tha thu ag ath-stiùireadh duilleag dha fhèin.\nDh'fhaoidte gun do shònraich thu an t-amas cearr airson an ath-stiùiridh no gu bheil thu a' deasachadh an duilleag cearr.\nMa nì thu briogadh air \"$1\" a-rithist,m thèid an ath-stiùireadh a chruthachadh co-dhiù.",
-       "missingcommenttext": "Cuir a-steach beachd gu h-ìosal.",
+       "missingcommenttext": "Cuir a-steach beachd.",
        "missingcommentheader": "<strong>Cuimhnich:</strong> Cha dug thu seachad cuspair airson a’ bheachd seo.\nMa bhriogas tu air “$1” a-rithist, thèid na dheasaich thu a shàbhaladh as aonais.",
-       "summary-preview": "Ro-shealladh a' ghearr-chunntais:",
+       "summary-preview": "Ro-shealladh gearr-chunntas an deasachaidh:",
        "subject-preview": "Ro-shealladh a’ chuspair:",
+       "previewerrortext": "Thachair mearachd fhad ’s a bha sinn airson ro-shealladh nan atharraichean a shealltainn dhut.",
        "blockedtitle": "Tha an cleachdair air a bhacadh",
-       "blockedtext": "<strong>Chaidh an t-ainm-cleachdaiche no an seòladh IP agad a bhacadh.</strong>\n\n'S e $1 a chur am bacadh seo ort.\n{{GENDER:$1|Thug e|Thug i|Thugadh}} an cèill gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} sin air sgàth an adhbhair seo: <em>$2</em>.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\nChan urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
+       "blockedtext": "<strong>Chaidh an t-ainm-cleachdaiche no an seòladh IP agad a bhacadh.</strong>\n\n’S e $1 a chur am bacadh seo ort.\n’S e “<em>$2</em>” an t-adbhar a thug iad.\n\n* Toiseach a’ bhacaidh: $8\n* Deireadh a’ bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n’S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianaire]] eile gus am bacadh seo a dheasbad.\nChan urrainn dhut an gleus “Cuir post-d dhan chleachdaiche seo” a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a’ chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n’S e $3 an seòladh IP làithreach agus agus ’s e #$5 ID a’ bhacaidh.\nThoir iomradh air a’ mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
        "autoblockedtext": "Chaidh an seòladh IP agad a bhacadh gu fèin-obrachail a chionn 's gun deach a chleachdadh le cuideigin eile a chaidh a bhacadh le $1.\n{{GENDER:$1|Thug e|Thug i|Thugadh}} an cèill gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} sin air sgàth an adhbhair seo: \n\n:<em>$2</em>.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\n\nDh'fhaoidte nach urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
        "blockednoreason": "cha deach adhbhar a shònrachadh",
        "whitelistedittext": "Feumaidh tu $1 mus urrainn dhut duilleagan a dheasachadh.",
        "recentchanges-legend-heading": "<strong>Treòir:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (faic [[Special:NewPages|liosta nan duilleagan ùra]] cuideachd)",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
+       "rcfilters-legend-heading": "<strong>Liosta nan giorrachaidhean:</strong>",
+       "rcfilters-activefilters": "Criathragan gnìomhach",
+       "rcfilters-activefilters-hide": "Falaich",
+       "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}, $2",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|latha|latha|làithean|latha}}",
+       "rcfilters-quickfilters": "Criathragan air an sàbhaladh",
+       "rcfilters-quickfilters-placeholder-title": "Cha do shàbhail thu criathrag fhathast",
+       "rcfilters-quickfilters-placeholder-description": "Gus roghainnean nan criathragan agad a shàbhaladh is an cleachdadh às ùr uaireigin eile, briog air ìomhaigheag a’ chomharra-lìn ann an raon na criathraige bheò gu h-ìosal.",
+       "rcfilters-savedqueries-defaultlabel": "Criathragan air an sàbhaladh",
+       "rcfilters-search-placeholder": "Criathraich na h-atharraichean (cleachd an clàr-taice no lorg ainm criathraige)",
+       "rcfilters-filterlist-whatsthis": "Ciamar a dh’obraicheas iad seo?",
+       "rcfilters-highlightbutton-title": "Soillsich toraidhean",
+       "rcfilters-filterlist-noresults": "Cha do lorg sinn criathrag",
+       "rcfilters-filter-editsbyself-label": "Mùthaidhean a rinn thusa",
+       "rcfilters-filter-editsbyself-description": "Na mùthaidhean a rinn thu fhèin.",
+       "rcfilters-filter-editsbyother-label": "Mùthaidhean a rinn daoine eile",
+       "rcfilters-filter-editsbyother-description": "Gach mùthadh ach an fheadhainn agad fhèin.",
+       "rcfilters-filtergroup-userExpLevel": "Clàradh is eòlas a’ chleachdaiche",
+       "rcfilters-filter-user-experience-level-registered-label": "Air clàradh a-steach",
+       "rcfilters-filter-user-experience-level-registered-description": "Deasaichean a rinn clàradh a-steach.",
+       "rcfilters-filter-user-experience-level-unregistered-label": "Gun chlàradh a-steach",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Deasaichean nach do rinn clàradh a-steach.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Ùranaich",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Deasaichean a chlàraich a-steach ach a rinn nas lugha na 10 deasachaidhean no aig a bheil nas lugha na 4 làithean de ghnìomhachd.",
+       "rcfilters-filter-user-experience-level-learner-label": "Luchd-ionnsachaidh",
+       "rcfilters-filter-user-experience-level-learner-description": "Deasaichean a rinn clàradh a-steach is aig a bheil eòlas eadar feadhainn air ùr-thighinn is feadhainn shàr-eòlach.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Seann-eòlaich",
+       "rcfilters-filter-user-experience-level-experienced-description": "Deasaichean a chlàraich a-steach ach a rinn barrachd air 500 deasachadh is aig a bheil barrachd air 30 latha de ghnìomhachd.",
+       "rcfilters-filtergroup-automated": "Mùthaidhean fèin-obrachail",
+       "rcfilters-filter-bots-description": "Mùthaidhean a rinn innealan fèin-obrachail.",
+       "rcfilters-filter-humans-label": "Duine (chan e bot)",
+       "rcfilters-filter-humans-description": "Deasachaidhean a rinn deasaichean daonna.",
+       "rcfilters-filtergroup-significance": "Cudromachd",
+       "rcfilters-filter-minor-label": "Mùthaidhean beaga",
+       "rcfilters-filter-major-label": "Mùthaichean nach eil beag",
+       "rcfilters-filter-major-description": "Deasachaidhean ris nach eil comharra gur e deasachadh beag a tha ann.",
+       "rcfilters-filtergroup-watchlistactivity": "Gnìomhachd a’ chlàir-fhaire",
+       "rcfilters-filter-watchlistactivity-unseen-label": "Atharraichean gun choimhead",
+       "rcfilters-filter-watchlistactivity-unseen-description": "Atharraichean air duilleagan air nach do thadhail thu on a chaidh an atharrachadh.",
+       "rcfilters-filter-watchlistactivity-seen-label": "Atharraichean air coimhead",
+       "rcfilters-filter-watchlistactivity-seen-description": "Atharraichean air duilleagan air an do thadhail thu on a chaidh an atharrachadh.",
+       "rcfilters-filter-pageedits-label": "Deasachadh duilleige",
+       "rcfilters-filter-newpages-label": "Cruthachadh duilleige",
+       "rcfilters-filter-newpages-description": "Deasachadh a chruthaich duilleag ùr.",
+       "rcfilters-filter-logactions-label": "Gnìomhan logaichte",
+       "rcfilters-filtergroup-lastRevision": "Na mùthaidhean as ùire",
+       "rcfilters-filter-lastrevision-label": "Am mùthadh mu dheireadh",
+       "rcfilters-filter-lastrevision-description": "Dìreach an t-àtharrachadh as ùire air duilleag.",
+       "rcfilters-liveupdates-button": "Ùrachadh beò",
+       "rcfilters-liveupdates-button-title-off": "Seall atharraichean ùra fhad ’s a thathar gan dèanamh",
+       "rcfilters-watchlist-markseen-button": "Comharraich gun dug thu sùil air gach atharrachadh",
+       "rcfilters-watchlist-edit-watchlist-button": "Deasaich liosta nan duilleagan air a’ chlàr-fhaire agad",
+       "rcfilters-watchlist-showupdated": "Tha atharraichean air duilleagan nach do thadhail thu orra on a chaidh an atharrachadh ann an clò <strong>trom</strong> le comharran soladach.",
        "rcnotefrom": "Chì thu {{PLURAL:$5|am mùthadh|na mùthaidhean|na mùthaidhean|na mùthaidhean}} o <strong>$3 $4</strong> (gu ruige <strong>$1</strong> dhiubh) gu h-ìosal.",
        "rclistfrom": "Seall na mùthaidhean ùra a-mach o $3 $2",
        "rcshowhideminor": "$1 mùthaidhean beaga",
        "rcshowhidemine": "$1 na mùthaidhean agam",
        "rcshowhidemine-show": "Seall",
        "rcshowhidemine-hide": "Falaich",
+       "rcshowhidecategorization-hide": "Falaich",
        "rclinks": "Seall {{PLURAL:$1|an $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|am $1 mùthadh}} mu dheireadh thairis air {{PLURAL:$2|an $2 latha|an $2 latha|na $2 làithean|am $2 latha}} mu dheireadh",
        "diff": "diofar",
        "hist": "eachdr",
        "recentchangeslinked-feed": "Mùthaidhean buntainneach",
        "recentchangeslinked-toolbox": "Mùthaidhean buntainneach",
        "recentchangeslinked-title": "Mùthaidhean co-cheangailte ri \"$1\"",
-       "recentchangeslinked-summary": "Seo liosta nam mùthaidhean a chaidh a chur air duilleagan a tha a' ceangal o dhuilleag shònraichte (no ri buill ann an roinn-seòrsa sònraichte).\nTha duilleagan air a' [[Special:Watchlist|chlàr-fhaire]] agad ann an litrichean <strong>troma</strong>.",
+       "recentchangeslinked-summary": "Cuir a-steach ainm duilleige airson atharraichean fhaicinn air duilleagan a tha a’ ceangal ris an duilleag ud no uaipe. (Airson buill de roinn-seòrsa fhaicinn, cuir a-steach {{ns:category}}:Ainm roinn-seòrsa). Tha atharraichean air duilleagan a tha air a’ [[Special:Watchlist|chlàr-fhaire]] agad ann an clò <strong>trom</strong>.",
        "recentchangeslinked-page": "Ainm na duilleige:",
        "recentchangeslinked-to": "Seall mùthaidhean nan duilleagan a tha a' ceangal ris an duilleag sin 'na àite",
        "upload": "Luchdaich suas faidhle",
        "deadendpages": "Duilleagan cùile-dùinte",
        "deadendpagestext": "Cha dèan na duilleagan seo ceangal gu duilleag sam bith eile air {{SITENAME}}.",
        "protectedpages": "Duilleagan fo dhìon",
+       "protectedpages-filters": "Criathragan:",
        "protectedpages-indef": "Dìonan buana a-mhàin",
        "protectedpages-summary": "Chì thu na duilleagan a tha ann 's gan dìon an-seo. Faic [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] airson liosta dhe na tiotalan a tha 'gan dìon o chruthachadh.",
        "protectedpages-cascade": "Dìonan o bhith mar eas a-mhàin",
        "unwatchthispage": "Na cum sùil tuilleadh",
        "notanarticle": "Chan e duilleag susbaint a tha ann",
        "notvisiblerev": "Chaidh am mùthadh mu dheireadh le cleachdaiche eile a sguabadh às",
-       "watchlist-details": "Tha {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} air a' chlàr-fhaire agad, gun luaidh air na duilleagan deasbaireachd.",
+       "watchlist-details": "Tha {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} air a’ chlàr-fhaire agad (agus duilleagan deasbaireachd a bharrachd air sin).",
        "wlheader-enotif": "Tha brathan-naidheachd air a' phost-d an comas.",
        "wlheader-showupdated": "Tha clò <strong>trom</strong> air duilleagan a chaidh atharrachadh on turas mu dheireadh a thadhail thu orra.",
        "wlnote": "Chì thu gu h-ìosal {{PLURAL:$1|a' $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|am $1 mùthadh}} mu dheireadh san {{PLURAL:$2|$2 uair a thìde|$2 uair a thìde|$2 uairean a thìde|$2 uair a thìde}} mu dheireadh, mar a bha e $3, $4.",
        "wlshowlast": "Seall na $1 uairean a thìde mu dheireadh $2 làithean mu dheireadh",
+       "watchlist-hide": "Falaich",
        "watchlist-options": "Roghainnean mo chlàir-faire",
        "watching": "'Ga chur air a' chlàr-fhaire...",
        "unwatching": "A' toirt far a' chlàir-fhaire...",
        "markedaspatrollederrornotify": "Cha b' urrainn dhuinn comharra freiceadain a chur ris.",
        "patrol-log-page": "Loga nam freiceadan",
        "patrol-log-header": "Seo loga nam mùthaidhean le comharra freiceadain riutha.",
-       "log-show-hide-patrol": "$1 loga nam freiceadan",
        "deletedrevision": "Chaidh an seann mhùthadh $1 a sguabadh às",
        "filedeleteerror-short": "Mearachd a' sguabadh às an fhaidhle: $1",
        "filedeleteerror-long": "Thachair mearachd le sguabadh às an fhaidhle:\n\n$1",
index 71d62a2..13e7581 100644 (file)
        "expansion-depth-exceeded-warning": "A páxina supera a profundidade de expansión",
        "parser-unstrip-loop-warning": "Detectouse un bucle inamovible",
        "unstrip-depth-warning": "Excedeuse o límite de recursión inamovible ($1)",
+       "unstrip-depth-category": "Páxinas nas que se excede o límite de profundidade de eliminación de etiquetas",
+       "unstrip-size-warning": "Límite de profundidade de eliminación de etiquetas superado ($1)",
+       "unstrip-size-category": "Páxinas nas que se excede o límite de tamaño de eliminación de etiquetas",
        "converter-manual-rule-error": "Detectouse un erro na regra manual de conversión da lingua",
        "undo-success": "A edición pódese desfacer.\nComprobe a comparación que aparece a continuación para confirmar que isto é o que desexa facer; despois, garde os cambios para desfacer a edición.",
        "undo-failure": "Non se pode desfacer a edición debido a un conflito con algunha das edicións intermedias.",
        "rcfilters-watchlist-showupdated": "Os cambios feitos en páxinas que non visitou dende que se efectuaron aparecen en <strong>grosas</strong>, acompañados de marcadores sólidos.",
        "rcfilters-preference-label": "Ocultar a versión mellorada de cambios recentes",
        "rcfilters-preference-help": "Reverte o redeseño da interface de 2017 e tódalas ferramentas engadidas dende entón.",
+       "rcfilters-watchlist-preference-label": "Agochar a versión mellorada da lista de vixiancia",
        "rcfilters-filter-showlinkedfrom-label": "Amosar os cambios en páxinas ligadas desde",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Páxinas ligadas desde</strong> a páxina seleccionada",
        "rcfilters-filter-showlinkedto-label": "Amosar os cambios en páxinas que ligan con",
        "log": "Rexistros",
        "logeventslist-submit": "Amosar",
        "logeventslist-more-filters": "Máis filtros:",
+       "logeventslist-patrol-log": "Rexistro de patrullas",
+       "logeventslist-tag-log": "Rexistro de etiquetas",
        "all-logs-page": "Todos os rexistros públicos",
        "alllogstext": "Vista combinada de todos os rexistros dipoñibles en {{SITENAME}}.\nPode precisar máis a vista seleccionando o tipo de rexistro, o nome do usuario ou o título da páxina afectada.",
        "logempty": "Non se atopou ningún elemento relacionado no rexistro.",
        "uctop": "(última revisión)",
        "month": "Desde o mes de (e anteriores):",
        "year": "Desde o ano (e anteriores):",
+       "date": "Dende a data (e anteriores):",
        "sp-contributions-newbies": "Mostrar só as contribucións das contas de usuario novas",
        "sp-contributions-newbies-sub": "Contribucións dos usuarios novos",
        "sp-contributions-newbies-title": "Contribucións dos usuarios novos",
        "group-bot.css": "/* O CSS que se coloque aquí afectará soamente aos bots */",
        "group-sysop.css": "/* O CSS que se coloque aquí afectará soamente aos administradores */",
        "group-bureaucrat.css": "/* O CSS que se coloque aquí afectará soamente aos burócratas */",
+       "common.json": "/* Calquera JSON que haxa aquí será cargado para todos os usuarios en tódalas cargas de páxinas. */",
        "common.js": "/* Calquera JavaScript que haxa aquí será cargado para todos os usuarios en cada páxina que vexan. */",
        "group-autoconfirmed.js": "/* Calquera JavaScript que haxa aquí será cargado soamente para os usuarios autoconfirmados */",
        "group-user.js": "/* Calquera código JavaScript escrito aquí cargarase para tódolos usuarios rexistrados */",
        "markedaspatrollederrornotify": "Erro ao marcar como revisada.",
        "patrol-log-page": "Rexistro de revisións patrulladas",
        "patrol-log-header": "Este é un rexistro das revisións patrulladas.",
-       "log-show-hide-patrol": "$1 o rexistro de patrullas",
-       "log-show-hide-tag": "$1 o rexistro de etiquetas",
        "confirm-markpatrolled-button": "Aceptar",
        "confirm-markpatrolled-top": "Quere marcar a revisión $3 de \"$2\" como patrullada?",
        "deletedrevision": "Revisión vella e borrada de \"$1\"",
index 494289f..4b224c2 100644 (file)
        "markedaspatrollederrortext": "Δεῖ σε ὁρίσειν ἀναθεώρησιν τινὰ ἵνα σεσημασμένη αὕτη ᾖ ὡς περιπολουμένη.",
        "patrol-log-page": "Κατάλογος περιπόλων",
        "patrol-log-header": "Ὅδε ἐστὶ κατάλογος περιπολουμένων ἀναθεωρήσεων.",
-       "log-show-hide-patrol": "$1 κατάλογος περιπόλου",
        "deletedrevision": "Προτέρα ἔκδοσις διαγραφεῖσα $1",
        "filedeleteerror-short": "Ἀρχεῖον διαγράφον σφάλματα: $1",
        "filedeleteerror-long": "Σφάλματα ἀπαντἠθησαν ἐν τῷ διαγράφειν τὸ ἀρχεῖον:\n\n$1",
index b907454..7554e12 100644 (file)
        "markedaspatrollederrornotify": "D Markierig als kontrolliert isch nid glunge.",
        "patrol-log-page": "Kontroll-Logbuech",
        "patrol-log-header": "Des isch s Kontroll-Logbuech.",
-       "log-show-hide-patrol": "Kontroll-Logbuech $1",
-       "log-show-hide-tag": "Markierigs-Logbuech $1",
        "deletedrevision": "alti Version: $1",
        "filedeleteerror-short": "Fähler bi dr Datei-Leschig: $1",
        "filedeleteerror-long": "Bi dr Datei-Leschig sin Fähler feschtgstellt wore:\n\n$1",
index eaa92e2..d5d9435 100644 (file)
        "markedaspatrollederror-noautopatrol": "તમે તમારા પોતાના ફેરફારોને નીરીક્ષિત અંકિત ન કરી શકો",
        "patrol-log-page": "ચકાસણી લોગ",
        "patrol-log-header": "આ નીરીક્ષિત ફેરફાઓનો લોગ છે",
-       "log-show-hide-patrol": "$1 ચકાસણી લોગ",
        "deletedrevision": "જુના સુધારા ભૂસો $1",
        "filedeleteerror-short": "ફાઇલ : $1 ભૂંસવામાં તૃટિ",
        "filedeleteerror-long": "$1 આ ફાઈલ ભૂંસતી વખતે ચૂક થઈ",
index d617622..66fc366 100644 (file)
        "markedaspatrollederrornotify": "סימון השינוי כבדוק נכשל.",
        "patrol-log-page": "יומן שינויים בדוקים",
        "patrol-log-header": "יומן זה מציג גרסאות שנבדקו.",
-       "log-show-hide-patrol": "$1 יומן שינויים בדוקים",
-       "log-show-hide-tag": "$1 יומן תגיות",
        "confirm-markpatrolled-button": "אישור",
        "confirm-markpatrolled-top": "לסמן את גרסה $3 בדף $2 כבדוקה?",
        "deletedrevision": "מחיקת גרסה ישנה ($1)",
index 62b8ba6..d290292 100644 (file)
        "markedaspatrollederrornotify": "जाँचा हुआ चिन्हित करना असफल रहा।",
        "patrol-log-page": "परीक्षण लॉग",
        "patrol-log-header": "यह परीक्षित अवतरणों की लॉग है।",
-       "log-show-hide-patrol": "परीक्षण लॉग $1",
-       "log-show-hide-tag": "$1 टैग लॉग",
        "confirm-markpatrolled-button": "ठीक है",
        "confirm-markpatrolled-top": "$2 के $3 संशोधन को परीक्षित चिन्ह्नत करे?",
        "deletedrevision": "पुराना अवतरण $1 हटा दिया",
index abd9720..bce4509 100644 (file)
        "markedaspatrollederrornotify": "Patrolled mark kare ke kosis fail hoe gais hae.",
        "patrol-log-page": "Pahraa de waala suchi",
        "patrol-log-header": "Ii pahraa dewa gais badlao ke suchi hai.",
-       "log-show-hide-patrol": "$1 pahraa de waala suchi",
-       "log-show-hide-tag": "$1 tag log",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Mark karo ki ii revision $3 of $2 patrolled hai?",
        "deletedrevision": "Purana badlao ke mitae dia hai $1",
index 013c0b1..ccdca67 100644 (file)
        "markedaspatrollederrornotify": "Označavanje stranice pregledanom nije uspjelo.",
        "patrol-log-page": "Evidencija ophodnji i samoophodnji",
        "patrol-log-header": "Ovo su evidencije ophođenih izmjena.",
-       "log-show-hide-patrol": "$1 evidenciju ophodnji",
-       "log-show-hide-tag": "$1 evidenciju oznaka",
        "confirm-markpatrolled-button": "U redu",
        "confirm-markpatrolled-top": "Označiti izmjenu $3 stranice $2 pregledanom?",
        "deletedrevision": "izbrisana stara inačica $1",
index 4290382..8b28e9f 100644 (file)
        "markedaspatrollederrornotify": "Der Versuch, die Version als wie kontrolliert se markiere, ist fehlgeschlooht.",
        "patrol-log-page": "Kontroll-Logbuch",
        "patrol-log-header": "Das ist das Kontroll-Logbuch.",
-       "log-show-hide-patrol": "Kontroll-Logbuch $1",
        "deletedrevision": "alte Version $1 abgewischt",
        "filedeleteerror-short": "Fehler bei Datei-Abwäsch: $1",
        "filedeleteerror-long": "Bei der Datei-Abwischung woorre Fehler festgestellt:\n\n$1",
index 814ac0d..f979761 100644 (file)
        "markedaspatrollederrornotify": "Markěrowanje jako dohladowane je so njeporadźiło.",
        "patrol-log-page": "Protokol přepruwowanjow",
        "patrol-log-header": "To je protokol dohladowanych wersijow.",
-       "log-show-hide-patrol": "Protokol dohladowanja $1",
-       "log-show-hide-tag": "Protokol markěrowanjow $1",
        "confirm-markpatrolled-button": "W porjadku",
        "confirm-markpatrolled-top": "Wersiju $3 strony $2 jako přehladowanu markěrować?",
        "deletedrevision": "Stara wersija $1 wušmórnjena",
index 97848de..a21edc9 100644 (file)
        "markedaspatrollederrornotify": "Nem sikerült ellenőrzöttnek jelölni.",
        "patrol-log-page": "Ellenőrzési napló (patrol)",
        "patrol-log-header": "Ez az ellenőrzött változatok naplója.",
-       "log-show-hide-patrol": "járőrnapló $1",
-       "log-show-hide-tag": "címkenapló $1",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Ellenőrzöttnek jelölöd a(z) $2 lap $3 változatát?",
        "deletedrevision": "Régebbi változat törölve: $1",
index 9eed78c..48828ae 100644 (file)
        "markedaspatrollederrornotify": "Le marcar como patruliate ha fallite.",
        "patrol-log-page": "Registro de patrulia",
        "patrol-log-header": "Isto es un registro de versiones patruliate.",
-       "log-show-hide-patrol": "$1 le registro de versiones patruliate",
-       "log-show-hide-tag": "$1 registro de etiquettas",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Marcar le version $3 de $2 como patruliate?",
        "deletedrevision": "Deleva le ancian version $1",
index 0ffc1dd..fc966d7 100644 (file)
        "markedaspatrollederrornotify": "Menandai sebagai terpatroli gagal.",
        "patrol-log-page": "Log patroli",
        "patrol-log-header": "Ini adalah log revisi terpatroli.",
-       "log-show-hide-patrol": "$1 log patroli",
-       "log-show-hide-tag": "log tag $1",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Tandai revisi $3 dari $2 sebagai terperiksa?",
        "deletedrevision": "Revisi lama yang dihapus $1",
index 269e7a0..e174f14 100644 (file)
        "markedaspatrollederrornotify": "Ti panagmarka a kas napatruliaan ket napaay.",
        "patrol-log-page": "Listaan ti napatruliaan",
        "patrol-log-header": "Daytoy ket listaan dagiti napatruliaan a rebision.",
-       "log-show-hide-patrol": "$1 listaan ti napatruliaan",
-       "log-show-hide-tag": "$1 ti listaan ti etiketa",
        "confirm-markpatrolled-button": "Sige",
        "confirm-markpatrolled-top": "Markaan ti rebision $3 iti $2 a kas napatruliaan?",
        "deletedrevision": "Naikkat a daan a rebision ti $1",
index 01fc2fd..9b87ad7 100644 (file)
        "pageinfo-contentpage": "Счётчико чулацаме оагIув санна лоархI",
        "pageinfo-contentpage-yes": "XIаа",
        "patrol-log-page": "ТӀахьожама тептар",
-       "log-show-hide-patrol": "$1 патрул яра тептар",
-       "log-show-hide-tag": "$1 фостий тептар",
        "previousdiff": "← КъаьнагIа дола нийсдаьр",
        "nextdiff": "КердагӀа дола нийсдаьр →",
        "imagemaxsize": "Сурта боарамá доазув тохар:<br />''(Файлах лаьца дувцача оагӀона)''",
index 6d5ce82..f14b845 100644 (file)
        "markedaspatrollederrornotify": "Mistókst að merkja síðuna sem yfirfarna.",
        "patrol-log-page": "Yfirferðarskrá",
        "patrol-log-header": "Þetta er skrá yfir yfirfarnar breytingar.",
-       "log-show-hide-patrol": "$1 listi yfir yfirfarnar síður",
-       "log-show-hide-tag": "$1 merkjaannáll",
        "confirm-markpatrolled-button": "Í lagi",
        "deletedrevision": "Eyddi gamla útgáfu $1",
        "filedeleteerror-short": "Villa við eyðingu: $1",
index d0ffa8e..f18538b 100644 (file)
        "markedaspatrollederrornotify": "Errore durante la verifica.",
        "patrol-log-page": "Modifiche verificate",
        "patrol-log-header": "Di seguito sono elencate le verifiche delle modifiche.",
-       "log-show-hide-patrol": "$1 registro delle modifiche verificate",
-       "log-show-hide-tag": "$1 registro delle etichette",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Segna versione $3 di $2 come verificata?",
        "deletedrevision": "Cancellata la vecchia versione di $1.",
index 2d37572..ca6445d 100644 (file)
        "markedaspatrollederrornotify": "巡回済みにするのに失敗しました。",
        "patrol-log-page": "巡回記録",
        "patrol-log-header": "以下は巡回された版の記録です。",
-       "log-show-hide-patrol": "巡回記録を$1",
-       "log-show-hide-tag": "タグ記録を$1",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "ページ$2の$3の版を巡回済みにマークしますか?",
        "deletedrevision": "古い版 $1 を削除しました",
index 336b741..d4fa406 100644 (file)
        "markedaspatrollederrornotify": "Penanda patroli gagal dibuat.",
        "patrol-log-page": "Log patroli",
        "patrol-log-header": "Iki log revisi sing wis dipatroli.",
-       "log-show-hide-patrol": "$1 log patroli",
        "confirm-markpatrolled-button": "YA",
        "deletedrevision": "Revisi lawas sing dibusak $1.",
        "filedeleteerror-short": "Kaluputan nalika mbusak berkas: $1",
index 951289f..2982e73 100644 (file)
        "markedaspatrollederrornotify": "პატრულირებულად მონიშვნა ვერ მოხერხდა.",
        "patrol-log-page": "პატრულირების ჟურნალი",
        "patrol-log-header": "ეს არის პატრულირებულ ვერსიათა ჟურნალი.",
-       "log-show-hide-patrol": "$1 პატრულირების ჟურნალი",
-       "log-show-hide-tag": "$1 დასათაურების ჟურნალი",
        "confirm-markpatrolled-button": "კარგი",
        "confirm-markpatrolled-top": "მოინიშნოს $2-ის $3 ცვლილება  შემოწმებულად?",
        "deletedrevision": "წაშლილია ძველი ვერსია $1.",
index 89b564b..631949d 100644 (file)
        "markedaspatrollederrornotify": "Axṣar n ucṛaḍ am aken yetsenqed.",
        "patrol-log-page": "Aɣmis n usenqad",
        "patrol-log-header": "Atan amezruy n ileqman yetwalsɣren.",
-       "log-show-hide-patrol": "$1 amezruy n alstiɣuryin",
        "deletedrevision": "Tasiwelt taqdimt $1 tettumḥa.",
        "filedeleteerror-short": "Tuccḍ deg tukksa n ufaylu : $1",
        "filedeleteerror-long": "Llant tuccḍiwin deg tukksa n ufaylu :\n\n$1",
index 1752c1c..d9b0a87 100644 (file)
        "sp-contributions-logs": "لاگز",
        "sp-contributions-talk": "تبادلہ خیال",
        "sp-contributions-search": "تان نیویشیرو مضمونن تلاش کورے",
-       "sp-contributions-username": "آئی.پی پتہ یا اسمِ صارف:",
+       "sp-contributions-username": "آئی پی پتہ یا صارف نام:",
        "sp-contributions-toponly": "صرف حالیہ ترین نظرثانی ترمیماتن پشاؤے",
        "sp-contributions-submit": "Search/تلاش",
        "whatlinkshere": "ھیارا کیہ کیہ لنک شینی",
index 86a0d7f..93f7982 100644 (file)
        "markedaspatrollederrornotify": "Тексерілді деп белгіленбеді.",
        "patrol-log-page": "Тексеру журналы",
        "patrol-log-header": "Бұл тексерілген нұсқалар журналы",
-       "log-show-hide-patrol": "$1 тексеру журналы",
-       "log-show-hide-tag": "$1 белгі журналы",
        "deletedrevision": "Ескі түзетуін жойды: $1",
        "filedeleteerror-short": "Файл жою қатесі: $1",
        "filedeleteerror-long": "Файлды жойғанда қателер кездесті:\n\n$1",
index 6c05903..abb26c9 100644 (file)
        "markedaspatrollederror": "មិនអាចគូសចំណាំថាបានល្បាត",
        "patrol-log-page": "កំណត់ហេតុនៃការតាមដាន",
        "patrol-log-header": "នេះជាកំណត់ហេតុនៃកំណែ​ប្រែ​ដែល​បាន​តាមដាន",
-       "log-show-hide-patrol": "កំណត់ហេតុនៃការតាមដាន $1",
        "confirm-markpatrolled-button": "យល់ព្រម",
        "deletedrevision": "កំណែចាស់ដែលត្រូវបានលុបចេញ $1",
        "filedeleteerror-short": "កំហុសនៃការលុបឯកសារ៖ $1",
index 0108114..0a4000a 100644 (file)
        "diff-paragraph-moved-toold": "문단이 이동되었습니다. 오래된 위치로 이동하려면 클릭하십시오.",
        "difference-missing-revision": "문서 비교에서 {{PLURAL:$2|하나|$2개}}의 판($1)을 찾을 수 {{PLURAL:$2|없습니다}}.\n\n이 문제는 주로 삭제된 문서를 가리키는 오래된 문서 비교 링크로 인해 발생합니다.\n자세한 내용은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 확인할 수 있습니다.",
        "searchresults": "검색 결과",
+       "search-filter-title-prefix-reset": "모든 문서 검색",
        "searchresults-title": "\"$1\"에 대한 검색 결과",
        "titlematches": "문서 제목 일치",
        "textmatches": "문서 내용 일치",
        "speciallogtitlelabel": "대상 (문서 제목 또는 {{ns:user}}:사용자 이름으로 사용자 검색):",
        "log": "기록 목록",
        "logeventslist-submit": "보기",
-       "logeventslist-more-filters": "더 많은 필터:",
+       "logeventslist-more-filters": "추가 기록 표시:",
        "logeventslist-patrol-log": "점검 기록",
        "logeventslist-tag-log": "태그 기록",
        "all-logs-page": "모든 공개 기록",
        "markedaspatrollederrornotify": "점검한 것으로 표시를 실패했습니다.",
        "patrol-log-page": "점검 기록",
        "patrol-log-header": "문서 점검에 대한 기록입니다.",
-       "log-show-hide-patrol": "점검 기록을 $1",
-       "log-show-hide-tag": "태그 기록을 $1",
        "confirm-markpatrolled-button": "확인",
        "confirm-markpatrolled-top": "$2의 $3 판을 점검한 것으로 표시하시겠습니까?",
        "deletedrevision": "예전 $1 판이 삭제되었습니다.",
index f8b077a..89e4ac1 100644 (file)
        "markedaspatrollednotify": "«$1» бетдеги бу тюрлениу тинтиб къаралгъанча белгиленди.",
        "patrol-log-page": "Патруль этиуню журналы",
        "patrol-log-header": "Бу осмакъланнган версияланы журналыды.",
-       "log-show-hide-patrol": "Осмакълауну журналы $1",
        "deletedrevision": "$1 эски версия кетерилгенди.",
        "filedeleteerror-short": "Файл кетериуню халаты: $1",
        "filedeleteerror-long": "Файлны кетериуде халатлагъа тюбелди:\n\n$1",
index 970fd3d..d3f6dbd 100644 (file)
        "markedaspatrollederrornotify": "Dat di Sigg nohjekik es, kunnte mer nit faßhalde.",
        "patrol-log-page": "Logbohch vun de nohjelohrte Änderonge",
        "patrol-log-header": "<!-- -->",
-       "log-show-hide-patrol": "$1 et Logbuch vum Sigge nohlooere",
-       "log-show-hide-tag": "Donn et Logbohch vun de Makkehronge $1",
        "deletedrevision": "De ahle Väsjohn „$1“ es fottjeschmeße",
        "filedeleteerror-short": "Fähler bem Dattei-Fottschmiiße: $1",
        "filedeleteerror-long": "Bem Fosooch, de Dattei fottzeschmihße, hatte mer Fähler:\n\n$1",
index 5833a57..edb6586 100644 (file)
        "markaspatrolledtext": "Indicare hanc paginam qua circumita",
        "markedaspatrolled": "Indicare hanc paginam qua circumita",
        "patrol-log-page": "Acta emendationum circumitarum",
-       "log-show-hide-patrol": "$1 acta emendationum circumitarum",
        "deletedrevision": "Abolita redactio imaginis $1",
        "previousdiff": "← Differentia superior",
        "nextdiff": "Differentia proxima →",
index 130d2ca..7d5ea83 100644 (file)
        "diff-paragraph-moved-toold": "Den Abschnitt gouf geréckelt. Klickt fir op déi al Plaz ze sprangen.",
        "difference-missing-revision": "{{PLURAL:$2|Eng Versioun|$2 Versioune}} vun dëser Differenz ($1) {{PLURAL:$2|gouf|goufen}} net fonnt.\n\nDat geschitt normalerweis wann Dir op e vereelste Link vun enger Versioun vun enger Säit klickt déi geläscht ginn ass.\nDetailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Logbuch vum Läschen].",
        "searchresults": "Resultat vum Sichen",
+       "search-filter-title-prefix-reset": "Op all de Säite sichen",
        "searchresults-title": "Resultater vum Sichen no \"$1\"",
        "titlematches": "Iwwereneestëmmungen am Säitentitel",
        "textmatches": "Iwwereneestëmmungen am Säitentext",
        "block": "Benotzer spären",
        "unblock": "D'Spär vum Benotzer ophiewen",
        "blockip": "{{GENDER:$1|Benotzer}} spären",
-       "blockiptext": "Benotzt dëse Formulaire fir eng spezifesch IP-Adress oder e Benotzernumm ze spären.\nDëst soll nëmmen am Fall vu Vandalismus gemaach ginn, en accordance mat den [[{{MediaWiki:Policy-url}}|interne Richlinen]].\nGitt e spezifesche Grond un (zum Beispill Säite wou Vandalismus virgefall ass).\nDir kënnt IP-Beräicher spären an deem Dir d' [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] Syntax benotzt; de gréissten erlaabte Beräich as  /$1 fir IPv4 an /$2 fir IPv6",
+       "blockiptext": "Benotzt dëse Formulaire fir eng spezifesch IP-Adress oder e Benotzernumm ze spären.\nDëst soll nëmmen am Fall vu Vandalismus gemaach ginn, en accordance mat den [[{{MediaWiki:Policy-url}}|interne Richtlinnen]].\nGitt e spezifesche Grond un (zum Beispill Säite wou Vandalismus virgefall ass).\nDir kënnt IP-Beräicher spären an deem Dir d' [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] Syntax benotzt; de gréissten erlaabte Beräich as  /$1 fir IPv4 an /$2 fir IPv6",
        "ipaddressorusername": "IP-Adress oder Benotzernumm:",
        "ipbexpiry": "Gültegkeet:",
        "ipbreason": "Grond:",
-       "ipbreason-dropdown": "*Heefeg Ursaache fir Benotzer ze spären:\n**Bewosst falsch Informatiounen an eng oder méi Säite gesat\n**Ouni Grond Inhalt vu Säite geläscht\n**Spam-Verknëppunge mat externe Säiten\n**Topereien an d'Säite gesat\n**Beleidegt oder bedréit aner Mataarbechter\n**Mëssbrauch vu verschiddene Benotzernimm\n**Net akzeptabele Benotzernumm",
+       "ipbreason-dropdown": "*Heefeg Ursaache fir Benotzer ze spären:\n**Bewosst falsch Informatiounen an eng oder méi Säite gesat\n**Ouni Grond Inhalt vu Säite geläscht\n**Spam-Verknëppunge mat externe Säiten\n**Topereien an d'Säite gesat\n**Beleidegt oder bedreet aner Mataarbechter\n**Mëssbrauch vu verschiddene Benotzernimm\n**Net akzeptabele Benotzernumm",
        "ipb-hardblock": "Verhënneren datt ageloggt Benotzer vun dëser IP-Adress aus Ännerunge maache kënnen",
        "ipbcreateaccount": "Opmaache vun engem Benotzerkont verhënneren",
        "ipbemailban": "Verhënneren datt de Benotzer E-Maile verschéckt",
        "markedaspatrollederrornotify": "Markéieren als kontrolléiert huet net funktionéiert.",
        "patrol-log-page": "Logbuch vun den iwwerkuckte Versiounen",
        "patrol-log-header": "Dëst ass d'Logbuch vun den nogekuckte Versiounen.",
-       "log-show-hide-patrol": "Kontroll-Logbuch $1",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Versioun $3 vu(n) $2 als kontrolléiert markéieren?",
        "deletedrevision": "Al, geläscht Versioun vu(n) $1",
index 4821c83..f279596 100644 (file)
        "markedaspatrollederrornotify": "La marca como patruliada ia fali.",
        "patrol-log-page": "Arcivo de patrulias",
        "patrol-log-header": "Esta es un rejistra de revisas patruliada.",
-       "log-show-hide-patrol": "$1 rejistra de patrulias",
-       "log-show-hide-tag": "$1 rejistra de eticetas",
        "confirm-markpatrolled-button": "Oce",
        "confirm-markpatrolled-top": "Marca revisa $3 de $2 como patruliada?",
        "deletedrevision": "Sutrae revisa vea $1",
index b1e6101..fe1221f 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Kizito",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Erinamukuta"
                ]
        },
        "tog-underline": "Enyunzi ebengako olukoloboze?",
        "nstab-template": "Lutiba",
        "nstab-help": "Buyambi",
        "nstab-category": "Ttuluba lya",
+       "mainpage-nstab": "Olupapula Olusinga Omugaso",
        "nosuchaction": "Ekikolwa ekyo tekisoboka",
        "nosuchactiontext": "Ekikolwa ekikongojedwa mu URL tekisoboka.<br />\nOyinza okuba nga URL wagiwandise bubi, oba yo URL y'eyinza okuba nga ya nsobi.<br />\nKiyinza ate okuba nti sofutiweya {{SITENAME}} gy'ekozesa erimu ebitali bituufu.",
        "nosuchspecialpage": "Olwo olupapula olwawule teruliwo",
index 23ea9cb..f7db609 100644 (file)
        "markedaspatrollederrornotify": "Markere es gecontroleerd mislök.",
        "patrol-log-page": "Markeerlogbook",
        "patrol-log-header": "Dit logbook bevat versies die gemarkeerd zeen es gecontroleerd.",
-       "log-show-hide-patrol": "Markeerlogbook $1",
-       "log-show-hide-tag": "$1 labellogbook",
        "confirm-markpatrolled-button": "Ok",
        "confirm-markpatrolled-top": "Markeer bewirking $3 van $2 es gecontroleerd?",
        "deletedrevision": "Aw versie $1 gewis",
index a47b186..3849fa2 100644 (file)
        "markedaspatrollederrornotify": "Errô durante a veifica.",
        "patrol-log-page": "Modiffiche controlæ",
        "patrol-log-header": "Questo o l'è 'n registro de revixoin controlæ.",
-       "log-show-hide-patrol": "$1 registro di controlli",
-       "log-show-hide-tag": "$1 registro di etichette",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Marca verscion $3 de $2 comme veificâ?",
        "deletedrevision": "Scassou a vegia verscion de $1.",
index e474285..2e98cb9 100644 (file)
        "markedaspatrollederrornotify": "زدن برچسب گشت، ناموفق بود.",
        "patrol-log-page": "سیاههٔ گشت",
        "patrol-log-header": "این سیاهه‌ای از ویرایش‌های گشت‌خورده است.",
-       "log-show-hide-patrol": "$1 سیاههٔ گشت‌زنی",
-       "log-show-hide-tag": "$1 سیاهه برچسب",
        "deletedrevision": "$1 نسخهٔ حذف شدهٔ قدیمی",
        "filedeleteerror-short": "خطا در حذف پرونده: $1",
        "filedeleteerror-long": "در زمان حذف پرونده خطا رخ داد:\n\n$1",
index fb7a5ee..ab62a89 100644 (file)
        "markedaspatrollederrornotify": "نشودار کردن چی نشودار بیه شکست حرده",
        "patrol-log-page": "پهرستنومه گشتن",
        "patrol-log-header": "یه پهرستنومه وانئریا سردیاری کرده هئ.",
-       "log-show-hide-patrol": "$1 پهرستنومه سردیاری کردن",
-       "log-show-hide-tag": "سردیس پهرستنومه $1",
        "deletedrevision": "وانئری دماتری پاکسابیه د $1",
        "filedeleteerror-short": "خطا پاک نبیئن جانیا:$1",
        "filedeleteerror-long": "د گات پاکسا کردن جانیا یه گل خطا پیش اوما:\n\n\n$1",
index 27d7605..78a2748 100644 (file)
        "markedaspatrollederrornotify": "Nepavyko pažymėti kaip patikrinto.",
        "patrol-log-page": "Patikrinimų sąrašas",
        "patrol-log-header": "Tai patvirtintų versijų sąrašas.",
-       "log-show-hide-patrol": "$1 patvirtinimų sąrašą",
-       "log-show-hide-tag": "$1 žymės žurnalas",
        "confirm-markpatrolled-button": "GERAI",
        "deletedrevision": "Ištrinta sena versija $1",
        "filedeleteerror-short": "Klaida trinant rinkmeną: $1",
index 800bcef..d7c7e26 100644 (file)
        "markedaspatrolledtext": "[[:$1]] ennawnna thlansa hi vil anga chhinchhiah a ni.",
        "markedaspatrollederror": "Vil anga chhinchhiah theih a ni lo",
        "patrol-log-page": "Vil chhinchhiahna",
-       "log-show-hide-patrol": "Vil chhinchhiahna $1",
        "filedeleteerror-long": "Taksa paih tum laiin buaina a lo thleng\n\n$1",
        "previousdiff": "←Siamţhatna hlui zâwk",
        "nextdiff": "Siamţhatna thar zâwk→",
index 5176eaf..e3a3066 100644 (file)
        "markedaspatrollednotify": "Šī izmaiņa lapā \"$1\" ir atzīmēta kā patrulēta.",
        "patrol-log-page": "Pārbaudes reģistrs",
        "patrol-log-header": "Šis ir pārbaudīto versiju reģistrs.",
-       "log-show-hide-patrol": "$1 pārbaudes reģistrs",
        "confirm-markpatrolled-button": "Labi",
        "confirm-markpatrolled-top": "Atzīmēt lapas \"$2\" versiju $3 kā pārbaudītu?",
        "deletedrevision": "Izdzēstā vecā versija $1",
index 8d86a73..43496d7 100644 (file)
        "markedaspatrollederror-noautopatrol": "己易不可自審。",
        "patrol-log-page": "誌哨",
        "patrol-log-header": "此乃誌哨也。",
-       "log-show-hide-patrol": "$1誌巡",
        "deletedrevision": "刪舊審$1",
        "filedeleteerror-short": "刪檔有誤:$1",
        "filedeleteerror-long": "刪檔有誤:\n\n$1",
index 8e2a16b..d4c3e75 100644 (file)
        "markedaspatrollederrornotify": "जाँचल चिन्हासी असफल भेल।",
        "patrol-log-page": "परीक्षण लौग",
        "patrol-log-header": "ई परीक्षित अवतरणसभक लौग छी।",
-       "log-show-hide-patrol": "$1 निरीक्षण लौग",
-       "log-show-hide-tag": "$1 ट्याग लग",
        "deletedrevision": "पुरान संशोधन $1 हटा देलौं",
        "filedeleteerror-short": "संचिका मेटेबामे भ्रम : $1",
        "filedeleteerror-long": "संचिका मेटेबा काल भ्रम संकेत भेटल:\n$1",
index 4c8257a..8f4fd3c 100644 (file)
        "markedaspatrollederror-noautopatrol": "Тондейть аф мярьгови тяштемс эсь полфнемацень кода патрулень варжафт.",
        "patrol-log-page": "Патрулень лувомась",
        "patrol-log-header": "Патруль ала верзиетнень лувомась.",
-       "log-show-hide-patrol": "$1 патрулень лувомась",
        "deletedrevision": "Нардаф сире илякстоптома $1",
        "filedeleteerror-short": "Лиссь эльбятькс нардамста файл: $1",
        "filedeleteerror-long": "Лиссть эльбятькст нардамста файл:\n\n$1",
index aea1f0e..264389c 100644 (file)
        "markedaspatrollederrornotify": "Tsy nahamarika azy ho voaara-maso.",
        "patrol-log-page": "Laogin'ny fanovana voamarina",
        "patrol-log-header": "Ity dia laogy mikasikan'ny fanovana voamarina.",
-       "log-show-hide-patrol": "$1 ny laogy mikasikan'ny versiona voamarina",
-       "log-show-hide-tag": "$1 laogim-balizy",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Hanamarika ny reviziôna $3 an'i $2 ho voamarina?",
        "deletedrevision": "Fanovana an'i $1 taloha voafafa.",
index 4a7c7e1..642e01e 100644 (file)
        "rcpatroldisabled": "Patroli parubahan baru dimatian",
        "patrol-log-page": "Log patroli",
        "patrol-log-header": "Iko daftar log revisi nan alah dipatroli.",
-       "log-show-hide-patrol": "$1 log patroli",
        "previousdiff": "← Revisi sabalunnyo",
        "nextdiff": "Revisi salanjuiknyo →",
        "imagemaxsize": "Bateh ukuran gambar:<br />''(untuak laman katarangan berkas)''",
index b4b35ff..f347dc0 100644 (file)
        "diff-paragraph-moved-toold": "Пасусот е преместен. Стиснете за да прејдете на старото место.",
        "difference-missing-revision": "Не пронајдов {{PLURAL:$2|една преработка|$2 преработки}} од оваа разлика ($1).\n\nОва обично се должи на застарена врска за разлики што води кон избришана страница.\nПовеќе подробности ќе најдете во [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневникот на бришења].",
        "searchresults": "Исход од пребарувањето",
+       "search-filter-title-prefix": "Пребарување по страници чиј наслов почнува со „$1“",
+       "search-filter-title-prefix-reset": "Пребарај по сите страници",
        "searchresults-title": "Исход од пребарувањето на „$1“",
        "titlematches": "Совпаднати наслови",
        "textmatches": "Совпаднат текст во страниците",
        "speciallogtitlelabel": "Цел (наслов или {{ns:user}}:корисничко име на корисникот):",
        "log": "Дневници",
        "logeventslist-submit": "Прикажи",
-       "logeventslist-more-filters": "Повеќе филтри:",
+       "logeventslist-more-filters": "Прикажи повеќе дневници:",
        "logeventslist-patrol-log": "Дневник на патролирања",
        "logeventslist-tag-log": "Дневник на ознаки",
        "all-logs-page": "Сите јавни дневници",
        "markedaspatrollederrornotify": "Означувањето како испатролирано не успеа.",
        "patrol-log-page": "Дневник на патролирања",
        "patrol-log-header": "Ова е дневник на патролирани преработки.",
-       "log-show-hide-patrol": "$1 дневник на патролирање",
-       "log-show-hide-tag": "$1 дневник на ознаки",
        "confirm-markpatrolled-button": "ОК",
        "confirm-markpatrolled-top": "Да ја означан преработката $3 на $2 како испатролирана?",
        "deletedrevision": "Избришана стара преработка $1.",
index b4d51b8..de580c9 100644 (file)
        "markedaspatrollederrornotify": "റോന്തുചുറ്റിയതെന്ന് അടയാളപ്പെടുത്തൽ പരാജയപ്പെട്ടു.",
        "patrol-log-page": "റോന്തുചുറ്റൽ പ്രവർത്തനരേഖ",
        "patrol-log-header": "റോന്തുചുറ്റപ്പെട്ട നാൾപ്പതിപ്പുകളുടെ രേഖയാണിത്",
-       "log-show-hide-patrol": "റോന്തുചുറ്റൽ രേഖ $1",
-       "log-show-hide-tag": "ടാഗ് രേഖ $1",
        "confirm-markpatrolled-button": "ശരി",
        "confirm-markpatrolled-top": "$2 താളിലെ $3 നാൾപ്പതിപ്പ് റോന്തുചുറ്റിയതായി അടയാളപ്പെടുത്തണോ?",
        "deletedrevision": "$1 എന്ന പഴയ പതിപ്പ് മായ്ച്ചിരിക്കുന്നു",
index d7d3dc5..84528b9 100644 (file)
        "markedaspatrollederror-noautopatrol": "Та өөрийн өөрчлөлтүүдээ эргүүлээр хянагдсан гэж тэмдэглэж болохгүй.",
        "patrol-log-page": "Эргүүлийн лог",
        "patrol-log-header": "Энэ нь манагдсан засваруудын лог юм.",
-       "log-show-hide-patrol": "мануулын логийг $1",
        "deletedrevision": "Хуучин засвар $1 нь устгагдлаа",
        "filedeleteerror-short": "Файлыг устгахад алдаа гарлаа: $1",
        "filedeleteerror-long": "Дараах файлыг устгахад алдаа гарлаа:\n\n$1",
index 9dd455c..5f22f95 100644 (file)
        "mypreferences": "Preferences",
        "group-bot": "ꯕꯣꯇꯁꯤꯡ",
        "group-sysop": "ꯆꯨꯞꯂꯤ ꯄꯥꯏꯔꯤꯕꯁꯤꯡ",
-       "grouppage-bot": "ꯕꯣꯇ ꯁꯤꯡ:{{ns:project}}",
+       "grouppage-bot": "{{ns:project}}:ꯕꯣꯠꯁꯤꯡ",
        "grouppage-sysop": "ꯉꯥꯛ ꯁꯦꯟꯂꯤꯕ {{ns:project}}",
        "right-writeapi": "API sijinaduna eba",
        "newuserlogpage": "User creation log",
        "action-edit": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯁꯦꯝꯒꯠꯂꯨ",
+       "action-createaccount": "ꯃꯁꯤ ꯁꯤꯖꯤꯟꯅꯔꯤꯕ ꯑꯦꯀꯥꯎꯟ ꯁꯤ ꯁꯦꯝꯃꯨ",
        "enhancedrc-history": "ꯄꯨꯋꯥꯔꯤ",
        "recentchanges": "ꯍꯧꯖꯤꯛꯀꯤ ꯑꯣꯏꯕꯥ ꯑꯍꯣꯡꯕꯁꯤꯡ",
        "recentchanges-legend": "ꯍꯧꯖꯤꯛꯀꯤ ꯑꯣꯏꯕꯥ ꯑꯍꯣꯡꯕꯥ ꯈꯟꯐꯝꯁꯤꯡ",
        "rollbacklink": "ꯑꯃꯨꯛ ꯍꯟꯍꯟꯕꯥ",
        "rollbacklinkcount": "rollback $1 {{PLURAL:$1|edit|edits}}",
        "protectlogpage": "ꯂꯣꯒ ꯉꯥꯛꯊꯣꯛꯄꯥ",
+       "protectedarticle": "\"[[$1]]\" ꯉꯥꯛꯊꯣꯛꯂꯦ",
+       "protect-default": "ꯁꯤꯖꯤꯟꯅꯔꯤꯕꯁꯤꯡ ꯄꯨꯂꯞ ꯌꯥꯍꯟꯕ",
        "restriction-edit": "ꯁꯦꯝꯒꯠꯄꯥ",
        "restriction-move": "ꯂꯦꯡꯍꯟꯕꯥ",
        "namespace": "ꯃꯥꯃꯤꯡꯒꯤ ꯃꯐꯝ",
        "whatlinkshere-title": "$1 ꯒꯥ ꯃꯔꯤ ꯂꯩꯅꯕꯥ ꯁꯝꯅꯐꯝ",
        "whatlinkshere-page": "ꯂꯥꯃꯥꯏ",
        "linkshere": "$2<strong> ꯒꯥ ꯁꯝꯅꯐꯝ ꯑꯣꯏꯕꯥ ꯂꯥꯃꯥꯏꯁꯤꯡ",
+       "nolinkshere": " <strong>$2</strong> ꯃꯁꯤꯒ ꯁꯝꯅꯕ ꯂꯥꯃꯥꯏꯁꯤꯡ ꯂꯩꯇꯦ",
        "isredirect": "ꯑꯃꯨꯛ ꯍꯟꯂꯛꯄꯥ ꯂꯥꯃꯥꯏ",
        "istemplate": " transclusions",
        "isimage": "ꯐꯥꯏꯜꯒꯤ ꯁꯝꯅꯐꯝ",
        "tooltip-ca-delete": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯀꯛꯊꯠꯂꯨ",
        "tooltip-ca-move": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯂꯦꯡꯍꯟꯂꯨ",
        "tooltip-ca-watch": "ꯅꯪꯒꯤ ꯌꯦꯡꯅꯕꯥ ꯄꯥꯔꯦꯡꯗꯨꯗꯥ ꯍꯥꯞꯆꯏꯟꯂꯨ ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ",
+       "tooltip-ca-unwatch": "ꯅꯪꯒꯤ ꯌꯦꯡꯅꯕ ꯄꯥꯔꯦꯡ ꯗꯒꯤ ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯂꯧꯊꯣꯛ ꯎ",
        "tooltip-search": "ꯊꯤꯔꯣ",
        "tooltip-search-go": "ꯂꯩꯔꯒꯥ ꯆꯠꯂꯨ ꯃꯗꯨꯒꯤ ꯆꯞꯆꯕ ꯂꯥꯃꯥꯏ ꯗꯨꯗ",
        "tooltip-search-fulltext": "ꯏꯔꯤꯕꯥ ꯃꯇꯦꯛꯁꯤꯒꯤ ꯂꯃꯥꯏ ꯁꯤ ꯊꯤꯔꯣ",
index 4f0d86b..7fa61b8 100644 (file)
        "markedaspatrollederrornotify": "'पहारा दिला' म्हणून अंकित करणे विफल झाले.",
        "patrol-log-page": "टेहळणीतील नोंदी",
        "patrol-log-header": "ही पाहणीनंतरच्या निरीक्षणाची नोंद आहे.",
-       "log-show-hide-patrol": "$1 गस्तीची नोंद",
        "confirm-markpatrolled-button": "ठीक आहे",
        "confirm-markpatrolled-top": "$2च्या $3 आवृत्तीवर पहारा दिला म्हणून खूण करायची?",
        "deletedrevision": "जुनी आवृत्ती ($1) वगळली.",
index dc34016..50f6e19 100644 (file)
        "markedaspatrollederrornotify": "Penandaan sebagai dironda gagal.",
        "patrol-log-page": "Log pemeriksaan",
        "patrol-log-header": "Yang berikut ialah log rondaan bagi semakan.",
-       "log-show-hide-patrol": "$1 log rondaan",
-       "log-show-hide-tag": "$1 log teg",
        "deletedrevision": "Menghapuskan semakan lama $1.",
        "filedeleteerror-short": "Ralat ketika menghapuskan fail: $1",
        "filedeleteerror-long": "Berlaku ralat ketika menghapuskan fail tersebut:\n\n$1",
index 25a622a..5ab6b4c 100644 (file)
        "markedaspatrollederrornotify": "L-ivverifikar tal-modifika falla.",
        "patrol-log-page": "Modifiki verifikati",
        "patrol-log-header": "Dan huwa reġistru ta' reviżjonijiet verifikati.",
-       "log-show-hide-patrol": "$1 r-reġistru tal-modifiki verifikati",
-       "log-show-hide-tag": "$1 r-reġistru tat-tikketti",
        "deletedrevision": "Reviżjoni preċedenti, mħassra: $1",
        "filedeleteerror-short": "Problema waqt li kont qiegħed tħassar il-fajl: $1",
        "filedeleteerror-long": "Ġew verifikati xi problemi waqt li kont qiegħed tħassar il-fajl:\n\n$1",
index da5d40d..cf3cc7f 100644 (file)
        "markedaspatrolledtext": "[[:$1]] ၏ ရွေးချယ်ထားသော တည်းဖြတ်မူကို စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားပြီးပါပြီ။",
        "markedaspatrollednotify": "$1 သို့ ဤပြောင်းလဲမှုအား စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားပြီးပါပြီ။",
        "patrol-log-page": "စောင့်ကြပ်စစ်ဆေးမှု မှတ်တမ်း",
-       "log-show-hide-patrol": "စောင့်ကြပ်စစ်ဆေးမှု မှတ်တမ်း $1",
        "filedeleteerror-short": "ဖိုင်ဖျက်ရာတွင် အမှားအယွင်း - $1",
        "previousdiff": "← တည်းဖြတ်မူ အဟောင်း",
        "nextdiff": "ပိုသစ်သော တည်းဖြတ်မှု",
index df0f72b..20ebd82 100644 (file)
        "markaspatrolledtext": "Тешкстамс те лопанть ванстнемань ютазекс",
        "markedaspatrolled": "Тешкстазь ванстнемань ютазекс",
        "patrol-log-page": "Ванстнемадо конёв",
-       "log-show-hide-patrol": "$1 патрулонь журналонть",
        "deletedrevision": "Нардань ташто лиякстомтома $1",
        "filedeleteerror-short": "\"$1\" керьмазонть нардамсто лиссь ильведевкс",
        "previousdiff": "← Седе икелень верзиязо",
index 3a93f60..38beb03 100644 (file)
        "movelogpagetext": "Ē-kha lia̍t-chhut hông soá-ūi ê ia̍h.",
        "movereason": "Lí-iû:",
        "revertmove": "hôe-tńg",
+       "delete_and_move_reason": "Thâi-ia̍h hō͘ \"[[$1]]\" thang sóa-ia̍h kòe--lâi",
        "selfmove": "Goân piau-tê kap sin piau-tê sio-siâng; bô hoat-tō· sóa.",
        "protectedpagemovewarning": "'''KÉNG-KÒ: Pún ia̍h só tiâu leh. Kan-taⁿ ū hêng-chèng te̍k-koân ê iōng-chiá (sysop) ē-sái soá tín-tāng.'''\nĒ-kha ū choè-kīn ê kì-lio̍k thang chham-khó:",
        "export": "Su-chhut ia̍h",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|piau-chhiam}}]]: $2)",
        "tag-mw-new-redirect": "Sin choán-ia̍h",
        "tag-mw-changed-redirect-target": "Choán-ia̍h bo̍k-phiau kái-piàn",
+       "logentry-delete-delete_redir": "$1 ēng têng-siá lâi kā choán-ia̍h $3 {{GENDER:$2|thâi-tiāu}}",
        "logentry-move-move": "$1 {{GENDER:$2|sóa}} $3 chit ia̍h khì $4",
        "logentry-move-move_redir": "$1 iōng choán-ia̍h {{GENDER:$2|sóa}} ia̍h-bīn $3 kòe $4",
        "logentry-newusers-create": "已經{{GENDER:$2|開好}}用者口座 $1",
index 83ef7bf..6b18e71 100644 (file)
        "markedaspatrollederrornotify": "Errore pe' tramente ca se nzegnava comme cuntrullata.",
        "patrol-log-page": "Riggistro 'e cuntrolle",
        "patrol-log-header": "Chest'è nu riggistro ch' 'e verziune cuntrullate.",
-       "log-show-hide-patrol": "$1 riggistro 'e cuntrolle",
-       "log-show-hide-tag": "$1 tag log",
        "deletedrevision": "Viecchia verziona scancellata $1",
        "filedeleteerror-short": "Errore pe' tramente ca se scancellava nu file: $1",
        "filedeleteerror-long": "N'errore s'è apprisentato pe' tramente ca se scancellava 'o file:\n\n$1",
index 266ba64..458a5b5 100644 (file)
@@ -51,7 +51,8 @@
                        "Nemo bis",
                        "Telaneo",
                        "Jon Harald Søby",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Orf3us"
                ]
        },
        "tog-underline": "Strek under lenker:",
        "diff-paragraph-moved-toold": "Avsnittet ble flyttet. Klikk for å hoppe til den gamle plasseringen.",
        "difference-missing-revision": "{{PLURAL:$2|En revisjon|$2 revisjoner}} av denne forskjellen ($1) {{PLURAL:$2|ble|ble}} ikke funnet.\n\nDette skyldes som regel at en gammel forskjell-lenke er fulgt til en side som er slettet.\nDetaljer kan finnes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].",
        "searchresults": "Søkeresultater",
+       "search-filter-title-prefix": "Søker bare i sider der tittelen begynner med «$1»",
+       "search-filter-title-prefix-reset": "Søk i alle sider",
        "searchresults-title": "Søkeresultater for «$1»",
        "titlematches": "Artikkeltitler med treff på forespørselen",
        "textmatches": "Artikkeltekster med treff på forespørselen",
        "speciallogtitlelabel": "Mål (tittel eller {{ns:user}}:brukernavn for brukeren):",
        "log": "Logger",
        "logeventslist-submit": "Vis",
-       "logeventslist-more-filters": "Flere filtre:",
+       "logeventslist-more-filters": "Vis flere logger:",
        "logeventslist-patrol-log": "Patruljeringslogg",
        "logeventslist-tag-log": "Merkelogg",
        "all-logs-page": "Alle offentlige logger",
        "markedaspatrollederrornotify": "Patruljering feilet.",
        "patrol-log-page": "Patruljeringslogg",
        "patrol-log-header": "Dette er en logg over patruljerte sideversjoner.",
-       "log-show-hide-patrol": "$1 patruljeringslogg",
-       "log-show-hide-tag": "$1 merkelogg",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Merk revisjon $3 av $2 som patruljert?",
        "deletedrevision": "Slettet gammel revisjon $1.",
index 663fec1..a03d104 100644 (file)
        "markedaspatrollederrornotify": "Markeren as nao-ekeken is mislokt.",
        "patrol-log-page": "Markeerlogboek",
        "patrol-log-header": "In dit logboek staon de versies die op nao-ekeken ezet bin.",
-       "log-show-hide-patrol": "Markeerlogboek $1",
        "deletedrevision": "Vortedaone ouwe versie $1.",
        "filedeleteerror-short": "Fout bie t vortdoon van bestaand: $1",
        "filedeleteerror-long": "Der waren fouten bie t vortdoon van t bestaand:\n\n$1",
index 3ae3f9c..c5b1a28 100644 (file)
        "markedaspatrollederror-noautopatrol": "Du kannst de Saken, de du sülvst ännert hest, nich as nakeken marken.",
        "patrol-log-page": "Nakiek-Logbook",
        "patrol-log-header": "Dit is dat Patrolleer-Logbook.",
-       "log-show-hide-patrol": "Nakiek-Logbook $1",
        "deletedrevision": "Löschte ole Version $1",
        "filedeleteerror-short": "Fehler bi dat Wegsmieten vun de Datei: $1",
        "filedeleteerror-long": "Dat geev Fehlers bi dat Wegsmieten vun de Datei:\n\n$1",
index fcd4a28..5002cfa 100644 (file)
@@ -27,7 +27,8 @@
                        "रमेश सिंह बोहरा",
                        "Nirajan pant",
                        "Drjpoudel",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Nabin Sapkota"
                ]
        },
        "tog-underline": "रेखाङ्कित लिङ्क:",
        "subject-preview": "विषयको पूर्वावलोकन:",
        "previewerrortext": "तपाईंको परिवर्तनको पूर्वावलोकन बनाउन खोज्दा समस्या आएको छ ।",
        "blockedtitle": "प्रयोककर्तालाई रोक लगाइएको छ",
-       "blockedtext": "'''तपाà¤\88à¤\82à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤¯à¤¾ à¤\86à¤\87 à¤ªà¥\80 à¤ à¥\87à¤\97ानालाà¤\88 à¤°à¥\8bà¤\95 à¤²à¤\97ाà¤\87à¤\8fà¤\95à¥\8b à¤\9b à¥¤'''\n\nरà¥\8bà¤\95 à¤²à¤\97ाà¤\89नà¥\87  $1.\nरà¥\8bà¤\95 à¤²à¤\97ाà¤\89नाà¤\95à¥\8b à¤\95ारण ''$2''.\n\n* à¤°à¥\8bà¤\95 à¤¸à¥\81रà¥\82 à¤¹à¥\81नà¥\87 : $8\n* à¤°à¥\8bà¤\95 à¤¸à¤\95िनà¥\87: $6\n* à¤°à¥\8bà¤\95बाà¤\9f à¤²à¤\95à¥\8dषित: $7\n\nतपाà¤\88à¤\82लà¥\87  $1 à¤µà¤¾ à¤\85रà¥\81 à¤\95à¥\81नà¥\88  [[{{MediaWiki:Grouppage-sysop}}|पà¥\8dरवनà¥\8dधà¤\95]] à¤¸à¤\81à¤\97 à¤°à¥\8bà¤\95à¤\95à¥\8b à¤¬à¤¾à¤°à¥\87मा à¤\9bलफल à¤\97रà¥\8dन à¤¸à¤®à¥\8dपरà¥\8dà¤\95 à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b à¥¤\nतपाà¤\88à¤\81लà¥\87  'पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतालाà¤\88 à¤\87-मà¥\87ल à¤\97रà¥\8dनà¥\87 ' सुविधा मान्य इमेल ठेगाना [[Special:Preferences|अभिरुचीहरू]]मा नखुलाए सम्म प्रयोगगर्न पाउनुहुने छैन र यसको प्रयोग गर्नबाट रोक लगाइएको छैन ।\nतपाईंको IP ठेगाना $3 को, र रोक्का संख्या #$5.\nकृपया तपाईँको प्रश्नमा सबै जानकारी खुलाउनुहोला ।",
+       "blockedtext": "'''तपाà¤\88à¤\82à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤µà¤¾ à¤\86à¤\87पà¥\80 à¤ à¥\87à¤\97ानालाà¤\88 à¤°à¥\8bà¤\95 à¤²à¤\97ाà¤\87à¤\8fà¤\95à¥\8b à¤\9b à¥¤'''\n\nरà¥\8bà¤\95 à¤²à¤\97ाà¤\89नà¥\87  $1.\nरà¥\8bà¤\95 à¤²à¤\97ाà¤\89नाà¤\95à¥\8b à¤\95ारण ''$2''.\n\n* à¤°à¥\8bà¤\95 à¤¸à¥\81रà¥\82 à¤¹à¥\81नà¥\87 : $8\n* à¤°à¥\8bà¤\95 à¤¸à¤\95िनà¥\87: $6\n* à¤°à¥\8bà¤\95बाà¤\9f à¤²à¤\95à¥\8dषित: $7\n\nतपाà¤\88à¤\82लà¥\87  $1 à¤µà¤¾ à¤\85रà¥\81 à¤\95à¥\81नà¥\88  [[{{MediaWiki:Grouppage-sysop}}|पà¥\8dरवनà¥\8dधà¤\95]] à¤¸à¤\81à¤\97 à¤°à¥\8bà¤\95à¤\95à¥\8b à¤¬à¤¾à¤°à¥\87मा à¤\9bलफल à¤\97रà¥\8dन à¤¸à¤®à¥\8dपरà¥\8dà¤\95 à¤\97रà¥\8dन à¤¸à¤\95िनà¥\8dà¤\9b à¥¤\nतपाà¤\88à¤\81लà¥\87  ''{{int:emailuser}}'' सुविधा मान्य इमेल ठेगाना [[Special:Preferences|अभिरुचीहरू]]मा नखुलाए सम्म प्रयोगगर्न पाउनुहुने छैन र यसको प्रयोग गर्नबाट रोक लगाइएको छैन ।\nतपाईंको IP ठेगाना $3 को, र रोक्का संख्या #$5.\nकृपया तपाईँको प्रश्नमा सबै जानकारी खुलाउनुहोला ।",
        "autoblockedtext": "तपाईंको IP ठेगानामाथि रोक लगाइएकोछ किन भनें यो अर्को प्रयोगकर्ताले प्रयोग गरेको थियो, जसलाई $1ले रोक लगाएका थिए। \nरोक लगाउनुको कारण:\n:''$2''  \n\n* रोकावट सुरु: $8\n* रोकावट सकिने: $6\n* रोकावटको प्रयोजन: $7\n\nतपाईं $1 सित सम्पर्क गर्न सक्नुहुन्छ अथवा कुनै [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]]सँग रोकबारे चर्चा गर्न सक्नुहुन्छ ।\n\nध्यान दिनुहोस् कि तपाईंले यस प्रयोगकर्ताका लागि ई-मेलको प्रयोग तबसम्म गर्नसक्नुहुन्न जबसम्म तपाईंको [[Special:Preferences|अभिरुचि]] पंजिकृत गर्नु हुन्न वा यस ई-मेलको प्रयोगमाथि रोक लगाइएको हुँदैन । \n\nतपाईंको वर्तमान IP ठेगाना हो- $3, अनि रोक लगाइएको ID हो- #$5.\nकृपया कुनै बेला सोधनी गर्नु परे उपर्युक्त विवरण दर्शाउनु होला ।",
        "blockednoreason": "कारण दिइएको छैन",
        "whitelistedittext": "पाना सम्पादन गर्न तपाँईले $1 गर्नु पर्दछ।",
        "accmailtext": "जथाभावीरूपमा सृजना गरिएको प्रवेशशब्द प्रयोगकर्ता [[User talk:$1|$1]] को  $2 मा पठाइएको छ।\n\nयो नयाँ खाताको प्रवेशशब्द  ''[[Special:ChangePassword|change password]]'' मा प्रवेश गरेर परिवर्तन गर्न सकिन्छ ।",
        "newarticle": "(नयाँ)",
        "newarticletext": "तपाईंले अहिले सम्म नभएको पृष्ठको लिङ्क पहिल्याउनु भएको छ।\nयो पृष्ठ निर्माण गर्न तलको कोष्ठमा टाइप गर्नुहोस्  ।(थप जानकारीको लागि [$1 help page] हेर्नुहोस् )।\nयहाँ त्यत्तिकै आइपुग्नु भएको हो भने , ब्राउजरको  '''back''' बटन थिच्नुहोस् ।",
-       "anontalkpagetext": "----''यो वार्तालाप पृष्ठ अज्ञात प्रयोगकर्ताको हो जसले अहिलेसम्म खाता बनाएकै छैन, अथवा जसले यस पृष्ठको उपयोग गर्दैन।\nयस कारण हामीले उसलाई उसको आइ पी (IP) ठेगानाले चिन्न सक्छौं। \nयस्तो आइ पी (IP) ठेगाना धेरै प्रयोगकर्ताहरूको साझा हुनसक्छ।\nयदि तपाईं अज्ञात प्रयोगकर्ता हुनुहुन्छ र तपाईंमाथि अचाहिँदो टिप्पणी भएको अनुभव गर्नुहुन्छ भने भविष्यमा अन्य अज्ञात प्रयोगकर्तासितको भ्रमबाट बाँच्न कृपया [[Special:CreateAccount|खाता खोल्नुहोस्]] अथवा [[Special:UserLogin|प्रवेश गर्नुहोस्]] ''",
+       "anontalkpagetext": "----''यो वार्तालाप पृष्ठ अज्ञात प्रयोगकर्ताको हो जसले अहिलेसम्म खाता बनाएकै छैन, अथवा जसले यस पृष्ठको उपयोग गर्दैन।\nयस कारण हामीले उसलाई उसको आइपी ठेगानाले चिन्न सक्छौं। \nयस्तो आइपी ठेगाना धेरै प्रयोगकर्ताहरूको साझा हुनसक्छ।\nयदि तपाईं अज्ञात प्रयोगकर्ता हुनुहुन्छ र तपाईंमाथि अचाहिँदो टिप्पणी भएको अनुभव गर्नुहुन्छ भने भविष्यमा अन्य अज्ञात प्रयोगकर्तासित अलमलिनबाट बच्न कृपया [[Special:CreateAccount|खाता खोल्नुहोस्]] अथवा [[Special:UserLogin|प्रवेश गर्नुहोस्]] ''",
        "noarticletext": "यस लेखमा अहिले केहि पनि पाठ छैन ।\nतपाईंले अन्य पृष्ठमा [[Special:Search/{{PAGENAME}}|यस पृष्ठको शीर्षकको लागि खोज]] गर्न सक्नुहुन्छ ।\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} पृष्ठ सम्बन्धित ढड्डामा खोज],\nवा [{{fullurl:{{FULLPAGENAME}}|action=edit}}  यसै पृष्ठलाई सम्पादन गर्ने]</span>.",
        "noarticletext-nopermission": "यस लेखमा अहिले कुनै पनि पाठ छैन ।\nतपाईंले अन्य पृष्ठमा [[Special:Search/{{PAGENAME}}|यस पृष्ठको शीर्षकको लागि खोज]] गर्न सक्नुहुन्छ,\nअथवा <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|पृष्ठ={{FULLPAGENAMEE}}}} सम्बन्धित लगहरू खोज्न सक्नुहुनेछ ]</span> तर तपाईंलाई नयाँ पृष्ठ बनाउने अधिकार छैन।",
        "missing-revision": "\"{{FULLPAGENAME}}\" पृष्ठको अवतरण #$1 रहेको छैन।\n\nसामान्य रूपमा यसो एउटा हटाइएको पृष्ठको पुरानो लिङ्कमा क्लिक गर्दा हुन्छ।\nअधिक जानकारीको लागि तपाईं [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाएको लग] हेर्न सक्नुहुन्छ।",
        "recentchangeslinked-feed": "सम्बन्धित परिवर्तनहरू",
        "recentchangeslinked-toolbox": "सम्बन्धित परिवर्तनहरू",
        "recentchangeslinked-title": "\"$1\" सँग सम्बन्धित परिवर्तन",
-       "recentchangeslinked-summary": "यà¥\8b à¤¸à¥\82à¤\9aà¥\80 à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤ªà¥\83षà¥\8dठ (वा à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤¶à¥\8dरà¥\87णà¥\80)सित à¤\9cà¥\8bडिà¤\8fà¤\95ा à¤­à¤°à¥\8dà¤\96रà¥\88 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤­à¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठà¤\95à¥\8b  à¤¹à¥\8b à¥¤ [[Special:Watchlist|तपाà¤\88à¤\82à¤\95à¥\8b à¤¨à¤¿à¤\97रानà¥\80 सूची]]का पृष्ठहरू <strong>गाढा अक्षरमा</strong> छन् ।",
+       "recentchangeslinked-summary": "à¤\95à¥\81नà¥\88 à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤µà¤¾  à¤¯à¤¸à¤¸à¤\81à¤\97 à¤¸à¤®à¥\8dबनà¥\8dधित à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¹à¥\87रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤\89à¤\95à¥\8dत à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤¨à¤¾à¤® à¤¹à¤¾à¤²à¥\8dनà¥\81हà¥\8bस। (à¤\95à¥\81नà¥\88 à¤¶à¥\8dरà¥\87णà¥\80à¤\95à¥\8b à¤¸à¤¾à¤®à¤¾à¤\97à¥\8dरà¥\80हरà¥\81à¤\95à¥\8b à¤²à¤¾à¤\97ि {{ns:category}}: à¤¶à¥\8dरà¥\87णà¥\80à¤\95à¥\8b à¤¨à¤¾à¤® à¤¹à¤²à¥\8dनà¥\81हà¥\8bस à¥¤  [[Special:Watchlist|तपाà¤\88à¤\82à¤\95à¥\8b à¤\85वलà¥\8bà¤\95न सूची]]का पृष्ठहरू <strong>गाढा अक्षरमा</strong> छन् ।",
        "recentchangeslinked-page": "पृष्ठ नाम:",
        "recentchangeslinked-to": "यसको सट्टा यो पृष्ठसँग जोडिएका पृष्ठहरूको परिवर्तन देखाउने",
        "upload": "फाइल उर्ध्वभरण",
        "unwatchthispage": "निगरानीबाट हटाउने",
        "notanarticle": "सामाग्री सहितको पेज हैन",
        "notvisiblerev": "पूर्वावलोकन हटाइयो",
-       "watchlist-details": "तपाà¤\88à¤\82à¤\95à¥\8b à¤¨à¤¿à¤\97रानà¥\80 à¤¸à¥\82à¤\9aà¥\80मा à¤°à¤¹à¥\87à¤\95ा {{PLURAL:$1|$1 à¤ªà¥\83षà¥\8dठ|$1 à¤ªà¥\83षà¥\8dठहरà¥\82}} à¤µà¤¾à¤°à¥\8dतालाप à¤ªà¥\83षà¥\8dठ à¤\97निà¤\8fà¤\95ा à¤\9bà¥\88ननà¥\8d।",
+       "watchlist-details": "तपाà¤\88à¤\82à¤\95à¥\8b à¤\85वलà¥\8bà¤\95न à¤¸à¥\82à¤\9aà¥\80मा à¤°à¤¹à¥\87à¤\95ा {{PLURAL:$1|$1 à¤ªà¥\83षà¥\8dठ|$1 à¤ªà¥\83षà¥\8dठहरà¥\82}} (तथा à¤µà¤¾à¤°à¥\8dतालाप à¤ªà¥\83षà¥\8dठहरà¥\82)।",
        "wlheader-enotif": "ईमेल जानकारी सक्रिय गरियो ।",
        "wlheader-showupdated": "तपाईंले पछिल्लो पल्ट भ्रमण गरेपछि परिवर्तन भएका पृष्ठहरूलाई <strong>गाढा<strong> गरेर देखाइएको छ ।",
        "wlnote": "$3 र $4 अनुसार विगत {{PLURAL:$2|घण्टामा|'''$2''' घण्टाहरूमा}} {{PLURAL:$1|गरिएको अन्तिम परिवर्तन तल दिइएकोछ|गरिएका अन्तिम  '''$1''' परिवर्तनहरू तल दिइएका छन्}}।",
        "markedaspatrollederrornotify": "गस्ती अङ्कित गर्न विफल।",
        "patrol-log-page": "निगरानीको लग",
        "patrol-log-header": "गस्ती गरिएका संस्करणहरूको लग यस प्रकार रहेका छन् ।",
-       "log-show-hide-patrol": "$1 निगरानी लग",
-       "log-show-hide-tag": "$1 ट्याग लग",
        "confirm-markpatrolled-button": "ठीक छ",
        "deletedrevision": "पुराना पुनरावलोकनहरू $1 मेटिए",
        "filedeleteerror-short": "$1 फाइल मेटाइमा भूल",
        "version-libraries-description": "वर्णन",
        "version-libraries-authors": "लेखकहरू",
        "redirect": "फाइल, प्रयोगकर्ता, वा संशोधन आइडीको आधारमा अनुप्रेषित गर्ने",
-       "redirect-summary": "यस à¤µà¤¿à¤¶à¥\87ष à¤ªà¥\83षà¥\8dठ (पà¥\8dरदान à¤\97रिà¤\8fà¤\95à¥\8b à¤«à¤¾à¤\87लनाम), à¤ªà¥\83षà¥\8dठà¤\95à¥\8b (पà¥\83षà¥\8dठ à¤\86à¤\87डà¥\80 à¤\85थवा à¤\85वतरण à¤\86à¤\87डà¥\80), à¤µà¤¾ (पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\86à¤\87डà¥\80) à¤°à¤¾à¤\96à¥\8dदा à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतापà¥\83षà¥\8dठमा à¤®à¤¾ à¤¸à¤¾à¤°à¤¿à¤¨à¥\87à¤\9b। à¤\89दाहरण: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], à¤µà¤¾ [[{{#Special:Redirect}}/user/101]]।",
+       "redirect-summary": "यस à¤µà¤¿à¤¶à¥\87ष à¤ªà¥\83षà¥\8dठ (पà¥\8dरदान à¤\97रिà¤\8fà¤\95à¥\8b à¤«à¤¾à¤\87लनाम), à¤ªà¥\83षà¥\8dठà¤\95à¥\8b (पà¥\83षà¥\8dठ à¤\86à¤\87डà¥\80 à¤\85थवा à¤\85वतरण à¤\86à¤\87डà¥\80), à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤ªà¥\83षà¥\8dठ (पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\86à¤\87डà¥\80) à¤µà¤¾ à¤²à¤\97 à¤\87नà¥\8dà¤\9fà¥\8dरà¥\80 (दिà¤\88à¤\8fà¤\95à¥\8b à¤²à¤\97 à¤\86à¤\87डà¥\80) à¤°à¤¾à¤\96à¥\8dदा à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤ªà¥\83षà¥\8dठमा à¤\85नà¥\81पà¥\8dरà¥\87षण à¤¹à¥\81नà¥\87à¤\9b à¥¤ à¤\89दाहरण: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] à¤µà¤¾  [[{{#Special:Redirect}}/logid/186]]।",
        "redirect-submit": "जाने",
        "redirect-lookup": "खोजी:",
        "redirect-value": "मानः",
index 5e9df7c..3613d2d 100644 (file)
        "diff-paragraph-moved-toold": "Deze paragraaf is verplaatst. Klik om naar de oude locatie te springen.",
        "difference-missing-revision": "{{PLURAL:$2|Eén versie|$2 versies}} van deze verschillen ($1) {{PLURAL:$2|is|zijn}} niet aangetroffen.\n\nDit wordt meestal veroorzaakt door het volgen van een verouderde koppeling verschillen voor een pagina die is verwijderd.\nMeer gegevens zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
        "searchresults": "Zoekresultaten",
+       "search-filter-title-prefix": "Alleen zoeken naar pagina's waarvan de titel begint met \"$1\"",
+       "search-filter-title-prefix-reset": "Alle zoeken naar alle pagina's",
        "searchresults-title": "Zoekresultaten voor \"$1\"",
        "titlematches": "Overeenkomst met onderwerp",
        "textmatches": "Overeenkomst met inhoud",
        "speciallogtitlelabel": "Doel (paginanaam of {{ns:user}}:gebruikersnaam voor gebruiker):",
        "log": "Logboeken",
        "logeventslist-submit": "Weergeven",
-       "logeventslist-more-filters": "Meer filters:",
+       "logeventslist-more-filters": "Toon extra logboeken:",
        "logeventslist-patrol-log": "Markeerlogboek",
        "logeventslist-tag-log": "Labellogboek",
        "all-logs-page": "Alle openbare logboeken",
        "markedaspatrollederrornotify": "Markeren als gecontroleerd mislukt.",
        "patrol-log-page": "Markeerlogboek",
        "patrol-log-header": "Dit logboek bevat versies die gemarkeerd zijn als gecontroleerd.",
-       "log-show-hide-patrol": "markeerlogboek $1",
-       "log-show-hide-tag": "labellogboek $1",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Wilt u bewerking $3 van $2 als gecontroleerd markeren?",
        "deletedrevision": "De oude versie $1 is verwijderd",
index ec31855..81cb5e8 100644 (file)
        "markedaspatrollederrornotify": "Det gjekk ikkje å merkja endringa som patruljert.",
        "patrol-log-page": "Patruljeringslogg",
        "patrol-log-header": "Dette er ein logg over patruljerte sideversjonar.",
-       "log-show-hide-patrol": "$1 patruljeringslogg",
-       "log-show-hide-tag": "$1 merkelogg",
        "deletedrevision": "Slett gammal versjon $1",
        "filedeleteerror-short": "Feil ved sletting av fila: $1",
        "filedeleteerror-long": "Det vart ein feil under filslettinga av:\n\n$1",
index 0810158..6913368 100644 (file)
        "markedaspatrollederrornotify": "Fracàs del marcatge coma contrarotlat.",
        "patrol-log-page": "Istoric de las versions patrolhadas",
        "patrol-log-header": "Vaquí un jornal de las versions patrolhadas.",
-       "log-show-hide-patrol": "$1 l'istoric de las relecturas",
-       "log-show-hide-tag": "$1 lo jornal de las balisas",
        "confirm-markpatrolled-button": "D'acòrdi",
        "deletedrevision": "La version anciana $1 es estada suprimida.",
        "filedeleteerror-short": "Error al moment de la supression del fichièr : $1",
index b5f8913..602eaa4 100644 (file)
        "markedaspatrollederrornotify": "ଶ୍ରେଣୀବିଭାଗ କରିହେଲାନି ।",
        "patrol-log-page": "ଜଗିବା ଇତିହାସ",
        "patrol-log-header": "ଏହା ଏକ ଜଗାଯାଇଥିବା ସଂସ୍କରଣର ଇତିହାସ ।",
-       "log-show-hide-patrol": "$1 ଜଗିବା ଇତିହାସ",
        "deletedrevision": "ଲିଭାଯାଇଥିବା ପୁରୁଣା $1",
        "filedeleteerror-short": "ଫାଇଲ ଲିଭାଇବାରେ ଅସୁବିଧା: $1",
        "filedeleteerror-long": "ତଳଲିଖିତ ଫାଇଲକୁ ଲିଭାଇବାରେ ଅସୁବିଧା:\n\n$1",
index 2d0ff9b..b91c27d 100644 (file)
        "diff-paragraph-moved-toold": "Akapit został przeniesiony. Kliknij aby przeskoczyć do jego poprzedniego położenia.",
        "difference-missing-revision": "{{PLURAL:$2|Wersja|$2 wersje|$2 wersji}} #$1 strony \"{{PAGENAME}}\" nie {{PLURAL:$2|została znaleziona|zostały znalezione|zostało znalezionych}}.\n\nZazwyczaj jest to spowodowane przestarzałym linkiem do usuniętej strony. Powód usunięcia znajduje się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze].",
        "searchresults": "Wyniki wyszukiwania",
+       "search-filter-title-prefix": "Wyszukiwanie tylko na stronach, których tytuł zaczyna się od „$1”",
        "searchresults-title": "Wyniki wyszukiwania „$1”",
        "titlematches": "Znaleziono w tytułach",
        "textmatches": "Znaleziono w treści stron",
        "markedaspatrollederrornotify": "Oznaczenie strony jako sprawdzonej nie powiodło się.",
        "patrol-log-page": "Rejestr patrolowania",
        "patrol-log-header": "Poniżej znajduje się rejestr patrolowania stron.",
-       "log-show-hide-patrol": "$1 rejestr sprawdzania",
-       "log-show-hide-tag": "$1 rejestr znaczników",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Oznaczyć wersję $3 strony $2 jako sprawdzoną?",
        "deletedrevision": "Usunięto poprzednie wersje $1",
index 726c303..f837484 100644 (file)
        "markedaspatrollederrornotify": "Marcadura com verificà falìa.",
        "patrol-log-page": "Registr dij contròj",
        "patrol-log-header": "Cost-sì a l'é un registr ëd le revision controlà.",
-       "log-show-hide-patrol": "$1 registr verificà",
-       "log-show-hide-tag": "tichëtta d'argistr $1",
        "deletedrevision": "Veja version scancelà $1",
        "filedeleteerror-short": "Eror ën scanceland l'archivi: $1",
        "filedeleteerror-long": "A-i son ësta-ie dj'eror ën scanceland l'archivi:\n\n$1",
index 9e105c7..449de37 100644 (file)
        "pageinfo-edits": "تبدیلیاں گنتی",
        "pageinfo-authors": "وکھرے لکھاریاں دی گنتی",
        "pageinfo-toolboxlink": "صفحہ جانکاری",
+       "pageinfo-protect-cascading-yes": "ہاں",
        "markaspatrolleddiff": "ویکھے گۓ دا نشان لاؤ",
        "markaspatrolledtext": "ایس صفے تے ویکھن دا نشان لاؤ",
        "markedaspatrolled": "ویکھن دا نشان لاؤ",
        "markedaspatrollederror-noautopatrol": "تھوانوں اے اجازت نئیں جے تسی اپنی تبدیلیاں تے گشت دا نشان لاؤ۔",
        "patrol-log-page": "گشت لاگ",
        "patrol-log-header": "اے گست لائیآں ہوئیآن ریوین دی لاگ اے۔",
-       "log-show-hide-patrol": "$1 گشت لاگ",
        "deletedrevision": "پرانیاں مٹائیاں ریوین $1",
        "filedeleteerror-short": "فاغل مٹان چ غلطی: $1",
        "filedeleteerror-long": "فائل مٹان لگیاں غلطیاں ہوئیاں:\n$1",
        "logentry-newusers-create": "$1 {{GENDER:$2|بنایا}} اک ورتن والا کھاتہ",
        "logentry-newusers-create2": "$1 {{GENDER:$2|بنایا}} {{GENDER:$4|اک ورتن کھاتہ}} $3",
        "logentry-newusers-autocreate": "کھاتہ $1 اپنے آپ ای {{GENDER:$2|بنایا گیا}} بنایا گیا۔",
+       "logentry-protect-protect": "$1 نے $3 نوں {{GENDER:$2|محفوظ کیتا}}  $4",
        "logentry-upload-upload": "$1 {{جنس:$2|چڑھائی گئی}} $3",
        "rightsnone": "(کوئی وی نئیں)",
        "feedback-adding": "مشورہ  صفے تے دیو۔۔۔۔۔۔۔",
index d4923fe..27f1641 100644 (file)
        "markedaspatrollederror-noautopatrol": "Ni assei enwarīntan, kāi pazentlitun swajjans kitawīdinsnans kāigi \"izbandātans\".",
        "patrol-log-page": "Izbandāsnas registerin",
        "patrol-log-header": "Sta ast izbandātan wersiōnin regīsterin.",
-       "log-show-hide-patrol": "$1 izbandāsnas registerin",
        "deletedrevision": "Āupausinā di panzdaumans wersiōnins stesse $1",
        "filedeleteerror-short": "Blānda prei zūrbrukes $1 āupausinsnan",
        "filedeleteerror-long": "Blāndas tikka prei zūrbrukes āupausinsnan:\n\n$1",
index ad46b4d..210aebe 100644 (file)
        "markedaspatrollederrornotify": "د څارل شوي په توگه په نښه کول نابريال شو.",
        "patrol-log-page": "د څارنې يادښت",
        "patrol-log-header": "دا د څارل شويو مخکتنو يو يادښت دی.",
-       "log-show-hide-patrol": "د څارنې يادښت $1",
-       "log-show-hide-tag": "نښلن يادښت $1",
        "confirm-markpatrolled-button": "ښه",
        "deletedrevision": "د $1 زړه ړنگه شوې بڼه",
        "filedeleteerror-short": "د دوتنې د ړنگولو ستونزه: $1",
index a947f6b..22b8b89 100644 (file)
        "diff-paragraph-moved-toold": "O parágrafo foi movido. Clique para saltar para a posição anterior.",
        "difference-missing-revision": "{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.\n\nIsto é geralmente causado por seguir um link de histórico desatualizado para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminação].",
        "searchresults": "Resultados da pesquisa",
+       "search-filter-title-prefix": "A pesquisar só nas páginas cujo título começa por \"$1\"",
+       "search-filter-title-prefix-reset": "Pesquisar em todas as páginas",
        "searchresults-title": "Resultados da pesquisa por \"$1\"",
        "titlematches": "Resultados nos títulos das páginas",
        "textmatches": "Resultados nos textos das páginas",
        "speciallogtitlelabel": "Alvo (título da página ou {{ns:user}}:'nomedeusuário' para usuários):",
        "log": "Registros",
        "logeventslist-submit": "Exibir",
-       "logeventslist-more-filters": "Mais filtros:",
+       "logeventslist-more-filters": "Mostrar registos adicionais:",
        "logeventslist-patrol-log": "Registro de edições patrulhadas",
        "logeventslist-tag-log": "Registro de etiquetas",
        "all-logs-page": "Todos os registros públicos",
        "markedaspatrollederrornotify": "Falha ao marcar como patrulhada.",
        "patrol-log-page": "Registro de edições patrulhadas",
        "patrol-log-header": "Este é um registro de edições patrulhadas.",
-       "log-show-hide-patrol": "$1 registro de edições patrulhadas",
-       "log-show-hide-tag": "$1 etiqueta de log",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Marque a revisão $3 de $2 como patrulhado?",
        "deletedrevision": "Apagou a versão antiga $1",
index e04b6ae..aedf188 100644 (file)
        "diff-paragraph-moved-toold": "O parágrafo foi movido. Clique para saltar para a posição anterior.",
        "difference-missing-revision": "{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.\n\nIsto é geralmente causado por seguir uma hiperligação de diferenças desatualizada para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].",
        "searchresults": "Resultados da pesquisa",
+       "search-filter-title-prefix": "A pesquisar só nas páginas cujo título começa por \"$1\"",
+       "search-filter-title-prefix-reset": "Pesquisar em todas as páginas",
        "searchresults-title": "Resultados da pesquisa de \"$1\"",
        "titlematches": "Resultados no título das páginas",
        "textmatches": "Resultados no conteúdo das páginas",
        "speciallogtitlelabel": "Alvo (título ou página ou {{ns:user}}:nome de utilizador):",
        "log": "Registos",
        "logeventslist-submit": "Mostrar",
-       "logeventslist-more-filters": "Mais filtros:",
+       "logeventslist-more-filters": "Mostrar registos adicionais:",
        "logeventslist-patrol-log": "Registo de edições patrulhadas",
        "logeventslist-tag-log": "Registo de etiquetas",
        "all-logs-page": "Todos os registos públicos",
        "markedaspatrollederrornotify": "A marcação como patrulhada falhou.",
        "patrol-log-page": "Registo de edições patrulhadas",
        "patrol-log-header": "Este é um registo de edições patrulhadas.",
-       "log-show-hide-patrol": "$1 registo de edições patrulhadas",
-       "log-show-hide-tag": "$1 registo de etiquetas",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Marcar a revisão $3 de $2 como patrulhada?",
        "deletedrevision": "Apagou a versão antiga $1",
index cc1614e..573c029 100644 (file)
        "difference-missing-revision": "Text displayed when the requested revision does not exist using a diff link.\n\nExample: [{{canonicalurl:Project:News|diff=426850&oldid=99999999}} Diff with invalid revision#]\n\nParameters:\n* $1 - the list of missing revisions IDs\n* $2 - the number of items in $1 (one or two)",
        "search-summary": "{{doc-specialpagesummary|search}}",
        "searchresults": "This is the title of the page that contains the results of a search.\n\n{{Identical|Search results}}",
+       "search-filter-title-prefix": "Subtitle added to indicate that the user is filtering for pages whose title starts with $1, \n* $1 - the title prefix",
+       "search-filter-title-prefix-reset": "Appears next to {{msg-mw|search-filter-title-prefix}} as a link to let users reset the prefix filter",
        "searchresults-title": "Appears as page title in the html header of the search result special page.\n\nParameters:\n* $1 - the search term",
        "titlematches": "Used as section header in [[Special:Search]].\n\nThis message is followed by search results.",
        "textmatches": "When displaying search results",
        "speciallogtitlelabel": "Used in [[Special:Log]] as a label for an input field with which the log can be filtered.  This filter selects for pages or users on which a log action was performed.",
        "log": "{{doc-special|Log}}\n{{Identical|Log}}",
        "logeventslist-submit": "Submit button on [[Special:Log]]\n{{Identical|Show}}",
-       "logeventslist-more-filters": "More filters label on [[Special:Log]]",
+       "logeventslist-more-filters": "Label on [[Special:Log]]. Some log types are hidden by default when viewing \"all\" logs, because they might be very verbose, and these options show them.",
        "logeventslist-patrol-log": "Patrol log option label on [[Special:Log]]",
        "logeventslist-tag-log": "Tag log option label on [[Special:Log]]",
        "all-logs-page": "{{doc-logpage}}\nTitle of [[Special:Log]].",
        "markedaspatrollederrornotify": "Notification shown after the user has failed to mark a change as patrolled.\n\nSee also:\n* {{msg-mw|Markedaspatrollednotify}} - notification on success",
        "patrol-log-page": "{{doc-logpage}}",
        "patrol-log-header": "Text that appears above the log entries on the [[Special:log|patrol log]].",
-       "log-show-hide-patrol": "Used in [[Special:Log]]. Parameters:\n* $1 - link text; one of {{msg-mw|Show}} or {{msg-mw|Hide}}\n{{Related|Log-show-hide}}",
-       "log-show-hide-tag": "Used in [[Special:Log]]. Parameters:\n* $1 - link text; one of {{msg-mw|Show}} or {{msg-mw|Hide}}\n{{Related|Log-show-hide}}",
        "confirm-markpatrolled-button": "Used as Submit button text.\n{{Identical|OK}}",
        "confirm-markpatrolled-top": "Confirmation message on interstitial form.\n\nParameters:\n* $1 - Target page title\n* $2 - Link to target page with page title as label\n* $3 - Link to recent change diff with revision ID as label",
        "deletedrevision": "Used as log comment. Parameters:\n* $1 - archive name of old image",
index 3275e0b..c734d04 100644 (file)
        "markedaspatrollederrornotify": "Qhawakipasqa niyqa manam aypanchu.",
        "patrol-log-page": "Qhawakipay hallch'a",
        "patrol-log-header": "Kayqa patrullasqa musuqchasqakunamanta hallch'asqam.",
-       "log-show-hide-patrol": "$1 patrullay hallch'a",
        "deletedrevision": "Qullusqam mawk'a qhawakipasqa $1",
        "filedeleteerror-short": "Manam atinichu kay willañiqita qulluyta: $1",
        "filedeleteerror-long": "Pantasqakunam rikch'akurqan kay willañiqita qulluypi:\n\n$1",
index 7bed158..c673979 100644 (file)
        "markedaspatrollederrornotify": "Sbagl durant marcar sco controllà.",
        "patrol-log-page": "Protocol da controllas",
        "patrol-log-header": "Quai è il protocol da las versiuns controlladas.",
-       "log-show-hide-patrol": "$1 il protocol da controllas",
        "deletedrevision": "Stizzà la versiun veglia $1.",
        "filedeleteerror-short": "Errur cun stizzar la datoteca: $1",
        "filedeleteerror-long": "Cun stizzar la datoteca èn errurs vegnidas constatadas:\n\n$1",
index 7259340..8598d92 100644 (file)
        "markedaspatrollederrornotify": "Marcarea ca patrulată a eșuat.",
        "patrol-log-page": "Jurnal verificări",
        "patrol-log-header": "Aceasta este o listă a tuturor versiunilor marcate ca verificate.",
-       "log-show-hide-patrol": "$1 jurnalul versiunilor verificate",
-       "log-show-hide-tag": "$1 jurnal etichete",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Marcați revizia $3 a $2 ca patrulată?",
        "deletedrevision": "A fost ștearsă vechea versiune $1.",
index 4bc493c..e32a7c2 100644 (file)
        "markedaspatrollederrornotify": "Signate cumme condrollate fallite.",
        "patrol-log-page": "Archivije de le condrolle",
        "patrol-log-header": "Quiste è l'archivije de le revisiune condrollate.",
-       "log-show-hide-patrol": "$1 archivije de le condrolle",
-       "log-show-hide-tag": "$1 archivije de le tag",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Signe 'a revisione $3 de $2 cumme condrollate?",
        "deletedrevision": "Vecchia revisione scangellete $1",
index c688b3f..a3bdc44 100644 (file)
        "diff-paragraph-moved-toold": "Пункт был перемещен. Нажмите, чтобы перейти к старому местоположению.",
        "difference-missing-revision": "Не {{PLURAL:$2|1=найдена|найдены}} {{PLURAL:$2|$2 версия|$2 версий|$2 версии|1=одна из версий}} для этого сравнения ($1).\n\nТакое обычно случается при переходе по устаревшей ссылке сравнения версий для страницы, которая была удалена.\nПодробности могут быть в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
        "searchresults": "Результаты поиска",
+       "search-filter-title-prefix": "Искать только на страницах, название которых начинается с «$1»",
+       "search-filter-title-prefix-reset": "Искать все страницы",
        "searchresults-title": "Поиск «$1»",
        "titlematches": "Совпадения в названиях страниц",
        "textmatches": "Совпадения в текстах страниц",
        "rcfilters-filter-major-description": "Правки, не помеченные как малые.",
        "rcfilters-filtergroup-watchlist": "Страницы в списке наблюдения",
        "rcfilters-filter-watchlist-watched-label": "В списке наблюдения",
-       "rcfilters-filter-watchlist-watched-description": "Изменения страниц в вашем Списке наблюдения.",
+       "rcfilters-filter-watchlist-watched-description": "Изменения страниц в вашем списке наблюдения.",
        "rcfilters-filter-watchlist-watchednew-label": "Новые изменения в списке наблюдения",
        "rcfilters-filter-watchlist-watchednew-description": "Правки на страницах из вашего списка наблюдения, которые вы не просмотрели с их совершения.",
        "rcfilters-filter-watchlist-notwatched-label": "Нет в списке наблюдения",
        "rcfilters-watchlist-showupdated": "Изменения страниц, которые вы не посещали с того момента, как они изменились, выделены <strong>жирным</strong> и отмечены полным маркером.",
        "rcfilters-preference-label": "Скрыть улучшенную версию «Свежих правок»",
        "rcfilters-preference-help": "Откатывает редизайн интерфейса 2017 года и все инструменты, добавленные с тех пор.",
-       "rcfilters-watchlist-preference-label": "Скрыть улучшенную версию Списка наблюдения",
+       "rcfilters-watchlist-preference-label": "Скрыть улучшенную версию cписка наблюдения",
        "rcfilters-watchlist-preference-help": "Отменяет редизайн интерфейса 2017 года и все инструменты, добавленные тогда и позднее.",
        "rcfilters-filter-showlinkedfrom-label": "Показать правки на ссылаемых страницах",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Страницы, на которые ссылается</strong> выбранная",
        "speciallogtitlelabel": "Цель (название или {{ns:user}}:имя участника):",
        "log": "Журналы",
        "logeventslist-submit": "Показать",
-       "logeventslist-more-filters": "Ð\91олÑ\8cÑ\88е Ñ\84илÑ\8cÑ\82Ñ\80ов:",
+       "logeventslist-more-filters": "Ð\9fоказаÑ\82Ñ\8c Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ\82елÑ\8cнÑ\8bе Ð¶Ñ\83Ñ\80налÑ\8b:",
        "logeventslist-patrol-log": "Журнал патрулирования",
        "logeventslist-tag-log": "Журнал меток",
        "all-logs-page": "Все доступные журналы",
        "tooltip-ca-talk": "Обсуждение основной страницы",
        "tooltip-ca-edit": "Редактировать данную страницу",
        "tooltip-ca-addsection": "Создать новый раздел",
-       "tooltip-ca-viewsource": "Эта страница защищена от изменений. Вы можете посмотреть и скопировать её исходный текст.",
+       "tooltip-ca-viewsource": "Эта страница защищена от изменений. Вы можете посмотреть  её исходный текст.",
        "tooltip-ca-history": "Журнал изменений страницы",
        "tooltip-ca-protect": "Защитить страницу от изменений",
        "tooltip-ca-unprotect": "Изменить защиту этой страницы",
        "markedaspatrollederrornotify": "Отметить изменение как проверенное не удалось.",
        "patrol-log-page": "Журнал патрулирования",
        "patrol-log-header": "Это журнал патрулированных версий.",
-       "log-show-hide-patrol": "$1 журнал патрулирования",
-       "log-show-hide-tag": "$1 журнал меток",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Пометить версию $3 страницы $2 как отпатрулированную?",
        "deletedrevision": "Удалена старая версия $1",
index 070f620..591f262 100644 (file)
        "markedaspatrollederrornotify": "Не вдало ся поставити позначку про патролёваня",
        "patrol-log-page": "Книга перевіреных едітовань",
        "patrol-log-header": "Тото є книга перевіреных верзій.",
-       "log-show-hide-patrol": "$1 книгу записів патролованя",
        "deletedrevision": "Змазана стара ревізія $1",
        "filedeleteerror-short": "Хыба мазаня файлу: $1",
        "filedeleteerror-long": "Выникла хыба під час мазаня файлу:\n\n$1",
index 513e64d..6ce1512 100644 (file)
        "markedaspatrollederrornotify": "समीक्षितम् इति चिह्नीकरणं विफलम्।",
        "patrol-log-page": "निरीक्षिता संरक्षितावलिः",
        "patrol-log-header": "इयम् आरक्षितपुनरावृत्तीनां सूचिका अस्ति ।",
-       "log-show-hide-patrol": "$1 इत्यनेन निरीक्षिता संरक्षितावलिः",
-       "log-show-hide-tag": "$1 चिह्नाऽऽवलिः",
        "deletedrevision": "अपमर्जितप्राचीनपुनरावृत्तिः $1",
        "filedeleteerror-short": "सञ्चिकानपमर्जने दोषः : $1",
        "filedeleteerror-long": " सञ्चिकानामपमर्जने आगता समस्या  $1",
index 2214def..0bad36e 100644 (file)
        "markedaspatrollederrornotify": "Бэлиэтэммит курдук бэлиэтиир сатаммата.",
        "patrol-log-page": "Бэрэбиэркэ сурунаала",
        "patrol-log-header": "Ботуруулламмыт торумнар сурунааллара.",
-       "log-show-hide-patrol": "$1 ботурууллааһын сурунаала",
-       "log-show-hide-tag": "$1 тиэк сурунаала",
        "confirm-markpatrolled-button": "Сөп",
        "confirm-markpatrolled-top": "$2 сирэй $3 торумун ботуруулламмыт курдук бэлиэтиигин дуо?",
        "deletedrevision": "$1 урукку торума сотулунна",
index fc69e1e..3f8abdf 100644 (file)
        "markedaspatrollederrornotify": "La marcatura comu virificatu nun arriniscìu.",
        "patrol-log-page": "Riggistru dî canciamenti virificati",
        "patrol-log-header": "Chistu è nu riggistru dî virsioni virificati.",
-       "log-show-hide-patrol": "$1 lu riggistru dî canciamenti virificati",
-       "log-show-hide-tag": "$1 lu riggistru di l'etichetti",
        "deletedrevision": "Cancillata na virsioni vecchia di $1",
        "filedeleteerror-short": "Erruri ntâ cancillazzioni dû file: $1",
        "filedeleteerror-long": "Ammatteru erruri ntô tintativu di cancillari lu file:\n\n$1",
index fd746f1..aabc640 100644 (file)
        "markedaspatrollederrornotify": "Maurking aes patrowed failed.",
        "patrol-log-page": "Patrow log",
        "patrol-log-header": "This is ae log o patrowed reveesions.",
-       "log-show-hide-patrol": "$1 patrow log",
-       "log-show-hide-tag": "$1 tag log",
        "deletedrevision": "Delytit auld reveesion $1.",
        "filedeleteerror-short": "Mistak delytin file: $1",
        "filedeleteerror-long": "mistaks were encoontered while delytin the file:\n\n$1",
index 67ef97d..a147e4b 100644 (file)
        "timezoneregion-indian": "سنڌي ساگر",
        "timezoneregion-pacific": "ماٺو ساگر",
        "allowemail": "ٻين واپرائيندڙن کي مون ڏانھن برقٽپال ڪرڻ جي اجازت ڏيو",
+       "email-allow-new-users-label": "نوان واپرائيندڙ برق ٽپال موڪلين",
        "prefs-searchoptions": "ڳولا",
        "prefs-namespaces": "نانءُپولار",
        "default": "ڏنل",
        "yourrealname": "اصل نالو:",
        "yourlanguage": "ٻولي:",
        "yournick": "نئين صحيح:",
+       "prefs-help-signature": "بحث صفحي تي رايا ڏيڻ وقت هن نشانين ذريعي \"<nowiki>~~~~</nowiki>\" دستخط ڪيو، جيڪي پاڻ مرادو توهان جي دستخط ۽ وقت ۾ تبديل ٿي ويندا.",
        "badsiglength": "اها صحيح هيڪاندي ڊگھي آهي.\nاها وڌ ۾ وڌ $1 {{PLURAL:$1|اکر|اکرن}} تي ٻڌل هوڻ گھرجي.",
        "yourgender": "توهان ڪهڙو تعارف چاهيندا؟",
        "gender-unknown": "توهان جو ذڪر ڪندي، جيترو ٿي سگھيو، منطقگري بي جنس لفظن جو استعمال ڪندي.",
        "gender-male": "هيءُ وڪي صفحا سنواريندو آهي",
        "gender-female": "هيءَ وڪي صفحا سنواريندي آهي",
+       "prefs-help-gender": "هن ترجيح جي تربيت اختياري آهي.\nاوهان يا ٻين واپرائيندڙن جو سافٽويئر ويليو ذريعي مناسب وياڪرڻي جنس مطابق ذڪر ڪندو.\nهي معلومات عام هوندي.",
        "email": "برقٽپال",
        "prefs-help-realname": "اصل نالو اختياري آهي.\nجيڪڏهن توهان اصل نالو ڄاڻائڻ جو فيصلو ٿا ڪريو، تہ اهو توهان کي توهان جي ڪم جي مڃتا ڏيڻ لاءِ ڪم آندو ويندو.",
        "prefs-help-email": "برقٽپال ڄاڻائڻ اختياري آهي، پر جڏهن توهان ڳجھولفظ وسري ويندا آهيو، تڏهن ان جو استعمال توهان کي نئون ڳجھولفظ ڏيڻ لاءِ استعمال ڪيو ويندو آهي.",
        "emailuser": "هن واپرائيندڙ کي برقٽپال اماڻيو",
        "emailuser-title-target": "ھن {{GENDER:$1|واپرائيندڙ}} ڏانھن برقٽپال موڪليو",
        "emailuser-title-notarget": "واپرائيندڙ ڏانھن برقٽپال اماڻيو",
+       "emailpagetext": "هيٺ ڏنل فارم جي ذريعي اوهان هن {{GENDER:$1|واپرائيندڙ}} کي برقي ٽپال پيغام موڪلي سگھو ٿا. جيڪو برق ٽپال پتو اوهان [[Special:Preferences|پنهنجي ترجيحات]] ۾ ڏنو آهي اهو هتي \"کان\" جي طور نظر ايندو، جيئن وصول ڪندڙ اوهان کي سڌو جواب ڏئي سگھي.",
        "usermaildisabled": "واپرائيندڙ برقٽپال ناقابلِڪار بڻيل",
        "usermaildisabledtext": "توهان هن وڪي تي ٻين واپرائيندڙن ڏانهن برقٽپال نٿا موڪلي سگھو",
        "noemailtitle": "برقٽپال پتو ناھي",
        "movepagetext": "هيٺيون فارم استعمال ڪندي ڪنهن صفحي کي نئون عنوان ڏئي سگھجي ٿو، جنهن سان سمورو صفحو نئين عنوان ڏانهن هليو ويندو. \nاڳوڻو عنوان نئين عنوان ڏانهن چورڻو بنجي ويندو. \nتوهان  چورڻن کي سنواري سگھو ٿا جيڪي اصل عنوان ڏانهن خودبخود اشارو ڪن ٿا.\nانهي ڳالهه جي پڪ ڪري وٺو ته [[Special:BrokenRedirects|ٽٽل چورڻا]] يا [[Special:DoubleRedirects|ٻٽا چورڻا]] نه هجن.\nان ڳالهه جي پڪ ڪرڻ ذميواري توهان تي آهي ته ڳنڍڻا اتي ئي وٺي وڃن ٿا جتي انهن کي وٺي وڃڻ گھرجي.\n\nياد رکندا ته جيڪڏهن نئين عنوان سان اڳي ئي ڪو مضمون موجود آهي ته پوءِ صفحو '''نه''' چوريو ويندو، سوا ان جي ته موجوده صفحو محظ خالي آهي يا ڪا به سوانح نه رکندڙ ڪو چورڻو آهي.\n\n<strong>نوٽ!</strong>\nاها هڪ مقبول صفحي لاءِ ڪا غير متوقه ۽ انتهائي اڻوڻندڙ تبديلي ثابت ٿي سگھي ٿي؛ براءِ مهرباني اڳتي وڌڻ کان اڳ پڪ ڪندا ته توهان اها تبديلي آڻڻ جي نتيجن کان چڱيءَ ريت واقف آهيو.",
        "movepagetext-noredirectfixer": "هيٺيون فارم استعمال ڪندي ڪنهن صفحي کي نئون عنوان ڏئي سگھجي ٿو، جنهن سان سمورو صفحو نئين عنوان ڏانهن هليو ويندو. \nاڳوڻو عنوان نئين عنوان ڏانهن چورڻو بنجي ويندو. \nتوهان  چورڻن کي سنواري سگھو ٿا جيڪي اصل عنوان ڏانهن خودبخود اشارو ڪن ٿا.\nانهي ڳالهه جي پڪ ڪري وٺو ته [[Special:BrokenRedirects|ٽٽل چورڻا]] يا [[Special:DoubleRedirects|ٻٽا چورڻا]] نه هجن.\nان ڳالهه جي پڪ ڪرڻ ذميواري توهان تي آهي ته ڳنڍڻا اتي ئي وٺي وڃن ٿا جتي انهن کي وٺي وڃڻ گھرجي.\n\nياد رکندا ته جيڪڏهن نئين عنوان سان اڳي ئي ڪو مضمون موجود آهي ته پوءِ صفحو '''نه''' چوريو ويندو، سوا ان جي ته موجوده صفحو محظ خالي آهي يا ڪا به سوانح نه رکندڙ ڪو چورڻو آهي.\n\n<strong>نوٽ!</strong>\nاها هڪ مقبول صفحي لاءِ ڪا غير متوقه ۽ انتهائي اڻوڻندڙ تبديلي ثابت ٿي سگھي ٿي؛ مهرباني ڪري اڳتي وڌڻ کان اڳ پڪ ڪندا ته توهان اها تبديلي آڻڻ جي نتيجن کان چڱيءَ ريت واقف آهيو.",
        "movepagetalktext": "جيڪڏهن توهان هن خاني کي نشان لڳائيندئو، واسطيدار مباحثي صفحو پاڻ ئي چوريو ويندو ماسواءِ اتي ڪو اڳ ئي ڪو غيرخالي مباحثي صفحو موجود هجي.\n\nان صورت ۾، جيڪڏهن توهان چاهيو ته صفحي کي پاڻ چوري يا ضم ڪري سگھو ٿا.",
+       "movecategorypage-warning": "<strong>چتاءُ:</strong> اوهان زمري واري صفحي کي چورڻ وڃي رهيا آهيو. ياد رکو صرف صفحو چورندو، جيڪڏهن ڪي به صفحا پراڻي زمري ۾ شامل آهن، انهن جي نئين زمري ۾ درجابندي <em>نه</em> ٿيندي.",
        "movenotallowed": "توهان کي صفحا چورڻ جي اجازت حاصل ڪانهي.",
        "movenotallowedfile": "توهان کي فائيلس چورڻ جي اجازت حاصل ڪانهي.",
        "newtitle": "نئون عنوان:",
        "watchlisttools-view": "لاڳاپيل تبديليون ڏسو",
        "watchlisttools-edit": "نظر ۾ فهرست ڏسو ۽ سنواريو",
        "watchlisttools-raw": "ڪچي نظر ۾ فھرست سنواريو",
+       "hijri-calendar-m1": "محرم",
+       "hijri-calendar-m2": "صفر",
+       "hijri-calendar-m3": "ربيع الاول",
+       "hijri-calendar-m4": "ربيع الثاني",
+       "hijri-calendar-m5": "جمادي الاول",
+       "hijri-calendar-m6": "جمادي الثاني",
+       "hijri-calendar-m7": "رجب",
+       "hijri-calendar-m8": "شعبان",
+       "hijri-calendar-m9": "رمضان",
        "hijri-calendar-m10": "شوال",
        "hijri-calendar-m11": "ذوالقعد",
+       "hijri-calendar-m12": "ذوالحج",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ڳالھ]])",
        "version": "ڀيرو",
        "version-extensions": "تنصيب شده توسيعات",
        "logentry-patrol-patrol-auto": "$1 پاڻمرادو صفحي $3 جي $4 مسودي تي گشت ڪيل طور {{GENDER:$2|نشان لڳايو}}",
        "logentry-newusers-create": "واپرائيندڙ کاتو $1 {{GENDER:$2|سرجيو ويو}}",
        "logentry-newusers-autocreate": "واپرائيندڙ کاتو $1 پاڻمرادو {{GENDER:$2|تخليق ڪيو}} ويو",
+       "logentry-protect-protect": "$1 {{GENDER:$2|محفوظ ڪيو}} $3 $4",
        "logentry-upload-upload": "$1 {{GENDER:$2|چاڙهيو}} $3",
        "logentry-upload-overwrite": "$1 $3 جو ھڪ نئون ورزن {{GENDER:$2|چاڙھيو}}",
        "rightsnone": "(ڪو بہ نہ)",
index d98c844..9a26fdc 100644 (file)
        "markedaspatrollederrornotify": "Goo ma šilbay kaŋ a ga kurandi.",
        "patrol-log-page": "Kuryan taariki",
        "patrol-log-header": "Woo ti filla kurantey taarikoo.",
-       "log-show-hide-patrol": "kuryan taariki $1",
        "deletedrevision": "Filla žeena tuusante $1",
        "filedeleteerror-short": "Tuku tuusuyan firka: $1",
        "filedeleteerror-long": "Firkayaŋ bangay tukoo tuusuyanoo waate:\n\n$1",
index e1e2ee9..be33940 100644 (file)
        "markedaspatrolled": "Pažīmiets kāp patėkrints",
        "markedaspatrolledtext": "Pasėrinkta versėjė siekmingā pažīmieta kāp patėkrinta",
        "patrol-log-page": "Patikrinėma istuorėjė",
-       "log-show-hide-patrol": "$1 patvirtėnėmu saraša",
        "deletedrevision": "Ėštrinta sena versėjė $1.",
        "filedeleteerror-short": "Klaida trėnont faila: $1",
        "previousdiff": "← Onkstesnis pakeitėms",
index f4b87ed..d8a7a88 100644 (file)
        "markedaspatrollederrornotify": "Nije uspjelo označavanje ove stranice kao patrolirane.",
        "patrol-log-page": "Evidencija patroliranja",
        "patrol-log-header": "Ovdje se nalazi evidencija patroliranih revizija.",
-       "log-show-hide-patrol": "$1 zapis patroliranja",
        "deletedrevision": "Obrisana stara revizija $1",
        "filedeleteerror-short": "Greška pri brisanju datoteke: $1",
        "filedeleteerror-long": "Desile su se greške pri brisanju datoteke:\n\n$1",
index 3d4068c..ebec299 100644 (file)
        "markedaspatrollederror-noautopatrol": "ඔබගේ ස්වීය වෙනස්වීම් පරික්‍ෂාකර බැලූ ලෙස සලකුණු කිරීමට ඔබ හට ඉඩ දෙනු නොලැබේ.",
        "patrol-log-page": "පරික්ෂාකිරීම් සටහන",
        "patrol-log-header": "මෙය පරික්‍ෂාකර බැලූ සංශෝධනයන්ගේ ලඝු-සටහනකි.",
-       "log-show-hide-patrol": "පරික්‍ෂාකිරීම් ලඝු-සටහන් $1",
-       "log-show-hide-tag": "$1 ටැගය ලඝු-සටහන",
        "deletedrevision": "පැරැණි සංශෝධනය $1 මකාදමන ලදි",
        "filedeleteerror-short": "ගොනුව මකාදැමීමේ දෝෂය: $1",
        "filedeleteerror-long": "ගොනුව මකාදැමීමේදී දෝෂයන් හමුවුණි:\n\n$1",
index 3fe3bc8..4accf55 100644 (file)
        "markedaspatrollederrornotify": "Nepodarilo sa označiť ako preverené.",
        "patrol-log-page": "Záznam preverených úprav",
        "patrol-log-header": "Toto je záznam preverených revízií.",
-       "log-show-hide-patrol": "$1 záznam preverených úprav",
-       "log-show-hide-tag": "$1 záznam značiek",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Označiť revíziu $3 stránky $2 ako preverenú?",
        "deletedrevision": "Zmazať staré verzie $1",
index b57bd0b..64c315b 100644 (file)
        "diff-paragraph-moved-toold": "Odstavek je bil premaknjen. Kliknite, da skočite na staro nahajališče.",
        "difference-missing-revision": "{{PLURAL:$2|Ene redakcije|$2 redakcij}} razlike ($1) {{PLURAL:$2|nisem}} našel.\n\nPo navadi se to zgodi, ko sledite zastareli povezavi na razliko redakcij strani, ki jo je nekdo izbrisal.\nPodrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].",
        "searchresults": "Izid iskanja",
+       "search-filter-title-prefix": "Išči samo na straneh, katerih naslovi se začnejo z \"$1\"",
+       "search-filter-title-prefix-reset": "Išči vse strani",
        "searchresults-title": "Zadetki za povpraševanje »$1«",
        "titlematches": "Ujemanje z naslovom članka",
        "textmatches": "Ujemanje z besedilom članka",
        "prefs-rc": "Zadnje spremembe",
        "prefs-watchlist": "Spisek nadzorov",
        "prefs-editwatchlist": "Uredi spisek nadzorov",
-       "prefs-editwatchlist-label": "Uredite vnose na svojem spisku nadzorov:",
+       "prefs-editwatchlist-label": "Uredi vnose na svojem spisku nadzorov:",
        "prefs-editwatchlist-edit": "Preglejte in odstranite naslove s svojega spiska nadzorov",
        "prefs-editwatchlist-raw": "Uredite gol spisek nadzorov",
        "prefs-editwatchlist-clear": "Počistite svoj spisek nadzorov",
        "prefs-help-signature": "Komentarje na pogovornih straneh je treba podpisati s »<nowiki>~~~~</nowiki>«, kar bo pretvorjeno v vaš podpis s časovnim žigom.",
        "badsig": "Neveljaven surovi podpis; preverite oznake HTML.",
        "badsiglength": "Vaš podpis je preobsežen.\nNe sme biti daljši od $1 {{PLURAL:$1|znaka|znakov}}.",
-       "yourgender": "Kako vam je ljubše, da vas opišemo?",
-       "gender-unknown": "Ko boste omenjeni, bo programje uporabilo nevtralen spol, kjer je to mogoče",
+       "yourgender": "Kako želiš biti obravnavan?",
+       "gender-unknown": "Ob tvoji omembi bo programje uporabilo nevtralne izraze za spol, kjer je to mogoče",
        "gender-male": "On ureja wikistrani.",
        "gender-female": "Ona ureja wikistrani.",
        "prefs-help-gender": "Nastavitev ni obvezna.\nProgramje uporablja njeno vrednost za vaše naslavljanje in omenjanje v ustreznem slovničnem spolu.\nPodatek bo javno prikazan.",
        "rcfilters-liveupdates-button-title-on": "Izklopi posodobitve v živo",
        "rcfilters-liveupdates-button-title-off": "Prikaži nove spremembe, ko se zgodijo",
        "rcfilters-watchlist-markseen-button": "Označi vse spremembe kot pregledane",
-       "rcfilters-watchlist-edit-watchlist-button": "Uredite svoj seznam nadzorovanih strani",
+       "rcfilters-watchlist-edit-watchlist-button": "Uredi svoj seznam nadzorovanih strani",
        "rcfilters-watchlist-showupdated": "Spremembe strani, ki jih niste obiskali od zadnje spremembe, so prikazane <strong>krepko</strong>, z močnimi oznakami.",
        "rcfilters-preference-label": "Skrij izboljšano različico Zadnjih sprememb",
        "rcfilters-preference-help": "Povrne preoblikovanje vmesnika leta 2017 in vsa takrat in od takrat dodana orodja.",
        "speciallogtitlelabel": "Cilj (naslov ali {{ns:user}}:uporabniškoime za uporabnika):",
        "log": "Dnevniki",
        "logeventslist-submit": "Prikaži",
-       "logeventslist-more-filters": "Več filtrov:",
+       "logeventslist-more-filters": "Prikaži dodatne dnevnike:",
        "logeventslist-patrol-log": "Dnevnik patrulje",
        "logeventslist-tag-log": "Dnevnik oznak",
        "all-logs-page": "Vsi javni dnevniki",
        "watchlist": "Spisek nadzorov",
        "mywatchlist": "Spisek nadzorov",
        "watchlistfor2": "Za $1 $2",
-       "nowatchlist": "Vaš spisek nadzorov je prazen.",
+       "nowatchlist": "Tvoj spisek nadzorov je prazen.",
        "watchlistanontext": "Za pregled ali urejanje vsebine vašega spiska nadzorov se morate prijaviti.",
        "watchnologin": "Niste prijavljeni",
        "addwatch": "Dodaj na spisek nadzorov",
        "markedaspatrollederrornotify": "Označevanje kot nadzorovano ni uspelo.",
        "patrol-log-page": "Dnevnik patrulje",
        "patrol-log-header": "To je dnevnik nadzorovanih redakcij.",
-       "log-show-hide-patrol": "$1 dnevnik nadzora",
-       "log-show-hide-tag": "$1 dnevnik oznak",
        "confirm-markpatrolled-button": "V redu",
        "confirm-markpatrolled-top": "Označimo redakcijo $3 strani $2 kot nadzorovano?",
        "deletedrevision": "Prejšnja redakcija $1 je izbrisana",
        "lag-warn-high": "Zaradi visoke zasedenosti strežniških podatkovnih baz, spremembe novejše od $1 {{PLURAL:$1|sekunde|sekund}} morda ne bodo prikazane na seznamu.",
        "watchlistedit-normal-title": "Uredi spisek nadzorov",
        "watchlistedit-normal-legend": "Odstrani strani iz spiska nadzorov",
-       "watchlistedit-normal-explain": "Strani na vašem spisku nadzorov so prikazane spodaj.\nDa odstranite stran, označite kvadratek poleg nje in kliknite »{{int:Watchlistedit-normal-submit}}«.\nLahko tudi [[Special:EditWatchlist/raw|uredite gol spisek]].",
+       "watchlistedit-normal-explain": "Spodaj so prikazane strani tvojega spiska nadzorov.\nZa odstranitev strani označi kvadratek poleg nje in klikni »{{int:Watchlistedit-normal-submit}}«.\nLahko tudi [[Special:EditWatchlist/raw|urediš gol spisek]].",
        "watchlistedit-normal-submit": "Odstrani strani",
        "watchlistedit-normal-done": "Z vašega spiska nadzorov {{PLURAL:$1|je bila odstranjena $1 stran|sta bili odstranjeni $1 strani|so bile odstranjene $1 strani|je bilo odstranjenih $1 strani}}:",
        "watchlistedit-raw-title": "Urejanje golega spiska nadzorov",
index 0c01fdd..2514d5b 100644 (file)
        "markedaspatrollederror-noautopatrol": "Is ies ne erlaubt, eigene Beoarbeetunga ols kontrolliert zu markieren.",
        "patrol-log-page": "Kontroll-Logbichl",
        "patrol-log-header": "Dies ies doas Kontroll-Logbuch.",
-       "log-show-hide-patrol": "Kontroll-Logbichl $1",
        "deletedrevision": "aale Version: $1",
        "filedeleteerror-short": "Fahler bei Datei-Läschung: $1",
        "filedeleteerror-long": "Bei dar Datei-Läschung wurden Fahler festgestellt:\n\n$1",
index c1be4c3..d1f3d62 100644 (file)
        "markedaspatrollederrornotify": "Shënimi si i patrulluar dështoi.",
        "patrol-log-page": "Regjistri i patrollimeve",
        "patrol-log-header": "Këto janë të dhëna të revizioneve të patrulluara.",
-       "log-show-hide-patrol": "$1 regjistri i patrollimeve",
-       "log-show-hide-tag": "$1 regjistri i etiketave",
        "confirm-markpatrolled-button": "Në rregull",
        "confirm-markpatrolled-top": "Shëno versionin $3 nga $2 si të patrolluar",
        "deletedrevision": "Gris versionin e vjetër $1",
index d615041..c0515a5 100644 (file)
        "databaselocked": "База података је већ закључана.",
        "databasenotlocked": "База није закључана.",
        "lockedbyandtime": "(од $1 дана $2 у $3)",
-       "move-page": "Ð\9fÑ\80емеÑ\88Ñ\82аÑ\9aе â\80\9e$1â\80\9c",
+       "move-page": "Ð\9fÑ\80емеÑ\88Ñ\82аÑ\9aе â\80\9e$1â\80\9d",
        "move-page-legend": "Премештање странице",
        "movepagetext": "Доњи образац ће преименовати страницу, премештајући целу историју на ново име.\nСтари наслов постаће преусмерење на нови.\nМожете ажурирати преусмерења која воде до изворног наслова;\nпогледајте [[Special:DoubleRedirects|двострука]] или [[Special:BrokenRedirects|покварена]] преусмерења.\nНа вама је одговорност да везе и даље иду тамо где треба.\n\nСтраница <strong>неће</strong> бити премештена ако већ постоји страница с тим именом (осим ако је празна, садржи преусмерење или нема историју измена).\nТо значи да можете вратити страницу на претходно име ако погрешите, али не можете ''преписати'' постојећу.\n\n<strong>Напомена:</strong>\nОво може представљати драстичну и неочекивану измену за популарну страницу;\nдобро размислите о последицама пре него што наставите.",
        "movepagetext-noredirectfixer": "Доњи образац ће преименовати страницу, премештајући целу историју на ново име.\nСтари наслов постаће преусмерење на нови.\nПогледајте [[Special:DoubleRedirects|двострука]] или [[Special:BrokenRedirects|покварена]] преусмерења.\nНа вама је одговорност да везе и даље иду тамо где треба.\n\nСтраница <strong>неће</strong> бити премештена ако већ постоји страница с тим именом (осим ако је празна, садржи преусмерење или нема историју измена).\nТо значи да можете вратити страницу на претходно име ако погрешите, али не можете ''преписати'' постојећу.\n\n<strong>Напомена:</strong>\nОво може представљати драстичну и неочекивану измену за популарну страницу;\nдобро размислите о последицама пре него што наставите.",
        "markedaspatrollederrornotify": "Означавање ове измене патролираном није успело.",
        "patrol-log-page": "Дневник патролирања",
        "patrol-log-header": "Ово је дневник патролираних измена.",
-       "log-show-hide-patrol": "$1 дневник патролирања",
-       "log-show-hide-tag": "$1 дневник ознака",
        "confirm-markpatrolled-button": "У реду",
        "confirm-markpatrolled-top": "Означити измену $3 странице $2 патролираном?",
        "deletedrevision": "Обрисана стара измена $1.",
index a8ebcb3..7d879a1 100644 (file)
        "cantrollback": "Ne mogu da vratim izmenu.\nPoslednji autor je ujedno i jedini.",
        "alreadyrolled": "Vraćanje poslednje izmene stranice [[:$1]] od strane {{GENDER:$2|korisnika|korisnice|korisnika}} [[User:$2|$2]] ([[User talk:$2|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) nije uspelo; neko drugi je u međuvremenu izmenio ili vratio stranicu.\n\nPoslednju izmenu je {{GENDER:$3|napravio|napravila|napravio}} [[User:$3|$3]] ([[User talk:$3|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Opis izmene: <em>$1</em>.",
-       "revertpage": "!!FUZZY!!Vraćene izmene {{GENDER:$2|korisnika|korisnice}} [[Special:Contribs/$2|$2]] ([[User talk:$2|razgovor]]) na poslednju izmenu {{GENDER:$1|korisnika|korisnice}} [[User:$1|$1]]",
+       "revertpage": "Vraćene izmene {{GENDER:$2|korisnika|korisnice}} [[Special:Contribs/$2|$2]] ([[User talk:$2|razgovor]]) na poslednju izmenu {{GENDER:$1|korisnika|korisnice}} [[User:$1|$1]]",
        "revertpage-nouser": "Izmene skrivenog korisnika su vraćene na poslednju izmenu {{GENDER:$1|korisnika|korisnice}} [[User:$1|$1]]",
        "rollback-success": "Izmene {{GENDER:$1|korisnika|korisnice}} {{GENDER:$3|$1}} su vraćene na poslednju izmenu {{GENDER:$2|korisnika|korisnice}} {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Vraćene izmene korisnika $1;\nvraćeno na poslednju izmenu korisnika $2. [$3 Prikaži izmene]",
        "databaselocked": "Baza podataka je već zaključana.",
        "databasenotlocked": "Baza nije zaključana.",
        "lockedbyandtime": "(od $1 dana $2 u $3)",
-       "move-page": "PremeÅ¡tanje â\80\9e$1â\80\9c",
+       "move-page": "PremeÅ¡tanje â\80\9e$1â\80\9d",
        "move-page-legend": "Premeštanje stranice",
        "movepagetext": "Donji obrazac će preimenovati stranicu, premeštajući celu istoriju na novo ime.\nStari naslov postaće preusmerenje na novi.\nMožete ažurirati preusmerenja koja vode do izvornog naslova;\npogledajte [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|pokvarena]] preusmerenja.\nNa vama je odgovornost da veze i dalje idu tamo gde treba.\n\nStranica <strong>neće</strong> biti premeštena ako već postoji stranica s tim imenom (osim ako je prazna, sadrži preusmerenje ili nema istoriju izmena).\nTo znači da možete vratiti stranicu na prethodno ime ako pogrešite, ali ne možete ''prepisati'' postojeću.\n\n<strong>Napomena:</strong>\nOvo može predstavljati drastičnu i neočekivanu izmenu za popularnu stranicu;\ndobro razmislite o posledicama pre nego što nastavite.",
        "movepagetext-noredirectfixer": "Donji obrazac će preimenovati stranicu, premeštajući celu istoriju na novo ime.\nStari naslov postaće preusmerenje na novi.\nPogledajte [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|pokvarena]] preusmerenja.\nNa vama je odgovornost da veze i dalje idu tamo gde treba.\n\nStranica <strong>neće</strong> biti premeštena ako već postoji stranica s tim imenom (osim ako je prazna, sadrži preusmerenje ili nema istoriju izmena).\nTo znači da možete vratiti stranicu na prethodno ime ako pogrešite, ali ne možete ''prepisati'' postojeću.\n\n<strong>Napomena:</strong>\nOvo može predstavljati drastičnu i neočekivanu izmenu za popularnu stranicu;\ndobro razmislite o posledicama pre nego što nastavite.",
        "markedaspatrollederrornotify": "Označavanje ove izmene patroliranom nije uspelo.",
        "patrol-log-page": "Dnevnik patroliranja",
        "patrol-log-header": "Ovo je dnevnik patroliranih izmena.",
-       "log-show-hide-patrol": "$1 dnevnik patroliranja",
-       "log-show-hide-tag": "$1 dnevnik oznaka",
        "confirm-markpatrolled-button": "U redu",
        "confirm-markpatrolled-top": "Označiti izmenu $3 stranice $2 patroliranom?",
        "deletedrevision": "Obrisana stara izmena $1.",
index 682a1b6..83390c7 100644 (file)
        "markedaspatrollederror-noautopatrol": "Et is nit ferlööwed, oaine Beoarbaidengen as kontrollierd tou markierjen.",
        "patrol-log-page": "Kontrol-Logbouk",
        "patrol-log-header": "Dit is dät Kontroll-Logbouk.",
-       "log-show-hide-patrol": "Kontroll-Logbouk $1",
        "deletedrevision": "Oolde Version $1 läsked",
        "filedeleteerror-short": "Failer bie dät Doatäi-Läskjen: $1",
        "filedeleteerror-long": "Bie dät Doatäi-Läskjen wuuden Failere fääststoald:\n\n$1",
index f4f0840..bcf7bc5 100644 (file)
        "markedaspatrollederrornotify": "Nandaan minangka kaawas gagal.",
        "patrol-log-page": "Log patroli",
        "patrol-log-header": "Ieu minangka log pikeun révisi nu geus diroris.",
-       "log-show-hide-patrol": "$1 log rorisan",
-       "log-show-hide-tag": "log tag $1",
        "confirm-markpatrolled-button": "Heug",
        "confirm-markpatrolled-top": "Tandaan révisi $3 ti $2 minangka kaawas?",
        "deletedrevision": "Révisi heubeul nu dihapus $1",
index 9185b78..1b2ccc9 100644 (file)
        "markedaspatrollederrornotify": "Markering som patrullerad misslyckades.",
        "patrol-log-page": "Patrulleringslogg",
        "patrol-log-header": "Detta är en logg över patrullerade sidversioner.",
-       "log-show-hide-patrol": "$1 patrulleringslogg",
-       "log-show-hide-tag": "$1 märkeslogg",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Markera sidversionen $3 av $2 som patrullerad?",
        "deletedrevision": "Raderade gammal sidversion $1",
index d48650d..2b44968 100644 (file)
        "markedaspatrollederror-noautopatrol": "Ńy moš uprawńyń wymaganych do uoznačańo swojich sprawjyń kej „sprawdzůne”.",
        "patrol-log-page": "Dźynńik patrolowańo",
        "patrol-log-header": "Půniżej je dźeńńik patrolowańo zajtůw.",
-       "log-show-hide-patrol": "$1 rejer sprawdzańo",
        "deletedrevision": "Wyćepano popředńy wersyje $1",
        "filedeleteerror-short": "Feler při wyćepywańu plika $1",
        "filedeleteerror-long": "Wystůmpiuy felery při wyćepywańu pliku:\n\n$1",
index ea4f828..f92970e 100644 (file)
        "markedaspatrollederrornotify": "சுற்றுக்காவல் தோல்வியடைந்ததாக குறிக்கப்பட்டது.",
        "patrol-log-page": "சுற்றுக்காவல் பதிகை",
        "patrol-log-header": "இது ரோந்து செய்யப்பட்ட  பரிசீலனைகளுக்கான  குறிப்பேடு.",
-       "log-show-hide-patrol": "$1 ரோந்து குறிப்பேடு",
-       "log-show-hide-tag": "$1 அடையாள பதிவு",
        "confirm-markpatrolled-button": "சரி",
        "deletedrevision": "பழைய திருத்தம் $1 நீக்கப்பட்டது",
        "filedeleteerror-short": "பின்வரும் கோப்பை நீக்குவதில் தவறு: $1",
index c5ecd77..6bfb7e7 100644 (file)
        "markaspatrolleddiff": "Sinbbaq sa wayal gawzyagan mita’",
        "markedaspatrolled": "Sinbbaq sa wayal gawzyagan mita’",
        "patrol-log-page": "Inblaq gmawzyaw mita’ binrwan",
-       "log-show-hide-patrol": "$1 inblaq gmawzyaw mita’ binrwan",
-       "log-show-hide-tag": "$1 bniru’ sa lalu’ na qinlah",
        "confirm-markpatrolled-button": "Wal balay",
        "previousdiff": "← Smural sinr’zyut miru’",
        "nextdiff": "Giqas hazi’ sinr’zyut→",
index 9d131fd..2ef8aba 100644 (file)
        "markedaspatrollednotify": "$1 లో చేసిన ఈ మార్పు పర్యవేక్షణలో ఉన్నట్టుగా గుర్తించబడింది.",
        "patrol-log-page": "నిఘా చిట్టా",
        "patrol-log-header": "ఇది పర్యవేక్షించిన కూర్పుల చిట్టా.",
-       "log-show-hide-patrol": "$1 పర్యవేక్షణ చిట్టా",
-       "log-show-hide-tag": "ట్యాగుల చిట్టాను $1",
        "confirm-markpatrolled-button": "సరే",
        "deletedrevision": "పాత సంచిక $1 తొలగించబడినది.",
        "filedeleteerror-short": "ఫైలు తొలగించడంలో పొరపాటు: $1",
index 6cb3fba..6043bae 100644 (file)
        "markedaspatrollederrornotify": "การทำเครื่องหมายว่าตรวจสอบแล้วล้มเหลว",
        "patrol-log-page": "ปูมการตรวจสอบ",
        "patrol-log-header": "หน้านี้คือปูมรุ่นการแก้ไขที่กำหนดว่าตรวจสอบแล้ว",
-       "log-show-hide-patrol": "$1 ปูมการตรวจสอบ",
-       "log-show-hide-tag": "$1ปูมป้ายระบุ",
        "confirm-markpatrolled-button": "ตกลง",
        "confirm-markpatrolled-top": "ทำเครื่องหมายรุ่น $3 ของ $2 ว่าตรวจสอบแล้วหรือไม่",
        "deletedrevision": "รุ่นเก่าที่ถูกลบ $1",
index c6c93db..eff94a5 100644 (file)
        "markedaspatrollederror-noautopatrol": "Öz üýtgeşmeleriňizi patrullyk edilen diýip bellemekligiňize rugsat berilmeýär.",
        "patrol-log-page": "Patrullyk gündeligi",
        "patrol-log-header": "Bu patrullyk edilen wersiýalaryň gündeligidir.",
-       "log-show-hide-patrol": "Patrullyk gündeligini $1",
        "deletedrevision": "$1 köne wersiýasy öçürildi.",
        "filedeleteerror-short": "Faýl öçürmek säwligi: $1",
        "filedeleteerror-long": "Faýl öçürilýän mahaly säwlikler ýüze çykdy:\n\n$1",
index 7bc2743..7e30056 100644 (file)
        "markedaspatrollederror-noautopatrol": "Wala kang pahintulot para tatakan ang ginawa mong mga pagbabago bilang napatrolya na.",
        "patrol-log-page": "Tala ng Pagpapatrolya",
        "patrol-log-header": "Tala ito ng mga pagbabagong napatrolya na.",
-       "log-show-hide-patrol": "$1 tala ng pagpatrolya",
        "deletedrevision": "Binurang lumang pagbabago $1",
        "filedeleteerror-short": "Kamalian sa pagbubura ng talaksan: $1",
        "filedeleteerror-long": "Nakaranas ng mga kamalian habang binubura ang talaksan:\n\n$1",
index 4b2080c..3f492b3 100644 (file)
        "markedaspatrollederrornotify": "Kontrol edildi olarak işaretleme başarısız oldu.",
        "patrol-log-page": "Devriye günlüğü",
        "patrol-log-header": "Bu gözlenmiş revizyonların günlüğüdür.",
-       "log-show-hide-patrol": "Gözetim günlüğünü $1",
-       "log-show-hide-tag": "Etiket günlüğünü $1",
        "deletedrevision": "$1 sayılı eski sürüm silindi.",
        "filedeleteerror-short": "$1 dosyanın silinmesinde hata oldu",
        "filedeleteerror-long": "Dosyayı silerken hatalarla karşılaşıldı:\n\n$1",
index ba46946..ea93a9f 100644 (file)
        "markedaspatrolledtext": "Сайланган [[:$1]] мәкаләсенең әлеге юрамасы тикшерелгән дип тамгаланды.",
        "patrol-log-page": "Тикшерү көндәлеге",
        "patrol-log-header": "Бу тикшерелгән битләрнең көндәлеге.",
-       "log-show-hide-patrol": "$1 тикшерү көндәлеге",
        "confirm-markpatrolled-button": "Ярый",
        "deletedrevision": "$1 битенең иске юрамасы бетерелде",
        "filedeleteerror-short": "Файлны бетерү хатасы: $1",
index bab7202..cab0be7 100644 (file)
        "markedaspatrolledtext": "Saylanğan [[:$1]] mäqäläseneñ älege yuraması tikşerelgän dip tamğalandı.",
        "patrol-log-page": "Tikşerü köndälege",
        "patrol-log-header": "Bu tikşerelgän bitlärneñ köndälege.",
-       "log-show-hide-patrol": "$1 tikşerü köndälege",
        "deletedrevision": "$1 biteneñ iske yuraması beterelde",
        "filedeleteerror-short": "Faylnı beterü xatası: $1",
        "filedeleteerror-long": "Faylnı beterü waqıtında xatalar çıqtı:\n\n$1",
index cde8f30..15bf314 100644 (file)
        "markedaspatrollederrornotify": "چارلىيالمىغانلىق بەلگىسى قويۇلدى.",
        "patrol-log-page": "چارلاش خاتىرىسى",
        "patrol-log-header": "بۇ چارلانغان تۈزىتىلگەن نەشرى.",
-       "log-show-hide-patrol": "$1 چارلاش خاتىرىسى",
        "deletedrevision": "$1 كونا تۈزىتىلگەن نەشرى ئۆچۈرۈلدى",
        "filedeleteerror-short": "ھۆججەت ئۆچۈرۈش خاتالىقى: $1",
        "filedeleteerror-long": "ھۆججەت ئۆچۈرۈۋاتقاندا خاتالىق كۆرۈلدى:\n\n$1",
index e6fe0f2..e43963d 100644 (file)
        "diff-paragraph-moved-toold": "Абзац було переміщено. Натисніть щоб перестрибнути до старого розташування.",
        "difference-missing-revision": "{{PLURAL:$2|$2 версія|$2 версії|$2 версій}} для цього порівняння ($1) не {{PLURAL:$2|1=знайдена|знайдені}}.\n\nІмовірно, ви перейшли за застарілим посиланням на порівняння версій вилученої сторінки.\nПодробиці можна дізнатися з [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журналу вилучень].",
        "searchresults": "Результати пошуку",
+       "search-filter-title-prefix": "Лише пошук в сторінках, назви яких починаються з \"$1\"",
+       "search-filter-title-prefix-reset": "Пошук по всіх сторінках",
        "searchresults-title": "Результати пошуку для «$1»",
        "titlematches": "Збіги в назвах сторінок",
        "textmatches": "Збіги в текстах сторінок",
        "grouppage-suppress": "{{ns:project}}:Подавлювачі",
        "right-read": "перегляд сторінок",
        "right-edit": "редагування сторінок",
-       "right-createpage": "створення сторінок (але не обговорень)",
+       "right-createpage": "створення сторінок (які не є обговореннями)",
        "right-createtalk": "створення обговорень сторінок",
        "right-createaccount": "створення нових облікових записів",
        "right-autocreateaccount": "Автоматичний вхід в систему із зовнішнього облікового запису користувача",
        "right-markbotedits": "позначення відкинутих редагувань як редагування бота",
        "right-noratelimit": "нема обмежень за швидкістю",
        "right-import": "імпорт сторінок з інших вікі",
-       "right-importupload": "Імпорт сторінок через завантаження файлів",
+       "right-importupload": "імпорт сторінок через завантаження файлів",
        "right-patrol": "позначення редагувань патрульованими",
        "right-autopatrol": "автоматичне позначення редагувань патрульованими",
        "right-patrolmarks": "Перегляд патрульованих сторінок у нових редагуваннях",
        "speciallogtitlelabel": "Ціль (назва сторінки або {{ns:user}}:Ім'я_користувача):",
        "log": "Журнали",
        "logeventslist-submit": "Показати",
-       "logeventslist-more-filters": "Ð\91Ñ\96лÑ\8cÑ\88е Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80Ñ\96в:",
+       "logeventslist-more-filters": "Ð\9fоказаÑ\82и Ð´Ð¾Ð´Ð°Ñ\82ковÑ\96 Ð¶Ñ\83Ñ\80нали:",
        "logeventslist-patrol-log": "Журнал патрулювання",
        "logeventslist-tag-log": "Журнал міток",
        "all-logs-page": "Усі публічні журнали",
        "markedaspatrollederrornotify": "Не вдалося поставити позначку про патрулювання.",
        "patrol-log-page": "Журнал патрулювання",
        "patrol-log-header": "Це журнал перевірених змін.",
-       "log-show-hide-patrol": "$1 журнал патрулювання",
-       "log-show-hide-tag": "$1 мітку журналу",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Позначити версію $3 сторінки $2 як відпатрульовану?",
        "deletedrevision": "Вилучена стара версія $1",
index 09f4088..be1bc38 100644 (file)
@@ -38,7 +38,8 @@
                        "Sayam Asjad",
                        "Abdulq",
                        "Fitoschido",
-                       "Dcljr"
+                       "Dcljr",
+                       "Bukhari"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
        "customjsonprotected": "آپ کو اس JSON میں ترمیم کرنے کی اجازت نہیں کیونکہ اس میں کسی دوسرے صارف کی ذاتی ترتیبات موجود ہیں۔",
        "customjsprotected": "آپ کو اس جاوا اسکرپٹ میں ترمیم کرنے کی اجازت نہیں کیونکہ اس میں کسی دوسرے صارف کی ذاتی ترتیبات موجود ہیں۔",
        "mycustomcssprotected": "آپ اس سی ایس ایس (CSS) صفحہ میں ترمیم کرنے کا اختیار نہیں رکھتے۔",
+       "mycustomjsonprotected": "آپ اس صفحہ (جے ایس او این) میں تدوین کرنے کے مجاز نہیں ہیں",
        "mycustomjsprotected": "آپ اس جاوا اسکپرٹ (JavaScript) صفحہ میں ترمیم کرنے کا اختیار نہیں رکھتے۔",
        "myprivateinfoprotected": "آپ ان ذاتی معلوات (private information) میں ترمیم کرنے کا اختیار نہیں رکھتے۔",
        "mypreferencesprotected": "آپ اپنی ان ترجیحات (preferences) میں ترمیم کرنے کا اختیار نہیں رکھتے۔",
        "cannotcreateaccount-title": "کھاتے نہیں بنائے جا سکتے",
        "cannotcreateaccount-text": "اس ویکی پر براہ راست کھاتہ سازی فعال نہیں ہے۔",
        "yourdomainname": "آپکا ڈومین",
-       "password-change-forbidden": "آپ Ø§Ø³ Ù\88Û\8cÚ©Û\8c Ù¾Ø± Ù¾Ø§Ø±Ù\84Ù\81ظ (پاس Ø±Ù\88Ú\88) ØªØ¨Ø¯Û\8cÙ\84 Ù\86Û\81Û\8cÚº Ú©Ø± Ø³Ú©ØªÛ\92",
+       "password-change-forbidden": "آپ Ø§Ø³ Ù\88Û\8cÚ©Û\8c Ù¾Ø± Ù¾Ø§Ø³ Ø±Ù\88Ú\88 ØªØ¨Ø¯Û\8cÙ\84 Ù\86Û\81Û\8cÚº Ú©Ø± Ø³Ú©ØªÛ\92Û\94",
        "externaldberror": "یا تو توثیقی ڈیٹابیس میں خطا واقع ہوئی اور یا آپ کو بیرونی کھاتہ بتاریخ کرنے کی اِجازت نہیں ہے.",
        "login": "داخل ہوں",
        "login-security": "اپنی شناخت کی تصدیق کریں",
        "createacct-benefit-body3": "حالیہ {{PLURAL:$1|مشارکت کنندہ|مشارکت کنندگان}}",
        "badretype": "درج شدہ کلمۂ شناخت اصل سے مطابقت نہیں رکھتا۔",
        "usernameinprogress": "انتظار فرمائیے!<br />\nاس صارف نام سے کھاتہ بننے کا عمل ابھی جاری ہے۔",
-       "userexists": "داخÙ\84 Ú©Ø±Ø¯Û\81 Ø§Ø³Ù\85 ØµØ§Ø±Ù\81 Ù¾Û\81Ù\84Û\92 Ø³Û\92 Ù\85ستعÙ\85Ù\84 Û\81Û\92Û\94\nبراÛ\81Ù\90 Ú©Ø±Ù\85! Ú©Ù\88ئÛ\8c Ø¯Ù\88سرا Ø§Ø³Ù\85 Ù\85Ù\86تخب Ú©Û\8cجئے۔",
+       "userexists": "داخÙ\84 Ú©Ø±Ø¯Û\81 ØµØ§Ø±Ù\81 Ù\86اÙ\85 Ù¾Û\81Ù\84Û\92 Ø³Û\92 Ù\85ستعÙ\85Ù\84 Û\81Û\92Û\94\nبراÛ\81Ù\90 Ù\85Û\81رابÙ\86Û\8c Ú©Ù\88ئÛ\8c Ø¯Ù\88سرا Ù\86اÙ\85 Ù\85Ù\86تخب Ú©Û\8cجÛ\8cے۔",
        "loginerror": "داخلے میں غلطی",
        "createacct-error": "تخلیق کھاتہ میں نقص",
        "createaccounterror": "کھاتہ $1 بنایا نہیں جاسکا",
-       "nocookiesnew": "کھاتۂ صارف بنادیا گیا ہے، لیکن آپ کا داخلہ نہیں ہوا.\nصارفین کے داخلہ کیلئے {{SITENAME}} کوکیز استعمال کرتا ہے.\nآپ کے ہاں کوکیز غیر فعال ہیں.\nبراہِ کرم، انہیں فعال کیجئے، اور پھر اپنے نئے اسمِ صارف اور کلمۂ شناخت کے ساتھ داخل ہوجائیے.",
+       "nocookiesnew": "کھاتۂ صارف بنادیا گیا ہے، لیکن آپ کا داخلہ نہیں ہوا۔\nصارفین کے داخلہ کے لیے {{SITENAME}} کوکیز استعمال کرتا ہے۔\nآپ کے ہاں کوکیز غیر فعال ہیں۔\nبراہِ مہربانی، انہیں فعال کریں، اور پھر اپنے نئے صارف نام اور کلمۂ شناخت (پاسورڈ) کے ساتھ داخل ہو جائیں۔",
        "nocookieslogin": "صارفین کے داخل ہونے کیلئے {{SITENAME}} کوکیز استعمال کرتا ہے.\nآپ کے ہاں کوکیز غیر فعال ہیں.\nانہیں فعال کرنے کے بعد پھر کوشش کیجئے.",
        "nocookiesfornew": "اس صارف نام کا کھاتہ نہیں بن سکا۔ہم اس بات کی وضاحت نہیں کر سکتے (کہ ایسا کیوں ہوا)، براہ مہربانی! آپ\nیقین کر لیں کہ آپ کی کوکیز فعال ہیں، صفحہ تازہ کریں اور پھر کوشش کریں۔",
        "createacct-loginerror": "کھاتہ بن چکا ہے لیکن آپ اس میں خودکار طور پر داخل نہیں ہو سکے۔ براہ کرم [[Special:UserLogin|دستی طور پر داخل ہونے کی کوشش کریں]]۔",
-       "noname": "آپ Ù\86Û\92 ØµØ­Û\8cØ­ Ø§Ø³Ù\85 ØµØ§Ø±Ù\81 Ù\86Û\81Û\8cÚº Ú\86Ù\86ا.",
+       "noname": "آپ Ù\86Û\92 ØµØ­Û\8cØ­ ØµØ§Ø±Ù\81 Ù\86اÙ\85 Ù\86Û\81Û\8cÚº Ú\86Ù\86اÛ\94",
        "loginsuccesstitle": "داخلہ کامیاب",
        "loginsuccess": "'''اب آپ {{SITENAME}} میں بنام \"$1\" داخل ہوچکے ہیں۔'''",
        "nosuchuser": "\"$1\" کے نام سے کوئی صارف موجود نہیں ہے۔\nبراہ کرم ہجوں کو جانچ لیں۔\nنیز اگر آپ چاہیں تو [[Special:CreateAccount|نیا کھاتہ بھی بنا سکتے ہیں]]۔",
        "nosuchusershort": "\"$1\" کے نام سے کوئی صارف موجود نہیں.\nاپنا ہجہ جانچئے.",
-       "nouserspecified": "آپ Ú©Ù\88 Ø§Û\8cÚ© Ø§Ø³Ù\85Ù\90 ØµØ§Ø±Ù\81 Ù\85خصÙ\88ص Ú©Ø±Ù\86ا Û\81Û\92.",
+       "nouserspecified": "آپ Ú©Ù\88 Ø§Û\8cÚ© ØµØ§Ø±Ù\81 Ù\86اÙ\85 Ù\85خصÙ\88ص Ú©Ø±Ù\86ا Û\81Û\92Û\94",
        "login-userblocked": "اِس صارف پر پابندی ہے. داخلِ نوشتہ ہونے کی اجازت نہیں.",
        "wrongpassword": "آپ نے غلط پاس ورڈ یا صارف نام درج کیا ہے۔ براہ مہربانی دوبارہ کوشش کریں۔",
        "wrongpasswordempty": "کلمۂ شناخت ندارد۔ دوبارہ کوشش کریں۔",
-       "passwordtooshort": "آپکا منتخب کردہ پارلفظ مختصر ہے. پارلفظ کم از کم {{PLURAL:$1|1 محرف|$1 محارف}} ہونا چاہئے.",
+       "passwordtooshort": "آپ کا منتخب کردہ پاسورڈ مختصر ہے۔ پاسورڈ کم از کم {{PLURAL:$1|1 حرف|$1 حروف}} پر مشتمل ہونا چاہیے۔",
        "passwordtoolong": "خفیہ رمز (پاس ورڈ) {{PLURAL:$1|1 حرف|$1 حروف}} سے زیادہ طویل نہیں ہو سکتا۔",
        "passwordtoopopular": "متداول پاس ورڈ استعمال نہیں کیا جا سکتا۔ براہ مہربانی آپ کوئی منفرد پاس ورڈ استعمال کریں تاکہ آپ کا کھاتہ محفوظ رہے۔",
-       "password-name-match": "آپکا پارلفظ آپکے اسمِ صارف سے مختلف ہونا چاہئے.",
+       "password-name-match": "آپ کا پاسورڈ آپ کے صارف نام سے مختلف ہونا چاہیے۔",
        "password-login-forbidden": "اس صارف نام یا کلمۂ شناخت (پاسورڈ) کا استعمال ممنوع ہے",
        "mailmypassword": "پاسورڈ تبدیل کریں",
        "passwordremindertitle": "نیا عارضی کلمۂ شناخت برائے {{SITENAME}}",
        "passwordsent": "ایک نیا کلمۂ شناخت \"$1\" کے نام سے بننے والی برقی ڈاک کے پتے کیلیے بھیج دیا گیا ہے۔\nجب وہ موصول ہو جاۓ تو براہ کرم اسکے ذریعے دوبارہ داخل ہوں۔",
        "blocked-mailpassword": "آپ کے آئی پی پتے کی ترمیم کاری پر پابندی لگا دی گئی ہے۔ غلط استعمال سے بچنے کے لیے اس آئی پی پتے سے پاس ورڈ کی بازیابی کی اجازت منسوخ کر دی گئی ہے۔",
        "eauthentsent": "ایک تصدیقی برقی خط نامزد کیے گئے برقی پتہ پر ارسال کردیا گیا ہے۔\nآپ کو موصول ہوئے برقی خط میں ہدایات پر عمل کرکے اس بات کی توثیق کرلیں کہ مذکورہ برقی پتہ آپ کا ہی ہے۔",
-       "throttled-mailpassword": "گزشتÛ\81 {{PLURAL:$1|Ú¯Ú¾Ù\86Ù¹Û\92|$1 Ú¯Ú¾Ù\86Ù¹Ù\88Úº}} Ú©Û\92 Ø¯Ù\88راÙ\86 Ù¾Û\81Ù\84Û\92 Ø³Û\92 Û\81Û\8c Ù¾Ø§Ø±Ù\84Ù\81ظ (پاسÙ\88رÚ\88) Ú©Û\8c ØªØ¨Ø¯Û\8cÙ\84Û\8c Ú©Û\92 Ù\84Û\8cÛ\92 Ø¨Ø±Ù\82Û\8c Ø®Ø· Ø¨Ú¾Û\8cجا Ú¯Ù\8aا Û\81Û\92Û\94\nÙ\86اجائز Ø§Ø³ØªØ¹Ù\85اÙ\84 Ú©Û\92 Ø³Ø¯Ù\91باب Ú©Û\8cÙ\84ئÛ\92Ø\8c {{PLURAL:$1|Ú¯Ú¾Ù\86Ù¹Û\81|$1 Ú¯Ú¾Ù\86Ù¹Ù\88Úº}} Ú©Û\92 Ø¯Ù\88راÙ\86 ØµØ±Ù\81 Ø§Û\8cÚ© Ø¨Ø±Ù\82Û\8c Ø®Ø· Ø¨Ú¾Û\8cجا Ø¬Ø§سکتا ہے۔",
+       "throttled-mailpassword": "گزشتÛ\81 {{PLURAL:$1|Ú¯Ú¾Ù\86Ù¹Û\92|$1 Ú¯Ú¾Ù\86Ù¹Ù\88Úº}} Ú©Û\92 Ø¯Ù\88راÙ\86 Ù¾Û\81Ù\84Û\92 Ø³Û\92 Û\81Û\8c Ù¾Ø§Ø³Ù\88رÚ\88 Ú©Û\8c ØªØ¨Ø¯Û\8cÙ\84Û\8c Ú©Û\92 Ù\84Û\8cÛ\92 Ø¨Ø±Ù\82Û\8c Ø®Ø· Ø¨Ú¾Û\8cجا Ú¯Ù\8aا Û\81Û\92Û\94\nÙ\86اجائز Ø§Ø³ØªØ¹Ù\85اÙ\84 Ú©Û\92 Ø³Ø¯Ù\91باب Ú©Û\92 Ù\84Û\8cÛ\92Ø\8c {{PLURAL:$1|Ú¯Ú¾Ù\86Ù¹Û\81|$1 Ú¯Ú¾Ù\86Ù¹Ù\88Úº}} Ú©Û\92 Ø¯Ù\88راÙ\86 ØµØ±Ù\81 Ø§Û\8cÚ© Ø¨Ø±Ù\82Û\8c Ø®Ø· Ø¨Ú¾Û\8cجا Ø¬Ø§ سکتا ہے۔",
        "mailerror": "مسلہ دوران ترسیل خط:$1",
        "acct_creation_throttle_hit": "آپکی آئی پی کے ذریعے اِس ویکی پر آنے والے صارفین نے پچھلے $2 میں {{PLURAL:$1|1 کھاتہ بنایا ہے|$1 کھاتے بنائے ہیں}} جو اس مدت کے لیے کافی ہیں۔\nلہٰذا آپ کی آئی پی استعمال کرنے والے صارفین اِس وقت مزید کھاتے نہیں بنا سکتے۔",
        "emailauthenticated": "آپ کے برقی ڈاک پتہ کی تصدیق مورخہ $2 بوقت $3 بجے ہوئی۔",
        "accountcreated": "تخلیقِ کھاتہ",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|تبادلۂ خیال]]) کا صارف کھاتہ بن چکا ہے۔",
        "createaccount-title": "کھاتہ سازی برائے {{SITENAME}}",
-       "createaccount-text": "کسی نے {{SITENAME}} ($4) پر \"$2\" کے نام سے اور \"$3\" پارلفظ کے ساتھ آپ کا برقی پتہ استعمال کرتے ہوئے کھاتہ بنایا ہے.\nآپ کو چاہئے کہ ابھی داخلِ نوشتہ ہوکر اپنا پارلفظ تبدیل کردیں.\n\nاگر یہ کھاتہ غلطی سے بنا تھا تو آپ یہ پیغام نظرانداز کرسکتے ہیں.",
+       "createaccount-text": "کسی نے {{SITENAME}} ($4) پر «$2» کے نام سے اور \"$3\" پاسورڈ کے ساتھ آپ کا برقی پتہ استعمال کرتے ہوئے کھاتہ بنایا ہے۔\nآپ کو چاہیے کہ ابھی لاگ ان ہو کر اپنا پاسورڈ تبدیل کر دیں۔\n\nاگر یہ کھاتہ غلطی سے بنا ہے، تو آپ یہ پیغام نظر انداز کر دیں۔",
        "login-throttled": "آپ نے حال ہی میں متعدد مرتبہ لاگ ان ہونے کی کوشش کی ہے۔\nدوبارہ کوشش کرنے سے پہلے $1 انتظار فرمائیے۔",
        "login-abort-generic": "لاگ ان ناکام - منسوخ شد",
        "login-migrated-generic": "آپ کا کھاتہ منتقل کر دیا گیا، اب اس ویکی پر آپ کا صارف نام موجود نہیں۔",
        "user-mail-no-addy": "برقی ڈاک بھیجنے کی کوشش بغیر برقی ڈاک پتہ",
        "user-mail-no-body": "خالی یا بہت ہی مختصر برقی خط بھیجنے کی کوشش",
        "changepassword": "کلمۂ شناخت تبدیل کریں",
-       "resetpass_announce": "آپ ایک برقی ارسال کردہ عارضی رمز (کوڈ) کے ساتھ داخل ہوئے ہیں۔\nداخلِ نوشتہ کے عمل کو مکمل کرنے کیلئے آپ کو یہاں نیا پارلفظ (پاسورڈ) متعین کرنا ہوگا۔",
-       "resetpass_header": "کھاتÛ\81 Ú©Ø§ Ù¾Ø§Ø±Ù\84Ù\81ظ تبدیل کریں",
+       "resetpass_announce": "لاگ ان کے عمل کو مکمل کرنے کے لیے آپ کو نیا پاسورڈ متعین کرنا ہو گا۔",
+       "resetpass_header": "کھاتÛ\81 Ú©Ø§ Ù¾Ø§Ø³Ù\88رÚ\88 تبدیل کریں",
        "oldpassword": "پرانا کلمۂ شناخت:",
        "newpassword": "نیا کلمۂ شناخت",
        "retypenew": "نیا کلمۂ شناخت دوبارہ درج کریں:",
-       "resetpass_submit": "پارÙ\84Ù\81ظ Ø¨Ù\86اؤ Ø§Ù\88ر Ø¯Ø§Ø®Ù\84 Û\81Ù\88جاؤ",
+       "resetpass_submit": "پاسÙ\88رÚ\88 Ø¨Ù\86ائÛ\8cÚº Ø§Ù\88ر Ø¯Ø§Ø®Ù\84 Û\81Ù\88Úº",
        "changepassword-success": "آپ کا پاس ورڈ تبدیل کر دیا گیا!",
        "changepassword-throttled": "آپ نے حال ہی میں متعدد مرتبہ داخل ہونے کی کوشش کی ہے۔\nدوبارہ کوشش کرنے سے پہلے $1 انتظار کریں۔",
        "botpasswords": "روبہ پاس ورڈ",
        "botpasswords-restriction-failed": "روبہ کے پاس ورڈ کی پابندیاں اس لاگ ان سے مانع ہیں۔",
        "botpasswords-invalid-name": "درج کردہ صارف نام میں روبہ کے پاس ورڈ کا فاصل لفظ موجود نہیں ہے (\"$1\")۔",
        "botpasswords-not-exist": "صارف \"$1\" کے پاس \"$2\" کے نام سے روبہ کا پاس ورڈ نہیں ہے۔",
-       "resetpass_forbidden": "پارÙ\84Ù\81ظ ØªØ¨Ø¯Û\8cÙ\84 Ù\86Û\81Û\8cÚº Û\81Ù\88سکتا",
+       "resetpass_forbidden": "پاسÙ\88رÚ\88 ØªØ¨Ø¯Û\8cÙ\84 Ù\86Û\81Û\8cÚº Û\81Ù\88 سکتا",
        "resetpass_forbidden-reason": "پاس ورڈ تبدیل نہیں کیا جا سکتا: $1",
        "resetpass-no-info": "اِس صفحہ تک براہِ راست رسائی کیلئے آپ کو داخلِ نوشتہ ہونا پڑے گا.",
-       "resetpass-submit-loggedin": "پارÙ\84Ù\81ظ Ú©Û\8c ØªØ¨Ø¯Û\8cÙ\84Û\8c",
+       "resetpass-submit-loggedin": "پاسÙ\88رÚ\88 ØªØ¨Ø¯Û\8cÙ\84 Ú©Ø±Û\8cÚº",
        "resetpass-submit-cancel": "منسوخ",
        "resetpass-wrong-oldpass": "عارضی یا موجودہ پاس ورڈ نادرست ہے۔\nشاید آپ نے پہلے ہی اپنا پاس ورڈ تبدیل کر لیا ہے یا نئے عارضی پاس ورڈ کی درخواست کر چکے ہیں۔",
        "resetpass-recycled": "براہ کرم اپنے موجودہ پاس ورڈ سے مختلف پاس ورڈ رکھیں۔",
-       "resetpass-temp-emailed": "آپ Ø¹Ø§Ø±Ø¶Û\8c Ø¨Ø±Ù\82Û\8c Ø®Ø· Ø³Û\92 Ø¨Ú¾Û\8cجÛ\92 Ú¯Ø¦Û\92 Ú©Ù\88Ú\88 Ø³Û\92 Ù\84اگ Ø§Ù\86 Û\81Û\8cÚº\nÙ\85Ú©Ù\85Ù\84 Ø·Ù\88ر Ù¾Ø± Ù\84اگ Ø§Ù\86 Û\81Ù\88Ù\86Û\92 Ú©Û\92 Ù\84Û\8cÛ\92 Ø¢Ù¾ Ú©Ù\88 Ù\86Û\8cا Ù¾Ø§Ø³Ù\88رÚ\88 Ø³Û\8cÙ¹ Ú©Ø±Ù\86ا Ù¾Ú\91Û\92 Ú¯Ø§",
-       "resetpass-temp-password": "عارضÛ\8c Ù¾Ø§Ø±Ù\84Ù\81ظ:",
+       "resetpass-temp-emailed": "آپ Ø§Û\8cÚ© Ø¨Ø±Ù\82Û\8c Ø§Ø±Ø³Ø§Ù\84 Ú©Ø±Ø¯Û\81 Ø¹Ø§Ø±Ø¶Û\8c Ú©Ù\88Ú\88 Ú©Û\92 Ø³Ø§ØªÚ¾ Ø¯Ø§Ø®Ù\84 Û\81Ù\88ئÛ\92 Û\81Û\8cÚºÛ\94\nÙ\84اگ Ø§Ù\86 Ú©Û\92 Ø¹Ù\85Ù\84 Ú©Ù\88 Ù\85Ú©Ù\85Ù\84 Ú©Ø±Ù\86Û\92 Ú©Û\92 Ù\84Û\8cÛ\92 Ø¢Ù¾ Ú©Ù\88 Û\8cÛ\81اں Ù\86Û\8cا Ù¾Ø§Ø³Ù\88رÚ\88 Ù\85تعÛ\8cÙ\86 (سÛ\8cÙ¹) Ú©Ø±Ù\86ا Û\81Ù\88 Ú¯Ø§Û\94",
+       "resetpass-temp-password": "عارضÛ\8c Ù¾Ø§Ø³Ù\88رÚ\88:",
        "resetpass-abort-generic": "کسی توسیع نے پاس ورڈ کی تبدیلی کو منسوخ کر دیا ہے۔",
        "resetpass-expired": "آپ کے پاس ورد کی مدت ختم ہو چکی ہے۔ داخل ہونے کے لیے براہ کرم نیا پاس ورڈ بنائیں۔",
        "resetpass-expired-soft": "آپ کے پاس ورڈ کی مدت ختم ہو چکی ہے، لہذا اسے دوبارہ بنانے کی ضرورت ہے۔\nبراہ کرم نیا پاس ورڈ بنائیں یا اگر مستقبل میں اس کی ترتیب نو مقصود ہو تو «{{int:authprovider-resetpass-skip-label}}» پر کلک کریں۔",
        "passwordreset-text-many": "{{PLURAL:$1|برقی خط کے ذریعہ عارضی پاس ورڈ حاصل کرنے کے لیے کسی ایک خانے کو پُر کریں۔}}",
        "passwordreset-disabled": "اس ویکی پر پاس ورڈ کی ترتیب نو کی سہولت فعال نہیں ہے۔",
        "passwordreset-emaildisabled": "اس ویکی پر برقی خط کی سہولت غیر فعال ہیں۔",
-       "passwordreset-username": "اسÙ\85Ù\90 ØµØ§Ø±Ù\81:",
+       "passwordreset-username": "صارÙ\81 Ù\86اÙ\85:",
        "passwordreset-domain": "ساحہ:",
        "passwordreset-email": "برقی ڈاک پتہ:",
        "passwordreset-emailtitle": "{{SITENAME}} کھاتہ کی تفصیلات",
        "permissionserrorstext": "درج ذیل {{PLURAL:$1|وجہ|وجوہات}} کی بنا پر آپ کو ایسا کرنے کی اجازت نہیں ہے:",
        "permissionserrorstext-withaction": "درج ذیل {{PLURAL:$1|وجہ|وجوہات}} کی بنا پر آپ کو $2  کی اجازت نہیں ہے:",
        "contentmodelediterror": "آپ اس نسخے میں ترمیم نہیں کر سکتے کیونکہ اس کے مواد کا ماڈل ‌‌<code>$1</code> ہے جو اس صفحہ کے مواد کے موجودہ ماڈل <code>$2</code> سے مختلف ہے۔",
-       "recreate-moveddeleted-warn": "''' انتباہ: آپ ایک گزشتہ حذف شدہ صفحہ دوبارہ تخلیق کررہے ہیں. '''\n\nآپ کو اِس بات پر غور کرنا چاہئے کہ آیا اِس صفحہ کی تدوین جاری رکھنا موزوں ہے یا نہیں.\nصفحہ کا نوشتۂ حذف شدگی و منتقلی یہاں سہولت کی خاطر مہیّا کیا جارہا ہے:",
+       "recreate-moveddeleted-warn": "<strong>انتباہ: آپ ایک گزشتہ حذف شدہ صفحہ دوبارہ تخلیق کر رہے ہیں۔</strong>\n\nآپ کو اِس بات پر غور کرنا چاہیے کہ آیا اِس صفحہ کی تدوین جاری رکھنا موزوں ہے یا نہیں۔\nصفحہ کا نوشتۂ حذف شدگی و منتقلی یہاں سہولت کی خاطر مہیّا کیا جا رہا ہے:",
        "moveddeleted-notice": "اس صفحہ کو حذف کر دیا گیا ہے۔\nحوالہ کے لیے ذیل میں اس صفحہ کا نوشتہ حذف شدگی اور نوشتہ منتقلی درج ہے۔",
        "moveddeleted-notice-recent": "معذرت، اس صفحہ کو حال ہی میں حذف کیا گیا ہے (گزشتہ چوبیس گھنٹوں میں)۔\nحوالہ کے لیے ذیل میں اس صفحہ کا نوشتہ حذف اور نوشتہ منتقلی موجود ہے۔",
        "log-fulllog": "پورا نوشتہ دیکھیے",
        "revdelete-hide-image": "فائل کے مشمولات چھپائیں",
        "revdelete-hide-name": "ہدف اور پیرامیٹرز کو چھپائیں",
        "revdelete-hide-comment": "ترمیمی تبصرہ چھپاؤ",
-       "revdelete-hide-user": "ترمیم کار کا اسمِ صارف / آئی.پی پتہ چُھپاؤ",
+       "revdelete-hide-user": "ترمیم کنندہ کا صارف نام/آئی پی پتہ چھپائیں",
        "revdelete-hide-restricted": "منتظمین اور دیگر صارفین سے معلومات کو پوشیدہ کریں",
        "revdelete-radio-same": "(تبدیل مت کرو)",
        "revdelete-radio-set": "پوشیدہ",
        "yournick": "شخصی دستخط:",
        "prefs-help-signature": "تبادلۂ خیال صفحات پر تبصرہ تحریر کرنے کے بعد یہ \"<nowiki>~~~~</nowiki>\" علامتیں درج کرنی چاہئیں، یہ علامتیں از خود آپ کے دستخط اور وقت میں تبدیل ہو جائیں گی۔",
        "badsig": "ناقص خام دستخط.\nHTML tags جانچئے.",
-       "badsiglength": "آپ کا دستخط کافی طویل ہے.\nیہ $1 {{PLURAL:$1|حرف|حروف}} سے زیادہ نہیں ہونا چاہئے.",
+       "badsiglength": "آپ کا دستخط کافی طویل ہے۔\nیہ $1 {{PLURAL:$1|حرف|حروف}} سے زیادہ نہیں ہونا چاہیے۔",
        "yourgender": "جنس:",
        "gender-unknown": "اگر ممکن ہو تو آپ کے تذکرہ کے وقت سافٹ ویئر غیر جانبدار جنسی الفاظ استعمال کرے گا",
        "gender-male": "مرد",
        "prefs-tabs-navigation-hint": "نکتہ: مختلف خانوں میں جانے کے لیے آپ دائیں اور بائیں کی جہت نما کلیدیں استعمال کر سکتے ہیں۔",
        "userrights": "حقوق صارف",
        "userrights-lookup-user": "صارف کا انتخاب کریں",
-       "userrights-user-editname": "کوئی اسم‌صارف داخل کیجئے:",
+       "userrights-user-editname": "صارف نام درج کیجیے:",
        "editusergroup": "حلقہ ہائے صارف دکھائیں",
        "editinguser": "{{GENDER:$1|صارف}} <strong>[[User:$1|$1]]</strong> $2 کے اختیارات میں تبدیلی",
        "viewinguserrights": "{{GENDER:$1|صارف}} <strong>[[User:$1|$1]]</strong> $2 کے اختیارات میں تبدیلی",
        "ipaddressorusername": "آئی پی پتہ یا صارف نام:",
        "ipbexpiry": "وقت اختتام:",
        "ipbreason": "وجہ:",
-       "ipbreason-dropdown": "* عمومی وجوہات پابندی\n** غلط معلومات کا اندراج\n** صفحات سے متن کا مٹانا\n** بیرونی روابط میں بے کار روابط کی فاضل کاری\n** صفحات میں لغو چیزوں کا اندراج\n** بدتمیزی/بداخلاقی\n** متعدد کھاتوں کا استعمال\n** ناقابلِ قبول اسمِ صارف",
+       "ipbreason-dropdown": "* پابندی کی عام وجوہات\n** غلط معلومات کا اندراج\n** صفحات سے متن کا مٹانا\n** بیرونی روابط میں بے کار روابط کی فاضل کاری\n** صفحات میں لغو چیزوں کا اندراج\n** بدتمیزی/بداخلاقی\n** متعدد کھاتوں کا استعمال\n** ناقابلِ قبول صارف نام",
        "ipb-hardblock": "اس آئی پی پتے سے داخل شدہ صارفین کو ترمیم کاری سے باز رکھیں",
        "ipbcreateaccount": "کھاتہ سازی سے باز رکھیں",
        "ipbemailban": "برقی خط بھیجنے سے باز رکھیں",
        "markedaspatrollederrornotify": "بطور مراجعت نشان زد نہیں کیا جا سکا۔",
        "patrol-log-page": "نوشتہ مراجعت",
        "patrol-log-header": "ذیل میں مراجعت شدہ ترامیم کا نوشتہ ہے۔",
-       "log-show-hide-patrol": "$1 نوشتہ مراجعت",
-       "log-show-hide-tag": "$1 نوشتہ ٹیگ",
        "confirm-markpatrolled-button": "ٹھیک ہے",
        "confirm-markpatrolled-top": "$2 کے نسخہ $3 کو بطور مراجعت شدہ نشان زد کریں؟",
        "deletedrevision": "حذف شدہ پرانی ترمیم $1۔",
index 79664ec..8a52c64 100644 (file)
        "markedaspatrollederrornotify": "Eror durante ła verifega.",
        "patrol-log-page": "Modifiche verificàe",
        "patrol-log-header": "Qua de sèvito xe elencàe le verifiche de le modifiche.",
-       "log-show-hide-patrol": "$1 el registro dei canbiamenti verificài",
        "deletedrevision": "Vecia version scancełà $1",
        "filedeleteerror-short": "Eror ne la scancelazion del file: $1",
        "filedeleteerror-long": "Se gà verificà dei eror nel tentativo de scancelar el file:\n\n$1",
index 22fb275..b55152f 100644 (file)
        "markedaspatrollederror-noautopatrol": "Teile ei sa znamoita ičetoi toižetusid kut patruliruidud.",
        "patrol-log-page": "Patruliruindan aigkirj",
        "patrol-log-header": "Nece om patruliruidud versijoiden aiglehtez.",
-       "log-show-hide-patrol": "$1 patruliruindan aigkirj",
        "deletedrevision": "$1-lehtpolen vanh versii om čutud",
        "filedeleteerror-short": "Failan čudandan petuz: $1",
        "filedeleteerror-long": "Necen failan heitmižen aigan ozaižihe petused:\n\n$1",
index 122c6df..77e9851 100644 (file)
        "markedaspatrollederrornotify": "Đánh dấu tuần tra bị thất bại.",
        "patrol-log-page": "Nhật trình tuần tra",
        "patrol-log-header": "Đây là nhật trình tuần tra phiên bản.",
-       "log-show-hide-patrol": "$1 nhật trình tuần tra",
-       "log-show-hide-tag": "Nhật trình đánh dấu $1",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Đánh dấu tuần tra phiên bản $3 của $2?",
        "deletedrevision": "Đã xóa phiên bản cũ $1",
index 39b4c38..60d1098 100644 (file)
        "markedaspatrollederror-noautopatrol": "No dalol zepön votükamis lönik ola.",
        "patrol-log-page": "Jenotalised zepamas",
        "patrol-log-header": "Is lisedons revids pezepöl.",
-       "log-show-hide-patrol": "Jenotalised Zepamas: $1",
        "deletedrevision": "Fomam büik: $1 pemoükon.",
        "filedeleteerror-short": "Pöl pö moükam ragiva: $1",
        "filedeleteerror-long": "Pöls petuvons dü moükam ragiva:\n\n$1",
index 7f670e1..2d5c8ad 100644 (file)
        "markedaspatrollederror": "Diri nakakamarka komo ginpatrolya na",
        "patrol-log-page": "Talaan han pagpatrolya",
        "patrol-log-header": "Ini in uska talaan hin mga ginpatrolya nga mga rebisyon.",
-       "log-show-hide-patrol": "$1 talaan hin pagpatrolya",
        "deletedrevision": "Ginpara an daan nga rebisyon $1",
        "filedeleteerror-short": "Nagsayop ha pagpara han paypay: $1",
        "filedeleteerror-long": "Mga sayop nga ginengkwentro samtang nagpapara hin paypay:\n\n$1",
index 5f5df18..4d3ec30 100644 (file)
        "markedaspatrollederrornotify": "מארקירן ווי קאנטראלירט דורכגעפאלן.",
        "patrol-log-page": "פאטראלירן לאג-בוך",
        "patrol-log-header": "דאס איז א לאג-בוך פון פאַטראלירטע רעוויזיעס.",
-       "log-show-hide-patrol": "$1 פאַטראלירן לאג-בוך",
-       "log-show-hide-tag": "$1 טאג־לאגבוך",
        "confirm-markpatrolled-button": "יאָ",
        "confirm-markpatrolled-top": "מארקירן $3 פון $2 ווי קאנטראלירט?",
        "deletedrevision": "אויסגעמעקט אלטע ווערסיע $1.",
index 823bfc7..7ad682b 100644 (file)
@@ -9,7 +9,8 @@
                        "Macofe",
                        "Matma Rex",
                        "Wikicology",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Olaniyan Olushola"
                ]
        },
        "tog-underline": "Ìfàlàsábẹ́ àwọn àjápọ̀:",
        "recentchanges": "Àwọn àtúnṣe tuntun",
        "recentchanges-legend": "Àwọn àṣàyàn fún àtúnṣe tuntun",
        "recentchanges-summary": "Ẹ tẹ̀ lé àwọn àtúnṣe tuntun sí wiki lórí ojúewé yìí.",
+       "recentchanges-noresult": "Kò sì áwọ́n iyipada ni akókò yì ti o ba àwon ìlànà yí mu.",
        "recentchanges-feed-description": "Ẹ tẹ̀ lé àwọn àtúnṣe àìpẹ́ ọjọ́ sí wiki nínú àkótán feed yìí.",
        "recentchanges-label-newpage": "Àtúnṣe yìí dá ojúewé tuntun",
        "recentchanges-label-minor": "Àtùnṣe kékeré nìyí",
        "markedaspatrollederrornotify": "Ìkùnà ìṣàmìsí bíi sísọ́.",
        "patrol-log-page": "Àkọọ́lẹ̀ ìsọ́",
        "patrol-log-header": "Àkọọ́lẹ̀ àwọn àtúnyẹ̀wò sísọ́ nì yí.",
-       "log-show-hide-patrol": "$1 àkọọ́lẹ̀ ìsọ́",
        "confirm-markpatrolled-button": "OK",
        "deletedrevision": "Àtúnyẹ̀wò àtijọ́ píparẹ́ $1",
        "filedeleteerror-short": "Àsìṣe ìparẹ́ fáílì: $1",
index b88ce6d..83c33d3 100644 (file)
        "markedaspatrollederrornotify": "標做睇過失敗。",
        "patrol-log-page": "巡查日誌",
        "patrol-log-header": "呢個係已經巡查過嘅日誌。",
-       "log-show-hide-patrol": "$1巡查紀錄",
        "confirm-markpatrolled-button": "好",
        "deletedrevision": "刪除咗$1嘅舊有修訂",
        "filedeleteerror-short": "刪除檔案出錯: $1",
index 37c3285..601e427 100644 (file)
        "pool-errorunknown": "ⵜⴰⵣⴳⴰⵍⵜ ⵜⴰⵔⵓⵙⵙⵉⵏⵜ",
        "aboutsite": "ⵖⴼ {{SITENAME}}",
        "aboutpage": "Project:ⵖⴼ",
+       "copyright": "ⵜⵓⵎⴰⵢⵜ ⵜⵍⵍⴰ ⴷⴷⵓ ⵜⵓⵔⴰⴳⵜ $1 ⵖⴰⵙ ⵎⴰ ⵉⵜⵜⵡⴰⴱⴷⴰⵔ ⵓⵏⵎⴳⴰⵍⵏⵏⵙ.",
        "copyrightpage": "{{ns:project}}:ⵉⵣⵔⴼⴰⵏ ⵏ ⵓⵙⵏⵖⵍ",
        "currentevents": "ⵜⵉⵎⵙⴰⵔⵉⵏ ⵜⵉⵎⵉⵔⴰⵏⵉⵏ",
        "currentevents-url": "Project:ⵜⵉⵎⵙⴰⵔⵉⵏ ⵜⵉⵎⵉⵔⴰⵏⵉⵏ",
        "createaccount": "ⵔⵥⵎ ⴽⵔⴰ ⵏ ⵓⵎⵉⴹⴰⵏ",
        "userlogin-resetpassword-link": "ⵜⴻⵜⵜⵓⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⵏⵎ/ⴽ?",
        "userlogin-helplink2": "ⵜⵉⵡⵉⵙⵉ ⴳ ⵓⴽⵛⵛⵓⵎ",
+       "createacct-emailrequired": "ⵉⵎⴰⵢⵍ",
        "createacct-emailoptional": "ⵉⵎⴰⵢⵍ (ⴰⵔⵓⵛⵛⵉⵍ)",
        "createacct-email-ph": "ⵙⵙⴽⵛⵎ ⴰⵏⵙⴰ ⵉⵎⴰⵢⵍ ⵏⵏⴽ",
+       "createacct-another-email-ph": "ⵙⵙⴽⵛⵎ ⴰⵏⵙⴰ ⵉⵎⴰⵢⵍ ⵏⵏⴽ",
        "createacct-realname": "ⵉⵙⵎ ⵏ ⵜⵉⴷⵜ (‍ⵎ ⵜⵔⵉⵜ)",
        "createacct-reason": "ⵜⴰⵎⵏⵜⵉⵍⵜ",
        "createacct-submit": "ⵔⵥⵎ ⴰⵎⵉⴹⴰⵏ {{GENDER:|ⵏⵏⴽ|ⵏⵏⵎ}}",
        "accmailtitle": "ⵜⴰⴳⵓⵔⵉ ⵓⵣⵔⴰⵢ ⵜⴻⵜⵜⵡⴰⵣⵏ",
        "newarticle": "(ⴰⵎⴰⵢⵏⵓ)",
        "newarticletext": "ⵜⴹⴼⴰⵔⴷ ⵢⴰⵏ ⵓⵙⵖⵏ ⵖⵔ ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⵏⵏⴰ ⵓⵔ ⵜⴰ ⵉⵍⵍⵉⵏ. \nⴰⴼⴰⴷ ⴰⴷ ⵜⵙⵏⵓⵍⴼⵓⴷ ⵜⴰⵙⵏⴰ, ⵙⵙⵏⵜⵉ ⵜⵉⵔⵔⴰ ⴳ ⵓⴼⵏⵉⵇ ⴳ ⵉⵣⴷⴷⴰⵔ (ⵥⵔ [$1 ⵜⴰⵙⵏⴰ ⵏ ⵜⵡⵉⵙⵉ] ⵉ ⵡⵓⴳⴳⴰⵔ ⵏ ⵉⵏⵖⵎⵉⵙⵏ). \nⵎⴽ ⵜⵍⵍⵉⴷ ⴷⴰ ⵙ ⵓⵣⴳⴰⵍ, ⴰⴽⵍ ⵖⴼ <strong>ⴰⵖⵓⵍ</strong> ⴳ ⵓⵙⴰⵔⴰ ⵏⵏⴽ.",
+       "anontalkpagetext": "----\n<em>ⵜⵍⵍⵉⴷ ⴳ ⵜⴰⵙⵏ ⵏ ⵓⵎⵙⴰⵡⴰⵍ ⵏ ⵢⴰⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵡⴰⵔⵉⵙⵎ ⵏⵏⴰ ⵜⴰ ⵓⵔ ⵉⵙⴽⵉⵔⵏ ⴰⵎⵉⴹⴰⵏ ⵏⵖ ⵏⵏⴰ ⵜ ⵓⵔ ⵉⵙⵙⵎⵔⵉⵙⵏ</em>.\nⴰⵢⴰ ⴰ ⵖⴼ ⵉⴼⵓⴽⴽ ⴰⴷ ⵏⵙⵙⵎⵔⵙ ⵜⴰⵏⵙⴰ ⵏⵏⵙ IP ⴼⴰⴷ ⴰⴷ ⵜ ⵏⵙⵎⴰⴳⵉ.\nⵢⴰⵜ ⵜⴰⵏⵙⴰ IP ⵥⴹⴰⵔⵏ ⴰⴷ ⵜⵜ ⵙⵙⵓⵔⵏ ⵎⵏⵏⴰⵡ ⵏ ⵉⵏⵙⵙⵎⵔⵙⵏ.\nⵎⴽ ⵜⴳⵉⴷ ⵢⴰⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵡⴰⵔⵉⵙⵎ ⴷ ⴽ ⵜⵖⴹⴼⴷ ⵎⴰⵙ ⴽ ⵡⴰⵜⵙⵏ ⴽⵔⴰ ⵏ ⵉⵅⴼⴰⵡⴰⵍⵏ ⵓⵔ ⵙⵉⴽ ⵉⵥⵍⵉⵏ, ⵜⵓⴼⵉⴷ ⴰⴷ  [[Special:CreateAccount|ⵙⴽⵔ ⵢⴰⵏ ⵓⵎⵉⴹⴰⵏ]] ⵏⵖ ⴷ [[Special:UserLogin|ⴽⵛⵎ]] ⴱⴰⵔ ⴰⴷ ⵜⴰⵏⴼⴷ ⵉ ⴽⵔⴰⵢⴳⴰⵜ ⴰⵎⵔⴽⵙ ⴷ ⵉⵎⴷⵔⴰⵡⵏ ⵢⴰⴹⵏ.",
        "noarticletext": "ⵓⵔ ⵉⵍⵍⵉ ⴽⵔⴰ ⵏ ⵓⴹⵔⵉⵙ ⴳ ⵜⴰⵙⵏⴰ ⴰⴷ ⵖⵉⵍⴰ. \nⵜⵣⵎⵔⴷ ⴰⴷ [[Special:Search/{{PAGENAME}}|ⵜⵔⵣⵓⴷ ⵖⴼ ⵓⵣⵡⵍ ⵏⵏⵙ]] ⴳ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵢⴰⴹⵏ, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ⵔⵣⵓ ⵖⴼ logs ⵖⵔⵙ ⵉⵇⵇⵏⴻⵏ],\nⵏⵖ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ⵙⵏⵓⵍⴼⵓ ⵜⴰⵙⵏⴰ]</span>.",
        "noarticletext-nopermission": "ⴷⵖⵉ ⵓⵔ ⵉⵍⵍⵉ ⴰⵡⴷ ⴽⵔⴰ ⵏ ⵓⴹⵔⵉⵚ ⴳ ⵜⴰⵙⵏⴰ ⴰ.\nⵜⵣⵎⵔⴷ ⴰⴷ [[Special:Search/{{PAGENAME}}|ⵜⵔⵣⵓⴷ ⵖⴼ ⵓⵣⵡⵍ ⵏⵏⵙ]] ⴳ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵢⴰⴹⵏⵉⵏ, ⵏⵖ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ⵔⵣⵓ ⵖⴼ ⵉⵣⵎⵎⴻⵎⵏ ⵉⵣⴷⵉⵏ]</span>, ⵎⴰⵛⴰ ⵓⵔ ⴷⴰⵔⴽ ⵜⵓⵔⴰⴳⵜ ⴰⴷ ⵜⵙⵏⵓⵍⴼⵓⴷ ⵜⴰⵙⵏⴰ ⴰ.",
        "userpage-userdoesnotexist-view": "ⴰⵎⵉⴹⴰⵏ ⵏ ⵓⵎⵙⵙⵎⵔⵙ $1 ⵓⵔ ⵉⵜⵜⵓⵣⵎⵎⴻⵎ.",
        "filehist-revert": "ⵔⴰⵔ ⴷ",
        "filehist-current": "ⴰⵎⵉⵔⴰⵏ",
        "filehist-datetime": "ⴰⵙⴰⴽⵓⴷ/ⴰⴽⵓⴷ",
-       "filehist-thumb": "âµ\9câ´°âµ\9bâµ\8fⵢⴰâµ\8dâµ\9c",
+       "filehist-thumb": "âµ\9cⴰⵡâµ\8dâ´°â´¼âµ\9c âµ\8eⵥⵥâµ\89âµ¢âµ\8f",
        "filehist-thumbtext": "ⵜⴰⵛⵏⵢⴰⵍⵜ ⵏ ⵜⵓⵏⵖⵉⵍⵜ ⴳ $1",
        "filehist-nothumb": "ⵓⵔ ⵉⵍⵍⵉ ⵓⵙⵎⵥⵉⵢ",
        "filehist-user": "ⴰⵙⵎⵔⴰⵙ",
        "filehist-comment": "ⴰⵖⴼⴰⵡⴰⵍ",
        "imagelinks": "ⴰⵙⵎⵔⵙ ⵏ ⵓⴼⴰⵢⵍⵓ",
        "linkstoimage": "{{PLURAL:$1|ⵉⵣⴷⴰⵢⵏ ⵏ ⵜⵙⵏⴰ|$1 ⴰⵣⴷⴰⵢ ⵏ ⵜⵙⵏⴰ}} ⵖⵔ ⵓⴼⴰⵢⵍⵓ ⴰⴷ:",
+       "linkstoimage-more": "ⵓⴳⴳⴰⵔ ⵏ {{PLURAL:$1|ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⴰⵢⴷ ⵉⵙⵙⵎⵔⴰⵙⵏ| $1 ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⵢⴷ ⵉⵙⵙⵎⵔⴰⵙⵏ}} ⴰⴼⴰⵢⵍⵓ ⴰⴷ.\nⵜⵙⴽⴰⵏ ⵜⵍⴳⴰⵎⵜ ⴰⴷ ⵖⴰⵙ {{PLURAL:$1|ⵜⴰⵙⵏⴰ ⵜⴰⵎⵣⵡⴰⵔⵓⵜ  ⵉⵙⵙⵎⵔⴰⵙⵏ $1 ⵜⴰⵙⵏⵉⵡⵉⵏ ⵜⵉⵎⵣⵡⴰⵔⴰ ⵉⵙⵙⵎⵔⴰⵙⵏ}} ⴰⴼⴰⵢⵍⵓ ⴰⴷ.\nⵜⵍⵍⴰ ⵢⴰⵜ [[Special:WhatLinksHere/$2|ⵜⴰⵍⴳⴰⵎⵜ ⵉⵎⴷⵏ]].",
        "nolinkstoimage": "ⵓⵔ ⵍⵍⵉⵏⵜ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏⵏⴰ ⵉⵇⵇⵏⴻⵏ ⵖⵔ ⵓⴼⴰⵢⵍⵓ ⴰ.",
        "linkstoimage-redirect": "$1 (ⴰⵙⵡⴰⵍⴰ ⵏ ⵓⴼⴰⵢⵍⵓ) $2",
        "sharedupload-desc-here": "ⴰⵙⴷⴰⵡ ⴰⴷ ⵙⴳ $1 ⵉⵥⴹⴰⵔ ⴰ ⵉⵜⵜⵡⴰⵙⵎⵔⵙ ⴳ ⵉⵙⵏⵜⴰⵢⵏ ⵢⴰⴹⵏ.\nⴰⵙⵏⵓⵎⵎⵍ ⵏⵙ ⴳ [$2 ⵜⴰⵙⵏⴰ ⵏⵙ ⵏ ⵓⵙⵏⵓⵎⵎⵍ] ⵜⵡⴰⵙⵎⴰⵍ ⵙⴰⴷⵓ.",
        "speciallogtitlelabel": "ⴰⵙⴰⵖⴷ (ⴰⵣⵡⵍ ⵏⵖ {{ns:user}}:ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵔⵙ) :",
        "log": "ⵉⵣⵎⵎⴻⵎⵏ",
        "all-logs-page": "ⵜⵉⵎⵙⵙⴽⵜⵉⵜⵉⵏ ⴰⴽⴽ ⵜⵉⵣⴰⵢⵣⵉⵏ",
+       "alllogstext": "ⴰⵙⴽⴰⵏ ⵉⵎⵎⵔⴽⵙⵏ ⵏ ⵜⵎⵙⵙⴽⵜⵉⵜⵉⵏ ⴰⴽⴽ ⵉⵍⵍⴰⵏ ⴳ {{SITENAME}}.\nⵜⵓⴼⵉⴷ ⴰⴷ ⵜⵙⵏⵏⵥⵍⵉⴷ ⴰⵙⴽⴰⵏ ⵙ ⵓⵙⵜⴰⵢ ⵏ ⵡⴰⵏⴰⵡ ⵏ ⵜⵎⵙⵙⴽⵜⵉⵜ, ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵏⵖ ⵜⴰⵙⵏⴰ ⵉⴳⴰ ⵡⴰⴷⴷⴰⴷ (ⵙⵉⵏ ⵉⵎⴳⴳⵓⵔⴰ ⴰⴷ ⵇⵇⵏⴻⵏ ⵖⵔ ⵓⵙⵎⵉⵍ).",
        "logempty": "ⵓⵔ ⵜⵍⵍⵉ ⴰⵡⴷ ⵢⴰⵜ ⵜⵎⵀⵍⵜ ⵉⵎⵙⴰⵙⴰⵏ ⴳ ⵜⵎⵙⵙⴽⵜⵉⵜⵉⵏ.",
        "checkbox-all": "ⵎⴰⵕⵕⴰ",
        "allpages": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⴽⴽ",
        "tooltip-n-currentevents": "ⴰⴼ ⵓⴳⴳⴰⵔ ⵏ ⵉⵏⵖⵎⵉⵙⵏ ⵖⴼ ⵜⵉⵎⵙⴰⵔⵉⵏ ⵜⵉⵎⵉⵔⴰⵏⵉⵏ",
        "tooltip-n-recentchanges": "ⵢⴰⵜ ⵜⵍⴳⴰⵎⵜ ⵏ ⵉⵙⵏⴼⵍⵏ ⵉⵎⴳⴳⵓⵔⴰ ⴳ ⵡⵉⴽⵉ",
        "tooltip-n-randompage": "ⵣⴷⵎ ⵜⴰⵙⵏⴰ ⵜⴰⴷⵀⵎⴰⵙⵜ",
-       "tooltip-n-help": "The place to find out",
+       "tooltip-n-help": "ⴰⴷⵖⴰⵔ ⴳ ⵜⴻⵜⵜⴰⴼⴰⴷ",
        "tooltip-t-whatlinkshere": "ⵓⵎⵓⵖ ⵏ ⵎⴰⵕⵕ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏ ⵡⵉⴽⵉ ⵉⵣⴷⵉⵏ ⵉ ⴷⴰ",
        "tooltip-t-recentchangeslinked": "ⵉⵙⵏⴼⵍⵏ ⵉⵏⴳⴳⵓⵔⴰ ⴳ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵉⵣⴷⵉⵏ ⵖⵔ ⵜⴰⵙⵏⴰ ⴰ",
        "tooltip-feed-atom": "ⴰⵏⴳⵉ ⵏ ⴰⵜⵓⵎ ⵏ ⵜⴰⵙⵏⴰ ⴰⴷ",
        "tooltip-compareselectedversions": "ⵥⵔ ⴰⵎⵣⴰⵔⴰⵢ ⴳⵔ ⵙⵉⵏ ⵉⵣⵣⵔⴰⵢⵏ ⵉⵜⵜⵓⵙⵜⴰⵢⵏ ⵏ ⵜⴰⵙⵏⴰ ⴰⴷ",
        "tooltip-watch": "ⵔⵏⵓ ⵜⴰⵙⵏⴰ ⴰ ⵉ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ {{GENDER:|ⵏⵏⴽ|ⵏⵏⵎ}}",
        "tooltip-rollback": "\"ⵔⴰⵔ\" ⵙⵙⵔ ⴰⵙⵏⴼⵍ ⵏⵖ ⵉⵙⵏⴼⴰⵍⵏ ⵏ ⵓⵎⴰⴷⵔⴰⵡ ⴰⵎⴳⴳⴰⵔⵓ ⴳ ⵜⴰⵙⵏⴰ ⴷ ⵙ ⵢⴰⵏ ⵓⴽⵍⵉⴽ",
+       "tooltip-undo": "\"ⵙⵔ\" ⴰⴷ ⵜⵔⴰⵔⴷ ⴰⵙⵏⴼⵍ ⴰ ⵜⵏⵏⵓⵔⵥⵎⴷ ⵜⴰⵍⵖⴰ ⵏ ⵓⵙⵏⴼⵍ ⴳ ⵜⵎⵓⵖⵍⵉ ⵜⴰⵣⵔⴰⵙⴽⴰⵏⵜ. ⵢⴰⵍⵍⴼⵓⵙ ⴰⴷ ⵜⵔⵏⵓⴷ ⴽⵔⴰ ⵏ ⵓⵙⵔⴰⴳ ⴳ ⵓⵙⴳⵣⵍ.",
        "tooltip-summary": "ⴰⵔⴰ ⴽⵔⴰ ⵏ ⵓⵙⴳⵣⵍ ⵎⵥⵥⵉⵢⵏ",
        "simpleantispam-label": "ⵜⵉⵎⵏⵥⵉⵜ ⵎⴳⵍ-ⴳⴰⵔⴰⵙⵎⵔⴰⵔⴰ.\nⴰⴷ <strong>ⵓⵔ</strong> ⵜⵣⵎⵎⴻⵎⴷ ⴰⵎⵢⴰ ⴳ ⵖⵉ!",
        "pageinfo-title": "ⵉⵏⵖⵎⵉⵙⵏ ⵖⴼ $1",
index dfa8a60..9cf1da9 100644 (file)
@@ -99,7 +99,8 @@
                        "WhitePhosphorus",
                        "A2093064",
                        "EagerLin",
-                       "Deathkon"
+                       "Deathkon",
+                       "RyRubyy"
                ]
        },
        "tog-underline": "链接下划线:",
        "noemailcreate": "您需要提供一个有效的电子邮件地址",
        "passwordsent": "用户\"$1\"的新密码已经寄往所登记的电子邮件地址。\n请在收到后再登录。",
        "blocked-mailpassword": "您的IP地址被禁止编辑,为预防滥用,也不允许从该IP地址使用密码恢复功能。",
-       "eauthentsent": "一封确认信已经发送至您设定的邮件地址。\n在任何其他邮件发送至您的账户前,您将不得不根据邮件中的指示,确认那个账户确实是您的。",
+       "eauthentsent": "一封确认信已经发送至您设定的邮件地址。\n在任何其他邮件发送至您的账户前,您将需要根据邮件中的指示,确认那个账户确实是您的。",
        "throttled-mailpassword": "密码提醒已在最近$1小时内发送。为了安全起见,在每$1小时内只能发送一个密码提醒。",
        "mailerror": "发送邮件错误:$1",
        "acct_creation_throttle_hit": "使用您的IP地址访问本wiki的访客在过去$2中创建了{{PLURAL:$1|$1个账户}},达到了这段时间所允许的最大值。因此,使用该IP地址的访客现在不能再创建账户。",
        "diff-paragraph-moved-toold": "段落已移动。点击跳到旧位置。",
        "difference-missing-revision": "此差异对比的{{PLURAL:$2|$2个版本}}($1){{PLURAL:$2|没有}}找到。\n\n这通常是因为进入了一个已被删除的页面的版本差异对比链接。\n详细信息可以在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
        "searchresults": "搜索结果",
+       "search-filter-title-prefix": "只在标题开头为“$1”的页面上搜索",
+       "search-filter-title-prefix-reset": "搜索所有页面",
        "searchresults-title": "“$1”的搜索结果",
        "titlematches": "页面标题匹配",
        "textmatches": "页面内容匹配",
        "speciallogtitlelabel": "目标(标题,或对于用户使用{{ns:user}}:用户名):",
        "log": "日志",
        "logeventslist-submit": "显示",
-       "logeventslist-more-filters": "æ\9b´å¤\9aè¿\87滤å\99¨:",
+       "logeventslist-more-filters": "æ\98¾ç¤ºæ\9b´å¤\9aæ\97¥å¿\97:",
        "logeventslist-patrol-log": "巡查日志",
        "logeventslist-tag-log": "标签日志",
        "all-logs-page": "所有公开日志",
        "markedaspatrollederrornotify": "标记为已巡查失败。",
        "patrol-log-page": "巡查日志",
        "patrol-log-header": "这是已巡查版本的日志。",
-       "log-show-hide-patrol": "$1巡查纪录",
-       "log-show-hide-tag": "$1标签日志",
        "confirm-markpatrolled-button": "确定",
        "confirm-markpatrolled-top": "将$2的修订版本$3标记为已巡查么?",
        "deletedrevision": "已删除旧版本$1",
index 9970649..51bb659 100644 (file)
        "diff-paragraph-moved-toold": "段落已被移動。點擊來跳至舊的位置。",
        "difference-missing-revision": "查無此差異 ($1) 中的{{PLURAL:$2|1 次修訂|$2 次修訂}}。\n\n這通常是因為差異的連結過時,頁面已被刪除。\n詳情資訊請參閱 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。",
        "searchresults": "搜尋結果",
+       "search-filter-title-prefix": "僅搜尋標題開頭為「$1」的頁面",
+       "search-filter-title-prefix-reset": "選擇所有頁面",
        "searchresults-title": "搜尋「$1」的結果",
        "titlematches": "頁面標題符合",
        "textmatches": "頁面內容符合",
        "speciallogtitlelabel": "目標 (標題或以 {{ns:user}}:使用者 表示使用者):",
        "log": "日誌",
        "logeventslist-submit": "顯示",
-       "logeventslist-more-filters": "更多篩選",
+       "logeventslist-more-filters": "顯示額外日誌:",
        "logeventslist-patrol-log": "巡查日誌",
        "logeventslist-tag-log": "標籤日誌",
        "all-logs-page": "所有公開日誌",
        "markedaspatrollederrornotify": "標記為已巡查失敗。",
        "patrol-log-page": "巡查日誌",
        "patrol-log-header": "這是已巡查的修訂版本的日誌。",
-       "log-show-hide-patrol": "$1 巡查日誌",
-       "log-show-hide-tag": "$1 標籤日誌",
        "confirm-markpatrolled-button": "確定",
        "confirm-markpatrolled-top": "標記 $2 的修訂 $3 為已巡查?",
        "deletedrevision": "已刪除舊修訂 $1",
index 131172a..9955e95 100644 (file)
@@ -14,7 +14,8 @@
                        "Justincheng12345",
                        "LNDDYL",
                        "Liuxinyu970226",
-                       "Quest for Truth"
+                       "Quest for Truth",
+                       "Wxyveronica"
                ]
        },
        "tog-watchlisthidebots": "隱藏監視清單中機械人的編輯",
        "october": "十月",
        "november": "十一月",
        "december": "十二月",
+       "jan": "1月",
+       "feb": "2月",
+       "mar": "3月",
+       "apr": "4月",
+       "may": "5月",
+       "jun": "6月",
+       "jul": "7月",
+       "aug": "8月",
+       "sep": "9月",
+       "oct": "10月",
+       "nov": "11月",
+       "dec": "12月",
        "mytalk": "我的討論頁",
+       "navigation": "導覽",
+       "namespaces": "命名空間",
+       "variants": "變體",
+       "navigation-heading": "導覽菜單",
        "tagline": "從 {{SITENAME}}",
+       "help": "說明",
        "search": "搜尋",
+       "searchbutton": "搜尋",
+       "searcharticle": "執行",
        "printableversion": "可打印版",
        "permalink": "靜態連結",
        "print": "打印",
+       "edit": "編輯",
+       "talkpagelinktext": "對話",
        "specialpage": "特殊頁面",
+       "personaltools": "個人工具",
+       "talk": "討論",
+       "views": "檢視",
+       "toolbox": "工具",
        "jumpto": "跳到:",
+       "jumptonavigation": "導覽",
        "jumptosearch": "搜尋",
+       "aboutsite": "關於 {{SITENAME}}",
        "aboutpage": "Project:關於我們",
+       "disclaimers": "免責聲明",
+       "disclaimerpage": "本專案:一般免責聲明",
+       "mainpage": "首頁",
        "privacy": "私隱政策",
        "privacypage": "Project:私隱政策",
+       "retrievedfrom": "取自 \"$1\"",
+       "editsection": "編輯",
+       "editsectionhint": "編輯章節:$1",
+       "site-atom-feed": "$1 Atom摘要",
        "red-link-title": "$1 (頁面不存在)",
        "nstab-user": "用戶頁面",
        "nstab-special": "特殊頁面",
        "nstab-template": "模板",
+       "mainpage-nstab": "首頁",
        "editinginterface": "<strong>警告:</strong>您正在編輯的頁面文字是用來作為軟件介面使用。更改此頁面將會影響其他用戶在此 Wiki 上看到的用戶介面。",
        "yourname": "用戶名稱:",
        "userlogin-yourname": "用戶名稱",
        "nav-login-createaccount": "登入/創造帳戶",
        "wrongpassword": "您輸入的密碼有錯誤,請再試一次。",
+       "pt-login": "登入",
+       "pt-createaccount": "建立賬號",
        "botpasswords": "機械人密碼",
        "botpasswords-summary": "<em>機械人密碼</em>可在不使用帳號的主要登入密碼情況下,允許透過 API 存取使用者帳號。使用機械人密碼登入的使用者權限或會有所限制。\n\n若你並非必須設定此密碼,你便不應使用此功能。任何人都不會索取你的機械人密碼。",
        "botpasswords-disabled": "機械人密碼已停用。",
        "rcshowhidebots": "$1機械人的編輯",
        "rcshowhideliu": "$1 已註冊的用戶",
        "rcshowhideanons": "$1 匿名用戶",
+       "rc-change-size-new": "變更後為$1{{PLURAL:$1|}}",
        "upload": "上載檔案",
        "listfiles_user": "用戶",
        "filehist-user": "用戶",
        "checkbox-select": "選擇: $1",
        "emailusername": "用戶名稱:",
        "wlshowhidebots": "機械人",
+       "blanknamespace": "(主要)",
        "blockip": "封鎖{{GENDER:$1|用戶}}",
        "contribslink": "貢獻",
        "blocklogtext": "這是用戶的封禁與解禁操作的日誌記錄。\n自動封禁的 IP 位址不予包含。\n請參考 [[Special:BlockList|封禁清單]] 以檢視目前的封禁。",
+       "tooltip-pt-login": "我們建議您登入,但這並非必要",
+       "tooltip-pt-createaccount": "我們建議您建立一個賬號并登入,但這並非必要",
        "tooltip-search": "搜尋 {{SITENAME}}",
        "tooltip-search-go": "若是真有其頁,則進入相同名字的頁面",
        "tooltip-search-fulltext": "在此頁面內搜尋此文字",
+       "tooltip-p-logo": "前往首頁",
        "tooltip-n-mainpage": "回到首頁",
        "tooltip-n-mainpage-description": "回到首頁",
+       "tooltip-n-recentchanges": "wiki近期變更清單",
        "tooltip-n-randompage": "跳到一個隨機抽取的頁面",
+       "tooltip-n-help": "尋求說明",
        "tooltip-t-contributions": "此用戶的貢獻清單",
        "tooltip-t-upload": "上載檔案",
+       "tooltip-t-specialpages": "特殊頁面總清單",
        "tooltip-t-print": "這個頁面的可打印版本",
        "tooltip-ca-nstab-user": "檢視用戶頁面",
+       "pageinfo-toolboxlink": "頁面咨詢",
        "newimages-showbots": "顯示機械人上傳的檔案",
        "exif-rowsperstrip": "每帶行數",
        "redirect-user": "用戶 ID",
        "specialpages": "特殊頁面",
        "tags-source-manual": "由使用者與機械人手動套用",
-       "logentry-managetags-activate": "$1{{GENDER:$2|已啟用}}標籤「$4」供使用者與機械人使用"
+       "logentry-managetags-activate": "$1{{GENDER:$2|已啟用}}標籤「$4」供使用者與機械人使用",
+       "searchsuggest-search": "搜尋{{SITENAME}}"
 }
index 5f87e16..039666b 100644 (file)
@@ -56,7 +56,7 @@ wikidata|https://www.wikidata.org/wiki/$1|0|https://www.wikidata.org/w/api.php
 wikif1|http://www.wikif1.org/$1|0|
 wikihow|https://www.wikihow.com/$1|0|https://www.wikihow.com/api.php
 wikinfo|http://wikinfo.co/English/index.php/$1|0|
-wikimedia|https://wikimediafoundation.org/wiki/$1|0|https://wikimediafoundation.org/w/api.php
+wikimedia|https://foundation.wikimedia.org/wiki/$1|0|https://foundation.wikimedia.org/w/api.php
 wikinews|https://en.wikinews.org/wiki/$1|0|https://en.wikinews.org/w/api.php
 wikipedia|https://en.wikipedia.org/wiki/$1|0|https://en.wikipedia.org/w/api.php
 wikiquote|https://en.wikiquote.org/wiki/$1|0|https://en.wikiquote.org/w/api.php
index 9e6072b..68ebedf 100644 (file)
@@ -58,7 +58,7 @@ REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local,iw_api) VALUES
 ('wikif1','http://www.wikif1.org/$1',0,''),
 ('wikihow','https://www.wikihow.com/$1',0,'https://www.wikihow.com/api.php'),
 ('wikinfo','http://wikinfo.co/English/index.php/$1',0,''),
-('wikimedia','https://wikimediafoundation.org/wiki/$1',0,'https://wikimediafoundation.org/w/api.php'),
+('wikimedia','https://foundation.wikimedia.org/wiki/$1',0,'https://foundation.wikimedia.org/w/api.php'),
 ('wikinews','https://en.wikinews.org/wiki/$1',0,'https://en.wikinews.org/w/api.php'),
 ('wikipedia','https://en.wikipedia.org/wiki/$1',0,'https://en.wikipedia.org/w/api.php'),
 ('wikiquote','https://en.wikiquote.org/wiki/$1',0,'https://en.wikiquote.org/w/api.php'),
index af47d65..fad35cb 100644 (file)
@@ -28,6 +28,11 @@ require_once __DIR__ . '/../Maintenance.php';
  *
  * This data file is used after normalizing to NFC.
  *
+ * Example usage:
+ *
+ *    curl 'https://unicode.org/Public/6.0.0/ucd/UnicodeData.txt' > /tmp/UnicodeData.txt
+ *    php generateNormalizerDataAr.php --unicode-data-file /tmp/UnicodeData.txt
+ *
  * @ingroup MaintenanceLanguage
  */
 class GenerateNormalizerDataAr extends Maintenance {
index 6d0882a..1b575bb 100644 (file)
@@ -165,6 +165,12 @@ class MysqlMaintenance extends Maintenance {
 
                $args = array_merge( $args, $this->mArgs );
 
+               // Ignore SIGINT if possible, otherwise the wrapper terminates when the user presses
+               // ctrl-C to kill a query.
+               if ( function_exists( 'pcntl_signal' ) ) {
+                       pcntl_signal( SIGINT, SIG_IGN );
+               }
+
                $pipes = [];
                $proc = proc_open( Shell::escape( $args ), $desc, $pipes );
                if ( $proc === false ) {
index 390d873..9101fba 100644 (file)
                left: 50%;
                // Make sure the middle of the spinner is centered, rather than its left edge
                margin-left: -3 * @rcfilters-spinner-size / 2;
-
-               opacity: 0.8;
                white-space: nowrap;
 
                & .rcfilters-spinner-bounce,
                &:before,
                &:after {
                        content: '';
-                       display: inline-block;
+                       background-color: @colorGray7;
+                       display: block;
+                       float: left;
                        width: @rcfilters-spinner-size;
                        height: @rcfilters-spinner-size;
-                       background-color: @colorGray12;
                        border-radius: 100%;
-                       .animation( rcfiltersBouncedelay 1.5s ease-in-out -0.16s infinite both );
+                       .animation( rcfiltersBouncedelay 1600ms ease-in-out -160ms infinite both );
                }
 
                &:before {
-                       .animation-delay( -0.33s );
+                       margin-right: 4px;
+                       .animation-delay( -330ms );
                }
 
                &:after {
+                       margin-left: 4px;
                        .animation-delay( 0s );
                }
        }
 
 @-webkit-keyframes rcfiltersBouncedelay {
        0%,
-       80%,
+       50%, // equals 800ms
        100% {
-               -webkit-transform: scale( 0.7 );
-               transform: scale( 0.7 );
+               -webkit-transform: scale( 0.625 );
        }
-       40% {
-               background-color: @colorGray10;
+       20% { // equals 320ms
+               opacity: 0.87;
                -webkit-transform: scale( 1 );
-               transform: scale( 1 );
        }
 }
 
 @-moz-keyframes rcfiltersBouncedelay {
        0%,
-       80%,
+       50%,
        100% {
-               -moz-transform: scale( 0.7 );
-               transform: scale( 0.7 );
+               -moz-transform: scale( 0.625 );
        }
-       40% {
-               background-color: @colorGray10;
-               -moz-transform: scale( 0.7 );
-               transform: scale( 1 );
+       20% {
+               opacity: 0.87;
+               -moz-transform: scale( 1 );
        }
 }
 
 @keyframes rcfiltersBouncedelay {
        0%,
-       80%,
+       50%,
        100% {
-               transform: scale( 0.7 );
+               transform: scale( 0.625 );
        }
-       40% {
-               background-color: @colorGray10;
+       20% { // equals 320ms
+               opacity: 0.87;
                transform: scale( 1 );
        }
 }
index ad0bc4a..1cc48e2 100644 (file)
                        display: block;
                        padding-top: 1em;
                }
+
+               label {
+                       // Workaround for Chrome browser bug (T199932)
+                       // Override padding rule from FieldLayout
+                       padding-left: 0 !important; /* stylelint-disable-line declaration-no-important */
+               }
        }
 
        .mw-rcfilters-ui-cell {
index ceee432..68bc61e 100644 (file)
@@ -116,6 +116,30 @@ class ParserTestRunner {
         */
        private $normalizationFunctions = [];
 
+       /**
+        * Run disabled parser tests
+        * @var bool
+        */
+       private $runDisabled;
+
+       /**
+        * Run tests intended only for parsoid
+        * @var bool
+        */
+       private $runParsoid;
+
+       /**
+        * Disable parse on article insertion
+        * @var bool
+        */
+       private $disableSaveParse;
+
+       /**
+        * Reuse upload directory
+        * @var bool
+        */
+       private $keepUploads;
+
        /**
         * @param TestRecorder $recorder
         * @param array $options
@@ -148,6 +172,8 @@ class ParserTestRunner {
                $this->runDisabled = !empty( $options['run-disabled'] );
                $this->runParsoid = !empty( $options['run-parsoid'] );
 
+               $this->disableSaveParse = !empty( $options['disable-save-parse'] );
+
                $this->tidySupport = new TidySupport( !empty( $options['use-tidy-config'] ) );
                if ( !$this->tidySupport->isEnabled() ) {
                        $this->recorder->warning(
@@ -1184,7 +1210,8 @@ class ParserTestRunner {
                        'site_stats', 'ipblocks', 'image', 'oldimage',
                        'recentchanges', 'watchlist', 'interwiki', 'logging', 'log_search',
                        'querycache', 'objectcache', 'job', 'l10n_cache', 'redirect', 'querycachetwo',
-                       'archive', 'user_groups', 'page_props', 'category'
+                       'archive', 'user_groups', 'page_props', 'category',
+                       'slots', 'content', 'slot_roles', 'content_models',
                ];
 
                if ( $wgCommentTableSchemaMigrationStage >= MIGRATION_WRITE_BOTH ) {
@@ -1451,7 +1478,6 @@ class ParserTestRunner {
                $this->checkSetupDone( 'setupDatabase' );
 
                $this->dbClone->destroy();
-               $this->databaseSetupDone = false;
 
                if ( $this->useTemporaryTables ) {
                        if ( $this->db->getType() == 'sqlite' ) {
@@ -1651,11 +1677,15 @@ class ParserTestRunner {
                        );
                }
 
-               // Use mock parser, to make debugging of actual parser tests simpler.
+               // Optionally use mock parser, to make debugging of actual parser tests simpler.
                // But initialise the MessageCache clone first, don't let MessageCache
                // get a reference to the mock object.
-               MessageCache::singleton()->getParser();
-               $restore = $this->executeSetupSnippets( [ 'wgParser' => new ParserTestMockParser ] );
+               if ( $this->disableSaveParse ) {
+                       MessageCache::singleton()->getParser();
+                       $restore = $this->executeSetupSnippets( [ 'wgParser' => new ParserTestMockParser ] );
+               } else {
+                       $restore = false;
+               }
                try {
                        $status = $page->doEditContent(
                                $newContent,
@@ -1663,7 +1693,9 @@ class ParserTestRunner {
                                EDIT_NEW | EDIT_INTERNAL
                        );
                } finally {
-                       $restore();
+                       if ( $restore ) {
+                               $restore();
+                       }
                }
 
                if ( !$status->isOK() ) {
index 6a423d5..c01b416 100644 (file)
@@ -62,6 +62,8 @@ class ParserTestsMaintenance extends Maintenance {
                        'be used.', false, true );
                $this->addOption( 'run-disabled', 'run disabled tests' );
                $this->addOption( 'run-parsoid', 'run parsoid tests (normally disabled)' );
+               $this->addOption( 'disable-save-parse', 'Don\'t run the parser when ' .
+                       'inserting articles     into the database' );
                $this->addOption( 'dwdiff', 'Use dwdiff to display diff output' );
                $this->addOption( 'mark-ws', 'Mark whitespace in diffs by replacing it with symbols' );
                $this->addOption( 'norm', 'Apply a comma-separated list of normalization functions to ' .
@@ -180,6 +182,7 @@ class ParserTestsMaintenance extends Maintenance {
                        'keep-uploads' => $this->hasOption( 'keep-uploads' ),
                        'run-disabled' => $this->hasOption( 'run-disabled' ),
                        'run-parsoid' => $this->hasOption( 'run-parsoid' ),
+                       'disable-save-parse' => $this->hasOption( 'disable-save-parse' ),
                        'use-tidy-config' => $this->hasOption( 'use-tidy-config' ),
                        'file-backend' => $this->getOption( 'file-backend' ),
                        'upload-dir' => $this->getOption( 'upload-dir' ),
diff --git a/tests/phpunit/data/registration/duplicate_keys.json b/tests/phpunit/data/registration/duplicate_keys.json
new file mode 100644 (file)
index 0000000..40f2f7e
--- /dev/null
@@ -0,0 +1,4 @@
+{
+       "name": "FooBar",
+       "name": "Test"
+}
index 1011a37..bc930be 100644 (file)
@@ -5,8 +5,9 @@
  * @covers ::wfArrayFilter
  * @covers ::wfArrayFilterByKey
  */
-class WfArrayFilterTest extends \PHPUnit\Framework\TestCase {
+class WfArrayFilterTest extends MediaWikiTestCase {
        public function testWfArrayFilter() {
+               $this->hideDeprecated( 'wfArrayFilter' );
                $arr = [ 'a' => 1, 'b' => 2, 'c' => 3 ];
                $filtered = wfArrayFilter( $arr, function ( $val, $key ) {
                        return $key !== 'b';
@@ -27,6 +28,7 @@ class WfArrayFilterTest extends \PHPUnit\Framework\TestCase {
        }
 
        public function testWfArrayFilterByKey() {
+               $this->hideDeprecated( 'wfArrayFilterByKey' );
                $arr = [ 'a' => 1, 'b' => 2, 'c' => 3 ];
                $filtered = wfArrayFilterByKey( $arr, function ( $key ) {
                        return $key !== 'b';
index 093cb07..7763aff 100644 (file)
@@ -364,6 +364,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                        'ExternalStoreFactory' => [ 'ExternalStoreFactory', ExternalStoreFactory::class ],
                        'PreferencesFactory' => [ 'PreferencesFactory', PreferencesFactory::class ],
                        'ActorMigration' => [ 'ActorMigration', ActorMigration::class ],
+                       'ConfigRepository' => [ 'ConfigRepository', \MediaWiki\Config\ConfigRepository::class ],
                ];
        }
 
index f06d97e..b7869e6 100644 (file)
@@ -1098,4 +1098,21 @@ class ApiMainTest extends ApiTestCase {
                        ],
                ];
        }
+
+       public function testPrinterParameterValidationError() {
+               $api = $this->getNonInternalApiMain( [
+                       'action' => 'query', 'meta' => 'siteinfo', 'format' => 'json', 'formatversion' => 'bogus',
+               ] );
+
+               ob_start();
+               $api->execute();
+               $txt = ob_get_clean();
+
+               // Test that the actual output is valid JSON, not just the format of the ApiResult.
+               $data = FormatJson::decode( $txt, true );
+               $this->assertInternalType( 'array', $data );
+               $this->assertArrayHasKey( 'error', $data );
+               $this->assertArrayHasKey( 'code', $data['error'] );
+               $this->assertSame( 'unknown_formatversion', $data['error']['code'] );
+       }
 }
index fbc1bed..29c7dae 100644 (file)
@@ -40,6 +40,10 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                $this->mUserMock->expects( $this->any() )
                        ->method( 'getInstanceForUpdate' )->will( $this->returnValue( $this->mUserMock ) );
 
+               // Needs to return something
+               $this->mUserMock->method( 'getOptions' )
+                       ->willReturn( [] );
+
                // Create a new context
                $this->mContext = new DerivativeContext( new RequestContext() );
                $this->mContext->getContext()->setTitle( Title::newFromText( 'Test' ) );
index c711291..04aecc9 100644 (file)
@@ -19,6 +19,30 @@ class CSSMinTest extends MediaWikiTestCase {
                ] );
        }
 
+       /**
+        * @dataProvider providesReferencedFiles
+        * @covers CSSMin::getLocalFileReferences
+        */
+       public function testGetLocalFileReferences( $input, $expected ) {
+               $output = CSSMin::getLocalFileReferences( $input, '/' );
+               $this->assertEquals(
+                       $expected,
+                       $output,
+                       'getLocalFileReferences() must find the local file properly'
+               );
+       }
+
+       public static function providesReferencedFiles() {
+               // input, array of expected local file names
+               return [
+                       [ 'url("//example.org")', [] ],
+                       [ 'url("https://example.org")', [] ],
+                       [ 'url("#default#")', [] ],
+                       [ 'url("WikiFont-Glyphs.svg#wikiglyph")', [ '/WikiFont-Glyphs.svg' ] ],
+                       [ 'url("#some-anchor")', [] ],
+               ];
+       }
+
        /**
         * @dataProvider provideSerializeStringValue
         * @covers CSSMin::serializeStringValue
@@ -292,6 +316,16 @@ class CSSMinTest extends MediaWikiTestCase {
                                [ 'foo { behavior: url(#default#bar); }', false, '/w/', false ],
                                'foo { behavior: url("#default#bar"); }',
                        ],
+                       [
+                               'Keeps anchors',
+                               [ 'url(#other)', false, '/', false ],
+                               'url("#other")'
+                       ],
+                       [
+                               'Keeps anchors after a path',
+                               [ 'url(images/file.svg#id)', false, '/', false ],
+                               'url("/images/file.svg#id")'
+                       ],
                ];
        }
 
index 79f7b96..a06ef62 100644 (file)
@@ -158,10 +158,12 @@ class MapCacheLRUTest extends PHPUnit\Framework\TestCase {
                $now += 29;
                $this->assertTrue( $cache->has( 'd', 30 ) );
                $this->assertEquals( 'xxx', $cache->get( 'd' ) );
+               $this->assertEquals( 'xxx', $cache->get( 'd', 30 ) );
 
                $now += 1.5;
                $this->assertFalse( $cache->has( 'd', 30 ) );
                $this->assertEquals( 'xxx', $cache->get( 'd' ) );
+               $this->assertNull( $cache->get( 'd', 30 ) );
        }
 
        /**
@@ -180,14 +182,17 @@ class MapCacheLRUTest extends PHPUnit\Framework\TestCase {
                $cache->setField( 'PMs', 'Margaret Thatcher', 'Tory' );
                $this->assertTrue( $cache->hasField( 'PMs', 'Tony Blair', 30 ) );
                $this->assertEquals( 'Labour', $cache->getField( 'PMs', 'Tony Blair' ) );
+               $this->assertTrue( $cache->hasField( 'PMs', 'Tony Blair', 30 ) );
 
                $now += 29;
                $this->assertTrue( $cache->hasField( 'PMs', 'Tony Blair', 30 ) );
                $this->assertEquals( 'Labour', $cache->getField( 'PMs', 'Tony Blair' ) );
+               $this->assertEquals( 'Labour', $cache->getField( 'PMs', 'Tony Blair', 30 ) );
 
                $now += 1.5;
                $this->assertFalse( $cache->hasField( 'PMs', 'Tony Blair', 30 ) );
                $this->assertEquals( 'Labour', $cache->getField( 'PMs', 'Tony Blair' ) );
+               $this->assertNull( $cache->getField( 'PMs', 'Tony Blair', 30 ) );
 
                $this->assertEquals(
                        [ 'Tony Blair' => 'Labour', 'Margaret Thatcher' => 'Tory' ],
index 9a8608f..296691d 100644 (file)
@@ -164,8 +164,9 @@ class DefaultPreferencesFactoryTest extends MediaWikiTestCase {
                        }
                );
 
+               /** @var DefaultPreferencesFactory $factory */
                $factory = TestingAccessWrapper::newFromObject( $this->getPreferencesFactory() );
-               $factory->saveFormData( $newOptions, $form );
+               $factory->saveFormData( $newOptions, $form, [] );
        }
 
        /**
diff --git a/tests/phpunit/includes/preferences/FiltersTest.php b/tests/phpunit/includes/preferences/FiltersTest.php
new file mode 100644 (file)
index 0000000..42cbc2c
--- /dev/null
@@ -0,0 +1,141 @@
+<?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
+ */
+
+use MediaWiki\Preferences\IntvalFilter;
+use MediaWiki\Preferences\MultiUsernameFilter;
+use MediaWiki\Preferences\TimezoneFilter;
+
+/**
+ * @group Preferences
+ */
+class FiltersTest extends MediaWikiTestCase {
+       /**
+        * @covers MediaWiki\Preferences\IntvalFilter::filterFromForm()
+        * @covers MediaWiki\Preferences\IntvalFilter::filterForForm()
+        */
+       public function testIntvalFilter() {
+               $filter = new IntvalFilter();
+               self::assertSame( 0, $filter->filterFromForm( '0' ) );
+               self::assertSame( 3, $filter->filterFromForm( '3' ) );
+               self::assertSame( '123', $filter->filterForForm( '123' ) );
+       }
+
+       /**
+        * @covers       MediaWiki\Preferences\TimezoneFilter::filterFromForm()
+        * @dataProvider provideTimezoneFilter
+        *
+        * @param string $input
+        * @param string $expected
+        */
+       public function testTimezoneFilter( $input, $expected ) {
+               $filter = new TimezoneFilter();
+               $result = $filter->filterFromForm( $input );
+               self::assertEquals( $expected, $result );
+       }
+
+       public function provideTimezoneFilter() {
+               return [
+                       [ 'ZoneInfo', 'Offset|0' ],
+                       [ 'ZoneInfo|bogus', 'Offset|0' ],
+                       [ 'System', 'System' ],
+                       [ '2:30', 'Offset|150' ],
+               ];
+       }
+
+       /**
+        * @covers MediaWiki\Preferences\MultiUsernameFilter::filterFromForm()
+        * @dataProvider provideMultiUsernameFilterFrom
+        *
+        * @param string $input
+        * @param string|null $expected
+        */
+       public function testMultiUsernameFilterFrom( $input, $expected ) {
+               $filter = $this->makeMultiUsernameFilter();
+               $result = $filter->filterFromForm( $input );
+               self::assertSame( $expected, $result );
+       }
+
+       public function provideMultiUsernameFilterFrom() {
+               return [
+                       [ '', null ],
+                       [ "\n\n\n", null ],
+                       [ 'Foo', '1' ],
+                       [ "\n\n\nFoo\nBar\n", "1\n2" ],
+                       [ "Baz\nInvalid\nFoo", "3\n1" ],
+                       [ "Invalid", null ],
+                       [ "Invalid\n\n\nInvalid\n", null ],
+               ];
+       }
+
+       /**
+        * @covers MediaWiki\Preferences\MultiUsernameFilter::filterForForm()
+        * @dataProvider provideMultiUsernameFilterFor
+        *
+        * @param string $input
+        * @param string $expected
+        */
+       public function testMultiUsernameFilterFor( $input, $expected ) {
+               $filter = $this->makeMultiUsernameFilter();
+               $result = $filter->filterForForm( $input );
+               self::assertSame( $expected, $result );
+       }
+
+       public function provideMultiUsernameFilterFor() {
+               return [
+                       [ '', '' ],
+                       [ "\n", '' ],
+                       [ '1', 'Foo' ],
+                       [ "\n1\n\n2\666\n", "Foo\nBar" ],
+                       [ "666\n667", '' ],
+               ];
+       }
+
+       private function makeMultiUsernameFilter() {
+               $userMapping = [
+                       'Foo' => 1,
+                       'Bar' => 2,
+                       'Baz' => 3,
+               ];
+               $flipped = array_flip( $userMapping );
+               $idLookup = self::getMockBuilder( CentralIdLookup::class )
+                       ->disableOriginalConstructor()
+                       ->setMethods( [ 'centralIdsFromNames', 'namesFromCentralIds' ] )
+                       ->getMockForAbstractClass();
+
+               $idLookup->method( 'centralIdsFromNames' )
+                       ->will( self::returnCallback( function ( $names ) use ( $userMapping ) {
+                               $ids = [];
+                               foreach ( $names as $name ) {
+                                       $ids[] = $userMapping[$name] ?? null;
+                               }
+                               return array_filter( $ids, 'is_numeric' );
+                       } ) );
+               $idLookup->method( 'namesFromCentralIds' )
+                       ->will( self::returnCallback( function ( $ids ) use ( $flipped ) {
+                               $names = [];
+                               foreach ( $ids as $id ) {
+                                       $names[] = $flipped[$id] ?? null;
+                               }
+                               return array_filter( $names, 'is_string' );
+                       } ) );
+
+               return new MultiUsernameFilter( $idLookup );
+       }
+}
index 355f4ef..46c697f 100644 (file)
@@ -52,6 +52,10 @@ class ExtensionJsonValidatorTest extends MediaWikiTestCase {
                                'notjson.txt',
                                'notjson.txt is not valid JSON'
                        ],
+                       [
+                               'duplicate_keys.json',
+                               'Duplicate key: name'
+                       ],
                        [
                                'no_manifest_version.json',
                                'no_manifest_version.json does not have manifest_version set.'
index 35d4ea0..b668a9a 100644 (file)
@@ -17,8 +17,7 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
                        'FakeExtension' => [
                                'MediaWiki' => $constraint,
                        ],
-               ] )
-               );
+               ] ) );
        }
 
        public static function provideCheck() {
@@ -50,8 +49,7 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
         */
        public function testType( $given, $expected ) {
                $checker = new VersionChecker( '1.0.0' );
-               $checker
-                       ->setLoadedExtensionsAndSkins( [
+               $checker->setLoadedExtensionsAndSkins( [
                                'FakeDependency' => [
                                        'version' => '1.0.0',
                                ],
@@ -59,8 +57,7 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
                        ] );
                $this->assertEquals( $expected, $checker->checkArray( [
                        'FakeExtension' => $given,
-               ] )
-               );
+               ] ) );
        }
 
        public static function provideType() {
@@ -69,22 +66,22 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
                        [
                                [
                                        'extensions' => [
-                                               'FakeDependency' => '1.0.0'
-                                       ]
+                                               'FakeDependency' => '1.0.0',
+                                       ],
                                ],
-                               []
+                               [],
                        ],
                        [
                                [
-                                       'MediaWiki' => '1.0.0'
+                                       'MediaWiki' => '1.0.0',
                                ],
-                               []
+                               [],
                        ],
                        [
                                [
                                        'extensions' => [
-                                               'NoVersionGiven' => '*'
-                                       ]
+                                               'NoVersionGiven' => '*',
+                                       ],
                                ],
                                [],
                        ],
@@ -92,39 +89,59 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
                                [
                                        'extensions' => [
                                                'NoVersionGiven' => '1.0',
-                                       ]
+                                       ],
+                               ],
+                               [
+                                       [
+                                               'incompatible' => 'FakeExtension',
+                                               'type' => 'incompatible-extensions',
+                                               'msg' => 'NoVersionGiven does not expose its version, but FakeExtension requires: 1.0.',
+                                       ],
                                ],
-                               [ [
-                                       'incompatible' => 'FakeExtension',
-                                       'type' => 'incompatible-extensions',
-                                       'msg' => 'NoVersionGiven does not expose its version, but FakeExtension requires: 1.0.'
-                               ] ],
                        ],
                        [
                                [
                                        'extensions' => [
                                                'Missing' => '*',
-                                       ]
+                                       ],
+                               ],
+                               [
+                                       [
+                                               'missing' => 'Missing',
+                                               'type' => 'missing-extensions',
+                                               'msg' => 'FakeExtension requires Missing to be installed.',
+                                       ],
                                ],
-                               [ [
-                                       'missing' => 'Missing',
-                                       'type' => 'missing-extensions',
-                                       'msg' => 'FakeExtension requires Missing to be installed.',
-                               ] ],
                        ],
                        [
                                [
                                        'extensions' => [
                                                'FakeDependency' => '2.0.0',
-                                       ]
-                               ],
-                               [ [
-                                       'incompatible' => 'FakeExtension',
-                                       'type' => 'incompatible-extensions',
-                                       // phpcs:ignore Generic.Files.LineLength.TooLong
-                                       'msg' => 'FakeExtension is not compatible with the current installed version of FakeDependency (1.0.0), it requires: 2.0.0.'
-                               ] ],
-                       ]
+                                       ],
+                               ],
+                               [
+                                       [
+                                               'incompatible' => 'FakeExtension',
+                                               'type' => 'incompatible-extensions',
+                                               // phpcs:ignore Generic.Files.LineLength.TooLong
+                                               'msg' => 'FakeExtension is not compatible with the current installed version of FakeDependency (1.0.0), it requires: 2.0.0.',
+                                       ],
+                               ],
+                       ],
+                       [
+                               [
+                                       'skins' => [
+                                               'FakeSkin' => '*',
+                                       ],
+                               ],
+                               [
+                                       [
+                                               'missing' => 'FakeSkin',
+                                               'type' => 'missing-skins',
+                                               'msg' => 'FakeExtension requires FakeSkin to be installed.',
+                                       ],
+                               ],
+                       ],
                ];
        }
 
@@ -134,29 +151,26 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
         */
        public function testInvalidConstraint() {
                $checker = new VersionChecker( '1.0.0' );
-               $checker
-                       ->setLoadedExtensionsAndSkins( [
+               $checker->setLoadedExtensionsAndSkins( [
                                'FakeDependency' => [
                                        'version' => 'not really valid',
                                ],
                        ] );
-               $this->assertEquals(
-                       [ [
+               $this->assertEquals( [
+                       [
                                'type' => 'invalid-version',
-                               'msg' => "FakeDependency does not have a valid version string."
-                       ] ],
-                       $checker->checkArray( [
-                               'FakeExtension' => [
-                                       'extensions' => [
-                                               'FakeDependency' => '1.24.3',
-                                       ],
+                               'msg' => "FakeDependency does not have a valid version string.",
+                       ],
+               ], $checker->checkArray( [
+                       'FakeExtension' => [
+                               'extensions' => [
+                                       'FakeDependency' => '1.24.3',
                                ],
-                       ] )
-               );
+                       ],
+               ] ) );
 
                $checker = new VersionChecker( '1.0.0' );
-               $checker
-                       ->setLoadedExtensionsAndSkins( [
+               $checker->setLoadedExtensionsAndSkins( [
                                'FakeDependency' => [
                                        'version' => '1.24.3',
                                ],
@@ -166,7 +180,28 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
                $checker->checkArray( [
                        'FakeExtension' => [
                                'FakeDependency' => 'not really valid',
-                       ]
+                       ],
                ] );
        }
+
+       /**
+        * T197478
+        */
+       public function testInvalidDependency() {
+               $checker = new VersionChecker( '1.0.0' );
+               $this->setExpectedException( UnexpectedValueException::class,
+                       'Dependency type skin unknown in FakeExtension' );
+               $this->assertEquals( [
+                       [
+                               'type' => 'invalid-version',
+                               'msg' => 'FakeDependency does not have a valid version string.',
+                       ],
+               ], $checker->checkArray( [
+                       'FakeExtension' => [
+                               'skin' => [
+                                       'FakeSkin' => '*',
+                               ],
+                       ],
+               ] ) );
+       }
 }
index 5884d19..c1f5cf8 100644 (file)
@@ -340,4 +340,120 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                        EDIT_NEW | EDIT_SUPPRESS_RC
                );
        }
+
+       public function provideDataForParseNamespacePrefix() {
+               return [
+                       'noop' => [
+                               [
+                                       'query' => 'foo',
+                               ],
+                               false
+                       ],
+                       'empty' => [
+                               [
+                                       'query' => '',
+                               ],
+                               false,
+                       ],
+                       'namespace prefix' => [
+                               [
+                                       'query' => 'help:test',
+                               ],
+                               [ 'test', [ NS_HELP ] ],
+                       ],
+                       'accented namespace prefix with hook' => [
+                               [
+                                       'query' => 'hélp:test',
+                                       'withHook' => true,
+                               ],
+                               [ 'test', [ NS_HELP ] ],
+                       ],
+                       'accented namespace prefix without hook' => [
+                               [
+                                       'query' => 'hélp:test',
+                                       'withHook' => false,
+                               ],
+                               false,
+                       ],
+                       'all with all keyword allowed' => [
+                               [
+                                       'query' => 'all:test',
+                                       'withAll' => true,
+                               ],
+                               [ 'test', null ],
+                       ],
+                       'all with all keyword disallowed' => [
+                               [
+                                       'query' => 'all:test',
+                                       'withAll' => false,
+                               ],
+                               false
+                       ],
+                       'ns only' => [
+                               [
+                                       'query' => 'help:',
+                               ],
+                               [ '', [ NS_HELP ] ]
+                       ],
+                       'all only' => [
+                               [
+                                       'query' => 'all:',
+                                       'withAll' => true,
+                               ],
+                               [ '', null ]
+                       ],
+                       'all wins over namespace when first' => [
+                               [
+                                       'query' => 'all:help:test',
+                                       'withAll' => true,
+                               ],
+                               [ 'help:test', null ]
+                       ],
+                       'ns wins over all when first' => [
+                               [
+                                       'query' => 'help:all:test',
+                                       'withAll' => true,
+                               ],
+                               [ 'all:test', [ NS_HELP ] ]
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideDataForParseNamespacePrefix
+        * @param array $params
+        * @param  array|false $expected
+        * @throws FatalError
+        * @throws MWException
+        */
+       public function testParseNamespacePrefix( array $params, $expected ) {
+               $this->setTemporaryHook( 'PrefixSearchExtractNamespace', function ( &$namespaces, &$query ) {
+                       if ( strpos( $query, 'hélp:' ) === 0 ) {
+                               $namespaces = [ NS_HELP ];
+                               $query = substr( $query, strlen( 'hélp:' ) );
+                       }
+                       return false;
+               } );
+               $testSet = [];
+               if ( isset( $params['withAll'] ) && isset( $params['withHook'] ) ) {
+                       $testSet[] = $params;
+               } elseif ( isset( $params['withAll'] ) ) {
+                       $testSet[] = $params + [ 'withHook' => true ];
+                       $testSet[] = $params + [ 'withHook' => false ];
+               } elseif ( isset( $params['withHook'] ) ) {
+                       $testSet[] = $params + [ 'withAll' => true ];
+                       $testSet[] = $params + [ 'withAll' => false ];
+               } else {
+                       $testSet[] = $params + [ 'withAll' => true, 'withHook' => true ];
+                       $testSet[] = $params + [ 'withAll' => true, 'withHook' => false ];
+                       $testSet[] = $params + [ 'withAll' => false, 'withHook' => false ];
+                       $testSet[] = $params + [ 'withAll' => true, 'withHook' => false ];
+               }
+
+               foreach ( $testSet as $test ) {
+                       $actual = SearchEngine::parseNamespacePrefixes( $test['query'],
+                               $test['withAll'], $test['withHook'] );
+                       $this->assertEquals( $expected, $actual, 'with params: ' . print_r( $test, true ) );
+               }
+       }
 }
index bdfbb62..cd6cd3b 100644 (file)
@@ -43,6 +43,10 @@ class SpecialPreferencesTest extends MediaWikiTestCase {
                        ]
                        ) );
 
+               # Needs to return something
+               $user->method( 'getOptions' )
+                       ->willReturn( [] );
+
                # Forge a request to call the special page
                $context = new RequestContext();
                $context->setRequest( new FauxRequest() );
index ac8a5dc..13d16df 100644 (file)
@@ -27,11 +27,12 @@ class MockCompletionSearchEngine extends SearchEngine {
         */
        public static function addMockResults( $query, array $result ) {
                // Leading : ensures we don't treat another : as a namespace separator
-               $normalized = Title::newFromText( ":$query" )->getText();
+               $normalized = mb_strtolower( Title::newFromText( ":$query" )->getText() );
                self::$results[$normalized] = $result;
        }
 
        public function completionSearchBackend( $search ) {
+               $search = mb_strtolower( $search );
                if ( !isset( self::$results[$search] ) ) {
                        return SearchSuggestionSet::emptySuggestionSet();
                }