Merge "Add @coversNothing for left over tests and enable sniff"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sun, 3 Feb 2019 20:28:49 +0000 (20:28 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sun, 3 Feb 2019 20:28:49 +0000 (20:28 +0000)
189 files changed:
.gitignore
.phpcs.xml
RELEASE-NOTES-1.33
autoload.php
composer.json
docs/code-coverage/README [deleted file]
includes/DefaultSettings.php
includes/FileDeleteForm.php
includes/Revision.php
includes/Revision/RevisionRecord.php
includes/Setup.php
includes/Storage/PageUpdater.php
includes/Title.php
includes/api/i18n/he.json
includes/api/i18n/it.json
includes/api/i18n/pt.json
includes/api/i18n/zh-hant.json
includes/auth/LocalPasswordPrimaryAuthenticationProvider.php
includes/auth/TemporaryPasswordPrimaryAuthenticationProvider.php
includes/block/BlockRestriction.php
includes/diff/DifferenceEngine.php
includes/exception/ILocalizedException.php [new file with mode: 0644]
includes/exception/LocalizedException.php
includes/http/GuzzleHttpRequest.php
includes/http/MWHttpRequest.php
includes/installer/i18n/ar.json
includes/installer/i18n/cs.json
includes/installer/i18n/de.json
includes/installer/i18n/es.json
includes/installer/i18n/et.json
includes/installer/i18n/fr.json
includes/installer/i18n/it.json
includes/installer/i18n/nl.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/ro.json
includes/installer/i18n/zh-hans.json
includes/installer/i18n/zh-hant.json
includes/logging/BlockLogFormatter.php
includes/logging/LogPage.php
includes/media/XCF.php [deleted file]
includes/media/XCFHandler.php [new file with mode: 0644]
includes/password/InvalidPassword.php
includes/password/Password.php
includes/revisiondelete/RevisionDeleteUser.php
includes/skins/BaseTemplate.php
includes/skins/QuickTemplate.php
includes/skins/Skin.php
includes/specials/SpecialMediaStatistics.php
includes/specials/SpecialTags.php
includes/specials/SpecialTrackingCategories.php
includes/tidy/RemexCompatMunger.php
includes/user/BotPassword.php
languages/Language.php
languages/i18n/aeb-arab.json
languages/i18n/ang.json
languages/i18n/ar.json
languages/i18n/arz.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bqi.json
languages/i18n/cs.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/et.json
languages/i18n/exif/ar.json
languages/i18n/exif/et.json
languages/i18n/exif/ig.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/ig.json
languages/i18n/inh.json
languages/i18n/it.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/lrc.json
languages/i18n/lv.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/ms.json
languages/i18n/nl.json
languages/i18n/pa.json
languages/i18n/pl.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sco.json
languages/i18n/skr-arab.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sv.json
languages/i18n/th.json
languages/i18n/trv.json [new file with mode: 0644]
languages/i18n/uk.json
languages/i18n/wa.json
languages/i18n/yi.json
languages/i18n/zh-hant.json
maintenance/Maintenance.php
maintenance/cleanupEmptyCategories.php
maintenance/cleanupPreferences.php
maintenance/deleteOldRevisions.php
maintenance/importImages.php
maintenance/updateCredits.php
package.json
resources/Resources.php
resources/src/jquery.tablesorter.styles/images/sort_both.png [new file with mode: 0644]
resources/src/jquery.tablesorter.styles/images/sort_both.svg [new file with mode: 0644]
resources/src/jquery.tablesorter.styles/images/sort_down.png [new file with mode: 0644]
resources/src/jquery.tablesorter.styles/images/sort_down.svg [new file with mode: 0644]
resources/src/jquery.tablesorter.styles/images/sort_up.png [new file with mode: 0644]
resources/src/jquery.tablesorter.styles/images/sort_up.svg [new file with mode: 0644]
resources/src/jquery.tablesorter.styles/jquery.tablesorter.styles.less [new file with mode: 0644]
resources/src/jquery.tablesorter/images/sort_both.png [deleted file]
resources/src/jquery.tablesorter/images/sort_both.svg [deleted file]
resources/src/jquery.tablesorter/images/sort_down.png [deleted file]
resources/src/jquery.tablesorter/images/sort_down.svg [deleted file]
resources/src/jquery.tablesorter/images/sort_up.png [deleted file]
resources/src/jquery.tablesorter/images/sort_up.svg [deleted file]
resources/src/jquery.tablesorter/jquery.tablesorter.less [deleted file]
resources/src/jquery/jquery.makeCollapsible.js
resources/src/jquery/jquery.suggestions.js
resources/src/mediawiki.inspect.js
resources/src/mediawiki.notification/notification.js
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
resources/src/mediawiki.special.apisandbox/apisandbox.js
resources/src/mediawiki.special.userrights.js
tests/integration/includes/shell/FirejailCommandIntegrationTest.php [new file with mode: 0644]
tests/integration/includes/shell/FirejailCommandTest.php [deleted file]
tests/phpunit/Makefile
tests/phpunit/includes/EditPageTest.php
tests/phpunit/includes/MovePageTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/Revision/MutableRevisionSlotsTest.php
tests/phpunit/includes/Revision/RenderedRevisionTest.php
tests/phpunit/includes/Revision/RevisionRendererTest.php
tests/phpunit/includes/Revision/RevisionSlotsTest.php
tests/phpunit/includes/Revision/RevisionStoreFactoryTest.php
tests/phpunit/includes/Revision/RevisionStoreTest.php
tests/phpunit/includes/RevisionDbTestBase.php
tests/phpunit/includes/Storage/DerivedPageDataUpdaterTest.php
tests/phpunit/includes/Storage/PageUpdaterTest.php
tests/phpunit/includes/TestUser.php
tests/phpunit/includes/content/WikitextContentTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/debug/logger/monolog/LogstashFormatterTest.php
tests/phpunit/includes/deferred/SearchUpdateTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/import/ImportTest.php
tests/phpunit/includes/json/FormatJsonTest.php
tests/phpunit/includes/libs/MemoizedCallableTest.php
tests/phpunit/includes/libs/objectcache/MultiWriteBagOStuffTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseMysqlBaseTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php
tests/phpunit/includes/media/GIFHandlerTest.php [new file with mode: 0644]
tests/phpunit/includes/media/GIFTest.php [deleted file]
tests/phpunit/includes/media/JpegPixelFormatTest.php
tests/phpunit/includes/media/PNGHandlerTest.php [new file with mode: 0644]
tests/phpunit/includes/media/PNGTest.php [deleted file]
tests/phpunit/includes/media/SvgHandlerTest.php
tests/phpunit/includes/media/WebPHandlerTest.php [new file with mode: 0644]
tests/phpunit/includes/media/WebPTest.php [deleted file]
tests/phpunit/includes/media/XCFHandlerTest.php [new file with mode: 0644]
tests/phpunit/includes/media/XCFTest.php [deleted file]
tests/phpunit/includes/parser/ParserOutputTest.php
tests/phpunit/includes/parser/TidyTest.php
tests/phpunit/includes/password/LayeredParameterizedPasswordTest.php
tests/phpunit/includes/password/PasswordTestCase.php
tests/phpunit/includes/poolcounter/PoolCounterTest.php
tests/phpunit/includes/search/SearchEnginePrefixTest.php
tests/phpunit/includes/search/SearchSuggestionSetTest.php
tests/phpunit/includes/site/MediaWikiSiteTest.php
tests/phpunit/includes/specials/SpecialBlockTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/specials/SpecialUncategorizedcategoriesTest.php [deleted file]
tests/phpunit/includes/specials/UncategorizedCategoriesPageTest.php [new file with mode: 0644]
tests/phpunit/includes/tidy/RemexDriverTest.php
tests/phpunit/includes/user/UserTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/maintenance/categoryChangesAsRdfTest.php [new file with mode: 0644]
tests/phpunit/maintenance/categoryChangesRdfTest.php [deleted file]
tests/phpunit/maintenance/fetchTextTest.php

index 2f17bc6..d25d525 100644 (file)
@@ -25,6 +25,7 @@ sftp-config.json
 
 # MediaWiki install & usage
 /cache
+/docs/coverage
 /docs/js
 /images/[0-9a-f]
 /images/archive
index 0940e7f..7548bda 100644 (file)
                        Whitelist existing violations, but enable the sniff to prevent
                        any new occurrences.
                -->
-               <exclude-pattern>*/includes/media/XCF\.php</exclude-pattern>
                <exclude-pattern>*/includes/Feed\.php</exclude-pattern>
-               <exclude-pattern>*/includes/libs/xmp/XMP\.php</exclude-pattern>
                <exclude-pattern>*/includes/jobqueue/JobSpecification\.php</exclude-pattern>
                <exclude-pattern>*/includes/RevisionList\.php</exclude-pattern>
                <exclude-pattern>*/includes/installer/PhpBugTests\.php</exclude-pattern>
-               <exclude-pattern>*/includes/exception/LocalizedException\.php</exclude-pattern>
                <exclude-pattern>*/includes/specials/SpecialMostinterwikis\.php</exclude-pattern>
                <exclude-pattern>*/includes/cache/CacheDependency\.php</exclude-pattern>
                <exclude-pattern>*/includes/cache/CacheHelper\.php</exclude-pattern>
                <exclude-pattern>*/profileinfo\.php</exclude-pattern>
                <!-- Language converters use the pattern of 2 classes in one file -->
                <exclude-pattern>*/languages/*\.php</exclude-pattern>
-               <!-- We don't care that much about violations in tests -->
-               <exclude-pattern>*/tests/*\.php</exclude-pattern>
+               <!-- Skip violations in some tests for now -->
+               <exclude-pattern>*/tests/parser/*\.php</exclude-pattern>
+               <exclude-pattern>*/tests/phan/*\.php</exclude-pattern>
+               <exclude-pattern>*/tests/phpunit/maintenance/*\.php</exclude-pattern>
+               <exclude-pattern>*/tests/phpunit/bootstrap\.php</exclude-pattern>
+               <exclude-pattern>*/tests/phpunit/phpunit\.php</exclude-pattern>
        </rule>
        <rule ref="MediaWiki.Files.ClassMatchesFilename.WrongCase">
                <!--
                <exclude-pattern>*/maintenance/storage/checkStorage\.php</exclude-pattern>
                <exclude-pattern>*/maintenance/storage/recompressTracked\.php</exclude-pattern>
                <exclude-pattern>*/maintenance/storage/trackBlobs\.php</exclude-pattern>
-               <!-- We don't care that much about violations in tests -->
-               <exclude-pattern>*/tests/*\.php</exclude-pattern>
+               <!-- Skip violations in some tests for now -->
+               <exclude-pattern>*/tests/phpunit/includes/GlobalFunctions/*\.php</exclude-pattern>
+               <exclude-pattern>*/tests/phpunit/maintenance/*\.php</exclude-pattern>
        </rule>
 
        <rule ref="Generic.Files.OneObjectStructurePerFile.MultipleFound">
                <exclude-pattern>*/includes/api/ApiMessage\.php</exclude-pattern>
                <exclude-pattern>*/includes/api/ApiOpenSearch\.php</exclude-pattern>
                <exclude-pattern>*/includes/api/ApiRsd\.php</exclude-pattern>
-               <exclude-pattern>*/includes/api/ApiUsageException\.php</exclude-pattern>
                <exclude-pattern>*/includes/AuthPlugin\.php</exclude-pattern>
                <exclude-pattern>*/includes/cache/CacheDependency\.php</exclude-pattern>
                <exclude-pattern>*/includes/cache/CacheHelper\.php</exclude-pattern>
                <exclude-pattern>*/includes/deferred/CdnCacheUpdate\.php</exclude-pattern>
                <exclude-pattern>*/includes/diff/DairikiDiff\.php</exclude-pattern>
                <exclude-pattern>*/includes/diff/DiffEngine\.php</exclude-pattern>
-               <exclude-pattern>*/includes/exception/LocalizedException\.php</exclude-pattern>
                <exclude-pattern>*/includes/Feed\.php</exclude-pattern>
                <exclude-pattern>*/includes/filerepo/file/LocalFile\.php</exclude-pattern>
                <exclude-pattern>*/includes/gallery/PackedOverlayImageGallery\.php</exclude-pattern>
                <exclude-pattern>*/includes/libs/filebackend/FSFileBackend\.php</exclude-pattern>
                <exclude-pattern>*/includes/shell/Command\.php</exclude-pattern>
                <exclude-pattern>*/includes/shell/Shell\.php</exclude-pattern>
-               <exclude-pattern>*/tests/phpunit/structure/StructureTest\.php</exclude-pattern>
-       </rule>
-       <rule ref="MediaWiki.Usage.ForbiddenFunctions.exec">
-               <!--
-                       Whitelist existing violations, but enable the sniff to prevent
-                       any new occurrences.
-               -->
-               <exclude-pattern>*/tests/phpunit/structure/StructureTest\.php</exclude-pattern>
        </rule>
        <rule ref="MediaWiki.Usage.ForbiddenFunctions.popen">
                <!--
index 03a4a67..5c4832a 100644 (file)
@@ -30,6 +30,9 @@ production.
   $wgTidyConf, $wgTidyOpts, $wgTidyInternal, and $wgDebugTidy, all
   deprecated since 1.26, have now all been removed. The $wgTidyConfig
   setting remains only for Remex experimental features or debugging.
+* $wgEnableParserCache, deprecated since 1.26, was removed.
+  If disabling the parser cache is still desirable,
+  set `$wgParserCacheType = CACHE_NONE;` instead.
 
 === New features in 1.33 ===
 * (T96041) __EXPECTUNUSEDCATEGORY__ on a category page causes the category
@@ -179,6 +182,7 @@ because of Phabricator reports.
   mediawiki.api.messages, and mediawiki.api.rollback.
 * The 'jquery.byteLimit' module alias for 'jquery.lengthLimit',
   deprecated in 1.31, was removed.
+* Revision::fetchRevision(), deprecated in 1.28, was removed.
 
 === Deprecations in 1.33 ===
 * The configuration option $wgUseESI has been deprecated, and is expected
@@ -215,6 +219,9 @@ because of Phabricator reports.
 * The class WebInstallerOutput is now marked as @private.
 * (T209699) The jquery.async module has been deprecated. JavaScript code that
   needs asynchronous behaviour should use Promises.
+* Password::equals() is deprecated, use verify().
+* BaseTemplate::msgWiki() and QuickTemplate::msgWiki() will be removed. Use
+  other means to fetch a properly escaped message string or Message object.
 
 === Other changes in 1.33 ===
 * (T208871) The hard-coded Google search form on the database error page was
index df1c0b2..2559552 100644 (file)
@@ -648,7 +648,7 @@ $wgAutoloadLocalClasses = [
        'IEUrlExtension' => __DIR__ . '/includes/libs/IEUrlExtension.php',
        'IExpiringStore' => __DIR__ . '/includes/libs/objectcache/IExpiringStore.php',
        'IJobSpecification' => __DIR__ . '/includes/jobqueue/JobSpecification.php',
-       'ILocalizedException' => __DIR__ . '/includes/exception/LocalizedException.php',
+       'ILocalizedException' => __DIR__ . '/includes/exception/ILocalizedException.php',
        'IMaintainableDatabase' => __DIR__ . '/includes/libs/rdbms/database/IMaintainableDatabase.php',
        'IP' => __DIR__ . '/includes/libs/IP.php',
        'IPTC' => __DIR__ . '/includes/media/IPTC.php',
@@ -1699,7 +1699,7 @@ $wgAutoloadLocalClasses = [
        'WithoutInterwikiPage' => __DIR__ . '/includes/specials/SpecialWithoutinterwiki.php',
        'WordLevelDiff' => __DIR__ . '/includes/diff/WordLevelDiff.php',
        'WrapOldPasswords' => __DIR__ . '/maintenance/wrapOldPasswords.php',
-       'XCFHandler' => __DIR__ . '/includes/media/XCF.php',
+       'XCFHandler' => __DIR__ . '/includes/media/XCFHandler.php',
        'XMLRCFeedFormatter' => __DIR__ . '/includes/rcfeed/XMLRCFeedFormatter.php',
        'XMPInfo' => __DIR__ . '/includes/compat/XMPReader.php',
        'XMPReader' => __DIR__ . '/includes/compat/XMPReader.php',
index 2aceca8..845101d 100644 (file)
                "wikimedia/testing-access-wrapper": "~1.0",
                "wmde/hamcrest-html-matchers": "^0.1.0"
        },
+       "replace": {
+               "symfony/polyfill-ctype": "1.99",
+               "symfony/polyfill-mbstring": "1.99"
+       },
        "suggest": {
                "ext-apcu": "Local data cache for greatly improved performance",
                "ext-curl": "Improved http communication abilities",
diff --git a/docs/code-coverage/README b/docs/code-coverage/README
deleted file mode 100644 (file)
index 76ce9bd..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-This directory is for the auto-generated phpunit code coverage.
-Run 'make coverage' in the tests/phpunit subdirectory to build.
index 9df4ab6..00ccc96 100644 (file)
@@ -2660,12 +2660,6 @@ $wgUseFileCache = false;
  */
 $wgFileCacheDepth = 2;
 
-/**
- * Kept for extension compatibility; see $wgParserCacheType
- * @deprecated since 1.26
- */
-$wgEnableParserCache = true;
-
 /**
  * Append a configured value to the parser cache and the sitenotice key so
  * that they can be kept separate for some class of activity.
index 3e0595e..8866a88 100644 (file)
@@ -229,7 +229,6 @@ class FileDeleteForm {
                                        $lbFactory->rollbackMasterChanges( __METHOD__ );
                                }
                        } else {
-                               // Done; nothing changed
                                $dbw->endAtomic( __METHOD__ );
                        }
                }
index c99f88a..e48d4a5 100644 (file)
@@ -33,8 +33,6 @@ use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
-use Wikimedia\Rdbms\ResultWrapper;
-use Wikimedia\Rdbms\FakeResultWrapper;
 
 /**
  * @deprecated since 1.31, use RevisionRecord, RevisionStore, and BlobStore instead.
@@ -299,20 +297,6 @@ class Revision implements IDBAccessObject {
                return $rec === null ? null : new Revision( $rec );
        }
 
-       /**
-        * Return a wrapper for a series of database rows to
-        * fetch all of a given page's revisions in turn.
-        * Each row can be fed to the constructor to get objects.
-        *
-        * @param LinkTarget $title
-        * @return ResultWrapper
-        * @deprecated Since 1.28, no callers in core nor in known extensions. No-op since 1.31.
-        */
-       public static function fetchRevision( LinkTarget $title ) {
-               wfDeprecated( __METHOD__, '1.31' );
-               return new FakeResultWrapper( [] );
-       }
-
        /**
         * Return the value of a select() JOIN conds array for the user table.
         * This will get user table rows for logged-in users.
index 1a7831b..95749c5 100644 (file)
@@ -62,7 +62,7 @@ abstract class RevisionRecord {
        protected $mWiki = false;
        /** @var int|null */
        protected $mId;
-       /** @var int|null */
+       /** @var int */
        protected $mPageId;
        /** @var UserIdentity|null */
        protected $mUser;
index 4ebe426..23342e9 100644 (file)
@@ -194,10 +194,6 @@ if ( $wgGitInfoCacheDirectory === false && $wgCacheDirectory !== false ) {
        $wgGitInfoCacheDirectory = "{$wgCacheDirectory}/gitinfo";
 }
 
-if ( $wgEnableParserCache === false ) {
-       $wgParserCacheType = CACHE_NONE;
-}
-
 // Fix path to icon images after they were moved in 1.24
 if ( $wgRightsIcon ) {
        $wgRightsIcon = str_replace(
index 6cbdcc6..e25f0f0 100644 (file)
@@ -1104,10 +1104,10 @@ class PageUpdater {
                // TODO: move to storage service
                $newid = $wikiPage->insertOn( $dbw );
                if ( $newid === false ) {
-                       $dbw->endAtomic( __METHOD__ ); // nothing inserted
+                       $dbw->endAtomic( __METHOD__ );
                        $status->fatal( 'edit-already-exists' );
 
-                       return $status; // nothing done
+                       return $status;
                }
 
                // At this point we are now comitted to returning an OK
index 6ada9b3..f5904e2 100644 (file)
@@ -1835,7 +1835,7 @@ class Title implements LinkTarget, IDBAccessObject {
         * @endcode
         *
         * @param string $text The subpage name to add to the title
-        * @return Title Subpage title
+        * @return Title|null Subpage title, or null on an error
         * @since 1.20
         */
        public function getSubpage( $text ) {
index 53722c9..ce0a877 100644 (file)
@@ -51,7 +51,8 @@
        "apihelp-block-param-watchuser": "לעקוב אחרי דף המשתמש ודף השיחה של המשתמש או של כתובת ה־IP.",
        "apihelp-block-param-tags": "תגי שינוי שיחולו על העיול ביומן החסימה.",
        "apihelp-block-param-partial": "חסימת משתמש מעריכת דפים או מרחבי שם מסוימים ולא מכל האתר.",
-       "apihelp-block-param-pagerestrictions": "רשימת כותרות שהמשתמש ייחסם מלערוך. חל רק כאשר \"partial\" מוגדר ל־true.",
+       "apihelp-block-param-pagerestrictions": "רשימת כותרות שהמשתמש ייחסם מלערוך. חל רק כאשר <var>partial</var> מוגדר ל־true.",
+       "apihelp-block-param-namespacerestrictions": "רשימת מזהי מרחב שם שהמשתמש ייחסם מעריכתם. חל רק כאשר <var>partial</var> מוגדר ל־true.",
        "apihelp-block-example-ip-simple": "חסימת כתובת ה־IP‏ <kbd>192.0.2.5</kbd> לשלושה ימים עם הסיבה <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "חסימת המשתמש <kbd>Vandal</kbd> ללא הגבלת זמן עם הסיבה <kbd>Vandalism</kbd>, ומניעת יצירת חשבונות חדשים ושליחת דוא\"ל.",
        "apihelp-changeauthenticationdata-summary": "שינוי נתוני אימות עבור המשתמש הנוכחי.",
index a810d21..d834337 100644 (file)
        "apihelp-undelete-param-tags": "Modifica etichette da applicare all'elemento del registro delle cancellazioni.",
        "apihelp-unlinkaccount-summary": "Rimuove un'utenza di terze parti collegata all'utente corrente.",
        "apihelp-unlinkaccount-example-simple": "Tentativo di rimuovere il collegamento dell'utente corrente per il provider associato con <kbd>FooAuthenticationRequest</kbd>.",
-       "apihelp-upload-param-watch": "Osserva la pagina.",
+       "apihelp-upload-param-watch": "Aggiungi agli osservati speciali.",
        "apihelp-upload-param-file": "Contenuto del file.",
        "apihelp-upload-example-url": "Carica da un URL.",
        "apihelp-userrights-param-user": "Nome utente.",
index 02ae87c..d14ac5a 100644 (file)
@@ -44,7 +44,8 @@
        "apihelp-block-param-watchuser": "Vigiar as páginas de utilizador e de discussão, do utilizador ou do endereço IP.",
        "apihelp-block-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de bloqueios.",
        "apihelp-block-param-partial": "Bloquear o utilizador de aceder a páginas ou espaços nominais específicos, em vez de a todo o ''site''.",
-       "apihelp-block-param-pagerestrictions": "Lista de títulos que o bloqueio impedirá o utilizador de editar. Só se aplica quando 'partial' (parcial) estiver definido como 'true' (verdadeiro).",
+       "apihelp-block-param-pagerestrictions": "Lista de títulos que o bloqueio impedirá o utilizador de editar. Só se aplica quando <var>partial</var> (parcial) estiver definido como 'true' (verdadeiro).",
+       "apihelp-block-param-namespacerestrictions": "Lista de identificadores dos espaços nominais que o bloqueio impedirá o utilizador de editar. Só se aplica quando <var>partial</var> (parcial) estiver definido como 'true' (verdadeiro).",
        "apihelp-block-example-ip-simple": "Bloquear o endereço IP <kbd>192.0.2.5</kbd> por três dias com o motivo <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Bloquear o utilizador <kbd>Vandal</kbd> indefinidamente com o motivo <kbd>Vandalism</kbd>, e impedir a criação de nova conta e o envio de correio eletrónico.",
        "apihelp-changeauthenticationdata-summary": "Alterar os dados de autenticação do utilizador atual.",
index b2bf97f..77d23e9 100644 (file)
@@ -57,7 +57,7 @@
        "apihelp-changeauthenticationdata-summary": "為目前使用者變更身分核對資料。",
        "apihelp-changeauthenticationdata-example-password": "嘗試更改目前使用者的密碼至 <kbd>ExamplePassword</kbd>。",
        "apihelp-checktoken-summary": "檢查來自 <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> 的權杖有效性。",
-       "apihelp-checktoken-param-type": "要測試的密鑰類型。",
+       "apihelp-checktoken-param-type": "要測試的權杖類型。",
        "apihelp-checktoken-param-token": "要測試的權杖。",
        "apihelp-checktoken-param-maxtokenage": "權杖的有效期間,以秒為單位。",
        "apihelp-checktoken-example-simple": "測試 <kbd>csrf</kbd> 權杖的有效性。",
        "apihelp-createaccount-param-language": "要設定的使用者預設語言代碼 (選填,預設依據內容語言)。",
        "apihelp-createaccount-example-pass": "建立使用者 <kbd>testuser</kbd> 使用密碼 <kbd>test123</kbd>",
        "apihelp-createaccount-example-mail": "建立使用者 <kbd>testmailuser</kbd> 並且電子郵件通知隨機產生的密碼。",
+       "apihelp-cspreport-summary": "由瀏覽器所使用來回報違反內容安全方針。此模組應永不使用,除了是在被由兼容內容安全方針的網路瀏覽器所使用情況下。",
        "apihelp-cspreport-param-reportonly": "標記為來自監視方針而非強制方針的回報",
        "apihelp-cspreport-param-source": "生成觸發此報告之 CSP 標頭的事物",
        "apihelp-delete-summary": "刪除頁面。",
        "apihelp-logout-summary": "登出並清除 session 資料。",
        "apihelp-logout-example-logout": "登出當前使用者",
        "apihelp-managetags-summary": "執行相關到更改標籤的管理任務。",
+       "apihelp-managetags-param-operation": "要執行的操作:\n;create:創建一個供手動使用的新更改標籤。\n;delete:從資料庫移除一個更改標籤,包含移除來自於所有修訂、近期變更項目以及日誌項目的所被使用標籤。\n;activate:啟用一個更改標籤,允許使用者手動套用。\n;deactivate:棄用一個更改標籤,不允許使用者手動套用。",
        "apihelp-managetags-param-tag": "要創建、刪除、啟用或停用的標籤。要標籤創建,標籤必須不存在。要標籤刪除,標籤必須存在。要標籤啟用,標籤必須存在且不能被任何擴充使用到。要標籤停用,標籤必須目前為啟用並且有被手動定義。",
        "apihelp-managetags-param-reason": "創建、刪除、啟用、或停用標籤的原因(可選)。",
        "apihelp-managetags-param-ignorewarnings": "是否在處理期間發生問題時忽略任何警告。",
        "apihelp-mergehistory-param-fromid": "要合併歷史的頁面之頁面 ID。不能與 <var>$1from</var> 一起使用。",
        "apihelp-mergehistory-param-to": "要合併歷史的頁面標題。不能與 <var>$1toid</var> 一起使用。",
        "apihelp-mergehistory-param-toid": "要合併歷史的頁面之頁面 ID。不能與 <var>$1to</var> 一起使用。",
+       "apihelp-mergehistory-param-timestamp": "要從來源頁面歷史裡移動至目標頁面歷史之修訂的時間戳記。若省略掉的話,來源頁面的整個頁面歷史將會合併至目標頁面。",
        "apihelp-mergehistory-param-reason": "合併歷史的原因。",
        "apihelp-mergehistory-example-merge": "將<kbd>Oldpage</kbd>的整個歷史合併至<kbd>Newpage</kbd>。",
        "apihelp-mergehistory-example-merge-timestamp": "將<kbd>Oldpage</kbd>直至<kbd>2015-12-31T04:37:41Z</kbd>的頁面修訂版本合併至<kbd>Newpage</kbd>。",
        "apihelp-paraminfo-example-1": "顯示 <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>、<kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>、<kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd>、和 <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> 的資訊。",
        "apihelp-paraminfo-example-2": "顯示 <kbd>[[Special:ApiHelp/query|action=query]]</kbd> 所有子模組的資訊。",
        "apihelp-parse-summary": "解析內容併回傳解析器輸出。",
+       "apihelp-parse-extended-description": "查看 <kbd>[[Special:ApiHelp/query|action=query]]</kbd> 的各種道具模組來從目前頁面版本取得資訊。\n\n以下有幾種方式來解析指定文字:\n# 要指定頁面或修訂,請使用 <var>$1page</var>、<var>$1pageid</var>、或是 <var>$1oldid</var>。\n# 要指定明確內容,請使用 <var>$1text</var>、<var>$1title</var>、<var>$1revid</var> 以及 <var>$1contentmodel</var>。\n# 要指定解析的摘要,<var>$1prop</var> 應提供一個空值。",
        "apihelp-parse-param-title": "文字所屬的頁面標題。若省略,需要指定 <var>$1contentmodel</var>,且 [[API]] 會用為標題使用。",
        "apihelp-parse-param-text": "要解析的文字。使用 <var>$1title</var> 或 <var>$1contentmodel</var> 來控制內容模組。",
        "apihelp-parse-param-revid": "修訂 ID,用於 <code><nowiki>{{REVISIONID}}</nowiki></code> 和相似變數。",
        "apihelp-query+imageinfo-param-urlwidth": "若 $2prop=url 有設定,會回傳前至縮放成此寬度圖片的 URL。\n出於效能因素,若有使用此項目時不會回傳超過 $1 張縮放圖片。",
        "apihelp-query+imageinfo-param-urlheight": "與 $1urlwidth 相似。",
        "apihelp-query+imageinfo-param-metadataversion": "要使用的詮釋資料版本。若有指定 <kbd>latest</kbd>,會使用最新版本。預設為 <kbd>1</kbd>,以便向下兼容。",
+       "apihelp-query+imageinfo-param-extmetadatalanguage": "要檢索 extmetadata 的語言。此會影響檢索到的翻譯,若有多個可用語言的話,還會影響到像是數字與各種值的格式。",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "若用於 extmetadata 屬性的翻譯可用,則全部索取。",
        "apihelp-query+imageinfo-param-extmetadatafilter": "若有指定且非空,僅會為 $1prop=extmetadata 回傳這些鍵。",
        "apihelp-query+imageinfo-param-urlparam": "處理器特定參數字串。例如 PDFs 可使用 <kbd>page15-100px</kbd>。必須要使用到 <var>$1urlwidth</var> 且要與 <var>$1urlparam</var> 一致。",
        "apihelp-query+redirects-example-simple": "取得 [[Main Page]] 的重新導向清單",
        "apihelp-query+redirects-example-generator": "取得所有重新導向至 [[Main Page]] 的資訊。",
        "apihelp-query+revisions-summary": "取得修訂的資訊。",
+       "apihelp-query+revisions-extended-description": "能以多種方式使用:\n# 透過設定標題或頁面 ID 來取得有關頁面集(最新修訂)的資料。\n# 透過使用標題或是帶有起始、結束、限制的頁面 ID 來取得指定頁面的修訂。\n# 透過以 revid 設定 ID 來取得有關修訂集的資料。",
        "apihelp-query+revisions-paraminfo-singlepageonly": "僅能在單一頁面使用(模式 #2)。",
        "apihelp-query+revisions-param-startid": "從這個修訂時間戳記開始列舉。修訂必須要存在,但不需屬於此頁面。",
        "apihelp-query+revisions-param-endid": "在這個修訂時間戳記停止列舉。修訂必須要存在,但不需屬於此頁面。",
        "apihelp-query+siteinfo-example-interwiki": "索取本地端跨 wiki 前綴的清單。",
        "apihelp-query+siteinfo-example-replag": "檢查目前的響應延遲。",
        "apihelp-query+stashimageinfo-summary": "回傳多筆儲藏檔案的檔案資訊。",
+       "apihelp-query+stashimageinfo-param-filekey": "識別前一個為臨時儲藏上傳的鍵。",
        "apihelp-query+stashimageinfo-param-sessionkey": "$1filekey的別名,用於向下相容性。",
        "apihelp-query+stashimageinfo-example-simple": "回傳儲藏檔案的檔案資訊。",
        "apihelp-query+stashimageinfo-example-params": "回傳縮圖或兩個已儲藏檔案。",
        "apihelp-unlinkaccount-summary": "移除目前使用者所連結到的第三方帳號。",
        "apihelp-unlinkaccount-example-simple": "以 <kbd>FooAuthenticationRequest</kbd> 嘗試移除目前使用者的關聯供應者連結.",
        "apihelp-upload-summary": "上傳檔案,或取得等待上傳的狀態。",
+       "apihelp-upload-extended-description": "有以下方式可用:\n* 直接上傳檔案內容,請使用 <var>$1file</var> 參數。\n* 分批上傳檔案,請使用 <var>$1filesize</var>、<var>$1chunk</var>、以及 <var>$1offset</var> 參數。\n* 擁有 MediaWiki 伺服器來從 URL 來檢索檔案,請使用 <var>$1url</var> 參數。\n* 要完成一個稍早出於警告而失敗的上傳,請使用 <var>$1filekey</var> 參數。\n請注意當發送 <var>$1file</var> 時,HTTP POST 必須用做為檔案上傳(註:使用 <code>multipart/form-data</code>)。",
        "apihelp-upload-param-filename": "目標檔案名稱。",
        "apihelp-upload-param-comment": "上傳註釋。如果 <var>$1text</var> 未指定的話,也會作為新檔案用的初始頁面文字。",
        "apihelp-upload-param-tags": "更改標籤來套用到上傳日誌項目以及檔案頁面修訂。",
        "apihelp-upload-param-ignorewarnings": "忽略所有警告。",
        "apihelp-upload-param-file": "檔案內容。",
        "apihelp-upload-param-url": "索取檔案的來源 URL。",
+       "apihelp-upload-param-filekey": "識別前一個為臨時儲藏上傳的鍵。",
        "apihelp-upload-param-sessionkey": "如同 $1filekey,維持向下相容性。",
        "apihelp-upload-param-stash": "若設定的話,伺服器將會把檔案臨時暫存;而不是添加至儲存庫裡。",
        "apihelp-upload-param-filesize": "整體上傳的檔案大小。",
        "apihelp-userrights-param-user": "使用者名稱。",
        "apihelp-userrights-param-userid": "使用者ID。",
        "apihelp-userrights-param-add": "加入使用者至這些群組;若已是成員,則更新期限時間。",
+       "apihelp-userrights-param-expiry": "期限時間戳記。可以是相對時間(例如:<kbd>5 months</kbd> 或 <kbd>2 weeks</kbd>)或是絕對時間(例如:<kbd>2014-09-18T12:34:56Z</kbd>)。如果僅設定一個時間戳記,會為所有群組傳遞給 <var>$1add</var> 參數。對於永不逾期的群組,請使用 <kbd>infinite</kbd>、<kbd>infinity</kbd>、或 <kbd>never</kbd>。",
        "apihelp-userrights-param-remove": "從這些群組移除使用者。",
        "apihelp-userrights-param-reason": "變更的原因。",
        "apihelp-userrights-param-tags": "在使用者權限日誌裡更改套用到項目的標籤。",
        "apihelp-watch-example-unwatch": "取消監視頁面 <kbd>Main Page</kbd>。",
        "apihelp-watch-example-generator": "監視在主命名空間最前的幾個頁面。",
        "apihelp-format-example-generic": "以 $1 格式傳回查詢結果。",
+       "apihelp-format-param-wrappedhtml": "回傳作為 JSON 物件的美觀列印 HTML 內容以及關聯 ResourceLoader 模組。",
        "apihelp-json-summary": "使用 JSON 格式輸出資料。",
        "apihelp-json-param-callback": "若有指定,將輸出包在指定的函式調用。出於安全考量,會限制所有使用者特定資料。",
        "apihelp-json-param-utf8": "若有指定的話,將多數(並非全部)非 ASCII 字元編碼成 UTF-8,而不是以十六進位轉義序列來取代掉。預設是當 <var>formatversion</var> 不是 <kbd>1</kbd> 時。",
        "apierror-cantsend": "您尚未登入,您沒有已確認的電子郵件地址,或是您未被允許發送電子郵件給其他人,因此您不能發送電子郵件。",
        "apierror-cantundelete": "無法取消刪除:請求的修訂可能不存在,或是可能已被取消刪除。",
        "apierror-changeauth-norequest": "建立更改請求失敗。",
+       "apierror-chunk-too-small": "對於非最終塊,最小塊的大小為 $1 {{PLURAL:$1|位元組|位元組}}。",
        "apierror-cidrtoobroad": "不能接受超出 /$2 的 $1 CIDR 範圍。",
        "apierror-compare-maintextrequired": "當 <var>$1slots</var> 包含 <kbd>main</kbd> 時,需要參數 <var>$1text-main</var>(不能刪除主要部份)。",
        "apierror-compare-no-title": "無法在不帶標題之下預先儲存轉換。請嘗試指定 <var>fromtitle</var> 或 <var>totitle</var>。",
        "apierror-compare-notext": "參數 <var>$1</var> 不能在缺少 <var>$2</var> 的情況下使用。",
        "apierror-compare-notorevision": "沒有「to」修訂。請指定 <var>torev</var>、<var>totitle</var>、或 <var>toid</var>。",
        "apierror-compare-relative-to-deleted": "相關已刪除修訂時不能使用 <kbd>torelative=$1</kbd>。",
+       "apierror-compare-relative-to-nothing": "沒有相關 <var>torelative</var> 的 'from' 修訂。",
        "apierror-contentserializationexception": "內容序列化失敗:$1",
        "apierror-contenttoobig": "您所提供的內容超出條目的 $1 {{PLURAL:$1|位元組|位元組}}限制。",
        "apierror-copyuploadbaddomain": "不允許從此網域來透過 URL 上傳。",
        "apierror-integeroutofrange-abovemax": "對於使用者而言,<var>$1</var> 不能超過 $2(設定為 $3)。",
        "apierror-integeroutofrange-belowminimum": "<var>$1</var> 不能小於 $2(設定為 $3)。",
        "apierror-invalidcategory": "您所輸入的分類名稱無效。",
+       "apierror-invalid-chunk": "偏移量加上目前部分大於所聲稱的檔案大小。",
        "apierror-invalidexpiry": "無效的期限時間「$1」。",
        "apierror-invalid-file-key": "不是有效的檔案鍵。",
        "apierror-invalidlang": "用於參數 <var>$1</var> 的語言代碼無效。",
        "apierror-writeapidenied": "您不被允許透過 API 來編輯此 wiki。",
        "apiwarn-alldeletedrevisions-performance": "為了在產生標題時能有更好效能,請設定 <kbd>$1dir=newer</kbd>。",
        "apiwarn-badurlparam": "無法解析$2的 <var>$1urlparam</var>。這僅能用在寬度與高度。",
+       "apiwarn-badutf8": "傳遞給 <var>$1</var> 的值包含無效或非標準化資料。正文資料應得是有效、不帶有 HT(\\t)、LF(\\n)、以及 CR(\\r)以外 C0 控制字元的 NFC 標準化萬國碼。",
        "apiwarn-checktoken-percentencoding": "在 URL 裡進行適當百分比編碼的權杖中,檢查像是「+」的符號。",
        "apiwarn-compare-no-next": "修訂 $2 是$1的最新修訂,<kbd>torelative=next</kbd> 目前沒有可用來比較的修訂。",
        "apiwarn-compare-no-prev": "修訂 $2 是$1的最初修訂,<kbd>torelative=prev</kbd> 目前沒有可用來比較的修訂。",
        "apiwarn-tokennotallowed": "「$1」操作不允許目前的使用者。",
        "apiwarn-tokens-origin": "當未套用相同來源方針,權杖可能無法取得。",
        "apiwarn-truncatedresult": "結果會被截短,否則將會大於 $1 位元組限制。",
+       "apiwarn-unclearnowtimestamp": "傳遞給時間戳記參數 <var>$1</var> 的值「$2」已被棄用。若出於某些原因您需要不計算客戶端來明確指定時間,請使用 <kbd>now</kbd>。",
        "apiwarn-unrecognizedvalues": "參數 <var>$1</var> 有無法識別的{{PLURAL:$3|值|值}}:$2。",
        "apiwarn-unsupportedarray": "參數 <var>$1</var> 使用了不被支援的 PHP 陣列語法。",
        "apiwarn-validationfailed-badchars": "在鍵裡的字元無效(僅允許 <code>a-z</code>、<code>A-Z</code>、<code>0-9</code>、<code>_</code>、和 <code>-</code> are allowed)。",
index c538ee7..e9adb7e 100644 (file)
@@ -120,12 +120,12 @@ class LocalPasswordPrimaryAuthenticationProvider
                }
 
                $pwhash = $this->getPassword( $row->user_password );
-               if ( !$pwhash->equals( $req->password ) ) {
+               if ( !$pwhash->verify( $req->password ) ) {
                        if ( $this->config->get( 'LegacyEncoding' ) ) {
                                // Some wikis were converted from ISO 8859-1 to UTF-8, the passwords can't be converted
                                // Check for this with iconv
                                $cp1252Password = iconv( 'UTF-8', 'WINDOWS-1252//TRANSLIT', $req->password );
-                               if ( $cp1252Password === $req->password || !$pwhash->equals( $cp1252Password ) ) {
+                               if ( $cp1252Password === $req->password || !$pwhash->verify( $cp1252Password ) ) {
                                        return $this->failResponse( $req );
                                }
                        } else {
index 0ef13b3..045f791 100644 (file)
@@ -146,7 +146,7 @@ class TemporaryPasswordPrimaryAuthenticationProvider
                }
 
                $pwhash = $this->getPassword( $row->user_newpassword );
-               if ( !$pwhash->equals( $req->password ) ) {
+               if ( !$pwhash->verify( $req->password ) ) {
                        return $this->failResponse( $req );
                }
 
index b5574f9..72f6eaa 100644 (file)
@@ -149,7 +149,6 @@ class BlockRestriction {
                                $restrictions
                        );
 
-                       // Nothing to remove.
                        if ( empty( $restrictionsToRemove ) ) {
                                continue;
                        }
index 8ca480f..8540756 100644 (file)
@@ -1463,7 +1463,7 @@ class DifferenceEngine extends ContextSource {
                        return self::intermediateEditsMsg( $nEdits, $numUsers, $limit );
                }
 
-               return ''; // nothing
+               return '';
        }
 
        /**
diff --git a/includes/exception/ILocalizedException.php b/includes/exception/ILocalizedException.php
new file mode 100644 (file)
index 0000000..048da42
--- /dev/null
@@ -0,0 +1,33 @@
+<?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
+ */
+
+/**
+ * Interface for MediaWiki-localized exceptions
+ *
+ * @since 1.29
+ * @ingroup Exception
+ */
+interface ILocalizedException {
+       /**
+        * Return a Message object for this exception
+        * @return Message
+        */
+       public function getMessageObject();
+}
index c0182d5..082d665 100644 (file)
  * @file
  */
 
-/**
- * Interface for MediaWiki-localized exceptions
- *
- * @since 1.29
- * @ingroup Exception
- */
-interface ILocalizedException {
-       /**
-        * Return a Message object for this exception
-        * @return Message
-        */
-       public function getMessageObject();
-}
-
 /**
  * Basic localized exception.
  *
index ef70467..e6b2892 100644 (file)
@@ -95,7 +95,7 @@ class GuzzleHttpRequest extends MWHttpRequest {
         * If a sink is already specified, this does nothing.  This causes the 'sink' constructor
         * option to override the 'callback' constructor option.
         *
-        * @param $callback|null $callback
+        * @param callable|null $callback
         * @throws InvalidArgumentException
         */
        protected function doSetCallback( $callback ) {
index 3b56f21..065667d 100644 (file)
@@ -333,7 +333,7 @@ abstract class MWHttpRequest implements LoggerAwareInterface {
         * Worker function for setting callbacks.  Calls can originate both internally and externally
         * via setCallback).  Defaults to the internal read callback if $callback is null.
         *
-        * @param $callback|null $callback
+        * @param callable|null $callback
         * @throws InvalidArgumentException
         */
        protected function doSetCallback( $callback ) {
index 806c073..a212289 100644 (file)
@@ -89,7 +89,7 @@
        "config-using-32bit": "<strong>تحذير:</strong> يبدو أن نظامك يعمل مع الأعداد الصحيحة 32 بت، هذا [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit لا يُنصَح به].",
        "config-db-type": "نوع قاعدة البيانات:",
        "config-db-host": "مضيف قاعدة البيانات:",
-       "config-db-host-help": "إذا كان خادم قاعدة البيانات موجودا في خادم مختلف، فأدخل اسم المضيف أو عنوان الآيبي هنا. \n\nإذا كنت تستخدم استضافة ويب مشتركة، فيجب أن يمنحك موفر الاستضافة اسم المضيف الصحيح في وثائقه. \n\nإذا كنت تقوم بالتثبيت على خادم ويندوز واستخدام MySQL، فإن استخدام \"localhost\" قد لا يعمل لاسم الخادم، إذا لم يتم ذلك، فجرب \"127.0.0.1\" لعنوان الآيبي المحلي. \n\nإذا كنت تستخدم PostgreSQL، فاترك هذا الحقل فارغا للاتصال عبر مقبس Unix.",
+       "config-db-host-help": "إذا كان خادم قاعدة البيانات موجودا في خادم مختلف، فأدخل اسم المضيف أو عنوان الآيبي هنا. \n\nإذا كنت تستخدم استضافة ويب مشتركة، فيجب أن يمنحك موفر الاستضافة اسم المضيف الصحيح في وثائقه. \n\nإذا كنت تستخدم MySQL، فإن استخدام \"localhost\" قد لا يعمل لاسم الخادم، إذا لم يتم ذلك، فجرب \"127.0.0.1\" لعنوان الآيبي المحلي. \n\nإذا كنت تستخدم PostgreSQL، فاترك هذا الحقل فارغا للاتصال عبر مقبس Unix.",
        "config-db-host-oracle": "قاعدة بيانات TNS:",
        "config-db-host-oracle-help": "أدخل [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm اسم اتصال محلي] صالحا، يجب أن يكون ملف tnsnames.ora مرئيا لهذا التثبيت.<br />إذا كنت تستخدم مكتبات العملاء 10g أو أحدث، فيمكنك أيضا استخدام طريقة التسمية [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.اتصال htm السهل].",
        "config-db-wiki-settings": "حدِّد هذا الويكي",
        "config-invalid-db-server-oracle": "TNS قاعدة بيانات غير صالحة \"$1\";\nاستخدم إما \"اسم TNS\" أو سلسلة \"الاتصال السهل\" \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm طرقلتسمية في أوراكل]).",
        "config-invalid-db-name": "اسم قاعدة بيانات غير صالح \"$1\". \nاستخدم فقط أحرف أسكي (az، AZ) وأرقاما (0-9) وشرطات سفلية (_).",
        "config-invalid-db-prefix": "بادئة قاعدة بيانات غير صالحة \"$1\". \nاستخدم فقط أحرف أسكي (az، AZ) وأرقاما (0-9) وشرطات سفلية (_).",
-       "config-connection-error": "$1.\nتحقق من المضيف، واسم المستخدم وكلمة المرور وحاول مرة أخرى.",
+       "config-connection-error": "$1.\n\nتحقق من المضيف، واسم المستخدم وكلمة المرور وحاول مرة أخرى، إذا كنت تستخدم \"المضيف المحلي\" كمضيف قاعدة بيانات، فحاول استخدام \"127.0.0.1\" بدلا من ذلك (أو العكس).",
        "config-invalid-schema": "مخطط غير صالح لميدياويكي \"$1\". \nاستخدم فقط أحرف أسكي (az، AZ) وأرقاما (0-9) وشرطات سفلية (_).",
        "config-db-sys-create-oracle": "المثبت يعتمد باستخدام حساب SYSDBA فقط لإنشاء حساب جديد.",
        "config-db-sys-user-exists-oracle": "حساب المستخدم \"$1\" موجود بالفعل; يمكن استخدام SYSDBA لإنشاء حساب جديد فقط!",
index bddfb0a..b618f7a 100644 (file)
@@ -89,7 +89,7 @@
        "config-using-32bit": "<strong>Upozornění:</strong> Vypadá to, že váš systém běží s 32bitovými celými čísly. To [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit se nedoporučuje].",
        "config-db-type": "Typ databáze:",
        "config-db-host": "Databázový server:",
-       "config-db-host-help": "Pokud je váš databázový server na jiném počítači, zadejte zde jméno stroje nebo IP adresu.\n\nPokud používáte sdílený webový hosting, váš poskytovatel by vám měl v dokumentaci sdělit správné jméno stroje.\n\nPokud instalujete na server běžící na Windows a používáte MySQL, jméno „localhost“ nemusí fungovat. V takovém případě zkuste jako místní IP adresu zadat „127.0.0.1“.\n\nPokud používáte PostgreSQL, můžete se připojit Unixovými sockety tak, že toto pole necháte prázdné.",
+       "config-db-host-help": "Pokud je váš databázový server na jiném počítači, zadejte zde jméno stroje nebo IP adresu.\n\nPokud používáte sdílený webový hosting, váš poskytovatel by vám měl v dokumentaci sdělit správné jméno stroje.\n\nPokud používáte MySQL, jméno „localhost“ nemusí fungovat. V takovém případě zkuste jako místní IP adresu zadat „127.0.0.1“.\n\nPokud používáte PostgreSQL, můžete se připojit Unixovými sockety tak, že toto pole necháte prázdné.",
        "config-db-host-oracle": "Databázové TNS:",
        "config-db-host-oracle-help": "Zadejte platné [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; tato instalace musí vidět soubor tnsnames.ora.<br />Pokud používáte klientské knihovny verze 10g nebo novější, můžete také používat názvy [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Identifikace této wiki",
index 8bf9799..2a6aa23 100644 (file)
@@ -94,7 +94,7 @@
        "config-using-32bit": "<strong>Warnung:</strong> Es scheint, als ob dein System mit 32-Bit-Ganzzahlen läuft. Dies wird [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit nicht empfohlen].",
        "config-db-type": "Datenbanksystem:",
        "config-db-host": "Datenbankserver:",
-       "config-db-host-help": "Sofern sich die Datenbank auf einem anderen Server befindet, ist hier der Servername oder die entsprechende IP-Adresse anzugeben.\n\nSofern ein gemeinschaftlich genutzter Server verwendet wird, sollte der Hoster den zutreffenden Servernamen in seiner Dokumentation angegeben haben.\n\nSofern auf einem Windows-Server installiert und MySQL genutzt wird, funktioniert der Servername „localhost“ voraussichtlich nicht. Wenn nicht, sollte  „127.0.0.1“ oder die lokale IP-Adresse angegeben werden.\n\nSofern PostgresQL genutzt wird, muss dieses Feld leer gelassen werden, um über ein Unix-Socket zu verbinden.",
+       "config-db-host-help": "Sofern sich die Datenbank auf einem anderen Server befindet, ist hier der Servername oder die entsprechende IP-Adresse anzugeben.\n\nSofern ein gemeinschaftlich genutzter Server verwendet wird, sollte der Hoster den zutreffenden Servernamen in seiner Dokumentation angegeben haben.\n\nSofern MySQL genutzt wird, funktioniert der Servername „localhost“ voraussichtlich nicht. Wenn nicht, sollte „127.0.0.1“ oder die lokale IP-Adresse angegeben werden.\n\nSofern PostgresQL genutzt wird, muss dieses Feld leer gelassen werden, um über ein Unix-Socket zu verbinden.",
        "config-db-host-oracle": "Datenbank-TNS:",
        "config-db-host-oracle-help": "Einen gültigen [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm „Local Connect“-Namen] angeben. Die „tnsnames.ora“-Datei muss von dieser Installation erkannt werden können.<br />Sofern die Client-Bibliotheken für Version 10g oder neuer verwendet werden, kann auch [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm „Easy Connect“] zur Namensgebung genutzt werden.",
        "config-db-wiki-settings": "Bitte Daten zur eindeutigen Identifikation dieses Wikis angeben",
        "config-invalid-db-server-oracle": "Ungültiges Datenbank-TNS „$1“.\nEntweder „TNS Name“ oder eine „Easy Connect“-Zeichenfolge verwenden ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle-Benennungsmethoden])",
        "config-invalid-db-name": "Ungültiger Datenbankname „$1“.\nEs dürfen nur ASCII-codierte Buchstaben (a-z, A-Z), Zahlen (0-9), Unter- (_) sowie Bindestriche (-) verwendet werden.",
        "config-invalid-db-prefix": "Ungültiger Datenbanktabellenpräfix „$1“.\nEs dürfen nur ASCII-codierte Buchstaben (a-z, A-Z), Zahlen (0-9), Unter- (_) sowie Bindestriche (-) verwendet werden.",
-       "config-connection-error": "$1.\n\nBitte unten angegebenen Servernamen, Benutzernamen sowie das Passwort überprüfen und es danach erneut versuchen.",
+       "config-connection-error": "$1.\n\nBitte unten angegebenen Servernamen, Benutzernamen sowie das Passwort überprüfen und es danach erneut versuchen. Falls „localhost“ als Datenbankhost verwendet wird, versuche stattdessen „127.0.0.1“ (oder umgekehrt).",
        "config-invalid-schema": "Ungültiges Datenschema für MediaWiki „$1“.\nEs dürfen nur ASCII-codierte Buchstaben (a-z, A-Z), Zahlen (0-9) und Unterstriche (_) verwendet werden.",
        "config-db-sys-create-oracle": "Das Installationsprogramm unterstützt nur die Verwendung eines Datenbankbenutzerkontos mit SYSDBA-Berechtigung zum Anlegen eines neuen Datenbankbenutzerkontos.",
        "config-db-sys-user-exists-oracle": "Das Datenbankbenutzerkonto „$1“ ist bereits vorhanden. Ein Datenbankbenutzerkontos mit SYSDBA-Berechtigung kann nur zum Anlegen eines neuen Datenbankbenutzerkontos genutzt werden.",
index 9c24b34..7ec2934 100644 (file)
@@ -36,7 +36,8 @@
                        "Tinss",
                        "KATRINE1992",
                        "MarcoAurelio",
-                       "Adjen"
+                       "Adjen",
+                       "Dschultz"
                ]
        },
        "config-desc": "El instalador de MediaWiki",
        "config-invalid-db-server-oracle": "El TNS de la base de datos «$1» es inválido.\nDebes usar un \"TNS Name\" o una cadena \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Nomenclatura de Oracle]).",
        "config-invalid-db-name": "El nombre de la base de datos \"$1\" no es válido.\nUsa sólo caracteres ASCII: letras (a-z, A-Z), números (0-9), guiones bajos (_) y guiones (-).",
        "config-invalid-db-prefix": "El prefijo de la base de datos \"$1\" no es válido.\nUsa sólo caracteres ASCII: letras (a-z, A-Z), números (0-9), guiones bajos (_) y guiones (-).",
-       "config-connection-error": "$1.\n\nVerifica el servidor, el nombre de usuario y la contraseña, e intenta de nuevo.",
+       "config-connection-error": "$1.\n\nControl el anfitrión, username y contraseña y probar otra vez. Si utilizando \"localhost\" como el anfitrión de base de datos, prueba utilizar \"127.0.0.1\" en cambio (o viceversa).",
        "config-invalid-schema": "El esquema de la base de datos \"$1\"  es inválido.\nUse sólo carateres ASCII: letras (a-z, A-Z), guarismos (0-9) y guiones bajos (_).",
        "config-db-sys-create-oracle": "El instalador sólo admite el empleo de cuentas SYSDBA como método para crear una cuenta nueva.",
        "config-db-sys-user-exists-oracle": "La cuenta de usuario «$1» ya existe. SYSDBA solo puede utilizarse para crear cuentas nuevas.",
index f5aee2d..2cd5dd2 100644 (file)
@@ -36,7 +36,7 @@
        "config-restart": "Jah, tee taaskäivitus",
        "config-env-php": "PHP $1 on paigaldatud.",
        "config-env-hhvm": "HHVM $1 on installitud.",
-       "config-diff3-bad": "GNU diff3 ei leitud.",
+       "config-diff3-bad": "Tekstivõrdluse vahendit GNU diff3 ei leitud. Saad seda eirata, aga võid sattuda edaspidi sagedamini redigeerimiskonfliktidesse.",
        "config-db-type": "Andmebaasi tüüp:",
        "config-db-name": "Andmebaasi nimi (sidekriipsudeta):",
        "config-db-name-oracle": "Andmebaasi skeem:",
index 69b9421..79a1ebb 100644 (file)
        "config-using-32bit": "<strong>Attention:</strong> votre système semble utiliser les entiers sur 32 bits. Ceci n'est [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit pas recommandé].",
        "config-db-type": "Type de base de données :",
        "config-db-host": "Nom d’hôte de la base de données :",
-       "config-db-host-help": "Si votre serveur de base de données est sur un serveur différent, saisissez ici son nom d’hôte ou son adresse IP.\n\nSi vous utilisez un hébergement mutualisé, votre hébergeur doit vous avoir fourni le nom d’hôte correct dans sa documentation.\n\nSi vous installez sur un serveur Windows et utilisez MySQL, « localhost » peut ne pas fonctionner comme nom de serveur. S’il ne fonctionne pas, essayez « 127.0.0.1 » comme adresse IP locale.\n\nSi vous utilisez PostgreSQL, laissez ce champ vide pour vous connecter via un socket Unix.",
+       "config-db-host-help": "Si votre serveur de base de données est sur un serveur différent, saisissez ici son nom d’hôte ou son adresse IP.\n\nSi vous utilisez un hébergement mutualisé, votre hébergeur doit vous avoir fourni le nom d’hôte correct dans sa documentation.\n\nSi vous utilisez MySQL, « localhost » peut ne pas fonctionner comme nom de serveur. S’il ne fonctionne pas, essayez « 127.0.0.1 » comme adresse IP locale.\n\nSi vous utilisez PostgreSQL, laissez ce champ vide pour vous connecter via un socket Unix.",
        "config-db-host-oracle": "Nom TNS de la base de données :",
        "config-db-host-oracle-help": "Entrez un [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm nom de connexion locale] valide ; un fichier tnsnames.ora doit être visible par cette installation.<br /> Si vous utilisez les bibliothèques clientes version 10g ou plus récentes, vous pouvez également utiliser la méthode de nommage [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Identifier ce wiki",
        "config-invalid-db-server-oracle": "Le nom TNS de la base de données (« $1 ») est invalide.\nUtilisez uniquement la chaîne \"TNS Name\" ou \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Méthodes de nommage Oracle])",
        "config-invalid-db-name": "Nom de la base de données invalide (« $1 »).\nUtiliser seulement les lettres ASCII (a-z, A-Z), les chiffres (0-9), les caractères de soulignement (_) et les tirets (-).",
        "config-invalid-db-prefix": "Préfixe de la base de données non valide « $1 ».\nUtiliser seulement les lettres ASCII (a-z, A-Z), les chiffres (0-9), les caractères de soulignement (_) et les tirets (-).",
-       "config-connection-error": "$1.\n\nVérifier le nom d’hôte, le nom d’utilisateur et le mot de passe ci-dessous puis réessayer.",
+       "config-connection-error": "$1.\n\nVérifier le nom d’hôte, le nom d’utilisateur et le mot de passe ci-dessous puis réessayer. Si vous utilisez « localhost » comme hôte de base de données, essayez d’utiliser « 127.0.0.1 » à la place (ou inversement).",
        "config-invalid-schema": "Schéma invalide pour MediaWiki « $1 ».\nUtiliser seulement les lettres ASCII (a-z, A-Z), les chiffres (0-9) et les caractères de soulignement (_).",
        "config-db-sys-create-oracle": "L'installateur ne reconnaît que le compte SYSDBA lors de la création d'un nouveau compte.",
        "config-db-sys-user-exists-oracle": "Le compte « $1 » existe déjà. Seul SYSDBA peut être utilisé pour créer un nouveau compte.",
index a794069..1d7e908 100644 (file)
@@ -98,7 +98,7 @@
        "config-suhosin-max-value-length": "Suhosin è installato e limita il parametro GET <code>length</code> a $1 byte.\nIl componente MediaWiki ResourceLoader funzionerà aggirando questo limite, ma riducendo le prestazioni.\nSe possibile, dovresti impostare <code>suhosin.get.max_value_length</code> a 1024 o superiore in <code>php.ini</code>, ed impostare <code>$wgResourceLoaderMaxQueryLength</code> allo stesso valore in <code>LocalSettings.php</code>.",
        "config-db-type": "Tipo di database:",
        "config-db-host": "Host del database:",
-       "config-db-host-help": "Se il server del tuo database è su un server diverso, immetti qui il nome dell'host o il suo indirizzo IP.\n\nSe stai utilizzando un web hosting condiviso, il tuo hosting provider dovrebbe fornirti il nome host corretto nella sua documentazione.\n\nSe stai installando su un server Windows con uso di MySQL, l'uso di \"localhost\" potrebbe non funzionare correttamente come nome del server. In caso di problemi, prova a impostare \"127.0.0.1\" come indirizzo IP locale.\n\nSe usi PostgreSQL, lascia questo campo vuoto per consentire di connettersi tramite un socket Unix.",
+       "config-db-host-help": "Se il server del tuo database è su un server diverso, immetti qui il nome dell'host o il suo indirizzo IP.\n\nSe stai utilizzando un web hosting condiviso, il tuo hosting provider dovrebbe fornirti il nome host corretto nella sua documentazione.\n\nSe stai utilizzando MySQL, l'uso di \"localhost\" potrebbe non funzionare correttamente come nome del server. In caso di problemi, prova a impostare \"127.0.0.1\" come indirizzo IP locale.\n\nSe usi PostgreSQL, lascia questo campo vuoto per consentire di connettersi tramite un socket Unix.",
        "config-db-host-oracle": "TNS del database:",
        "config-db-host-oracle-help": "Inserisci un valido [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; un file tnsnames.ora deve essere visibile a questa installazione.<br />Se stai usando la libreria cliente 10g o più recente puoi anche usare il metodo di denominazione [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Identifica questo wiki",
        "config-invalid-db-server-oracle": "TNS database \"$1\" non valido.\nUsa \"TNS Name\" o una stringa \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]).",
        "config-invalid-db-name": "Nome di database \"$1\" non valido.\nUtilizza soltanto caratteri ASCII come lettere (a-z, A-Z), numeri (0-9), sottolineatura (_) e trattini (-).",
        "config-invalid-db-prefix": "Prefisso database \"$1\" non valido.\nUtilizza soltanto caratteri ASCII come lettere (a-z, A-Z), numeri (0-9), sottolineatura (_) e trattini (-).",
-       "config-connection-error": "$1.\n\nControlla host, nome utente e password e prova ancora.",
+       "config-connection-error": "$1.\n\nControlla host, nome utente e password e prova ancora. Se stai usando \"localhost\" come host database, prova invece ad utilizzare \"127.0.0.1\" (o viceversa).",
        "config-invalid-schema": "Schema MediaWiki \"$1\" non valido.\nUsa solo lettere ASCII (a-z, A-Z), numeri (0-9) e caratteri di sottolineatura (_).",
        "config-db-sys-create-oracle": "Il programma di installazione supporta solo l'utilizzo di un account SYSDBA per la creazione di un nuovo account.",
        "config-db-sys-user-exists-oracle": "L'account utente \"$1\" esiste già. SYSDBA può essere usato solo per la creazione di un nuovo account!",
index a66c55b..8c19cb1 100644 (file)
        "config-using-32bit": "<strong>Pas op:</strong> uw systeem lijkt met 32-bit integers te werken. Dit is [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit anders dan aangeraden].",
        "config-db-type": "Databasetype:",
        "config-db-host": "Databasehost:",
-       "config-db-host-help": "Als uw databaseserver een andere server is, voer dan de hostnaam of het IP-adres hier in.\n\nAls u gebruik maakt van gedeelde webhosting, hoort uw provider u de juiste hostnaam te hebben verstrekt.\n\nAls u MediaWiki op een Windowsserver installeert en MySQL gebruikt, dan werkt \"localhost\" mogelijk niet als servernaam.\nAls het inderdaad niet werkt, probeer dan \"127.0.0.1\" te gebruiken als lokaal IP-adres.\n\nAls u PostgreSQL gebruikt, laat dit veld dan leeg om via een Unix-socket te verbinden.",
+       "config-db-host-help": "Als uw databaseserver een andere server is, voer dan de hostnaam of het IP-adres hier in.\n\nAls u gebruik maakt van gedeelde webhosting, hoort uw provider u de juiste hostnaam te hebben verstrekt.\n\nAls u MySQL gebruikt, dan werkt \"localhost\" mogelijk niet als servernaam.\nAls het inderdaad niet werkt, probeer dan \"127.0.0.1\" te gebruiken als lokaal IP-adres.\n\nAls u PostgreSQL gebruikt, laat dit veld dan leeg om via een Unix-socket te verbinden.",
        "config-db-host-oracle": "Database-TNS:",
        "config-db-host-oracle-help": "Voer een geldige [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name] in; een tnsnames.ora-bestand moet zichtbaar zijn voor deze installatie.<br />Als u gebruik maakt van clientlibraries 10g of een latere versie, kunt u ook gebruik maken van de naamgevingsmethode [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Identificeer deze wiki",
        "config-invalid-db-server-oracle": "Ongeldige database-TNS \"$1\".\nGebruik \"TNS Names\" of een \"Easy Connect\" tekst ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle naamgevingsmethoden])",
        "config-invalid-db-name": "Ongeldige databasenaam \"$1\".\nGebruik alleen letters (a-z, A-Z), cijfers (0-9) en liggende streepjes (_) en streepjes (-).",
        "config-invalid-db-prefix": "Ongeldig databasevoorvoegsel \"$1\".\nGebruik alleen letters (a-z, A-Z), cijfers (0-9) en liggende streepjes (_) en streepjes (-).",
-       "config-connection-error": "$1.\n\nControleer de host, gebruikersnaam en wachtwoord en probeer het opnieuw.",
+       "config-connection-error": "$1.\n\nControleer de host, gebruikersnaam en wachtwoord en probeer het opnieuw. Probeer \"127.0.0.1\" in plaats van \"localhost\" als database host. (of omgekeerd)",
        "config-invalid-schema": "Ongeldig schema voor MediaWiki \"$1\".\nGebruik alleen letters (a-z, A-Z), cijfers (0-9) en liggende streepjes (_).",
        "config-db-sys-create-oracle": "Het installatieprogramma biedt alleen de mogelijkheid een nieuw account aan te maken met een SYSDBA-account.",
        "config-db-sys-user-exists-oracle": "Gebruikersaccount \"$1\" bestaat al. SYSDBA kan alleen gebruikt worden voor het aanmaken van een nieuw account!",
index 35fff51..8c53ed1 100644 (file)
@@ -22,7 +22,8 @@
                        "Luk3",
                        "Eduardo Addad de Oliveira",
                        "Warley Felipe C.",
-                       "Felipe L. Ewald"
+                       "Felipe L. Ewald",
+                       "Tks4Fish"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
        "config-using-32bit": "<strong>Aviso:</strong> o seu sistema parece estar sendo executado com inteiros de 32 bits. Isto [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit não é recomendado].",
        "config-db-type": "Tipo do banco de dados:",
        "config-db-host": "Servidor do banco de dados:",
-       "config-db-host-help": "Se a banco de dados do seu servidor está em um servidor diferente, digite o nome do host ou o endereço IP aqui.\n\nSe você está utilizando uma hospedagem web compartilhada, o seu provedor de hospedagem deverá fornecer o nome do host correto na sua documentação.\n\nSe você está instalando em um servidor Windows e usando o MySQL, usar \"localhost\" pode não funcionar para o nome de servidor. Se não funcionar, tente \"127.0.0.1\" para o endereço de IP local.\n\nSe você está usando PostgreSQl, deixe este campo em branco para se conectar através de um socket Unix.",
+       "config-db-host-help": "Se o banco de dados do seu servidor está em um servidor diferente, digite o nome do host ou o endereço IP aqui.\n\nSe você está utilizando uma hospedagem web compartilhada, o seu provedor de hospedagem deverá fornecer o nome do host correto na sua documentação.\n\nSe você está usando o MySQL, usar \"localhost\" pode não funcionar para o nome de servidor. Se não funcionar, tente \"127.0.0.1\" para o endereço de IP local.\n\nSe você está usando PostgreSQl, deixe este campo em branco para se conectar através de um socket Unix.",
        "config-db-host-oracle": "TNS do banco de dados:",
        "config-db-host-oracle-help": "Digite um [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Nome de Conexão local] válido; o arquivo tnsnames.ora precisa estar visível para esta instalação.<br />Se você estiver usando bibliotecas cliente 10g ou mais recente, você também pode usar o método [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Identifique esta wiki",
        "config-invalid-db-server-oracle": "Banco de dados TNS inválido \"$1\".\nUse \"TNS Name\" ou \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Métodos de nomeação da Oracle]).",
        "config-invalid-db-name": "O nome do banco de dados é inválido \"$1\".\nUse apenas letras ASCII (a-z, A-Z), números (0-9), underscores (_) e hifens (-).",
        "config-invalid-db-prefix": "O prefixo do banco de dados é inválido \"$1\".\nUse apenas letras ASCII (a-z, A-Z), números (0-9), underscores (_) e hifens (-).",
-       "config-connection-error": "$1\n\nVerifique o servidor, nome de usuário e senha e tente novamente.",
+       "config-connection-error": "$1.\n\nVerifique o servidor, nome de usuário e senha e tente novamente. Se estiver usando \"localhost\" como o servidor do banco de dados, tente usar \"127.0.0.1\" em vez disso (ou vice versa).",
        "config-invalid-schema": "Schema inválido para o MediaWiki \"$1\".\nUse apenas letras ASCII (a-z, A-Z), números (0-9) e underscores (_).",
        "config-db-sys-create-oracle": "O instalador só permite criar uma conta nova usando uma conta SYSDBA.",
        "config-db-sys-user-exists-oracle": "A conta de usuário \"$1\" já existe. SYSDBA somente pode ser utilizado na criação de uma nova conta!",
index a604df5..f6c63e0 100644 (file)
@@ -8,14 +8,17 @@
                        "Tuxilina",
                        "Strainu",
                        "Fitoschido",
-                       "WebSourceContentRO"
+                       "WebSourceContentRO",
+                       "MSClaudiu"
                ]
        },
        "config-desc": "Programul de instalare pentru MediaWiki",
        "config-title": "Instalarea MediaWiki $1",
        "config-information": "Informații",
+       "config-localsettings-upgrade": "O <code>LocalSettings.php</> filă a fost detectată. \nPentru a actualiza această instalare, vă rugăm să introduceți valoarea <code>$wgUpgradeKey</code> în căsuța de mai jos.\nO vei găsi în <code>LocalSettings.php</code>.",
+       "config-localsettings-cli-upgrade": "O <code>LocalSettings.php</code> filă a fost detectată.\nPentru a actualiza această instalare, vă rugăm să\n<code>update.php</code> în loc",
        "config-localsettings-key": "Cheie de actualizare:",
-       "config-localsettings-badkey": "Cheia furnizată este incorectă.",
+       "config-localsettings-badkey": "Cheia de actualizare este incorectă.",
        "config-upgrade-key-missing": "S-a detectat o instalare existentă de MediaWiki.\nPentru a efectua un upgrade în cazul acestei instalări, vă rugăm să introduceți următorul rând în partea de jos a fișierului <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "Fișierul <code>LocalSettings.php</code> deja existent pare a fi incomplet.\nVariabila $1 nu este definită.\nModificați fișierul <code>LocalSettings.php</code> astfel încât această variabilă să fie definită, după care apăsați pe „{{int:Config-continue}}”.",
        "config-localsettings-connection-error": "A apărut o eroare în timpul conectării la baza de date utilizând setările specificate în <code>LocalSettings.php</code>. Vă rugăm să ajustați aceste setări și încercați din nou.\n\n$1",
        "config-page-existingwiki": "Wiki existent",
        "config-help-restart": "Doriți să ștergeți toate datele salvate introduse și să reporniți procesul de instalare?",
        "config-restart": "Da, repornește.",
+       "config-welcome": "=== Verificări ale mediului ===\nVerificări de bază vor fi efectuate pentru a vedea dacă este potrivit pentru instalarea MediaWiki.\nNu uitați să includeți aceste informații dacă doriți asistență pentru completarea instalării.",
+       "config-copyright": "=== Drepturi de autor și termeni ===\n\n$1\n\nAcest program este un software liber; îl puteți redistribui și / sau modifica în conformitate cu termenii Licenței Publice Generale GNU, publicată de Fundația pentru Software Liber; fie versiunea 2 a Licenței, fie (la alegere) orice versiune ulterioară.\nAcest program este distribuit în speranța că va fi util, dar <strong>fără nicio garanție</strong>; fără nici măcar garanția implicită de <strong>vandabilitate</strong> sau <strong>fitness pentru un anumit scop</strong>.\nPentru mai multe detalii, consultați Licența publică generală GNU.\nAr fi trebuit să fi primit <doclink href = Copying> o copie a GNU General Public License </ doclink> împreună cu acest program; dacă nu, scrieți la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, SUA, sau [https://www.gnu.org/copyleft/gpl.html citiți-o online] .",
+       "config-sidebar": "* [https://www.mediawiki.org Acasă MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administrator's Guide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>Release notes</doclink>\n* <doclink href=Copying>Copying</doclink>\n* <doclink href=UpgradeDoc>Upgrading</doclink>",
        "config-env-good": "Verificarea mediului a fost efectuată cu succes.\nPuteți instala MediaWiki.",
        "config-env-bad": "Verificarea mediului a fost efectuată.\nNu puteți instala MediaWiki.",
        "config-env-php": "PHP $1 este instalat.",
        "config-env-hhvm": "HHVM $1 este instalat.",
+       "config-unicode-using-intl": "Utilizarea extensiei [https://pecl.php.net/intl intl PECL] pentru normalizarea Unicode.",
+       "config-unicode-pure-php-warning": "<strong>Atenție:</strong> Extensia [https://pecl.php.net/intl intl PECL] nu este disponibilă pentru a face față normalizării Unicode, revenind la o implementare lentă pur PHP.\nDacă rulați un site cu trafic ridicat, ar trebui să citiți puțin în [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Normalizarea Unicode].",
+       "config-unicode-update-warning": "<strong>Avertisment:</strong> Versiunea instalată a pachetului de normalizare Unicode utilizează o versiune mai veche a bibliotecii [http://site.icu-project.org/ proiectul ICU].\nAr trebui să faceți upgrade [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations] dacă sunteți preocupat de utilizarea Unicode.",
+       "config-no-db": "Nu am găsit un driver de bază de date potrivit! Trebuie să instalați un driver de bază de date pentru PHP.\nUrmătoarea bază de date {{PLURAL:$2|tip este|tipuri sunt}} este acceptată: $1.\nDacă ați compilat singuri PHP, reconfigurați-l cu un client de bază de date activat, de exemplu, utilizând <code>./ configure --with-mysqli</code>.\nDacă ați instalat PHP dintr-un pachet Debian sau Ubuntu, atunci trebuie să instalați, de exemplu, pachetul <code>php-mysql</code>",
+       "config-outdated-sqlite": "<strong>Atenție:</strong> ai SQLite $1, care este mai mic decât minimul necesar pentru versiunea $2. SQLite va fi nedisponibil.",
+       "config-no-fts3": "<strong>Atenție:</strong> SQLite este compus fără [//sqlite.org/fts3.html modulu FTS3], caută caracteristici care nu vor fi disponibile la finalul acesta.",
+       "config-pcre-old": "<strong>Fatal:</> PCRE $1 sau mai târziu este necesar este necesar. \nPHP tău este binar este legat de PCRE $2. \n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mai multe informații].",
+       "config-pcre-no-utf8": "<strong>Fatal:</strong> Modul PCRE al PHP pare să fie compilat fără suport PCRE_UTF8.\nMediaWiki necesită ca suportul UTF-8 să funcționeze corect.",
+       "config-memory-raised": "PHP<code>memory_limit</code> este $1, mărit cu $2.",
+       "config-memory-bad": "<strong>Atenție:</strong> PHP<code>memory_limit</code> este $1.\nAcesta este probabil mai jos.\nAceastă instalare eșuează!",
        "config-apc": "[https://secure.php.net/apc APC] este instalat",
+       "config-apcu": "[https://secure.php.net/apcu APCu] este instalat",
        "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] este instalat",
+       "config-no-cache-apcu": "<strong>Atenție:</strong> Nu am putut găsi [https://secure.php.net/apcu APCu] sau [https://www.iis.net/downloads/microsoft/wincache-extension WinCache].\nObiect cache nu este activat.",
+       "config-mod-security": "<strong>Avertisment:</strong> Serverul dvs. web are activat [https://modsecurity.org/ mod_security] / mod_security2. Multe configurații comune vor provoca probleme pentru MediaWiki și alte programe software care permit utilizatorilor să posteze conținuturi arbitrare.\nDacă este posibil, aceasta ar trebui dezactivată. În caz contrar, consultați documentația [https://modsecurity.org/documentation/ mod_security] sau contactați asistența gazdei dvs. dacă întâmpinați erori aleatorii.",
        "config-diff3-bad": "Utilitarul de comparare a textului GNU diff3 nu a fost găsit. Puteți ignora acest lucru pentru moment, dar ar putea apărea mai frecvent conflicte de editare.",
+       "config-git": "Am găsit versiunea software de control Git:<code>$1</code>.",
        "config-git-bad": "Software-ul de control al versiunii Git nu a fost găsit. Acum puteți ignora acest lucru. Rețineți că Special:Version nu va afișa hașurile commit.",
+       "config-imagemagick": "Am găsit ImageMagick: <code>$1</code>. \nMiniaturile imaginilor vor fi activate dacă activați încărcările.",
        "config-no-uri": "<strong>Eroare:</strong> Nu pot determina URI-ul curent.\nInstalare întreruptă.",
        "config-db-type": "Tipul bazei de date:",
        "config-db-host": "Gazdă bază de date:",
index 9d9534f..f9e918b 100644 (file)
@@ -23,7 +23,8 @@
                        "Impersonator 1",
                        "Fengchao",
                        "Duolaimi",
-                       "A Chinese Wikipedian"
+                       "A Chinese Wikipedian",
+                       "水獭很懒"
                ]
        },
        "config-desc": "MediaWiki安装程序",
        "config-using-32bit": "<strong>警告:</strong>您的系统似乎是32位系统。我们[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit 不建议您]使用32位系统。",
        "config-db-type": "数据库类型:",
        "config-db-host": "数据库主机:",
-       "config-db-host-help": "å¦\82æ\9e\9cæ\82¨ç\9a\84æ\95°æ\8d®åº\93å\9c¨å\88«ç\9a\84æ\9c\8då\8a¡å\99¨ä¸\8aï¼\8c请å\9c¨è¿\99é\87\8cè¾\93å\85¥å®\83ç\9a\84å\9f\9få\90\8dæ\88\96IPå\9c°å\9d\80ã\80\82\n\nå¦\82æ\9e\9cæ\82¨å\9c¨ä½¿ç\94¨å\85±äº«ç½\91ç«\99å¥\97é¤\90ï¼\8cæ\82¨ç\9a\84ç½\91ç«\99å\95\86åº\94该已å\9c¨ä»\96们ç\9a\84æ\8e§å\88¶é\9d¢æ\9d¿ä¸­ç»\99æ\82¨æ\95°æ\8d®åº\93ä¿¡æ\81¯äº\86ã\80\82\n\nå¦\82æ\9e\9cæ\82¨å\9c¨Windows中å®\89è£\85并ä¸\94使用MySQL,“localhost”可能无效。如果确实无效,请输入“127.0.0.1”作为IP地址。\n\n如果您在使用PostgreSQL,并且要用Unix socket来连接,请留空。",
+       "config-db-host-help": "å¦\82æ\9e\9cæ\82¨ç\9a\84æ\95°æ\8d®åº\93å\9c¨å\88«ç\9a\84æ\9c\8då\8a¡å\99¨ä¸\8aï¼\8c请å\9c¨è¿\99é\87\8cè¾\93å\85¥å\85¶å\9f\9få\90\8dæ\88\96IPå\9c°å\9d\80ã\80\82\n\nå¦\82æ\9e\9cæ\82¨å\9c¨ä½¿ç\94¨å\85±äº«ç½\91ç«\99å¥\97é¤\90ï¼\8cæ\82¨ç\9a\84ç½\91ç«\99å\95\86åº\94该已å\9c¨ä»\96们ç\9a\84æ\8e§å\88¶é\9d¢æ\9d¿ä¸­ç»\99æ\82¨æ\95°æ\8d®åº\93ä¿¡æ\81¯äº\86ã\80\82\n\nå¦\82æ\9e\9cæ\82¨使用MySQL,“localhost”可能无效。如果确实无效,请输入“127.0.0.1”作为IP地址。\n\n如果您在使用PostgreSQL,并且要用Unix socket来连接,请留空。",
        "config-db-host-oracle": "数据库透明网络底层(TNS):",
        "config-db-host-oracle-help": "请输入合法的[http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm 本地连接名],并确保tnsnames.ora文件对本安装程序可见。<br />如果您使用的客户端库为10g或更新的版本,您还可以使用[http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm 简单连接名方法](easy connect naming method)。",
        "config-db-wiki-settings": "标识本wiki",
        "config-invalid-db-server-oracle": "无效的数据库TNS“$1”。请使用“TNS 名称”或者一个“轻松连接”字符串([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle 命名方法])",
        "config-invalid-db-name": "无效的数据库名称“$1”。请只使用ASCII字母(a-z、A-Z)、数字(0-9)、下划线(_)和连字号(-)。",
        "config-invalid-db-prefix": "无效的数据库前缀“$1”。请只使用ASCII字母(a-z、A-Z)、数字(0-9)、下划线(_)和连字号(-)。",
-       "config-connection-error": "$1。\n\n请检查下列的主机、用户名和密码设置后重试。",
+       "config-connection-error": "$1。\n\n请检查下列的主机、用户名和密码设置后重试。若使用\"localhost\"作为数据库主机,请尝试\"127.0.0.1\"(反之亦然)。",
        "config-invalid-schema": "无效的MediaWiki数据库模式“$1”。请只使用ASCII字母(a-z、A-Z)、数字(0-9)和下划线(_)。",
        "config-db-sys-create-oracle": "安装程序仅支持使用SYSDBA帐户创建新帐户。",
        "config-db-sys-user-exists-oracle": "用户帐户“$1”已经存在。SYSDBA仅可用于创建新帐户!",
index 88ef8e0..52c78c8 100644 (file)
@@ -99,7 +99,7 @@
        "config-using-32bit": "<strong>警告:</strong>您的系統似乎是 32 位元系統,[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit 不推薦]您使用。",
        "config-db-type": "資料庫類型:",
        "config-db-host": "資料庫主機:",
-       "config-db-host-help": "如果您的資料庫安裝在其他伺服器上,請在此輸入該主機的名稱或 IP 位址。\n\n如果您使用共用的網頁主機,您的主機提供商應會在說明文件上告訴您正確的主機名稱。\n\n如果您安裝在 Windows 伺服器並且使用 MySQL,伺服器名稱可能無法使用使用 \"localhost\"。若確實無法使用,請改嘗試使用本機的 IP 位址 \"127.0.0.1\"。\n\n如果您使用 PostgreSQL,將此欄位空白以使用 Unix socket 來連線。",
+       "config-db-host-help": "如果您的資料庫安裝在其他伺服器上,請在此輸入該主機的名稱或 IP 位址。\n\n如果您使用共用的網頁主機,您的主機提供商應會在說明文件上告訴您正確的主機名稱。\n\n如果您使用 MySQL,伺服器名稱可能無法使用 \"localhost\"。若確實無法使用,請改嘗試使用本機的 IP 位址 \"127.0.0.1\"。\n\n如果您使用 PostgreSQL,將此欄位空白以使用 Unix socket 來連線。",
        "config-db-host-oracle": "資料庫的 TNS:",
        "config-db-host-oracle-help": "請輸入有效的 [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm 本地連線名稱],並確認安裝程式可以讀取 tnsnames.ora 檔案。<br />如果您使用的客戶端程式庫為 10g 或者更新的版本,您也可使用 [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm 簡易連線] 的命名方法進行連線。",
        "config-db-wiki-settings": "識別此 wiki",
        "config-invalid-db-server-oracle": "無效的資料庫 TNS \"$1\"。\n請使用符合 \"TNS 名稱\" 或 \"簡易連線\" 規則的字串([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle命名規則])",
        "config-invalid-db-name": "無效的資料庫名稱 \"$1\"。\n僅允許使用 ASCII 字母(a-z、A-Z)、數字(0-9)、底線(_)與連字號(-)。",
        "config-invalid-db-prefix": "無效的資料庫字首 \"$1\"。\n僅允許使用 ASCII 字母(a-z、A-Z)、數字(0-9)、底線(_)與連字號(-)。",
-       "config-connection-error": "$1。\n\n請檢查主機、使用者名稱和密碼設定,然後重試。",
+       "config-connection-error": "$1。\n\n請檢查主機、使用者名稱和密碼設定,然後重試。如果是使用 \"localhost\" 來作為資料庫主機,請嘗試改用 \"127.0.0.1\"(反之亦然)。",
        "config-invalid-schema": "無效的資料庫 Schema \"$1\"。\n僅允許使用 ASCII 字母(a-z、A-Z)、數字(0-9)、底線(_)與連字號(-)。",
        "config-db-sys-create-oracle": "安裝程式只支援使用 SYSDBA 帳號建立新帳號。",
        "config-db-sys-user-exists-oracle": "使用者帳號 \"$1\" 已存在。 SYSDBA 只可用來建立新的帳號!",
index 84cf0b2..ddecf9e 100644 (file)
@@ -77,8 +77,8 @@ class BlockLogFormatter extends LogFormatter {
                        // block restrictions
                        if ( isset( $params[6] ) ) {
                                $pages = $params[6]['pages'] ?? [];
-                               $pages = array_map( function ( $page ){
-                                       return $this->makePageLink( Title::newFromText( ( $page ) ) );
+                               $pages = array_map( function ( $page ) {
+                                       return $this->makePageLink( Title::newFromText( $page ) );
                                }, $pages );
 
                                $namespaces = $params[6]['namespaces'] ?? [];
index b63f818..45d6e1f 100644 (file)
@@ -385,7 +385,7 @@ class LogPage {
         */
        public function addRelations( $field, $values, $logid ) {
                if ( !strlen( $field ) || empty( $values ) ) {
-                       return false; // nothing
+                       return false;
                }
 
                $data = [];
diff --git a/includes/media/XCF.php b/includes/media/XCF.php
deleted file mode 100644 (file)
index 0cb618f..0000000
+++ /dev/null
@@ -1,228 +0,0 @@
-<?php
-/**
- * Handler for the Gimp's native file format (XCF)
- *
- * Overview:
- *   https://en.wikipedia.org/wiki/XCF_(file_format)
- * Specification in Gnome repository:
- *   http://svn.gnome.org/viewvc/gimp/trunk/devel-docs/xcf.txt?view=markup
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Media
- */
-
-/**
- * Handler for the Gimp's native file format; getimagesize() doesn't
- * support these files
- *
- * @ingroup Media
- */
-class XCFHandler extends BitmapHandler {
-       /**
-        * @param File $file
-        * @return bool
-        */
-       public function mustRender( $file ) {
-               return true;
-       }
-
-       /**
-        * Render files as PNG
-        *
-        * @param string $ext
-        * @param string $mime
-        * @param array|null $params
-        * @return array
-        */
-       function getThumbType( $ext, $mime, $params = null ) {
-               return [ 'png', 'image/png' ];
-       }
-
-       /**
-        * Get width and height from the XCF header.
-        *
-        * @param File|FSFile $image
-        * @param string $filename
-        * @return array
-        */
-       function getImageSize( $image, $filename ) {
-               $header = self::getXCFMetaData( $filename );
-               if ( !$header ) {
-                       return false;
-               }
-
-               # Forge a return array containing metadata information just like getimagesize()
-               # See PHP documentation at: https://secure.php.net/getimagesize
-               return [
-                       0 => $header['width'],
-                       1 => $header['height'],
-                       2 => null, # IMAGETYPE constant, none exist for XCF.
-                       3 => "height=\"{$header['height']}\" width=\"{$header['width']}\"",
-                       'mime' => 'image/x-xcf',
-                       'channels' => null,
-                       'bits' => 8, # Always 8-bits per color
-               ];
-       }
-
-       /**
-        * Metadata for a given XCF file
-        *
-        * Will return false if file magic signature is not recognized
-        * @author Hexmode
-        * @author Hashar
-        *
-        * @param string $filename Full path to a XCF file
-        * @return bool|array Metadata Array just like PHP getimagesize()
-        */
-       static function getXCFMetaData( $filename ) {
-               # Decode master structure
-               $f = fopen( $filename, 'rb' );
-               if ( !$f ) {
-                       return false;
-               }
-               # The image structure always starts at offset 0 in the XCF file.
-               # So we just read it :-)
-               $binaryHeader = fread( $f, 26 );
-               fclose( $f );
-
-               /**
-                * Master image structure:
-                *
-                * byte[9] "gimp xcf "  File type magic
-                * byte[4] version      XCF version
-                *                        "file" - version 0
-                *                        "v001" - version 1
-                *                        "v002" - version 2
-                * byte    0            Zero-terminator for version tag
-                * uint32  width        With of canvas
-                * uint32  height       Height of canvas
-                * uint32  base_type    Color mode of the image; one of
-                *                         0: RGB color
-                *                         1: Grayscale
-                *                         2: Indexed color
-                *        (enum GimpImageBaseType in libgimpbase/gimpbaseenums.h)
-                */
-               try {
-                       $header = wfUnpack(
-                               "A9magic" . # A: space padded
-                                       "/a5version" . # a: zero padded
-                                       "/Nwidth" . # \
-                                       "/Nheight" . # N: unsigned long 32bit big endian
-                                       "/Nbase_type", # /
-                               $binaryHeader
-                       );
-               } catch ( Exception $mwe ) {
-                       return false;
-               }
-
-               # Check values
-               if ( $header['magic'] !== 'gimp xcf' ) {
-                       wfDebug( __METHOD__ . " '$filename' has invalid magic signature.\n" );
-
-                       return false;
-               }
-               # TODO: we might want to check for sane values of width and height
-
-               wfDebug( __METHOD__ .
-                       ": canvas size of '$filename' is {$header['width']} x {$header['height']} px\n" );
-
-               return $header;
-       }
-
-       /**
-        * Store the channel type
-        *
-        * Greyscale files need different command line options.
-        *
-        * @param File|FSFile $file The image object, or false if there isn't one.
-        *   Warning, FSFile::getPropsFromPath might pass an (object)array() instead (!)
-        * @param string $filename
-        * @return string
-        */
-       public function getMetadata( $file, $filename ) {
-               $header = self::getXCFMetaData( $filename );
-               $metadata = [];
-               if ( $header ) {
-                       // Try to be consistent with the names used by PNG files.
-                       // Unclear from base media type if it has an alpha layer,
-                       // so just assume that it does since it "potentially" could.
-                       switch ( $header['base_type'] ) {
-                               case 0:
-                                       $metadata['colorType'] = 'truecolour-alpha';
-                                       break;
-                               case 1:
-                                       $metadata['colorType'] = 'greyscale-alpha';
-                                       break;
-                               case 2:
-                                       $metadata['colorType'] = 'index-coloured';
-                                       break;
-                               default:
-                                       $metadata['colorType'] = 'unknown';
-                       }
-               } else {
-                       // Marker to prevent repeated attempted extraction
-                       $metadata['error'] = true;
-               }
-               return serialize( $metadata );
-       }
-
-       /**
-        * Should we refresh the metadata
-        *
-        * @param File $file The file object for the file in question
-        * @param string $metadata Serialized metadata
-        * @return bool One of the self::METADATA_(BAD|GOOD|COMPATIBLE) constants
-        */
-       public function isMetadataValid( $file, $metadata ) {
-               if ( !$metadata ) {
-                       // Old metadata when we just put an empty string in there
-                       return self::METADATA_BAD;
-               } else {
-                       return self::METADATA_GOOD;
-               }
-       }
-
-       /**
-        * Must use "im" for XCF
-        *
-        * @param string $dstPath
-        * @param bool $checkDstPath
-        * @return string
-        */
-       protected function getScalerType( $dstPath, $checkDstPath = true ) {
-               return "im";
-       }
-
-       /**
-        * Can we render this file?
-        *
-        * Image magick doesn't support indexed xcf files as of current
-        * writing (as of 6.8.9-3)
-        * @param File $file
-        * @return bool
-        */
-       public function canRender( $file ) {
-               Wikimedia\suppressWarnings();
-               $xcfMeta = unserialize( $file->getMetadata() );
-               Wikimedia\restoreWarnings();
-               if ( isset( $xcfMeta['colorType'] ) && $xcfMeta['colorType'] === 'index-coloured' ) {
-                       return false;
-               }
-               return parent::canRender( $file );
-       }
-}
diff --git a/includes/media/XCFHandler.php b/includes/media/XCFHandler.php
new file mode 100644 (file)
index 0000000..0cb618f
--- /dev/null
@@ -0,0 +1,228 @@
+<?php
+/**
+ * Handler for the Gimp's native file format (XCF)
+ *
+ * Overview:
+ *   https://en.wikipedia.org/wiki/XCF_(file_format)
+ * Specification in Gnome repository:
+ *   http://svn.gnome.org/viewvc/gimp/trunk/devel-docs/xcf.txt?view=markup
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Media
+ */
+
+/**
+ * Handler for the Gimp's native file format; getimagesize() doesn't
+ * support these files
+ *
+ * @ingroup Media
+ */
+class XCFHandler extends BitmapHandler {
+       /**
+        * @param File $file
+        * @return bool
+        */
+       public function mustRender( $file ) {
+               return true;
+       }
+
+       /**
+        * Render files as PNG
+        *
+        * @param string $ext
+        * @param string $mime
+        * @param array|null $params
+        * @return array
+        */
+       function getThumbType( $ext, $mime, $params = null ) {
+               return [ 'png', 'image/png' ];
+       }
+
+       /**
+        * Get width and height from the XCF header.
+        *
+        * @param File|FSFile $image
+        * @param string $filename
+        * @return array
+        */
+       function getImageSize( $image, $filename ) {
+               $header = self::getXCFMetaData( $filename );
+               if ( !$header ) {
+                       return false;
+               }
+
+               # Forge a return array containing metadata information just like getimagesize()
+               # See PHP documentation at: https://secure.php.net/getimagesize
+               return [
+                       0 => $header['width'],
+                       1 => $header['height'],
+                       2 => null, # IMAGETYPE constant, none exist for XCF.
+                       3 => "height=\"{$header['height']}\" width=\"{$header['width']}\"",
+                       'mime' => 'image/x-xcf',
+                       'channels' => null,
+                       'bits' => 8, # Always 8-bits per color
+               ];
+       }
+
+       /**
+        * Metadata for a given XCF file
+        *
+        * Will return false if file magic signature is not recognized
+        * @author Hexmode
+        * @author Hashar
+        *
+        * @param string $filename Full path to a XCF file
+        * @return bool|array Metadata Array just like PHP getimagesize()
+        */
+       static function getXCFMetaData( $filename ) {
+               # Decode master structure
+               $f = fopen( $filename, 'rb' );
+               if ( !$f ) {
+                       return false;
+               }
+               # The image structure always starts at offset 0 in the XCF file.
+               # So we just read it :-)
+               $binaryHeader = fread( $f, 26 );
+               fclose( $f );
+
+               /**
+                * Master image structure:
+                *
+                * byte[9] "gimp xcf "  File type magic
+                * byte[4] version      XCF version
+                *                        "file" - version 0
+                *                        "v001" - version 1
+                *                        "v002" - version 2
+                * byte    0            Zero-terminator for version tag
+                * uint32  width        With of canvas
+                * uint32  height       Height of canvas
+                * uint32  base_type    Color mode of the image; one of
+                *                         0: RGB color
+                *                         1: Grayscale
+                *                         2: Indexed color
+                *        (enum GimpImageBaseType in libgimpbase/gimpbaseenums.h)
+                */
+               try {
+                       $header = wfUnpack(
+                               "A9magic" . # A: space padded
+                                       "/a5version" . # a: zero padded
+                                       "/Nwidth" . # \
+                                       "/Nheight" . # N: unsigned long 32bit big endian
+                                       "/Nbase_type", # /
+                               $binaryHeader
+                       );
+               } catch ( Exception $mwe ) {
+                       return false;
+               }
+
+               # Check values
+               if ( $header['magic'] !== 'gimp xcf' ) {
+                       wfDebug( __METHOD__ . " '$filename' has invalid magic signature.\n" );
+
+                       return false;
+               }
+               # TODO: we might want to check for sane values of width and height
+
+               wfDebug( __METHOD__ .
+                       ": canvas size of '$filename' is {$header['width']} x {$header['height']} px\n" );
+
+               return $header;
+       }
+
+       /**
+        * Store the channel type
+        *
+        * Greyscale files need different command line options.
+        *
+        * @param File|FSFile $file The image object, or false if there isn't one.
+        *   Warning, FSFile::getPropsFromPath might pass an (object)array() instead (!)
+        * @param string $filename
+        * @return string
+        */
+       public function getMetadata( $file, $filename ) {
+               $header = self::getXCFMetaData( $filename );
+               $metadata = [];
+               if ( $header ) {
+                       // Try to be consistent with the names used by PNG files.
+                       // Unclear from base media type if it has an alpha layer,
+                       // so just assume that it does since it "potentially" could.
+                       switch ( $header['base_type'] ) {
+                               case 0:
+                                       $metadata['colorType'] = 'truecolour-alpha';
+                                       break;
+                               case 1:
+                                       $metadata['colorType'] = 'greyscale-alpha';
+                                       break;
+                               case 2:
+                                       $metadata['colorType'] = 'index-coloured';
+                                       break;
+                               default:
+                                       $metadata['colorType'] = 'unknown';
+                       }
+               } else {
+                       // Marker to prevent repeated attempted extraction
+                       $metadata['error'] = true;
+               }
+               return serialize( $metadata );
+       }
+
+       /**
+        * Should we refresh the metadata
+        *
+        * @param File $file The file object for the file in question
+        * @param string $metadata Serialized metadata
+        * @return bool One of the self::METADATA_(BAD|GOOD|COMPATIBLE) constants
+        */
+       public function isMetadataValid( $file, $metadata ) {
+               if ( !$metadata ) {
+                       // Old metadata when we just put an empty string in there
+                       return self::METADATA_BAD;
+               } else {
+                       return self::METADATA_GOOD;
+               }
+       }
+
+       /**
+        * Must use "im" for XCF
+        *
+        * @param string $dstPath
+        * @param bool $checkDstPath
+        * @return string
+        */
+       protected function getScalerType( $dstPath, $checkDstPath = true ) {
+               return "im";
+       }
+
+       /**
+        * Can we render this file?
+        *
+        * Image magick doesn't support indexed xcf files as of current
+        * writing (as of 6.8.9-3)
+        * @param File $file
+        * @return bool
+        */
+       public function canRender( $file ) {
+               Wikimedia\suppressWarnings();
+               $xcfMeta = unserialize( $file->getMetadata() );
+               Wikimedia\restoreWarnings();
+               if ( isset( $xcfMeta['colorType'] ) && $xcfMeta['colorType'] === 'index-coloured' ) {
+                       return false;
+               }
+               return parent::canRender( $file );
+       }
+}
index e45b774..978118f 100644 (file)
@@ -41,6 +41,10 @@ class InvalidPassword extends Password {
                return false;
        }
 
+       public function verify( $password ) {
+               return false;
+       }
+
        public function needsUpdate() {
                return false;
        }
index c8a0267..f167f95 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Assert\Assert;
+
 /**
  * Represents a password hash for use in authentication
  *
@@ -147,21 +149,38 @@ abstract class Password {
         * Password::toString() for each object. This can be overridden to do
         * custom comparison, but it is not recommended unless necessary.
         *
+        * @deprecated since 1.33, use verify()
+        *
         * @param Password|string $other The other password
         * @return bool True if equal, false otherwise
         */
        public function equals( $other ) {
-               if ( !$other instanceof self ) {
-                       // No need to use the factory because we're definitely making
-                       // an object of the same type.
-                       $obj = clone $this;
-                       $obj->crypt( $other );
-                       $other = $obj;
+               if ( is_string( $other ) ) {
+                       return $this->verify( $other );
                }
 
                return hash_equals( $this->toString(), $other->toString() );
        }
 
+       /**
+        * Checks whether the given password matches the hash stored in this object.
+        *
+        * @param string $password Password to check
+        * @return bool
+        */
+       public function verify( $password ) {
+               Assert::parameter( is_string( $password ),
+                       '$password', 'must be string, actual: ' . gettype( $password )
+               );
+
+               // No need to use the factory because we're definitely making
+               // an object of the same type.
+               $obj = clone $this;
+               $obj->crypt( $password );
+
+               return hash_equals( $this->toString(), $obj->toString() );
+       }
+
        /**
         * Convert this hash to a string that can be stored in the database
         *
index 19fe0c3..f7f7e89 100644 (file)
@@ -35,13 +35,14 @@ class RevisionDeleteUser {
 
        /**
         * Update *_deleted bitfields in various tables to hide or unhide usernames
+        *
         * @param string $name Username
         * @param int $userId User id
         * @param string $op Operator '|' or '&'
         * @param null|IDatabase $dbw If you happen to have one lying around
-        * @return bool
+        * @return bool True on success, false on failure (e.g. invalid user ID)
         */
-       private static function setUsernameBitfields( $name, $userId, $op, $dbw ) {
+       private static function setUsernameBitfields( $name, $userId, $op, IDatabase $dbw = null ) {
                global $wgActorTableSchemaMigrationStage;
 
                if ( !$userId || ( $op !== '|' && $op !== '&' ) ) {
@@ -58,7 +59,7 @@ class RevisionDeleteUser {
                # The same goes for the sysop-restricted *_deleted bit.
                $delUser = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
                $delAction = LogPage::DELETED_ACTION | Revision::DELETED_RESTRICTED;
-               if ( $op == '&' ) {
+               if ( $op === '&' ) {
                        $delUser = $dbw->bitNot( $delUser );
                        $delAction = $dbw->bitNot( $delAction );
                }
@@ -191,21 +192,32 @@ class RevisionDeleteUser {
                        __METHOD__
                );
 
-               # Done!
                return true;
        }
 
-       private static function buildSetBitDeletedField( $field, $op, $value, $dbw ) {
+       private static function buildSetBitDeletedField( $field, $op, $value, IDatabase $dbw ) {
                return $field . ' = ' . ( $op === '&'
                        ? $dbw->bitAnd( $field, $value )
                        : $dbw->bitOr( $field, $value ) );
        }
 
-       public static function suppressUserName( $name, $userId, $dbw = null ) {
+       /**
+        * @param string $name User name
+        * @param int $userId Both user name and ID must be provided
+        * @param IDatabase|null $dbw If you happen to have one lying around
+        * @return bool True on success, false on failure (e.g. invalid user ID)
+        */
+       public static function suppressUserName( $name, $userId, IDatabase $dbw = null ) {
                return self::setUsernameBitfields( $name, $userId, '|', $dbw );
        }
 
-       public static function unsuppressUserName( $name, $userId, $dbw = null ) {
+       /**
+        * @param string $name User name
+        * @param int $userId Both user name and ID must be provided
+        * @param IDatabase|null $dbw If you happen to have one lying around
+        * @return bool True on success, false on failure (e.g. invalid user ID)
+        */
+       public static function unsuppressUserName( $name, $userId, IDatabase $dbw = null ) {
                return self::setUsernameBitfields( $name, $userId, '&', $dbw );
        }
 }
index a71daa0..02247bd 100644 (file)
@@ -46,7 +46,7 @@ abstract class BaseTemplate extends QuickTemplate {
        /**
         * @param string $str
         * @warning You should never use this method. I18n messages should be escaped
-        * @deprecated 1.32 Use ->msg() or ->msgWiki() instead.
+        * @deprecated 1.32 Use ->msg() or ->getMsg() instead.
         * @suppress SecurityCheck-XSS
         * @return-taint exec_html
         */
@@ -55,7 +55,11 @@ abstract class BaseTemplate extends QuickTemplate {
                echo $this->getMsg( $str )->text();
        }
 
+       /**
+        * @deprecated since 1.33 Use ->msg() or ->getMsg() instead.
+        */
        function msgWiki( $str ) {
+               // TODO: Add wfDeprecated( __METHOD__, '1.33' ) after 1.33 got released
                echo $this->getMsg( $str )->parseAsBlock();
        }
 
index 06d0f7b..1e688eb 100644 (file)
@@ -129,7 +129,7 @@ abstract class QuickTemplate {
         * @private
         * @param string $msgKey
         * @warning You should never use this method. I18n messages should be escaped
-        * @deprecated 1.32 Use ->msg() or ->msgWiki() instead.
+        * @deprecated 1.32 Use ->msg() instead.
         * @suppress SecurityCheck-XSS
         * @return-taint exec_html
         */
@@ -140,10 +140,11 @@ abstract class QuickTemplate {
 
        /**
         * An ugly, ugly hack.
-        * @private
+        * @deprecated since 1.33 Use ->msg() instead.
         * @param string $msgKey
         */
        function msgWiki( $msgKey ) {
+               // TODO: Add wfDeprecated( __METHOD__, '1.33' ) after 1.33 got released
                global $wgOut;
 
                $text = wfMessage( $msgKey )->plain();
index 7a2679e..54dfff3 100644 (file)
@@ -719,7 +719,7 @@ abstract class Skin extends ContextSource {
                $title = $this->getTitle();
 
                if ( ( !$title->exists() || $action == 'history' ) &&
-                       $title->userCan( 'deletedhistory', $this->getUser() )
+                       $title->quickUserCan( 'deletedhistory', $this->getUser() )
                ) {
                        $n = $title->isDeleted();
 
index 873decb..a56a745 100644 (file)
@@ -261,7 +261,10 @@ class MediaStatisticsPage extends QueryPage {
         * @param string $mediaType
         */
        protected function outputTableStart( $mediaType ) {
-               $this->getOutput()->addHTML(
+               $out = $this->getOutput();
+               $out->addModuleStyles( 'jquery.tablesorter.styles' );
+               $out->addModules( 'jquery.tablesorter' );
+               $out->addHTML(
                        Html::openElement(
                                'table',
                                [ 'class' => [
index fe8fa19..0c74e76 100644 (file)
@@ -165,6 +165,8 @@ class SpecialTags extends SpecialPage {
                        }
                }
 
+               $out->addModuleStyles( 'jquery.tablesorter.styles' );
+               $out->addModules( 'jquery.tablesorter' );
                $out->addHTML( Xml::tags(
                        'table',
                        [ 'class' => 'mw-datatable sortable mw-tags-table' ],
index 4a586b7..1afbb5e 100644 (file)
@@ -40,6 +40,8 @@ class SpecialTrackingCategories extends SpecialPage {
                $this->setHeaders();
                $this->outputHeader();
                $this->getOutput()->allowClickjacking();
+               $this->getOutput()->addModuleStyles( 'jquery.tablesorter.styles' );
+               $this->getOutput()->addModules( 'jquery.tablesorter' );
                $this->getOutput()->addHTML(
                        Html::openElement( 'table', [ 'class' => 'mw-datatable sortable',
                                'id' => 'mw-trackingcategories-table' ] ) . "\n" .
index 78a1104..df9bb96 100644 (file)
@@ -72,6 +72,21 @@ class RemexCompatMunger implements TreeHandler {
                "mark" => true,
        ];
 
+       /**
+        * For the purposes of this class, "metadata" elements are those that
+        * should neither trigger p-wrapping nor stop an outer p-wrapping,
+        * typically those that are themselves invisible in a browser's rendering.
+        * This isn't a complete list, it's just the tags that we're likely to
+        * encounter in practice.
+        * @var array
+        */
+       private static $metadataElements = [
+               'style' => true,
+               'script' => true,
+               'link' => true,
+               'meta' => true,
+       ];
+
        private static $formattingElements = [
                'a' => true,
                'b' => true,
@@ -261,7 +276,11 @@ class RemexCompatMunger implements TreeHandler {
                $under = $preposition === TreeBuilder::UNDER;
                $elementToEnd = null;
 
-               if ( $under && $parentData->isPWrapper && !$inline ) {
+               if ( isset( self::$metadataElements[$elementName] ) ) {
+                       // The element is a metadata element, that we allow to appear in
+                       // both inline and block contexts.
+                       $this->trace( 'insert metadata' );
+               } elseif ( $under && $parentData->isPWrapper && !$inline ) {
                        // [B/b] The element is non-inline and the parent is a p-wrapper,
                        // close the parent and insert into its parent instead
                        $this->trace( 'insert B/b' );
index b83c209..e8cd94a 100644 (file)
@@ -506,7 +506,7 @@ class BotPassword implements IDBAccessObject {
                        return self::loginHook( $user, $bp,
                                Status::newFatal( 'botpasswords-needs-reset', $name, $appId ) );
                }
-               if ( !$passwordObj->equals( $password ) ) {
+               if ( !$passwordObj->verify( $password ) ) {
                        return self::loginHook( $user, $bp, Status::newFatal( 'wrongpassword' ) );
                }
 
index ef9137d..a7ac0db 100644 (file)
@@ -507,7 +507,7 @@ class Language {
         * Returns an array of localised namespaces indexed by their numbers. If the namespace is not
         * available in localised form, it will be included in English.
         *
-        * @return array
+        * @return string[] List of localized namespace names, indexed by numeric namespace ID.
         */
        public function getNamespaces() {
                if ( is_null( $this->namespaceNames ) ) {
@@ -4642,7 +4642,7 @@ class Language {
 
        /**
         * @param string $talk
-        * @return mixed
+        * @return string
         */
        function fixVariableInNamespace( $talk ) {
                if ( strpos( $talk, '$1' ) === false ) {
index e7b441c..37055b1 100644 (file)
        "subject": "موضوع/عنوان:",
        "minoredit": "هذا تعديل طفيف",
        "watchthis": "راقب هذه الصفحة",
-       "savearticle": "احÙ\81ظ Ø§Ù\84صÙ\81حة",
+       "savearticle": "حفظ الصفحة",
        "preview": "معاينة",
        "showpreview": "أظهر معاينة",
        "showdiff": "ورّي التبديلات",
        "tooltip-ca-nstab-template": "رؤية القالب",
        "tooltip-ca-nstab-category": "رؤية صفحة التصنيف",
        "tooltip-minoredit": "علم على هذا كتعديل طفيف",
-       "tooltip-save": "احÙ\81ظ ØªØºÙ\8aÙ\8aراتÙ\83",
+       "tooltip-save": "حفظ تغييراتك",
        "tooltip-preview": "اعرض تغييراتك، من فضلك استخدم هذا قبل الحفظ!",
        "tooltip-diff": "اعرض التغييرات التي قمت بها للنص.",
        "tooltip-compareselectedversions": "شاهد الفروق بين النسختين المختارتين من هذه الصفحة.",
index 4809994..0f8f7b7 100644 (file)
        "ipblocklist-submit": "Sēcan",
        "infiniteblock": "unendiende",
        "expiringblock": "forealdaþ on $1 on $2",
+       "blocklist-editing-page": "Trametas",
        "blocklink": "fortȳnan",
        "unblocklink": "unfortȳnan",
        "change-blocklink": "Andwendan fortȳnunge",
index f566d84..a4b998a 100644 (file)
        "subject": "موضوع/عنوان:",
        "minoredit": "هذا تعديل طفيف",
        "watchthis": "راقب هذه الصفحة",
-       "savearticle": "احÙ\81ظ Ø§Ù\84صÙ\81حة",
-       "savechanges": "احÙ\81ظ Ø§Ù\84تغÙ\8aÙ\8aرات",
+       "savearticle": "حفظ الصفحة",
+       "savechanges": "حفظ التغييرات",
        "publishpage": "نشر الصفحة",
        "publishchanges": "نشر التغييرات",
-       "savearticle-start": "احÙ\81ظ Ø§Ù\84صÙ\81حةâ\80¦",
+       "savearticle-start": "حفظ الصفحة…",
        "savechanges-start": "حفظ التغييرات...",
        "publishpage-start": "نشر الصفحة...",
        "publishchanges-start": "نشر التغييرات...",
        "editingsection": "تعديل $1 (قسم)",
        "editingcomment": "إنشاء قسم من «$1»",
        "editconflict": "تضارب تحرير: $1",
-       "explainconflict": "لقد عدل شخص آخر هذه الصفحة بعد أن بدأت أنت بتحريرها.\nصندوق النصوص العلوي يحتوي على النص الموجود حاليا في الصفحة.\nالتعديلات التي أجريتها أنت معروضة في الصندوق أسفله.\nويلزم دمجها في النص الموجود حاليا.\n'''لن يحفظ''' بعد الضغط على زر \"احفظ الصفحة\" '''إلا''' ما هو موجود في الصندوق العلوي.",
+       "explainconflict": "لقد عدل شخص آخر هذه الصفحة بعد أن بدأت أنت بتحريرها.\nصندوق النصوص العلوي يحتوي على النص الموجود حاليا في الصفحة.\nالتعديلات التي أجريتها أنت معروضة في الصندوق أسفله.\nويلزم دمجها في النص الموجود حاليا.\n<strong>لن يحفظ</strong> بعد الضغط على زر \"$1\" إلا ما هو موجود في الصندوق العلوي.",
        "yourtext": "نصك",
        "storedversion": "النسخة المخزنة",
        "editingold": "''' تحذير: أنت تقوم الآن بتحرير نسخة قديمة من هذه الصفحة.\nإذا قمت بحفظها، ستفقد كافة التغييرات التي حدثت بعد هذه النسخة. '''",
        "prefs-setemail": "تعيين عنوان البريد الإلكتروني",
        "prefs-email": "خيارات البريد الإلكتروني",
        "prefs-rendering": "المظهر",
-       "saveprefs": "احÙ\81ظ",
+       "saveprefs": "حفظ",
        "restoreprefs": "استرجاع كل الإعدادات الافتراضية (في كل الأقسام)",
        "prefs-editing": "التحرير",
        "searchresultshead": "بحث",
        "viewinguserrights": "عرض صلاحيات المستخدم {{GENDER:$1|للمستخدم|للمستخدمة}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "تعديل مجموعات {{GENDER:$1|المستخدم|المستخدمة}}",
        "userrights-viewusergroup": "عرض مجموعات {{GENDER:$1|المستخدم|المستخدمة}}",
-       "saveusergroups": "احÙ\81ظ Ù\85جÙ\85Ù\88عات {{GENDER:$1|اÙ\84Ù\85ستخدÙ\85|اÙ\84Ù\85ستخدÙ\85Ø©}}",
+       "saveusergroups": "حفظ مجموعات {{GENDER:$1|المستخدم|المستخدمة}}",
        "userrights-groupsmember": "عضو في:",
        "userrights-groupsmember-auto": "عضو ضمني في:",
        "userrights-groups-help": "يمكنك تغيير المجموعات التي ينتمي هذا المستخدم إليها:\n* يعني الصندوق المعلم أن المستخدم ضمن هذه المجموعة.\n* يعني الصندوق غير المعلم أن المستخدم ليس في هذه المجموعة.\n* تعني علامة * عدم إمكانية إزالة المجموعة متى ما أضفتها أو العكس.\n* تعني علامة # أنه يمكنك فقط تحديد تاريخ الانتهاء لعضوية هذه المجموعة؛ لكن لا يمكنك تقديمه بعد تحديده.",
        "rcfilters-savedqueries-apply-label": "أنشئ مرشحا",
        "rcfilters-savedqueries-apply-and-setdefault-label": "إنشاء مرشح افتراضي",
        "rcfilters-savedqueries-cancel-label": "ألغ",
-       "rcfilters-savedqueries-add-new-title": "احÙ\81ظ Ø¥Ø¹Ø¯Ø§Ø¯Ø§Øª Ø§Ù\84Ù\85رشحات الحالية",
+       "rcfilters-savedqueries-add-new-title": "Ø­Ù\81ظ Ø¥Ø¹Ø¯Ø§Ø¯Ø§Øª Ø§Ù\84Ù\85رشح الحالية",
        "rcfilters-savedqueries-already-saved": "هذه المرشحات محفوظة بالفعل. غير إعداداتك لإنشاء مرشح محفوظ جديد.",
        "rcfilters-restore-default-filters": "استرجاع المرشحات الافتراضية",
        "rcfilters-clear-all-filters": "مسح كل المرشحات",
        "uploadwarning": "تحذير الرفع",
        "uploadwarning-text": "من فضلك عدل وصف الملف أدناه وحاول مرة أخرى.",
        "uploadwarning-text-nostash": "من فضلك أعد رفع الملف، عدل الوصف بالأسفل وحاول مرة ثانية.",
-       "savefile": "احÙ\81ظ Ø§Ù\84Ù\85Ù\84Ù\81",
+       "savefile": "حفظ الملف",
        "uploaddisabled": "تم تعطيل الرفع",
        "copyuploaddisabled": "الرفع من مسار معطل.",
        "uploaddisabledtext": "رفع الملفات معطل.",
        "upload-dialog-button-cancel": "إلغاء",
        "upload-dialog-button-back": "رجوع",
        "upload-dialog-button-done": "تم",
-       "upload-dialog-button-save": "احÙ\81ظ",
+       "upload-dialog-button-save": "حفظ",
        "upload-dialog-button-upload": "رفع",
        "upload-form-label-infoform-title": "التفاصيل",
        "upload-form-label-infoform-name": "الاسم",
        "blocklist-nousertalk": "لا يمكنه تعديل صفحة نقاشه الخاصة",
        "blocklist-editing": "التحرير",
        "blocklist-editing-sitewide": "التحرير (على مستوى الموقع)",
+       "blocklist-editing-page": "الصفحات",
+       "blocklist-editing-ns": "النطاقات",
        "ipblocklist-empty": "قائمة المنع فارغة.",
        "ipblocklist-no-results": "عنوان الأيبي أو اسم المستخدم المطلوب غير ممنوع.",
        "blocklink": "امنع",
        "export-addcat": "أضف",
        "export-addnstext": "أضف صفحات من نطاق:",
        "export-addns": "أضف",
-       "export-download": "احÙ\81ظ Ù\83Ù\85Ù\84Ù\81",
+       "export-download": "حفظ كملف",
        "export-templates": "ضمن القوالب",
        "export-pagelinks": "ضمن الصفحات الموصولة إلى عمق:",
        "export-manual": "إضافة صفحات يدويا:",
        "tooltip-ca-nstab-help": "رؤية صفحة المساعدة",
        "tooltip-ca-nstab-category": "رؤية صفحة التصنيف",
        "tooltip-minoredit": "علم على هذا كتعديل طفيف",
-       "tooltip-save": "احÙ\81ظ ØªØºÙ\8aÙ\8aراتÙ\83",
+       "tooltip-save": "حفظ تغييراتك",
        "tooltip-publish": "انشر تغييراتك",
        "tooltip-preview": "اعرض تغييراتك، من فضلك استخدم هذا قبل الحفظ!",
        "tooltip-diff": "اعرض التغييرات التي أجريتها على النص.",
        "tooltip-upload": "ابدأ الرفع",
        "tooltip-rollback": "\"استرجاع\" تسترجع تعديلات آخر محرر لهذه الصفحة بضغطة واحدة",
        "tooltip-undo": "\"رجوع\" تسترجع هذا التعديل وتفتح نافذة التعديل في نمط العرض المسبق. تسمح بإضافة سبب في الملخص.",
-       "tooltip-preferences-save": "احÙ\81ظ Ø§Ù\84تغÙ\8aÙ\8aرات",
+       "tooltip-preferences-save": "حفظ التغييرات",
        "tooltip-summary": "أدخل ملخصا قصيرا",
        "common.css": "/* ستؤثر الأنماط المتراصة (CSS) المعروضة هنا على كل الواجهات */",
        "print.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على ناتج الطباعة */",
        "mediastatistics-header-text": "نصي",
        "mediastatistics-header-executable": "تنفيذية",
        "mediastatistics-header-archive": "صيغ مضغوطة",
+       "mediastatistics-header-3d": "ثلاثي الأبعاد",
        "mediastatistics-header-total": "كل الملفات",
        "json-warn-trailing-comma": "تمت إزالة {{PLURAL:$1|فاصلة انتهائية واحدة|فاصلتين انتهائيتين|$1 فاصلات انتهائية|$1 فاصلة انتهائية}} من JSON",
        "json-error-unknown": "وقعت مشكلة مع JSON. رسالة الخطأ: $1",
index 85d1118..4616ac3 100644 (file)
        "parser-template-loop-warning": "لووب القالب المحدد: [[$1]]",
        "parser-template-recursion-depth-warning": "حد عمق الريكيرشيون بتاع القالب اتعدى  ($1)",
        "language-converter-depth-warning": "حد عمق محول اللغه اتعدى ($1)",
-       "undo-success": "ممكن ترجع فى التعديل.\nلو سمحت تشوف المقارنة اللى تحت علشان تتأكد من إن هو دا اللى إنت عايز تعمله ،وبعدين احفظ التغييرات اللى تحت علشان ترجع فى التعديل.",
+       "undo-success": "ممكن ترجع فى التعديل.\nلو سمحت تشوف المقارنة اللى تحت علشان تتأكد من إن هو دا اللى إنت عايز تعمله، وبعدين سييف التغييرات اللى تحت علشان ترجع فى التعديل.",
        "undo-failure": "الرجوع فى التعديل ما نفعش علشان فى تعديلات متعاكسة حصلت فى الصفحة.",
        "undo-norev": "الرجوع فى التعديل ما نفعش علشان هو يا إما مش موجود أو انه إتمسح.",
        "undo-summary": "الرجوع فى التعديل $1 بتاع [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]])",
        "filereuploadsummary": "تغييرات الملف:",
        "filestatus": "حالة حقوق النسخ:",
        "filesource": "مصدر:",
-       "ignorewarning": "إتجاÙ\87Ù\84 Ø§Ù\84تحذÙ\8aر Ù\88 Ø§Ø­Ù\81ظ الملف وخلاص",
+       "ignorewarning": "اتجاÙ\87Ù\84 Ø§Ù\84تحذÙ\8aر Ù\88 Ø³Ù\8aÙ\8aÙ\81 الملف وخلاص",
        "ignorewarnings": "اتجاهل اى تحذير",
        "minlength1": "أسامى الملفات لازم تكون متكونة من حرف واحد على الأقل.",
        "illegalfilename": "اسم الملف \"$1\" فيه علامات  مش مسموح بيها فى عناوين الصفحات.\nلو سمحت تختار اسم تانى للمف و بعدين تحمله من اول و جديد.",
        "export-addcat": "زيادة",
        "export-addnstext": "اضافة صفحات من نطاق:",
        "export-addns": "اضافه",
-       "export-download": "احÙ\81ظ Ù\83Ù\85Ù\84Ù\81",
+       "export-download": "سÙ\8aÙ\8aÙ\81 Ù\83Ù\81اÙ\8aÙ\84",
        "export-templates": "دخل القوالب",
        "export-pagelinks": "تضمين الصفحات المتوصله لحد عمق :",
        "allmessages": "رسايل النظام",
index bbe6751..ca2f5b6 100644 (file)
@@ -18,7 +18,8 @@
                        "Macofe",
                        "Kareyac",
                        "Artsiom91",
-                       "Vlad5250"
+                       "Vlad5250",
+                       "Nerogaf"
                ]
        },
        "tog-underline": "Падкрэсьліваць спасылкі:",
        "blocklist-nousertalk": "ня можа рэдагаваць уласную старонку гутарак",
        "blocklist-editing": "рэдагаваньне",
        "blocklist-editing-sitewide": "рэдагаваньне (ва ўсім праекце)",
+       "blocklist-editing-page": "старонкі",
+       "blocklist-editing-ns": "прасторы назваў",
        "ipblocklist-empty": "Сьпіс блякаваньняў пусты.",
        "ipblocklist-no-results": "Паданы IP-адрас альбо імя ўдзельніка не заблякаваныя.",
        "blocklink": "заблякаваць",
index 395a425..98beff5 100644 (file)
        "subject-preview": "Предварителен преглед на заглавието:",
        "previewerrortext": "Възникна грешка при опита за преглед на промените.",
        "blockedtitle": "Потребителят е блокиран",
+       "blockedtext-partial": "<strong>Вашето потребителско име или IP-адрес е забранено да правите промени на тази страница. Все още можете да редактирате други страници в това уики. </strong> Всички подробности за забраната ще намерите в [[Special:MyContributions|приносите за сметката]].\n\nЗабраната даде $1.\n\nПосочената причина е <em>$2</em>.\n\n* Начало на забраната: $8\n* Край на забраната: $6\n* Забраната се отнася за: $7\n* Идентификатор на забраната #$5",
        "blockedtext": "'''Вашето потребителско име (или IP-адрес) беше блокирано.'''\n\nБлокирането е извършено от $1. Посочената причина е: ''$2''\n\n*Начало на блокирането: $8\n*Край на блокирането: $6\n*Блокирането се отнася за: $7\n\nМожете да се свържете с $1 или с някой от останалите [[{{MediaWiki:Grouppage-sysop}}|администратори]], за да обсъдите блокирането.\n\nМожете да използвате услугата „{{int:emailuser}}“ само ако не ви е забранена употребата ѝ и ако сте посочили валидна електронна поща в [[Special:Preferences|настройките]] си.\n\nВашият IP адрес е $3, а номерът на блокирането е $5. Включвайте едно от двете или и двете във всяко запитване, което правите.",
        "autoblockedtext": "IP-адресът ви беше блокиран автоматично, защото е бил използван от друг потребител, който е бил блокиран от $1.\nПосочената причина е:\n\n:<em>$2</em>\n\n* Начало на блокирането: $8\n* Край на блокирането: $6\n* Блокирането се отнася за: $7\n\nМожете да се свържете с $1 или с някой от останалите [[{{MediaWiki:Grouppage-sysop}}|администратори]], за да обсъдите блокирането.\n\nМожете да използвате услугата „{{int:emailuser}}“ само ако не ви е забранена употребата ѝ и ако сте посочили валидна електронна поща в [[Special:Preferences|настройките]] си.\n\nТекущият Ви IP-адрес е $3, а номерът на блокирането ви е $5.\nВключвайте ги във всяка заявка, която правите.",
        "systemblockedtext": "Вашето потребителско име или IP адрес беше автоматично блокирано от Медия Уики.\nПосочената причина е:\n\n:<em>$2</em>\n\n* Начало на блокирането: $8\n* Край на блокирането: $6\n* Блокирането се отнася за: $7\n\nВашият текущ IP адрес е $3.\nМоля, включете всичките детайли по-горе, ако правите каквито и да е запитвания.",
        "createaccountblock": "създаването на сметки е блокирано",
        "emailblock": "е-пощенската услуга е блокирана",
        "blocklist-nousertalk": "забрана за редактиране на личната беседа",
+       "blocklist-editing-page": "страници",
+       "blocklist-editing-ns": "именни пространства",
        "ipblocklist-empty": "Списъкът на блокиранията е празен.",
        "ipblocklist-no-results": "Указаният IP-адрес или потребител не е блокиран.",
        "blocklink": "блокиране",
        "mw-widgets-abandonedit-discard": "Отказване на редакциите",
        "mw-widgets-abandonedit-keep": "Продължаване на редактирането",
        "mw-widgets-abandonedit-title": "Сигурни ли сте?",
-       "mw-widgets-dateinput-no-date": "Ð\9dиÑ\89о Ð½Ðµ Ðµ Ð¸Ð·Ð±Ñ\80ано",
+       "mw-widgets-dateinput-no-date": "Ð\94аÑ\82аÑ\82а Ð½Ðµ Ðµ Ð¸Ð·Ð±Ñ\80ана",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "mw-widgets-mediasearch-input-placeholder": "Търсене на мултимедия",
index 991c514..e909192 100644 (file)
        "edit-local": "آلشڌکاری اشکافنیڌیٱل بۊمی",
        "create": "راس كردن",
        "create-local": "یٱ تۉزی ڤولات نشینی اْزاف کونین",
-       "delete": "حذف",
+       "delete": "پاکسا کردن",
        "undelete_short": "جوݩنیڌن(اْئیا){{PLURAL:$1|یٱ آلشڌکاری|$1 آلشڌکاری}}",
        "viewdeleted_short": "{{PLURAL:$1|پژارنیڌن یٱ پٱخڌار|$1 پژارنیڌن پخڌارٱل}}",
        "protect": "حفاظت وحمایت",
        "viewtalkpage": "دیدن بحث ها",
        "otherlanguages": "میٛن زڤونا دیٱ",
        "redirectedfrom": "(ڤاگٱردۊنی سی $1)",
-       "redirectpagesub": "صÙ\81Ø­Ù\87 ØªØµØ­Û\8cØ­ Ù\88Ù\87داÛ\8cت Ù\85جدد",
+       "redirectpagesub": "بٱÙ\84گاÙ\92 Ú¤Ø§Ú¯Ù±Ø±Ø¯Û\8aÙ\86Û\8c",
        "redirectto": "ڤاگٱردۊنی سی:",
        "lastmodifiedat": "ای بٱلگٱ تازاٛییا ماٛن $1 و میٛن $2 آلشدکاری ڤابیڌاْ.",
        "viewcount": "این صفحه قابل دسترسی شده است {{PLURAL:$1|once|$1 times}}.",
        "ok": "خووه",
        "pagetitle-view-mainpage": "سرصفحه",
        "retrievedfrom": "دوڤارتاْ جۊری ز \"$1\"",
-       "youhavenewmessages": "پیام تاره داری $1 ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|ایسا دارین}} $1 ($2).",
        "youhavenewmessagesfromusers": "اؽسا زاْ{{PLURAL:$3|یٱ مؽنتور داٛهر|$3  مؽنتور}} $1 دارین ($2).",
        "youhavenewmessagesmanyusers": "اؽسا زاْ بورؽ مؽنتور $1 دارین($2).",
        "newmessageslinkplural": "\n{{PLURAL:$1|پاٛخوم نۊ|999=پاٛخومٱل نۊ}}",
-       "newmessagesdifflinkplural": "$1 {{PLURAL:$1|آلشڌ|آلشڌا}}",
+       "newmessagesdifflinkplural": "$1 {{PLURAL:$1|آلشڌ|آلشڌٱل}}",
        "youhavenewmessagesmulti": "ایسا پیام تازه دارین منه\n$1",
        "editsection": "آلشدکاری کردن",
        "editold": "آلشدکاری کردن",
-       "viewsourceold": "دÛ\8cدÙ\86 Ù\85Ù\86بع",
+       "viewsourceold": "دÛ\8cئÙ\86 Ø³Ø±Ú\86Ø´Ù\85Ù±",
        "editlink": "آلشدکاری کردن",
        "viewsourcelink": "سئیل سرچشماْ کونین",
        "editsectionhint": "آلشدکاری بٱرجا: $1",
        "nstab-user": "بٱلگاْ کاریار",
        "nstab-media": "بلگأ ڤارسگأري",
        "nstab-special": "بٱلگاْ ڤیجٱ",
-       "nstab-project": "صÙ\81Ø­Ù\87 Ù¾Ø±Ù\88Ú\98Ù\87",
+       "nstab-project": "بٱÙ\84گاÙ\92 Ù¾Ù\88رÙ\88جاÙ\92",
        "nstab-image": "جانیا",
        "nstab-mediawiki": "پیغوم",
        "nstab-template": "چۊاْ",
        "mainpage-nstab": "سرتال",
        "nosuchaction": "چونوݩ عملؽ نؽڌآ",
        "nosuchactiontext": "عمل دزاْ آڤیڌاْ ڤاْ تیرنشون مؽنتوری بؽ اْتڤار هؽڌآ\nمومکن هؽڌآ تیرنشون مؽنتوری ناْ پٱلارنیڌ ڤامؽ کرڌاْ ڤۊهین یا دینا یٱ پاٛڤٱن بٱی ڌارؽ ناْ گریڌیناْ.\nهٱمچونوݩ مومکن هؽڌآ بٱی ڤ نٱرم ٱفزار ڤ کارگریداْ آڤیڌاْ در{{SITENAME}} ڤیڌاْ ڤۊهاْ",
-       "nosuchspecialpage": "Ú\86Ù\88Ù\86Ù\88 Ø¨Ù\84گاÙ\9b Û\8bÛ\8cجاÙ\9bیی دیاری نیکوناٛ",
+       "nosuchspecialpage": "Ú\86Ù\88Ù\86Ù\88 Ø¨Ù\84گاÙ\92Û\8cÛ\8c Ú¤Û\8cجاÙ\92یی دیاری نیکوناٛ",
        "nospecialpagetext": "<strong>اؽسا یٱ بٱلٛگاْ ڤیژاٛ بؽ اٛتڤار ناْ خاسیناْ.</strong>\n\nفاٛئرسڌاْ زاْ بٱلٛگیٱل ڤیژاٛ موجاز ڤ[[Special:SpecialPages|{{int:specialpages}}]] هؽڌا.",
        "error": "خطا",
        "databaseerror": "خٱتای ستینگٱ داڌاْ",
        "cannotdelete-title": "نٱتری بٱلٛگاْ$1 ناْ پژار کرڌ",
        "delete-scheduled": "بٱلٛگاْ$1 سی پاکسا کۊڌالکاری آڤیڌاْ.لوتفٱن سٱڤۊر ڤۊهین",
        "delete-hook-aborted": "پژار ڤا قولاڤ لٱق آڤیڌ\nاشکافنیڌنی سی هؽ داڌ نڤیڌ",
-       "badtitle": "عÙ\86Ù\88اÙ\86 Ø¨Ø¯",
-       "badtitletext": "عÙ\86Ù\88اÙ\86 Ø¯Ø±Ø®Ù\88استÛ\8c Ù\86اÙ\85عتبرØ\8c Ø®Ø§Ù\84Û\8cØ\8c Û\8cا Ø¹Ù\86Ù\88اÙ\86Û\8c Ø¨Û\8cÙ\86 Ø²Ø¨Ø§Ù\86Û\8c Û\8cا Ø¨Û\8cÙ\86â\80\8cÙ\88Û\8cÚ©Û\8câ\80\8cاÛ\8c Ø¨Ø§ Ù¾Û\8cÙ\88Ù\86د Ù\86ادرستÙ\87\nÙ\88 Ù\85Ù\85Ú©Ù\86Ù\87 Ø¯Ø§Ø±Ø§Û\8c Û\8cÚ© Û\8cا Ú\86Ù\86د Ú©Ø§Ø±Ø§Ú©ØªØ± Ø¨Ù\88Ù\87 Ú©Ù\87 Ø¯Ø± Ø¹Ù\86Ù\88اÙ\86 Ù\85ربÙ\88Ø· Ù\86Ù\88ا Ø²Ø´ Ø§Ø³ØªÙ\81ادÙ\87 Ú©Ù\86Û\8cÙ\86",
+       "badtitle": "داسÛ\8aÙ\86 Ú¯Ù±Ù\86",
+       "badtitletext": "داسÛ\8aÙ\86 Ø®Ø§Ø³Ø¯Ù\86Û\8c Ù\86ادÛ\8cارØ\8c Ù\87اÙ\84Û\8cØ\8c Û\8cا Ø¯Ø§Ø³Û\8aÙ\86Û\8c Ú©Ø§Ù\92 Ù\85Û\8cÙ\9bÙ\86جÙ\82ا Ø²Ú¤Ù\88Ù\86Û\8c Û\8cا Ù\85Û\8cÙ\9bÙ\86جÙ\82ا Ú¤Û\8cÚ©Û\8c Ú¤Ø§ Ù\87Ù\88Ù\85پاÙ\9bÛ\8cÚ¤Ù±Ù\86د Ø¯Ù\88رÙ\88سد Ù\86اراÙ\92 Ù\88 Û\8cا Ú¯Ø§Ø´Ø§ Ú\86Ù±Ù\86تا Ú©Ø§Ø±Ø§Ú©ØªØ± Ø¯Ø§Ø±Ø§Ù\92 Ú©Ø§Ù\92 Ú¤Ø§ Ù\85Û\8cÙ\9bÙ\86 Ø¯Ø§Ø³Û\8aÙ\86 Ù\86Û\89 Ø¨Ø§Ù\92Û\8cÙ\88Ù\81تاÙ\92 Ú¤Ø§ Ú©Ø§Ø±.",
        "title-invalid-empty": "اوڌڤان بٱلٛگاْ دٱرخاس آڤیڌاْ پٱتی هؽڌآ یا تاٛنا اوڌڤان مؽن نوم گوڌ آڤیڌاْ هؽڌآ",
        "title-invalid-utf8": "اوڌڤان بٱلٛگاْ دٱرخاس آڤیڌاْ هؽل ڤیڌاْ نادوروس یونیکوڌ هؽڌآ",
        "title-invalid-interwiki": "بٱلٛگاْ دٱرخاس آڤیڌاْ دارای پاٛڤٱن مؽن ڤیکی هؽڌآ کاْ نؽڤۊهاْ مؽن اوڌڤانٱل نهاڌاْ ڤۊهاْ",
        "title-invalid-characters": "اوڌڤان بٱلٛگاْ خاساْ آڤیڌاْ هؽلڤیڌاْ ناموجاز داراْ$1",
        "title-invalid-relative": "اوڌڤان دارای دزاٛئی هؽڌآ.اوڌڤانٱل کاْ دزاٛئی نسمی(چی /.یا/...) ناموجاز هؽڌن چیناکاْ ڤا موڌیگر مؽنتورٱل قاڤل دٱسرٱسی نؽڌن",
        "viewsource": "دیئن سرچشمٱ",
+       "viewsource-title": "ساٛیل سرچشماْ $1 کونین",
        "actionthrottled": "نها کار اؽسا گریداٛ آڤیڌ",
        "actionthrottledtext": "ڤ سی نهاگری زاْ ؤولٱ ڤیڌن چۊلکاری،اْجازاٛ نارین کاْ چونوݩ کارؽ ناْ ڤؽشڌر زاْ چٱن کرٱت ڤ یٱ رات کول ٱنجوم ڤڌین\nلوتفٱن دیناتٱر زاْ چٱن دٱیخاْ سٱرزنۊ پلرڌ کونین",
        "protectedpagetext": "ای بٱلٛگاْ سی نهاگری راْ آلشڌکاری یا جومجیل دهرؽ پلڌاری آڤیڌاْ",
-       "viewsourcetext": "اÛ\8cسا ØªØ±Û\8cÙ\86 Ø³Ø±Ú\86Ø´Ù\85اÙ\9b Ø§Û\8c Ø¨Ù\84گاÙ\9b Ù\86Ù± Ù\87Ù\85 Ø¨Ù\86Û\8cٱرÛ\8cÙ\86 Ù\88 Ù\87Ù\85 Û\8bوردارینس:",
+       "viewsourcetext": "اÛ\8cسا ØªØ§Ù\92رÛ\8cÙ\86 Ø³Ø±Ú\86Ø´Ù\85اÙ\92 Ø§Û\8c Ø¨Ù\84گاÙ\92 Ù\86اÙ\92 Ù\87Ù±Ù\85 Ø¨Ù\86Û\8cٱرÛ\8cÙ\86 Ù\88 Ù\87Ù\85 Ú¤وردارینس:",
        "invalidtitle": "داسۊن بی ٱرزشد",
        "exception-nologin": "هٱنی نٱڤۊڌیناٛ ڤامئن",
        "virus-scanfailed": "ٱسکٱن جۊر نٱڤابی (code $1)",
        "userlogin-yourname-ph": "نوم کاریاریتۊناْ بزنین",
        "yourpassword": "رمز:",
        "userlogin-yourpassword": "رازیناْ گوڤٱرتن",
-       "userlogin-yourpassword-ph": "رازينإ گوڤأرتن نأ بزأ",
-       "createacct-yourpassword-ph": "رازينإ گوڤأرتن نأ بزأ",
-       "createacct-yourpasswordagain": "پشت راسدکاري رازينإ گوڤأرتن",
-       "createacct-yourpasswordagain-ph": "ز نۉ رازينإ گوڤأرتن نأ بزأ",
-       "userlogin-remembermypassword": "Ù\85Û\88Ù\86Ø¥ Ù\85Ø¥Ù\86 Ø³Ø§Ù\85Û\88Ù\86Ø¥ ڤاڌار",
+       "userlogin-yourpassword-ph": "رازیناْ گوڤٱرتن نٱ بزٱ",
+       "createacct-yourpassword-ph": "رازیناْ گوڤٱرتن نٱ بزٱ",
+       "createacct-yourpasswordagain": "پوشت راسدکاری رازینٱ گوڤٱرتن",
+       "createacct-yourpasswordagain-ph": "ز نۉ رازیناْ گوڤٱرتن نٱ بزٱ",
+       "userlogin-remembermypassword": "Ù\85Û\8aÙ\86اÙ\92 Ù\85Û\8cÙ\9bÙ\86 Ø³Ø§Ù\85Û\8aÙ\86اÙ\92 ڤاڌار",
        "cannotlogin-title": "نٱترین بیایین ڤامئن",
        "yourdomainname": "پوشگر ايسا:",
        "login": "ڤامین ٱڤوڌن",
        "nav-login-createaccount": "اویدن به سیستم",
        "logout": "رهدن زه سیستم",
        "userlogout": "رهدن زه سیستم",
-       "userlogin-noaccount": "یأ هساڤ کارياري دارين؟",
-       "userlogin-joinproject": "أندوم ديارگأ {{SITENAME}} ڤابۈین",
+       "userlogin-noaccount": "یٱ هساڤ کاریاری دارین؟",
+       "userlogin-joinproject": "ٱندوم دیارگٱ {{SITENAME}} ڤابۊین",
        "createaccount": "راسد کردن هساڤ کاریاری",
-       "userlogin-resetpassword-link": "رازÛ\8cÙ\86Ø¥ Ú¯Ù\88ڤأرتÙ\86 ØªÛ\88 Ø² Ú¤Ù\8aرتÛ\88Ù\86 Ø±Ø£Ù\87Ú\8cØ¥",
-       "userlogin-helplink2": "هومياري کردن سي ڤامإن أڤوڌن",
+       "userlogin-resetpassword-link": "رازÛ\8cÙ\86اÙ\92 Ú¯Ù\88ڤٱرتÙ\86تÛ\8a Ø² Ú¤Û\8cرتÛ\8aÙ\86 Ø±Ù±Ù\87Ú\8cاÙ\92Ø\9f",
+       "userlogin-helplink2": "هومیاری کردن سی ڤامیٛن ٱڤوڌن",
        "createacct-emailrequired": "تيرنشۈن أنجومانامأ",
-       "createacct-emailoptional": "تيرنشۈن أنجومانامأ",
-       "createacct-email-ph": "تيرنشۈن أنجومانامأ تۈنأ بزنين",
+       "createacct-emailoptional": "تیرنشۊن ٱنجومانامٱ",
+       "createacct-email-ph": "تیرنشۊن ٱنجوماناماْ تۊناْ بزنین.",
        "createacct-another-email-ph": "تيرنشۈن أنجومانامأ تۈنأ بزنين",
        "createacct-reason": "دلیل",
-       "createacct-submit": "Ù\87ساڤ Ø®Ù\88تÛ\88Ù\86Ø¥ Ø±Ø§Ø³Ø¯ Ú©Ù\88Ù\86Ù\8aن",
+       "createacct-submit": "Ù\87ساڤ Ø®Ù\88تÛ\8aÙ\86اÙ\92 Ø±Ø§Ø³Ø¯ Ú©Ù\88Ù\86Û\8cن",
        "createacct-another-submit": "راسد کردن هساڤ کارياري",
-       "createacct-benefit-heading": "{{SITENAME}}  ڤئ دسد خلکي چي ايسا رأڤأندیاری ڤابيڌإ.",
-       "createacct-benefit-body1": "{{PLURAL:$1|ڤيرایشد|ڤيرایشدا}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|بألگأ|بألگإ آ}}",
-       "createacct-benefit-body3": "تازأ{{PLURAL:$1|Ù\87Ù\88Ù\85Ù\8aار|Ù\87Ù\88Ù\85Ù\8aارا}}",
+       "createacct-benefit-heading": "{{SITENAME}}  ڤ دٱسد خٱلکی چی ایسا رٱڤٱندیاری ڤابیڌاْ.",
+       "createacct-benefit-body1": "{{PLURAL:$1|آلشدکاری|آلشدکاریٱل}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|بٱلگاْ|بٱلگاْیٱل}}",
+       "createacct-benefit-body3": "تازاÙ\92{{PLURAL:$1|Ù\87Ù\88Ù\85Ù\8aار|Ù\87Ù\88Ù\85Ù\8aارٱÙ\84}}",
        "loginerror": "خٱتا سی ڤامئن ٱڤوڌن",
        "loginsuccesstitle": "اویدن با بخت وتوفیق به سیستم",
        "loginsuccess": "''' ایسا اویدن به داخل سایت {{SITENAME}} بعنوان \"$1\".'''",
        "createaccount-title": "هساڤ سي {{SITENAME}} راسد ڤابي",
        "loginlanguagelabel": "زڤون:$1",
        "pt-login": "ڤامین ٱڤوڌن",
-       "pt-login-button": "ڤاÙ\85Û\8cÙ\86 Ø§Ù\88Ú¤Û\8cڌن",
+       "pt-login-button": "ڤاÙ\85Û\8cÙ\9bÙ\86 Ù±Ú¤Ù\88ڌن",
        "pt-createaccount": "راسد کردن هساڤ کاریاری",
        "pt-userlogout": "ز سامۊناْ درٱڤوڌن",
        "changepassword": "آلشد کردن رازينإ گوڤأرتن",
        "botpasswords-label-grants-column": "داڌإ ڤابي",
        "resetpass-submit-loggedin": "آلشد کردن رازينإ گوڤأرتن",
        "resetpass-submit-cancel": "أنجومشيڤ کردن",
-       "passwordreset": "ز نۉ داڌن رازينإ گوأرتن",
+       "passwordreset": "ز نۉ داڌن رازیناْ گوڤٱرتن",
        "passwordreset-username": "نوم کارياري",
        "passwordreset-domain": "پوشگر",
        "passwordreset-email": "تيرنشۈن أنجومانامأ",
        "publishpage": "تیژنیڌن بٱلٛگاْ",
        "publishchanges": "تیژنیڌن آلشڌٱل",
        "savearticle-start": "کۊنیڌن بٱلٛگاْ",
-       "preview": "پیش نمایش",
+       "preview": "پيش ساٛیل",
        "showpreview": "نشۊن دائن پیش ساٛیل",
        "showdiff": "نشۊن دائن آلشدا",
        "anoneditwarning": "<strong>ب ڤیرتۊن بۊ:</strong> ایسا هاْنی نٱڤۊڌین ڤامین. تیرنشۊن آی پی ایسا سی هر گاتی کاْ آلشدکاری کونین سی کول خٱلک دیاراْ. ٱر <strong>[$1 رۉین ڤامین]</strong> یا <strong>[$2 یٱ هساڤ کاریاری راسد کونین]</strong>، آلشدکاریٱل ایسا ڤا نوم کاریاری خوتۊن دیاری اْبۊ و یو سی ایسا بیتراْ.",
        "summary-preview": "پیش نمایش - خلاصه:",
-       "blockedtext": " \"'''دسترسی نام کاربری یا نشانی اینترنتی ایسا بسته وابیده.'''\nای کار توسط $1 انجام شده‌است.\nدلیلی که گده اینه: $2''\n* آغاز قطع دسترسی: $8\n* زمان اتمام ای قطع دسترسی: $6\n* کاربری که قطع دسترسی‌اش در نظر بیده: $7\nایساترین با $1 یا یکی از [[{{MediaWiki:Grouppage-sysop}}|مدیران]] تماس بگیرین و در ای باره صحبت کنین.\nتوجه کنین که ایسا نترین زه امکان «ارسال پست الکترونیکی به ای کاربر» استفاده کنین مگر این که نشانی پست الکترونیکی معتبری در [[Special:Preferences|اولویتهای کاربری]]خود ثبت کرده بوین.\nنشانی IP ایسا $3 و شماره قطع دسترسی ایسا $5 است. لطفاً ای شماره‌ها را در همه کاوشهاتون ذکر کنین.\nایسا ترین با $1 یا یکی دیه زه [[{{MediaWiki:Grouppage-sysop}}|مدیران]] تماس بگیرین، تا در باره ای قطع دسترسی صحبت کنین.\nدقت کنین که سی ارسال پست الکترونیکی در ویکی، وا پست الکترونیکی خود را زه طریق صفحه[[Special:Preferences|تنظیمات]] فعال کرده بوین، و نیز، وا امکان استفاده زه ای ویژگی سی ایساقطع نبوه.\nنشانی اینترنتی الان ایسا $3 است و شماره قطع دسترسی $5 است.\nلطفاً ای شماره را در هر درخواستی که در ای مورد مطرح اکنین ذکر کنین",
+       "blockedtext": " \"'''دٱسرسی نوم کاریاری یا تیرنشۊن آی پی ایسا نیاگری ڤابیڌاْ.'''\n $1 چونو کرداْ.\nدلیلس یو بیڌاْ: $2''\n* شورۊ نیاگری: $8\n* مجال تٱموم ڤابیڌن نیاگری: $6\n* کاریاری کاْ ڤا نیاگری ڤابیڌاْ بۊ: $7\nایسا تاْرین ڤا $1 یا یکی ز [[{{MediaWiki:Grouppage-sysop}}|سٱردیڤۊنکارۊن]] تماس بگرین و ڤاسۊن گٱپ بزنین.\nب ڤیرتۊن بۊ کاْ ایسا ناْترن «ب ای کاریار ٱنجوماناماْ» بفرشنین مٱر تیرنشۊن جادیاری ناْ میٛن  [[Special:Preferences|چیا ٱسلی کاریاری]] خوتۊن سٱبت کرداْ بۊین.\nتیرنشۊن IP ایسا $3 و شوماراْ نیاگری ڤابیڌاْ ایسا $5 اْ. لوتفٱن چونو شوماراْ یٱلی ناْ میٛن پاٛی جۊریٱل تۊن ب ڤیرتۊن بۊ.",
        "loginreqtitle": "ڤامإن إڤوڌن لازومإ",
        "loginreqlink": "ڤامین ٱڤوڌن",
        "accmailtitle": "رازينإ گوڤأرتن فرشناڌإ ڤابيڌإ",
        "newarticle": "(تازه)",
-       "newarticletext": "ايسا ز دين یأ هومپیڤأندي هڌين کإ نيڌس. سي رأڤأندياري بألگإ شورۈ کونين مإن اي جأڤإ دإڤۈني بنڤيسين(سي دونسدن بیشدر سإیل [$1]کونین).\nأر ايسا سي إشتڤاکاري ايچونين، دوگمإ رأهڌن ڤاپوشد نأ بپۈرنين.",
+       "newarticletext": "ایسا ز دین یٱ هومپاٛیڤٱندی هڌین کاْ نیڌس. سی رٱڤٱندیاری بٱلگاْ شورۊ کونین میٛن ای جٱڤاْ داٛڤۊنی بنڤیسین(سی دۊنسدن بیشدر سئیل [$1]کونین).\nیر ایسا سی اْشتڤاکارش ايچونین، دوگماْ رٱهڌن ڤاپوشد نٱ بپۊرنین.",
        "noarticletext": " ایساْ ای بٱلگاْ نڤشداْیی ناراْ، ایسا تاْرین [[Special:Search/{{PAGENAME}}داسۊن ای بٱلگاْ نٱ میٛن بٱلگاْیٱل دیٱری پاٛی جۊری کونین]] یا [{{fullurl:{{FULLPAGENAME}}|action=edit}} ای بٱلگاْ نٱ آلشدکاری کونين].",
        "noarticletext-nopermission": " ایساْ ای بٱلگاْ نڤشداْیی ناراْ، ایسا تاْرین [[Special:Search/{{PAGENAME}}داسۊن ای بٱلگاْ نٱ میٛن بٱلگاْیٱل دیٱری پاٛی جۊری کونین]] یا [{{fullurl:{{FULLPAGENAME}}|action=edit}} ای بٱلگاْ نٱ آلشد کونين].",
-       "previewnote": "'''ای فقط یه پیش نمایشه;\nتغییراتی که ایسا دادین هنی ضبط نوابیده!'''",
-       "editing": "درحال اصلاح $1",
+       "userpage-userdoesnotexist-view": "هساو کاریاری \"$1\" سٱبت نٱڤابیڌاْ.",
+       "previewnote": "'''ب ڤیرتۊن بۊ یو یٱ پیش ساٛیلاْ;\nآلشدکاریٱلی کاْ ایسا هاْنی اْمایاْسۊن نکردیناْ!'''",
+       "continue-editing": "رۉ مئن راستاگاْ آلشدکاری",
+       "editing": "ب هال و بال آلشدکاری $1",
        "creating": "راسد کردن $1",
-       "editingsection": "درحاÙ\84 Ø§ØµÙ\84اح $1 (Ù\82سÙ\85ت)",
+       "editingsection": "ب Ù\87اÙ\84 Ù\88 Ø¨Ø§Ù\84 Ø¢Ù\84شدکارÛ\8c $1 (بٱرجا)",
        "yourtext": "متن ايسا",
        "copyrightwarning": "لطفاً دقت کنین که درنظر گریده ابوه که همه شراکتهای ایسا  {{SITENAME}} تحت «$2» منتشر ابون ).\n\n\n(سی دیدن  جزئیات بیشتر به $1 برین\n\nایر نه خوین نوشته‌هاتو بی‌رحمانه اصلاح بوه و به دلخواه ارسال بوه، ایچو نفرستن.<br />\nدرضمن ایسادارین به ایما قول ادین که خودتو یونه نوشتین یا هونه زه یک منبع آزاد با مالکیت عمومی یا مثل هو ورداشتین. '''کارهای دارای کارهای دارای حق کپی رایت را بی‌اجازه نفرستین!'''',",
-       "templatesused": "{{PLURAL:$1|چوٙأ|چوٙأیل}} ب کار گرهڌأ ڤابيڌإ مإن اي بألگأ:",
+       "templatesused": "{{PLURAL:$1|چۊاْ|چۊاْیٱل}} ڤا کار ڤٱسداْ میٛن ای بٱلگاْ:",
        "templatesusedpreview": "قالڤٱل یا اولگۊیٱل ڤاْ کار رٱئڌاْ مؽن ای نهانماو",
        "template-protected": "(پٱر و پیم ڤابیڌٱ)",
        "template-semiprotected": "(نسم نیماْ پٱر و پیم ڤابیڌاْ)",
-       "hiddencategories": "اي بلگأ یکي ز أندوما {{PLURAL:$1|1 hidden category|$1 hidden categories}} إ:",
+       "hiddencategories": "ای بٱلگاْ یکی ز ٱندوما {{PLURAL:$1|1 hidden category|$1 hidden categories}} اْ:",
        "nocreatetext": "{{SITENAME}}قابلیت درست کردن صفحات تازه را محدود کرده‌. ترین برگردین و صفحه‌ موجود را اصلاح کنین یا اینکه  [[Special:UserLogin|به سیستم داخل بوین یا حساب کاربری درست کنین]].",
        "permissionserrors": "پٱلاْ:اْجازاْ ڤگرا",
-       "permissionserrorstext-withaction": "ايسا سی نياگري $2 سإلا\nنارين {{PLURAL:$1|دلیل|دليلا}}:",
+       "permissionserrorstext-withaction": "ایسا سی نیاگری $2 ساٛلا\nنارین {{PLURAL:$1|دلیل|دلیلٱل}}:",
        "recreate-moveddeleted-warn": "'''هوشڌار: ایسا هنؽ سٱرزاْنۊ بٱلٛگی ناْ ؤرکل اْکونین کاْ نهاتٱرپاکسا آڤیڌاْ '''مؽن فرگ داشڌ ڤۊهین کاْ آلشڌ ای بٱلٛگاْ کارؽ دوروساْ هؽڌا آ نٱ. نمایاٛ پاکسا  مؽنڌار ڤا ای بٱلٛگاْ سی راهٱتی کار ڤا دینا آؤوڌاْ",
        "moveddeleted-notice": "ای بٱلٛیاْ پاکسا آڤیڌاْ،ؤرداوناْ سیاهؽ پاکسا،هناڌاری ۉ کلٛ کرڌن ای بٱلٛیاْ ؤرتی نهاڌ آڤیڌاْ",
        "content-model-wikitext": "ڤيکي تکست",
        "content-model-javascript": "جاڤا إسکريپت",
        "undo-failure": "سی نڤیڌن سلۊکی ڤا آلشڌکاریٱل مؽنجخائی ای آلشڌکاریناْ نؽڤۊ بؽ هرنڳ کرڌ",
-       "viewpagelogs": "نشودادن نمایه ها سی ای صفحه",
+       "viewpagelogs": "دیاری کردن پهرستنۊماْیٱل ای بٱلگاْ",
        "currentrev": "نسخه جاری",
-       "currentrev-asof": "آخرين ڤانيأري جۈر $1",
+       "currentrev-asof": "آخرین ڤانیٱری جۊر $1",
        "revisionasof": "ڤانیٱری چی $1",
-       "revision-info": "Ù\86Ù\88سÙ\82Ø¥ Ú¤Ø§Ù\86Ù\8aأرÙ\8a Ú¤Ø§Ø¨Ù\8aÚ\8cØ¥ Ø¬Û\88ر $1 ڤا $2",
+       "revision-info": "Ù\86Ù\88سÙ\82اÙ\92 Ú¤Ø§Ù\86Û\8cٱرÛ\8c Ú¤Ø§Ø¨Û\8cÚ\8cاÙ\92 Ø¬Û\8aر $1 ڤا $2",
        "previousrevision": "← ڤانیٱری دیندایی",
-       "nextrevision": "نسخه بعدی →",
-       "currentrevisionlink": "نسخه جاری",
+       "nextrevision": "نوسقاْ نیایی →",
+       "currentrevisionlink": "آخری ڤانیٱری",
        "cur": "ایسنی",
        "next": "نيایي",
        "last": "دیندایی",
        "page_first": "اولین",
        "page_last": "آخری",
-       "histlegend": "انتخاب متفاوت: علامت بنین رو رادیو جعبه ها زه آن نسخه ها سی مقایسه وامتیاز دادن ویا داخل تکمه های زیر سی مسابقه بوین  .<br />\n'شرح: (فعلی) = تفاوت با نسخه جاری\n(قبلی) = تفاوت با نسخه قبلی، جز = ویرایش جزئی',",
-       "history-fieldset-title": "پاٛی جۊری سی ۋانیاٛریا",
-       "histfirst": "دينداتري",
-       "histlast": "تازإترين",
+       "histlegend": "گولاْڤورچین کردن سٱڤا: رو رادیۉ جٱڤاْیٱل ڤانیٱری نشۊن باْنین سی کنار یٱک ناهاڌن و اْمتیاز داڌن و یا میٛن دوگماْیٱل ناْ سی موساڤقاْ بپۊرنین .<br />\n<br />\nمیرات: <strong>({{int:cur}})</strong> = فٱرخ ڤا نوسقاْ ایسنی, <strong>({{int:last}})</strong> =فٱرخ ڤا نوسقاْ دیندایی, <strong>{{int:minoreditletter}}</strong> = هیرداْ ڤیرایشت.",
+       "history-fieldset-title": "پاٛی جۊری سی ڤانیٱریٱل",
+       "histfirst": "دینداتری",
+       "histlast": "تازاÙ\92ترين",
        "historyempty": "(هالي)",
        "history-feed-title": "ؤیرگارکاْ آلشڌکاریٱل",
        "history-feed-description": "ؤرگارکاْ آلشڌکاریٱل ای بٱلٛگاْ مؽن ڤیکی",
-       "history-feed-item-nocomment": "$1 در $2",
+       "history-feed-item-nocomment": "$1 میٛن $2",
        "rev-delundel": "آلشد هال و بال ديڌن",
        "rev-showdeleted": "دياري کردن",
        "revdelete-show-file-submit": "هأرإ",
        "mergehistory-from": "بألگإ سرچشمأ:",
        "mergehistory-reason": "دلیل:",
        "mergelog": "سیائاْ ؤریٱک",
-       "history-title": "دڤارتإ دیئن ڤيرگار $1",
-       "difference-title": "فرخ مإنجقا ڤانإیريا \"$1\"",
+       "history-title": "دوڤارتاْ دیڌن ڤیرگار $1",
+       "difference-title": "فٱرخ میٛنجقا ڤاناٛیریا \"$1\"",
        "lineno": "خٱت $1:",
-       "compareselectedversions": "مقایسه نسخه‌های انتخاب‌ وابیده",
+       "compareselectedversions": "کنار یٱک ناهاڌن ڤانیٱریٱل گولاْڤورچین ڤابیڌاْ",
        "editundo": "ٱنجومشیڤ کردن",
+       "diff-empty": "(یٱ جۊر)",
        "diff-multi-sameuser": "({{PLURAL:$1|یٱ دۊناٛ نوسقاٛ مؽنجخایی|$1 نوسقاٛیٱل مؽنجخایی}} ب دٱسد{{PLURAL:$2|کاریاری ديٱ|$2 کاريارا}} نشۊن دیاری نٱکرداْ)",
+       "diff-multi-otherusers": "({{PLURAL:$1|یٱ نوسقاْ میٛنجقایی|$1 نوسقاْیٱل میٛنجایی}} ڤا دٱسد {{PLURAL:$2|کاریاری دیٱ|$2 کاریارٱل}} نشۊن داڌاْ نٱڤابیڌاْ)",
        "searchresults": "نتيجاْیٱل پاٛی جۊری",
        "searchresults-title": "نتيجاْیٱل پاٛی جۊری سی \"$1\"",
        "prevn": "دیندایی {{PLURAL:$1|$1}}",
        "nextn": "نیایی {{PLURAL:$1|$1}}",
+       "prevn-title": "دیندایی $1 {{PLURAL:$1|نتيجٱ|نتیجاْیٱل}}",
        "nextn-title": "نیایی $1 {{PLURAL:$1|نتيجٱ|نتیجاْیٱل}}",
        "shown-title": "نشۊن دائن $1 {{PLURAL:$1|نتیجاْ|نتیجاْیٱل}} سی هر بٱلگٱ",
        "viewprevnext": "دیئن ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-exists": "<strong>ایچو میٛن ای ڤیکی یٱ بٱلگاْ هڌ کاْاْسمس \"[[:$1]]\" اْ </strong> {{PLURAL:$2|0=|هٱمچونو ساٛیل نتیجاْیٱلی کاْ دیار کرداْ ناْ کونین.}}",
        "searchmenu-new": "<strong>اي بٱلگاْ نٱ میٛن \"[[:$1]]\" ای ڤیکی راسد کو!</strong> {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
        "searchprofile-articles": "بٱلگاْیٱل مینۊناْ دار",
        "searchprofile-images": "مۊلتی مدیا",
        "search-result-category-size": "\n{{PLURAL:$1|یٱهومڤٱن|$1 هومڤٱن}} ({{PLURAL:$2|یٱزؽر بنکۊ|$2 زؽر بنکۊ}}، {{PLURAL:$3|یٱ پٱرڤٱناْ|$3 پٱرڤٱناْ}})",
        "search-redirect": "(ڤاگٱردۊنی ز $1)",
        "search-section": "(بٱرجا $1)",
-       "search-suggest": "منزۈرت یو بي:$1",
+       "search-file-match": "(یکی کردن مینۊناْ جانیا)",
+       "search-suggest": "مٱنزۊرت یو بی:$1",
        "search-interwiki-more": "(بيشدر)",
        "searchall": "هٱمٱ",
        "search-showingresults": "{{PLURAL:$4|نتیجاْیٱل<strong>$1</strong> ز <strong>$3</strong>|نتیجاْ یٱل<strong>$1 - $2</strong ز <strong>$3</strong>}}",
        "group-bot": "روڤاتٱل",
        "group-sysop": "سٱردیڤۊنکارۊن",
        "grouppage-bot": "{{ns:project}}:بوتا",
-       "grouppage-sysop": "{{ns:project}}:مدیران",
+       "grouppage-sysop": "{{ns:project}}:سٱردیڤۊنکاریۊن",
        "right-writeapi": "سي نڤشدن اْی پی آی ڤٱنين ڤاکار",
        "newuserlogpage": "راسد ڤابیاْ ڤا کاریار",
-       "rightslog": "Ù\86Ù\85اÛ\8cÙ\87 Ø­Ù\82Ù\88Ù\82 Ú©Ø§Ø±Ø¨ر",
-       "action-edit": "ای بلگٱ نٱ ۋیرایشد کو",
+       "rightslog": "Ù¾Ù\87رستÙ\86Û\8aÙ\85اÙ\92 Ø­Ù\82Ù\88Ù\82 Ú©Ø§Ø±Û\8cار",
+       "action-edit": "ای بلگٱ نٱ آلشدکاری کو",
        "action-createaccount": "ڤاکل ای هساْڤ مؽنتوری",
        "nchanges": "$1 {{PLURAL:$1|تغییر|تغییرات}}",
        "enhancedrc-history": "ڤیرگار",
        "recentchanges": "آلشدکاریا ایسنی",
        "recentchanges-legend": "گوزیناْیٱل آلشدکاریٱل ایسنی",
        "recentchanges-summary": "دو بیشتر آلشدٱل تازاْ باڤ ڤیکی ناْ ز ای بٱلگاْ پاٛیگری کو.",
-       "recentchanges-feed-description": "ردیابی آخرین تغییرات  ویکی در ای خورد",
+       "recentchanges-noresult": "هیژ آلشدکاری میٛن گات ای چیا اْتفاق نٱڤٱسداْ",
+       "recentchanges-feed-description": "بیشتر آلشتکاریٱل تازاْ میٛن ڤیکی نٱ کاْ میٛن هڤال خۊنن پاٛیگری کو.",
        "recentchanges-label-newpage": "ای آلشدکای یٱ بٱلگاْ تازاْ راسد کرداْ",
        "recentchanges-label-minor": "یو یٱ ڤیرایشد کۊچیراْ",
        "recentchanges-label-bot": "ای ڤیرایشتاْ نٱ یٱ بوت ٱنجوم دائاْ",
        "recentchanges-label-plusminus": "ٱندازاْ بٱلگاْ ب شومار ای بایتٱل آلشد کرداْ.",
        "recentchanges-legend-heading": "<strong>میراس:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (هٱچونوݩ ڤاْ[[Special:NewPages|نومگٱ بٱلٛگیٱل نۊ]] ساٛل ؤوٱنین)",
-       "rcnotefrom": "ۋازیر {{PLURAL:$5|ۋیرایشد|ۋیرایشدا}}ز ۋیرگار strong>$3, $4</strong> تا ۋیرگار <strong>$1</strong>  دیاری اٛکونن .",
+       "rcnotefrom": "ڤازیر {{PLURAL:$5|آلشدکاری|آلشدکاریٱل}}ز ڤیرگار strong>$3, $4</strong> تا ڤیرگار <strong>$1</strong>  دیاری اْکونن .",
        "rclistfrom": "دیار کردن آلشدکاریٱل ز $3 $2",
        "rcshowhideminor": "آلشدکاری کۊچیر $1",
-       "rcshowhideminor-show": "نشون دائن",
+       "rcshowhideminor-show": "نشۊن دائن",
        "rcshowhideminor-hide": "قام کردن",
        "rcshowhidebots": "$1 بوتا",
        "rcshowhidebots-show": "نشۊن دائن",
        "rcshowhideliu-show": "دیار کردن",
        "rcshowhideliu-hide": "قام کردن",
        "rcshowhideanons": "$1 کاریارٱل ڤامیٛن نٱڤوڌاْ",
-       "rcshowhideanons-show": "نشون دائن",
+       "rcshowhideanons-show": "نشۊن دائن",
        "rcshowhideanons-hide": "قام کردن",
-       "rcshowhidepatr": "$1 Ø§ØµÙ\84احات Ù¾Ø§Ø³Ø¯Ø§Ø±Û\8c Ø´Ø¯Ù\87",
+       "rcshowhidepatr": "$1 Ø¢Ù\84شدکارÛ\8cÙ±Ù\84 ØªÛ\8cڤاÚ\8cاشت Ú¤Ø§Ø¨Û\8cÚ\8cاÙ\92",
        "rcshowhidemine": "$1 آلشدکاریا مو",
-       "rcshowhidemine-show": "نشون دائن",
+       "rcshowhidemine-show": "نشۊن دائن",
        "rcshowhidemine-hide": "قام کردن",
        "rclinks": "دیاری کردن دینائی $1 آلشڌ مؽن $2 رۊز دیندایی",
        "diff": "فٱرخ",
        "newpageletter": "ن",
        "boteditletter": "ب",
        "rc-change-size-new": "$1 {{PLURAL:$1|بایت|بایتا}} نیا آلشدکاری",
+       "rc-old-title": "زاتٱ چی \"$1\" راس ڤابیڌاْ",
        "recentchangeslinked": "آلشدکاریٱل تاْ یٱک",
        "recentchangeslinked-feed": "تغییرات مرتبط",
        "recentchangeslinked-toolbox": "آلشدکاریٱل تاْ یٱک",
        "recentchangeslinked-title": "آلشدکاریٱل تاٛ یکی سی $1",
-       "recentchangeslinked-summary": "Ù\86Ù\88Ù\85 Û\8cÙ± Ø¨Ù±Ù\84Ù\9bگاÙ\92 Ù\86اÙ\92 Ú¤Ø§Ù\85ؽ Ú©Ù\88Ù\86Û\8cÙ\86 ØªØ§ Ø¢Ù\84Ø´Ú\8cکارÛ\8c Ø¨Ù±Ù\84Ù\9bÚ¯Û\8cÙ±Ù\84 Ú©Ø§Ù\92 Ú¤Ø§Ù\92 Ù\87Ù\88Ù\85ؽÙ\86Ú\8cارکرÚ\8cÛ\8cÙ\86اÙ\92 Û\8cا Ø²Ø§Ù\92 Ù\87Ù\88 Ù\85ؽÙ\86Ú\8cارÛ\8c Ú¯Ø±Û\8cÚ\8cÛ\8cÙ\86 Ù\86اÙ\92 Ú¤Ú¤Û\8cÙ\86Û\8cÙ\86(سÛ\8c Ù\86Û\8cٱشÚ\8cÙ\86 Ù\87Ù\88Ù\85 Ú¤Ù±Ù\86Ù\88Ù\86اÙ\92 Û\8cÙ± Ø¨Ù\86Ú©Û\8a Ú\86Ù\88Ù\86Ù\88Ý© Ú\86Û\8c Ø§Ø¦Û\8c Ù\86اÙ\92 Ú¤Ø²Ù±Ù\86Û\8cÙ\86\86Ù\88Ù\85 Ø¨Ù\88Ù\86Ú©Û\8a). \nØ¢Ù\84Ø´Ú\8cکارÛ\8cÙ±Ù\84 Ø¨Ù\84Ù\9bÚ¯Û\8cÙ±Ù\84ؽ Ú©Ø§Ù\92 Ù\85ؽÙ\86[[Special:Watchlist|Ù\81اÙ\9bئرست دیناگریٱل اؽسا]] هؽڌن <strong>ؤٱرڌار</strong> نمای اْڤۊهاْ",
+       "recentchangeslinked-summary": "Ù\86Ù\88Ù\85 Û\8cÙ± Ø¨Ù±Ù\84Ù\9bگاÙ\92 Ù\86اÙ\92 Ú¤Ø§Ù\85ؽ Ú©Ù\88Ù\86Û\8cÙ\86 ØªØ§ Ø¢Ù\84Ø´Ú\8cکارÛ\8c Ø¨Ù±Ù\84Ù\9bÚ¯Û\8cÙ±Ù\84 Ú©Ø§Ù\92 Ú¤Ø§Ù\92 Ù\87Ù\88Ù\85ؽÙ\86Ú\8cارکرÚ\8cÛ\8cÙ\86اÙ\92 Û\8cا Ø²Ø§Ù\92 Ù\87Ù\88 Ù\85ؽÙ\86Ú\8cارÛ\8c Ú¯Ø±Û\8cÚ\8cÛ\8cÙ\86 Ù\86اÙ\92 Ú¤Ú¤Û\8cÙ\86Û\8cÙ\86(سÛ\8c Ù\86Û\8cٱشÚ\8cÙ\86 Ù\87Ù\88Ù\85 Ú¤Ù±Ù\86Ù\88Ù\86اÙ\92 Û\8cÙ± Ø¨Ù\86Ú©Û\8a Ú\86Ù\88Ù\86Ù\88Ý© Ú\86Û\8c Ø§Ø¦Û\8c Ù\86اÙ\92 Ú¤Ø²Ù±Ù\86Û\8cÙ\86\86Ù\88Ù\85 Ø¨Ù\88Ù\86Ú©Û\8a). \nØ¢Ù\84Ø´Ú\8cکارÛ\8cÙ±Ù\84 Ø¨Ù\84Ù\9bÚ¯Û\8cÙ±Ù\84ؽ Ú©Ø§Ù\92 Ù\85ؽÙ\86[[Special:Watchlist|Ù\86Ù\88Ù\85Ú¯Ù± دیناگریٱل اؽسا]] هؽڌن <strong>ؤٱرڌار</strong> نمای اْڤۊهاْ",
        "recentchangeslinked-page": "نوم بٱلگاْ:",
        "recentchangeslinked-to": "آلشدکاریٱلی کاْ میٛن بٱلگاْیٱل هومپاٛیڤٱند بیناْ ب جا بٱلگاْ داڌاْ ڤابیڌاْ دیاریسۊن کو",
        "upload": "سوڤار کردن جانیا",
        "uploadbtn": "آپلود فایل",
-       "uploadlogpage": "Ù\86Ù\85اÛ\8cÙ\87 Ø¢Ù¾Ù\84Ù\88د",
+       "uploadlogpage": "Ù¾Ù\87رستÙ\86Û\8aÙ\85اÙ\92 Ø³Ù\88ڤارکرد",
        "filedesc": "چكستٱ",
-       "license": "ماٛن حال و بال لیسانس دار ۋابیاٛن",
+       "license": "میٛن هال و بال لیسانس دار ڤابیڌن",
        "license-header": "میٛن هال و بال ليسانس دار ڤابيڌن",
-       "imgfile": "جانيا",
-       "listfiles": "Ù\84Û\8cست Ù\81اÛ\8cÙ\84",
+       "imgfile": "جانیا",
+       "listfiles": "Ù\86Ù\88Ù\85گاÙ\92 Ø¬Ø§Ù\86Û\8cا",
        "file-anchor-link": "جانیا",
        "filehist": "ڤیرگار جانیا",
        "filehist-help": "ری ڤیرگار بپۊرنین تا نوسقاْیی کاْ خاین باْنیٱرین",
        "filehist-comment": "ڤیر و باڤٱر",
        "imagelinks": "ڤا کار ڤٱندن جانیا",
        "linkstoimage": "پیشٱر گوهڌاْ ڤابیڌاْ {{PLURAL:$1|ڤا کار ڤٱندن بٱلگاْیٱل|$1 ڤا کار ڤٱندن بٱگاْیٱل }} سی ای جانیا:",
+       "linkstoimage-more": "More than $1 {{PLURAL:$1|page uses|pages use}} this file.\nThe following list shows the {{PLURAL:$1|first page|first $1 pages}} that use this file only.\nA [[Special:WhatLinksHere/$2|full list]] is available.",
        "nolinkstoimage": "ای پٱرڤٱناْ مؽن هیچ بٱلٛیاْ نؽڌا",
+       "linkstoimage-redirect": "$1 (ڤاگٱردۊنی جانیا) $2",
        "sharedupload": "ای فایل یک آپلود اشتراکی هده و ممکنه زه طریق  پروژه‌های دیگه  هم قابل دسترسی بوه",
        "sharedupload-desc-here": "جانیایی کاْ میٛن $1 گاشا میٛن پوروجٱیٱل هٱنی ٱم ب کار گرهڌاْ ڤابیڌاْ بۊ.\nتۉزی سی [$2 file description page] میٛن دڤۊن دیاراْ",
+       "filepage-nofile": "چونو جانیایی ڤا چونڤ اْسمی نیڌس.",
        "uploadnewversion-linktext": "آپلود کردن یه نسخه تازه زه ای فایل",
        "upload-disallowed-here": "ايسا ناْترین ای جانیا نٱ ز نۉ سوڤار کونین",
        "mimesearch": "MIME جستجو رو پایه",
        "fewestrevisions": "صفحات با کمترین تعداداصلاحات وتجدیدنظرها",
        "nbytes": "$1 {{PLURAL:$1|بایت|بایت}}",
        "nlinks": "$1 {{PLURAL:$1|لینک|لینکها}}",
-       "nmembers": "$1 {{PLURAL:$1|عضو|اعضا}}",
+       "nmembers": "$1 {{PLURAL:$1|ٱندوم|ٱندوما}}",
        "lonelypages": "صفحات یتیم وابیده",
        "uncategorizedpages": "صفحات دسته بندی نوابیده",
        "uncategorizedcategories": "دسته های دسته بندی نوابیده",
        "longpages": "صفحات بلند",
        "deadendpages": "صفحات بن بست ولاینحل",
        "protectedpages": "صفحات حفاظت وحمایت وابیده",
-       "listusers": "Ù\84Û\8cست Ú©Ø§Ø±Ø¨ر",
+       "listusers": "Ù\86Ù\88Ù\85گاÙ\92 Ú©Ø§Ø±Û\8cار",
        "newpages": "بٱلگاْیٱل نۏ",
        "ancientpages": "کهنه ترین صفحات",
        "move": "جابجا کردن",
        "movethispage": "جابجایی ای صفحه",
-       "pager-newer-n": "{{PLURAL:ۋانیاتر ز 1|ۋانیاتر ز $1}}",
-       "pager-older-n": "{{PLURAL:$1|گپساÙ\84تر 1|Ú¯پسالتر $1}}",
+       "pager-newer-n": "{{PLURAL:ڤانیاتر ز 1|ڤانیاتر ز $1}}",
+       "pager-older-n": "{{PLURAL:$1|گٱپساÙ\84تر 1|Ú¯Ù±پسالتر $1}}",
        "booksources": "سرچشماْیٱل کتاو",
-       "booksources-search-legend": "پی جۈري سي سرچشمإیل کتاڤ",
-       "booksources-search": "پی جۈري",
+       "booksources-search-legend": "پاٛ جۊری سی سٱرچٱشمٱیٱل کتاو",
+       "booksources-search": "پاٛی جۊری",
        "specialloguserlabel": "مؽنتور:",
-       "speciallogtitlelabel": "اÙ\88Ú\8cڤاÙ\86:",
+       "speciallogtitlelabel": "داÙ\84(داسÛ\8aÙ\86 Û\8cا {{ns:user}}:Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c Ø³Û\8c Ú©Ø§Ø±Û\8cار):",
        "log": "پاْرستنوماْیٱل",
        "all-logs-page": "گشڌنمائیٱل",
-       "allpages": "همه صفحات",
+       "alllogstext": "نمایشت یٱ جا کاْ تٱموم پهرستنۊماْیٱل میٛن {{SITENAME}}.\nایسا تاْرین ڤا گولاْڤورچین کردن جۊر پهرستنۊماْ ، نوم کاریاری(هساس ب کۊچیری و گٱپی هٱرفا) و بٱلگاْیٱل آلشت کرداْ(هساس ب گٱپی و کۊچیری هٱرفا) نمایشت نٱ دیر ز ڤیر کونین.",
+       "logempty": "چونو چی کاْ ایسا خاسدین میٛن پهرستنۊماْ نیڌس",
+       "allpages": "تٱموم بٱلگاْیٱل",
        "nextpage": "صفحه بعدی ($1)",
        "prevpage": "صفحه قبلی($1)",
        "allpagesfrom": "نمایش دادن صفحات با شروع زه:",
-       "allarticles": "همه صفحات",
+       "allarticles": "تٱموم بٱلگاْیٱل",
        "allpagessubmit": "رۉ",
        "allpagesprefix": "نشو دادن صفحات همراه با پیشوند:",
        "allpages-hide-redirects": "بؽ دیارنیڌن آلشڌتورٱل",
-       "categories": "دسته آ",
-       "emailuser": "امیل ای کاربر",
+       "categories": "دٱسداْیٱل",
+       "listgrouprights-members": "(نومگاْ ٱندومٱل)",
+       "emailuser": "ٱنجوماناماْ کاریار",
+       "usermessage-editor": "پاٛیغوم فرشن سامۊناْیی",
        "watchlist": "لیسڌ دیناگریٱل مو",
        "mywatchlist": "سئیل بٱرگ",
        "watchlistfor2": "سی $1 $2",
        "addedwatchtext": "صفحه «<nowiki>$1</nowiki>» به [[Special:Watchlist|لیست پی‌گیری‌های ]] ایسا\nاضاف وابید.\nتغییرات این صفحه و صفحه صحبت مر بوطه اش در آینده ایچو لیست ابوه. به‌علاوه، ای صفحه، سی واضح‌تر دیده وابیدن در [[Special:RecentChanges|فهرست تغییرات اخیر]] به شکل <b>سیاه</b> ایا.\n\nایر بعدا خواستین ای  صفحه زه لیست پی‌گیریهاتو ورداشته بوه، رو «'''عدم پی‌گیری'''» در بالای صفحه کلیک کنین.",
        "removedwatchtext": "آن صفحه\"[[:$1]]\" جابجا وابیده زه[[Special:لیست پیگیری|لیست پیگیری ایسا]].",
-       "watch": "پی‌گیری",
+       "watch": "پاٛیگری",
        "watchthispage": "پیگیری ای صفحه",
        "unwatch": "پاٛیگری نٱڤابیڌاْ",
        "watchlist-details": "{{PLURAL:$1|$1 بٱلٛگاْ|$1 بٱلٛگیٱل}} مؽن لیست دیناگری ایسا,هؽڌا",
        "confirmdeletetext": "ایسا اخوین یه صفحه بلند با همه گزارش تاریخی هونه حذف کنین.\nلطفا کانفیرم یا تائید کنین که تمایل وقصد ای کار را دارین, وایسا دوین یا می دانید نتایج وآثار ای کار را, و ایسا انجام ادین ای کار را مطابق با [[{{MediaWiki:Policy-url}}|سیاست‌ها]].",
        "actioncomplete": "عمل  مربوطه راکامل کن",
        "deletedtext": "\"$1\" حذف وابیده.\nبوین $2 سی ثبت حذف آخر.",
-       "dellogpage": "Ù\86Ù\85اÛ\8cÙ\87 _ Ø­Ø°Ù\81",
+       "dellogpage": "Ù¾Ù\87رستÙ\86Û\8aÙ\85اÙ\92 Ù¾Ø§Ú©Ø³Ø§ Ú©Ø±Ø¯Ù\86",
        "deletecomment": "دلیل:",
        "deleteotherreason": "دیه/دلیل اضافی:",
        "deletereasonotherlist": "دلیل دیه",
        "rollbacklink": "ڤورگٱشتن",
-       "rollbacklinkcount": "چڤاسإ کردن $1 {{PLURAL:$1|ویرایشت|ویرایشتیا}}",
-       "protectlogpage": "Ù\86Ù\85اÛ\8cÙ\87 Ø­Ù\81اظت Ù\88Ø­Ù\85اÛ\8cت",
+       "rollbacklinkcount": "چٱڤاساْ کردن $1 {{PLURAL:$1|آلشدکاری|آلشدکاریٱل}}",
+       "protectlogpage": "Ù¾Ù\87رستÙ\86Û\8aÙ\85اÙ\92 Ù¾Ù±Ø± Ù\88 Ù¾Û\8cÙ\85 Ú©Ø§Ø±Û\8c",
        "protectedarticle": "پٱر و پیم ڤابیڌاٛ \"[[$1]]\"",
        "modifiedarticleprotection": "بارت هناگری«[[$1]]» ناْ آلشڌنیڌ",
        "prot_1movedto2": "[[$1]] جابجا وابید به[[$2]]",
        "protect-text": "ایسا ممکنه بوینین وتغییر بدین سطح حمایت زه ای صفحه'''$1'''.",
        "protect-locked-access": "حساب کاربری ایسا اجازه تغییر سطح حمایت ای صفحه را نداره.\nای چونه تنظیمات جاری سی آن صفحه '''$1''':",
        "protect-cascadeon": "ای صفحه  در حال حاضر حفاظت وحمایت وابیده چون که در {{PLURAL:$1|صفحه|صفحات}}\nزیر که گزینه حفاظت وحمایت موجی {{PLURAL:$1|آن|آن‌ها}} فعال هده ،\nایسا ترین سطح حفاظت ای صفحه را تغییر بدین اما ای کارنتره تاثیری رو\nحفاظت وحمایت موجی صفحه داشته بوه.",
-       "protect-default": "Ù\87Ù\85اÙ\9b Ú©Ø§Ø±Û\8cارا سلادارن",
+       "protect-default": "Ù\87Ù±Ù\85اÙ\92 Ú©Ø§Ø±Û\8cارٱÙ\84 سلادارن",
        "protect-fallback": "درخواست\"$1\" اجازه",
        "protect-level-autoconfirmed": "بستن کاربران ثبت نام نوابیده",
        "protect-level-sysop": "Sysops فقط",
        "tooltip-namespace_association": "ای جٱڤاْ نٱ ڤارسی کونین نأ ڤارسي کونين، ای جٱڤاْ  ز ڤٱرگرهڌاْ چٱک چناْ یٱل داسۊن نوم ڤٱرگٱ شریکی و نوم ڤٱرگٱ گولاْڤورچیناْ.",
        "blanknamespace": "(ٱسلی)",
        "contributions": "{{GENDER:$1|کاریار}} هومیاریٱل",
-       "contributions-title": "هومیاری كاریارآ سی $1",
+       "contributions-title": "هومیاری کاریارٱل سی $1",
        "mycontris": "هومياریٱل",
        "anoncontribs": "هومياریٱل",
        "contribsub2": "سی {{GENDER:$3|$1}} ($2)",
        "nocontribs": "هیچ آلشڌؽ ڤا ای دیاریٱل جوساْ نڤیڌ",
-       "uctop": "تازاٛ باۋ",
-       "month": "در این ماه (و قبل زه آن):",
-       "year": "در ای سال (وقبل زه آن):",
+       "uctop": "تازاْ باو",
+       "month": "ز ای ما (دینداترس):",
+       "year": "ز ٱمسال (و سال دینداتری):",
+       "sp-contributions-newbies": "فٱقٱت هومیاریٱلی کاْ ز هساڤٱل تاز بیڌناْ دیاری کو.",
        "sp-contributions-newbies-sub": "سی حسابهای کاربری تازه",
-       "sp-contributions-blocklog": "Ù\86Ù\85اÛ\8cÙ\87 Ø¨Ø³ØªÙ\87 Ù\88ابÛ\8cدÙ\87 Ù\87ا",
-       "sp-contributions-uploads": "سوڤارکردا",
-       "sp-contributions-logs": "Ù\86Û\8bشدÙ\86 Ø±Ù\88Ø® Û\8bÙ\86دا",
+       "sp-contributions-blocklog": "Ù¾Ù\87رستÙ\86Ù\88Ù\85اÙ\92 Ù\82Ù\88Ù\84Ù\81 Ú¤Ø§Ø¨Û\8cÚ\8cاÙ\92",
+       "sp-contributions-uploads": "سوڤارکردٱل",
+       "sp-contributions-logs": "پاÙ\92رستÙ\86Û\8aÙ\85اÙ\92Û\8cÙ±Ù\84",
        "sp-contributions-talk": "چٱک چناٛ",
-       "sp-contributions-search": "سی هومیاریا پاٛی جۊری ۋابۊ",
+       "sp-contributions-search": "سی هومیاریٱل پاٛی جۊری ڤابۊ",
        "sp-contributions-username": "نوم ناٛشۊن آی پی یا نوم کاریاری",
+       "sp-contributions-toponly": "فقٱت آلشدکاریٱلی کاْ جۏزڤاْ آخریݩ دۉران دیاری کو",
+       "sp-contributions-newonly": "فٱقٱت آلشدکاریٱلی نٱ کاْ میٛن گات راست کردن بٱلگاْ بیڌناْ دیاری کو.",
        "sp-contributions-submit": "پاٛی جۊری",
        "whatlinkshere": "کوم هومپاٛیندٱل ایچونن",
        "whatlinkshere-title": "بٱلگاْیٱل هومپاٛیڤٱند ڤابیناْ ب \"$1\"",
        "whatlinkshere-page": "بٱلگاْ",
        "linkshere": "چونو بٱلگاْیٱلی هومپاٛیڤٱند ڤابیناْ ب '''$2''':",
-       "nolinkshere": "Ù\87Û\8cÚ\86 ØµÙ\81Ø­Ù\87 Ø§Û\8c Ù¾Û\8cÙ\88Ù\86د Ù\86داردبÙ\87 '''$2'''.",
+       "nolinkshere": "Ù\87Û\8cÚ\98 Ø¨Ù±Ù\84گاÙ\92 Ø¨ '''$2''' Ù\87Ù\88Ù\85 Ù¾Ø§Ù\9bÛ\8cÚ¤Ù±Ù\86د Ù\86اراÙ\92.",
        "isredirect": "بٱلگاْ ڤاگٱردۊنی",
        "istemplate": "ڤارو گونجایشدٱل",
        "isimage": "جانیا هومپاٛیڤٱند",
        "whatlinkshere-hideredirs": "$1 ڤاگٱردۊنی",
        "whatlinkshere-hidetrans": "ڤارو گونجایشدٱل $1",
        "whatlinkshere-hidelinks": "هومپاٛیڤٱند سی $1",
+       "whatlinkshere-hideimages": "جانیا هومپاٛیڤٱندٱل $1",
        "whatlinkshere-filters": "فيلترٱل",
        "blockip": "بستن کاربر",
-       "ipboptions": "Û² Ø³Ø§Ø¹Øª:2 hours,Û± Ø±Ù\88ز:1 day,Û³ Ø±Ù\88ز:3 days,Û± Ù\87Ù\81تÙ\87:1 week,Û² Ù\87Ù\81تÙ\87:2 weeks,Û± Ù\85اÙ\87:1 month,Û³ Ù\85اÙ\87:3 months,Û¶ Ù\85اÙ\87:6 months,Û± Ø³Ø§Ù\84:1 year,بÛ\8câ\80\8cÙ\86Ù\87اÛ\8cت:infinite",
+       "ipboptions": "Û² Ø³Ø§Øª:2 hours,Û± Ø±Û\8aز:1 day,Û³ Ø±Û\8aز:3 days,Û± Ù\87Ù±Ù\81تاÙ\92:1 week,Û² Ù\87Ù±Ù\81تاÙ\92:2 weeks,Û± Ù\85ا:1 month,Û³ Ù\85ا:3 months,Û¶ Ù\85ا:6 months,Û± Ø³Ø§Ù\84:1 year,بÛ\8c Ú¤Û\8cرگار:infinite",
        "ipblocklist": "آدرسهای  آی پی وکاربران بسته وابیدند",
        "infiniteblock": "بؽ تٱ",
+       "blocklist-editing-page": "بٱگاْیٱل",
        "blocklink": "نیاگری ڤابۊ !",
        "unblocklink": "باز بوه",
        "contribslink": "هٱیاری",
-       "blocklogpage": "Ù\86Ù\85اÛ\8cÙ\87 _ Ø¨Ø³ØªÙ\87â\80\8cÙ\88ابÛ\8cدÙ\87â\80\8cÙ\87ا",
-       "blocklogentry": "بسته وابید [[$1]] با سپری وابیدن وقت زه $2 $3",
+       "blocklogpage": "Ù¾Ù\87رستÙ\86Ù\88Ù\85اÙ\92 Ù\82Ù\88Ù\84Ù\81 Ú¤Ø§Ø¨Û\8cÚ\8cاÙ\92",
+       "blocklogentry": "قولف ڤابی [[$1]] ڤا خلاس ڤابیڌن گات ز $2 $3",
        "reblock-logentry": "ساموکارٱل بورسناْ دٱسرٱسی [[$1]]آلشڌ ڤاْ تٱهاْ بورسناْ دٱسرٱسی مؽن $2 $3",
        "block-log-flags-nocreate": "هرنڳ ؤرکلنیڌن هساڤ بؽ هرنڳ آڤیڌ",
        "proxyblocker": "ؤٱرڤٱناْ پروکسی",
        "movepage-moved": "'''\"$1\" جابجا وابیده به \"$2\"'''",
        "articleexists": "یه صفحه زه ای  نوم تقریبا موجوده, یا نومی که ایسا انتخاب کردین غیر  معتبره\nلطفا نوم دیه انتخاب کنین.",
        "movetalk": "جابجایی صفحه صحبت مربوطه",
-       "movelogpage": "Ù\86Ù\85اÛ\8cÙ\87 جابجایی",
+       "movelogpage": "Ù¾Ù\87رستÙ\86Û\8aÙ\85اÙ\92 جابجایی",
        "movereason": "دلیل:",
        "revertmove": "واگردانی",
        "export": "ڤ دٱر داڌن بٱلگاْیٱل",
        "tooltip-ca-addsection": "شورۊ کردن یٱ بٱرجا دیٱ",
        "tooltip-ca-viewsource": "ای بٱلگاْ پٱر و پیم ڤابیڌاْ.\nایسا تاْرین سرچشماْساْ بڤنین",
        "tooltip-ca-history": "دڤوارتاْ دیئن ای بٱلگٱ",
-       "tooltip-ca-protect": "Ø­Ù\81اظت Ù\88Ø­Ù\85اÛ\8cت Ø²Ù\87 Ø§Û\8c ØµÙ\81Ø­Ù\87",
-       "tooltip-ca-delete": "حذÙ\81 Ø§Û\8c ØµÙ\81Ø­Ù\87",
-       "tooltip-ca-move": "جابجاکردن ای صفحه",
+       "tooltip-ca-protect": "اÛ\8c Ø¨Ù±Ù\84گاÙ\92 Ù\86اÙ\92 Ù¾Ù±Ø± Ù\88 Ù¾Û\8cÙ\85 Ú©Ù\88",
+       "tooltip-ca-delete": "اÛ\8c Ø¨Ù±Ù\84گاÙ\92 Ù\86اÙ\92 Ù¾Ø§Ú©Ø³Ø§ Ú©Ù\88",
+       "tooltip-ca-move": "جابجا کردن ای بٱلگاْ",
        "tooltip-ca-watch": "اْزاف کردن ای بٱلگٱ ب سئیل بٱرگ خوتۊن",
-       "tooltip-ca-unwatch": "حذف ای صفحه زه لیست پی‌گیری‌های ایسا",
+       "tooltip-ca-unwatch": "ڤورداشتن بٱلگاْ ز ساٛیل بٱرگتۊن",
        "tooltip-search": "جوستن {{SITENAME}}",
        "tooltip-search-go": "رۉ میٛن بٱلگاْیٱلی کاْ نوم راستٱکی داشتاْ بۊن",
        "tooltip-search-fulltext": "بٱلگاْیٱل نٱ سی چونو نڤشداْیٱلی پاٛی جۊری کو",
        "tooltip-ca-nstab-user": "دیڌن بٱلگاْ کاریار",
        "tooltip-ca-nstab-media": "دیدن صفحه مدیا",
        "tooltip-ca-nstab-special": "ای بٱلگاْ یٱ بٱلگاْ ڤیجاْ، و نیبۊ آلشدکاریس کونین",
-       "tooltip-ca-nstab-project": "دیدن صفحه پروژه",
+       "tooltip-ca-nstab-project": "دیڌن بٱلگاْ پوروجاْ",
        "tooltip-ca-nstab-image": "دیئن بٱلگاْ جانیا",
-       "tooltip-ca-nstab-mediawiki": "دیدن پیام سیستم",
-       "tooltip-ca-nstab-template": "دیدن قالب قابل تغییر",
+       "tooltip-ca-nstab-mediawiki": "دیڌن پاٛیغوم سامۊناْ",
+       "tooltip-ca-nstab-template": "دیڌن چۊاْ",
        "tooltip-ca-nstab-help": "دیدن صفحه کمک",
        "tooltip-ca-nstab-category": "دیئن بٱلگاْ دٱسداْ بٱندی",
-       "tooltip-minoredit": "علامت نهادن به این به عنوان اصلاح حداقل یاکم",
+       "tooltip-minoredit": "یوناْ چی یٱ هیرداْ ڤیرایشت نشۊن دیار کو",
        "tooltip-save": "اْمایاْ کردن آلشدکاریتۊن",
        "tooltip-preview": "پیش سئیل آلشدکاریٱلتۊن، لوتف کونین یۊنونٱ دیندا اْمایاْ کردن ڤٱنین ڤا کار.",
        "tooltip-diff": "دیئن آلشدکاریٱلی کاْ ایسا میٛن ای متن راست کردیناْ.",
-       "tooltip-compareselectedversions": "دیدن تفاوتهای بین دونسخه انتخاب وابیده زه ای صفحه",
-       "tooltip-watch": "اضاف کردن ای صفحه به فهرست مشاهداتتان",
+       "tooltip-compareselectedversions": "دیڌن فٱرخ میٛنجقا دوتا نوسقاْ گولاْڤورچین ڤابیڌاْ ز ای بٱلگاْ.",
+       "tooltip-watch": "اْزاف کردن ای بٱلگٱ ب ساٛیل بٱرگ خوتۊن",
        "tooltip-recreate": "دوباره درست کردن صفحه ای که زه رو کینه وغرض پاک وابیده",
        "tooltip-upload": "شروع آپلود",
        "tooltip-rollback": "\"ڤورگٱنیئن\" لرنیڌن سی هال و بال ٱڤٱل ای بٱلگٱ سی یو کاْ هومیاری نیایی سی بیتٱر کردن بۊ ٱلڤٱت ڤا یٱ کرٱت پۊرنیڌن.",
-       "tooltip-undo": "انجوم نگرتن ای ویرایشت ورگن و همه فرمیا ویرایشت تانه که حالت پیش سیل واکو.یه اجازه میئه سی اضاف کردن یه دلیل د چکسته.",
+       "tooltip-undo": "ٱنجوم نٱگرهڌن ای آلشدکاری ناْ ڤورگٱن و هٱماْ فورمٱل ڤیرایشت کاریا نٱ جۊر هال و بال پیش سئیل کو. چونو کاری بتون سلا اْڌاْ کاْ ب چٱکستاْ خوتۊن یٱ دلیل اْزاف کونین.",
        "tooltip-summary": "یٱ چکستاْ کۊچیر ناْ بیارین ڤامیٛن",
        "simpleantispam-label": "Anti-spam check.\nپور<strong>نکنين</strong> ایچو ناْ!",
        "pageinfo-title": "ڌونائی زاْ «$1»",
        "pageinfo-robot-policy": "فاٛئرست کرڌن ڤا روڤات",
        "pageinfo-robot-index": "موجاز",
        "pageinfo-robot-noindex": "بؽ اعتڤار",
-       "pageinfo-watchers": "Ø´Ù\88Ù\85اراÙ\9b دیناگروناٛ بٱلٛگاْ",
+       "pageinfo-watchers": "Ø´Ù\88Ù\85اراÙ\92 دیناگروناٛ بٱلٛگاْ",
        "pageinfo-few-watchers": " ساوا تٱر زاْ $1 {{PLURAL:$1| دیناگری|دیناگری}}",
        "pageinfo-redirects-name": "بور آلشڌ لۊرٱل ڤاْ ای بٱلٛگاْ",
        "pageinfo-subpages-name": "زؽر بٱلٛگیٱل ای بٱلٛگاْ",
        "pageinfo-subpages-value": "1 ($2 {{PLURAL:$2|آلشڌتور|آلشڌ تور}}; $3 {{PLURAL:$3|خاٛراز آلشڌ تور|خاٛراز آلشڌ تور}})",
        "pageinfo-firstuser": "بٱلگاْ راس کون",
+       "pageinfo-firsttime": "گات دروس ڤابیڌن بٱلگاْ",
        "pageinfo-lastuser": "آخری ڤیرایشتکار",
        "pageinfo-lasttime": "گات آخری ڤیرایشت",
+       "pageinfo-edits": "کول آلشدکاریٱل",
+       "pageinfo-authors": "شوماراْ کولی نڤیسیارٱل یٱکۊنٱ",
+       "pageinfo-recent-edits": "شوماراْ آلشدکاریٱل ایسنی (د $1 دینداتر)",
+       "pageinfo-recent-authors": "شوماراْ کولی نڤیسیارٱل یٱکۊنٱ",
        "pageinfo-magic-words": "{{PLURAL:$1|قساْ|قساْ}} جادۊیی ($1)",
        "pageinfo-hidden-categories": "{{PLURAL:$1| بنکۊ|بنکۊ}} بؽ دیار ( $1 )",
        "pageinfo-templates": "{{PLURAL:$1|اولگۊیٱل|اولگۊیٱل}} اْسفاڌاْ آڤیڌاْ ($1)",
        "pageinfo-toolboxlink": "ڌونائیٱل بٱلٛگاْ",
        "pageinfo-contentpage": "باٛئنٱت آڤیڌاْ ڤاْ اوڌڤان بٱلٛگاْ موهتٱڤائی",
        "pageinfo-contentpage-yes": "هٱراٛ",
-       "patrol-log-page": "سیاهاْ لاٛر",
-       "previousdiff": "← اصلاح قدیمی",
-       "nextdiff": "تفاوت بعدی→",
+       "patrol-log-page": "پهرستنۊماْ لاٛر",
+       "previousdiff": "← آلشدکاری دیندایی",
+       "nextdiff": "آلشدکاری تازاْتر→",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|بلگاْ|بلگاْیٱل}}",
        "file-info-size": "$1 × $2 پیکسل, ٱندازاْ جانیا: $3, MIME جۊر: $4",
        "file-info-size-pages": "<span style=\"direction:ltr\">$1 × $2</span> نوخڌاْ، مٱشلٱقی پٱرڤٱناْ: $3، نوع MIME پٱرڤٱناْ: $4، $5 بٱلٛگاْ",
        "file-nohires": "ٱسگ بیتری زس نی",
-       "svg-long-desc": "SVG فایل, تقریبا$1 × $2 پیکسل, اندازه فایل: $3",
+       "svg-long-desc": "SVG جانیا، تٱقریڤٱن $1 × $2 پیکسل، ٱندازاْ جانیا: $3",
        "show-big-image": "جانیا ٱسلی",
        "show-big-image-preview": "ٱندازاْ ای پیش سئیل:$1.",
        "show-big-image-other": "هاْنی{{PLURAL:$2|گٱپ نما کردن|گٱپ نما کردنیٱل}}: $1.",
        "metadata-collapse": "قایم کردن جزئیات تفصیلی",
        "metadata-fields": "رشناْیٱل گٱپ دۊنسمٱندیٱلی کاْ میٛن ای پاٛیغوم نومگٱ کاری ڤابیڌاْ ناْ ز ڤٱر گرهڌاْ بٱلگاْ ٱسگی کاْ گات ڤٱختی کاْ جٱدڤٱل گٱپ دۊنسمٱندیٱل ڤا اْبۊن دیاری کونن.\n*راست کو\n*مودل\n*مجال گات ٱسل\n*گات آشگار\n*اْف اْن شومارٱ\n*ایزو نرخ میٛن سورٱت\n*فوکالنس\n*هونٱرمٱند\n*کوپی رایت\n*هال و بال جی پی اْس \n*جی پی اْس گٱپ\n*جی پی اْس هٱماْ جۊرٱ",
        "namespacesall": "هٱمٱ",
-       "monthsall": "Ù\87Ù\85Ù\87 Ù\85اÙ\87Ù\87ا",
+       "monthsall": "Ù\87Ù±Ù\85Ù±",
        "semicolon-separator": "؛&#32;",
        "imgmultipagenext": "بٱلٛگاْ دینائی",
        "imgmultigo": "رۉڤا",
        "imgmultigoto": "رٱئڌن ڤاٛ بٱلٛگاْ $1",
        "watchlisttools-clear": "پاکسانیڌن فاٛئرسڌ دیناگری",
-       "watchlisttools-view": "نشودادن تغییرات مربوطه",
-       "watchlisttools-edit": "نشودادن واصلاح کردن لیست پیگیریها",
-       "watchlisttools-raw": "اصÙ\84اح Ù\84Û\8cست Ø®Ø§Ù\85 Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87ا",
+       "watchlisttools-view": "ساٛیل کردن آلشدکاریٱل چی یٱک",
+       "watchlisttools-edit": "دیڌن و آلشدکاری کردن ساٛیل بٱرگ",
+       "watchlisttools-raw": "Ø¢Ù\84شدکارÛ\8c Ø³Ø§Ù\9bÛ\8cÙ\84 Ø¨Ù±Ø±Ú¯",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|چٱک چنٱ]])",
        "version": "ترجمه یا تفسیر",
        "redirect": "آلشد لۊر ڤا پٱرڤٱناْ،مؽنتور،بٱلٛگاْ دبارنوماْ نوسخاْ",
        "redirect-submit": "رۉ",
+       "redirect-lookup": "پاٛی جۊری",
        "redirect-value": "ٱرزایشت:",
        "redirect-user": "نوم دیارکون کاریار:",
        "redirect-page": "دیارکار بٱلٛگاْ",
+       "redirect-revision": "ڤانیٱری بٱلگاْ",
        "redirect-file": "نوم جانیا",
        "specialpages": "بٱلگاْیٱل ڤیجٱ",
        "tag-filter": "[[Special:سٱرڌیسٱل|سٱرديس]]فیلتر:",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|سرديس|سرديسا}}]]: $2",
        "tags-active-yes": "هٱراٛ",
        "tags-active-no": "نٱ",
-       "tags-hitcount": "$1 {{PLURAL:$1|Ø¢Ù\84شت|Ø¢Ù\84شتا}}",
+       "tags-hitcount": "$1 {{PLURAL:$1|Ø¢Ù\84شدکارÛ\8c|Ø¢Ù\84شدکارÛ\8cÙ±Ù\84}}",
        "logentry-delete-delete": "$1 بٱلگاْ {{GENDER:$2|پاکسا ڤابيڌاْ}} $3",
        "logentry-delete-restore": "$1{{GENDER:$2|آلشڌ کرڌن}} بٱلٛگاْ ناْ$3سی$4",
        "logentry-delete-revision": "$1 دیاری {{PLURAL:$5|یٱ نوسخاْ|$5 نوسخاْ}} بٱلٛگاْ $3 ناْ{{GENDER:$2|آلشڌکرڌ}}: $4",
        "revdelete-content-hid": "هؽلنیڌناْ بؽڌیارکرڌ",
-       "logentry-move-move": "$1 {{GENDER:$2|جا ب جا کردإ}} بألگأ $3 نأ سي $4",
+       "logentry-move-move": "$1 {{GENDER:$2|جا ب جا کرداْ}} بٱلگاْ $3 نٱ سی $4",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|جا ب جا کرد}} بٱلگاْ $3 نٱ سی $4 بی یو یٱ ڤاگٱردۊنی داشداْ بۊ",
        "logentry-move-move_redir": "$1 بٱلٛگاْ $3 ناْ ڤاْ $4 کاْ آلشڌ تور ڤیڌاْ {{GENDER:$2|کل کرڌ}}",
        "logentry-patrol-patrol-auto": "$1 نوسخهٔ $4 بٱلٛگاْ $3 ناْ خودکار ڤاْ عنڤان لرخوؤٱرداٛ {{GENDER:$2|دزاْ کونین}}",
        "logentry-newusers-create": "هساڤ کاریاری $1 {{GENDER:$2|راسد ڤابی}}",
-       "logentry-newusers-autocreate": "حساڤ $1  ڤاْ بارت خوڌکار {{GENDER:$2|ؤرکل آڤیڌاْ}}",
-       "logentry-upload-upload": "$1 {{GENDER:$2|سوڤار کرده}} $3",
+       "logentry-newusers-autocreate": "هساڤ $1  ڤاْ بارت خوڌکار {{GENDER:$2|ؤرکل آڤیڌاْ}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|سوڤار کرداْ}} $3",
+       "logentry-upload-overwrite": "$1 یٱ نوسقاْ تازاْ ز $3 ناْ {{GENDER:$2|سوڤار کرد}}",
        "searchsuggest-search": "جوستن {{SITENAME}}",
-       "duration-days": "$1 رۊز",
+       "duration-days": "$1 {{PLURAL:$1|رۊز|رۊزٱل}}",
        "randomrootpage": "بٱلٛگاْ بونی تٱساڌفی"
 }
index e9626b1..9b12df8 100644 (file)
        "blocklist-nousertalk": "nemůže editovat svou diskusní stránku",
        "blocklist-editing": "editování",
        "blocklist-editing-sitewide": "editování (na celém projektu)",
+       "blocklist-editing-page": "stránky",
+       "blocklist-editing-ns": "jmenné prostory",
        "ipblocklist-empty": "Seznam probíhajících bloků je prázdný.",
        "ipblocklist-no-results": "Požadovaná IP adresa nebo uživatelské jméno není blokováno.",
        "blocklink": "zablokovat",
        "tags-active-no": "Ne",
        "tags-source-extension": "Definována softwarem",
        "tags-source-manual": "Přidávána ručně uživateli a roboty",
-       "tags-source-none": "Už nepoužívána",
+       "tags-source-none": "Již nepoužívána",
        "tags-edit": "editovat",
        "tags-delete": "smazat",
        "tags-activate": "aktivovat",
index 9c524c7..a79c51c 100644 (file)
        "watchnologin": "Ikke logget på",
        "addwatch": "Tilføj til overvågningsliste",
        "addedwatchtext": "\"[[:$1]]\" og tilhørende diskussionsside er blevet tilføjet til din [[Special:Watchlist|overvågningsliste]].",
+       "addedwatchtext-talk": "\"[[:$1]]\" og dens tilhørende side er blevet føjet til din [[Special:Watchlist|overvågningsliste]].",
        "addedwatchtext-short": "Siden \"$1\" er blevet tilføjet til din overvågningsliste.",
        "removewatch": "Fjern fra overvågningsliste",
        "removedwatchtext": "\"[[:$1]]\" og tilhørende diskussionsside er blevet fjernet fra din [[Special:Watchlist|overvågningsliste]].",
+       "removedwatchtext-talk": "\"[[:$1]]\" og dets tilhørende side er blevet fjernet fra din [[Special:Watchlist|overvågningsliste]].",
        "removedwatchtext-short": "Siden \"$1\" er blevet fjernet fra din overvågningsliste.",
        "watch": "Overvåg",
        "watchthispage": "Overvåg side",
        "emailblock": "e-mail blokeret",
        "blocklist-nousertalk": "kan ikke redigere egen diskussionsside",
        "blocklist-editing": "redigering",
+       "blocklist-editing-page": "sider",
+       "blocklist-editing-ns": "navnerum",
        "ipblocklist-empty": "Blokeringslisten er tom.",
        "ipblocklist-no-results": "Den angivene IP-addresse eller brugernavn er ikke blokeret.",
        "blocklink": "blokér",
index fb4e149..a717dfa 100644 (file)
        "blocklist-editing": "Bearbeiten",
        "blocklist-editing-sitewide": "Bearbeiten (gesamte Website)",
        "blocklist-editing-page": "Seiten",
+       "blocklist-editing-ns": "Namensräume",
        "ipblocklist-empty": "Die Liste enthält keine Einträge.",
        "ipblocklist-no-results": "Die gesuchte IP-Adresse/der Benutzername ist nicht gesperrt.",
        "blocklink": "Sperren",
index 1311f94..514716b 100644 (file)
        "toc": "Zerreki",
        "showtoc": "bımocne",
        "hidetoc": "bınımne",
-       "collapsible-collapse": "Teng kı",
+       "collapsible-collapse": "Teng ke",
        "collapsible-expand": "Hera ke",
        "confirmable-confirm": "{{GENDER:$1|Şıma}} pêbawerê?",
-       "confirmable-yes": "E",
+       "confirmable-yes": "Eya",
        "confirmable-no": "Nê",
        "thisisdeleted": "Bıvêne ya zi $1 peyser biya?",
        "viewdeleted": "$1 bıvin?",
        "ns-specialprotected": "Pelê xısusiyi nêşenê bıvurriyê.",
        "titleprotected": "No sername terefê [[User:$1|$1]] ra, afernayene ra şevekiyayo.\nSebebê xo <em>$2</em> dero.",
        "filereadonlyerror": "Dosyay vurnayışê \"$1\" nê abêno lakin depoy dosya da \"$2\" mod dê  salt wendi de yo.\n\nXızmetkarê  kılit kerdışi wa bewniro enay wa çım ra ravyarn o: \"$3\".",
+       "invalidtitle": "Sernuşteyo nêravêrde",
        "invalidtitle-knownnamespace": "Canemey \"$2\" u metnê \"$3\" xırabo",
        "invalidtitle-unknownnamespace": "Sernameye nêşınasiya yana amraiya canameyo  $1 u metno \"$2\" xırab",
        "exception-nologin": "Şıma cıkewtış nêvıraşto",
        "userlogin-remembermypassword": "Mı biya xo viri",
        "userlogin-signwithsecure": "Ebe teqdimkerê asayişın cıkewe",
        "cannotlogin-title": "Cı nëkewtë",
+       "cannotlogin-text": "Cı kewtış mıkum niyo",
        "cannotloginnow-title": "Enewke ronıştışo nêabeno",
        "cannotloginnow-text": "$1 karkerdışa ronıştış akerdış mıkum niyo.",
        "cannotcreateaccount-title": "Nêşenay hesab rakerê",
        "savechanges": "Vurnayışan qeyd ke",
        "publishpage": "Riperri bare ke",
        "publishchanges": "Vırnayışan qeyd ke",
+       "savearticle-start": "Pel qeyd kerê...",
+       "savechanges-start": "Vurnayışa qeyd kerê...",
+       "publishpage-start": "Na pel neşr kerê...",
+       "publishchanges-start": "Vırnayışa neşr kerê...",
        "preview": "Verqayt",
        "showpreview": "Verasayışi bımocne",
        "showdiff": "Vurnayışan bımocne",
        "sitecsspreview": "'''Şımayê enewke tenya verqaytê dosya da CSS vınenê.''' \n'''Hewna qayd nêbı!'''",
        "sitejspreview": "'''Şımayê enewke tenya verqaytê kodê dosya da JavaScriptê karberi vınenê.''' \n'''hewna qayd nebı!'''",
        "userinvalidconfigtitle": "'''Teme:''' Mewzuyê \"$1\" çıniyo.\nDosyanê be namey .css u .js'i de herfa werdiye bıgurêne, mesela herında {{ns:user}}:Foo/Vector.css'i de {{ns:user}}:Foo/vector.css bınuse.",
-       "updated": "(Rozeneya)",
+       "updated": "(Bi rocane)",
        "note": "'''Not:'''",
        "previewnote": "'''Şıma bızanê ke eno yew verqayto.'''\nVurnayışê şıma hewna qeyd nêbiyê!",
        "continue-editing": "Şo herunda vurnayışi",
        "recentchangesdays": "Rocê ke vurnayışanê peyênan de bıasê:",
        "recentchangesdays-max": "Tewr zaf $1 {{PLURAL:$1|roc|roci}}",
        "recentchangescount": "Halê est-amardışi ra mocnayışi rê amarê vırnayışan:",
-       "prefs-help-recentchangescount": "Ney de vurnayışê peyêni, tarixê pelan u cıkewteni asenê.",
+       "prefs-help-recentchangescount": "Azami reqem: 1000",
        "prefs-help-watchlist-token2": "Na pawıtış nımnayi kılta listada şımaya.\nOke kıliti zano şeno listeya tamaşann bıvino. Poğta coy ra kesiya me hesırne. \n[[Special:ResetTokens|Na kıliti reset kerdışi re tiyay bıploğne]].",
        "savedprefs": "Tecihê şıma qeyd biy.",
        "savedrights": "{{GENDER:$1|$1}}  gruba karberi qeyd  biya.",
        "prefs-searchoptions": "Cı geyre",
        "prefs-namespaces": "Heruna naman",
        "default": "qısur",
-       "prefs-files": "Dosyey",
+       "prefs-files": "Dosyeyi",
        "prefs-custom-css": "CSSê xasi",
        "prefs-custom-json": "JSONo xısusi",
        "prefs-custom-js": "JSê xasi",
        "group-autoconfirmed-member": "{{GENDER:$1|Karberê ke otomatikmen biyê araşt}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|İdarekar}}",
+       "group-interface-admin-member": "{{GENDER:$1|Adminê rıasayışi}}",
        "group-bureaucrat-member": "{{GENDER:$1|buroqrat}}",
        "group-suppress-member": "{{GENDER:$1|Temaşekar}}",
        "grouppage-user": "{{ns:project}}:Karberi",
        "grouppage-autoconfirmed": "{{ns:project}}:Karberê ke otomatikmen biyê araşt",
        "grouppage-bot": "{{ns:project}}:Boti",
        "grouppage-sysop": "{{ns:project}}:İdarekeri",
+       "grouppage-interface-admin": "{{ns:project}}:Adminê rıasayışi",
        "grouppage-bureaucrat": "{{ns:project}}:Burokrati",
        "grouppage-suppress": "{{ns:project}}:Teftişkar",
        "right-read": "Pera bıwané",
        "right-editusercss": "Dosyanê CSSiê karberanê binan sero bıgureye",
        "right-edituserjson": "Dosyanê JSONiyê karberanê binan bıvurne",
        "right-edituserjs": "Dosyanê JSiê karberanê binan sero bıgureye",
+       "right-editsitecss": "Sitewide CSS Bıvurne",
+       "right-editsitejson": "Sitewide JSON Bıvurne",
+       "right-editsitejs": "Sitewide JavaScript'i Bıvurne",
        "right-editmyusercss": "CSS dosyaya karberinda ğo timar ke",
        "right-editmyuserjson": "Dosyanê JSONiyê xo bıvurne",
        "right-editmyuserjs": "JavaScript dosyaya karberinda ğo timar ke",
        "recentchanges-legend-plusminus": "''(±123)''",
        "recentchanges-submit": "Bımocne",
        "rcfilters-tag-remove": "'$1' wedare",
+       "rcfilters-activefilters": "Filtreyo aktiv",
        "rcfilters-activefilters-hide": "Bınımne",
        "rcfilters-activefilters-show": "Bımocne",
        "rcfilters-activefilters-hide-tooltip": "Heruna parzûnanê aktifan bınımne",
        "rcfilters-activefilters-show-tooltip": "Heruna parzûnanê aktifan bımocne",
+       "rcfilters-advancedfilters": "Filtreyo ravêrşiyayey",
        "rcfilters-limit-title": "Neticeyê ke bımocniyê",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|vurnayış|vurnayışi}}, $2",
        "rcfilters-days-title": "Rocê peyêni",
        "rcfilters-hours-title": "Seatê peyêni",
        "rcfilters-days-show-days": "($1 {{PLURAL:$1|roce|roci}})",
-       "rcfilters-days-show-hours": "($1 {{PLURAL:$1|seate|seati}})",
+       "rcfilters-days-show-hours": "($1 {{PLURAL:$1|saete|saeti}})",
+       "rcfilters-quickfilters-placeholder-title": "Qet yew filtre qeyd nêbiyo",
        "rcfilters-savedqueries-rename": "Reyna name ke",
        "rcfilters-savedqueries-setdefault": "Wa hesabiyaye bımano",
        "rcfilters-savedqueries-remove": "Bestere",
        "rcfilters-savedqueries-cancel-label": "Bıtexelne",
        "rcfilters-filterlist-title": "Parzûni",
        "rcfilters-filterlist-whatsthis": "Nê çıtewri guriyenê?",
+       "rcfilters-highlightmenu-title": "Yew reng weçine",
        "rcfilters-filtergroup-authorship": "Wayiriya iştırakan",
        "rcfilters-filter-editsbyself-label": "Vurnayışê şıma",
        "rcfilters-filter-editsbyself-description": "İştırakê şıma.",
        "rcfilters-filter-editsbyother-label": "Ê binan ra vurnayışi",
        "rcfilters-filter-user-experience-level-registered-label": "Qeydıni",
+       "rcfilters-filter-user-experience-level-registered-description": "Cıkewte editori",
+       "rcfilters-filter-user-experience-level-unregistered-label": "Bêqeydıni",
        "rcfilters-filter-user-experience-level-newcomer-label": "Ameyayeyê neweyi",
        "rcfilters-filter-user-experience-level-newcomer-description": "Karberê qeydınê ke 10 ra kemi vurnayışi ya zi 4 rocan ra fealiyetê xo estê.",
        "rcfilters-filter-user-experience-level-learner-label": "Musayoği",
+       "rcfilters-filter-user-experience-level-experienced-label": "Karberê Mısayey",
        "rcfilters-filter-bots-label": "Bot",
        "rcfilters-filter-humans-label": "İnsan (bot niyo)",
        "rcfilters-filter-humans-description": "Terefê insanan ra vuriyayışi.",
        "rcfilters-filter-reviewstatus-auto-label": "Otomatik kontrol bi",
        "rcfilters-filtergroup-significance": "Gıraniye",
+       "rcfilters-filter-minor-label": "Vurriyayışê werdiyi",
+       "rcfilters-filter-minor-description": "Vurriyayışê ke nuştekari vurnayışo werdi etiket kerdê.",
+       "rcfilters-filter-major-label": "Vurriyayışê ke werdi niyê",
        "rcfilters-filtergroup-watchlist": "Pelê ke seyr benê",
        "rcfilters-filter-watchlist-watched-label": "Lista seyrkerdışi de",
+       "rcfilters-filter-watchlist-watchednew-label": "Vurnayışê lista temaşiya newiye",
        "rcfilters-filter-watchlist-notwatched-label": "Lista seyrkerdışi de niya",
        "rcfilters-filtergroup-watchlistactivity": "Fealiyetê pela seyrkerdışi",
        "rcfilters-filter-watchlistactivity-unseen-label": "Vuriyayışê ke nêvêniyê",
        "rcfilters-filter-previousrevision-label": "Çımraviyarnayışo peyên niyo",
        "rcfilters-filter-excluded": "Xarıc",
        "rcfilters-tag-prefix-namespace-inverted": "$1 <strong>:nê</strong>",
+       "rcfilters-liveupdates-button": "Rocaneyê ganıni",
+       "rcfilters-liveupdates-button-title-on": "Rocaneyê ganıni racıne",
        "rcnotefrom": "Cêr de <strong>$2</strong> ra nata {{PLURAL:$5|vurnayışiyê}} asenê (tewr vêşi <strong>$1</strong> asenê) <strong>$3, $4</strong>",
        "rclistfrom": "$3 sehat $2 ra tepiya vurnayışanê neweyan bımotne",
        "rcshowhideminor": "Vırnayışê werdiy $1",
        "listfiles_size": "Gırdiye",
        "listfiles_description": "Şınasnayış",
        "listfiles_count": "Versiyoni",
-       "listfiles-show-all": "Asayışa versiyonandé verénan",
+       "listfiles-show-all": "Versiyonanê dosyayê verênan zerre ke",
        "listfiles-latestversion": "Versiyono verin",
        "listfiles-latestversion-yes": "Eya",
        "listfiles-latestversion-no": "Nê",
        "apisandbox-dynamic-parameters": "Parametreya debyayi",
        "apisandbox-dynamic-parameters-add-label": "Parametre dek:",
        "apisandbox-dynamic-parameters-add-placeholder": "Nmaey parametrey",
+       "apisandbox-add-multi": "Cı ke",
        "apisandbox-submit-invalid-fields-title": "Tay çiy ters şı",
        "apisandbox-results": "Peyniy",
        "apisandbox-sending-request": "API waştış rışêno...",
        "ipb-disableusertalk": "Pela xoya werênayışi bıvurne",
        "ipb-change-block": "Karberi be enê eyaran reyna piya bloke ke.",
        "ipb-confirm": "Bloke kerdışi tesdik ke",
+       "ipb-sitewide": "Site hemi de",
+       "ipb-partial": "Qısmi",
+       "ipb-pages-label": "Peli",
        "ipb-namespaces-label": "Heruna nameyan",
        "badipaddress": "Adresê IPî raşt niyo",
        "blockipsuccesssub": "Blok biyo",
        "createaccountblock": "Hesab vıraştene men biya",
        "emailblock": "e-mail men kerd",
        "blocklist-nousertalk": "Perra xo'ya suhbeti vırnaene nêbena",
+       "blocklist-editing": "vurnayış",
+       "blocklist-editing-sitewide": "vurnayış (site hemi de)",
+       "blocklist-editing-page": "peli",
+       "blocklist-editing-ns": "Heruna nameyan",
        "ipblocklist-empty": "Listay kılit kerdışi venga.",
        "ipblocklist-no-results": "Adresa IPya waştiye ya zi nameyê karberi kılit nêbiyo.",
        "blocklink": "kılit ke",
        "hours-abbrev": "$1h",
        "days-abbrev": "$1d",
        "seconds": "{{PLURAL:$1|$1 saniya|$1 saniyeyan}}",
-       "minutes": "{{PLURAL:$1|$1 deqa|$1 deqan}}",
-       "hours": "{{PLURAL:$1|$1 saete|$1 saetan}}",
+       "minutes": "{{PLURAL:$1|$1 deqa|$1 deqeyi}}",
+       "hours": "{{PLURAL:$1|$1 saete|$1 saeti}}",
        "days": "{{PLURAL:$1|$1 roce|$1 roci}}",
-       "weeks": "{{PLURAL:$1|$1 hefte|$1 heftey}}",
+       "weeks": "{{PLURAL:$1|$1 hefte|$1 hefteyi}}",
        "months": "{{PLURAL:$1|aşme|$1 aşmi}}",
        "years": "{{PLURAL:$1|$1 serre|$1 serri}}",
        "ago": "Verê $1",
        "htmlform-cloner-delete": "Wedare",
        "logentry-delete-delete": "$1 perra $3 {{GENDER:$2|esterıte}}",
        "logentry-delete-restore": "$1 pela $3 ($4) {{GENDER:$2|peyser arde}}",
+       "restore-count-files": "{{PLURAL:$1|1 dosya|$1 dosyeyi}}",
        "logentry-delete-event": "$1 $3: $4 de asayışê {{PLURAL:$5|cıkerdışi|cıkerdışan}} {{GENDER:$2|vurna}}",
        "logentry-delete-revision": "$1 pela $3: $4 de asayışê {{PLURAL:$5|yew revizyoni|$5 revizyonan}} {{GENDER:$2|vurna}}",
        "logentry-delete-event-legacy": "$1 Asayışê {{GENDER:$2|vurnayışê}} $3 dekerde de",
        "api-error-stashfailed": "Xırabiya zerrek:Wasteri idari dosyey kerdi vıni.",
        "api-error-unknown-warning": "İqazo nêzanaye: \"$1\".",
        "api-error-unknownerror": "$1 de yew xeta veciye.",
-       "duration-seconds": "$1 {{PLURAL:$1|saniya|saniyey}}",
-       "duration-minutes": "$1 {{PLURAL:$1|deqa|deqey}}",
-       "duration-hours": "($1 {{PLURAL:$1|seate|seati}})",
+       "duration-seconds": "$1 {{PLURAL:$1|saniya|saniyeyi}}",
+       "duration-minutes": "$1 {{PLURAL:$1|deqa|deqeyi}}",
+       "duration-hours": "($1 {{PLURAL:$1|saete|saeti}})",
        "duration-days": "($1 {{PLURAL:$1|roce|roci}})",
-       "duration-weeks": "$1 {{PLURAL:$1|hefte|heftey}}",
+       "duration-weeks": "$1 {{PLURAL:$1|hefte|hefteyi}}",
        "duration-years": "$1 {{PLURAL:$1|serre|serri}}",
        "duration-decades": "$1 {{PLURAL:$1|dades|dadesi}}",
        "duration-centuries": "$1 {{PLURAL:$1|seserre|seserri}}",
        "mw-widgets-dateinput-placeholder-day": "SSSS-AA-RR",
        "mw-widgets-dateinput-placeholder-month": "SSSS-AA",
        "mw-widgets-titleinput-description-redirect": "berd be $1",
+       "mw-widgets-usersmultiselect-placeholder": "Tayêna cı ke...",
+       "mw-widgets-titlesmultiselect-placeholder": "Tayêna cı ke...",
        "randomrootpage": "Pela raştmameya rıçıkıne",
        "log-action-filter-block": "Tipê kılitkerdışi:",
        "log-action-filter-newusers": "Babetê hesabvıraştışi:",
        "log-action-filter-all": "Pêro",
        "log-action-filter-block-block": "Kılitkerdış",
+       "authprovider-resetpass-skip-label": "Bıvêre",
+       "authprovider-resetpass-skip-help": "Peysereştışê parola ra bıvêre.",
+       "authform-notoken": "Tokeno kemi",
+       "authform-wrongtoken": "Tokeno xırab",
        "changecredentials": "Malumatanê karberi bıvurnê",
        "removecredentials": "Kamiye wedarne",
-       "removecredentials-submit": "Kamiyer wedarne"
+       "removecredentials-submit": "Kamiyer wedarne",
+       "revid": "Revizyonê $1",
+       "pageid": "IDyê pela $1",
+       "gotointerwiki": "{{SITENAME}} ra abırriyeno",
+       "passwordpolicies-group": "Grube",
+       "passwordpolicies-policies": "Politikeyi",
+       "passwordpolicies-policy-minimalpasswordlength": "Parola gani tewr senık be {{PLURAL:$1|1 karakter|$1 karakteran}} derg bo"
 }
index d36648e..5f5cc2c 100644 (file)
        "pagecategories": "{{PLURAL:$1|Kategooria|Kategooriad}}",
        "category_header": "Leheküljed kategoorias \"$1\"",
        "subcategories": "Alamkategooriad",
-       "category-media-header": "Meediafailid kategoorias \"$1\"",
-       "category-empty": "''Selles kategoorias pole ühtegi lehekülge ega meediafaili.''",
+       "category-media-header": "Meediumifailid kategoorias \"$1\"",
+       "category-empty": "<em>Selles kategoorias pole praegu ühtegi lehekülge ega meediumifaili.</em>",
        "hidden-categories": "{{PLURAL:$1|Peidetud kategooria|Peidetud kategooriad}}",
        "hidden-category-category": "Peidetud kategooriad",
        "category-subcat-count": "{{PLURAL:$2|Selles kategoorias on ainult järgmine alamkategooria.|{{PLURAL:$1|Järgmine alamkategooria|Järgmised $1 alamkategooriat}} on selles kategoorias (kokku $2).}}",
        "returnto": "Naase lehele $1",
        "tagline": "Allikas: {{SITENAME}}",
        "help": "Juhend",
+       "help-mediawiki": "MediaWiki abiteave",
        "search": "Otsing",
        "search-ignored-headings": " #<!-- Jäta see rida muutmata kujule. --> <pre>\n# Pealkirjad, mida otsingus eiratakse.\n# Muudatused jõustuvad kohe, kui vastava pealkirjaga lehekülg on indekseeritud.\n# Saad teha tühimuudatuse, selleks et sundida lehekülg uuesti indekseerimisele.\n# Süntaks on järgmine:\n#   * Kõik alates märgist \"#\" kuni rea lõpuni on kommentaar.\n#   * Iga rida, mis ei ole tühi, on eiratava pealkirja täpne tõstutundlik kuju.\nViited\nVälislingid\nVaata ka\n #</pre> <!-- Jäta see rida muutmata kujule. -->",
        "searchbutton": "Otsi",
        "sort-ascending": "Järjesta tõusvalt",
        "nstab-main": "Artikkel",
        "nstab-user": "Kasutaja leht",
-       "nstab-media": "Meedia",
+       "nstab-media": "Meediumileht",
        "nstab-special": "Eri",
        "nstab-project": "Projektileht",
        "nstab-image": "Fail",
        "resetpass-abort-generic": "Tarkvaralisa on paroolimuudatuse abortinud.",
        "resetpass-expired": "Sinu parool on iganenud. Palun määra uus parool, et sisse logida.",
        "resetpass-expired-soft": "Sinu parool on iganenud ja tuleb uuesti määrata. Palun vali kohe uus parool või klõpsa nuppu \"{{int:authprovider-resetpass-skip-label}}\", et määrata see hiljem.",
+       "resetpass-validity": "Sinu parool ei ole sobiv: $1\n\nPalun määra uus parool, et sisse logida.",
        "resetpass-validity-soft": "Sinu parool ei sobi: $1\n\nPalun vali kohe uus parool või klõpsa nuppu \"{{int:authprovider-resetpass-skip-label}}\", et see hiljem uuesti määrata.",
        "passwordreset": "Parooli lähtestamine",
        "passwordreset-text-one": "Täida see vorm, et oma parool lähtestada.",
        "blockedtext": "<strong>Sinu kasutajanimi või IP-aadress on blokeeritud.</strong>\n\nBlokeeris $1.\nTema põhjendus on järgmine: <em>$2</em>.\n\n* Blokeeringu algus: $8\n* Blokeeringu lõpp: $6\n* Sooviti blokeerida: $7\n\nKüsimuse arutamiseks võid pöörduda kasutaja $1 või mõne teise [[{{MediaWiki:Grouppage-sysop}}|administraatori]] poole.\n\nSa ei saa kasutada funktsiooni \"{{int:emailuser}}\", kui [[Special:Preferences|konto eelistustes]] pole määratud kehtivat e-posti aadressi või kui sul on keelatud seda funktsiooni kasutada.\n\nSinu praegune IP-aadress on $3 ja blokeeringu number on #$5. Palun lisa need andmed kõigile järelepärimistele, mida kavatsed teha.",
        "autoblockedtext": "Sinu IP-aadress blokeeriti automaatselt, sest seda kasutas teine kasutaja, kelle $1 blokeeris.\nPõhjendus on järgmine:\n\n:<em>$2</em>\n\n* Blokeeringu algus: $8\n* Blokeeringu lõpp: $6\n* Sooviti blokeerida: $7\n\nKüsimuse arutamiseks võid pöörduda kasutaja $1 või mõne teise [[{{MediaWiki:Grouppage-sysop}}|administraatori]] poole.\n\nPane tähele, et sa ei saa kasutada funktsiooni \"{{int:emailuser}}\", kui [[Special:Preferences|konto eelistustes]] pole määratud kehtivat e-posti aadressi või kui sul on keelatud seda funktsiooni kasutada.\n\nSinu praegune IP-aadress on $3 ja blokeeringu number #$5. Palun lisa need andmed kõigile järelpärimistele, mida kavatsed teha.",
        "systemblockedtext": "MediaWiki tarkvara on sinu kasutajanime või IP-aadressi automaatselt blokeerinud.\nToodud on järgmine põhjus:\n\n:<em>$2</em>\n\n* Blokeerimisaeg: $8\n* Blokeeringu aegumistähtaeg: $6\n* Sooviti blokeerida: $7\n\nSinu praegune IP-aadress on $3.\nLisa need andmed kõigile järelepärimistele, mida kavatsed teha.",
+       "actionblockedtext": "Sind on takistatud sooritamast seda toimingut.",
        "blockednoreason": "põhjendust ei ole kirja pandud",
        "whitelistedittext": "Lehekülgede toimetamiseks pead $1.",
        "confirmedittext": "Lehekülgi ei saa toimetada enne e-posti aadressi kinnitamist.\nPalun määra ja kinnita e-posti aadress [[Special:Preferences|eelistuste leheküljel]].",
        "accmailtext": "Kasutajale [[User talk:$1|$1]] genereeritud juhuslik parool saadeti aadressile $2.\n\nSeda saab pärast sisselogimist muuta ''[[Special:ChangePassword|parooli muutmise]]'' leheküljel.",
        "newarticle": "(Uus)",
        "newarticletext": "Lehekülge, kuhu link sind suunas, pole veel.\nEt lehekülg luua, alusta allolevas kastis kirjutamist (lisateave [$1 juhendist]).\nKui sattusid siia kogemata, klõpsa brauseri ''tagasi''-nupule.",
-       "anontalkpagetext": "----''See on anonüümse kasutaja arutelulehekülg. See kasutaja pole kontot loonud või ei kasuta seda. Sellepärast tuleb meil kasutaja tuvastamiseks kasutada tema IP-aadressi. Sellist IP-aadressi võib kasutada mitu kasutajat. Kui oled osutatud IP-aadressi kasutaja ning leiad, et siinsed kommentaarid ei puutu kuidagi sinusse, [[Special:CreateAccount|loo palun kasutajakonto]] või [[Special:UserLogin|logi sisse]], et sind edaspidi teiste anonüümsete kasutajatega segi ei aetaks.''",
+       "anontalkpagetext": "----\n<em>See on anonüümse kasutaja arutelulehekülg. See kasutaja pole kontot loonud või ei kasuta seda.</em>\nSellepärast tuleb meil kasutaja tuvastamiseks kasutada tema IP-aadressi.\nSellist IP-aadressi võib kasutada mitu kasutajat.\nKui oled anonüümne kasutaja ning leiad, et siinsed kommentaarid ei puutu kuidagi sinusse, siis palun [[Special:CreateAccount|loo kasutajakonto]] või [[Special:UserLogin|logi sisse]], et sind ei aetaks edaspidi segi teiste anonüümsete kasutajatega.",
        "noarticletext": "Siin leheküljel puudub praegu tekst.\nSaad [[Special:Search/{{PAGENAME}}|otsida pealkirjateksti]] teistelt lehekülgedelt,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} uurida asjassepuutuvaid logisid]\nvõi [{{fullurl:{{FULLPAGENAME}}|action=edit}} puuduva lehekülje luua]</span>.",
        "noarticletext-nopermission": "Sellel leheküljel pole praegu teksti.\nSaad [[Special:Search/{{PAGENAME}}|otsida selle lehekülje pealkirja]] teistelt lehekülgedelt või <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} otsida seonduvatest logidest]</span>, aga sul pole õigust seda lehekülge alustada.",
        "missing-revision": "Lehekülje \"{{FULLPAGENAME}}\" redaktsiooni $1 pole.\n\nHarilikult tähendab see seda, et sind siia juhatanud link on vananenud ja siin asunud lehekülg on kustutatud.\nÜksikasjad leiad [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} kustutamislogist].",
        "edit-gone-missing": "Polnud võimalik lehekülge uuendada.\nTundub, et see on kustutatud.",
        "edit-conflict": "Redigeerimiskonflikt.",
        "edit-no-change": "Sinu redigeerimist ignoreeriti, sest tekstile ei olnud tehtud muudatusi.",
+       "edit-slots-cannot-add": "Siin puudub {{PLURAL:$1|järgmise pesa|järgmiste pesade}} tugi: $2.",
+       "edit-slots-cannot-remove": "{{PLURAL:$1|Järgmine pesa on nõutav ja seda|Järgmised pesad on nõutavad ja neid}} ei saa eemaldada: $2.",
+       "edit-slots-missing": "{{PLURAL:$1|Järgmine pesa puudub|Järgmised pesad puuduvad}}: $2.",
        "postedit-confirmation-created": "See lehekülg on alustatud.",
        "postedit-confirmation-restored": "See lehekülg on taastatud.",
        "postedit-confirmation-saved": "Sinu muudatus on salvestatud.",
        "defaultmessagetext": "Sõnumi vaiketekst",
        "content-failed-to-parse": "Ebaõnnestus $1i mudeli $2-tüüpi sisu liigendamine: $3",
        "invalid-content-data": "Vigased sisuandmed",
-       "content-not-allowed-here": "Lehekülg [[:$2]] ei tohi sisaldada $1i.",
+       "content-not-allowed-here": "Lehekülje [[:$2]] pesas \"$3\" ei tohi olla $1i.",
        "editwarning-warning": "Sellelt leheküljelt lahkumise tõttu võivad tehtud muudatused kaotsi minna.\nKui oled sisse loginud, saad selle hoiatuse eelistuste alaosas \"{{int:prefs-editing}}\" keelata.",
        "editpage-invalidcontentmodel-title": "Toetamata sisumudel",
        "editpage-invalidcontentmodel-text": "Sisumudelit \"$1\" ei toetata.",
        "editpage-notsupportedcontentformat-title": "Sisuvormingu tugi puudub",
        "editpage-notsupportedcontentformat-text": "Sisumudelil $2 puudub sisuvormingu $1 tugi.",
+       "slot-name-main": "Peamine",
        "content-model-wikitext": "vikitekst",
        "content-model-text": "lihttekst",
        "content-model-javascript": "JavaScript",
        "prefs-watchlist-managetokens": "Halda lube",
        "prefs-misc": "Muu",
        "prefs-resetpass": "Muuda parool",
-       "prefs-changeemail": "muuda e-posti aadressi või eemalda see",
+       "prefs-changeemail": "Muuda e-posti aadressi või eemalda see",
        "prefs-setemail": "Määra e-posti aadress",
        "prefs-email": "E-posti sätted",
        "prefs-rendering": "Ilme",
        "timezonelegend": "Ajavöönd:",
        "localtime": "Kohalik aeg:",
        "timezoneuseserverdefault": "Kasuta serveri vaikesätet ($1)",
-       "timezoneuseoffset": "Muu (määra ajavahe)",
+       "timezoneuseoffset": "Muu (määra allpool ajavahe)",
+       "timezone-useoffset-placeholder": "Näidisväärtused: \"-07:00\" või \"01:00\"",
        "servertime": "Serveri aeg:",
        "guesstimezone": "Loe aeg brauserist",
        "timezoneregion-africa": "Aafrika",
        "right-deletechangetags": "Kustutada andmebaasist [[Special:Tags|märgiseid]]",
        "grant-generic": "Volituse \"$1\" õiguste komplekt",
        "grant-group-page-interaction": "Interaktsioon lehekülgedega",
-       "grant-group-file-interaction": "Interaktsioon meediafailidega",
+       "grant-group-file-interaction": "Interaktsioon meediumifailidega",
        "grant-group-watchlist-interaction": "Interaktsioon sinu jälgimisloendiga",
        "grant-group-email": "E-kirja saatmine",
        "grant-group-high-volume": "Suuremahuline tegevus",
        "grant-delete": "Lehekülgede, redaktsioonide ja logisissekannete kustutamine",
        "grant-editinterface": "MediaWiki nimeruumi ning saidiülese ja kasutaja JSONi redigeerimine",
        "grant-editmycssjs": "Oma CSSi, JSONi või JavaScripti muutmine",
-       "grant-editmyoptions": "Enda eelistuste muutmine",
+       "grant-editmyoptions": "Enda eelistuste ja JSON-häälestuse muutmine",
        "grant-editmywatchlist": "Oma jälgimisloendi muutmine",
        "grant-editsiteconfig": "Saidiülese ning kasutaja CSSi ja JavaScripti muutmine",
        "grant-editpage": "Olemasolevate lehekülgede redigeerimine",
        "rcfilters-watchlist-edit-watchlist-button": "Muuda jälgimisloendit",
        "rcfilters-watchlist-showupdated": "Muudatused lehekülgedel, mida sa pole pärast muudatuste tegemist külastanud, on <strong>rasvases</strong> kirjas ja tähistatud täidetud punktiga.",
        "rcfilters-preference-label": "Kasuta JavaScripti-vaba liidest",
-       "rcfilters-preference-help": "Laadib viimased muudatused ilma filtrite ja esiletõstmise võimaluseta.",
+       "rcfilters-preference-help": "Laadib viimased muudatused ilma filtrite otsimise ja esiletõstmise võimaluseta.",
        "rcfilters-watchlist-preference-label": "Kasuta JavaScripti-vaba liidest",
-       "rcfilters-watchlist-preference-help": "Laadib jälgimisloendi ilma filtrite ja esiletõstmise võimaluseta.",
+       "rcfilters-watchlist-preference-help": "Laadib jälgimisloendi ilma filtrite otsimise ja esiletõstmise võimaluseta.",
        "rcfilters-filter-showlinkedfrom-label": "Näita muudatusi lehekülgedel, millele viidatakse leheküljelt:",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Leheküljed, millele viidatakse</strong> valitud leheküljel",
        "rcfilters-filter-showlinkedto-label": "Näita muudatusi lehekülgedel, millel viidatakse leheküljele",
        "fileexists-thumbnail-yes": "See paistab olevat vähendatud suurusega pilt (''pisipilt''). [[$1|thumb]]\nPalun vaata faili <strong>[[:$1]]</strong>.\nKui vaadatud fail on sama pilt algupärases suuruses, pole vaja täiendavat pisipilti üles laadida.",
        "file-thumbnail-no": "Failinimi algab eesliitega <strong>$1</strong>.\nSee paistab vähendatud suurusega pilt (''pisipilt'') olevat.\nKui sul on ka selle pildi täislahutusega versioon, laadi palun hoopis see üles, vastasel korral muuda palun faili nime.",
        "fileexists-forbidden": "Sellise nimega fail on juba olemas, seda ei saa üle kirjutada.\nPalun pöörduge tagasi ja laadige fail üles mõne teise nime all. [[File:$1|thumb|center|$1]]",
-       "fileexists-shared-forbidden": "Samanimeline fail on juba olemas jagatud meediavaramus.\nKui soovid siiski oma faili üles laadida, siis palun mine tagasi ja kasuta teist failinime.\n[[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "Samanimeline fail on juba olemas jagatud failivaramus.\nKui soovid siiski oma faili üles laadida, siis palun mine tagasi ja kasuta teist failinime.\n[[File:$1|thumb|center|$1]]",
        "fileexists-no-change": "Üleslaaditav fail on faili <strong>[[:$1]]</strong> praeguse versiooni üksühene duplikaat.",
        "fileexists-duplicate-version": "Üleslaaditav fail on faili <strong>[[:$1]]</strong> {{PLURAL:$2|vanema versiooni|vanemate versioonide}} üksühene duplikaat.",
        "file-exists-duplicate": "See fail on {{PLURAL:$1|järgmise faili|järgmiste failide}} duplikaat:",
        "move": "Teisalda",
        "movethispage": "Muuda pealkirja",
        "unusedimagestext": "Järgmised failid on olemas, aga pole ühelegi leheküljele lisatud.\nPane tähele, et teised võrgukohad võivad viidata failile otselingiga ja seega võivad siin toodud failid olla ikkagi aktiivses kasutuses.",
+       "unusedimagestext-categorizedimgisused": "Järgmised failid on olemas, aga pole ühelegi leheküljele lisatud. Kategoriseeritud pildid loetakse kasutuses olevaks ka siis, kui neid pole ühelegi leheküljele lisatud.\nPane tähele, et teised võrgukohad võivad viidata failile otselingiga ja seega võivad siin toodud failid olla ikkagi aktiivses kasutuses.",
        "unusedcategoriestext": "Need kategooriad pole ühelgi leheküljel ega teises kategoorias kasutuses.",
        "notargettitle": "Puudub sihtlehekülg",
        "notargettext": "Sa pole määranud selle tegevuse sooritamiseks sihtlehekülge ega kasutajat.",
        "ipbreason": "Põhjus:",
        "ipbreason-dropdown": "*Tavalised blokeerimise põhjused\n** Valeandmete lisamine\n** Lehekülgedelt sisu kustutamine\n** Välislinkide rämpspostitus\n** Sodimine\n** Hirmutav käitumine/ahistamine\n** Mitme konto väärkasutus\n** Lubamatu kasutajanimi",
        "ipb-hardblock": "Keela sellelt IP-aadressilt sisseloginud kasutajatel redigeerida",
-       "ipbcreateaccount": "Takista konto loomist",
-       "ipbemailban": "Takista kasutajal e-kirjade saatmine",
+       "ipbcreateaccount": "Konto loomine",
+       "ipbemailban": "E-kirja saatmine",
        "ipbenableautoblock": "Blokeeri automaatselt viimane IP-aadress, mida see kasutaja kasutas, ja ka järgnevad, mille alt ta võib proovida kaastööd teha",
        "ipbsubmit": "Blokeeri see kasutaja",
        "ipbother": "Muu tähtaeg:",
        "ipboptions": "2 tundi:2 hours,1 päev:1 day,3 päeva:3 days,1 nädal:1 week,2 nädalat:2 weeks,1 kuu:1 month,3 kuud:3 months,6 kuud:6 months,1 aasta:1 year,tähtajatu:infinite",
        "ipbhidename": "Peida kasutajatunnus muudatustest ja loenditest",
        "ipbwatchuser": "Jälgi selle kasutaja lehekülge ja arutelu",
-       "ipb-disableusertalk": "Keela sellel kasutajal blokeeringu ajal oma arutelulehekülge redigeerida",
+       "ipb-disableusertalk": "Enda arutelulehekülje redigeerimine",
        "ipb-change-block": "Blokeeri uuesti nende sätete alusel",
        "ipb-confirm": "Kinnita blokeering",
        "ipb-sitewide": "Saidiülene",
        "ipb-partial": "Osaline",
        "ipb-pages-label": "Leheküljed",
+       "ipb-namespaces-label": "Nimeruumid",
        "badipaddress": "Vigane IP-aadress",
        "blockipsuccesssub": "Blokeerimine õnnestus",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] on blokeeritud.<br />\nKehtivaid blokeeringuid vaata [[Special:BlockList|blokeerimisnimekirjast]].",
        "ipb-blocklist": "Vaata kehtivaid blokeeringuid",
        "ipb-blocklist-contribs": "Kasutaja $1 kaastöö",
        "ipb-blocklist-duration-left": "$1 järel",
+       "block-actions": "Takistatavad toimingud:",
        "block-expiry": "Aegumistähtaeg:",
+       "block-options": "Lisasuvandid:",
+       "block-prevent-edit": "Redigeerimine",
+       "block-reason": "Põhjus:",
+       "block-target": "Kasutajanimi või IP-aadress:",
        "unblockip": "Blokeerimise eemaldamine",
        "unblockiptext": "Kasuta allpool olevat vormi varem blokeeritud IP-aadressi või kasutaja redigeerimisõiguse taastamiseks.",
        "ipusubmit": "Eemalda see blokeering",
        "blocklist-nousertalk": "ei saa oma arutelulehte muuta",
        "blocklist-editing": "redigeerimine",
        "blocklist-editing-sitewide": "redigeerimine (saidiülene)",
+       "blocklist-editing-page": "leheküljed",
+       "blocklist-editing-ns": "nimeruumid",
        "ipblocklist-empty": "Blokeerimiste loend on tühi.",
        "ipblocklist-no-results": "Nõutud IP-aadress või kasutajatunnus ei ole blokeeritud.",
        "blocklink": "blokeeri",
        "tooltip-t-permalink": "Püsilink lehekülje sellele redaktsioonile",
        "tooltip-ca-nstab-main": "Vaata sisulehekülge",
        "tooltip-ca-nstab-user": "Näita kasutaja lehte",
-       "tooltip-ca-nstab-media": "Vaata meediafaili lehekülge",
+       "tooltip-ca-nstab-media": "Vaata meediumifaili lehekülge",
        "tooltip-ca-nstab-special": "See on erilehekülg ja seda ei saa redigeerida.",
        "tooltip-ca-nstab-project": "Näita projekti lehte",
        "tooltip-ca-nstab-image": "Vaata faili lehekülge",
        "pageinfo-display-title": "Kuvatav pealkiri",
        "pageinfo-default-sort": "Vaikejärjestusvõti",
        "pageinfo-length": "Lehekülje pikkus (baitides)",
+       "pageinfo-namespace": "Nimeruum",
        "pageinfo-article-id": "Lehekülje identifikaator",
        "pageinfo-language": "Lehekülje sisu keel",
        "pageinfo-language-change": "muuda",
        "version-editors": "Toimetid",
        "version-antispam": "Rämpsposti tõkestus",
        "version-other": "Muu",
-       "version-mediahandlers": "Meediatöötlejad",
+       "version-mediahandlers": "Meediumitöötlejad",
        "version-hooks": "Haagid",
        "version-parser-extensiontags": "Parseri lisasildid",
        "version-parser-function-hooks": "Parserifunktsioonid",
        "specialpages-group-developer": "Arendusriistad",
        "blankpage": "Tühi leht",
        "intentionallyblankpage": "See lehekülg on sihilikult tühjaks jäetud.",
+       "disabledspecialpage-disabled": "Süsteemiadministraator on selle lehekülje keelanud.",
        "external_image_whitelist": "  #Jäta see rida muutmata kujule<pre>\n#Pane regulaaravaldise osad (vaid //-märkide vahel olev osa) allapoole\n#Need on vastavuses vikiväliste piltide internetiaadressidega\n#Vastavuses olevad kuvatakse piltidena, muul juhul kuvatakse ainult pildi link\n#Märgiga # algavad read on kommentaarid\n#See on tõstutundetu\n\n#Pane kõik regulaaravaldise osad selle joone kohale. Jäta see rida muutmata kujule</pre>",
        "tags": "Käibivad muudatusmärgised",
        "tag-filter": "[[Special:Tags|Märgisefilter]]:",
        "logentry-block-block": "$1 {{GENDER:$2|blokeeris}} kasutaja {{GENDER:$4|$3}}; aegumistähtaeg $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|eemaldas}} kasutaja {{GENDER:$4|$3}} blokeeringu",
        "logentry-block-reblock": "$1 {{GENDER:$2|muutis}} kasutaja {{GENDER:$4|$3}} blokeeringut; aegumistähtaeg $5 $6",
-       "logentry-partialblock-block": "$1 {{GENDER:$2|blokeeris}} kasutaja {{GENDER:$4|$3}} redigeerimast {{PLURAL:$8|lehekülge|lehekülgi}} $7; aegumistähtaeg $5 $6",
-       "logentry-partialblock-reblock": "$1 {{GENDER:$2|muutis}} kasutaja {{GENDER:$4|$3}} blokeeringut, mis takistab redigeerimist {{PLURAL:$8|leheküljel|lehekülgedel}} $7; aegumistähtaeg $5 $6",
+       "logentry-partialblock-block-page": "{{PLURAL:$1|lehekülge|lehekülgi}} $2",
+       "logentry-partialblock-block-ns": "{{PLURAL:$1|nimeruumis|nimeruumides}} $2",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|blokeeris}} kasutaja {{GENDER:$4|$3}} redigeerimast $7; aegumistähtaeg $5 $6",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|muutis}} kasutaja {{GENDER:$4|$3}} blokeeringut, mis takistab redigeerimist $7; aegumistähtaeg $5 $6",
        "logentry-non-editing-block-block": "$1 {{GENDER:$2|blokeeris}} kasutaja {{GENDER:$4|$3}} tegemast määratud tegevusi peale redigeerimise; aegumistähtaeg $5 $6",
        "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|muutis}} kasutaja {{GENDER:$4|$3}} blokeeringut, mis takistab tegemast määratud tegevusi peale redigeerimise; aegumistähtaeg $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|blokeeris}} kasutaja {{GENDER:$4|$3}}; aegumistähtaeg $5 $6",
        "default-skin-not-found-no-skins": "Oih! Sinu viki vaikekujundus, milleks muutuja <code dir=\"ltr\">$wgDefaultSkin</code> järgi on <code>$1</code>, pole saadaval.\n\nÜhtegi kujundust pole paigaldatud.\n\n; Kui oled MediaWiki just paigaldanud või täiendasid seda:\n: Paigaldasid tarkvara ilmselt Giti kaudu või otse lähtekoodist või mõnel muul viisil. See on ootuspärane. MediaWiki 1.24 ja uuemad versioonid ei sisalda peahoidlas ühtegi kujundust. Proovi [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org-i kujunduste kataloogist] mõni kujundus paigaldada. Selleks saad:\n:* laadida alla [https://www.mediawiki.org/wiki/Download lintarhiivi paigaldaja], mis sisaldab mitut kujundust ja tarkvaralisa. Saad sealt kleepimiseks kopeerida kausta <code dir=\"ltr\">skins/</code>;\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org-ist] kindla kujunduse lintarhiivi alla laadida;\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins kasutada Giti, et kujundusi alla laadida].\n: Selle tegemine ei tohiks häirida Giti hoidlat, kui oled MediaWiki arendaja. Vaata [https://www.mediawiki.org/wiki/Manual:Skin_configuration kujunduste häälestusjuhendist], kuidas kujundusi lubada ja kuidas valida vaikekujundus.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (lubatud)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>keelatud</strong>)",
-       "mediastatistics": "Meediafailide arvandmestik",
+       "mediastatistics": "Meediumifailide arvandmestik",
        "mediastatistics-summary": "Arvandmed üles laaditud failitüüpide kohta. See käib ainult failide viimaste versioonide kohta. Vanu ja kustutatud versioone pole arvesse võetud.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 bait|$1 baiti}} ($2; $3%)",
        "mediastatistics-bytespertype": "Failide kogusuurus selles alaosas: $1 {{PLURAL:$1|bait|baiti}} ($2; $3%).",
        "mw-widgets-dateinput-no-date": "Kuupäev valimata",
        "mw-widgets-dateinput-placeholder-day": "AAAA-KK-PP",
        "mw-widgets-dateinput-placeholder-month": "AAAA-KK",
-       "mw-widgets-mediasearch-input-placeholder": "Otsi meediafaile",
+       "mw-widgets-mediasearch-input-placeholder": "Otsi meediumifaile",
        "mw-widgets-mediasearch-noresults": "Tulemusi ei leitud.",
        "mw-widgets-titleinput-description-new-page": "lehekülge pole veel",
        "mw-widgets-titleinput-description-redirect": "ümbersuunamine leheküljele \"$1\"",
index 8d1b1e9..352efe1 100644 (file)
        "exif-dc-type": "نوع  الوسيط",
        "exif-rating-rejected": "مرفوض",
        "exif-isospeedratings-overflow": "أكبر من 65535",
+       "exif-maxaperturevalue-value": "$1 أبكس (f/$2)",
        "exif-iimcategory-ace": "فنون وثقافة وترفيه",
        "exif-iimcategory-clj": "جريمة وقانون",
        "exif-iimcategory-dis": "كوارث وحوادث",
index bcf0e74..5b9cbcd 100644 (file)
        "exif-fixtureidentifier": "Tugiandmete nimi",
        "exif-locationdest": "Kujutatud asukoht",
        "exif-locationdestcode": "Kujutatud asukoha kood",
-       "exif-objectcycle": "Päeva osa, milleks meediafail on ette nähtud",
+       "exif-objectcycle": "Päeva osa, milleks meediumifail on ette nähtud",
        "exif-contact": "Kontaktteave",
        "exif-writer": "Autor",
        "exif-languagecode": "Keel",
        "exif-dc-relation": "Seotud teabevahendid",
        "exif-dc-rights": "Õigused",
        "exif-dc-source": "Allikmeediafail",
-       "exif-dc-type": "Meediafaili tüüp",
+       "exif-dc-type": "Meediumitüüp",
        "exif-rating-rejected": "Tagasi lükatud",
        "exif-isospeedratings-overflow": "Suurem kui 65535",
        "exif-iimcategory-ace": "Kunstid, kultuur ja meelelahutus",
index 9f2035b..25bb6fa 100644 (file)
@@ -1,17 +1,22 @@
 {
        "@metadata": {
                "authors": [
-                       "Ukabia"
+                       "Ukabia",
+                       "Uzoma Ozurumba"
                ]
        },
        "exif-imagewidth": "Àsáa",
        "exif-imagelength": "Ógólógó",
        "exif-orientation": "Ívú nà àsáa",
+       "exif-datetime": "Failụ mgbanwe ụbọchi na oge",
        "exif-imagedescription": "Íshí nhuunuche",
+       "exif-make": "Mmewe igwefoto",
+       "exif-model": "Njirimara mmepụta igwefoto",
        "exif-software": "Ndiriusòrò ejìème",
        "exif-artist": "Odé ákwụ́kwọ́",
        "exif-exifversion": "Ùdị Exif",
        "exif-colorspace": "Ámá àgwà",
+       "exif-datetimeoriginal": "Ụbọchi na oge emepụtara ngwa mmụta",
        "exif-exposuretime-format": "sec $1 ($2)",
        "exif-fnumber": "Ónúọgụgụ F",
        "exif-brightnessvalue": "Ọ̀chạ́ APEX",
index 907176f..1937192 100644 (file)
        "nosuchusershort": "Käyttäjää nimeltä ”$1” ei ole. Kirjoititko nimen oikein?",
        "nouserspecified": "Käyttäjätunnusta ei ole määritelty.",
        "login-userblocked": "Tämä käyttäjä on estetty. Kirjautuminen ei ole sallittua.",
-       "wrongpassword": "Virheellinen käyttäjätunnus tai salasana.\nOle hyvä ja yritä uudelleen.",
+       "wrongpassword": "Virheellinen käyttäjänimi tai salasana.\nOle hyvä ja yritä uudelleen.",
        "wrongpasswordempty": "Et voi antaa tyhjää salasanaa.",
        "passwordtooshort": "Salasanan täytyy olla vähintään {{PLURAL:$1|yhden merkin pituinen|$1 merkkiä pitkä}}.",
        "passwordtoolong": "Salasanat saavat olla enintään $1 {{PLURAL:$1|merkin}} pituisia.",
        "protect-text": "Voit tarkastella ja muuttaa sivun '''$1''' suojaustasoa.",
        "protect-locked-blocked": "Et voi muuttaa sivun suojauksia, koska sinut on estetty. Alla on sivun ”'''$1'''” nykyiset suojaukset:",
        "protect-locked-dblock": "Sivun suojauksia ei voi muuttaa, koska tietokanta on lukittu. Alla on sivun ”'''$1'''” nykyiset suojaukset:",
-       "protect-locked-access": "Sinun käyttäjätunnuksellasi ei ole oikeutta muuttaa sivujen suojauksia. \nTässä ovat nykyiset suojausasetukset sivulla <strong>$1</strong>:",
+       "protect-locked-access": "Käyttäjätunnuksellasi ei ole oikeutta muuttaa sivujen suojauksia. \nTässä ovat nykyiset suojausasetukset sivulla <strong>$1</strong>:",
        "protect-cascadeon": "Tämä sivu on suojauksen kohteena, koska se on sisällytetty alla {{PLURAL:$1|olevaan suojattuun sivuun, jossa|oleviin suojattuihin sivuihin, joissa}} on kytketty tarttuva suojaus päälle.\n\nTämän sivun suojaustasoon tehdyillä muutoksilla ei ole vaikutusta sivuun muualta tarttuneeseen suojaukseen.",
        "protect-default": "Salli kaikki käyttäjät",
        "protect-fallback": "Salli vain käyttäjät, joilla on oikeus $1",
index aee2ad4..ea4fc68 100644 (file)
        "blocklist-nousertalk": "ne peut pas modifier sa propre page de discussion",
        "blocklist-editing": "modification",
        "blocklist-editing-sitewide": "modification (tout le site)",
+       "blocklist-editing-page": "pages",
+       "blocklist-editing-ns": "espaces de noms",
        "ipblocklist-empty": "La liste des adresses IP bloquées est actuellement vide.",
        "ipblocklist-no-results": "L'adresse IP ou l'utilisateur demandé n'est pas bloqué.",
        "blocklink": "bloquer",
index 965a231..23937e0 100644 (file)
        "ipb-sitewide": "En todo o sitio",
        "ipb-partial": "Parcial",
        "ipb-pages-label": "Páxinas",
+       "ipb-namespaces-label": "Espazos de nomes",
        "badipaddress": "O enderezo IP non é válido",
        "blockipsuccesssub": "O bloqueo realizouse correctamente",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] foi {{GENDER:$1|bloqueado|bloqueada}}.<br />\nOlle a [[Special:BlockList|lista de bloqueos]] para revisalo.",
        "blocklist-nousertalk": "non pode editar a súa conversa",
        "blocklist-editing": "edición",
        "blocklist-editing-sitewide": "edición (todo o sitio)",
+       "blocklist-editing-page": "páxinas",
+       "blocklist-editing-ns": "espazos de nomes",
        "ipblocklist-empty": "A lista de bloqueos está baleira.",
        "ipblocklist-no-results": "Nin o enderezo IP nin o nome de usuario solicitados están bloqueados.",
        "blocklink": "bloquear",
        "specialpages-group-developer": "Ferramentas dos desenvolvedores",
        "blankpage": "Baleirar a páxina",
        "intentionallyblankpage": "Esta páxina foi baleirada intencionadamente",
+       "disabledspecialpage-disabled": "Un administrador do sistema deshabilitou esta páxina.",
        "external_image_whitelist": " #Deixe esta liña tal e como está<pre>\n#Poña embaixo fragmentos de expresións regulares (tan só a parte que vai entre //)\n#Isto coincidirá cos enderezos URL das imaxes externas (hotlinked)\n#Aquelas que coincidan amosaranse como imaxes, senón, só se amosará unha ligazón cara a esta\n#As liñas que comecen por \"#\" son comentarios\n#Non diferencia entre maiúsculas e minúsculas\n\n#Poña todos os fragmentos por riba desta liña. Deixe esta liña tal e como está</pre>",
        "tags": "Etiquetas de cambios válidas",
        "tag-filter": "Filtrar as [[Special:Tags|etiquetas]]:",
        "logentry-block-block": "$1 {{GENDER:$2|bloqueou}} a {{GENDER:$4|$3}} cun tempo de duración de $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|desbloqueou}} a {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|cambiou}} as configuracións do bloqueo de {{GENDER:$4|$3}} cunha caducidade de $5 $6",
-       "logentry-partialblock-block": "$1 {{GENDER:$2|bloqueou}} a {{GENDER:$4|$3}} impedíndolle editar {{PLURAL:$8|a páxina|as páxinas}} $7 cun tempo de expiración de $5 $6",
-       "logentry-partialblock-reblock": "$1 {{GENDER:$2|bloqueou}} as definicións do bloqueo de {{GENDER:$4|$3}} impedíndolle a edición  {{PLURAL:$8|da páxina|das páxinas}} $7 cun tempo de expiración de $5 $6",
+       "logentry-partialblock-block-page": "{{PLURAL:$1|a páxina|as páxinas}} $2",
+       "logentry-partialblock-block-ns": "{{PLURAL:$1|o espazo de nomes|os espazos de nomes}} $2",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|bloqueou}} a {{GENDER:$4|$3}} impedíndolle editar $7 cun tempo de expiración de $5 $6",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|cambiou}} as definicións do bloqueo de {{GENDER:$4|$3}} impedíndolle a edición en $7 cun tempo de expiración de $5 $6",
        "logentry-non-editing-block-block": "$1 {{GENDER:$2|bloqueou}} a {{GENDER:$4|$3}} impedíndolle realizar accións especificadas que non sexan edicións cun tempo de expiración de $5 $6",
        "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|cambiou}} as definicións do bloqueo de {{GENDER:$4|$3}} para as accións especificadas que non sexan edicións cun tempo de expiración de $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|bloqueou}} a {{GENDER:$4|$3}} cun tempo de duración de $5 $6",
index 2d6ed09..db3479f 100644 (file)
        "blocklist-nousertalk": "עריכת דף השיחה האישי נחסמה",
        "blocklist-editing": "עריכה",
        "blocklist-editing-sitewide": "עריכה (כל האתר)",
+       "blocklist-editing-page": "דפים",
+       "blocklist-editing-ns": "מרחבי שם",
        "ipblocklist-empty": "רשימת המשתמשים החסומים ריקה.",
        "ipblocklist-no-results": "שם המשתמש או כתובת ה־IP המבוקשים אינם חסומים.",
        "blocklink": "חסימה",
index e828d64..f228ab7 100644 (file)
        "blocklist-nousertalk": "अपना वार्ता पृष्ठ भी संपादित नहीं कर सकेंगे",
        "blocklist-editing": "सम्पादन",
        "blocklist-editing-sitewide": "सम्पादन (सम्पूर्ण साइट)",
+       "blocklist-editing-page": "पृष्ठ",
+       "blocklist-editing-ns": "नामस्थान",
        "ipblocklist-empty": "अवरोध सूची खाली हैं।",
        "ipblocklist-no-results": "पूछे गये आईपी एड्रेस / सदस्यनाम पर ब्लॉक नहीं हैं।",
        "blocklink": "अवरोधित करें",
index b29e8f8..5a614bc 100644 (file)
        "search-external": "Bahaari khoj",
        "searchdisabled": "{{SITENAME}} me abhi khoje ke anumati nai hai.\nAap tab tak Google se khoje sakta hai.\nYaad rakhna ki uu log ke {{SITENAME}} ke index saait purana hoi.",
        "search-error": "Khoje ke tim ek error hoe gais hae:$1",
-       "search-warning": "A warning has occured while searching: $1",
        "preferences": "Pasand",
        "mypreferences": "Pasand",
        "prefs-edits": "Badlao ke number:",
index 6587878..7e4bcd9 100644 (file)
        "right-purge": "Čišćenje priručne memorije stranice bez stranice za potvrdu",
        "right-autoconfirmed": "Uređivanje stranica zaštićenih za neprijavljene suradnike",
        "right-bot": "Izmjene su tretirane kao automatski proces (bot)",
-       "right-nominornewtalk": "Neposjedovanje manjih izmjena na stranicama za razgovor otvara prozor za nove poruke",
-       "right-apihighlimits": "Korištenje viših granica za upite od izvršnika",
-       "right-writeapi": "Mogućnost zapišavanja u izvršniku",
+       "right-nominornewtalk": "Izbjegavanje prikazivanja obavijesti o novim porukama kad je označeno da je izmjena manja",
+       "right-apihighlimits": "Korištenje viših ograničenja kod API upita",
+       "right-writeapi": "Mogućnost pisanja API-ja",
        "right-delete": "Brisanje stranica",
        "right-bigdelete": "Brisanje stranica koje imaju veliku povijest",
        "right-deletelogentry": "Brisanje i vraćanje određenih zapisa u evidenciji",
        "action-reupload": "postavljanje nove inačice ove datoteke",
        "action-reupload-shared": "postavljanje nove inačice ove datoteke na zajedničkom poslužitelju",
        "action-upload_by_url": "postavljanje ove datoteke preko URL adrese",
-       "action-writeapi": "korištenje zapišavanja u izvršniku",
+       "action-writeapi": "upotreba za pisanje API-jem",
        "action-delete": "brisanje ove stranice",
        "action-deleterevision": "brisanje izmjena",
        "action-deletedhistory": "gledanje obrisane povijesti ove stranice",
index 198db22..4d342d3 100644 (file)
        "blocklist-nousertalk": "nem szerkesztheti a vitalapját",
        "blocklist-editing": "szerkesztés",
        "blocklist-editing-sitewide": "szerkesztés (teljes körű)",
+       "blocklist-editing-page": "lapok",
+       "blocklist-editing-ns": "névterek",
        "ipblocklist-empty": "A blokkoltak listája üres.",
        "ipblocklist-no-results": "A kért IP-cím vagy felhasználónév nem blokkolt.",
        "blocklink": "blokkolás",
index 9845c55..a624451 100644 (file)
        "actions": "Mmèmé",
        "namespaces": "Ahàm̀bara",
        "variants": "Nke ichè ichè",
+       "navigation-heading": "Ebe nchọpụta ihe ndi enwere",
        "errorpagetitle": "Nsogbú",
        "returnto": "Ganata na $1.",
        "tagline": "Oshị {{SITENAME}}",
        "view-foreign": "Zi nà $1",
        "edit": "Mèzi",
        "create": "Ké",
+       "create-local": "Tinye nkọwa ebe osi",
        "delete": "Kàcha",
        "undelete_short": "A gbakashikwala {{PLURAL:$1|orü otù|$1 orü}}",
        "viewdeleted_short": "Zi {{PLURAL:$1|orü otụ bakashịrị|orü $1 bakashịrị}}",
        "logouttext": "'''I fwuóla ubwá.'''\n\nI nwèríkí jíwá {{SITENAME}} na nke ẹnwéghi áhà, mànà Í nwèríkí <span class='plainlinks'>[$1 bátá òzọr]</span> na áhà Í shị fwüo ma áhà ozọr.\nMàkwá na o dị ihü gi zi kà Í nor kwa ímé, o gi kwüshí mgbe Í sáfùrù cache ihe ishi a gá intanet gi.",
        "yourname": "Ahàǹjìème:",
        "userlogin-yourname": "Ahàǹjìème",
+       "userlogin-yourname-ph": "Denye aha njirimara gi",
        "yourpassword": "Okwúngáfè:",
        "userlogin-yourpassword": "Okwungafè",
        "yourpasswordagain": "Detuari mkpurụ okwu ejị a gafẹ:",
        "loginlanguagelabel": "Asụsụ: $1",
        "pt-login": "Debàta",
        "pt-createaccount": "Kèta ngụrụòkè",
+       "pt-userlogout": "Pụta",
        "changepassword": "Gbanwe okwu éjị à gáfe",
        "resetpass_header": "Gbanwe okwúngáfè nke bùwá",
        "oldpassword": "Mkpurụ okwu ejị a gafẹ ochië:",
        "enhancedrc-history": "ị̀ta",
        "recentchanges": "Mgbánwè ógè nso",
        "recentchanges-legend": "Nràlụ màkà Ihe gbanwere ubwá",
+       "recentchanges-summary": "chọpụta mgbanye nke di ọhuru na ihuakwụkwọ wiki a.",
        "recentchanges-feed-description": "Chóputà ihe ógẹ ǹsò na wiki ímé órírí nke á.",
        "recentchanges-label-newpage": "Ndezi a mmepụtara ihuakwukwọ ọhuru",
        "recentchanges-label-minor": "Ihe bu orü ntakírí",
        "filehist-comment": "Nkwute",
        "imagelinks": "Mgbanwe usòrò",
        "linkstoimage": "{{PLURAL:$1|Ihü nká|Ihü nke $1}} na jikodo gá usòrò nká:",
-       "nolinkstoimage": "Àdíghị ihü na jikodo usòrò nke.",
+       "nolinkstoimage": "Ọdighi ihuakwụkwọ nwere failụ a.",
        "sharedupload": "Ákwúkwó runotu nke shì $1 na ó nwèríkí di na orürü nke ndi ozor.",
        "sharedupload-desc-here": "Failụ a si na $1,enwekwara ike iji ya eme ihe na arụmarụ ọzọ. Nkọwa na [$2 ihuakwukwọ nkọwa failụ] eziri na okpuru.",
        "uploadnewversion-linktext": "Tinyé usòrò di òhúrù na élú nke",
        "whatlinkshere-links": "← òjikọ",
        "whatlinkshere-hideredirs": "$1 nke kufùrù",
        "whatlinkshere-hidetrans": "$1 ọ jè ákwúkwó usòrò",
-       "whatlinkshere-hidelinks": "Jikodo $1",
+       "whatlinkshere-hidelinks": "Njikọ $1",
        "whatlinkshere-hideimages": "jikodo nhuunuche $1",
        "whatlinkshere-filters": "Nzàtà",
        "block": "Gbàchí ọ'bànifé",
        "tooltip-watch": "Tìnyé ihü á na ndétu ihe Í ne lé",
        "tooltip-rollback": "\"Láázu\" né kúfù orü dí na élú ihü á nke ọ'bànifé onye ozor na mgbe Í kpàràrá mkpárá áhu",
        "tooltip-undo": "''Me la àzụ'' nà à kụpụ̀laàzụ mmezi â, y'agbaghere ndebàta-mmezi n'ime ụnọ̀dị nkirimaàtụ̀. O kwèrè màkà ịde ihì nà ndekàcha.",
+       "tooltip-summary": "Denye okwu nchikọta obere",
        "siteuser": "ọ'bànifé $1 {{SITENAME}}",
        "others": "nke ndi ozor",
        "creditspage": "Nkó áhà ihüá",
        "file-nohires": "Nke káchá mmá na ányá àdíghị.",
        "svg-long-desc": "usòrò SVG, nà áhà pixel $1 × $2, ívụ usòrò: $3",
        "show-big-image": "Failụ si na nke mbu",
+       "show-big-image-preview": "Otu nyochaa a ha:$1",
        "show-big-image-size": "$1 × $2 piksels",
        "file-info-gif-looped": "etemte",
        "newimages-legend": "Nzàtà",
index c963d30..96fd566 100644 (file)
        "post-expand-template-argument-category": "Лерий теркал яь йоаца белгалонаш (аргументаш) чулоацаш оагӀонаш",
        "undo-failure": "Ер нийсдар юхадаккха йиш яц юкъе даь хувцамаш бахьане",
        "viewpagelogs": "Укх оагӀон тептараш хьахьокха",
+       "currentrev": "ХIанзара эрш",
        "currentrev-asof": "ТӀехьара эрш $1",
        "revisionasof": "Эрш $1",
        "revision-info": "Эрш ($1); {{GENDER:$6|$2}}$7",
        "previousrevision": "← XьалхайоагIа",
        "nextrevision": "ТIехьайоагIа →",
-       "currentrevisionlink": "ХIанзара верси",
+       "currentrevisionlink": "ХIанзара эрш",
        "cur": "карара",
        "next": "тӀехь.",
        "last": "хьалхара",
        "uploadlogpage": "Чуяьккхарий тептар",
        "filedesc": "Лоаца йоазонца сурт оттадар",
        "fileuploadsummary": "Лоаца сурт оттадар:",
+       "upload-dialog-button-upload": "Чуяккха",
        "license": "Лицензи ялар:",
        "license-header": "Лицензировани",
        "listfiles-delete": "дӀаяккха",
        "listfiles_size": "Боарам",
        "listfiles_description": "Йоазонца сурт оттадар",
        "listfiles_count": "Эрш",
+       "listfiles-latestversion": "ХIанзара эрш",
        "file-anchor-link": "Файл",
        "filehist": "Файла истори",
        "filehist-help": "Ди/ха долча IотIатоIае цу хана файл мишта хиннай хьажа йиш хуpгьйолаш",
        "sp-contributions-newbies": "Хьахьокха алхха керда дагара йоазонашца баь бола къахьегам",
        "sp-contributions-blocklog": "блок тохар",
        "sp-contributions-deleted": "{{GENDER:$1|доакъашхочун}} дӀадаьккха хинна тоадар",
-       "sp-contributions-uploads": "Ñ\87Ñ\83Ñ\8fÑ\8cÑ\85аÑ\80аш",
+       "sp-contributions-uploads": "Ñ\84айлаш",
        "sp-contributions-logs": "тептараш",
        "sp-contributions-talk": "къамаьл дар",
        "sp-contributions-userrights": "{{GENDER:$1|доакъашхочун}} бокъонашта урхалдар",
index 40dc082..d0f6749 100644 (file)
        "removedwatchtext-talk": "\"[[:$1]]\" e la sua pagina associata sono state rimosse dalla propria [[Special:Watchlist|lista degli osservati speciali]].",
        "removedwatchtext-short": "La pagina \"$1\" è stata rimossa dalla propria lista degli osservati speciali.",
        "watch": "Segui",
-       "watchthispage": "Segui questa pagina",
+       "watchthispage": "Aggiungi agli osservati speciali",
        "unwatch": "Non seguire",
        "unwatchthispage": "Smetti di seguire",
        "notanarticle": "Questa pagina non è una voce",
        "createaccountblock": "registrazione bloccata",
        "emailblock": "e-mail bloccate",
        "blocklist-nousertalk": "non può modificare la propria pagina di discussione",
+       "blocklist-editing-page": "pagine",
+       "blocklist-editing-ns": "namespace",
        "ipblocklist-empty": "L'elenco dei blocchi è vuoto.",
        "ipblocklist-no-results": "L'indirizzo IP o il nome utente richiesto non è bloccato.",
        "blocklink": "blocca",
        "logentry-block-reblock": "$1 {{GENDER:$2|ha modificato}} le impostazioni del blocco per {{GENDER:$4|$3}} con una scadenza di $5 $6",
        "logentry-partialblock-block-page": "{{PLURAL:$1|della pagina|delle pagine}} $2",
        "logentry-partialblock-block-ns": "{{PLURAL:$1|del|dei}} namespace $2",
-       "logentry-partialblock-block": "$1 {{GENDER:$2|ha bloccato}} {{GENDER:$4|$3}} alla modifica di $7 con una scadenza di $5 $6",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|ha bloccato}} {{GENDER:$4|$3}} alla modifica $7 con una scadenza di $5 $6",
        "logentry-partialblock-reblock": "$1 {{GENDER:$2|ha modificato}} le impostazioni del blocco per {{GENDER:$4|$3}} bloccando la modifica $7 con una scadenza di $5 $6",
        "logentry-non-editing-block-block": "$1 {{GENDER:$2|ha bloccato}} {{GENDER:$4|$3}} in specifiche azioni non di modifica con una scadenza di $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|ha bloccato}} {{GENDER:$4|$3}} con una scadenza di $5 $6",
index a3687c6..b752fa6 100644 (file)
        "blocklist-nousertalk": "자신의 토론 문서 편집 불가",
        "blocklist-editing": "편집 중",
        "blocklist-editing-sitewide": "편집 중 (사이트 전체)",
+       "blocklist-editing-ns": "이름공간",
        "ipblocklist-empty": "차단 목록이 비어 있습니다.",
        "ipblocklist-no-results": "요청한 IP 주소나 사용자는 차단되지 않았습니다.",
        "blocklink": "차단",
index 0f381ce..12587f6 100644 (file)
        "emailblock": "E-Maile schécke gespaart",
        "blocklist-nousertalk": "däerf seng eegen Diskussiounssäit net ännereen",
        "blocklist-editing": "änneren",
+       "blocklist-editing-page": "Säiten",
+       "blocklist-editing-ns": "Nummraim",
        "ipblocklist-empty": "D'Spärlëscht ass eidel.",
        "ipblocklist-no-results": "Déi gesichten IP-Adress respektiv de gesichte Benotzer ass net gespaart.",
        "blocklink": "spären",
index aae8f80..f97d998 100644 (file)
@@ -11,7 +11,8 @@
                        "Nemo bis",
                        "Amire80",
                        "Beyronvan",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Lorestani"
                ]
        },
        "tog-underline": "هوم پئیڤأند زیرخأط دار:",
        "createacct-another-username-ph": "نوم کاریاری توٙنە بأزئنیت",
        "yourpassword": "رازینە گوڤاردئن:",
        "userlogin-yourpassword": "رازینە گوڤاردئن",
-       "userlogin-yourpassword-ph": "رازینە گوڤاردئن نە بأزە",
+       "userlogin-yourpassword-ph": "رازینٱ گوڤارسناْ بٱزاْ",
        "createacct-yourpassword-ph": "رازینە گوڤاردئن نە بأزە",
        "yourpasswordagain": "یئ گئل هأنی رازینە گوڤاردئن نە بأزە",
        "createacct-yourpasswordagain": "رازینە گوڤاردئن نە پوشت راس کو",
        "userlogin-noaccount": "یئ گئل حئساڤ ناریت؟",
        "userlogin-joinproject": "أندوم دیارگە {{SITENAME}} بوٙئیت",
        "createaccount": "حئساڤ راس بأکیت",
-       "userlogin-resetpassword-link": "رازینە گوڤاردئنتوٙ د ڤیرئتوٙ رأتە؟",
+       "userlogin-resetpassword-link": "رازینٱ گوڤارسنتو د ڤیرتو رٱتٱ؟",
        "userlogin-helplink2": "هومیاری کئردئن د طأریق ڤامین ئوٙمائن",
        "userlogin-loggedin": "شوما ئیسئ چی یئ گئل {{GENDER:$1|$1}} ئوٙمایتە ڤامین.نوم بألگە هاری نە سی ڤامین ئوٙمائن چی یئ گئل کاریار هأنی بلگه هاری سی وا مین اومائن چی یه گل کاریار هنی ڤئ کار بئیریت.",
        "userlogin-createanother": "یئ گئل حئساڤ هأنی راس بأکیت",
        "semiprotectedpagewarning": "<strong>د ڤیر داشتوٙئیت:</strong> ئی بألگە سی یە کئ فأقأط کاریاریا ثأڤتئنام کئردە تونئسوٙئن دئش ڤیراشتکار بأکأن پأر و پیم بییە.\nآخئری پئھرئستنوٙمە دأئە بییە سی سأرچئشمە ھاری نئھا ئمایە بییە:",
        "cascadeprotectedwarning": "<strong>زئنار:</strong> ئی بألگە ڤئ دأس کاریاریایی کئ صئلا سأردیڤوٙنکاری دارن می توٙنە ڤیرایئشت کاری بوٙە سی یە کئ ئی بألگە ڤئ رأڤئشت تاف نئمایی پأر و پیم کاری بییە {{PLURAL:$1|بألگە|بألگە یا}}:",
        "titleprotectedwarning": "<strong>زئنار:ئی بألگە پأر و پیم بییە سی یە کئ [[Special:نومگە حوقوٙق کاریاری جأرغە|حوقوٙق ڤیجە]] بایأد ڤئنە رأڤأندیاری بأکأن.</strong>\nآخئری پئھرئستنوٙمە دأ بییە سی سأرچئشمە دأئن نئھا ئمایە بییە:",
-       "templatesused": "{{PLURAL:$1|چوٙأ|چوٙأ یا}} ڤئ کار گئرئتە د ئی بألگە:",
-       "templatesusedpreview": "{{PLURAL:$1|چوٙأ|چوٙأ یا}}ڤئ کار گئرئتە بییە د پیش سئیل:",
+       "templatesused": "{{PLURAL:$1|چۊٱ|چۊٱ یا}} ڤ کار گرتاْ بیٱ د ای بٱلگٱ:",
+       "templatesusedpreview": "{{PLURAL:$1|چۊٱ|چۊٱ یا}} ڤ کار گرتاْ بیٱ د پیش سئیل:",
        "templatesusedsection": "{{PLURAL:$1|چوٙأ|چوٙأ یا}} ڤئ کار گئرئتە بییە د ئی بأرجا:",
        "template-protected": "(پٱر و پیم بیٱ)",
        "template-semiprotected": "(نئصم و نیمە پأر و پیم بییە)",
-       "hiddencategories": "ئÛ\8c Ø¨Ø£Ù\84Ú¯Û\95 Û\8cئ Ú¯Ø¦Ù\84 Ø¯ Ø£Ù\86دÙ\88Ù\85Û\8cا {{PLURAL:$1|1 hidden category|$1 hidden categories}} Ú¾Û\8c:",
+       "hiddencategories": "اؽ Ø¨Ù±Ù\84Ú¯Ù± Û\8cٱکؽ Ø¯ Ù±Ù\86دÙ\88Ù\85Û\8cائٱ {{PLURAL:$1|1 hidden category|$1 hidden categories}} :",
        "edittools-upload": "-",
        "nocreatetext": "{{SITENAME}} سی رأڤأندیاری بألگە یا تازە نئھاگئری بییە.\nشوما می توٙنیت روئیت ڤادئما و بألگە ئی کئ بییشە ڤیرایئشت کاری بأکیت،[[Special:ڤامین ئوٙمائن کاریار|بیائیت ڤامین یا یە کئ یئ گئل حئساڤ دوروس بأکیت]].",
        "nocreate-loggedin": "شوما صئلا راس کئردئن بألگە تازە نە ناریت.",
        "difference-title-multipage": "فرخ مینجا بلگه یا \"$1\" و \"$2\"",
        "difference-multipage": "(فرخ مینجا بلگه یا)",
        "lineno": "خٱت $1:",
-       "compareselectedversions": "دÙ\88بار Ø¯Û\8cئÙ\86Û\8cاÛ\8cÛ\8c Ú©Ù\87 Ø§Ù\86تخاÙ\88 Ø¨Û\8cÙ\86Ù\87 Ù\85Ù\82اÛ\8cسÙ\87 Ø¨Ú©Û\8cتو",
+       "compareselectedversions": "دÙ\88ارٱ Ø¯Û\8cÙ\86Û\8cاؽؽ Ú©Ø§Ù\92 Ø§Ù\92Ù\86تخاÙ\88 Ø¨Û\8cÙ\86Ù± Ù\86اÙ\92 Ù\85Ù\88Ù\82اÛ\8cسٱ Ø¨Ù±Ú©Ø½تو",
        "showhideselectedversions": "شلک دیئن وانیریا انتخاو بیه نه آلشت بکید",
        "editundo": "ناانجومگر کردن",
        "diff-empty": "(بی فرق)",
        "recentchangeslinked-to": "آلشتیایی که د بلگه یا هوم پیوند بینه وه جا بلگه دئیه بیه نشو بیه",
        "recentchanges-page-added-to-category": "[[:$1]]د دأسە ئضاف بی",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] و {{PLURAL:$2|بألگە تأکی|$2 بألگە یا}} د دأسە ئضاف بییئن",
-       "recentchanges-page-removed-from-category": "[[:$1]] د دأسە جئگا بی",
+       "recentchanges-page-removed-from-category": "[[:$1]] د دٱسٱ جاْگا بی",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] و {{PLURAL:$2|بألگە تأکی|$2 بألگە یا}} د دأسە ئضاف بییئن",
        "autochange-username": "آلئشتکاری خودأنجوم مئدیاڤیکی",
        "upload": "سوڤار کردن جانیا",
        "apihelp": "هومیاری آی پی آی",
        "apihelp-no-such-module": "ماجول \"$1\" پیدا نبی.",
        "booksources": "سرچشمه یا كتاو",
-       "booksources-search-legend": "پی جوری سی سرچشمه یا کتاو",
+       "booksources-search-legend": "پاٛ جۊری سی سٱرچٱشمٱیا کتاو",
        "booksources-isbn": "آی اس بی ان:",
-       "booksources-search": "پی جوری",
+       "booksources-search": "پاٛ جۊری",
        "booksources-text": "د هار نومگه ای د هوم پیوندیا د دیارگه یا هنی اومائه که کتاویا نو و دس دوئم می فروشن، و همچنو شایت دونسمنیا بیشتری راجع وه کتاو حاستنی شما داشتوئن:",
        "booksources-invalid-isbn": "شازک که دئه بیه معتور نئ؛ وارسی خطایا د گات ؤرداشتن د سرچشمه اولی وه کار گرته بوئه.",
        "specialloguserlabel": "انجومکار:",
        "prevpage": "بلگه دمایی($1)",
        "allpagesfrom": "بلگه یای که د شرو بینه نشو بیه:",
        "allpagesto": "بلگه یایی که د تموم بینه نشو بیه.",
-       "allarticles": "Ù\87Ù\85Ù\87 Ø¨Ù\84Ú¯Ù\8aا",
+       "allarticles": "Ù\87Ù±Ù\85اÙ\9b Ø¨Ù±Ù\84Ú¯Ù±Û\8cا",
        "allinnamespace": "همه بلگه یا($1 نوم جا)",
        "allpagessubmit": "رۏ",
        "allpagesprefix": "بلگه یایی که پس نوم دارن نشو بیه:",
        "cachedspecial-viewing-cached-ttl": "شما د حال و بار دیئن یه گل نسقه ای د ای بلگه که ها د مینجاگیر هیئت که شایت سی $1 دماتر با.",
        "cachedspecial-viewing-cached-ts": "شما داریت یه گل نسقه د ای بلگه نه که ها د مینجاگر سیل می کیت، و ای نسقه شایت کاملند راستکی نبا.",
        "cachedspecial-refresh-now": "دیئن آخری.",
-       "categories": "دسه يا",
+       "categories": "دٱسٱيا",
        "categoriespagetext": "{{PLURAL:$1|دسه|دسه یا}} هاری دشو جانیایا یا بلگه {{PLURAL:$1|هئ|هیئن}}.\n[[Special:UnusedCategories|دسه یا وه کار نگرته بیه]] د ایچه نیئن.\nهمچنو[[Special:WantedCategories|دسه یا حاستنی نه]] بوینیت.",
        "categoriesfrom": "دسه یایی که د شرو بینه نشو بیه:",
        "deletedcontributions": "هومیاریا پاکسا بیه کارور",
        "listgrouprights-namespaceprotection-restrictedto": "دسرسیا مجاز کاریار سی ویرایشت",
        "trackingcategories": "دئماگئری دأسە یا",
        "trackingcategories-summary": "ای بلگه نومگه دسه یایی دماگری بیه ئه که وه شکل خودانجوم وه دس ویکی وارسگر پر بوئن . نومیا ونو نها آلشت کردن پیغومیا سامونه ای مرتوط د نومجا {{ns:8}} آلشت دئه با.",
-       "trackingcategories-msg": "دئÙ\85اگئرÛ\8c Ø¯Ø£Ø³Û\95",
+       "trackingcategories-msg": "رٱدگÛ\8cرÛ\8c Ø¯Ù±Ø³Ù±",
        "trackingcategories-name": "نوم پئیغوم",
        "trackingcategories-desc": "جادیارکنیا گنجایشت دسه",
        "noindex-category-desc": "ای بلگه وا رباتیا نومگه کاری نبیه و سی یه کلیمه یا جادویی <code><nowiki>__NOINDEX__</nowiki></code> د وه یا د جاگه ای که بیرق مجازه دش هئ.",
        "uctop": "تازه باو",
        "month": "د ما(یا زیتر)",
        "year": "د سال",
-       "sp-contributions-newbies": "Ù\81Ù\82Ø· Ù\87Ù\88Ù\85Û\8cارÛ\8c Û\8cاÛ\8cÛ\8c Ú©Ù\87 Ø¯ Ø­Ø³Ø§Ù\88 ØªØ§Ø²Ù\87 Ø¨Û\8cÙ\87 Ù\86Ø´Ù\88Ù\86 Ø¨Ø¦Ù\87",
+       "sp-contributions-newbies": "Ù\81Ù±Ù\82ٱت Ù\87Ù\88Ù\85Û\8cارÛ\8cاÛ\8cÛ\8c Ú©Ø§Ù\92 Ø¯ Ù\87ساÙ\88 ØªØ§Ø²Ù± Ø¨Û\8cÙ± Ù\86Ø´Ù\88Ý© Ø¨Ø§Ù\9bÛ\8cÙ±",
        "sp-contributions-newbies-sub": "سی حساویا تازه",
        "sp-contributions-newbies-title": "هومیاریا کاریار سی حساویا تازه",
        "sp-contributions-blocklog": "پهرستنۊمٱ قولف بیٱ",
        "sp-contributions-userrights": "دیوونداری حقوق کاریار",
        "sp-contributions-blocked-notice": "د دسرسی ای کاریا د ایسنی نهاگری بیه.\nآخری برشت د پهرستنومه نهاگری ها د سرچشمه هاری:",
        "sp-contributions-blocked-notice-anon": "ای آی پی ایسنی دسرسی ناره.\nآخری برشت د پهرستنومه ها د سرچشمه هاری:",
-       "sp-contributions-search": "سی هومیاریا پی جور با",
-       "sp-contributions-username": "نوم نشون آی پی يا نوم كاروری:",
-       "sp-contributions-toponly": "فقط ویرایشتیایی که جزئه آخرین دوواره دیئن هئین نشو بیه",
-       "sp-contributions-newonly": "Ù\81Ù\82Ø· Ù\88Û\8cراÛ\8cشتÛ\8cاÛ\8cÛ\8c Ú©Ù\87 Ù\85اÙ\84 Ø¯Ø±Ù\88س Ú©Ø±Ø¯Ù\86 Ø¨Ù\84Ú¯Ù\87 Ù\87Û\8cئÙ\86 Ù\86Ø´Ù\88 Ø¨Û\8cÙ\87.",
-       "sp-contributions-submit": "پئÛ\8c Ø¬Ù\88Ù\99ری",
+       "sp-contributions-search": "سی هومیاریا پاٛ جۊر با",
+       "sp-contributions-username": "نوم نشوݩ آی پی يا نوم كارڤٱری:",
+       "sp-contributions-toponly": "فقٱت ڤیرایشتؽایی کاْ جۏزڤاْ آخریݩ دۉران نشو باٛیٱ",
+       "sp-contributions-newonly": "Ù\81Ù±Ù\82ٱت Ú¤Û\8cراÛ\8cشتÛ\8cاÛ\8cÛ\8c Ú©Ø§Ù\92 Ù\87ؽÙ\86 Ø¯Û\8fرس Ú©Ø±Ø¯Ù\86 Ø¨Ù±Ù\84گاÙ\86 Ù\86Ø´Ù\88 Ø¨Ø§Ù\9bÛ\8cÙ±.",
+       "sp-contributions-submit": "پاÙ\9b Ø¬Û\8aری",
        "whatlinkshere": "کوم هوم پیۋندیا هان ایچاٛ",
        "whatlinkshere-title": "بلگه ای که د $1 هوم پیوند بیه",
        "whatlinkshere-page": "بلگٱ",
        "delete_and_move_text": "== پاکساکاری میها ==\n\nگوتار ها د مقصد «[[:$1]]» . آیا میهایت ونه پاکسا بکیت  تا جا وه جاکاری دروس بوئه؟",
        "delete_and_move_confirm": "هری بلگه نه پاکسا کو",
        "delete_and_move_reason": "پاکساکاری سی ممکن بیین جا وه جایی «[[$1]]»",
-       "selfmove": "داسÙ\88Ù\86ا Ø¨Ù\84Ú¯Ù\87 Ø§Ù\88Ù\84 Ù\88 Ø¨Ù\84Ú¯Ù\87 Ù\85Ù\82صد Û\8cÚ©Û\8c Û\8cÙ\86Ø\9b\nÙ\86بÙ\88ئÙ\87 Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\87 Ø¯ Ø®Ù\88Ø´ Ø¬Ø§ Ù\88Ù\87 Ø¬Ø§کاری کرد.",
+       "selfmove": "داسÙ\88Ù\86ؽا Ø¨Ù±Ù\84Ú¯Ù± Ù±Ú¤Ù±Ù\84 Û\89 Ø¨Ù±Ù\84Ú¯Ù± Ù\85Ù±Ù\82سٱد Û\8cٱکؽ Ù\87ؽسÙ\86Ø\9b\nÙ\86Ù\85Û\8aئٱ Ø¨Ù±Ù\84Ú¯Ù±Ù\86اÙ\92 Ú¤ Ø®Ù\88Ø´ Ø¬Ø§ Ú¤ Ø¬Ø§ کاری کرد.",
        "immobile-source-namespace": "نبوئه بلگه یا نه وه نومجا \"$1\" جا وه جا با",
        "immobile-target-namespace": "نبوئه بلگه یا نه وه نومجا \"$1\" جا وه جا با",
        "immobile-target-namespace-iw": "هوم پیوند مینجاویکی حاستنی مجازی سی جا وه جا کردن بلگه نئ.",
        "tooltip-ca-nstab-project": "ديئن بلگه پروجه",
        "tooltip-ca-nstab-image": "ديئن بلگه جانیا",
        "tooltip-ca-nstab-mediawiki": "دیاٛن پیغوم سامۊنٱ",
-       "tooltip-ca-nstab-template": "ديئن قالو",
+       "tooltip-ca-nstab-template": "ديئن چۊٱ",
        "tooltip-ca-nstab-help": "ديئن بلگه هومیاری",
        "tooltip-ca-nstab-category": "ديئن بلگه دسه بنی",
        "tooltip-minoredit": "یه نه د عنوان حیرده ویرایشت ثوت کو",
        "pageinfo-recent-authors": "شماره کلی نویسنه یا یکونه",
        "pageinfo-magic-words": "جادویی{{PLURAL:$1|کلیمه|کلیمه یا}} ($1)",
        "pageinfo-hidden-categories": "$1{{PLURAL:$1|دسه|دسه يا}} قام بیه",
-       "pageinfo-templates": "{{PLURAL:$1|چوئه|چوئه یا}} وه کار گرته بیه($1)",
+       "pageinfo-templates": "{{PLURAL:$1|چۊٱ|چۊٱ یا}} ڤ کار گرتاْ بیٱ ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|بلگه|بلگه یا}} وه کار گرته بیه د ($1)",
        "pageinfo-toolboxlink": "دونسمٱنیا بٱلگٱ",
        "pageinfo-redirectsto": "واگردونی سی",
        "logentry-import-upload": "$1 $3 نه وه دس جانیا سوارکن {{GENDER:$2|وامین اورد}}",
        "logentry-import-interwiki": "$1 $3 نه د یه گل ویکی هنی {{GENDER:$2|وامین اورد}}",
        "logentry-merge-merge": "$1  $3  نه د $4 {{GENDER:$2| سریک سازی کرد}} (نسقه تا  $5)",
-       "logentry-move-move": "$1 {{GENDER:$2|جا وه جا کرده}} بلگه $3 نه سی $4",
+       "logentry-move-move": "$1 {{GENDER:$2|جا ڤ جا کردناْ}} بٱلگٱ $3 ناْ سی $4",
        "logentry-move-move-noredirect": "$1 بلگه $3 نه بی یه که یه گل واگردونی داشوئه د $4 {{GENDER:$2|جا وه جاکاری کرد}}",
        "logentry-move-move_redir": "$1 بلگه $3 نه د $4 که واگردونی بی {{GENDER:$2|جا وه جاکاری کرد}}",
        "logentry-move-move_redir-noredirect": "$1 بلگه $3 نه بی یه که یه گل واگردونی د $4 داشتوئه که یه خوش واگردونی بی {{GENDER:$2|جا وه جاکاری کرد}}",
index 830e9a1..9d4130a 100644 (file)
        "noname": "Tu neesi norādījis derīgu lietotāja vārdu.",
        "loginsuccesstitle": "Pieteikšanās veiksmīga",
        "loginsuccess": "Tu esi ienācis {{grammar:lokatīvs|{{SITENAME}}}} kā \"$1\".",
-       "nosuchuser": "Šeit nav lietotāja ar vārdu \"$1\". Lietotājvārdi ir reģistrjutīgi (lielie un mazie burti nav viens un tas pats) Pārbaudi, vai pareizi uzrakstīts, vai arī [[Special:CreateAccount|izveido jaunu kontu]].",
+       "nosuchuser": "Nav lietotāja ar vārdu \"$1\".\nLietotājvārdi ir reģistrjutīgi.\nPārbaudi, vai pareizi uzrakstīts, vai arī [[Special:CreateAccount|izveido jaunu kontu]].",
        "nosuchusershort": "Šeit nav lietotāja ar vārdu \"$1\". Pārbaudi, vai nav drukas kļūda.",
        "nouserspecified": "Tev jānorāda lietotājvārds.",
        "login-userblocked": "Šis dalībnieks ir bloķēts. Pieslēgšanās nav atļauta.",
        "backend-fail-notexists": "Fails $1 nepastāv.",
        "backend-fail-hashes": "Neizdevās iegūt failu kontrolsummas salīdzināšanai.",
        "backend-fail-notsame": "Neidentisks fails jau pastāv $1.",
+       "backend-fail-invalidpath": "\"$1\" nav derīgs glabātuves ceļš.",
        "backend-fail-delete": "Nevar izdzēst failu $1.",
        "backend-fail-describe": "Nevarēja izmainīt faila \"$1\" metadatus.",
        "backend-fail-alreadyexists": "Fails $1 jau pastāv.",
        "ipb-change-block": "Pārbloķēt ar šiem uzstādījumiem",
        "ipb-confirm": "Apstiprināt bloķēšanu",
        "ipb-pages-label": "Lapas",
+       "ipb-namespaces-label": "Vārdtelpas",
        "badipaddress": "Nederīga IP adrese",
        "blockipsuccesssub": "Nobloķēts veiksmīgi",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] tika nobloķēts.<br />\nVisus blokus var apskatīties [[Special:BlockList|IP bloku sarakstā]].",
        "createaccountblock": "kontu veidošana atslēgta",
        "emailblock": "e-pasts bloķēts",
        "blocklist-nousertalk": "nevar izmainīt savu diskusiju lapu",
+       "blocklist-editing-page": "lapas",
+       "blocklist-editing-ns": "vārdtelpas",
        "ipblocklist-empty": "Bloķēšanas saraksts ir tukšs.",
        "ipblocklist-no-results": "Norādītā IP adrese vai dalībnieks nav bloķēts.",
        "blocklink": "bloķēt",
        "previousdiff": "← Vecāka versija",
        "nextdiff": "Jaunāka versija →",
        "mediawarning": "'''Brīdinājums''': Šis faila tips var saturēt ļaunprātīgu kodu, kuru izpildot, tava datora darbība var tikt traucēta.",
-       "imagemaxsize": "Attēlu apraksta lapās parādāmo attēlu maksimālais izmērs:",
+       "imagemaxsize": "Failu apraksta lapās parādāmo attēlu maksimālais izmērs:",
        "thumbsize": "Sīkbildes izmērs:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|lapu|lapa|lapas}}",
        "file-info": "faila izmērs: $1, MIME tips: $2",
index 825a591..5aba03a 100644 (file)
        "previewerrortext": "Се појави грешка при обидот да се прегледаат промените.",
        "blockedtitle": "Корисникот е блокиран",
        "blocked-email-user": "<strong><strong>На вашето корисничко име му е забрането да праќа е-пошта. Можете сепак да уредувате други страници на ова вики.</strong> Сите поединости за забраната ќе ги најдете во [[Special:MyContributions|придонесите на сметката]].\n\nЗабраната ја дал $1.\n\nНаведената причина гласи <em>$2</em>.\n\n* Почеток на забраната: $8\n* Истек на забраната: $6\n* Предвиден забраненик: $7\n* Назнака на забраната #$5",
-       "blockedtext-partial": "<strong>На вашето корисничко или IP-адреса му е забрането да прави измени на страницава. Можете сепак да уредувате други страници на ова вики.</strong> Сите поединости за забраната ќе ги најдете во [[Special:MyContributions|придонесите на сметката]].\n\nЗабраната ја дал $1.\n\nНаведената причина гласи <em>$2</em>.\n\n* Почеток на забраната: $8\n* Истек на забраната: $6\n* Предвиден забраненик: $7\n* Назнака на забраната #$5",
+       "blockedtext-partial": "<strong>Ð\9dа Ð²Ð°Ñ\88еÑ\82о ÐºÐ¾Ñ\80иÑ\81ниÑ\87ко Ð¸Ð¼Ðµ Ð¸Ð»Ð¸ IP-адÑ\80еÑ\81а Ð¼Ñ\83 Ðµ Ð·Ð°Ð±Ñ\80анеÑ\82о Ð´Ð° Ð¿Ñ\80ави Ð¸Ð·Ð¼ÐµÐ½Ð¸ Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86ава. Ð\9cожеÑ\82е Ñ\81епак Ð´Ð° Ñ\83Ñ\80едÑ\83ваÑ\82е Ð´Ñ\80Ñ\83ги Ñ\81Ñ\82Ñ\80аниÑ\86и Ð½Ð° Ð¾Ð²Ð° Ð²Ð¸ÐºÐ¸.</strong> Ð¡Ð¸Ñ\82е Ð¿Ð¾ÐµÐ´Ð¸Ð½Ð¾Ñ\81Ñ\82и Ð·Ð° Ð·Ð°Ð±Ñ\80анаÑ\82а Ñ\9cе Ð³Ð¸ Ð½Ð°Ñ\98деÑ\82е Ð²Ð¾ [[Special:MyContributions|пÑ\80идонеÑ\81иÑ\82е Ð½Ð° Ñ\81меÑ\82каÑ\82а]].\n\nÐ\97абÑ\80анаÑ\82а Ñ\98а Ð´Ð°Ð» $1.\n\nÐ\9dаведенаÑ\82а Ð¿Ñ\80иÑ\87ина Ð³Ð»Ð°Ñ\81и <em>$2</em>.\n\n* Ð\9fоÑ\87еÑ\82ок Ð½Ð° Ð·Ð°Ð±Ñ\80анаÑ\82а: $8\n* Ð\98Ñ\81Ñ\82ек Ð½Ð° Ð·Ð°Ð±Ñ\80анаÑ\82а: $6\n* Ð\9fÑ\80едвиден Ð·Ð°Ð±Ñ\80аненик: $7\n* Ð\9dазнака Ð½Ð° Ð·Ð°Ð±Ñ\80анаÑ\82а #$5",
        "blockedtext": "<strong>Вашето корисничко име или IP-адреса е блокирано.</strong>\n\nБлокирањето е направено од страна на $1.\nДаденото образложение е <em>$2</em>.\n\n* Почеток на блокирањето: $8\n* Истекување на блокирањето: $6\n* Корисникот што требало да биде блокиран: $7\n\nМоже да контактирате со $1 или некој друг [[{{MediaWiki:Grouppage-sysop}}|администратор]] за да разговарате во врска со блокирањето.\nМожете да ја искористите можноста „{{int:emailuser}}“ ако е назначена важечка е-поштенска адреса во [[Special:Preferences|вашите нагодувања]] и не ви е забрането да ја користите.\nВашата сегашна IP-адреса е $3, а назнака на блокирањето гласи #$5.\nВе молиме наведете ги сите подробности прикажани погоре, во вашата евентуална реакција.",
        "autoblockedtext": "Вашата IP-адреса е автоматски блокирана бидејќи била користена од страна на друг корисник, кој бил блокиран од $1.\nДаденото образложение е следново:\n\n:<em>$2</em>\n\n* Почеток на блокирањето: $8\n* Истекување на блокирањето: $6\n* Со намера да се блокира: $7\n\nМоже да контактирате со $1 или некој друг [[{{MediaWiki:Grouppage-sysop}}|администратор]] за да разговарате во врска со ова блокирање.\n\nИмајте предвид дека можеби нема да можете да ја искористите можноста „{{int:emailuser}}“ доколку не е назначена важечка е-поштенска адреса во [[Special:Preferences|вашите нагодувања]] и ви е забрането користење на истата.\n\nВашата IP-адреса е $3, a назнака на блокирањетo е $5.\nВе молиме наведете ги овие подробности доколку реагирате на блокирањето.",
        "systemblockedtext": "Вашето корисничко име или IP-адреса е автоматски блокирано од МедијаВики.\nПонудена причина:\n\n:<em>$2</em>\n\n* Почеток на блокот: $8\n* Истек на блокот: $6\n* Блокот е наменет за: $7\n\nВашата тековна IP-адреса гласи $3.\nПрепишете ги сите горенаведени поединости доколку сакате да се распрашате кај надлежните во врска со блокот.",
        "blocklist-nousertalk": "без можност за уредување на својата разговорна страница",
        "blocklist-editing": "уредување",
        "blocklist-editing-sitewide": "уредување (на цело вики)",
+       "blocklist-editing-page": "страници",
+       "blocklist-editing-ns": "именски простори",
        "ipblocklist-empty": "Списокот на блокирања е празен.",
        "ipblocklist-no-results": "Бараната IP-адреса или корисничка сметка не е блокирана.",
        "blocklink": "блокирај",
        "mw-widgets-abandonedit-discard": "Отфрли уредувања",
        "mw-widgets-abandonedit-keep": "Продолжи со уредување",
        "mw-widgets-abandonedit-title": "Дали сте сигурни?",
-       "mw-widgets-dateinput-no-date": "Немате одбрано датум",
+       "mw-widgets-dateinput-no-date": "Нема избрано датум",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "mw-widgets-mediasearch-input-placeholder": "Пребарајте слики/снимки",
index c4fe7e1..b513eee 100644 (file)
        "ipb-sitewide": "സൈറ്റ്-വ്യാപകം",
        "ipb-partial": "ഭാഗികം",
        "ipb-pages-label": "താളുകൾ",
+       "ipb-namespaces-label": "നാമമേഖലകൾ",
        "badipaddress": "അസാധുവായ ഐ.പി. വിലാസം.",
        "blockipsuccesssub": "തടയൽ വിജയിച്ചിരിക്കുന്നു",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] എന്ന ഉപയോക്താവിനെ തടഞ്ഞിരിക്കുന്നു.<br />\nതടയൽ പുനഃപരിശോധിക്കാൻ [[Special:BlockList|തടയൽ പട്ടിക]] കാണുക.",
        "blocklist-nousertalk": "സ്വന്തം സം‌വാദ താളിൽ തിരുത്താൻ സാധിക്കില്ല",
        "blocklist-editing": "തിരുത്ത്",
        "blocklist-editing-sitewide": "തിരുത്ത് (സൈറ്റ്-വ്യാപകം)",
+       "blocklist-editing-page": "താളുകൾ",
+       "blocklist-editing-ns": "നാമമേഖലകൾ",
        "ipblocklist-empty": "തടയൽപ്പട്ടിക ശൂന്യമാണ്‌.",
        "ipblocklist-no-results": "ഈ ഐ.പി. വിലാസമോ ഉപയോക്തൃനാമമോ തടഞ്ഞിട്ടില്ല.",
        "blocklink": "തടയുക",
        "logentry-block-block": "$5 $6 കാലത്തേക്ക് {{GENDER:$4|$3}} എന്ന അംഗത്വത്തെ $1 {{GENDER:$2|തടഞ്ഞിരിക്കുന്നു}}",
        "logentry-block-unblock": "{{GENDER:$4|$3}} എന്ന അംഗത്വത്തെ തടഞ്ഞത് $1 {{GENDER:$2|ഒഴിവാക്കിയിരിക്കുന്നു}}",
        "logentry-block-reblock": "$5 $6 കാലത്തേക്ക് {{GENDER:$4|$3}} എന്ന അംഗത്വത്തിന്റെ തടയൽ സജ്ജീകരണങ്ങൾ $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
-       "logentry-partialblock-block": "$7 എന്നീ {{PLURAL:$8||താളുകൾ}} തിരുത്തുന്നതിൽ നിന്നും {{GENDER:$4|$3}} എന്ന ഉപയോക്താവിനെ $1 {{GENDER:$2|തടഞ്ഞിരിക്കുന്നു}}, തടയൽ കാലഹരണപ്പെടുന്നത് $5 $6",
-       "logentry-partialblock-reblock": "$7 എന്നീ {{PLURAL:$8||താളുകൾ}} {{GENDER:$4|$3}} എന്ന ഉപയോക്താവ് തിരുത്തുന്നത് തടയുന്നതിനായി തടയൽ സജ്ജീകരണങ്ങളിൽ $1 {{GENDER:$2|മാറ്റം വരുത്തിയിരിക്കുന്നു}}, തടയൽ കാലഹരണപ്പെടുന്നത് $5 $6",
+       "logentry-partialblock-block-page": "$2 {{PLURAL:$1|എന്ന താൾ|എന്നീ താളുകൾ}}",
+       "logentry-partialblock-block-ns": "$2 {{PLURAL:$1|നാമമേഖല|നാമമേഖലകൾ}}",
+       "logentry-partialblock-block": "$7 തിരുത്തുന്നതിൽ നിന്നും {{GENDER:$4|$3}} എന്ന ഉപയോക്താവിനെ $1 {{GENDER:$2|തടഞ്ഞിരിക്കുന്നു}}, തടയൽ കാലഹരണപ്പെടുന്നത് $5 $6",
+       "logentry-partialblock-reblock": "{{GENDER:$4|$3}} എന്ന ഉപയോക്താവ് $7 തിരുത്തുന്നത് തടയുന്നതിനായി തടയൽ സജ്ജീകരണങ്ങളിൽ $1 {{GENDER:$2|മാറ്റം വരുത്തിയിരിക്കുന്നു}}, തടയൽ കാലഹരണപ്പെടുന്നത് $5 $6",
        "logentry-non-editing-block-block": "{{GENDER:$4|$3}} എന്ന ഉപയോക്താവിനെ, പ്രത്യേക തിരുത്തിതര പ്രവൃത്തികൾ ചെയ്യുന്നതിൽ നിന്നും $1 {{GENDER:$2|തടഞ്ഞിരിക്കുന്നു}}, തടയൽ കാലഹരണപ്പെടുന്നത് $5 $6",
        "logentry-non-editing-block-reblock": "{{GENDER:$4|$3}} എന്ന ഉപയോക്താവ് പ്രത്യേക തിരുത്തിതര പ്രവൃത്തികൾ ചെയ്യാതിരിക്കാനുള്ള തടയൽ സജ്ജീകരണങ്ങളിൽ $1 {{GENDER:$2|മാറ്റം വരുത്തിയിരിക്കുന്നു}}, മാറ്റം കാലഹരണപ്പെടുന്നത് $5 $6",
        "logentry-suppress-block": "$5 $6 കാലത്തേക്ക് {{GENDER:$4|$3}} എന്ന അംഗത്വത്തെ $1 {{GENDER:$2|തടഞ്ഞിരിക്കുന്നു}}",
        "special-characters-group-ipa": "ഐ.പി.എ.",
        "special-characters-group-symbols": "ചിഹ്നങ്ങൾ",
        "special-characters-group-greek": "ഗ്രീക്ക്",
+       "special-characters-group-greekextended": "ഗ്രീക്ക് വിപുലം",
        "special-characters-group-cyrillic": "സിറിലിക്",
        "special-characters-group-arabic": "അറബിക്",
        "special-characters-group-arabicextended": "അറബി വിപുലം",
        "special-characters-group-thai": "തായ്",
        "special-characters-group-lao": "ലാവോ",
        "special-characters-group-khmer": "ഖെമർ",
+       "special-characters-group-canadianaboriginal": "കനേഡിയൻ അബൊറിജിനൽ",
        "special-characters-title-endash": "ഇം  ഡാഷ്",
        "special-characters-title-emdash": "എം ഡാഷ്",
        "special-characters-title-minus": "വ്യവകലന ചിഹ്നം",
        "log-action-filter-import-interwiki": "ട്രാൻസ്‌‌വിക്കി ഇറക്കുമതി",
        "log-action-filter-import-upload": "എക്സ്.എം.എൽ. അപ്‌ലോഡ് വഴിയുള്ള ഇറക്കുമതി",
        "log-action-filter-managetags-create": "ടാഗ് സൃഷ്ടി",
+       "log-action-filter-move-move": "തിരിച്ചുവിടലുകൾക്ക് മുകളിൽ ചേർക്കാതെയുള്ള മാറ്റം",
+       "log-action-filter-move-move_redir": "തിരിച്ചുവിടലുകൾക്ക് മുകളിൽ ചേർത്തുള്ള മാറ്റം",
+       "log-action-filter-newusers-create": "അജ്ഞാത ഉപയോക്താവിന്റെ സൃഷ്ടി",
+       "log-action-filter-newusers-create2": "രജിസ്റ്റർ ചെയ്തിട്ടുള്ള ഉപയോക്താവിന്റെ സൃഷ്ടി",
+       "log-action-filter-newusers-autocreate": "യാന്ത്രിക സൃഷ്ടി",
+       "log-action-filter-newusers-byemail": "ഇമെയിൽ ആയി അയച്ച നൽകിയ രഹസ്യവാക്ക് ഉപയോഗിച്ചുള്ള സൃഷ്ടി",
        "log-action-filter-protect-protect": "സംരക്ഷണം",
+       "log-action-filter-protect-modify": "സംരക്ഷണത്തിൽ മാറ്റം വരുത്തൽ",
        "log-action-filter-protect-unprotect": "സംരക്ഷണമൊഴിവാക്കൽ",
        "log-action-filter-protect-move_prot": "സംരക്ഷണം മാറ്റി",
        "log-action-filter-suppress-event": "രേഖ ഒതുക്കൽ",
index ac3a323..d2d7f4c 100644 (file)
@@ -27,7 +27,8 @@
                        "Jeluang Terluang",
                        "Zulfadli51",
                        "Fitoschido",
-                       "MNH48"
+                       "MNH48",
+                       "Tofeiku"
                ]
        },
        "tog-underline": "Garis bawah pautan:",
        "ns-specialprotected": "Laman khas tidak boleh disunting.",
        "titleprotected": "Tajuk ini telah dilindungi oleh [[User:$1|$1]] daripada dicipta. Sebab yang diberikan ialah <em>$2</em>.",
        "filereadonlyerror": "Fail \"$1\" tidak dapat diubah suai kerana repositori fail \"$2\" berada dalam mod baca sahaja.\n\nPenyelia yang telah menguncinya memberikan penjelasan berikut: \"$3\".",
+       "invalidtitle": "Tajuk tidak sah",
        "invalidtitle-knownnamespace": "Tajuk tidak sah dengan ruang nama \"$2\" dan teks \"$3\"",
        "invalidtitle-unknownnamespace": "Tajuk tidak sah dengan nombor ruang nama tidak dikenali $1 dan teks \"$2\"",
        "exception-nologin": "Belum log masuk",
        "revertmerge": "Pisahkan",
        "mergelogpagetext": "Yang berikut ialah senarai terkini bagi penggabungan sejarah sesebuah laman ke dalam laman yang lain.",
        "history-title": "Sejarah semakan bagi \"$1\"",
-       "difference-title": "Perbezaan antara semakan-semakan \"$1\"",
+       "difference-title": "Perbezaan antara semakan \"$1\"",
        "difference-title-multipage": "Perbezaan antara laman \"$1\" dan \"$2\"",
        "difference-multipage": "(Perbezaan antara laman)",
        "lineno": "Baris $1:",
        "recentchanges-label-plusminus": "Saiz laman telah berubah sebanyak jumlah bait ini",
        "recentchanges-legend-heading": "<strong>Petunjuk:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lihat juga [[Special:NewPages|senarai laman baru]])",
+       "rcfilters-legend-heading": "<strong>Senarai singkatan:</strong>",
        "rcfilters-other-review-tools": "Alat semakan lain",
        "rcfilters-activefilters": "Penapis yang aktif",
        "rcfilters-savedqueries-defaultlabel": "Penapis yang disimpan",
        "rcfilters-savedqueries-remove": "Gugurkan",
        "rcfilters-savedqueries-new-name-label": "Nama",
        "rcfilters-savedqueries-add-new-title": "Simpan tetapan penapis terkini",
+       "rcfilters-show-new-changes": "Lihat perubahan terkini",
+       "rcfilters-search-placeholder": "Penapis perubahan (guna menu atau carian untuk menapis nama)",
+       "rcfilters-filtergroup-userExpLevel": "Pendaftaran dan pengalaman pengguna",
+       "rcfilters-filter-user-experience-level-unregistered-label": "Tidak terdaftar",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Penyunting yang tidak log masuk.",
        "rcfilters-filter-humans-label": "Manusia (bukan bot)",
+       "rcfilters-filtergroup-changetype": "Jenis perubahan",
        "rcfilters-filter-pageedits-label": "Suntingan laman",
        "rcfilters-filter-pageedits-description": "Suntingan kandungan wiki, perbincangan, huraian kategori…",
        "rcfilters-filter-newpages-label": "Penciptaan laman",
        "rcfilters-filter-logactions-label": "Tindakan berlog",
        "rcfilters-filter-logactions-description": "Tindakan pentadbiran, pembuatan akaun, penghapusan halaman, muat naik…",
+       "rcfilters-liveupdates-button": "Perubahan langsung",
        "rcnotefrom": "Yang berikut ialah {{PLURAL:$5|suntingan|suntingan-suntingan}} sejak <strong>$3, $4</strong> (selebihi <strong>$1</strong> dipaparkan).",
        "rclistfrom": "Paparkan perubahan sejak $3 $2",
        "rcshowhideminor": "$1 suntingan kecil",
index ce75847..c83dfe6 100644 (file)
        "blocklist-nousertalk": "kan eigen overlegpagina niet bewerken",
        "blocklist-editing": "bewerken",
        "blocklist-editing-sitewide": "bewerken (gehele wiki)",
+       "blocklist-editing-page": "pagina's",
+       "blocklist-editing-ns": "naamruimten",
        "ipblocklist-empty": "De blokkeerlijst is leeg.",
        "ipblocklist-no-results": "Dit IP-adres of deze gebruikersnaam is niet geblokkeerd.",
        "blocklink": "blokkeren",
        "logentry-partialblock-block-ns": "de {{PLURAL:$1|naamruimte|naamruimten}} $2",
        "logentry-partialblock-block": "$1 heeft {{GENDER:$4|$3}} {{GENDER:$2|geblokkeerd}} voor het bewerken van $7 met als vervaltijd $5 $6",
        "logentry-partialblock-reblock": "$1 heeft de blokkade van {{GENDER:$4|$3}} {{GENDER:$2|gewijzigd}} zodat het bewerken van $7 wordt tegengehouden met als vervaltijd $5 $6",
-       "logentry-non-editing-block-block": "$1 heeft {{GENDER:$4|$3}} {{GENDER:$2|geblokkeerd}} voor het uitvoeren van handelingen anders dan bewerking met als vervaltijd $5 $6",
-       "logentry-non-editing-block-reblock": "$1 heeft de blokkade van {{GENDER:$4|$3}} voor het uitvoeren van handelingen anders dan bewerking {{GENDER:$2|gewijzigd}} met als vervaltijd $5 $6",
+       "logentry-non-editing-block-block": "$1 heeft {{GENDER:$4|$3}} {{GENDER:$2|geblokkeerd}} voor het uitvoeren van de opgegeven handelingen anders dan bewerken met als vervaltijd $5 $6",
+       "logentry-non-editing-block-reblock": "$1 heeft de blokkade van {{GENDER:$4|$3}} voor het uitvoeren van opgegeven handelingen anders dan bewerken {{GENDER:$2|gewijzigd}} met als vervaltijd $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|heeft}} {{GENDER:$4|$3}} geblokkeerd voor de duur van $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|heeft}} de blokkade voor {{GENDER:$4|$3}} aangepast. Deze vervalt nu op $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|heeft}} $3 geïmporteerd via een bestandsupload",
index b7fa99b..37a78dd 100644 (file)
@@ -27,7 +27,8 @@
                        "Sony dandiwal",
                        "Stephanecbisson",
                        "Fitoschido",
-                       "Matěj Suchánek"
+                       "Matěj Suchánek",
+                       "ਗੁਰਪ੍ਰੀਤ ਹੁੰਦਲ"
                ]
        },
        "tog-underline": "ਲਿੰਕ ਹੇਠ-ਲਾਈਨ:",
        "history": "ਸਫ਼ੇ ਦਾ ਅਤੀਤ",
        "history_short": "ਅਤੀਤ",
        "updatedmarker": "ਮੇਰੀ ਆਖਰੀ ਫੇਰੀ ਤੋਂ ਬਾਅਦ ਦੇ ਅੱਪਡੇਟ",
-       "printableversion": "à¨\9bਪਣਯà©\8bà¨\97 à¨°à©\82ਪ",
+       "printableversion": "à¨\9bਪਣਯà©\8bà¨\97 à¨¸à©°à¨¸à¨\95ਰਣ",
        "permalink": "ਪੱਕੀ ਲਿੰਕ",
        "print": "ਛਾਪੋ",
        "view": "ਵੇਖੋ",
        "viewhelppage": "ਮਦਦ ਸਫ਼ਾ ਵੇਖੋ",
        "categorypage": "ਸ਼੍ਰੇਣੀ ਸਫ਼ਾ ਵੇਖੋ",
        "viewtalkpage": "ਚਰਚਾ ਵੇਖੋ",
-       "otherlanguages": "ਹੋਰ ਬੋਲੀਆਂ ਵਿਚ",
+       "otherlanguages": "ਹà©\8bਰ à¨¬à©\8bਲà©\80à¨\86à¨\82 à¨µà¨¿à©±à¨\9a",
        "redirectedfrom": "($1 ਤੋਂ ਰੀਡਿਰੈਕਟ)",
        "redirectpagesub": "ਰੀਡਿਰੈਕਟ ਸਫ਼ਾ",
        "redirectto": "ਇਸ ਵੱਲ ਮੋੜੋ:",
        "userlogin-yourname-ph": "ਆਪਣਾ ਵਰਤੋਂਕਾਰ-ਨਾਂ ਭਰੋ",
        "createacct-another-username-ph": "ਵਰਤੋਂਕਾਰ-ਨਾਂ ਭਰੋ",
        "yourpassword": "ਪਾਸਵਰਡ:",
-       "userlogin-yourpassword": "ਪਾਸਵਰਡ",
+       "userlogin-yourpassword": "ਲੰà¨\98-ਸ਼ਬਦ",
        "userlogin-yourpassword-ph": "ਆਪਣਾ ਪਾਸਵਰਡ ਦਿਉ",
        "createacct-yourpassword-ph": "ਪਾਸਵਰਡ ਦਿਉ",
        "yourpasswordagain": "ਪਾਸਵਰਡ ਮੁੜ ਲਿਖੋ:",
        "revision-info": "{{GENDER:$6|$2}}$7 ਦਾ ਬਣਾਇਆ $1 ਦਾ ਰੀਵਿਜ੍ਹਨ",
        "previousrevision": "←ਪੁਰਾਣਾ ਰੀਵਿਜਨ",
        "nextrevision": "ਨਵਾਂ ਰੀਵਿਜਨ →",
-       "currentrevisionlink": "ਸਭ à¨¤à©\8b à¨¨à¨µà¨¾à¨\82 à¨°à©\80ਵਿà¨\9cਨ",
+       "currentrevisionlink": "ਸਭ à¨¤à©\8b à¨¨à¨µà¨¾à¨\82 à¨¦à©\81ਹਰਾà¨\87à¨\86",
        "cur": "ਮੌਜੂਦਾ",
        "next": "ਅੱਗੇ",
        "last": "ਪਿਛਲਾ",
        "usermessage-summary": "ਸਿਸਟਮ ਸੁਨੇਹਾ ਛੱਡਿਆ ਜਾ ਰਿਹਾ ਹੈ।",
        "usermessage-editor": "ਸਿਸਟਮ ਦੂਤ",
        "watchlist": "ਨਿਗਰਾਨ-ਸੂਚੀ",
-       "mywatchlist": "ਨਿà¨\97ਰਾਨà©\80-ਲਿਸà¨\9f",
+       "mywatchlist": "ਨਿà¨\97ਰਾਨà©\80-ਸà©\82à¨\9aà©\80",
        "watchlistfor2": "$1 $2 ਲਈ",
        "nowatchlist": "ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਕੋਈ ਚੀਜ਼ ਨਹੀਂ ਹੈ।",
        "watchlistanontext": "ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚਲੀਆਂ ਚੀਜ਼ਾਂ ਵੇਖਣ ਜਾਂ ਸੋਧਣ ਲਈ ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਦਾਖ਼ਲ ਹੋਵੋ।",
        "whatlinkshere-hidetrans": "$1 ਇੱਥੇ ਕੀ ਕੀ ਜੁੜਦਾ ਹੈ।",
        "whatlinkshere-hidelinks": "$1 ਲਿੰਕ",
        "whatlinkshere-hideimages": "ਫ਼ਾਈਲ ਲਿੰਕ $1",
-       "whatlinkshere-filters": "ਫਿਲà¨\9fਰ",
+       "whatlinkshere-filters": "à¨\9bਾਨਣà©\80à¨\86à¨\82",
        "whatlinkshere-submit": "ਚਲੋ",
        "block": "ਵਰਤੋਂਕਾਰ 'ਤੇ ਪਾਬੰਦੀ ਲਾਓ",
        "unblock": "ਵਰਤੋਂਕਾਰ 'ਤੇ ਲੱਗੀ ਪਾਬੰਦੀ ਹਟਾਓ",
index 9e78062..5b08e77 100644 (file)
        "blocklist-nousertalk": "nie mogą edytować własnych stron dyskusji",
        "blocklist-editing": "edytowanie",
        "blocklist-editing-sitewide": "edytowanie całej strony",
+       "blocklist-editing-page": "strony",
+       "blocklist-editing-ns": "przestrzenie nazw",
        "ipblocklist-empty": "Lista blokad jest pusta.",
        "ipblocklist-no-results": "Podany adres IP lub użytkownik nie jest zablokowany.",
        "blocklink": "zablokuj",
index 6e03629..05be43b 100644 (file)
                        "Fitoschido",
                        "Ed g2s",
                        "Matěj Suchánek",
-                       "Didifelisberto"
+                       "Didifelisberto",
+                       "Tks4Fish"
                ]
        },
        "tog-underline": "Ligação sublinhada:",
        "blocklist-nousertalk": "impossibilitado de editar a própria página de discussão",
        "blocklist-editing": "edição",
        "blocklist-editing-sitewide": "edição (todo o site)",
+       "blocklist-editing-page": "páginas",
+       "blocklist-editing-ns": "domínios",
        "ipblocklist-empty": "A lista de bloqueios encontra-se vazia.",
        "ipblocklist-no-results": "O endereço de IP ou nome de usuário procurado não se encontra bloqueado.",
        "blocklink": "bloquear",
index 3c7ee5a..c7b28a9 100644 (file)
        "ipb-sitewide": "Em todo o site",
        "ipb-partial": "Parcial",
        "ipb-pages-label": "Páginas",
+       "ipb-namespaces-label": "Espaços nominais",
        "badipaddress": "Endereço IP inválido",
        "blockipsuccesssub": "Bloqueio efetuado",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] foi {{GENDER:$1|bloqueado|bloqueada}}.<br />\nConsulte a [[Special:BlockList|lista de bloqueios]] para rever os bloqueios.",
        "blocklist-nousertalk": "impedido de editar a própria página de discussão",
        "blocklist-editing": "edição",
        "blocklist-editing-sitewide": "edição (todo o ''site'')",
+       "blocklist-editing-page": "páginas",
+       "blocklist-editing-ns": "espaços nominais",
        "ipblocklist-empty": "A lista de bloqueios encontra-se vazia.",
        "ipblocklist-no-results": "O endereço IP ou nome de utilizador procurado não se encontra bloqueado.",
        "blocklink": "bloquear",
        "logentry-block-block": "$1 {{GENDER:$2|bloqueou}} {{GENDER:$4|$3}} com expiração a $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|desbloqueou}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|modificou}} parâmetros de bloqueio de {{GENDER:$4|$3}} com expiração a $5 $6",
-       "logentry-partialblock-block": "$1 {{GENDER:$2|aplicou a}} {{GENDER:$4|$3}} um bloqueio que impede a edição {{PLURAL:$8|da página|das páginas}} $7 com um prazo de expiração de $5 $6",
-       "logentry-partialblock-reblock": "$1 {{GENDER:$2|alterou}} as definições do bloqueio de {{GENDER:$4|$3}} para impedir a edição {{PLURAL:$8|da página|das páginas}} $7 com um prazo de expiração de $5 $6",
+       "logentry-partialblock-block-page": "{{PLURAL:$1|da página|das páginas}} $2",
+       "logentry-partialblock-block-ns": "{{PLURAL:$1|do espaço nominal|dos espaços nominais}} $2",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|aplicou a}} {{GENDER:$4|$3}} um bloqueio que impede a edição $7 com um prazo de expiração de $5 $6",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|alterou}} as definições do bloqueio de {{GENDER:$4|$3}} para impedir a edição $7 com um prazo de expiração de $5 $6",
        "logentry-non-editing-block-block": "$1 {{GENDER:$2|aplicou a}} {{GENDER:$4|$3}} um bloqueio que impede as operações especificadas que não são edições, com um prazo de expiração de $5 $6",
        "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|alterou}} as definições do bloqueio de {{GENDER:$4|$3}} para impedir as operações especificadas que não são edições, com um prazo de expiração de $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|bloqueou}} {{GENDER:$4|$3}} com expiração a $5 $6",
index 0c49e19..ac018b6 100644 (file)
@@ -37,7 +37,8 @@
                        "Andreyyshore",
                        "Andrei Stroe",
                        "WebSourceContentRO",
-                       "MSClaudiu"
+                       "MSClaudiu",
+                       "Lucdrei"
                ]
        },
        "tog-underline": "Sublinierea legăturilor:",
        "blocklist-nousertalk": "fără drept de modificare a propriei pagini de discuții",
        "blocklist-editing": "modificare",
        "blocklist-editing-sitewide": "modificare (tot site-ul)",
+       "blocklist-editing-page": "pagini",
+       "blocklist-editing-ns": "spații de nume",
        "ipblocklist-empty": "Lista blocărilor este goală.",
        "ipblocklist-no-results": "Nu există blocare pentru adresa IP sau numele de utilizator.",
        "blocklink": "blochează",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|octet|octeți|de octeți}}",
        "limitreport-expansiondepth": "Cea mai mare profunzime a expansiunii",
        "limitreport-expensivefunctioncount": "Număr de funcții de analiză costisitoare",
-       "limitreport-unstrip-depth": "$1 {{GENDER:$2|schimbat}} blochează setările pentru {{...",
+       "limitreport-unstrip-depth": "Scoate adâcimea de recursivitate",
        "limitreport-unstrip-size": "Deblocați mărimea de extindere",
        "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|octet|octeți|de octeți}}",
        "expandtemplates": "Expandare formate",
        "log-action-filter-suppress-reblock": "Supresiunea utilizatorului după blocare",
        "log-action-filter-upload-upload": "Încărcare nouă",
        "log-action-filter-upload-overwrite": "Reîncărcare",
+       "authmanager-authn-not-in-progress": "Autentificarea nu este în progres sau sesiune așa că au fost pierdute date. Vă rugăm să începeți din nou de la început.",
+       "authmanager-authn-no-primary": "Credențialele furnizate nu au putut fi autentificate.",
+       "authmanager-authn-no-local-user": "Credențialele trimise nu sunt asociate cu orice utilizator de pe acest wiki.",
+       "authmanager-authn-no-local-user-link": "Credențialele furnizate sunt valide dar nu sunt asociate cu nici un utilizator de pe acest wiki. Intră în cont într-un mod diferit sau creează un utilizator nou și vei avea opțiunea să asociezi fostul tău link cu credențialele de la contul ală.",
+       "authmanager-authn-autocreate-failed": "Autocrearea de conturi locale a eșuat: $1",
+       "authmanager-change-not-supported": "Credențialele trimise nu pot fi schimbate deoarece nimic nu le va folosi.",
        "authmanager-create-disabled": "Crearea de conturi este dezactivată.",
        "authmanager-create-from-login": "Pentru a crea contul, vă rugăm să completați câmpurile.",
+       "authmanager-create-not-in-progress": "Crearea de conturi nu este în progres sau sesiune deoarece au fost pierdute date. Vă rugăm să începeți din nou de la început.",
+       "authmanager-create-no-primary": "Credețialele folosite nu au putut fi folosite pentru crearea de conturi.",
+       "authmanager-link-no-primary": "Credențialele folosite nu au putut fi folosite pentru conectarea conturilor.",
+       "authmanager-link-not-in-progress": "Conectarea conturilor nu este în progres sau datele sesiunii au fost pierdute. Vă rugăm să începeți de la început.",
        "authmanager-authplugin-setpass-failed-title": "Schimbarea parolei a eșuat",
+       "authmanager-authplugin-setpass-failed-message": "Pluginul de autentificare a respins modificarea parolei.",
+       "authmanager-authplugin-create-fail": "Pluginul de autentificare a respins crearea contului.",
+       "authmanager-authplugin-setpass-denied": "Pluginul de autentificare nu permite schimbarea parolei.",
        "authmanager-authplugin-setpass-bad-domain": "Domeniu invalid.",
+       "authmanager-autocreate-noperm": "Crearea automată de conturi nu este permisă.",
+       "authmanager-autocreate-exception": "Crearea automată de conturi este temporar oprită din cauza erorilor anterioare.",
        "authmanager-userdoesnotexist": "Contul de utilizator „$1” nu este înregistrat.",
        "authmanager-userlogin-remembermypassword-help": "Dacă parola ar trebui reținută mai mult decât durata sesiunii.",
        "authmanager-username-help": "Nume de utilizator pentru autentificare.",
index 9e8e06f..2567eb8 100644 (file)
        "blocklist-nousertalk": "Non ge puè cangià 'a pàgene de le 'ngazzaminde toje",
        "blocklist-editing": "stoche a cange",
        "blocklist-editing-sitewide": "stoche a cange (tutte 'u site)",
+       "blocklist-editing-page": "pàggene",
+       "blocklist-editing-ns": "namespace",
        "ipblocklist-empty": "'A liste de le blocche jè vacande.",
        "ipblocklist-no-results": "L'indirizze IP ca è cerchete o 'u nome utende non ge sonde blocchete.",
        "blocklink": "blocche",
index 13333f0..c2d7736 100644 (file)
        "previewerrortext": "При попытке отобразить предварительный просмотр ваших изменений произошла ошибка.",
        "blockedtitle": "Участник заблокирован",
        "blocked-email-user": "<strong>Для вашей учётной записи заблокирована отправка электронной почты. Но вы по-прежнему можете редактировать страницы в этом вики-проекте.</strong> Вы можете увидеть все подробности блокировки на странице [[Special:MyContributions|вклада учётной записи]].\n\nБлокировка произведена администратором $1.\n\nУказана следующая причина: <em>$2</em>.\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n* Цель блокировки: $7\n* Идентификатор блокировки: #$5",
-       "blockedtext-partial": "<strong>Для вашей учётной записи заблокирована возможность изменения этой страницы. Но вы по-прежнему можете редактировать другие страницы в этом вики-проекте.</strong> Вы можете увидеть все подробности блокировки на странице [[Special:MyContributions|вклада учётной записи]].\n\nБлокировка произведена администратором $1.\n\nУказана следующая причина: <em>$2</em>.\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n* Цель блокировки: $7\n* Идентификатор блокировки: #$5",
+       "blockedtext-partial": "<strong>Ð\94лÑ\8f Ð²Ð°Ñ\88ей Ñ\83Ñ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81и Ð¸Ð»Ð¸ IP-адÑ\80еÑ\81а Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80ована Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñ\81Ñ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ñ\8dÑ\82ой Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b. Ð\9dо Ð²Ñ\8b Ð¿Ð¾-пÑ\80ежнемÑ\83 Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c Ð´Ñ\80Ñ\83гие Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð² Ñ\8dÑ\82ом Ð²Ð¸ÐºÐ¸-пÑ\80оекÑ\82е.</strong> Ð\92Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\83видеÑ\82Ñ\8c Ð²Ñ\81е Ð¿Ð¾Ð´Ñ\80обноÑ\81Ñ\82и Ð±Ð»Ð¾ÐºÐ¸Ñ\80овки Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86е [[Special:MyContributions|вклада Ñ\83Ñ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81и]].\n\nÐ\91локиÑ\80овка Ð¿Ñ\80оизведена Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80ом $1.\n\nУказана Ñ\81ледÑ\83Ñ\8eÑ\89аÑ\8f Ð¿Ñ\80иÑ\87ина: <em>$2</em>.\n\n* Ð\9dаÑ\87ало Ð±Ð»Ð¾ÐºÐ¸Ñ\80овки: $8\n* Ð\9eконÑ\87ание Ð±Ð»Ð¾ÐºÐ¸Ñ\80овки: $6\n* Ð¦ÐµÐ»Ñ\8c Ð±Ð»Ð¾ÐºÐ¸Ñ\80овки: $7\n* Ð\98денÑ\82иÑ\84икаÑ\82оÑ\80 Ð±Ð»Ð¾ÐºÐ¸Ñ\80овки: #$5",
        "blockedtext": "<strong>Ваша учётная запись или IP-адрес заблокированы.</strong>\n\nБлокировка произведена администратором $1.\nУказана следующая причина: <em>$2</em>.\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n* Цель блокировки: $7\n\nВы можете связаться с $1 или любым другим [[{{MediaWiki:Grouppage-sysop}}|администратором]], чтобы обсудить блокировку.\nОбратите внимание, что вы не сможете использовать функцию «{{int:emailuser}}», если в своих [[Special:Preferences|персональных настройках]] не задали или не подтвердили корректный адрес электронной почты, или если ваша блокировка включает запрет отправки писем подобным образом.\nВаш IP-адрес — $3, идентификатор блокировки — $5.\nПожалуйста, указывайте эти сведения в любых своих обращениях.",
        "autoblockedtext": "Ваш IP-адрес автоматически заблокирован в связи с тем, что он ранее использовался кем-то из участников, заблокированных администратором $1. \nБыла указана следующая причина блокировки:\n\n: «$2».\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n* Цель блокировки: $7\n\nВы можете связаться с $1 или любым другим [[{{MediaWiki:Grouppage-sysop}}|администратором]], чтобы обсудить блокировку.\n\nОбратите внимание, что вы не сможете использовать функцию «{{int:emailuser}}», если в своих [[Special:Preferences|персональных настройках]] не задали или не подтвердили корректный адрес электронной почты, или если ваша блокировка включает запрет отправки писем подобным образом.\n\nВаш IP-адрес — $3, идентификатор блокировки — #$5.\nПожалуйста, указывайте эти сведения в любых своих обращениях.",
        "systemblockedtext": "Ваше имя участника или IP-адрес были автоматически заблокированы MediaWiki.\nУказана следующая причина:\n\n:<em>$2</em>\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n* Цель блокировки: $7\n\nВаш текущий IP-адрес $3.\nПожалуйста, указывайте все эти сведения в любых своих обращениях.",
        "blocklist-nousertalk": "не может править свою страницу обсуждения",
        "blocklist-editing": "редактирование",
        "blocklist-editing-sitewide": "редактирование (во всём проекте)",
+       "blocklist-editing-page": "страницы",
+       "blocklist-editing-ns": "пространства имён",
        "ipblocklist-empty": "Список блокировок пуст.",
        "ipblocklist-no-results": "Заданный IP-адрес или имя участника не заблокированы.",
        "blocklink": "заблокировать",
index 2d6c483..3f598fb 100644 (file)
@@ -28,7 +28,8 @@
                        "Pierpao",
                        "Fitoschido",
                        "Vlad5250",
-                       "Foxj"
+                       "Foxj",
+                       "MarcoAurelio"
                ]
        },
        "tog-underline": "Unnerline airtins:",
        "search-external": "Eixternal rake",
        "searchdisabled": "Rakin throu {{SITENAME}} is disabled fer performance raisons. Ye can rake bi wa o Google juist nou. Mynd that thair indexes o {{SITENAME}} content micht be oot o date.",
        "search-error": "Ae mistak haes occurred while rakin: $1",
-       "search-warning": "A wairnin has occured while sairchin: $1",
+       "search-warning": "A wairnin has occurred while sairchin: $1",
        "preferences": "Ma preferences",
        "mypreferences": "Ma preferences",
        "prefs-edits": "Nummer o eidits:",
index 680862b..339cfd6 100644 (file)
        "blocklist-reason": "سبب:",
        "infiniteblock": "بے انت",
        "blocklist-editing": "زیر ترمیم",
+       "blocklist-editing-page": "ورقے",
        "blocklink": "پابندی لاؤ",
        "contribslink": "حصے داری",
        "blocklogpage": "پابندی دی لاگ",
index 9b797eb..27c6d5c 100644 (file)
        "blocklist-nousertalk": "preprečeno urejanje lastne pogovorne strani",
        "blocklist-editing": "urejanje",
        "blocklist-editing-sitewide": "urejanje (po celotni strani)",
+       "blocklist-editing-page": "strani",
+       "blocklist-editing-ns": "imenski prostori",
        "ipblocklist-empty": "Seznam blokad je prazen.",
        "ipblocklist-no-results": "Zahtevan IP-naslov ali uporabniško ime ni blokirano.",
        "blocklink": "blokiraj",
index 693b350..83851c8 100644 (file)
        "blocklist-nousertalk": "забрањено уређивање сопствене странице за разговор",
        "blocklist-editing": "уређивање",
        "blocklist-editing-sitewide": "уређивање (на целом сајту)",
+       "blocklist-editing-ns": "именски простори",
        "ipblocklist-empty": "Списак блокирања је празан.",
        "ipblocklist-no-results": "Тражена IP адреса или корисничко име није блокирано.",
        "blocklink": "блокирај",
index 53bc31b..4e94946 100644 (file)
        "ipb-sitewide": "Hela webbplatsen",
        "ipb-partial": "Partiell",
        "ipb-pages-label": "Sidor",
+       "ipb-namespaces-label": "Namnrymder",
        "badipaddress": "Du har inte skrivit IP-adressen korrekt.",
        "blockipsuccesssub": "Blockeringen är utförd",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] har blockerats.<br />\nFör att se alla aktuella blockeringar, gå till [[Special:BlockList|listan över blockeringar]].",
        "blocklist-nousertalk": "kan inte redigera sin egen diskussionssida",
        "blocklist-editing": "redigerar",
        "blocklist-editing-sitewide": "redigerar (hela webbplatsen)",
+       "blocklist-editing-page": "sidor",
+       "blocklist-editing-ns": "namnrymder",
        "ipblocklist-empty": "Listan över blockeringar är tom.",
        "ipblocklist-no-results": "Den angivna IP-adressen eller användaren är inte blockerad.",
        "blocklink": "blockera",
        "table_pager_limit_submit": "Utför",
        "table_pager_empty": "Inga resultat",
        "autosumm-blank": "Tömde sidan",
-       "autosumm-replace": "Ersätter sidans innehåll med '$1'",
+       "autosumm-replace": "Ersatte sidans innehåll med \"$1\"",
        "autoredircomment": "Omdirigerar till [[$1]]",
-       "autosumm-removed-redirect": "Ta bort omdirigering till [[$1]]",
+       "autosumm-removed-redirect": "Tog bort omdirigering till [[$1]]",
        "autosumm-changed-redirect-target": "Ändrade omdirigeringsmålet från [[$1]] till [[$2]]",
        "autosumm-new": "Skapade sidan med '$1'",
        "autosumm-newblank": "Skapade tom sida",
        "logentry-block-block": "$1 {{GENDER:$2|blockerade}} {{GENDER:$4|$3}} med en varaktighet på $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|avblockerade}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|ändrade}} blockeringsinställningar för {{GENDER:$4|$3}} med en varaktighet på $5 $6",
-       "logentry-partialblock-block": "$1 {{GENDER:$2|blockerade}} {{GENDER:$4|$3}} från att redigera {{PLURAL:$8||sidorna}} $7 med en varaktighet på $5 $6",
-       "logentry-partialblock-reblock": "$1 {{GENDER:$2|ändrade}} blockeringsinställningarna för {{GENDER:$4|$3}} som förhindrar redigeringar på {{PLURAL:$8||sidorna}} $7 med en varaktighet på $5 $6",
+       "logentry-partialblock-block-page": "{{PLURAL:$1|sidan|sidorna}} $2",
+       "logentry-partialblock-block-ns": "{{PLURAL:$1|namnrymden|namnrymderna}} $2",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|blockerade}} {{GENDER:$4|$3}} från att redigera $7 med en varaktighet på $5 $6",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|ändrade}} blockeringsinställningarna för {{GENDER:$4|$3}} som förhindrar redigeringar på $7 med en varaktighet på $5 $6",
        "logentry-non-editing-block-block": "$1 {{GENDER:$2|blockerade}} {{GENDER:$4|$3}} från specificerade icke-redigerande handlingar med en varaktighet på $5 $6",
        "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|ändrade}} blockeringsinställningarna för {{GENDER:$4|$3}} för specificerade icke-redigerande handlingar med en varaktighet på $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|blockerade}} {{GENDER:$4|$3}} med en varaktighet på $5 $6",
index 2aeaf3f..4c8b660 100644 (file)
        "blocklist-nousertalk": "ไม่สามารถแก้ไขหน้าคุยกับผู้ใช้ของตนเอง",
        "blocklist-editing": "การแก้ไข",
        "blocklist-editing-sitewide": "การแก้ไข (ทั้งเว็บไซต์)",
+       "blocklist-editing-page": "หน้า",
+       "blocklist-editing-ns": "เนมสเปซ",
        "ipblocklist-empty": "รายการบล็อกว่าง",
        "ipblocklist-no-results": "เลขที่อยู่ไอพีหรือชื่อผู้ใช้ที่ขอไม่ถูกบล็อก",
        "blocklink": "บล็อก",
diff --git a/languages/i18n/trv.json b/languages/i18n/trv.json
new file mode 100644 (file)
index 0000000..cf123d4
--- /dev/null
@@ -0,0 +1,639 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Iyuqciyang"
+               ]
+       },
+       "sunday": "jiyax sngayan",
+       "monday": "Tg1 jiyax iyax sngayan",
+       "tuesday": "Tg2 jiyax iyax sngayan",
+       "wednesday": "Tg3 jiyax iyax sngayan",
+       "thursday": "Tg4 jiyax iyax sngayan",
+       "friday": "Tg5 jiyax iyax sngayan",
+       "saturday": "tg6 jiyax iyax sngayan",
+       "mon": "Tg1jiyax iyax sngayan",
+       "january": "tg1 idas",
+       "february": "tg2 idas",
+       "march": "Tg3 idas",
+       "april": "Tg4 idas",
+       "may_long": "Tg5 idas",
+       "june": "Tg6 idas",
+       "july": "empitu idas",
+       "august": "Tg8 idas",
+       "september": "Tg9 idas",
+       "october": "Tg10 idas",
+       "november": "Tg11 idas",
+       "december": "Tg12 idas",
+       "january-gen": "tg1 idas",
+       "february-gen": "tg2 idas",
+       "march-gen": "Tg3 idas",
+       "april-gen": "Tg4 idas",
+       "may-gen": "Tg5 idas",
+       "june-gen": "Tg6 idas",
+       "july-gen": "empitu idas",
+       "august-gen": "Tg8 idas",
+       "september-gen": "Tg9 idas",
+       "october-gen": "Tg10 idas",
+       "november-gen": "Tg11 idas",
+       "december-gen": "Tg12 idas",
+       "feb": "tg2 idas",
+       "may": "Tg5 idas",
+       "january-date": "tg1 idas $1",
+       "february-date": "tg2 idas $1",
+       "march-date": "Tg3 idas $1",
+       "april-date": "Tg4 idas $1",
+       "may-date": "Tg5 idas $1",
+       "june-date": "Tg6 idas $1",
+       "july-date": "empitu idas $1",
+       "august-date": "Tg8 idas $1",
+       "september-date": "Tg9 idas $1",
+       "october-date": "Tg10 idas $1",
+       "november-date": "Tg11 idas $1",
+       "december-date": "Tg12 idas $1",
+       "pagecategories": "{{PLURAL:$1| keelgan |$1 sspug kingal keelgan }}",
+       "category_header": "keelgan \"$1\" kska ruwahan patas",
+       "subcategories": "spiq keelgan",
+       "category-media-header": "keelgan \"$1\" kaka psaput kari",
+       "category-empty": "<em>keelgan nii bitaq saying ini supu kana ruwahan patas aji uri o psaput kari.</em>",
+       "hidden-categories": "{{PLURAL:$1|keelgan lniing }}",
+       "category-subcat-count": "{PLURAL:$2| keelgan nii wana supu kana truma nii 1 kngkingal spiqkeelgan. | keelgan mseupu kana truma nii $1 keelgan kngkingal, mseupu $2 sspug kingal. }}. }}",
+       "category-article-count": "{PLURAL:$2| keelgan o supu kana truma ruwahan patas nii. | keelgan supu kana truma nii $1 kngkingal ruwahan patas, suupu $2 sspugkingal }}",
+       "category-file-count": "{{PLURAL:$2| keelgan nii wana supu kana truma kingal pusu patas. | keelgan supu kana truma patas nii, seupu $2 sspug kingal. }}",
+       "listingcontinuesabbrev": "lmutut",
+       "noindex-category": "Ini bkgi patas pnslbu na ka ruwahan patas",
+       "broken-file-category": "pusu patas mggaluk  wada naqih ka ruwahan patas",
+       "newwindow": "(saw ruwahan bgurah lihaw qtaan )",
+       "cancel": "pkungat",
+       "moredotdotdot": "knlala...",
+       "mypage": "ruwahan patas",
+       "mytalk": "empprngaw",
+       "anontalk": "empprngaw",
+       "navigation": "powda qmita",
+       "and": "&#32;ni &#32;",
+       "namespaces": "iyax ptngahan",
+       "variants": "kmpriyux hiyi",
+       "navigation-heading": "powda qmita patas gneegan",
+       "returnto": "embrinah miyah bitaq $1.",
+       "tagline": "pnyahan {{SITENAME}}",
+       "help": "pgkla",
+       "go": "muda",
+       "searcharticle": "muda",
+       "history": "endaan ruwahan patas",
+       "printableversion": "mtduwa psreeru patas pusu",
+       "permalink": "mggaluk ini kglglug\n(mggaluk mgdhug,mggaluk ana bitaq knuwan)",
+       "view-foreign": "ga $1 qmita",
+       "edit": "smmalu patas",
+       "create": "phiyug",
+       "create-local": "Pgkla tnpusu mnrana",
+       "newpage": "bgurah ruwahan patas",
+       "talkpagelinktext": "empprngaw",
+       "specialpage": "ruwahan patas knmalu",
+       "personaltools": "qnqaya taxa",
+       "talk": "empprngaw",
+       "views": "qmita",
+       "toolbox": "qngqaya",
+       "otherlanguages": "kari duma",
+       "redirectedfrom": "(wada brahan dmudul paah $1)",
+       "redirectpagesub": "psbgurah muda ruwahan patas",
+       "redirectto": "psbgurah muda quri bitaq:",
+       "lastmodifiedat": "ruwahan patas nii ka nhdaan smmalu patas o ga $1 $2.",
+       "jumpto": "pquri brah",
+       "jumptonavigation": "powda qmita",
+       "aboutsite": "quri  {{SITENAME}}",
+       "aboutpage": "quri",
+       "copyrightpage": "{{ns:project}}: biyax kklawa pnatas",
+       "currentevents": "mlglug ka psaput",
+       "currentevents-url": "Project: euda kari psaput",
+       "disclaimers": "pgkla pnspadaw",
+       "disclaimerpage": "Pnegkla ungat hmutan smriq",
+       "edithelp": "pgkla smmalu patas",
+       "mainpage": "ruwahan patas",
+       "mainpage-description": "ruwahan patas",
+       "portal": "tmayan qmpringan seejiq",
+       "portal-url": "tmayan qmpringan seejiq",
+       "privacy": "euda qmpah lniing",
+       "privacypage": "Euda qmpah lning",
+       "retrievedfrom": "Nangal paah \"$1\"",
+       "youhavenewmessages": "Niqan nnisu$1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|su}}niqan pnaah {{PLURAL:$3|taxa duri empduuy\n|$3 hnigan empduuy }}ka $1 ($2).",
+       "newmessagesdifflinkplural": "{{PLURAL:$1| kmpriyux}} snii",
+       "editsection": "smmalu patas",
+       "editold": "smmalu patas",
+       "viewsourceold": "ida nkiya patas sspgan ka qtai",
+       "editlink": "smmalu patas",
+       "viewsourcelink": "ida nkiya patas sspgan ka qtai",
+       "editsectionhint": "smmalu patas spgan",
+       "toc": "patas bngkgan",
+       "showtoc": "pqita",
+       "hidetoc": "lmiying",
+       "collapsible-expand": "muda",
+       "site-atom-feed": "$1ka Atom pnyahan",
+       "red-link-title": "$1(ungat ruwahan patas)",
+       "nstab-main": "ruwahan patas",
+       "nstab-user": "empduuy ruwahan patas",
+       "nstab-special": "ruwahan patas knmalu",
+       "nstab-project": "pusu qpahun ruwahan patas",
+       "nstab-image": "pusu patas",
+       "nstab-template": "ptasan",
+       "nstab-category": "keelgan",
+       "mainpage-nstab": "ruwahan patas",
+       "nospecialpagetext": "<strong>brahaw misuu ruwahan patas knmalu ungat brihan. </strong> nasi mkmangal mangal brihan ka knmalu ruwahan patas leexan usa bitaq [[Special:SpecialPages|{{int:specialpages}}]].",
+       "badtitle": "ungat brih ka pusu kari",
+       "badtitletext": "tmiyu ka pusu kari ruwahan patas o ungat brih, kbrhuanl, aji uri o ini muda qmangaw kari aji uri o qmangaw Wiki ka pusu kari.\nkska pusu kari o yaa bi mseupu kana ungat klaan dmuuy mniq pusu kari ka cuyen.",
+       "viewsource": "ida nkiya patas sspgan ka qtai",
+       "viewsource-title": "pqita $1 ka ida nkiya sspgan patas",
+       "viewsourcetext": "Mtduwa su  pqita kiya o pnsreeru ruwahan patas nii ka sspgan patas",
+       "yourname": "seejiq mduuy hangan:",
+       "userlogin-yourname-ph": "pstmay matas su mduuy hangan",
+       "yourpassword": "sspgan lniing:",
+       "userlogin-yourpassword": "sspgan lniing",
+       "userlogin-yourpassword-ph": "pstmay su sspgan lniing",
+       "createacct-yourpassword-ph": "Pstymay matas sspgan lniing",
+       "createacct-yourpasswordagain": "pgkla sspgan lniing",
+       "createacct-yourpasswordagain-ph": "Pxal duri pstmay matas sspgan lniing",
+       "userlogin-remembermypassword": "\" iya shngii \" saw nii pstmay ku",
+       "login": "pstmay patas.",
+       "nav-login-createaccount": "pstmay patas. /phiyug patas sspgan",
+       "logout": "latat",
+       "userlogin-noaccount": "ungat patas sspgan hug?",
+       "userlogin-joinproject": "teumal {{SITENAME}}",
+       "createaccount": "phiyug patas sspgan",
+       "userlogin-resetpassword-link": "smhungi sspgan lniing?",
+       "userlogin-helplink2": "dmayaw pstmay",
+       "createacct-emailoptional": "nniqan guban patas samaw ( geegun )",
+       "createacct-email-ph": "pstmay su nniqan gluban patas samaw",
+       "createacct-submit": "phiyug su sspgan patas",
+       "createacct-another-submit": "phiyug patas sspgan",
+       "createacct-benefit-heading": "{{SITENAME}} paah saw isumdka seejiq suyang qnpahan saw phiyug da.",
+       "createacct-benefit-body1": "{{PLURAL:$1|smsul smmalu patas }}",
+       "createacct-benefit-body2": "$1 ruwahan",
+       "createacct-benefit-body3": "Hnigan snii {{PLURAL:$1| seejiq suyang qnpahan }}",
+       "mailmypassword": "psbgurah powsa sspgan lniing",
+       "loginlanguagelabel": "kari:$1",
+       "pt-login": "pstmay patas.",
+       "pt-login-button": "pstmay patas.",
+       "pt-createaccount": "phiyug patas sspgan",
+       "pt-userlogout": "latat",
+       "botpasswords-label-cancel": "pkungat",
+       "resetpass-submit-cancel": "pkungat",
+       "passwordreset": "psbgurah powsa sspgan lniing",
+       "passwordreset-username": "seejiq mduuy hangan:",
+       "bold_sample": "patas qthur",
+       "bold_tip": "patas qthur",
+       "italic_sample": "atas gmisil",
+       "italic_tip": "atas gmisil",
+       "link_sample": "mggaluk pusu kari",
+       "link_tip": "mggaluk ruwan",
+       "extlink_sample": "http://www.example.com mggaluk pusu kari",
+       "extlink_tip": "lipax mggaluk ( saw peeniq qsahur http:// pnrjingan)",
+       "headline_sample": "Tg1 tntunan patas pusu kari",
+       "headline_tip": "Tg2 tntunan patas pusu kari",
+       "nowiki_sample": "maat kska aji smmalu iyax ptasan patas",
+       "nowiki_tip": "brkagan Wiki smmalu iyax ptasan elug kari",
+       "image_tip": "numal pusu patas",
+       "media_tip": "mggaluk pusu patas",
+       "sig_tip": "patas hangan su ni jiyax",
+       "hr_tip": "qtaan ayus msbalay (bilaq bi dmuuy)",
+       "summary": "ramas kari:",
+       "minoredit": "Asaw nii snsul smmalu patas",
+       "watchthis": "Gmraka qmita ruwahan patas nii",
+       "savearticle": "skuun ruwahan patas",
+       "savearticle-start": "skuun ruwahan patas...",
+       "showpreview": "pqita daan qmita",
+       "showdiff": "kmpriyux pqita",
+       "anoneditwarning": "<strong> ptqlahang :</strong> Ini su pstmay matas na. nasi su muda ana manu smmalu patas su ga niqan IP mha wada traun. nasi su <strong>[$1 pstmay matas ]</strong> aji uri o <strong>[$2 phiyug patas sspgan </strong>, smmalu patas su o saw nnisu mha seejiq mduuy hangan pnskraya, niqan duma ka tgmalu.",
+       "blockedtext": "<strong> empduuy hangansu\n Aji uri o nniqan IP wada tna shmuk. </strong> wada su powda $1 hmuk, pusu asaw <em>$2</em>. * jiyax prajing hmuk:$8 * jiyaxqmhdu hmuk :$6 * quri hmuk seejiq:$7 mtduwa su mggaluk $1 aji uri o duma ka [[{{MediaWiki:Grouppage-sysop}}| seejiq kmlawa ]] pprngaw hmuk ka quri msriquu. Nasi tna su ga mniq [[Special:Preferences|smkuxul powsa ]] kska pha kingal brihan ka gluban patas samaw patas nniqan, aji o ini powda hmuk nabrihan bluban patas samaw, kiya do mtduwa su powda \" mggaluk samaw nii empduuy \" ka brihan nii mggaluk quri seejiq kmlawa. bitaq saying ka isu ga niqan IP o $3, saw nii hmuk ka ID asaw #$5. Eniq jiyax sslingan umal patas plxani bi pngkla kari.",
+       "loginreqlink": "pstmay patas.",
+       "newarticletext": "Nii su mggaluk bitaq kingal ruwahan patas aji mha ungat ruwahan patas.\nDai phiyug ruwahan patas nii,ga su mniq truma ka smmalu patas qpuruh mangal  kska kari ruwan ( leexan balay powda qtaan patas [$1 dmuuy pgkla ruwahan patas ]) .\nNasi su ini qlahang iyah hini ruwahan patas, powda gmaaw daan qmita ka <strong> embrinah miyah </strong> gluban.",
+       "anontalkpagetext": "---- <em> empprngaw ruwahan pusu nii ka ini bqani na phiyug sspgan patas pnskuan pila ka hangan lniing empduuy dmuuy </em> kiya do asi su ka dmuuy ga niqan IP miyah psenak hnigan, kiya kaq kiyta ni snruwayan ga niqan IPyaa bipaah lala bi ini pndkaempduuy saw pnspuan dmuuy. Nasi isu ka hangan lniing empduuy saw lnglungan suu rmngaw qntaan ka kari ruwan ungat pngluban, powda [[Special:CreateAccount| phiyug bgurah Sspgan patas ]]aji uri o[[Special:UserLogin|pstmay]] saw aji mha mdka duma mduuy hangan lniing mgamax.",
+       "noarticletext": "ruwahan patas nii bitaq sayang ungat kari ruwan, mtduwa su mniq kska duma ruwahan patas [[Special:Search/{{PAGENAME}}| miying pnskraya ruwahan patas nii ]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} miying quri jiyax rnisuh patas ]aji uri o [{{fullurl:{{FULLPAGENAME}}|action=edit}} phiyug ruwahan patas nii]</span>.",
+       "noarticletext-nopermission": "ruwahan patas nii bitaq sayang ungat kari ruwan,\nmtduwa su mniq kska duma ruwahan patas [[Special:Search/{{PAGENAME}}| miying pnskraya ruwahan patas nii ], aji uri o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} miying quri saw jiyax rnisuh patas ]</span>, kiya ka kiya ni ungat su dduy biyax phiyug ruwahan patas nii.",
+       "userpage-userdoesnotexist-view": "seejiq mduuy patas sspgan \"$1\" ini ppatas na.",
+       "clearyourcache": "<strong> qlahang:</strong> ga mnmiq skuun su babaw na do asi su ka srsan daan qmita qngqaya rait bi mangal kika mtduwa qtaan kmpriyux. * <strong>Firefox / Safari:</strong>prci ni <em>Shift</em> 時 gmaaw <em> psbgurah smmalu </em>,aji uri o <em>Ctrl-F5</em> aji uri o <em>Ctrl-R</em> (Mac saw kiya do <em>⌘-R</em>) * <strong>Google Chrome:</strong>prci <em>Ctrl-Shift-R</em> (Mac saw kiya do <em>⌘-Shift-R</em>) * <strong>Internet Explorer:</strong>prci <em>Ctrl</em> 時 gmaaw <em> psbgurah smmalu </em>, aji uri o prci <em>Ctrl-F5</em> * <strong>Opera:</strong> pquri brah <em> gmaaw → pha </em> (mniq Mac asaw <em>Opera → smkuxul powsa </em>) babaw na duri o<em> lniing & aji hhuya → srsi qmita patas → wada rait mangal ka patas ni pusu patas </em>.",
+       "previewnote": "<strong>bitaq saying ni su qtaan, kmpriyux su ini skui na!</strong>",
+       "editing": "pida smmalu patas $1",
+       "creating": "nii muda phiyug $1",
+       "editingsection": "nii muda smmalu patas $1 ( spugan )",
+       "templatesused": "dmuuy ruwahan patas nii ka truma {{PLURAL:$1| qtaan }}:",
+       "templatesusedpreview": "plealay qmita nii o dmuuy truuma nii{{PLURAL:$1| qtaan pprgun }}:",
+       "template-protected": "(ga klwaun)",
+       "template-semiprotected": "(Smka bi knlwaan )",
+       "hiddencategories": "nruwahan patas nii {{PLURAL:$1|1 sspug kingal lmiing keelgan |$1 sspug kingal lmiing keelgan}} seejiq :",
+       "permissionserrorstext-withaction": "Saw nii truma {{PLURAL:$1| pusu }}, ungat biyax dduuy su muda $2 ka muda :",
+       "recreate-moveddeleted-warn": "<strong> ptqlahang :nii su psbgurah phiyug brah han o wada srsan ka ruwahan patas. </strong> naa su lmnglungyayaa aji mlutut smmalu patas ruwahan patas nii。 Ga hini mgay snrus ni hdlun jiyax rnisuh patas tai saw msleexan qtaan patas:",
+       "moveddeleted-notice": "ruwahan patas nii wada srsan.\ntruma mgay ruwahan patas nii ka wada srsan ni hdlun jiyax rnisuh patas tai saw qtaan patas.",
+       "undo-failure": "Paah nii smmalu patas ka muda smalu iyax o niqan mkeekan, smalu patas nii ini tduwa psnbrih.",
+       "viewpagelogs": "pqita ruwahan patas nii ka jiyax rnisuh patas",
+       "currentrev": "Bgurah bi muda smalu",
+       "currentrev-asof": "mniq $1 ka Bgurah bi muda smmalu",
+       "revisionasof": "nii $1 ka muda smalu",
+       "revision-info": "mniq $1 paah {{GENDER:$6|$2}} saw muda qmpah smalu $7",
+       "previousrevision": "←muda smmalu brah nii",
+       "nextrevision": "muda smmalu truma nii→",
+       "currentrevisionlink": "Bgurah bi muda smalu",
+       "cur": "bitaq sayang",
+       "last": "brah gntuan",
+       "histlegend": "pdkaun gmaaw ka ini pndka patas pusu : asi ka gmaaw pdkaun muda smmalu patas pusu gmaaw kinga qaya duri o gmaaw sulay gluban muda psdka. <br /> pgkla patas pnskraya :<strong>({{int:cur}})</strong> = ni bi pdkaun bgurah muda smmalu patas pusu, <strong>({{int:last}})</strong> = mseupu gntuan brah pdkaun muda smalu patas pusu, <strong>{{int:minoreditletter}}</strong> = smsul na muda smalu",
+       "history-feed-description": "patas Wiki powsa ruwahan patas nii ka endaan muda smmalu",
+       "history-feed-item-nocomment": "$1 ga $2",
+       "rev-delundel": "kmpriyux mtduwa qtaan",
+       "rev-showdeleted": "pqita",
+       "revdel-restore": "kmpriyux mtduwa qtaan",
+       "pagehist": "endaan ruwahan patas",
+       "history-title": "\"$1\" ka endaan muda smalu",
+       "difference-title": "\"$1\" muda smmalu siida ka ini kndka",
+       "lineno": "qnay patas $1:",
+       "compareselectedversions": "psdka wada gmaaw ka muda smalu",
+       "editundo": "pkbrih",
+       "diff-multi-sameuser": "(ini pqita mdka kingak seejiq mduuy saw qnpahan kska na $1 smsul muda smalu )",
+       "diff-multi-otherusers": "(ini pqita ni paah $2 hnigan empduuy ka ruwam saw q11npahan $1 snsul muda smmalu )",
+       "searchresults-title": "$1 ka miying endaan qmpah",
+       "prevn": "Brah $1 gntuan",
+       "nextn": "Bukuy {{PLURAL:$1|$1}}gntuan",
+       "prevn-title": "brah $1 gntuan endaan qmpah",
+       "nextn-title": "babaw $1 gntuan endaan qmpah",
+       "shown-title": "qtaan kngkingal uwahan patas $1 gntuan endaan qmpah",
+       "viewprevnext": "pqita ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-exists": "<strong>nii Wiki wada niqan hangan asaw bi \"[[:$1]]\" ka ruwahan patas. </strong> {{PLURAL:$2|0=|aji uri o powda qmita patas duma miying endaan qmpah.}}",
+       "searchmenu-new": "<strong>nii hini Wiki phiyug ruwahan patas \"[[:$1]]\"!</strong>{{PLURAL:$2|0=|powda qtaan patas su pstmay mataska pusu hlayan ka miying endaan qmpah. |aji uri o powda qtaan patas duma miying endaan qmpah. }}",
+       "searchprofile-articles": "kari ruwan ruwahan patas",
+       "searchprofile-images": "knlala samaw psaput",
+       "searchprofile-everything": "kana",
+       "searchprofile-advanced": "Mtmay quri brah",
+       "searchprofile-articles-tooltip": "ga $1 kska miying",
+       "searchprofile-images-tooltip": "miying pusu patas",
+       "searchprofile-everything-tooltip": "miying kana ruwan pntasan ( supu kana pprngagan ruwahan patas )",
+       "searchprofile-advanced-tooltip": "miying iyax ptngahan pnhiyug nanak",
+       "search-result-size": "$1 ({{PLURAL:$2|1 kingal patas |$2 kingal patas }})",
+       "search-result-category-size": "$1 hnigan hiyi ($2 kngkingal spiq keelgan, $3kngkingal pusu patas )",
+       "search-redirect": "(brahan dmudul paah $1)",
+       "search-section": "(spgan $1)",
+       "search-category": "(keelgan $1)",
+       "search-file-match": "( mlngu kari ruwan pusu patas )",
+       "search-suggest": "aji isu ka tmniyu na :$1",
+       "search-interwiki-more": "(knlala)",
+       "searchall": "kana",
+       "search-showingresults": "{{PLURAL:$4|tg <strong>$1</strong> gntuan endaan qmpah, seupu do <strong>$3</strong> gntuan|tg <strong>$1 - $2</strong> gntuan endaan qmpah, mseupu kana <strong>$3</strong> gntuan}}",
+       "search-nonefound": "ungat mlngu smiling pusu ka endaan qmpah.",
+       "powersearch-toggleall": "kana",
+       "preferences": "Smkuxul bi powsa",
+       "mypreferences": "Smkuxul bi powsa",
+       "prefs-user-pages": "empduuy ruwahan patas",
+       "prefs-rc": "Kmpriyux snii",
+       "prefs-watchlist": "Patas leexan gmraka",
+       "prefs-editwatchlist-raw": "leexan patas gmraka ida nkiya smmalu patas",
+       "prefs-namespaces": "iyax ptngahan",
+       "prefs-files": "pusu patas",
+       "group-user": "Seejiq mduuy",
+       "group-all": "(kana)",
+       "right-upload": "wada pdsun brah pusu patas",
+       "right-writeapi": "ptasi dmuuy API",
+       "grant-createaccount": "phiyug patas sspgan",
+       "newuserlogpage": "phiyug jiyax rnisuh patas seejiq mduuy",
+       "rightslog": "seejiq mduuy biyax kklawa jiyax rnisuh patas",
+       "action-edit": "smmalu patas ruwahan patas nii",
+       "action-createaccount": "phiyug seejiq mduuy patas sspgan nii",
+       "action-move": "hdlun ruwahan patas nii",
+       "recentchanges": "Kmpriyux snii",
+       "recentchanges-legend": "kmpriyux snii ka gneegan",
+       "recentchanges-summary": "murug Wiki nii kska ruwahan patas ka kmpriyux snii.",
+       "recentchanges-noresult": "mniq kiya kska jiyax ungat mlngu pusu ka kmpriyux",
+       "recentchanges-feed-description": "muurug kska Wiki nii ramas kari kmpriyux snii balay",
+       "recentchanges-label-newpage": "smmalu patas nii o phiyug bgurah ruwahan patas da",
+       "recentchanges-label-minor": "Asaw nii snsul smmalu patas",
+       "recentchanges-label-bot": "smmalu patas nii o  paah seejiq luqi samaw mowda",
+       "recentchanges-label-unpatrolled": "smmalu patas nii o ini dai qmita na",
+       "recentchanges-label-plusminus": "ruwahan patas kmpriyux nii ka prparu ni blbila ( pnspuan wiyiyeyn)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (powda qita patas [[Special:NewPages| bgurah ruwahan patas ]])",
+       "recentchanges-submit": "pqita",
+       "rcfilters-tag-remove": "hdlun pkungat '$1'",
+       "rcfilters-activefilters-hide": "lmiying",
+       "rcfilters-activefilters-show": "pqita",
+       "rcfilters-days-show-days": "jiyax",
+       "rcfilters-savedqueries-cancel-label": "pkungat",
+       "rcfilters-filtergroup-lastRevision": "Bgurah bi muda smalu",
+       "rcnotefrom": "truma nii {{PLURAL:$5asaw }}hiya nanak <strong>$3 $4</strong> paah na niya kmpriyux (lala bi pqita <strong>$1</strong> gntuan).",
+       "rclistfrom": "pqita paah $3 $2 kmpriyux bgurah siida",
+       "rcshowhideminor": "$1 smsul smmalu patas",
+       "rcshowhideminor-show": "pqita",
+       "rcshowhideminor-hide": "lmiying",
+       "rcshowhidebots": "$1 seejiq luqi samaw",
+       "rcshowhidebots-show": "pqita",
+       "rcshowhidebots-hide": "lmiying",
+       "rcshowhideliu": "$1 wada matas patas ka seejiq mduuy",
+       "rcshowhideliu-show": "pqita",
+       "rcshowhideliu-hide": "lmiying",
+       "rcshowhideanons": "$1 seejiq mduuy lniing hangan",
+       "rcshowhideanons-show": "pqita",
+       "rcshowhideanons-hide": "lmiying",
+       "rcshowhidepatr": "$1 rmigaw qmita wada smmalu patas",
+       "rcshowhidepatr-show": "pqita",
+       "rcshowhidepatr-hide": "lmiying",
+       "rcshowhidemine": "$1 smmalu patas nnaku",
+       "rcshowhidemine-show": "pqita",
+       "rcshowhidemine-hide": "lmiying",
+       "rcshowhidecategorization-show": "pqita",
+       "rcshowhidecategorization-hide": "lmiying",
+       "rclinks": "pqita snii $3 $2 snsul kmpriyux siida",
+       "hist": "endaan",
+       "hide": "lmiying",
+       "show": "pqita",
+       "minoreditletter": "bilaq",
+       "newpageletter": "bgurah",
+       "boteditletter": "qaya",
+       "rc-change-size-new": "babaw kmpriyux $1 pnspuan wiyeyn",
+       "rc-old-title": "Plealay bi  phiyug ka hangan asaw bi \"$1\"",
+       "recentchangeslinked": "kmpriyux quri",
+       "recentchangeslinked-feed": "kmpriyux quri",
+       "recentchangeslinked-toolbox": "kmpriyux quri",
+       "recentchangeslinked-title": "mseupu \"$1\" quri ka kmpriyux",
+       "recentchangeslinked-page": "hangan ruwahan patas:",
+       "recentchangeslinked-to": "kmpriyux pqita mgaluk bitaq tniyu ruwahan patas ka kmpriyux",
+       "upload": "wada pdsun brah pusu patas",
+       "filedesc": "ramas kari",
+       "filesource": "pnyahan:",
+       "upload-dialog-title": "wada pdsun brah pusu patas",
+       "upload-dialog-button-cancel": "pkungat",
+       "upload-form-label-infoform-description": "Pgkla rmngaw",
+       "upload-form-label-infoform-categories": "keelgan",
+       "upload-form-label-infoform-date": "jiyax",
+       "license": "gaya mgay biyax kklawa:",
+       "license-header": "gaya mgay biyax kklawa",
+       "listfiles-userdoesnotexist": "seejiq mduuy patas sspgan \"$1\" ini ppatas na.",
+       "imgfile": "pusu patas",
+       "listfiles_thumb": "patas snblaqan",
+       "listfiles_date": "jiyax",
+       "listfiles_user": "Seejiq mduuy",
+       "listfiles_description": "Pgkla rmngaw",
+       "file-anchor-link": "pusu patas",
+       "filehist": "endaan pusu patas",
+       "filehist-help": "gmaaw jiyax /saw jiyax pqita jiyax siida ka pusu patas.",
+       "filehist-current": "sayang",
+       "filehist-datetime": "jiyax / jiyax",
+       "filehist-thumb": "patas snblaqan",
+       "filehist-thumbtext": "nii $1 patas pusu ka patas snblaqan",
+       "filehist-user": "Seejiq mduuy",
+       "filehist-dimensions": "sspngan knbragan",
+       "filehist-comment": "patas numal pgkla",
+       "imagelinks": "djiyun pusu patas",
+       "linkstoimage-more": "mgkala $1 kngkingal{{PLURAL:$1| mggaluk ruwahan patas | mggaluk ruwahan patas }}bitaq hini pusu patas. leexan bi trumanii o wana pteeura brah {{PLURAL:$1|1 gntuan mggaluk |$1 gntuan mggaluk }}bitaq hin i pusu patas ka ruwahan patas ka pusu patas. mtduwa su uri pqita  [[Special:WhatLinksHere/$2| mttuku  leexan patas ]].",
+       "linkstoimage-redirect": "$1 (brahan muda pusu patas ) $2",
+       "sharedupload-desc-here": "pusu patas nii o pnaah $1 duri ni yaa bi wada jiyun duma saw pusu qpahun.\npnqita truma pusu patasnii ga [$2 pgkla pusu patas saw seerngaw ruwahan patas ] ka ruwan rnngaw kari",
+       "filepage-nofile": "ungat hangan nii ka pusu patas.",
+       "upload-disallowed-here": "ungat klaan su mubung pusu patas nii.",
+       "randompage": "ruwahan patas hmut dsdsun.",
+       "randomincategory": "ruwahan patas hmut dsdsun.",
+       "randomincategory-submit": "muda",
+       "statistics-articles": "kari ruwan ruwahan patas",
+       "pageswithprop-submit": "muda",
+       "double-redirect-fixer": "Psbgurah muda seejiq muda smalu",
+       "brokenredirects-edit": "smmalu patas",
+       "withoutinterwiki-submit": "pqita",
+       "nbytes": "$1 sspug kingal pnspuan wiyeyn",
+       "ncategories": "$1 {{PLURAL:$1| keelgan |$1 sspug kingal keelgan }}",
+       "nmembers": "$1 seejiq sspug hiyi",
+       "prefixindex": "Purug saw plealay kari smiling ruwahan patas",
+       "prefixindex-submit": "pqita",
+       "protectedpages-noredirect": "brahan muuda lniing ruwahan patas",
+       "protectedpages-page": "ruwahan patas",
+       "usereditcount": "$1 {{PLURAL:$1|smsul smmalu patas }}",
+       "newpages": "bgurah ruwahan patas",
+       "newpages-submit": "pqita",
+       "newpages-username": "seejiq mduuy hangan:",
+       "move": "hdlun",
+       "movethispage": "hdlun ruwahan patas nii",
+       "pager-newer-n": "{PLURAL:$1| bgurah hari $1 gntuan}}",
+       "pager-older-n": "smudal hari $1 gntuan",
+       "apisandbox-add-multi": "Mrana bgurah",
+       "booksources": "patas pnyahan",
+       "booksources-search-legend": "miying pnyahan patas",
+       "speciallogtitlelabel": "Saw dngusun( pusu kari aji uri o {{ns:user}}: seejiq mduuy pnqita seejiq mduuy):",
+       "log": "Jiyax rnisuh patas",
+       "logeventslist-submit": "pqita",
+       "alllogstext": "pspuun pqita kana {{SITENAME}} kaka mdka hnigan kana ka jiyax rnisuh patas. mtduwa su gmaaw blbil quri truma patas gnaaw jiyax rnisuh patas ka mdka hnigan, kiya ka hangan mduuy (patas pnsnakan paru ni blbilq) aji uri o dmayak ruwahan patas (patas pnsnakan paru ni blbilq)",
+       "logempty": "ungat mlngu pusu ka jiyax rnisuh patas.",
+       "checkbox-all": "kana",
+       "allpages": "kana ruwahan patas",
+       "allarticles": "kana ruwahan patas",
+       "allpagessubmit": "muda",
+       "allpages-hide-redirects": "brahan muuda lniing ruwahan patas",
+       "categories": "keelgan",
+       "categories-submit": "pqita",
+       "sp-deletedcontributions-contribs": "suyang qnpahan",
+       "linksearch-ns": "iyax ptngahan:",
+       "listusers-submit": "pqita",
+       "emailuser": "Email mggaluk seejiq mduuy nii",
+       "emailusername": "seejiq mduuy hangan:",
+       "watchlist": "Patas leexan gmraka",
+       "mywatchlist": "Patas leexan gmraka",
+       "watchlistfor2": "$1 ka leexan patas gmraka $2",
+       "watchthispage": "Gmraka qmita ruwahan patas nii",
+       "watchlist-details": "leexan patas gmraka su mseupu kana o niqan $1 kngkingal ruwahan patas(supu kana pprngaw ruwahan patas).",
+       "wlheader-showupdated": "Ga su mniq tnhici bi kingal babaw qmita wada kmpriyux smalu ruwahan patas mha saw muda <strong> patas qthur </strong> pqita.",
+       "wlnote": "Truma nii asaw paah $3 $4 brah na <strong>$2</strong> kska iyax tuki snluuan <strong>$1</strong> snsul kmpriyux.",
+       "wlshowlast": "pqita snii $1 iyax tuki $2 jiyax",
+       "watchlist-hide": "lmiying",
+       "watchlist-submit": "pqita",
+       "enotif_reset": "pnskraya kana ruwahan patas asaw wada pqita",
+       "enotif_minoredit": "Asaw nii snsul smmalu patas",
+       "historyaction-submit": "pqita",
+       "dellogpage": "Srsi jiyax rnisuh patas",
+       "deletionlog": "Srsi jiyax rnisuh patas",
+       "rollbacklink": "gbrih duri",
+       "rollbacklinkcount": "psnbrih $1 smsul smmalu patas",
+       "protectlogpage": "kmlawa jiyax rnisuh matas",
+       "protectedarticle": "kmlawa \"[[$1]]\"",
+       "modifiedarticleprotection": "Wada psbgurah smmalu \"[[$1]]\" ka kmlawa knparu hnigan",
+       "protect-default": "mtduwa kana ka nduuy",
+       "restriction-type": "mgay biyax kklawa snruwaan:",
+       "restriction-edit": "smmalu patas",
+       "restriction-move": "hdlun",
+       "undeleteinvert": "mspgriq embrinah gmaaw",
+       "namespace": "iyax ptngahan:",
+       "invert": "mspgriq embrinah gmaaw",
+       "tooltip-invert": "geegi gmaaw qpuruh nii, saw kska lmiing gmaaw iyax ptngahan ruwahan patas kmpriyux (nasi gneegan quri iyax ptngahan, aji saw kiya do jiyax siida lmiing quri iyax ptngahan )",
+       "namespace_association": "quri iyax ptngahan",
+       "tooltip-namespace_association": "geegi nii ka gmaaw saw patas 4 muhing supu kana ni gmaaw iyax ptngahan quri ka empprngaw aji uri o iyax ptngahan pusu kari",
+       "blanknamespace": "( pusu bi )",
+       "contributions": "{{GENDER:$1| empduuy }} suyang qnpahan",
+       "contributions-title": "$1 ka seejiq mduuy suyang qnpahan",
+       "mycontris": "suyang qnpahan",
+       "contribsub2": "{{GENDER:$3|$1}}ka suyang qnpahan ($2)",
+       "contributions-userdoesnotexist": "seejiq mduuy patas sspgan \"$1\" ini ppatas na.",
+       "nocontribs": "ini hjiyal pusu mlngu kaq kmpriyux.",
+       "uctop": "sayang",
+       "month": "jiyax nhdaan kngkingal idas :",
+       "year": "jiyax bitaq hngkawas :",
+       "sp-contributions-newbies": "Wana pqita bgurah sspgan patas ka suyang qnpahan",
+       "sp-contributions-blocklog": "hmuk jiyax rnisuh patas",
+       "sp-contributions-logs": "Jiyax rnisuh patas",
+       "sp-contributions-talk": "empprngaw",
+       "sp-contributions-username": "nniqan IP aji uri o seejiq mduuy hangan :",
+       "sp-contributions-toponly": "wana pqita bgurah bi muda smalu ka smmalu patas",
+       "sp-contributions-newonly": "wana pqita phiyug ruwahan patas ka smmalu patas",
+       "whatlinkshere": "Mggaluk bitaq ruwahan patas nii",
+       "whatlinkshere-title": "mgaluk bitaq \"$1\" ka ruwahan patas",
+       "whatlinkshere-page": "ruwahan patas:",
+       "isredirect": "psbgurah muda ruwahan patas",
+       "istemplate": "dmuuy",
+       "isimage": "mggaluk pusu patas",
+       "whatlinkshere-prev": "brah $1gntuan",
+       "whatlinkshere-next": "{{PLURAL:$1|truma gntuan|babaw na $1 gntuan}}",
+       "whatlinkshere-links": "←mggaluk",
+       "whatlinkshere-hideredirs": "$1 psbgurah muda",
+       "whatlinkshere-hidetrans": "$1 dmuuy",
+       "whatlinkshere-hidelinks": "$1 mggaluk",
+       "whatlinkshere-hideimages": "$1 mggaluk pusu patas",
+       "whatlinkshere-submit": "muda",
+       "ipaddressorusername": "nniqan IP aji uri o seejiq mduuy hangan :",
+       "ipboptions": "2:2 iyax tuki 2 hours,,1 jiyax:1 day,3 jiyax:3 days,1 iyax sngyan:1 week,2 iyax sngyan:2 weeks,1 idas:1 month,3 idas:3 months,6 idas:6 months,1 hngkawas:1 year, ungat nhdaan :infinite",
+       "ipb-pages-label": "ruwahan patas",
+       "ipb-namespaces-label": "iyax ptngahan",
+       "createaccountblock": "phiyug tndu dmuuy patas sspgan",
+       "blocklist-editing-ns": "iyax ptngahan",
+       "blocklink": "hmuk",
+       "contribslink": "suyang qnpahan",
+       "blocklogpage": "hmuk jiyax rnisuh patas",
+       "blocklogentry": "wada shmuk [[$1]] ka",
+       "reblock-logentry": "kmpriyux [[$1]] ka jiyax hmuk nhdaan jiyaxbitaq $2 $3",
+       "block-log-flags-nocreate": "phiyug tndu dmuuy patas sspgan",
+       "proxyblocker": "pririh hmuk qaya suhuci",
+       "move-page": "hdlun $1",
+       "movelogpage": "hdlun jiyax rnisuh patas",
+       "export": "wada paadas ruwahan patas",
+       "allmessages-filter-all": "kana",
+       "thumbnail-more": "pkparu",
+       "import-comment": "patas numal pgkla:",
+       "tooltip-pt-userpage": "{{GENDER:| seejiq mduuy }} ruwahan patas su",
+       "tooltip-pt-mytalk": "{{GENDER:|su}} empprngaw ruwahan patas",
+       "tooltip-pt-preferences": "{{GENDER:|su}} smkuxul powsa",
+       "tooltip-pt-watchlist": "pida sugmraka kmpriyux ka ruwahan patas leexan patas\n( nasi niqan duma wada muda smnalu ruwahan patas (patas bnkgan), nii ruwahan patas mtduwa mniq mkug spgan brah wada miyah pqita.\npusu kari nii o:pida su pqita niqan wada psbgurah smmalu ruwahan patas ka mkug snpgan. )",
+       "tooltip-pt-mycontris": "{GENDER:|su}} suyang qnpahan leexan patas",
+       "tooltip-pt-login": "pstmay patas han msa dmdug rmngaw sunan , kiya ni aji ida saw kiya.",
+       "tooltip-pt-logout": "latat",
+       "tooltip-pt-createaccount": "Mha name dmudug sunan phiyug patas sspgan. Kiya o pstmay matas, ana yaa asi ka ka muda",
+       "tooltip-ca-talk": "Empprngaw quri ruwan ruwahan patas",
+       "tooltip-ca-edit": "smmalu patas ruwahan patas nii",
+       "tooltip-ca-addsection": "prajing bgurah spugan",
+       "tooltip-ca-viewsource": "ruwahan patas nii wada kmlawa. sunan mtduwa qmita ruwahan patas sspgan nii",
+       "tooltip-ca-history": "ruwahan patas nii o wada psmuun smmalu da",
+       "tooltip-ca-move": "hdlun ruwahan patas nii",
+       "tooltip-ca-watch": "ngali ka ruwahan patas nii mali leexan patas gmraka su.",
+       "tooltip-ca-unwatch": "ruwahan patas nii paah leexan patas gmraka kska hdlun pkungat",
+       "tooltip-search": "miying {{SITENAME}}",
+       "tooltip-search-go": "Nasi niqan mndka hangan nii ka ruwahan patas o naa mquri ruwahan patas nii.",
+       "tooltip-search-fulltext": "miying dmuuy su patas nii ka ruwahan patas.",
+       "tooltip-p-logo": "pquri ruwahan patas pusu",
+       "tooltip-n-mainpage": "pquri ruwahan patas pusu",
+       "tooltip-n-mainpage-description": "pquri ruwahan patas pusu",
+       "tooltip-n-portal": "quri pusu qpahun, mtduwa su qmpah manu, inu ka mtduwa hlayan au smulu ka qaya nii",
+       "tooltip-n-currentevents": "ga kska pnsaput kari hlayan quri patas bukuy",
+       "tooltip-n-recentchanges": "kmpriyux patas leexamn snii ka Wiki nii o peiyah patas na.",
+       "tooltip-n-randompage": "Hmut ana knuwan mtmay kingal ruwahan patas",
+       "tooltip-n-help": "Miying meysa ddjyagan",
+       "tooltip-t-whatlinkshere": "ngali patas kana ka mggaluk ruwahan patas nii ka ruwan patas.",
+       "tooltip-t-recentchangeslinked": "kmpriyux snii ka mggaluk ruwahan patas nii bitaq duma na ruwahan pataskpriyux snii",
+       "tooltip-feed-atom": "ruwahan patas nii ka Atom pnyahan",
+       "tooltip-t-contributions": "{{GENDER:$1| seejiq mduuy nii }}ka leexan patas suyang qnpahan",
+       "tooltip-t-emailuser": "peadas mggaluk {{ gluban patas samaw GENDER:$1| seejiq mduuy nii }}",
+       "tooltip-t-upload": "wada pdsun brah pusu patas",
+       "tooltip-t-specialpages": "patas kana leexan qmita ruwahan patas pnseanak",
+       "tooltip-t-print": "peiyah patas na ka ruwahan patas nii",
+       "tooltip-t-permalink": "ruwahan patas ka muda smmalu ini klglug mggaluk\n(mgdhug mggaluk /ana bitaq knuwan mggaluk )",
+       "tooltip-ca-nstab-main": "qmita ruwan ruwahan patas.",
+       "tooltip-ca-nstab-user": "pqita empduuy ruwahan patas",
+       "tooltip-ca-nstab-special": "ruwahan patas nii asaw knmalu ruwahan patas, ungat klaan smmalu patas",
+       "tooltip-ca-nstab-project": "pqita pusu qpahun ruwahan patas",
+       "tooltip-ca-nstab-image": "qmita pusu patas ruwahan patas",
+       "tooltip-ca-nstab-mediawiki": "pqita daan kari pngkla",
+       "tooltip-ca-nstab-template": "pqita qtaan",
+       "tooltip-ca-nstab-category": "Muda qmitaa keelgan ruwahan patas",
+       "tooltip-minoredit": "pnskraya muda saw nii jiyax  snsul smmalu patas",
+       "tooltip-save": "smku kmpriyux su",
+       "tooltip-preview": "Powda ga brah smku qmita sunan kmpriyux!",
+       "tooltip-diff": "pqita su quri saw kmpriyux ruwan",
+       "tooltip-compareselectedversions": "Qtai paah ruwahan patas nii, 2 ka wada gmaaw ka muda smmalu iyax ini kndka",
+       "tooltip-watch": "ngali ka ruwahan patas nii mali leexan patas gmraka su.",
+       "tooltip-rollback": "gmaaw \" psnbrih \" kiya o mggaluk mtduwa psnbrih bitaq kingal brah seejiq suyang qnpahan quri saw nii ruwahan patas ka smmalu patas",
+       "tooltip-undo": "\" psnbrih \" mtduwa psnbrih smmalu patas nii kiya o qtaan plealay ruwahan smmalu patas lblak patas, mtduwa powda sunan mniq ramas kari kska teumal pusu.",
+       "tooltip-summary": "Powda pstmay matas ramas kari",
+       "simpleantispam-label": "Qlhangi pnegkla enlaxan dmuuy pqita.\npowda <strong>aji</strong> ptasi iyax ptasan nii!",
+       "pageinfo-default-sort": "gnama psbkug euda:",
+       "pageinfo-length": "knbragan ruwahan patas ( pnspuan wiyeyn )",
+       "pageinfo-robot-policy": "paah seejiq luqi samaw phiyug patas pnslbu",
+       "pageinfo-few-watchers": "bilaq na $1 seejiq gmraka",
+       "pageinfo-redirects-name": "Ciyu paah ruwahan patas hini ka psbgurah muda knlala ruwahan patas",
+       "pageinfo-subpages-name": "ruwahan patas nii ka sspug ruwahan patas",
+       "pageinfo-subpages-value": "1 ($2 kngkingal{{PLURAL:$2| brahan muda }}; $3 kngkingal{{PLURAL:$3|aji brahan mudal }})",
+       "pageinfo-recent-edits": "s mnpiya ka smmalu patas snii bi (endaan $1 ruwan)",
+       "pageinfo-magic-words": "psteutux {{PLURAL:$1| patas  }} ($1)",
+       "pageinfo-hidden-categories": "Keelgan lmiing ($1)",
+       "pageinfo-templates": "dmuuy qaya qtaan ($1)",
+       "pageinfo-toolboxlink": "Kari patas ruwahan patas",
+       "pageinfo-contentpage": "Saw endaan kari ruwan ppspug ruwahan patas",
+       "previousdiff": "←smudal hari smmalu patas",
+       "nextdiff": "smmalu patas snii→",
+       "widthheightpage": "$1 × $2, $3 ruwahan patas",
+       "file-info-size": "$1 × $2 patas hnigan, pusu patas prparu ni blbila :$3, MIME mdka hnigan :$4",
+       "file-info-size-pages": "$1 × $2 patas hnigan, pusu patas prparu ni blbila :$3, MIME keelgan hnigan :$4, $5 {{PLURAL:$5| ruwahan patas }}",
+       "file-nohires": "umtduwa mgay ngat mndka msleexan qtaan.",
+       "svg-long-desc": "SVG pusu patas, lipax prparu ni blbila:$1 × $2 patas hnigan, pusu patas prparu ni blbila:$3",
+       "show-big-image": "Ida nkiya pusu patas",
+       "show-big-image-preview": "Muda qmita prparu ni blbila :$1.",
+       "show-big-image-other": "duma {{PLURAL:$2||}} msleexan qtaan:$1",
+       "show-big-image-size": "$1 × $2 patas hnigan",
+       "newimages-newbies": "Wana pqita bgurah sspgan patas ka suyang qnpahan",
+       "metadata-help": "Kska pusu patas nii supu kana duma pniyahan kari, pniyahan kari nii o yaa bi paah suwi kikay mangal hnigan aji uri o kikay powda miing rnisuh patas ga phiyug aji uri o saw kska suwi endaan mrana da. nasi pusu patas paah balay bi npusu na o wada psbgrahan smmalu\n, duma leexan balay patas o yaa bi ungat klaan mttuku tkkla wada psbgrahan smmalu pusu patas.",
+       "metadata-fields": "Ga kska ka saw pngkla kari bngkgan ka EXIF patas pngkla ngali ka nniqan nii supu kana ka patas pqita ruwahan patas, pida patas pgkla ka smeeliq siida wana pqita truma nii pngkla .\nduma ka patas pngkla o gnama asaw lmiing\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "namespacesall": "kana",
+       "monthsall": "kana",
+       "confirm-watch-top": "ngali ka ruwahan patas nii mali leexan patas gmraka su?",
+       "confirm-unwatch-top": "ruwahan patas nii paah leexan patas gmraka kska hdlun pkungat?",
+       "imgmultigo": "muda!",
+       "imgmultigoto": "pquri brah tg $1 ruwahan",
+       "img-lang-go": "muda",
+       "table_pager_limit_submit": "muda",
+       "watchlistedit-raw-title": "leexan patas gmraka ida nkiya smmalu patas",
+       "watchlisttools-view": "qmitaa quri kmpriyux",
+       "watchlisttools-edit": "pqita kiya do smmalu patas leexan patas gmraka",
+       "watchlisttools-raw": "leexan patas gmraka ida nkiya smmalu patas",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1| empprngaw ]])",
+       "version-specialpages": "ruwahan patas kmalu",
+       "version-ext-colheader-description": "Pgkla rmngaw",
+       "version-ext-colheader-credits": "seejiq pnatas",
+       "version-libraries-description": "Pgkla rmngaw",
+       "version-libraries-authors": "seejiq pnatas",
+       "redirect": "Saw pusu patas, seejiq mduuy, ruwahan patas, muda smalu aji uri o jiyax rnisuh patas ID iyah psbgurah muda",
+       "redirect-summary": "ruwahan patas knmalu nii o mtduwa sduuy psbgurah muda bitaq pusu patas ( tmiyuu hangan pusu patas ), ruwahan patas ( tmiyu smalu ID aji uri ruwahan patas ID), seejiq mduuy ruwahan patas ( tmiyu seejiq mduuy ID), aji uri o seejiq keelgan jiyax rnisuh patas ( tmiyu jiyax rnisuh patas ID). dduy[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]],",
+       "redirect-submit": "muda",
+       "redirect-revision": "muda smalu ruwahan patas ID",
+       "specialpages": "ruwahan patas kmalu",
+       "specialpages-group-login": "pstmay patas. /phiyug patas sspgan",
+       "tag-filter": "[[Special:Tags| rqci pnskraya ]] miying:",
+       "tag-list-wrapper": "([[Special:Tags|$1 kngkingal rqci pnskraya ]]:$2)",
+       "tag-mw-rollback": "gbrih duri",
+       "tag-mw-undo": "pkbrih",
+       "tags-source-header": "pnyahan",
+       "tags-edit": "smmalu patas",
+       "permanentlink": "mggaluk ini kglglug\n(mggaluk mgdhug,mggaluk ana bitaq knuwan)",
+       "htmlform-cloner-delete": "hdlun pkungat",
+       "logentry-delete-delete": "$1 pkungat ruwahan patas $3",
+       "logentry-delete-restore": "$1{{GENDER:$2| psnbrih }} ruwahan patas $3($4)",
+       "logentry-delete-revision": "$1 {{GENDER:$2| wada priyuxan}} ruwahan patas $3 kska {{PLURAL:$5|1 gntuan muda smmalu |$5 gntuan muda smmalu }}ka mtduwa qtaan:$4",
+       "logentry-move-move": "$1 {{GENDER:$2|wada hdlun }} ruwahan patas $3 bitaq $4",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2| wada hdlun }} ruwahan patas $3 bityaq $4,ini rangi brahan muda",
+       "logentry-move-move_redir": "$1 wada hdlun ruwahan patas $3 bitaq $4 kiya o mubung ida nniqan psbgurah muda",
+       "logentry-patrol-patrol-auto": "$1 wada hiya nanak mlglug{{GENDER:$2| pnskraya }} ruwahan patas $3 ka muda smmalu $4 asaw wada daan rmigaw qmita",
+       "logentry-newusers-newusers": "wada{{GENDER:$2| phiyug }} empduuy patas sspgan $1",
+       "logentry-newusers-create": "wada{{GENDER:$2| phiyug }} empduuy patas sspgan $1",
+       "logentry-newusers-autocreate": "Wada hiya nanak mlglug{{GENDER:$2| phiyug }} mduuy patas sspgan $1",
+       "logentry-upload-upload": "$1 {{GENDER:$2|wada wada pdsun brah }} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2| wada pdsun brah da}}bgurah patas da $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|wada wada pdsun brah }} $3",
+       "feedback-cancel": "pkungat",
+       "searchsuggest-search": "miying {{SITENAME}}",
+       "duration-days": "jiyax",
+       "log-action-filter-all": "kana",
+       "log-action-filter-block-block": "hmuk",
+       "authmanager-userdoesnotexist": "seejiq mduuy patas sspgan \"$1\" ini ppatas na."
+}
index f4299ad..274aa37 100644 (file)
        "blocklist-nousertalk": "не може редагувати свою сторінку обговорення",
        "blocklist-editing": "редагування",
        "blocklist-editing-sitewide": "редагування (у всій вікі)",
+       "blocklist-editing-page": "сторінки",
+       "blocklist-editing-ns": "простори назв",
        "ipblocklist-empty": "Список блокувань порожній.",
        "ipblocklist-no-results": "Запрохані IP-адреса або ім'я користувача не заблоковані.",
        "blocklink": "заблокувати",
index 8d6f5ec..d204bcd 100644 (file)
        "edit-already-exists": "Li novele pâdje n' a savou esse ahivêye, ca cisse pâdje la egzistêye dedja.",
        "editwarning-warning": "Cwiter cisse pådje ci vos frè piede tos les candjmints ki vs avoz fwait.\nSi vs estoz elodj{{GENDER:|î|eye}}, vos ploz dismete cist adviertixhmint ci dins l' linwete « {{int:prefs-editing}} » di vos preferinces.",
        "content-model-wikitext": "wikitecse",
-       "duplicate-args-category": "Pådje eployant des dobes parametes dins les uzaedjes di modele",
+       "duplicate-args-category": "Pådjes eployant des dobes parametes dins les uzaedjes di modele",
        "post-expand-template-inclusion-warning": "'''Asteme:''' I gn a trop di modeles dins cisse pådje ci.\nSacwants di zels ni seront nén eployîs.",
        "post-expand-template-inclusion-category": "Pådjes ki l' inclusion d' modeles est foû limite",
        "viewpagelogs": "Vey les djournås po cisse pådje ci",
index 75a9e56..c9145f1 100644 (file)
        "diff-multi-manyusers": "({{PLURAL:$1|איין מיטלסטע ווערסיע |$1 מיטלסטע ווערסיעס}} פֿון מער ווי {{PLURAL:$2|איין באַניצער|$2 באַניצער}} נישט געוויזן.)",
        "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": "בלאט קעפל שטימט",
        "showingresultsinrange": "ווײַזן אונטן ביז {{PLURAL:$1|<strong>1</strong> רעזולטאט|<strong>$1</strong> רעזולטאטן}} אין גרייך #<strong>$2</strong> ביז #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|רעזולטאַט <strong>$1</strong> פֿון <strong>$3</strong>|רעזולטאַטן\n<strong>$1 - $2</strong> פֿון <strong>$3</strong>}}",
        "search-nonefound": "נישטא קיין רעזולטאטן פֿאַר דער שאלה.",
+       "search-nonefound-thiswiki": "נישט געווען קיין רעזולטאטן צוגעפאט צו דער שאלה אויף דעם וועבזייטל.",
        "powersearch-legend": "ווײַטהאלטן זוכן",
        "powersearch-ns": "זוכן אין נאמענטיילן:",
        "powersearch-togglelabel": "קאנטראלירן:",
        "prefs-displayrc": "ווײַזן אפציעס",
        "prefs-displaywatchlist": "ווײַזן אפציעס",
        "prefs-changesrc": "באוויזענע ענדערונגען",
+       "prefs-changeswatchlist": "באוויזענע ענדערונגען",
+       "prefs-pageswatchlist": "אויפגעפאסטע בלעטער",
        "prefs-tokenwatchlist": "טאקן",
        "prefs-diffs": "צווישנשיידן",
        "prefs-help-prefershttps": "דער פרעפערענץ וועט ארבעטן ביי אײַער נעקסטער ארײַנלאגירונג.",
index 6ef0765..6095c3c 100644 (file)
        "blocklist-nousertalk": "無法編輯自己的對話頁面",
        "blocklist-editing": "編輯",
        "blocklist-editing-sitewide": "編輯(站台範圍)",
+       "blocklist-editing-page": "頁面",
+       "blocklist-editing-ns": "命名空間",
        "ipblocklist-empty": "封鎖清單為空。",
        "ipblocklist-no-results": "請求的 IP 位址或使用者名稱尚未被封鎖。",
        "blocklink": "封鎖",
index e76426d..71d12ee 100644 (file)
@@ -1326,7 +1326,6 @@ abstract class Maintenance {
                        $this->output( "done.\n" );
                }
 
-               # Done
                $this->commitTransaction( $dbw, __METHOD__ );
        }
 
index 786c20a..922b32e 100644 (file)
@@ -116,7 +116,6 @@ TEXT
                                        ]
                                );
                                if ( !$rows || $rows->numRows() <= 0 ) {
-                                       # Done, hopefully.
                                        break;
                                }
 
@@ -170,7 +169,6 @@ TEXT
                                        ]
                                );
                                if ( !$rows || $rows->numRows() <= 0 ) {
-                                       # Done, hopefully.
                                        break;
                                }
                                foreach ( $rows as $row ) {
index b24d72d..a52ce17 100644 (file)
@@ -118,7 +118,6 @@ class CleanupPreferences extends Maintenance {
                        $numRows = $res->numRows();
                        $total += $numRows;
                        if ( $res->numRows() <= 0 ) {
-                               // All done!
                                $this->output( "DONE! (handled $total entries)\n" );
                                break;
                        }
index fc43e22..56576d9 100644 (file)
@@ -90,7 +90,6 @@ class DeleteOldRevisions extends Maintenance {
                        $this->output( "done.\n" );
                }
 
-               # This bit's done
                # Purge redundant text records
                $this->commitTransaction( $dbw, __METHOD__ );
                if ( $delete ) {
index 5db1fa8..7a2e0f4 100644 (file)
@@ -335,7 +335,6 @@ class ImportImages extends Maintenance {
                                        $props,
                                        $timestamp
                                )->isOK() ) {
-                                       # We're done!
                                        $this->output( "done.\n" );
 
                                        $doProtect = false;
index b7e8c1c..25ce3ce 100644 (file)
@@ -26,6 +26,12 @@ if ( PHP_SAPI != 'cli' ) {
        die( "This script can only be run from the command line.\n" );
 }
 
+// class Collator is provided by the intl extension.
+// It is only suggested in composer.json, so remind here when not loaded.
+if ( !extension_loaded( 'intl' ) ) {
+       die( "This script needs the 'intl' extension to be loaded." );
+}
+
 $CREDITS = 'CREDITS';
 $START_CONTRIBUTORS = '<!-- BEGIN CONTRIBUTOR LIST -->';
 $END_CONTRIBUTORS = '<!-- END CONTRIBUTOR LIST -->';
index c0570cf..5b65a09 100644 (file)
@@ -10,7 +10,7 @@
     "selenium-test": "wdio ./tests/selenium/wdio.conf.js"
   },
   "devDependencies": {
-    "eslint-config-wikimedia": "0.10.0",
+    "eslint-config-wikimedia": "0.10.1",
     "grunt": "1.0.3",
     "grunt-banana-checker": "0.6.0",
     "grunt-contrib-copy": "1.0.0",
index 9464cf7..83f11f8 100644 (file)
@@ -320,13 +320,17 @@ return [
        'jquery.tablesorter' => [
                'targets' => [ 'desktop', 'mobile' ],
                'scripts' => 'resources/src/jquery.tablesorter/jquery.tablesorter.js',
-               'styles' => 'resources/src/jquery.tablesorter/jquery.tablesorter.less',
                'messages' => [ 'sort-descending', 'sort-ascending' ],
                'dependencies' => [
+                       'jquery.tablesorter.styles',
                        'mediawiki.RegExp',
                        'mediawiki.language.months',
                ],
        ],
+       'jquery.tablesorter.styles' => [
+               'targets' => [ 'desktop', 'mobile' ],
+               'styles' => 'resources/src/jquery.tablesorter.styles/jquery.tablesorter.styles.less',
+       ],
        'jquery.textSelection' => [
                'scripts' => 'resources/src/jquery/jquery.textSelection.js',
                'dependencies' => 'jquery.client',
diff --git a/resources/src/jquery.tablesorter.styles/images/sort_both.png b/resources/src/jquery.tablesorter.styles/images/sort_both.png
new file mode 100644 (file)
index 0000000..fc63091
Binary files /dev/null and b/resources/src/jquery.tablesorter.styles/images/sort_both.png differ
diff --git a/resources/src/jquery.tablesorter.styles/images/sort_both.svg b/resources/src/jquery.tablesorter.styles/images/sort_both.svg
new file mode 100644 (file)
index 0000000..872a8db
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="21" height="9" viewBox="0 0 21 9">
+       <path d="M14.5 5l-4 4-4-4zM14.5 4l-4-4-4 4z"/>
+</svg>
diff --git a/resources/src/jquery.tablesorter.styles/images/sort_down.png b/resources/src/jquery.tablesorter.styles/images/sort_down.png
new file mode 100644 (file)
index 0000000..ce04a0f
Binary files /dev/null and b/resources/src/jquery.tablesorter.styles/images/sort_down.png differ
diff --git a/resources/src/jquery.tablesorter.styles/images/sort_down.svg b/resources/src/jquery.tablesorter.styles/images/sort_down.svg
new file mode 100644 (file)
index 0000000..452606a
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="21" height="4" viewBox="0 0 21 4">
+       <path d="M14.5 0l-4 4-4-4z"/>
+</svg>
diff --git a/resources/src/jquery.tablesorter.styles/images/sort_up.png b/resources/src/jquery.tablesorter.styles/images/sort_up.png
new file mode 100644 (file)
index 0000000..2ebe071
Binary files /dev/null and b/resources/src/jquery.tablesorter.styles/images/sort_up.png differ
diff --git a/resources/src/jquery.tablesorter.styles/images/sort_up.svg b/resources/src/jquery.tablesorter.styles/images/sort_up.svg
new file mode 100644 (file)
index 0000000..38f6374
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="21" height="4" viewBox="0 0 21 4">
+       <path d="M6.5 4l4-4 4 4z"/>
+</svg>
diff --git a/resources/src/jquery.tablesorter.styles/jquery.tablesorter.styles.less b/resources/src/jquery.tablesorter.styles/jquery.tablesorter.styles.less
new file mode 100644 (file)
index 0000000..c941da0
--- /dev/null
@@ -0,0 +1,22 @@
+@import 'mediawiki.mixins';
+
+/* Table Sorting */
+
+.client-js .sortable:not( .jquery-tablesorter ) > thead > :last-of-type > th:not( .unsortable ),
+.jquery-tablesorter th.headerSort {
+       .background-image-svg( 'images/sort_both.svg', 'images/sort_both.png' );
+       cursor: pointer;
+       background-repeat: no-repeat;
+       background-position: center right;
+       padding-right: 21px;
+}
+
+.jquery-tablesorter {
+       th.headerSortUp {
+               .background-image-svg( 'images/sort_up.svg', 'images/sort_up.png' );
+       }
+
+       th.headerSortDown {
+               .background-image-svg( 'images/sort_down.svg', 'images/sort_down.png' );
+       }
+}
diff --git a/resources/src/jquery.tablesorter/images/sort_both.png b/resources/src/jquery.tablesorter/images/sort_both.png
deleted file mode 100644 (file)
index fc63091..0000000
Binary files a/resources/src/jquery.tablesorter/images/sort_both.png and /dev/null differ
diff --git a/resources/src/jquery.tablesorter/images/sort_both.svg b/resources/src/jquery.tablesorter/images/sort_both.svg
deleted file mode 100644 (file)
index 872a8db..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="21" height="9" viewBox="0 0 21 9">
-       <path d="M14.5 5l-4 4-4-4zM14.5 4l-4-4-4 4z"/>
-</svg>
diff --git a/resources/src/jquery.tablesorter/images/sort_down.png b/resources/src/jquery.tablesorter/images/sort_down.png
deleted file mode 100644 (file)
index ce04a0f..0000000
Binary files a/resources/src/jquery.tablesorter/images/sort_down.png and /dev/null differ
diff --git a/resources/src/jquery.tablesorter/images/sort_down.svg b/resources/src/jquery.tablesorter/images/sort_down.svg
deleted file mode 100644 (file)
index 452606a..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="21" height="4" viewBox="0 0 21 4">
-       <path d="M14.5 0l-4 4-4-4z"/>
-</svg>
diff --git a/resources/src/jquery.tablesorter/images/sort_up.png b/resources/src/jquery.tablesorter/images/sort_up.png
deleted file mode 100644 (file)
index 2ebe071..0000000
Binary files a/resources/src/jquery.tablesorter/images/sort_up.png and /dev/null differ
diff --git a/resources/src/jquery.tablesorter/images/sort_up.svg b/resources/src/jquery.tablesorter/images/sort_up.svg
deleted file mode 100644 (file)
index 38f6374..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="21" height="4" viewBox="0 0 21 4">
-       <path d="M6.5 4l4-4 4 4z"/>
-</svg>
diff --git a/resources/src/jquery.tablesorter/jquery.tablesorter.less b/resources/src/jquery.tablesorter/jquery.tablesorter.less
deleted file mode 100644 (file)
index ce24b0d..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-@import 'mediawiki.mixins';
-
-/* Table Sorting */
-
-table.jquery-tablesorter {
-       th.headerSort {
-               .background-image-svg( 'images/sort_both.svg', 'images/sort_both.png' );
-               cursor: pointer;
-               background-repeat: no-repeat;
-               background-position: center right;
-               padding-right: 21px;
-       }
-
-       th.headerSortUp {
-               .background-image-svg( 'images/sort_up.svg', 'images/sort_up.png' );
-       }
-
-       th.headerSortDown {
-               .background-image-svg( 'images/sort_down.svg', 'images/sort_down.png' );
-       }
-}
index f5f0475..09306f6 100644 (file)
@@ -82,7 +82,6 @@
                        }
                }
 
-               // eslint-disable-next-line jquery/no-animate-toggle
                $containers.toggle( action === 'expand' );
                hookCallback();
        }
index 01d2ba5..d9a094c 100644 (file)
                                // Only fetch if the value in the textbox changed and is not empty, or if the results were hidden
                                // if the textbox is empty then clear the result div, but leave other settings intouched
                                if ( val.length === 0 ) {
-                                       // eslint-disable-next-line jquery/no-animate-toggle
                                        $.suggestions.hide( context );
                                        context.data.prevText = '';
                                } else if (
                                        if ( context.data !== undefined ) {
                                                if ( context.data.$textbox.val().length === 0 ) {
                                                        // Hide the div when no suggestion exist
-                                                       // eslint-disable-next-line jquery/no-animate-toggle
                                                        $.suggestions.hide( context );
                                                } else {
                                                        // Rebuild the suggestions list
                                        break;
                                // Escape
                                case 27:
-                                       // eslint-disable-next-line jquery/no-animate-toggle
                                        $.suggestions.hide( context );
                                        $.suggestions.restore( context );
                                        $.suggestions.cancel( context );
                                case 13:
                                        preventDefault = wasVisible;
                                        selected = context.data.$container.find( '.suggestions-result-current' );
-                                       // eslint-disable-next-line jquery/no-animate-toggle
                                        $.suggestions.hide( context );
                                        if ( selected.length === 0 || context.data.selectedWithMouse ) {
                                                // If nothing is selected or if something was selected with the mouse
                                                                        // This will hide the link we're just clicking on, which causes problems
                                                                        // when done synchronously in at least Firefox 3.6 (T64858).
                                                                        setTimeout( function () {
-                                                                               // eslint-disable-next-line jquery/no-animate-toggle
                                                                                $.suggestions.hide( context );
                                                                        } );
                                                                }
                                                                        // This will hide the link we're just clicking on, which causes problems
                                                                        // when done synchronously in at least Firefox 3.6 (T64858).
                                                                        setTimeout( function () {
-                                                                               // eslint-disable-next-line jquery/no-animate-toggle
                                                                                $.suggestions.hide( context );
                                                                        } );
                                                                }
                                        } )
                                        .on( 'keypress', function ( e ) {
                                                context.data.keypressedCount++;
-                                               // eslint-disable-next-line jquery/no-event-shorthand
                                                $.suggestions.keypress( e, context, context.data.keypressed );
                                        } )
                                        .on( 'keyup', function ( e ) {
                                                        e.which === context.data.keypressed &&
                                                        allowed.indexOf( e.which ) !== -1
                                                ) {
-                                                       // eslint-disable-next-line jquery/no-event-shorthand
                                                        $.suggestions.keypress( e, context, context.data.keypressed );
                                                }
                                        } )
                                                if ( context.data.mouseDownOn.length > 0 ) {
                                                        return;
                                                }
-                                               // eslint-disable-next-line jquery/no-animate-toggle
                                                $.suggestions.hide( context );
                                                $.suggestions.cancel( context );
                                        } );
index 72a27fa..849ccbc 100644 (file)
                } );
        }
 
-       function humanSize( bytes ) {
+       function humanSize( bytesInput ) {
                var i,
+                       bytes = +bytesInput,
                        units = [ '', ' KiB', ' MiB', ' GiB', ' TiB', ' PiB' ];
 
-               if ( !$.isNumeric( bytes ) || bytes === 0 ) {
-                       return bytes;
+               if ( bytes === 0 || isNaN( bytes ) ) {
+                       return bytesInput;
                }
 
                for ( i = 0; bytes >= 1024; bytes /= 1024 ) {
index 2765d07..e8450df 100644 (file)
                                        $area.css( 'display', 'none' );
                                        notif.$notification.remove();
                                } else {
+                                       // FIXME: Use CSS transition
+                                       // eslint-disable-next-line jquery/no-slide
                                        notif.$notification.slideUp( 'fast', function () {
                                                $( this ).remove();
                                        } );
index 1651432..6eb8867 100644 (file)
                                        title: '', // Because it's a hidden group, this title actually appears nowhere
                                        hidden: true,
                                        allowArbitrary: true,
+                                       // FIXME: $.isNumeric is deprecated
                                        validate: $.isNumeric,
                                        range: {
                                                min: 0, // The server normalizes negative numbers to 0 results
                                        title: '', // Because it's a hidden group, this title actually appears nowhere
                                        hidden: true,
                                        allowArbitrary: true,
+                                       // FIXME: $.isNumeric is deprecated
                                        validate: $.isNumeric,
                                        range: {
                                                min: 0,
         * @param {number|string} newValue New value
         */
        mw.rcfilters.Controller.prototype.updateNumericPreference = function ( prefName, newValue ) {
+               // FIXME: $.isNumeric is deprecated
+               // eslint-disable-next-line jquery/no-is-numeric
                if ( !$.isNumeric( newValue ) ) {
                        return;
                }
index 19eac98..68c7ddc 100644 (file)
                        // OO.ui.ButtonWidget doesn't take focus itself (T128054)
                        $focus = $( '#mw-apisandbox-ui' ).find( document.activeElement );
                        if ( $focus.length ) {
-                               // eslint-disable-next-line jquery/no-event-shorthand
                                $focus[ 0 ].blur();
                        }
 
                                }
 
                                that.deprecatedItemsFieldset = new OO.ui.FieldsetLayout().addItems( deprecatedItems ).toggle( false );
-                               // eslint-disable-next-line jquery/no-animate-toggle
                                tmp = $( '<fieldset>' )
                                        .toggle( !that.deprecatedItemsFieldset.isEmpty() )
                                        .append(
index 63d9623..a4f5d1a 100644 (file)
@@ -12,7 +12,6 @@
 
        // Dynamically show/hide the "other time" input under each dropdown
        $( '.mw-userrights-nested select' ).on( 'change', function ( e ) {
-               // eslint-disable-next-line jquery/no-animate-toggle
                $( e.target.parentNode ).find( 'input' ).toggle( $( e.target ).val() === 'other' );
        } );
 
diff --git a/tests/integration/includes/shell/FirejailCommandIntegrationTest.php b/tests/integration/includes/shell/FirejailCommandIntegrationTest.php
new file mode 100644 (file)
index 0000000..4730005
--- /dev/null
@@ -0,0 +1,80 @@
+<?php
+
+use MediaWiki\Shell\FirejailCommand;
+use MediaWiki\Shell\Shell;
+
+/**
+ * Integration tests to ensure that firejail actually prevents execution.
+ * Meant to run on vagrant, although will probably work on other setups
+ * as long as firejail and sudo has similar config.
+ *
+ * @group large
+ * @group Shell
+ * @covers FirejailCommand
+ */
+class FirejailCommandIntegrationTest extends PHPUnit\Framework\TestCase {
+
+       public function setUp() {
+               parent::setUp();
+               if ( Shell::isDisabled() ) {
+                       $this->markTestSkipped( 'shelling out is disabled' );
+               } elseif ( Shell::command( 'which', 'firejail' )->execute()->getExitCode() ) {
+                       $this->markTestSkipped( 'firejail not installed' );
+               } elseif ( wfIsWindows() ) {
+                       $this->markTestSkipped( 'test supports POSIX environments only' );
+               }
+       }
+
+       public function testSanity() {
+               // Make sure that firejail works at all.
+               $command = new FirejailCommand( 'firejail' );
+               $command
+                       ->unsafeParams( 'ls .' )
+                       ->restrict( Shell::RESTRICT_DEFAULT );
+               $result = $command->execute();
+               $this->assertSame( 0, $result->getExitCode() );
+       }
+
+       /**
+        * @coversNothing
+        * @dataProvider provideExecute
+        */
+       public function testExecute( $testCommand, $flag ) {
+               if ( preg_match( '/^sudo /', $testCommand ) ) {
+                       if ( Shell::command( 'sudo', '-n', 'ls', '/' )->execute()->getExitCode() ) {
+                               $this->markTestSkipped( 'need passwordless sudo' );
+                       }
+               }
+
+               $command = new FirejailCommand( 'firejail' );
+               $command
+                       ->unsafeParams( $testCommand )
+                       // If we don't restrict at all, firejail won't be invoked,
+                       // so the test will give a false positive if firejail breaks
+                       // the command for some non-flag-related reason. Instead,
+                       // set some flag that won't get in the way.
+                       ->restrict( $flag === Shell::NO_NETWORK ? Shell::PRIVATE_DEV : Shell::NO_NETWORK );
+               $result = $command->execute();
+               $this->assertSame( 0, $result->getExitCode(), 'sanity check' );
+
+               $command = new FirejailCommand( 'firejail' );
+               $command
+                       ->unsafeParams( $testCommand )
+                       ->restrict( $flag );
+               $result = $command->execute();
+               $this->assertNotSame( 0, $result->getExitCode(), 'real check' );
+       }
+
+       public function provideExecute() {
+               global $IP;
+               return [
+                       [ 'sudo -n ls /', Shell::NO_ROOT ],
+                       [ 'sudo -n ls /', Shell::SECCOMP ], // not a great test but seems to work
+                       [ 'ls /dev/cpu', Shell::PRIVATE_DEV ],
+                       [ 'curl -fsSo /dev/null https://wikipedia.org/', Shell::NO_NETWORK ],
+                       [ 'exec ls /', Shell::NO_EXECVE ],
+                       [ "cat $IP/LocalSettings.php", Shell::NO_LOCALSETTINGS ],
+               ];
+       }
+
+}
diff --git a/tests/integration/includes/shell/FirejailCommandTest.php b/tests/integration/includes/shell/FirejailCommandTest.php
deleted file mode 100644 (file)
index 4730005..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-
-use MediaWiki\Shell\FirejailCommand;
-use MediaWiki\Shell\Shell;
-
-/**
- * Integration tests to ensure that firejail actually prevents execution.
- * Meant to run on vagrant, although will probably work on other setups
- * as long as firejail and sudo has similar config.
- *
- * @group large
- * @group Shell
- * @covers FirejailCommand
- */
-class FirejailCommandIntegrationTest extends PHPUnit\Framework\TestCase {
-
-       public function setUp() {
-               parent::setUp();
-               if ( Shell::isDisabled() ) {
-                       $this->markTestSkipped( 'shelling out is disabled' );
-               } elseif ( Shell::command( 'which', 'firejail' )->execute()->getExitCode() ) {
-                       $this->markTestSkipped( 'firejail not installed' );
-               } elseif ( wfIsWindows() ) {
-                       $this->markTestSkipped( 'test supports POSIX environments only' );
-               }
-       }
-
-       public function testSanity() {
-               // Make sure that firejail works at all.
-               $command = new FirejailCommand( 'firejail' );
-               $command
-                       ->unsafeParams( 'ls .' )
-                       ->restrict( Shell::RESTRICT_DEFAULT );
-               $result = $command->execute();
-               $this->assertSame( 0, $result->getExitCode() );
-       }
-
-       /**
-        * @coversNothing
-        * @dataProvider provideExecute
-        */
-       public function testExecute( $testCommand, $flag ) {
-               if ( preg_match( '/^sudo /', $testCommand ) ) {
-                       if ( Shell::command( 'sudo', '-n', 'ls', '/' )->execute()->getExitCode() ) {
-                               $this->markTestSkipped( 'need passwordless sudo' );
-                       }
-               }
-
-               $command = new FirejailCommand( 'firejail' );
-               $command
-                       ->unsafeParams( $testCommand )
-                       // If we don't restrict at all, firejail won't be invoked,
-                       // so the test will give a false positive if firejail breaks
-                       // the command for some non-flag-related reason. Instead,
-                       // set some flag that won't get in the way.
-                       ->restrict( $flag === Shell::NO_NETWORK ? Shell::PRIVATE_DEV : Shell::NO_NETWORK );
-               $result = $command->execute();
-               $this->assertSame( 0, $result->getExitCode(), 'sanity check' );
-
-               $command = new FirejailCommand( 'firejail' );
-               $command
-                       ->unsafeParams( $testCommand )
-                       ->restrict( $flag );
-               $result = $command->execute();
-               $this->assertNotSame( 0, $result->getExitCode(), 'real check' );
-       }
-
-       public function provideExecute() {
-               global $IP;
-               return [
-                       [ 'sudo -n ls /', Shell::NO_ROOT ],
-                       [ 'sudo -n ls /', Shell::SECCOMP ], // not a great test but seems to work
-                       [ 'ls /dev/cpu', Shell::PRIVATE_DEV ],
-                       [ 'curl -fsSo /dev/null https://wikipedia.org/', Shell::NO_NETWORK ],
-                       [ 'exec ls /', Shell::NO_EXECVE ],
-                       [ "cat $IP/LocalSettings.php", Shell::NO_LOCALSETTINGS ],
-               ];
-       }
-
-}
index d34e183..26d5217 100644 (file)
@@ -39,7 +39,7 @@ tap:
        ${PU} --tap
 
 coverage:
-       ${PU} --coverage-html ../../docs/code-coverage
+       ${PU} --coverage-html ../../docs/coverage
 
 parser:
        ${PU} --group Parser
index 55d8fbb..f5fef61 100644 (file)
@@ -368,6 +368,9 @@ class EditPageTest extends MediaWikiLangTestCase {
                }
        }
 
+       /**
+        * @covers EditPage
+        */
        public function testUpdatePage() {
                $checkIds = [];
 
@@ -414,6 +417,9 @@ class EditPageTest extends MediaWikiLangTestCase {
                $this->assertGreaterThan( $checkIds[0], $checkIds[1], "Second event rev ID is higher" );
        }
 
+       /**
+        * @covers EditPage
+        */
        public function testUpdatePageTrx() {
                $text = "one";
                $edit = [
@@ -684,6 +690,7 @@ hello
 
        /**
         * @depends testAutoMerge
+        * @covers EditPage
         */
        public function testCheckDirectEditingDisallowed_forNonTextContent() {
                $title = Title::newFromText( 'Dummy:NonTextPageForEditPage' );
index 607f4f7..1b2b159 100644 (file)
@@ -65,6 +65,7 @@ class MovePageTest extends MediaWikiTestCase {
 
        /**
         * Test for the move operation being aborted via the TitleMove hook
+        * @covers MovePage::move
         */
        public function testMoveAbortedByTitleMoveHook() {
                $error = 'Preventing move operation with TitleMove hook.';
index 00a08a7..7d40d8c 100644 (file)
@@ -912,7 +912,7 @@ class OutputPageTest extends MediaWikiTestCase {
         * @param array $args Array of form [ category name => sort key ]
         * @param array $fakeResults Array of form [ category name => value to return from mocked
         *   LinkBatch ]
-        * @param callback $variantLinkCallback Callback to replace findVariantLink() call
+        * @param callable $variantLinkCallback Callback to replace findVariantLink() call
         * @param array $expectedNormal Expected return value of getCategoryLinks['normal']
         * @param array $expectedHidden Expected return value of getCategoryLinks['hidden']
         */
index 7279e64..0e565e5 100644 (file)
@@ -31,7 +31,7 @@ class MutableRevisionSlotsTest extends RevisionSlotsTest {
 
        /**
         * @dataProvider provideConstructorFailue
-        * @param $slots
+        * @param array $slots
         *
         * @covers \MediaWiki\Revision\RevisionSlots::__construct
         * @covers \MediaWiki\Revision\RevisionSlots::setSlotsInternal
index 43fccee..9665867 100644 (file)
@@ -78,8 +78,8 @@ class RenderedRevisionTest extends MediaWikiTestCase {
        }
 
        /**
-        * @param $articleId
-        * @param $revisionId
+        * @param int $articleId
+        * @param int $revisionId
         * @return Title
         */
        private function getMockTitle( $articleId, $revisionId ) {
index 59b5a2c..071ea68 100644 (file)
@@ -30,8 +30,8 @@ use WikitextContent;
 class RevisionRendererTest extends MediaWikiTestCase {
 
        /**
-        * @param $articleId
-        * @param $revisionId
+        * @param int $articleId
+        * @param int $revisionId
         * @return Title
         */
        private function getMockTitle( $articleId, $revisionId ) {
index d8e7d92..52593ec 100644 (file)
@@ -31,7 +31,7 @@ class RevisionSlotsTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideConstructorFailue
-        * @param $slots
+        * @param array $slots
         *
         * @covers \MediaWiki\Revision\RevisionSlots::__construct
         * @covers \MediaWiki\Revision\RevisionSlots::setSlotsInternal
index 2e61745..138d6bc 100644 (file)
@@ -23,6 +23,9 @@ use Wikimedia\TestingAccessWrapper;
 
 class RevisionStoreFactoryTest extends MediaWikiTestCase {
 
+       /**
+        * @covers \MediaWiki\Revision\RevisionStoreFactory::__construct
+        */
        public function testValidConstruction_doesntCauseErrors() {
                new RevisionStoreFactory(
                        $this->getMockLoadBalancerFactory(),
@@ -49,6 +52,7 @@ class RevisionStoreFactoryTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideWikiIds
+        * @covers \MediaWiki\Revision\RevisionStoreFactory::getRevisionStore
         */
        public function testGetRevisionStore(
                $wikiId,
index efc2952..c4b274d 100644 (file)
@@ -146,6 +146,9 @@ class RevisionStoreTest extends MediaWikiTestCase {
                $this->assertSame( $contentHandlerDb, $store->getContentHandlerUseDB() );
        }
 
+       /**
+        * @covers \MediaWiki\Revision\RevisionStore::getTitle
+        */
        public function testGetTitle_successFromPageId() {
                $mockLoadBalancer = $this->getMockLoadBalancer();
                // Title calls wfGetDB() so we have to set the main service
@@ -177,6 +180,9 @@ class RevisionStoreTest extends MediaWikiTestCase {
                $this->assertSame( 'Food', $title->getDBkey() );
        }
 
+       /**
+        * @covers \MediaWiki\Revision\RevisionStore::getTitle
+        */
        public function testGetTitle_successFromPageIdOnFallback() {
                $mockLoadBalancer = $this->getMockLoadBalancer();
                // Title calls wfGetDB() so we have to set the main service
@@ -233,6 +239,9 @@ class RevisionStoreTest extends MediaWikiTestCase {
                $this->assertSame( 'Foodey', $title->getDBkey() );
        }
 
+       /**
+        * @covers \MediaWiki\Revision\RevisionStore::getTitle
+        */
        public function testGetTitle_successFromRevId() {
                $mockLoadBalancer = $this->getMockLoadBalancer();
                // Title calls wfGetDB() so we have to set the main service
@@ -278,6 +287,9 @@ class RevisionStoreTest extends MediaWikiTestCase {
                $this->assertSame( 'Food2', $title->getDBkey() );
        }
 
+       /**
+        * @covers \MediaWiki\Revision\RevisionStore::getTitle
+        */
        public function testGetTitle_successFromRevIdOnFallback() {
                $mockLoadBalancer = $this->getMockLoadBalancer();
                // Title calls wfGetDB() so we have to set the main service
index a2f2796..6c7b0e7 100644 (file)
@@ -572,28 +572,6 @@ abstract class RevisionDbTestBase extends MediaWikiTestCase {
                );
        }
 
-       /**
-        * @covers Revision::fetchRevision
-        */
-       public function testFetchRevision() {
-               // Hidden process cache assertion below
-               $this->testPage->getRevision()->getId();
-
-               $this->testPage->doEditContent( new WikitextContent( __METHOD__ ), __METHOD__ );
-               $id = $this->testPage->getRevision()->getId();
-
-               $this->hideDeprecated( 'Revision::fetchRevision' );
-               $res = Revision::fetchRevision( $this->testPage->getTitle() );
-
-               # note: order is unspecified
-               $rows = [];
-               while ( ( $row = $res->fetchObject() ) ) {
-                       $rows[$row->rev_id] = $row;
-               }
-
-               $this->assertEmpty( $rows, 'expected empty set' );
-       }
-
        /**
         * @covers Revision::getPage
         */
index 3339749..92c6f62 100644 (file)
@@ -76,7 +76,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
         * Creates a revision in the database.
         *
         * @param WikiPage $page
-        * @param $summary
+        * @param string|Message|CommentStoreComment $summary
         * @param null|string|Content $content
         *
         * @return RevisionRecord|null
index 89e1d4e..9d60605 100644 (file)
@@ -241,7 +241,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
         * Creates a revision in the database.
         *
         * @param WikiPage $page
-        * @param $summary
+        * @param string|Message|CommentStoreComment $summary
         * @param null|string|Content $content
         *
         * @return RevisionRecord|null
index 952a662..773bd51 100644 (file)
@@ -143,7 +143,7 @@ class TestUser {
                }
 
                $passwordFactory = MediaWikiServices::getInstance()->getPasswordFactory();
-               if ( !$passwordFactory->newFromCiphertext( $row->user_password )->equals( $password ) ) {
+               if ( !$passwordFactory->newFromCiphertext( $row->user_password )->verify( $password ) ) {
                        $passwordHash = $passwordFactory->newFromPlaintext( $password );
                        $dbw->update(
                                'user',
index f689cae..2fc7794 100644 (file)
@@ -360,6 +360,10 @@ just a test"
                $this->assertEquals( CONTENT_MODEL_WIKITEXT, $content->getContentHandler()->getModelID() );
        }
 
+       /**
+        * @covers ParserOptions::getRedirectTarget
+        * @covers ParserOptions::setRedirectTarget
+        */
        public function testRedirectParserOption() {
                $title = Title::newFromText( 'testRedirectParserOption' );
 
index 78af11d..e61bd05 100644 (file)
@@ -5,26 +5,6 @@ use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\DatabaseSqlite;
 use Wikimedia\Rdbms\ResultWrapper;
 
-class DatabaseSqliteMock extends DatabaseSqlite {
-       public static function newInstance( array $p = [] ) {
-               $p['dbFilePath'] = ':memory:';
-               $p['schema'] = false;
-
-               return Database::factory( 'SqliteMock', $p );
-       }
-
-       function query( $sql, $fname = '', $tempIgnore = false ) {
-               return true;
-       }
-
-       /**
-        * Override parent visibility to public
-        */
-       public function replaceVars( $s ) {
-               return parent::replaceVars( $s );
-       }
-}
-
 /**
  * @group sqlite
  * @group Database
@@ -494,6 +474,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                return $indexes;
        }
 
+       /**
+        * @coversNothing
+        */
        public function testCaseInsensitiveLike() {
                // TODO: Test this for all databases
                $db = DatabaseSqlite::newStandaloneInstance( ':memory:' );
@@ -539,3 +522,23 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                $this->assertTrue( $attributes[Database::ATTR_DB_LEVEL_LOCKING] );
        }
 }
+
+class DatabaseSqliteMock extends DatabaseSqlite {
+       public static function newInstance( array $p = [] ) {
+               $p['dbFilePath'] = ':memory:';
+               $p['schema'] = false;
+
+               return Database::factory( 'SqliteMock', $p );
+       }
+
+       function query( $sql, $fname = '', $tempIgnore = false ) {
+               return true;
+       }
+
+       /**
+        * Override parent visibility to public
+        */
+       public function replaceVars( $s ) {
+               return parent::replaceVars( $s );
+       }
+}
index 1ee188e..a1207b2 100644 (file)
@@ -5,6 +5,7 @@ namespace MediaWiki\Logger\Monolog;
 class LogstashFormatterTest extends \PHPUnit\Framework\TestCase {
        /**
         * @dataProvider provideV1
+        * @covers MediaWiki\Logger\Monolog\LogstashFormatter::formatV1
         * @param array $record The input record.
         * @param array $expected Associative array of expected keys and their values.
         * @param array $notExpected List of keys that should not exist.
@@ -42,6 +43,9 @@ class LogstashFormatterTest extends \PHPUnit\Framework\TestCase {
                ];
        }
 
+       /**
+        * @covers MediaWiki\Logger\Monolog\LogstashFormatter::formatV1
+        */
        public function testV1WithPrefix() {
                $formatter = new LogstashFormatter( 'app', 'system', null, 'ctx_', LogstashFormatter::V1 );
                $record = [ 'extra' => [ 'url' => 1 ], 'context' => [ 'url' => 2 ] ];
index 9e4dbea..74a5e3c 100644 (file)
@@ -1,20 +1,5 @@
 <?php
 
-class MockSearch extends SearchEngine {
-       public static $id;
-       public static $title;
-       public static $text;
-
-       public function __construct( $db ) {
-       }
-
-       public function update( $id, $title, $text ) {
-               self::$id = $id;
-               self::$title = $title;
-               self::$text = $text;
-       }
-}
-
 /**
  * @group Search
  */
@@ -85,3 +70,18 @@ EOT
                );
        }
 }
+
+class MockSearch extends SearchEngine {
+       public static $id;
+       public static $title;
+       public static $text;
+
+       public function __construct( $db ) {
+       }
+
+       public function update( $id, $title, $text ) {
+               self::$id = $id;
+               self::$title = $title;
+               self::$text = $text;
+       }
+}
index f570f55..4dc2f9e 100644 (file)
@@ -350,7 +350,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        $this->assertEquals( false, $this->backend->fileExists( [ 'src' => $dest ] ),
                                "Destination file $dest does not exist ($backendName)." );
 
-                       return; // done
+                       return;
                }
 
                $status = $this->backend->doOperation(
@@ -470,7 +470,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        $this->assertEquals( false, $this->backend->fileExists( [ 'src' => $dest ] ),
                                "Destination file $dest does not exist ($backendName)." );
 
-                       return; // done
+                       return;
                }
 
                $status = $this->backend->doOperation(
index 3b91f5b..892bdcf 100644 (file)
@@ -222,6 +222,9 @@ EOF
 
        /**
         * @dataProvider provideUnknownUserHandling
+        * @covers WikiImporter::setUsernamePrefix
+        * @covers ExternalUserNames::addPrefix
+        * @covers ExternalUserNames::applyPrefix
         * @param bool $assign
         * @param bool $create
         */
index 2760cb9..a6adf34 100644 (file)
@@ -109,6 +109,15 @@ class FormatJsonTest extends MediaWikiTestCase {
                );
        }
 
+       public function testEncodeFail() {
+               // Set up a recursive object that can't be encoded.
+               $a = new stdClass;
+               $b = new stdClass;
+               $a->b = $b;
+               $b->a = $a;
+               $this->assertFalse( FormatJson::encode( $a ) );
+       }
+
        public function testDecodeReturnType() {
                $this->assertInternalType(
                        'object',
index 9127a30..628cca0 100644 (file)
@@ -1,27 +1,6 @@
 <?php
 /**
- * A MemoizedCallable subclass that stores function return values
- * in an instance property rather than APC or APCu.
- */
-class ArrayBackedMemoizedCallable extends MemoizedCallable {
-       private $cache = [];
-
-       protected function fetchResult( $key, &$success ) {
-               if ( array_key_exists( $key, $this->cache ) ) {
-                       $success = true;
-                       return $this->cache[$key];
-               }
-               $success = false;
-               return false;
-       }
-
-       protected function storeResult( $key, $result ) {
-               $this->cache[$key] = $result;
-       }
-}
-
-/**
- * PHP Unit tests for MemoizedCallable class.
+ * PHPUnit tests for MemoizedCallable class.
  * @covers MemoizedCallable
  */
 class MemoizedCallableTest extends PHPUnit\Framework\TestCase {
@@ -140,3 +119,24 @@ class MemoizedCallableTest extends PHPUnit\Framework\TestCase {
                $memoized = new MemoizedCallable( 14 );
        }
 }
+
+/**
+ * A MemoizedCallable subclass that stores function return values
+ * in an instance property rather than APC or APCu.
+ */
+class ArrayBackedMemoizedCallable extends MemoizedCallable {
+       private $cache = [];
+
+       protected function fetchResult( $key, &$success ) {
+               if ( array_key_exists( $key, $this->cache ) ) {
+                       $success = true;
+                       return $this->cache[$key];
+               }
+               $success = false;
+               return false;
+       }
+
+       protected function storeResult( $key, $result ) {
+               $this->cache[$key] = $result;
+       }
+}
index 8a95ae7..0376803 100644 (file)
@@ -138,6 +138,9 @@ class MultiWriteBagOStuffTest extends MediaWikiTestCase {
                $this->assertSame( 'special', $cache->makeGlobalKey( 'a', 'b' ) );
        }
 
+       /**
+        * @covers MultiWriteBagOStuff::add
+        */
        public function testDuplicateStoreAdd() {
                $bag = new HashBagOStuff();
                $cache = new MultiWriteBagOStuff( [
index b7dbe0b..4c92545 100644 (file)
@@ -672,7 +672,7 @@ class DatabaseMysqlBaseTest extends PHPUnit\Framework\TestCase {
                $this->assertSame( 'CAST( fieldName AS SIGNED )', $output );
        }
 
-       /*
+       /**
         * @covers Wikimedia\Rdbms\Database::setIndexAliases
         */
        public function testIndexAliases() {
index 4a9603c..d739839 100644 (file)
@@ -311,8 +311,8 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
        /**
         * @covers Wikimedia\Rdbms\Subquery
         * @dataProvider provideSelectRowCount
-        * @param $sql
-        * @param $sqlText
+        * @param array $sql
+        * @param string $sqlText
         */
        public function testSelectRowCount( $sql, $sqlText ) {
                $this->database->selectRowCount(
@@ -740,6 +740,10 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                ];
        }
 
+       /**
+        * @covers Wikimedia\Rdbms\Database::insertSelect
+        * @covers Wikimedia\Rdbms\Database::nativeInsertSelect
+        */
        public function testInsertSelectBatching() {
                $dbWeb = new DatabaseTestHelper( __CLASS__, [ 'cliMode' => false ] );
                $rows = [];
@@ -1874,6 +1878,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
 
        /**
         * @expectedException \Wikimedia\Rdbms\DBTransactionStateError
+        * @covers \Wikimedia\Rdbms\Database::assertTransactionStatus
         */
        public function testTransactionErrorState1() {
                $wrapper = TestingAccessWrapper::newFromObject( $this->database );
diff --git a/tests/phpunit/includes/media/GIFHandlerTest.php b/tests/phpunit/includes/media/GIFHandlerTest.php
new file mode 100644 (file)
index 0000000..4dd7443
--- /dev/null
@@ -0,0 +1,172 @@
+<?php
+
+/**
+ * @group Media
+ */
+class GIFHandlerTest extends MediaWikiMediaTestCase {
+
+       /** @var GIFHandler */
+       protected $handler;
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->handler = new GIFHandler();
+       }
+
+       /**
+        * @covers GIFHandler::getMetadata
+        */
+       public function testInvalidFile() {
+               $res = $this->handler->getMetadata( null, $this->filePath . '/README' );
+               $this->assertEquals( GIFHandler::BROKEN_FILE, $res );
+       }
+
+       /**
+        * @param string $filename Basename of the file to check
+        * @param bool $expected Expected result.
+        * @dataProvider provideIsAnimated
+        * @covers GIFHandler::isAnimatedImage
+        */
+       public function testIsAnimanted( $filename, $expected ) {
+               $file = $this->dataFile( $filename, 'image/gif' );
+               $actual = $this->handler->isAnimatedImage( $file );
+               $this->assertEquals( $expected, $actual );
+       }
+
+       public static function provideIsAnimated() {
+               return [
+                       [ 'animated.gif', true ],
+                       [ 'nonanimated.gif', false ],
+               ];
+       }
+
+       /**
+        * @param string $filename
+        * @param int $expected Total image area
+        * @dataProvider provideGetImageArea
+        * @covers GIFHandler::getImageArea
+        */
+       public function testGetImageArea( $filename, $expected ) {
+               $file = $this->dataFile( $filename, 'image/gif' );
+               $actual = $this->handler->getImageArea( $file, $file->getWidth(), $file->getHeight() );
+               $this->assertEquals( $expected, $actual );
+       }
+
+       public static function provideGetImageArea() {
+               return [
+                       [ 'animated.gif', 5400 ],
+                       [ 'nonanimated.gif', 1350 ],
+               ];
+       }
+
+       /**
+        * @param string $metadata Serialized metadata
+        * @param int $expected One of the class constants of GIFHandler
+        * @dataProvider provideIsMetadataValid
+        * @covers GIFHandler::isMetadataValid
+        */
+       public function testIsMetadataValid( $metadata, $expected ) {
+               $actual = $this->handler->isMetadataValid( null, $metadata );
+               $this->assertEquals( $expected, $actual );
+       }
+
+       public static function provideIsMetadataValid() {
+               // phpcs:disable Generic.Files.LineLength
+               return [
+                       [ GIFHandler::BROKEN_FILE, GIFHandler::METADATA_GOOD ],
+                       [ '', GIFHandler::METADATA_BAD ],
+                       [ null, GIFHandler::METADATA_BAD ],
+                       [ 'Something invalid!', GIFHandler::METADATA_BAD ],
+                       [
+                               'a:4:{s:10:"frameCount";i:1;s:6:"looped";b:0;s:8:"duration";d:0.1000000000000000055511151231257827021181583404541015625;s:8:"metadata";a:2:{s:14:"GIFFileComment";a:1:{i:0;s:35:"GIF test file ⁕ Created with GIMP";}s:15:"_MW_GIF_VERSION";i:1;}}',
+                               GIFHandler::METADATA_GOOD
+                       ],
+               ];
+               // phpcs:enable
+       }
+
+       /**
+        * @param string $filename
+        * @param string $expected Serialized array
+        * @dataProvider provideGetMetadata
+        * @covers GIFHandler::getMetadata
+        */
+       public function testGetMetadata( $filename, $expected ) {
+               $file = $this->dataFile( $filename, 'image/gif' );
+               $actual = $this->handler->getMetadata( $file, "$this->filePath/$filename" );
+               $this->assertEquals( unserialize( $expected ), unserialize( $actual ) );
+       }
+
+       public static function provideGetMetadata() {
+               // phpcs:disable Generic.Files.LineLength
+               return [
+                       [
+                               'nonanimated.gif',
+                               'a:4:{s:10:"frameCount";i:1;s:6:"looped";b:0;s:8:"duration";d:0.1000000000000000055511151231257827021181583404541015625;s:8:"metadata";a:2:{s:14:"GIFFileComment";a:1:{i:0;s:35:"GIF test file ⁕ Created with GIMP";}s:15:"_MW_GIF_VERSION";i:1;}}'
+                       ],
+                       [
+                               'animated-xmp.gif',
+                               'a:4:{s:10:"frameCount";i:4;s:6:"looped";b:1;s:8:"duration";d:2.399999999999999911182158029987476766109466552734375;s:8:"metadata";a:5:{s:6:"Artist";s:7:"Bawolff";s:16:"ImageDescription";a:2:{s:9:"x-default";s:18:"A file to test GIF";s:5:"_type";s:4:"lang";}s:15:"SublocationDest";s:13:"The interwebs";s:14:"GIFFileComment";a:1:{i:0;s:16:"GIƒ·test·file";}s:15:"_MW_GIF_VERSION";i:1;}}'
+                       ],
+               ];
+               // phpcs:enable
+       }
+
+       /**
+        * @param string $filename
+        * @param string $expected Serialized array
+        * @dataProvider provideGetIndependentMetaArray
+        * @covers GIFHandler::getCommonMetaArray
+        */
+       public function testGetIndependentMetaArray( $filename, $expected ) {
+               $file = $this->dataFile( $filename, 'image/gif' );
+               $actual = $this->handler->getCommonMetaArray( $file );
+               $this->assertEquals( $expected, $actual );
+       }
+
+       public static function provideGetIndependentMetaArray() {
+               return [
+                       [ 'nonanimated.gif', [
+                               'GIFFileComment' => [
+                                       'GIF test file ⁕ Created with GIMP',
+                               ],
+                       ] ],
+                       [ 'animated-xmp.gif',
+                               [
+                                       'Artist' => 'Bawolff',
+                                       'ImageDescription' => [
+                                               'x-default' => 'A file to test GIF',
+                                               '_type' => 'lang',
+                                       ],
+                                       'SublocationDest' => 'The interwebs',
+                                       'GIFFileComment' =>
+                                       [
+                                               'GIƒ·test·file',
+                                       ],
+                               ]
+                       ],
+               ];
+       }
+
+       /**
+        * @param string $filename
+        * @param float $expectedLength
+        * @dataProvider provideGetLength
+        * @covers GIFHandler::getLength
+        */
+       public function testGetLength( $filename, $expectedLength ) {
+               $file = $this->dataFile( $filename, 'image/gif' );
+               $actualLength = $file->getLength();
+               $this->assertEquals( $expectedLength, $actualLength, '', 0.00001 );
+       }
+
+       public function provideGetLength() {
+               return [
+                       [ 'animated.gif', 2.4 ],
+                       [ 'animated-xmp.gif', 2.4 ],
+                       [ 'nonanimated', 0.0 ],
+                       [ 'Bishzilla_blink.gif', 1.4 ],
+               ];
+       }
+}
diff --git a/tests/phpunit/includes/media/GIFTest.php b/tests/phpunit/includes/media/GIFTest.php
deleted file mode 100644 (file)
index 4dd7443..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-<?php
-
-/**
- * @group Media
- */
-class GIFHandlerTest extends MediaWikiMediaTestCase {
-
-       /** @var GIFHandler */
-       protected $handler;
-
-       protected function setUp() {
-               parent::setUp();
-
-               $this->handler = new GIFHandler();
-       }
-
-       /**
-        * @covers GIFHandler::getMetadata
-        */
-       public function testInvalidFile() {
-               $res = $this->handler->getMetadata( null, $this->filePath . '/README' );
-               $this->assertEquals( GIFHandler::BROKEN_FILE, $res );
-       }
-
-       /**
-        * @param string $filename Basename of the file to check
-        * @param bool $expected Expected result.
-        * @dataProvider provideIsAnimated
-        * @covers GIFHandler::isAnimatedImage
-        */
-       public function testIsAnimanted( $filename, $expected ) {
-               $file = $this->dataFile( $filename, 'image/gif' );
-               $actual = $this->handler->isAnimatedImage( $file );
-               $this->assertEquals( $expected, $actual );
-       }
-
-       public static function provideIsAnimated() {
-               return [
-                       [ 'animated.gif', true ],
-                       [ 'nonanimated.gif', false ],
-               ];
-       }
-
-       /**
-        * @param string $filename
-        * @param int $expected Total image area
-        * @dataProvider provideGetImageArea
-        * @covers GIFHandler::getImageArea
-        */
-       public function testGetImageArea( $filename, $expected ) {
-               $file = $this->dataFile( $filename, 'image/gif' );
-               $actual = $this->handler->getImageArea( $file, $file->getWidth(), $file->getHeight() );
-               $this->assertEquals( $expected, $actual );
-       }
-
-       public static function provideGetImageArea() {
-               return [
-                       [ 'animated.gif', 5400 ],
-                       [ 'nonanimated.gif', 1350 ],
-               ];
-       }
-
-       /**
-        * @param string $metadata Serialized metadata
-        * @param int $expected One of the class constants of GIFHandler
-        * @dataProvider provideIsMetadataValid
-        * @covers GIFHandler::isMetadataValid
-        */
-       public function testIsMetadataValid( $metadata, $expected ) {
-               $actual = $this->handler->isMetadataValid( null, $metadata );
-               $this->assertEquals( $expected, $actual );
-       }
-
-       public static function provideIsMetadataValid() {
-               // phpcs:disable Generic.Files.LineLength
-               return [
-                       [ GIFHandler::BROKEN_FILE, GIFHandler::METADATA_GOOD ],
-                       [ '', GIFHandler::METADATA_BAD ],
-                       [ null, GIFHandler::METADATA_BAD ],
-                       [ 'Something invalid!', GIFHandler::METADATA_BAD ],
-                       [
-                               'a:4:{s:10:"frameCount";i:1;s:6:"looped";b:0;s:8:"duration";d:0.1000000000000000055511151231257827021181583404541015625;s:8:"metadata";a:2:{s:14:"GIFFileComment";a:1:{i:0;s:35:"GIF test file ⁕ Created with GIMP";}s:15:"_MW_GIF_VERSION";i:1;}}',
-                               GIFHandler::METADATA_GOOD
-                       ],
-               ];
-               // phpcs:enable
-       }
-
-       /**
-        * @param string $filename
-        * @param string $expected Serialized array
-        * @dataProvider provideGetMetadata
-        * @covers GIFHandler::getMetadata
-        */
-       public function testGetMetadata( $filename, $expected ) {
-               $file = $this->dataFile( $filename, 'image/gif' );
-               $actual = $this->handler->getMetadata( $file, "$this->filePath/$filename" );
-               $this->assertEquals( unserialize( $expected ), unserialize( $actual ) );
-       }
-
-       public static function provideGetMetadata() {
-               // phpcs:disable Generic.Files.LineLength
-               return [
-                       [
-                               'nonanimated.gif',
-                               'a:4:{s:10:"frameCount";i:1;s:6:"looped";b:0;s:8:"duration";d:0.1000000000000000055511151231257827021181583404541015625;s:8:"metadata";a:2:{s:14:"GIFFileComment";a:1:{i:0;s:35:"GIF test file ⁕ Created with GIMP";}s:15:"_MW_GIF_VERSION";i:1;}}'
-                       ],
-                       [
-                               'animated-xmp.gif',
-                               'a:4:{s:10:"frameCount";i:4;s:6:"looped";b:1;s:8:"duration";d:2.399999999999999911182158029987476766109466552734375;s:8:"metadata";a:5:{s:6:"Artist";s:7:"Bawolff";s:16:"ImageDescription";a:2:{s:9:"x-default";s:18:"A file to test GIF";s:5:"_type";s:4:"lang";}s:15:"SublocationDest";s:13:"The interwebs";s:14:"GIFFileComment";a:1:{i:0;s:16:"GIƒ·test·file";}s:15:"_MW_GIF_VERSION";i:1;}}'
-                       ],
-               ];
-               // phpcs:enable
-       }
-
-       /**
-        * @param string $filename
-        * @param string $expected Serialized array
-        * @dataProvider provideGetIndependentMetaArray
-        * @covers GIFHandler::getCommonMetaArray
-        */
-       public function testGetIndependentMetaArray( $filename, $expected ) {
-               $file = $this->dataFile( $filename, 'image/gif' );
-               $actual = $this->handler->getCommonMetaArray( $file );
-               $this->assertEquals( $expected, $actual );
-       }
-
-       public static function provideGetIndependentMetaArray() {
-               return [
-                       [ 'nonanimated.gif', [
-                               'GIFFileComment' => [
-                                       'GIF test file ⁕ Created with GIMP',
-                               ],
-                       ] ],
-                       [ 'animated-xmp.gif',
-                               [
-                                       'Artist' => 'Bawolff',
-                                       'ImageDescription' => [
-                                               'x-default' => 'A file to test GIF',
-                                               '_type' => 'lang',
-                                       ],
-                                       'SublocationDest' => 'The interwebs',
-                                       'GIFFileComment' =>
-                                       [
-                                               'GIƒ·test·file',
-                                       ],
-                               ]
-                       ],
-               ];
-       }
-
-       /**
-        * @param string $filename
-        * @param float $expectedLength
-        * @dataProvider provideGetLength
-        * @covers GIFHandler::getLength
-        */
-       public function testGetLength( $filename, $expectedLength ) {
-               $file = $this->dataFile( $filename, 'image/gif' );
-               $actualLength = $file->getLength();
-               $this->assertEquals( $expectedLength, $actualLength, '', 0.00001 );
-       }
-
-       public function provideGetLength() {
-               return [
-                       [ 'animated.gif', 2.4 ],
-                       [ 'animated-xmp.gif', 2.4 ],
-                       [ 'nonanimated', 0.0 ],
-                       [ 'Bishzilla_blink.gif', 1.4 ],
-               ];
-       }
-}
index 6815a62..c0a3e90 100644 (file)
@@ -4,8 +4,6 @@
  *
  * @group Media
  * @group medium
- *
- * @todo covers tags
  */
 class JpegPixelFormatTest extends MediaWikiMediaTestCase {
 
@@ -23,6 +21,7 @@ class JpegPixelFormatTest extends MediaWikiMediaTestCase {
        /**
         *
         * @dataProvider providePixelFormats
+        * @covers BitmapHandler::imageMagickSubsampling
         */
        public function testPixelFormatRendering( $sourceFile, $pixelFormat, $samplingFactor ) {
                global $wgUseImageMagick, $wgUseImageResize;
diff --git a/tests/phpunit/includes/media/PNGHandlerTest.php b/tests/phpunit/includes/media/PNGHandlerTest.php
new file mode 100644 (file)
index 0000000..5a66586
--- /dev/null
@@ -0,0 +1,161 @@
+<?php
+
+/**
+ * @group Media
+ */
+class PNGHandlerTest extends MediaWikiMediaTestCase {
+
+       /** @var PNGHandler */
+       protected $handler;
+
+       protected function setUp() {
+               parent::setUp();
+               $this->handler = new PNGHandler();
+       }
+
+       /**
+        * @covers PNGHandler::getMetadata
+        */
+       public function testInvalidFile() {
+               $res = $this->handler->getMetadata( null, $this->filePath . '/README' );
+               $this->assertEquals( PNGHandler::BROKEN_FILE, $res );
+       }
+
+       /**
+        * @param string $filename Basename of the file to check
+        * @param bool $expected Expected result.
+        * @dataProvider provideIsAnimated
+        * @covers PNGHandler::isAnimatedImage
+        */
+       public function testIsAnimanted( $filename, $expected ) {
+               $file = $this->dataFile( $filename, 'image/png' );
+               $actual = $this->handler->isAnimatedImage( $file );
+               $this->assertEquals( $expected, $actual );
+       }
+
+       public static function provideIsAnimated() {
+               return [
+                       [ 'Animated_PNG_example_bouncing_beach_ball.png', true ],
+                       [ '1bit-png.png', false ],
+               ];
+       }
+
+       /**
+        * @param string $filename
+        * @param int $expected Total image area
+        * @dataProvider provideGetImageArea
+        * @covers PNGHandler::getImageArea
+        */
+       public function testGetImageArea( $filename, $expected ) {
+               $file = $this->dataFile( $filename, 'image/png' );
+               $actual = $this->handler->getImageArea( $file, $file->getWidth(), $file->getHeight() );
+               $this->assertEquals( $expected, $actual );
+       }
+
+       public static function provideGetImageArea() {
+               return [
+                       [ '1bit-png.png', 2500 ],
+                       [ 'greyscale-png.png', 2500 ],
+                       [ 'Png-native-test.png', 126000 ],
+                       [ 'Animated_PNG_example_bouncing_beach_ball.png', 10000 ],
+               ];
+       }
+
+       /**
+        * @param string $metadata Serialized metadata
+        * @param int $expected One of the class constants of PNGHandler
+        * @dataProvider provideIsMetadataValid
+        * @covers PNGHandler::isMetadataValid
+        */
+       public function testIsMetadataValid( $metadata, $expected ) {
+               $actual = $this->handler->isMetadataValid( null, $metadata );
+               $this->assertEquals( $expected, $actual );
+       }
+
+       public static function provideIsMetadataValid() {
+               // phpcs:disable Generic.Files.LineLength
+               return [
+                       [ PNGHandler::BROKEN_FILE, PNGHandler::METADATA_GOOD ],
+                       [ '', PNGHandler::METADATA_BAD ],
+                       [ null, PNGHandler::METADATA_BAD ],
+                       [ 'Something invalid!', PNGHandler::METADATA_BAD ],
+                       [
+                               'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:8;s:9:"colorType";s:10:"truecolour";s:8:"metadata";a:1:{s:15:"_MW_PNG_VERSION";i:1;}}',
+                               PNGHandler::METADATA_GOOD
+                       ],
+               ];
+               // phpcs:enable
+       }
+
+       /**
+        * @param string $filename
+        * @param string $expected Serialized array
+        * @dataProvider provideGetMetadata
+        * @covers PNGHandler::getMetadata
+        */
+       public function testGetMetadata( $filename, $expected ) {
+               $file = $this->dataFile( $filename, 'image/png' );
+               $actual = $this->handler->getMetadata( $file, "$this->filePath/$filename" );
+//             $this->assertEquals( unserialize( $expected ), unserialize( $actual ) );
+               $this->assertEquals( ( $expected ), ( $actual ) );
+       }
+
+       public static function provideGetMetadata() {
+               // phpcs:disable Generic.Files.LineLength
+               return [
+                       [
+                               'rgb-na-png.png',
+                               'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:8;s:9:"colorType";s:10:"truecolour";s:8:"metadata";a:1:{s:15:"_MW_PNG_VERSION";i:1;}}'
+                       ],
+                       [
+                               'xmp.png',
+                               'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:1;s:9:"colorType";s:14:"index-coloured";s:8:"metadata";a:2:{s:12:"SerialNumber";s:9:"123456789";s:15:"_MW_PNG_VERSION";i:1;}}'
+                       ],
+               ];
+               // phpcs:enable
+       }
+
+       /**
+        * @param string $filename
+        * @param array $expected Expected standard metadata
+        * @dataProvider provideGetIndependentMetaArray
+        * @covers PNGHandler::getCommonMetaArray
+        */
+       public function testGetIndependentMetaArray( $filename, $expected ) {
+               $file = $this->dataFile( $filename, 'image/png' );
+               $actual = $this->handler->getCommonMetaArray( $file );
+               $this->assertEquals( $expected, $actual );
+       }
+
+       public static function provideGetIndependentMetaArray() {
+               return [
+                       [ 'rgb-na-png.png', [] ],
+                       [ 'xmp.png',
+                               [
+                                       'SerialNumber' => '123456789',
+                               ]
+                       ],
+               ];
+       }
+
+       /**
+        * @param string $filename
+        * @param float $expectedLength
+        * @dataProvider provideGetLength
+        * @covers PNGHandler::getLength
+        */
+       public function testGetLength( $filename, $expectedLength ) {
+               $file = $this->dataFile( $filename, 'image/png' );
+               $actualLength = $file->getLength();
+               $this->assertEquals( $expectedLength, $actualLength, '', 0.00001 );
+       }
+
+       public function provideGetLength() {
+               return [
+                       [ 'Animated_PNG_example_bouncing_beach_ball.png', 1.5 ],
+                       [ 'Png-native-test.png', 0.0 ],
+                       [ 'greyscale-png.png', 0.0 ],
+                       [ '1bit-png.png', 0.0 ],
+               ];
+       }
+}
diff --git a/tests/phpunit/includes/media/PNGTest.php b/tests/phpunit/includes/media/PNGTest.php
deleted file mode 100644 (file)
index 5a66586..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-<?php
-
-/**
- * @group Media
- */
-class PNGHandlerTest extends MediaWikiMediaTestCase {
-
-       /** @var PNGHandler */
-       protected $handler;
-
-       protected function setUp() {
-               parent::setUp();
-               $this->handler = new PNGHandler();
-       }
-
-       /**
-        * @covers PNGHandler::getMetadata
-        */
-       public function testInvalidFile() {
-               $res = $this->handler->getMetadata( null, $this->filePath . '/README' );
-               $this->assertEquals( PNGHandler::BROKEN_FILE, $res );
-       }
-
-       /**
-        * @param string $filename Basename of the file to check
-        * @param bool $expected Expected result.
-        * @dataProvider provideIsAnimated
-        * @covers PNGHandler::isAnimatedImage
-        */
-       public function testIsAnimanted( $filename, $expected ) {
-               $file = $this->dataFile( $filename, 'image/png' );
-               $actual = $this->handler->isAnimatedImage( $file );
-               $this->assertEquals( $expected, $actual );
-       }
-
-       public static function provideIsAnimated() {
-               return [
-                       [ 'Animated_PNG_example_bouncing_beach_ball.png', true ],
-                       [ '1bit-png.png', false ],
-               ];
-       }
-
-       /**
-        * @param string $filename
-        * @param int $expected Total image area
-        * @dataProvider provideGetImageArea
-        * @covers PNGHandler::getImageArea
-        */
-       public function testGetImageArea( $filename, $expected ) {
-               $file = $this->dataFile( $filename, 'image/png' );
-               $actual = $this->handler->getImageArea( $file, $file->getWidth(), $file->getHeight() );
-               $this->assertEquals( $expected, $actual );
-       }
-
-       public static function provideGetImageArea() {
-               return [
-                       [ '1bit-png.png', 2500 ],
-                       [ 'greyscale-png.png', 2500 ],
-                       [ 'Png-native-test.png', 126000 ],
-                       [ 'Animated_PNG_example_bouncing_beach_ball.png', 10000 ],
-               ];
-       }
-
-       /**
-        * @param string $metadata Serialized metadata
-        * @param int $expected One of the class constants of PNGHandler
-        * @dataProvider provideIsMetadataValid
-        * @covers PNGHandler::isMetadataValid
-        */
-       public function testIsMetadataValid( $metadata, $expected ) {
-               $actual = $this->handler->isMetadataValid( null, $metadata );
-               $this->assertEquals( $expected, $actual );
-       }
-
-       public static function provideIsMetadataValid() {
-               // phpcs:disable Generic.Files.LineLength
-               return [
-                       [ PNGHandler::BROKEN_FILE, PNGHandler::METADATA_GOOD ],
-                       [ '', PNGHandler::METADATA_BAD ],
-                       [ null, PNGHandler::METADATA_BAD ],
-                       [ 'Something invalid!', PNGHandler::METADATA_BAD ],
-                       [
-                               'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:8;s:9:"colorType";s:10:"truecolour";s:8:"metadata";a:1:{s:15:"_MW_PNG_VERSION";i:1;}}',
-                               PNGHandler::METADATA_GOOD
-                       ],
-               ];
-               // phpcs:enable
-       }
-
-       /**
-        * @param string $filename
-        * @param string $expected Serialized array
-        * @dataProvider provideGetMetadata
-        * @covers PNGHandler::getMetadata
-        */
-       public function testGetMetadata( $filename, $expected ) {
-               $file = $this->dataFile( $filename, 'image/png' );
-               $actual = $this->handler->getMetadata( $file, "$this->filePath/$filename" );
-//             $this->assertEquals( unserialize( $expected ), unserialize( $actual ) );
-               $this->assertEquals( ( $expected ), ( $actual ) );
-       }
-
-       public static function provideGetMetadata() {
-               // phpcs:disable Generic.Files.LineLength
-               return [
-                       [
-                               'rgb-na-png.png',
-                               'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:8;s:9:"colorType";s:10:"truecolour";s:8:"metadata";a:1:{s:15:"_MW_PNG_VERSION";i:1;}}'
-                       ],
-                       [
-                               'xmp.png',
-                               'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:1;s:9:"colorType";s:14:"index-coloured";s:8:"metadata";a:2:{s:12:"SerialNumber";s:9:"123456789";s:15:"_MW_PNG_VERSION";i:1;}}'
-                       ],
-               ];
-               // phpcs:enable
-       }
-
-       /**
-        * @param string $filename
-        * @param array $expected Expected standard metadata
-        * @dataProvider provideGetIndependentMetaArray
-        * @covers PNGHandler::getCommonMetaArray
-        */
-       public function testGetIndependentMetaArray( $filename, $expected ) {
-               $file = $this->dataFile( $filename, 'image/png' );
-               $actual = $this->handler->getCommonMetaArray( $file );
-               $this->assertEquals( $expected, $actual );
-       }
-
-       public static function provideGetIndependentMetaArray() {
-               return [
-                       [ 'rgb-na-png.png', [] ],
-                       [ 'xmp.png',
-                               [
-                                       'SerialNumber' => '123456789',
-                               ]
-                       ],
-               ];
-       }
-
-       /**
-        * @param string $filename
-        * @param float $expectedLength
-        * @dataProvider provideGetLength
-        * @covers PNGHandler::getLength
-        */
-       public function testGetLength( $filename, $expectedLength ) {
-               $file = $this->dataFile( $filename, 'image/png' );
-               $actualLength = $file->getLength();
-               $this->assertEquals( $expectedLength, $actualLength, '', 0.00001 );
-       }
-
-       public function provideGetLength() {
-               return [
-                       [ 'Animated_PNG_example_bouncing_beach_ball.png', 1.5 ],
-                       [ 'Png-native-test.png', 0.0 ],
-                       [ 'greyscale-png.png', 0.0 ],
-                       [ '1bit-png.png', 0.0 ],
-               ];
-       }
-}
index 9c98ada..bce7ac2 100644 (file)
@@ -182,7 +182,7 @@ class SvgHandlerTest extends MediaWikiMediaTestCase {
         * @covers SvgHandler::normaliseParamsInternal()
         * @dataProvider provideNormaliseParamsInternal
         *
-        * @param $message
+        * @param string $message
         * @param int $width
         * @param int $height
         * @param array $params
diff --git a/tests/phpunit/includes/media/WebPHandlerTest.php b/tests/phpunit/includes/media/WebPHandlerTest.php
new file mode 100644 (file)
index 0000000..ac0ad98
--- /dev/null
@@ -0,0 +1,151 @@
+<?php
+
+/**
+ * @covers WebPHandler
+ */
+class WebPHandlerTest extends MediaWikiTestCase {
+       public function setUp() {
+               parent::setUp();
+               // Allocated file for testing
+               $this->tempFileName = tempnam( wfTempDir(), 'WEBP' );
+       }
+
+       public function tearDown() {
+               parent::tearDown();
+               unlink( $this->tempFileName );
+       }
+
+       /**
+        * @dataProvider provideTestExtractMetaData
+        */
+       public function testExtractMetaData( $header, $expectedResult ) {
+               // Put header into file
+               file_put_contents( $this->tempFileName, $header );
+
+               $this->assertEquals( $expectedResult, WebPHandler::extractMetadata( $this->tempFileName ) );
+       }
+
+       public function provideTestExtractMetaData() {
+               // phpcs:disable Generic.Files.LineLength
+               return [
+                       // Files from https://developers.google.com/speed/webp/gallery2
+                       [ "\x52\x49\x46\x46\x90\x68\x01\x00\x57\x45\x42\x50\x56\x50\x38\x4C\x83\x68\x01\x00\x2F\x8F\x01\x4B\x10\x8D\x38\x6C\xDB\x46\x92\xE0\xE0\x82\x7B\x6C",
+                               [ 'compression' => 'lossless', 'width' => 400, 'height' => 301 ] ],
+                       [ "\x52\x49\x46\x46\x64\x5B\x00\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x8F\x01\x00\x2C\x01\x00\x41\x4C\x50\x48\xE5\x0E",
+                               [ 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 400, 'height' => 301 ] ],
+                       [ "\x52\x49\x46\x46\xA8\x72\x00\x00\x57\x45\x42\x50\x56\x50\x38\x4C\x9B\x72\x00\x00\x2F\x81\x81\x62\x10\x8D\x40\x8C\x24\x39\x6E\x73\x73\x38\x01\x96",
+                               [ 'compression' => 'lossless', 'width' => 386, 'height' => 395 ] ],
+                       [ "\x52\x49\x46\x46\xE0\x42\x00\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x81\x01\x00\x8A\x01\x00\x41\x4C\x50\x48\x56\x10",
+                               [ 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 386, 'height' => 395 ] ],
+                       [ "\x52\x49\x46\x46\x70\x61\x02\x00\x57\x45\x42\x50\x56\x50\x38\x4C\x63\x61\x02\x00\x2F\x1F\xC3\x95\x10\x8D\xC8\x72\xDB\xC8\x92\x24\xD8\x91\xD9\x91",
+                               [ 'compression' => 'lossless', 'width' => 800, 'height' => 600 ] ],
+                       [ "\x52\x49\x46\x46\x1C\x1D\x01\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x1F\x03\x00\x57\x02\x00\x41\x4C\x50\x48\x25\x8B",
+                               [ 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 800, 'height' => 600 ] ],
+                       [ "\x52\x49\x46\x46\xFA\xC5\x00\x00\x57\x45\x42\x50\x56\x50\x38\x4C\xEE\xC5\x00\x00\x2F\xA4\x81\x28\x10\x8D\x40\x68\x24\xC9\x91\xA4\xAE\xF3\x97\x75",
+                               [ 'compression' => 'lossless', 'width' => 421, 'height' => 163 ] ],
+                       [ "\x52\x49\x46\x46\xF6\x5D\x00\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\xA4\x01\x00\xA2\x00\x00\x41\x4C\x50\x48\x38\x1A",
+                               [ 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 421, 'height' => 163 ] ],
+                       [ "\x52\x49\x46\x46\xC4\x96\x01\x00\x57\x45\x42\x50\x56\x50\x38\x4C\xB8\x96\x01\x00\x2F\x2B\xC1\x4A\x10\x11\x87\x6D\xDB\x48\x12\xFC\x60\xB0\x83\x24",
+                               [ 'compression' => 'lossless', 'width' => 300, 'height' => 300 ] ],
+                       [ "\x52\x49\x46\x46\x0A\x11\x01\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x2B\x01\x00\x2B\x01\x00\x41\x4C\x50\x48\x67\x6E",
+                               [ 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 300, 'height' => 300 ] ],
+
+                       // Lossy files from https://developers.google.com/speed/webp/gallery1
+                       [ "\x52\x49\x46\x46\x68\x76\x00\x00\x57\x45\x42\x50\x56\x50\x38\x20\x5C\x76\x00\x00\xD2\xBE\x01\x9D\x01\x2A\x26\x02\x70\x01\x3E\xD5\x4E\x97\x43\xA2",
+                               [ 'compression' => 'lossy', 'width' => 550, 'height' => 368 ] ],
+                       [ "\x52\x49\x46\x46\xB0\xEC\x00\x00\x57\x45\x42\x50\x56\x50\x38\x20\xA4\xEC\x00\x00\xB2\x4B\x02\x9D\x01\x2A\x26\x02\x94\x01\x3E\xD1\x50\x96\x46\x26",
+                               [ 'compression' => 'lossy', 'width' => 550, 'height' => 404 ] ],
+                       [ "\x52\x49\x46\x46\x7A\x19\x03\x00\x57\x45\x42\x50\x56\x50\x38\x20\x6E\x19\x03\x00\xB2\xF8\x09\x9D\x01\x2A\x00\x05\xD0\x02\x3E\xAD\x46\x99\x4A\xA5",
+                               [ 'compression' => 'lossy', 'width' => 1280, 'height' => 720 ] ],
+                       [ "\x52\x49\x46\x46\x44\xB3\x02\x00\x57\x45\x42\x50\x56\x50\x38\x20\x38\xB3\x02\x00\x52\x57\x06\x9D\x01\x2A\x00\x04\x04\x03\x3E\xA5\x44\x96\x49\x26",
+                               [ 'compression' => 'lossy', 'width' => 1024, 'height' => 772 ] ],
+                       [ "\x52\x49\x46\x46\x02\x43\x01\x00\x57\x45\x42\x50\x56\x50\x38\x20\xF6\x42\x01\x00\x12\xC0\x05\x9D\x01\x2A\x00\x04\xF0\x02\x3E\x79\x34\x93\x47\xA4",
+                               [ 'compression' => 'lossy', 'width' => 1024, 'height' => 752 ] ],
+
+                       // Animated file from https://groups.google.com/a/chromium.org/d/topic/blink-dev/Y8tRC4mdQz8/discussion
+                       [ "\x52\x49\x46\x46\xD0\x0B\x02\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x12\x00\x00\x00\x3F\x01\x00\x3F\x01\x00\x41\x4E",
+                               [ 'compression' => 'unknown', 'animated' => true, 'transparency' => true, 'width' => 320, 'height' => 320 ] ],
+
+                       // Error cases
+                       [ '', false ],
+                       [ '                                    ', false ],
+                       [ 'RIFF                                ', false ],
+                       [ 'RIFF1234WEBP                        ', false ],
+                       [ 'RIFF1234WEBPVP8                     ', false ],
+                       [ 'RIFF1234WEBPVP8L                    ', false ],
+               ];
+               // phpcs:enable
+       }
+
+       /**
+        * @dataProvider provideTestWithFileExtractMetaData
+        */
+       public function testWithFileExtractMetaData( $filename, $expectedResult ) {
+               $this->assertEquals( $expectedResult, WebPHandler::extractMetadata( $filename ) );
+       }
+
+       public function provideTestWithFileExtractMetaData() {
+               return [
+                       [ __DIR__ . '/../../data/media/2_webp_ll.webp',
+                               [
+                                       'compression' => 'lossless',
+                                       'width' => 386,
+                                       'height' => 395
+                               ]
+                       ],
+                       [ __DIR__ . '/../../data/media/2_webp_a.webp',
+                               [
+                                       'compression' => 'lossy',
+                                       'animated' => false,
+                                       'transparency' => true,
+                                       'width' => 386,
+                                       'height' => 395
+                               ]
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideTestGetImageSize
+        */
+       public function testGetImageSize( $path, $expectedResult ) {
+               $handler = new WebPHandler();
+               $this->assertEquals( $expectedResult, $handler->getImageSize( null, $path ) );
+       }
+
+       public function provideTestGetImageSize() {
+               return [
+                       // Public domain files from https://developers.google.com/speed/webp/gallery2
+                       [ __DIR__ . '/../../data/media/2_webp_a.webp', [ 386, 395 ] ],
+                       [ __DIR__ . '/../../data/media/2_webp_ll.webp', [ 386, 395 ] ],
+                       [ __DIR__ . '/../../data/media/webp_animated.webp', [ 300, 225 ] ],
+
+                       // Error cases
+                       [ __FILE__, false ],
+               ];
+       }
+
+       /**
+        * Tests the WebP MIME detection. This should really be a separate test, but sticking it
+        * here for now.
+        *
+        * @dataProvider provideTestGetMimeType
+        */
+       public function testGuessMimeType( $path ) {
+               $mime = MediaWiki\MediaWikiServices::getInstance()->getMimeAnalyzer();
+               $this->assertEquals( 'image/webp', $mime->guessMimeType( $path, false ) );
+       }
+
+       public function provideTestGetMimeType() {
+               return [
+                               // Public domain files from https://developers.google.com/speed/webp/gallery2
+                               [ __DIR__ . '/../../data/media/2_webp_a.webp' ],
+                               [ __DIR__ . '/../../data/media/2_webp_ll.webp' ],
+                               [ __DIR__ . '/../../data/media/webp_animated.webp' ],
+               ];
+       }
+}
+
+/* Python code to extract a header and convert to PHP format:
+ * print '"%s"' % ''.implode( '\\x%02X' % ord(c) for c in urllib.urlopen(url).read(36) )
+ */
diff --git a/tests/phpunit/includes/media/WebPTest.php b/tests/phpunit/includes/media/WebPTest.php
deleted file mode 100644 (file)
index ac0ad98..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-<?php
-
-/**
- * @covers WebPHandler
- */
-class WebPHandlerTest extends MediaWikiTestCase {
-       public function setUp() {
-               parent::setUp();
-               // Allocated file for testing
-               $this->tempFileName = tempnam( wfTempDir(), 'WEBP' );
-       }
-
-       public function tearDown() {
-               parent::tearDown();
-               unlink( $this->tempFileName );
-       }
-
-       /**
-        * @dataProvider provideTestExtractMetaData
-        */
-       public function testExtractMetaData( $header, $expectedResult ) {
-               // Put header into file
-               file_put_contents( $this->tempFileName, $header );
-
-               $this->assertEquals( $expectedResult, WebPHandler::extractMetadata( $this->tempFileName ) );
-       }
-
-       public function provideTestExtractMetaData() {
-               // phpcs:disable Generic.Files.LineLength
-               return [
-                       // Files from https://developers.google.com/speed/webp/gallery2
-                       [ "\x52\x49\x46\x46\x90\x68\x01\x00\x57\x45\x42\x50\x56\x50\x38\x4C\x83\x68\x01\x00\x2F\x8F\x01\x4B\x10\x8D\x38\x6C\xDB\x46\x92\xE0\xE0\x82\x7B\x6C",
-                               [ 'compression' => 'lossless', 'width' => 400, 'height' => 301 ] ],
-                       [ "\x52\x49\x46\x46\x64\x5B\x00\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x8F\x01\x00\x2C\x01\x00\x41\x4C\x50\x48\xE5\x0E",
-                               [ 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 400, 'height' => 301 ] ],
-                       [ "\x52\x49\x46\x46\xA8\x72\x00\x00\x57\x45\x42\x50\x56\x50\x38\x4C\x9B\x72\x00\x00\x2F\x81\x81\x62\x10\x8D\x40\x8C\x24\x39\x6E\x73\x73\x38\x01\x96",
-                               [ 'compression' => 'lossless', 'width' => 386, 'height' => 395 ] ],
-                       [ "\x52\x49\x46\x46\xE0\x42\x00\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x81\x01\x00\x8A\x01\x00\x41\x4C\x50\x48\x56\x10",
-                               [ 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 386, 'height' => 395 ] ],
-                       [ "\x52\x49\x46\x46\x70\x61\x02\x00\x57\x45\x42\x50\x56\x50\x38\x4C\x63\x61\x02\x00\x2F\x1F\xC3\x95\x10\x8D\xC8\x72\xDB\xC8\x92\x24\xD8\x91\xD9\x91",
-                               [ 'compression' => 'lossless', 'width' => 800, 'height' => 600 ] ],
-                       [ "\x52\x49\x46\x46\x1C\x1D\x01\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x1F\x03\x00\x57\x02\x00\x41\x4C\x50\x48\x25\x8B",
-                               [ 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 800, 'height' => 600 ] ],
-                       [ "\x52\x49\x46\x46\xFA\xC5\x00\x00\x57\x45\x42\x50\x56\x50\x38\x4C\xEE\xC5\x00\x00\x2F\xA4\x81\x28\x10\x8D\x40\x68\x24\xC9\x91\xA4\xAE\xF3\x97\x75",
-                               [ 'compression' => 'lossless', 'width' => 421, 'height' => 163 ] ],
-                       [ "\x52\x49\x46\x46\xF6\x5D\x00\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\xA4\x01\x00\xA2\x00\x00\x41\x4C\x50\x48\x38\x1A",
-                               [ 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 421, 'height' => 163 ] ],
-                       [ "\x52\x49\x46\x46\xC4\x96\x01\x00\x57\x45\x42\x50\x56\x50\x38\x4C\xB8\x96\x01\x00\x2F\x2B\xC1\x4A\x10\x11\x87\x6D\xDB\x48\x12\xFC\x60\xB0\x83\x24",
-                               [ 'compression' => 'lossless', 'width' => 300, 'height' => 300 ] ],
-                       [ "\x52\x49\x46\x46\x0A\x11\x01\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x2B\x01\x00\x2B\x01\x00\x41\x4C\x50\x48\x67\x6E",
-                               [ 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 300, 'height' => 300 ] ],
-
-                       // Lossy files from https://developers.google.com/speed/webp/gallery1
-                       [ "\x52\x49\x46\x46\x68\x76\x00\x00\x57\x45\x42\x50\x56\x50\x38\x20\x5C\x76\x00\x00\xD2\xBE\x01\x9D\x01\x2A\x26\x02\x70\x01\x3E\xD5\x4E\x97\x43\xA2",
-                               [ 'compression' => 'lossy', 'width' => 550, 'height' => 368 ] ],
-                       [ "\x52\x49\x46\x46\xB0\xEC\x00\x00\x57\x45\x42\x50\x56\x50\x38\x20\xA4\xEC\x00\x00\xB2\x4B\x02\x9D\x01\x2A\x26\x02\x94\x01\x3E\xD1\x50\x96\x46\x26",
-                               [ 'compression' => 'lossy', 'width' => 550, 'height' => 404 ] ],
-                       [ "\x52\x49\x46\x46\x7A\x19\x03\x00\x57\x45\x42\x50\x56\x50\x38\x20\x6E\x19\x03\x00\xB2\xF8\x09\x9D\x01\x2A\x00\x05\xD0\x02\x3E\xAD\x46\x99\x4A\xA5",
-                               [ 'compression' => 'lossy', 'width' => 1280, 'height' => 720 ] ],
-                       [ "\x52\x49\x46\x46\x44\xB3\x02\x00\x57\x45\x42\x50\x56\x50\x38\x20\x38\xB3\x02\x00\x52\x57\x06\x9D\x01\x2A\x00\x04\x04\x03\x3E\xA5\x44\x96\x49\x26",
-                               [ 'compression' => 'lossy', 'width' => 1024, 'height' => 772 ] ],
-                       [ "\x52\x49\x46\x46\x02\x43\x01\x00\x57\x45\x42\x50\x56\x50\x38\x20\xF6\x42\x01\x00\x12\xC0\x05\x9D\x01\x2A\x00\x04\xF0\x02\x3E\x79\x34\x93\x47\xA4",
-                               [ 'compression' => 'lossy', 'width' => 1024, 'height' => 752 ] ],
-
-                       // Animated file from https://groups.google.com/a/chromium.org/d/topic/blink-dev/Y8tRC4mdQz8/discussion
-                       [ "\x52\x49\x46\x46\xD0\x0B\x02\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x12\x00\x00\x00\x3F\x01\x00\x3F\x01\x00\x41\x4E",
-                               [ 'compression' => 'unknown', 'animated' => true, 'transparency' => true, 'width' => 320, 'height' => 320 ] ],
-
-                       // Error cases
-                       [ '', false ],
-                       [ '                                    ', false ],
-                       [ 'RIFF                                ', false ],
-                       [ 'RIFF1234WEBP                        ', false ],
-                       [ 'RIFF1234WEBPVP8                     ', false ],
-                       [ 'RIFF1234WEBPVP8L                    ', false ],
-               ];
-               // phpcs:enable
-       }
-
-       /**
-        * @dataProvider provideTestWithFileExtractMetaData
-        */
-       public function testWithFileExtractMetaData( $filename, $expectedResult ) {
-               $this->assertEquals( $expectedResult, WebPHandler::extractMetadata( $filename ) );
-       }
-
-       public function provideTestWithFileExtractMetaData() {
-               return [
-                       [ __DIR__ . '/../../data/media/2_webp_ll.webp',
-                               [
-                                       'compression' => 'lossless',
-                                       'width' => 386,
-                                       'height' => 395
-                               ]
-                       ],
-                       [ __DIR__ . '/../../data/media/2_webp_a.webp',
-                               [
-                                       'compression' => 'lossy',
-                                       'animated' => false,
-                                       'transparency' => true,
-                                       'width' => 386,
-                                       'height' => 395
-                               ]
-                       ],
-               ];
-       }
-
-       /**
-        * @dataProvider provideTestGetImageSize
-        */
-       public function testGetImageSize( $path, $expectedResult ) {
-               $handler = new WebPHandler();
-               $this->assertEquals( $expectedResult, $handler->getImageSize( null, $path ) );
-       }
-
-       public function provideTestGetImageSize() {
-               return [
-                       // Public domain files from https://developers.google.com/speed/webp/gallery2
-                       [ __DIR__ . '/../../data/media/2_webp_a.webp', [ 386, 395 ] ],
-                       [ __DIR__ . '/../../data/media/2_webp_ll.webp', [ 386, 395 ] ],
-                       [ __DIR__ . '/../../data/media/webp_animated.webp', [ 300, 225 ] ],
-
-                       // Error cases
-                       [ __FILE__, false ],
-               ];
-       }
-
-       /**
-        * Tests the WebP MIME detection. This should really be a separate test, but sticking it
-        * here for now.
-        *
-        * @dataProvider provideTestGetMimeType
-        */
-       public function testGuessMimeType( $path ) {
-               $mime = MediaWiki\MediaWikiServices::getInstance()->getMimeAnalyzer();
-               $this->assertEquals( 'image/webp', $mime->guessMimeType( $path, false ) );
-       }
-
-       public function provideTestGetMimeType() {
-               return [
-                               // Public domain files from https://developers.google.com/speed/webp/gallery2
-                               [ __DIR__ . '/../../data/media/2_webp_a.webp' ],
-                               [ __DIR__ . '/../../data/media/2_webp_ll.webp' ],
-                               [ __DIR__ . '/../../data/media/webp_animated.webp' ],
-               ];
-       }
-}
-
-/* Python code to extract a header and convert to PHP format:
- * print '"%s"' % ''.implode( '\\x%02X' % ord(c) for c in urllib.urlopen(url).read(36) )
- */
diff --git a/tests/phpunit/includes/media/XCFHandlerTest.php b/tests/phpunit/includes/media/XCFHandlerTest.php
new file mode 100644 (file)
index 0000000..b75335d
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+
+/**
+ * @group Media
+ */
+class XCFHandlerTest extends MediaWikiMediaTestCase {
+
+       /** @var XCFHandler */
+       protected $handler;
+
+       protected function setUp() {
+               parent::setUp();
+               $this->handler = new XCFHandler();
+       }
+
+       /**
+        * @param string $filename
+        * @param int $expectedWidth Width
+        * @param int $expectedHeight Height
+        * @dataProvider provideGetImageSize
+        * @covers XCFHandler::getImageSize
+        */
+       public function testGetImageSize( $filename, $expectedWidth, $expectedHeight ) {
+               $file = $this->dataFile( $filename, 'image/x-xcf' );
+               $actual = $this->handler->getImageSize( $file, $file->getLocalRefPath() );
+               $this->assertEquals( $expectedWidth, $actual[0] );
+               $this->assertEquals( $expectedHeight, $actual[1] );
+       }
+
+       public static function provideGetImageSize() {
+               return [
+                       [ '80x60-2layers.xcf', 80, 60 ],
+                       [ '80x60-RGB.xcf', 80, 60 ],
+                       [ '80x60-Greyscale.xcf', 80, 60 ],
+               ];
+       }
+
+       /**
+        * @param string $metadata Serialized metadata
+        * @param int $expected One of the class constants of XCFHandler
+        * @dataProvider provideIsMetadataValid
+        * @covers XCFHandler::isMetadataValid
+        */
+       public function testIsMetadataValid( $metadata, $expected ) {
+               $actual = $this->handler->isMetadataValid( null, $metadata );
+               $this->assertEquals( $expected, $actual );
+       }
+
+       public static function provideIsMetadataValid() {
+               return [
+                       [ '', XCFHandler::METADATA_BAD ],
+                       [ serialize( [ 'error' => true ] ), XCFHandler::METADATA_GOOD ],
+                       [ false, XCFHandler::METADATA_BAD ],
+                       [ serialize( [ 'colorType' => 'greyscale-alpha' ] ), XCFHandler::METADATA_GOOD ],
+               ];
+       }
+
+       /**
+        * @param string $filename
+        * @param string $expected Serialized array
+        * @dataProvider provideGetMetadata
+        * @covers XCFHandler::getMetadata
+        */
+       public function testGetMetadata( $filename, $expected ) {
+               $file = $this->dataFile( $filename, 'image/png' );
+               $actual = $this->handler->getMetadata( $file, "$this->filePath/$filename" );
+               $this->assertEquals( $expected, $actual );
+       }
+
+       public static function provideGetMetadata() {
+               return [
+                       [ '80x60-2layers.xcf',
+                               'a:1:{s:9:"colorType";s:16:"truecolour-alpha";}'
+                       ],
+                       [ '80x60-RGB.xcf',
+                               'a:1:{s:9:"colorType";s:16:"truecolour-alpha";}'
+                       ],
+                       [ '80x60-Greyscale.xcf',
+                               'a:1:{s:9:"colorType";s:15:"greyscale-alpha";}'
+                       ],
+               ];
+       }
+}
diff --git a/tests/phpunit/includes/media/XCFTest.php b/tests/phpunit/includes/media/XCFTest.php
deleted file mode 100644 (file)
index b75335d..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-/**
- * @group Media
- */
-class XCFHandlerTest extends MediaWikiMediaTestCase {
-
-       /** @var XCFHandler */
-       protected $handler;
-
-       protected function setUp() {
-               parent::setUp();
-               $this->handler = new XCFHandler();
-       }
-
-       /**
-        * @param string $filename
-        * @param int $expectedWidth Width
-        * @param int $expectedHeight Height
-        * @dataProvider provideGetImageSize
-        * @covers XCFHandler::getImageSize
-        */
-       public function testGetImageSize( $filename, $expectedWidth, $expectedHeight ) {
-               $file = $this->dataFile( $filename, 'image/x-xcf' );
-               $actual = $this->handler->getImageSize( $file, $file->getLocalRefPath() );
-               $this->assertEquals( $expectedWidth, $actual[0] );
-               $this->assertEquals( $expectedHeight, $actual[1] );
-       }
-
-       public static function provideGetImageSize() {
-               return [
-                       [ '80x60-2layers.xcf', 80, 60 ],
-                       [ '80x60-RGB.xcf', 80, 60 ],
-                       [ '80x60-Greyscale.xcf', 80, 60 ],
-               ];
-       }
-
-       /**
-        * @param string $metadata Serialized metadata
-        * @param int $expected One of the class constants of XCFHandler
-        * @dataProvider provideIsMetadataValid
-        * @covers XCFHandler::isMetadataValid
-        */
-       public function testIsMetadataValid( $metadata, $expected ) {
-               $actual = $this->handler->isMetadataValid( null, $metadata );
-               $this->assertEquals( $expected, $actual );
-       }
-
-       public static function provideIsMetadataValid() {
-               return [
-                       [ '', XCFHandler::METADATA_BAD ],
-                       [ serialize( [ 'error' => true ] ), XCFHandler::METADATA_GOOD ],
-                       [ false, XCFHandler::METADATA_BAD ],
-                       [ serialize( [ 'colorType' => 'greyscale-alpha' ] ), XCFHandler::METADATA_GOOD ],
-               ];
-       }
-
-       /**
-        * @param string $filename
-        * @param string $expected Serialized array
-        * @dataProvider provideGetMetadata
-        * @covers XCFHandler::getMetadata
-        */
-       public function testGetMetadata( $filename, $expected ) {
-               $file = $this->dataFile( $filename, 'image/png' );
-               $actual = $this->handler->getMetadata( $file, "$this->filePath/$filename" );
-               $this->assertEquals( $expected, $actual );
-       }
-
-       public static function provideGetMetadata() {
-               return [
-                       [ '80x60-2layers.xcf',
-                               'a:1:{s:9:"colorType";s:16:"truecolour-alpha";}'
-                       ],
-                       [ '80x60-RGB.xcf',
-                               'a:1:{s:9:"colorType";s:16:"truecolour-alpha";}'
-                       ],
-                       [ '80x60-Greyscale.xcf',
-                               'a:1:{s:9:"colorType";s:15:"greyscale-alpha";}'
-                       ],
-               ];
-       }
-}
index 390ea41..cb8257c 100644 (file)
@@ -849,6 +849,11 @@ EOF
                $this->assertFieldValues( $a, $expected );
        }
 
+       /**
+        * @covers ParserOutput::mergeInternalMetaDataFrom
+        * @covers ParserOutput::getTimes
+        * @covers ParserOutput::resetParseStartTime
+        */
        public function testMergeInternalMetaDataFrom_parseStartTime() {
                /** @var object $a */
                $a = new ParserOutput();
index be5125c..898ef2d 100644 (file)
@@ -2,6 +2,7 @@
 
 /**
  * @group Parser
+ * @covers MWTidy
  */
 class TidyTest extends MediaWikiTestCase {
 
index 6a965a0..0f848ab 100644 (file)
@@ -58,6 +58,6 @@ class LayeredParameterizedPasswordTest extends PasswordTestCase {
                $totalPassword = $this->passwordFactory->newFromType( 'testLargeLayeredTop' );
                $totalPassword->partialCrypt( $partialPassword );
 
-               $this->assertTrue( $totalPassword->equals( 'testPassword123' ) );
+               $this->assertTrue( $totalPassword->verify( 'testPassword123' ) );
        }
 }
index 7afdd0a..384db5f 100644 (file)
@@ -60,9 +60,9 @@ abstract class PasswordTestCase extends MediaWikiTestCase {
         * @dataProvider providePasswordTests
         */
        public function testHashing( $shouldMatch, $hash, $password ) {
-               $hash = $this->passwordFactory->newFromCiphertext( $hash );
-               $password = $this->passwordFactory->newFromPlaintext( $password, $hash );
-               $this->assertSame( $shouldMatch, $hash->equals( $password ) );
+               $fromHash = $this->passwordFactory->newFromCiphertext( $hash );
+               $fromPassword = $this->passwordFactory->newFromPlaintext( $password, $fromHash );
+               $this->assertSame( $shouldMatch, $fromHash->equals( $fromPassword ) );
        }
 
        /**
@@ -72,7 +72,7 @@ abstract class PasswordTestCase extends MediaWikiTestCase {
                $hashObj = $this->passwordFactory->newFromCiphertext( $hash );
                $serialized = $hashObj->toString();
                $unserialized = $this->passwordFactory->newFromCiphertext( $serialized );
-               $this->assertTrue( $hashObj->equals( $unserialized ) );
+               $this->assertEquals( $hashObj->toString(), $unserialized->toString() );
        }
 
        /**
index f7f2013..19baf5a 100644 (file)
@@ -1,14 +1,5 @@
 <?php
 
-// We will use this class with getMockForAbstractClass to create a concrete mock class.
-// That call will die if the contructor is not public, unless we use disableOriginalConstructor(),
-// in which case we could not test the constructor.
-abstract class PoolCounterAbstractMock extends PoolCounter {
-       public function __construct() {
-               call_user_func_array( 'parent::__construct', func_get_args() );
-       }
-}
-
 /**
  * @covers PoolCounter
  */
@@ -82,3 +73,12 @@ class PoolCounterTest extends MediaWikiTestCase {
                );
        }
 }
+
+// We will use this class with getMockForAbstractClass to create a concrete mock class.
+// That call will die if the contructor is not public, unless we use disableOriginalConstructor(),
+// in which case we could not test the constructor.
+abstract class PoolCounterAbstractMock extends PoolCounter {
+       public function __construct() {
+               call_user_func_array( 'parent::__construct', func_get_args() );
+       }
+}
index ee272b9..372cb33 100644 (file)
@@ -382,6 +382,7 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider paginationProvider
+        * @covers SearchSuggestionSet::hasMoreResults
         */
        public function testPagination( $hasMoreResults, $provision ) {
                $search = $this->mockSearchWithResults( $provision );
index 54533a7..02fa5e9 100644 (file)
@@ -23,6 +23,7 @@ class SearchSuggestionSetTest extends \PHPUnit\Framework\TestCase {
        /**
         * Test that adding a new suggestion at the end
         * will keep proper score ordering
+        * @covers SearchSuggestionSet::append
         */
        public function testAppend() {
                $set = SearchSuggestionSet::emptySuggestionSet();
@@ -54,6 +55,9 @@ class SearchSuggestionSetTest extends \PHPUnit\Framework\TestCase {
        /**
         * Test that adding a new best suggestion will keep proper score
         * ordering
+        * @covers SearchSuggestionSet::getWorstScore
+        * @covers SearchSuggestionSet::getBestScore
+        * @covers SearchSuggestionSet::prepend
         */
        public function testInsertBest() {
                $set = SearchSuggestionSet::emptySuggestionSet();
@@ -88,6 +92,9 @@ class SearchSuggestionSetTest extends \PHPUnit\Framework\TestCase {
                $this->assertEquals( $sorted, $scores );
        }
 
+       /**
+        * @covers SearchSuggestionSet::shrink
+        */
        public function testShrink() {
                $set = SearchSuggestionSet::emptySuggestionSet();
                for ( $i = 0; $i < 100; $i++ ) {
index b367979..d198462 100644 (file)
@@ -30,6 +30,9 @@
  */
 class MediaWikiSiteTest extends SiteTest {
 
+       /**
+        * @covers MediaWikiSite::normalizePageName
+        */
        public function testNormalizePageTitle() {
                $this->setMwGlobals( [
                        'wgCapitalLinks' => true,
index 55a8b66..0643e0e 100644 (file)
@@ -29,6 +29,7 @@ class SpecialBlockTest extends SpecialPageTestBase {
        public function testGetFormFields() {
                $this->setMwGlobals( [
                        'wgEnablePartialBlocks' => false,
+                       'wgBlockAllowsUTEdit' => true,
                ] );
                $page = $this->newSpecialPage();
                $wrappedPage = TestingAccessWrapper::newFromObject( $page );
@@ -71,6 +72,7 @@ class SpecialBlockTest extends SpecialPageTestBase {
        public function testMaybeAlterFormDefaults() {
                $this->setMwGlobals( [
                        'wgEnablePartialBlocks' => false,
+                       'wgBlockAllowsUTEdit' => true,
                ] );
 
                $block = $this->insertBlock();
index 6ff2110..1a4fe4f 100644 (file)
@@ -114,6 +114,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
        /**
         * Verify we do not expand search term in <title> on search result page
         * https://gerrit.wikimedia.org/r/4841
+        * @covers SpecialSearch::setupPage
         */
        public function testSearchTermIsNotExpanded() {
                $this->setMwGlobals( [
@@ -175,6 +176,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideRewriteQueryWithSuggestion
+        * @covers SpecialSearch::showResults
         */
        public function testRewriteQueryWithSuggestion(
                $message,
@@ -224,6 +226,9 @@ class SpecialSearchTest extends MediaWikiTestCase {
                return $mock;
        }
 
+       /**
+        * @covers SpecialSearch::execute
+        */
        public function testSubPageRedirect() {
                $this->setMwGlobals( [
                        'wgScript' => '/w/index.php',
diff --git a/tests/phpunit/includes/specials/SpecialUncategorizedcategoriesTest.php b/tests/phpunit/includes/specials/SpecialUncategorizedcategoriesTest.php
deleted file mode 100644 (file)
index 80bd365..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-/**
- * Tests for Special:Uncategorizedcategories
- */
-class UncategorizedCategoriesPageTest extends MediaWikiTestCase {
-       /**
-        * @dataProvider provideTestGetQueryInfoData
-        * @covers UncategorizedCategoriesPage::getQueryInfo
-        */
-       public function testGetQueryInfo( $msgContent, $expected ) {
-               $msg = new RawMessage( $msgContent );
-               $mockContext = $this->getMockBuilder( RequestContext::class )->getMock();
-               $mockContext->method( 'msg' )->willReturn( $msg );
-               $special = new UncategorizedCategoriesPage();
-               $special->setContext( $mockContext );
-               $this->assertEquals( [
-                       'tables' => [
-                               0 => 'page',
-                               1 => 'categorylinks',
-                       ],
-                       'fields' => [
-                               'namespace' => 'page_namespace',
-                               'title' => 'page_title',
-                               'value' => 'page_title',
-                       ],
-                       'conds' => [
-                               0 => 'cl_from IS NULL',
-                               'page_namespace' => 14,
-                               'page_is_redirect' => 0,
-                       ] + $expected,
-                       'join_conds' => [
-                               'categorylinks' => [
-                                       0 => 'LEFT JOIN',
-                                       1 => 'cl_from = page_id',
-                               ],
-                       ],
-               ], $special->getQueryInfo() );
-       }
-
-       public function provideTestGetQueryInfoData() {
-               return [
-                       [
-                               "* Stubs\n* Test\n* *\n* * test123",
-                               [ 1 => "page_title not in ( 'Stubs','Test','*','*_test123' )" ]
-                       ],
-                       [
-                               "Stubs\n* Test\n* *\n* * test123",
-                               [ 1 => "page_title not in ( 'Test','*','*_test123' )" ]
-                       ],
-                       [
-                               "* StubsTest\n* *\n* * test123",
-                               [ 1 => "page_title not in ( 'StubsTest','*','*_test123' )" ]
-                       ],
-                       [ "", [] ],
-                       [ "\n\n\n", [] ],
-                       [ "\n", [] ],
-                       [ "Test\n*Test2", [ 1 => "page_title not in ( 'Test2' )" ] ],
-                       [ "Test", [] ],
-                       [ "*Test\nTest2", [ 1 => "page_title not in ( 'Test' )" ] ],
-                       [ "Test\nTest2", [] ],
-               ];
-       }
-}
diff --git a/tests/phpunit/includes/specials/UncategorizedCategoriesPageTest.php b/tests/phpunit/includes/specials/UncategorizedCategoriesPageTest.php
new file mode 100644 (file)
index 0000000..80bd365
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Tests for Special:Uncategorizedcategories
+ */
+class UncategorizedCategoriesPageTest extends MediaWikiTestCase {
+       /**
+        * @dataProvider provideTestGetQueryInfoData
+        * @covers UncategorizedCategoriesPage::getQueryInfo
+        */
+       public function testGetQueryInfo( $msgContent, $expected ) {
+               $msg = new RawMessage( $msgContent );
+               $mockContext = $this->getMockBuilder( RequestContext::class )->getMock();
+               $mockContext->method( 'msg' )->willReturn( $msg );
+               $special = new UncategorizedCategoriesPage();
+               $special->setContext( $mockContext );
+               $this->assertEquals( [
+                       'tables' => [
+                               0 => 'page',
+                               1 => 'categorylinks',
+                       ],
+                       'fields' => [
+                               'namespace' => 'page_namespace',
+                               'title' => 'page_title',
+                               'value' => 'page_title',
+                       ],
+                       'conds' => [
+                               0 => 'cl_from IS NULL',
+                               'page_namespace' => 14,
+                               'page_is_redirect' => 0,
+                       ] + $expected,
+                       'join_conds' => [
+                               'categorylinks' => [
+                                       0 => 'LEFT JOIN',
+                                       1 => 'cl_from = page_id',
+                               ],
+                       ],
+               ], $special->getQueryInfo() );
+       }
+
+       public function provideTestGetQueryInfoData() {
+               return [
+                       [
+                               "* Stubs\n* Test\n* *\n* * test123",
+                               [ 1 => "page_title not in ( 'Stubs','Test','*','*_test123' )" ]
+                       ],
+                       [
+                               "Stubs\n* Test\n* *\n* * test123",
+                               [ 1 => "page_title not in ( 'Test','*','*_test123' )" ]
+                       ],
+                       [
+                               "* StubsTest\n* *\n* * test123",
+                               [ 1 => "page_title not in ( 'StubsTest','*','*_test123' )" ]
+                       ],
+                       [ "", [] ],
+                       [ "\n\n\n", [] ],
+                       [ "\n", [] ],
+                       [ "Test\n*Test2", [ 1 => "page_title not in ( 'Test2' )" ] ],
+                       [ "Test", [] ],
+                       [ "*Test\nTest2", [ 1 => "page_title not in ( 'Test' )" ] ],
+                       [ "Test\nTest2", [] ],
+               ];
+       }
+}
index a5ebaa5..faa9aa1 100644 (file)
@@ -262,6 +262,26 @@ class RemexDriverTest extends MediaWikiTestCase {
                        '<i><blockquote><p></i>',
                        '<i></i><blockquote><p><i></i></p><p><i></i></p></blockquote>',
                ],
+               [
+                       'style tag isn\'t p-wrapped (T186965)',
+                       '<style>/* ... */</style>',
+                       '<style>/* ... */</style>',
+               ],
+               [
+                       'link tag isn\'t p-wrapped (T186965)',
+                       '<link rel="foo" href="bar" />',
+                       '<link rel="foo" href="bar" />',
+               ],
+               [
+                       'style tag doesn\'t split p-wrapping (T208901)',
+                       'foo <style>/* ... */</style> bar',
+                       '<p>foo <style>/* ... */</style> bar</p>',
+               ],
+               [
+                       'link tag doesn\'t split p-wrapping (T208901)',
+                       'foo <link rel="foo" href="bar" /> bar',
+                       '<p>foo <link rel="foo" href="bar" /> bar</p>',
+               ],
        ];
 
        public function provider() {
index 84f9378..b8806e7 100644 (file)
@@ -583,6 +583,7 @@ class UserTest extends MediaWikiTestCase {
         * When a user is autoblocked a cookie is set with which to track them
         * in case they log out and change IP addresses.
         * @link https://phabricator.wikimedia.org/T5233
+        * @covers User::trackBlockWithCookie
         */
        public function testAutoblockCookies() {
                // Set up the bits of global configuration that we use.
@@ -665,6 +666,7 @@ class UserTest extends MediaWikiTestCase {
        /**
         * Make sure that no cookie is set to track autoblocked users
         * when $wgCookieSetOnAutoblock is false.
+        * @covers User::trackBlockWithCookie
         */
        public function testAutoblockCookiesDisabled() {
                // Set up the bits of global configuration that we use.
@@ -712,6 +714,7 @@ class UserTest extends MediaWikiTestCase {
         * When a user is autoblocked and a cookie is set to track them, the expiry time of the cookie
         * should match the block's expiry, to a maximum of 24 hours. If the expiry time is changed,
         * the cookie's should change with it.
+        * @covers User::trackBlockWithCookie
         */
        public function testAutoblockCookieInfiniteExpiry() {
                $this->setMwGlobals( [
@@ -776,6 +779,9 @@ class UserTest extends MediaWikiTestCase {
                $block->delete();
        }
 
+       /**
+        * @covers User::getBlockedStatus
+        */
        public function testSoftBlockRanges() {
                global $wgUser;
 
@@ -807,6 +813,7 @@ class UserTest extends MediaWikiTestCase {
 
        /**
         * Test that a modified BlockID cookie doesn't actually load the relevant block (T152951).
+        * @covers User::trackBlockWithCookie
         */
        public function testAutoblockCookieInauthentic() {
                // Set up the bits of global configuration that we use.
@@ -853,6 +860,7 @@ class UserTest extends MediaWikiTestCase {
        /**
         * The BlockID cookie is normally verified with a HMAC, but not if wgSecretKey is not set.
         * This checks that a non-authenticated cookie still works.
+        * @covers User::trackBlockWithCookie
         */
        public function testAutoblockCookieNoSecretKey() {
                // Set up the bits of global configuration that we use.
@@ -1022,6 +1030,9 @@ class UserTest extends MediaWikiTestCase {
                $this->assertTrue( User::isLocallyBlockedProxy( $ip ) );
        }
 
+       /**
+        * @covers User::newFromActorId
+        */
        public function testActorId() {
                $domain = MediaWikiServices::getInstance()->getDBLoadBalancer()->getLocalDomainID();
                $this->hideDeprecated( 'User::selectFields' );
@@ -1085,6 +1096,9 @@ class UserTest extends MediaWikiTestCase {
                        'User::newFromActorId works for an anonymous user' );
        }
 
+       /**
+        * @covers User::newFromAnyId
+        */
        public function testNewFromAnyId() {
                // Registered user
                $user = $this->getTestUser()->getUser();
@@ -1337,6 +1351,7 @@ class UserTest extends MediaWikiTestCase {
        /**
         * Block cookie should be set for IP Blocks if
         * wgCookieSetOnIpBlock is set to true
+        * @covers User::trackBlockWithCookie
         */
        public function testIpBlockCookieSet() {
                $this->setMwGlobals( [
@@ -1372,6 +1387,7 @@ class UserTest extends MediaWikiTestCase {
        /**
         * Block cookie should NOT be set when wgCookieSetOnIpBlock
         * is disabled
+        * @covers User::trackBlockWithCookie
         */
        public function testIpBlockCookieNotSet() {
                $this->setMwGlobals( [
@@ -1407,6 +1423,7 @@ class UserTest extends MediaWikiTestCase {
        /**
         * When an ip user is blocked and then they log in, cookie block
         * should be invalid and the cookie removed.
+        * @covers User::trackBlockWithCookie
         */
        public function testIpBlockCookieIgnoredWhenUserLoggedIn() {
                $this->setMwGlobals( [
index b8a60be..38a513e 100644 (file)
@@ -11,8 +11,6 @@ use Title;
 use WikiExporter;
 use WikiPage;
 
-require_once __DIR__ . "/../../../maintenance/dumpTextPass.php";
-
 /**
  * Tests for TextPassDumper that rely on the database
  *
diff --git a/tests/phpunit/maintenance/categoryChangesAsRdfTest.php b/tests/phpunit/maintenance/categoryChangesAsRdfTest.php
new file mode 100644 (file)
index 0000000..f5a47d5
--- /dev/null
@@ -0,0 +1,265 @@
+<?php
+
+use Wikimedia\Rdbms\IDatabase;
+
+/**
+ * Tests for CategoryChangesAsRdf recent changes exporter.
+ *  @covers CategoryChangesAsRdf
+ */
+class CategoryChangesAsRdfTest extends MediaWikiLangTestCase {
+
+       public function setUp() {
+               parent::setUp();
+               $this->setMwGlobals( [
+                       'wgServer' => 'http://acme.test',
+                       'wgCanonicalServer' => 'http://acme.test',
+                       'wgArticlePath' => '/wiki/$1',
+               ] );
+       }
+
+       public function provideCategoryData() {
+               return [
+                       'delete category' => [
+                               __DIR__ . "/../data/categoriesrdf/delete.sparql",
+                               'getDeletedCatsIterator',
+                               'handleDeletes',
+                               [
+                                       (object)[ 'rc_title' => 'Test', 'rc_cur_id' => 1, '_processed' => 1 ],
+                                       (object)[ 'rc_title' => 'Test 2', 'rc_cur_id' => 2, '_processed' => 2 ],
+                               ],
+                       ],
+                       'move category' => [
+                               __DIR__ . "/../data/categoriesrdf/move.sparql",
+                               'getMovedCatsIterator',
+                               'handleMoves',
+                               [
+                                       (object)[
+                                               'rc_title' => 'Test',
+                                               'rc_cur_id' => 4,
+                                               'page_title' => 'MovedTo',
+                                               'page_namespace' => NS_CATEGORY,
+                                               '_processed' => 4,
+                                               'pp_propname' => null,
+                                               'cat_pages' => 10,
+                                               'cat_subcats' => 2,
+                                               'cat_files' => 1,
+                                       ],
+                                       (object)[
+                                               'rc_title' => 'MovedTo',
+                                               'rc_cur_id' => 4,
+                                               'page_title' => 'MovedAgain',
+                                               'page_namespace' => NS_CATEGORY,
+                                               'pp_propname' => 'hiddencat',
+                                               'cat_pages' => 10,
+                                               'cat_subcats' => 2,
+                                               'cat_files' => 1,
+                                       ],
+                                       (object)[
+                                               'rc_title' => 'Test 2',
+                                               'rc_cur_id' => 5,
+                                               'page_title' => 'AlsoMoved',
+                                               'page_namespace' => NS_CATEGORY,
+                                               '_processed' => 5,
+                                               'pp_propname' => null,
+                                               'cat_pages' => 10,
+                                               'cat_subcats' => 2,
+                                               'cat_files' => 1,
+                                       ],
+                                       (object)[
+                                               'rc_title' => 'Test 3',
+                                               'rc_cur_id' => 6,
+                                               'page_title' => 'MovedOut',
+                                               'page_namespace' => NS_MAIN,
+                                               'pp_propname' => null,
+                                               'cat_pages' => 10,
+                                               'cat_subcats' => 2,
+                                               'cat_files' => 1,
+                                       ],
+                                       (object)[
+                                               'rc_title' => 'Test 4',
+                                               'rc_cur_id' => 7,
+                                               'page_title' => 'Already Done',
+                                               'page_namespace' => NS_CATEGORY,
+                                               'pp_propname' => null,
+                                               'cat_pages' => 10,
+                                               'cat_subcats' => 2,
+                                               'cat_files' => 1,
+                                       ],
+                               ],
+                               [ 7 => true ],
+                       ],
+                       'restore deleted category' => [
+                               __DIR__ . "/../data/categoriesrdf/restore.sparql",
+                               'getRestoredCatsIterator',
+                               'handleRestores',
+                               [
+                                       (object)[
+                                               'rc_title' => 'Restored cat',
+                                               'rc_cur_id' => 10,
+                                               '_processed' => 10,
+                                               'pp_propname' => null,
+                                               'cat_pages' => 10,
+                                               'cat_subcats' => 2,
+                                               'cat_files' => 1,
+                                       ],
+                                       (object)[
+                                               'rc_title' => 'Restored again',
+                                               'rc_cur_id' => 10,
+                                               'pp_propname' => null,
+                                               'cat_pages' => 10,
+                                               'cat_subcats' => 2,
+                                               'cat_files' => 1,
+                                       ],
+                                       (object)[
+                                               'rc_title' => 'Already seen',
+                                               'rc_cur_id' => 11,
+                                               'pp_propname' => null,
+                                               'cat_pages' => 10,
+                                               'cat_subcats' => 2,
+                                               'cat_files' => 1,
+                                       ],
+                               ],
+                               [ 11 => true ],
+                       ],
+                       'new page' => [
+                               __DIR__ . "/../data/categoriesrdf/new.sparql",
+                               'getNewCatsIterator',
+                               'handleAdds',
+                               [
+                                       (object)[
+                                               'rc_title' => 'New category',
+                                               'rc_cur_id' => 20,
+                                               '_processed' => 20,
+                                               'pp_propname' => null,
+                                               'cat_pages' => 10,
+                                               'cat_subcats' => 2,
+                                               'cat_files' => 1,
+                                       ],
+                                       (object)[
+                                               'rc_title' => 'Новая категория 😃',
+                                               'rc_cur_id' => 21,
+                                               '_processed' => 21,
+                                               'pp_propname' => 'hiddencat',
+                                               'cat_pages' => 10,
+                                               'cat_subcats' => 2,
+                                               'cat_files' => 1,
+                                       ],
+                                       (object)[
+                                               'rc_title' => 'Processed already',
+                                               'rc_cur_id' => 22,
+                                       ],
+                               ],
+                               [ 22 => true ],
+                       ],
+                       'edit category' => [
+                               __DIR__ . "/../data/categoriesrdf/edit.sparql",
+                               'getChangedCatsIterator',
+                               'handleEdits',
+                               [
+                                       (object)[
+                                               'rc_title' => 'Changed category',
+                                               'rc_cur_id' => 30,
+                                               '_processed' => 30,
+                                               'pp_propname' => null,
+                                               'cat_pages' => 10,
+                                               'cat_subcats' => 2,
+                                               'cat_files' => 1,
+                                       ],
+                                       (object)[
+                                               'rc_title' => 'Changed again',
+                                               'rc_cur_id' => 30,
+                                               'pp_propname' => null,
+                                               'cat_pages' => 12,
+                                               'cat_subcats' => 2,
+                                               'cat_files' => 1,
+                                       ],
+                                       (object)[
+                                               'rc_title' => 'Processed already',
+                                               'rc_cur_id' => 31,
+                                               'pp_propname' => null,
+                                               'cat_pages' => 10,
+                                               'cat_subcats' => 2,
+                                               'cat_files' => 1,
+                                       ],
+                               ],
+                               [ 31 => true ],
+                       ],
+                       // TODO: not sure how to test categorization changes, it uses the database select...
+               ];
+       }
+
+       /**
+        * Mock category links iterator.
+        * @param IDatabase $dbr
+        * @param array $ids
+        * @return array
+        */
+       public function getCategoryLinksIterator( $dbr, array $ids ) {
+               $res = [];
+               foreach ( $ids as $pageid ) {
+                       $res[] = (object)[ 'cl_from' => $pageid, 'cl_to' => "Parent of $pageid" ];
+               }
+               return $res;
+       }
+
+       /**
+        * @dataProvider provideCategoryData
+        * @param string $testFileName Name of the test, defines filename with expected results.
+        * @param string $iterator Iterator method name to mock
+        * @param string $handler Handler method to call
+        * @param array $result Result to be returned from mock iterator
+        * @param array $preProcessed List of pre-processed items
+        */
+       public function testSparqlUpdate( $testFileName, $iterator, $handler, $result,
+                       array $preProcessed = [] ) {
+               $dumpScript =
+                       $this->getMockBuilder( CategoryChangesAsRdf::class )
+                               ->setMethods( [ $iterator, 'getCategoryLinksIterator' ] )
+                               ->getMock();
+
+               $dumpScript->expects( $this->any() )
+                       ->method( 'getCategoryLinksIterator' )
+                       ->willReturnCallback( [ $this, 'getCategoryLinksIterator' ] );
+
+               $dumpScript->expects( $this->once() )
+                       ->method( $iterator )
+                       ->willReturn( [ $result ] );
+
+               $ref = new ReflectionObject( $dumpScript );
+               $processedProperty = $ref->getProperty( 'processed' );
+               $processedProperty->setAccessible( true );
+               $processedProperty->setValue( $dumpScript, $preProcessed );
+
+               $output = fopen( "php://memory", "w+b" );
+               $dbr = wfGetDB( DB_REPLICA );
+               /** @var CategoryChangesAsRdf $dumpScript */
+               $dumpScript->initialize();
+               $dumpScript->getRdf();
+               $dumpScript->$handler( $dbr, $output );
+
+               rewind( $output );
+               $sparql = stream_get_contents( $output );
+               $this->assertFileContains( $testFileName, $sparql );
+
+               $processed = $processedProperty->getValue( $dumpScript );
+               $expectedProcessed = $preProcessed;
+               foreach ( $result as $row ) {
+                       if ( isset( $row->_processed ) ) {
+                               $this->assertArrayHasKey( $row->_processed, $processed,
+                                       "ID {$row->_processed} was not processed!" );
+                               $expectedProcessed[] = $row->_processed;
+                       }
+               }
+               $this->assertArrayEquals( $expectedProcessed, array_keys( $processed ),
+                       'Processed array has wrong items' );
+       }
+
+       public function testUpdateTs() {
+               $dumpScript = new CategoryChangesAsRdf();
+               $dumpScript->initialize();
+               $update = $dumpScript->updateTS( 1503620949 );
+               $outFile = __DIR__ . '/../data/categoriesrdf/updatets.txt';
+               $this->assertFileContains( $outFile, $update );
+       }
+
+}
diff --git a/tests/phpunit/maintenance/categoryChangesRdfTest.php b/tests/phpunit/maintenance/categoryChangesRdfTest.php
deleted file mode 100644 (file)
index 701929a..0000000
+++ /dev/null
@@ -1,263 +0,0 @@
-<?php
-
-/**
- * Tests for CategoryChangesAsRdf recent changes exporter.
- *  @covers CategoryChangesAsRdf
- */
-class CategoryChangesRdfTest extends MediaWikiLangTestCase {
-
-       public function setUp() {
-               parent::setUp();
-               $this->setMwGlobals( [
-                       'wgServer' => 'http://acme.test',
-                       'wgCanonicalServer' => 'http://acme.test',
-                       'wgArticlePath' => '/wiki/$1',
-               ] );
-       }
-
-       public function provideCategoryData() {
-               return [
-                       'delete category' => [
-                               __DIR__ . "/../data/categoriesrdf/delete.sparql",
-                               'getDeletedCatsIterator',
-                               'handleDeletes',
-                               [
-                                       (object)[ 'rc_title' => 'Test', 'rc_cur_id' => 1, '_processed' => 1 ],
-                                       (object)[ 'rc_title' => 'Test 2', 'rc_cur_id' => 2, '_processed' => 2 ],
-                               ],
-                       ],
-                       'move category' => [
-                               __DIR__ . "/../data/categoriesrdf/move.sparql",
-                               'getMovedCatsIterator',
-                               'handleMoves',
-                               [
-                                       (object)[
-                                               'rc_title' => 'Test',
-                                               'rc_cur_id' => 4,
-                                               'page_title' => 'MovedTo',
-                                               'page_namespace' => NS_CATEGORY,
-                                               '_processed' => 4,
-                                               'pp_propname' => null,
-                                               'cat_pages' => 10,
-                                               'cat_subcats' => 2,
-                                               'cat_files' => 1,
-                                       ],
-                                       (object)[
-                                               'rc_title' => 'MovedTo',
-                                               'rc_cur_id' => 4,
-                                               'page_title' => 'MovedAgain',
-                                               'page_namespace' => NS_CATEGORY,
-                                               'pp_propname' => 'hiddencat',
-                                               'cat_pages' => 10,
-                                               'cat_subcats' => 2,
-                                               'cat_files' => 1,
-                                       ],
-                                       (object)[
-                                               'rc_title' => 'Test 2',
-                                               'rc_cur_id' => 5,
-                                               'page_title' => 'AlsoMoved',
-                                               'page_namespace' => NS_CATEGORY,
-                                               '_processed' => 5,
-                                               'pp_propname' => null,
-                                               'cat_pages' => 10,
-                                               'cat_subcats' => 2,
-                                               'cat_files' => 1,
-                                       ],
-                                       (object)[
-                                               'rc_title' => 'Test 3',
-                                               'rc_cur_id' => 6,
-                                               'page_title' => 'MovedOut',
-                                               'page_namespace' => NS_MAIN,
-                                               'pp_propname' => null,
-                                               'cat_pages' => 10,
-                                               'cat_subcats' => 2,
-                                               'cat_files' => 1,
-                                       ],
-                                       (object)[
-                                               'rc_title' => 'Test 4',
-                                               'rc_cur_id' => 7,
-                                               'page_title' => 'Already Done',
-                                               'page_namespace' => NS_CATEGORY,
-                                               'pp_propname' => null,
-                                               'cat_pages' => 10,
-                                               'cat_subcats' => 2,
-                                               'cat_files' => 1,
-                                       ],
-                               ],
-                               [ 7 => true ],
-                       ],
-                       'restore deleted category' => [
-                               __DIR__ . "/../data/categoriesrdf/restore.sparql",
-                               'getRestoredCatsIterator',
-                               'handleRestores',
-                               [
-                                       (object)[
-                                               'rc_title' => 'Restored cat',
-                                               'rc_cur_id' => 10,
-                                               '_processed' => 10,
-                                               'pp_propname' => null,
-                                               'cat_pages' => 10,
-                                               'cat_subcats' => 2,
-                                               'cat_files' => 1,
-                                       ],
-                                       (object)[
-                                               'rc_title' => 'Restored again',
-                                               'rc_cur_id' => 10,
-                                               'pp_propname' => null,
-                                               'cat_pages' => 10,
-                                               'cat_subcats' => 2,
-                                               'cat_files' => 1,
-                                       ],
-                                       (object)[
-                                               'rc_title' => 'Already seen',
-                                               'rc_cur_id' => 11,
-                                               'pp_propname' => null,
-                                               'cat_pages' => 10,
-                                               'cat_subcats' => 2,
-                                               'cat_files' => 1,
-                                       ],
-                               ],
-                               [ 11 => true ],
-                       ],
-                       'new page' => [
-                               __DIR__ . "/../data/categoriesrdf/new.sparql",
-                               'getNewCatsIterator',
-                               'handleAdds',
-                               [
-                                       (object)[
-                                               'rc_title' => 'New category',
-                                               'rc_cur_id' => 20,
-                                               '_processed' => 20,
-                                               'pp_propname' => null,
-                                               'cat_pages' => 10,
-                                               'cat_subcats' => 2,
-                                               'cat_files' => 1,
-                                       ],
-                                       (object)[
-                                               'rc_title' => 'Новая категория 😃',
-                                               'rc_cur_id' => 21,
-                                               '_processed' => 21,
-                                               'pp_propname' => 'hiddencat',
-                                               'cat_pages' => 10,
-                                               'cat_subcats' => 2,
-                                               'cat_files' => 1,
-                                       ],
-                                       (object)[
-                                               'rc_title' => 'Processed already',
-                                               'rc_cur_id' => 22,
-                                       ],
-                               ],
-                               [ 22 => true ],
-                       ],
-                       'edit category' => [
-                               __DIR__ . "/../data/categoriesrdf/edit.sparql",
-                               'getChangedCatsIterator',
-                               'handleEdits',
-                               [
-                                       (object)[
-                                               'rc_title' => 'Changed category',
-                                               'rc_cur_id' => 30,
-                                               '_processed' => 30,
-                                               'pp_propname' => null,
-                                               'cat_pages' => 10,
-                                               'cat_subcats' => 2,
-                                               'cat_files' => 1,
-                                       ],
-                                       (object)[
-                                               'rc_title' => 'Changed again',
-                                               'rc_cur_id' => 30,
-                                               'pp_propname' => null,
-                                               'cat_pages' => 12,
-                                               'cat_subcats' => 2,
-                                               'cat_files' => 1,
-                                       ],
-                                       (object)[
-                                               'rc_title' => 'Processed already',
-                                               'rc_cur_id' => 31,
-                                               'pp_propname' => null,
-                                               'cat_pages' => 10,
-                                               'cat_subcats' => 2,
-                                               'cat_files' => 1,
-                                       ],
-                               ],
-                               [ 31 => true ],
-                       ],
-                       // TODO: not sure how to test categorization changes, it uses the database select...
-               ];
-       }
-
-       /**
-        * Mock category links iterator.
-        * @param $dbr
-        * @param array $ids
-        * @return array
-        */
-       public function getCategoryLinksIterator( $dbr, array $ids ) {
-               $res = [];
-               foreach ( $ids as $pageid ) {
-                       $res[] = (object)[ 'cl_from' => $pageid, 'cl_to' => "Parent of $pageid" ];
-               }
-               return $res;
-       }
-
-       /**
-        * @dataProvider provideCategoryData
-        * @param string $testFileName Name of the test, defines filename with expected results.
-        * @param string $iterator Iterator method name to mock
-        * @param string $handler Handler method to call
-        * @param array $result Result to be returned from mock iterator
-        * @param array $preProcessed List of pre-processed items
-        */
-       public function testSparqlUpdate( $testFileName, $iterator, $handler, $result,
-                       array $preProcessed = [] ) {
-               $dumpScript =
-                       $this->getMockBuilder( CategoryChangesAsRdf::class )
-                               ->setMethods( [ $iterator, 'getCategoryLinksIterator' ] )
-                               ->getMock();
-
-               $dumpScript->expects( $this->any() )
-                       ->method( 'getCategoryLinksIterator' )
-                       ->willReturnCallback( [ $this, 'getCategoryLinksIterator' ] );
-
-               $dumpScript->expects( $this->once() )
-                       ->method( $iterator )
-                       ->willReturn( [ $result ] );
-
-               $ref = new ReflectionObject( $dumpScript );
-               $processedProperty = $ref->getProperty( 'processed' );
-               $processedProperty->setAccessible( true );
-               $processedProperty->setValue( $dumpScript, $preProcessed );
-
-               $output = fopen( "php://memory", "w+b" );
-               $dbr = wfGetDB( DB_REPLICA );
-               /** @var CategoryChangesAsRdf $dumpScript */
-               $dumpScript->initialize();
-               $dumpScript->getRdf();
-               $dumpScript->$handler( $dbr, $output );
-
-               rewind( $output );
-               $sparql = stream_get_contents( $output );
-               $this->assertFileContains( $testFileName, $sparql );
-
-               $processed = $processedProperty->getValue( $dumpScript );
-               $expectedProcessed = $preProcessed;
-               foreach ( $result as $row ) {
-                       if ( isset( $row->_processed ) ) {
-                               $this->assertArrayHasKey( $row->_processed, $processed,
-                                       "ID {$row->_processed} was not processed!" );
-                               $expectedProcessed[] = $row->_processed;
-                       }
-               }
-               $this->assertArrayEquals( $expectedProcessed, array_keys( $processed ),
-                       'Processed array has wrong items' );
-       }
-
-       public function testUpdateTs() {
-               $dumpScript = new CategoryChangesAsRdf();
-               $dumpScript->initialize();
-               $update = $dumpScript->updateTS( 1503620949 );
-               $outFile = __DIR__ . '/../data/categoriesrdf/updatets.txt';
-               $this->assertFileContains( $outFile, $update );
-       }
-
-}
index 97e0c88..7cbda3c 100644 (file)
@@ -10,8 +10,6 @@ use Title;
 use PHPUnit_Framework_ExpectationFailedException;
 use WikiPage;
 
-require_once __DIR__ . "/../../../maintenance/fetchText.php";
-
 /**
  * Mock for the input/output of FetchText
  *