Merge "jquery-tablesorter and sortable classes always added together"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 7 May 2018 20:23:17 +0000 (20:23 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 7 May 2018 20:23:17 +0000 (20:23 +0000)
118 files changed:
.phpcs.xml
Gruntfile.js
RELEASE-NOTES-1.32
autoload.php
docs/database.txt
includes/DefaultSettings.php
includes/OutputPage.php
includes/api/i18n/zh-hk.json [new file with mode: 0644]
includes/dao/DBAccessBase.php
includes/deferred/LinksUpdate.php
includes/deferred/SqlDataUpdate.php [deleted file]
includes/diff/DiffEngine.php
includes/diff/WordAccumulator.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/ForeignDBViaLBRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/file/ArchivedFile.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignAPIFile.php
includes/filerepo/file/ForeignDBFile.php
includes/filerepo/file/LocalFile.php
includes/filerepo/file/OldLocalFile.php
includes/htmlform/fields/HTMLExpiryField.php
includes/installer/WebInstallerOutput.php
includes/installer/i18n/fi.json
includes/installer/i18n/zh-hk.json
includes/interwiki/Interwiki.php
includes/libs/rdbms/ChronologyProtector.php
includes/libs/rdbms/database/DBConnRef.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/IDatabase.php
includes/libs/rdbms/lbfactory/LBFactory.php
includes/libs/rdbms/loadbalancer/ILoadBalancer.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/logging/LogPager.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/resourceloader/ResourceLoaderSkinModule.php
includes/skins/Skin.php
includes/skins/SkinTemplate.php
includes/specials/SpecialLog.php
includes/specials/SpecialRedirect.php
includes/specials/SpecialUserrights.php
includes/specials/pagers/ImageListPager.php
includes/user/User.php
languages/data/Names.php
languages/i18n/ar.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/ce.json
languages/i18n/de.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gcr.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hy.json
languages/i18n/ig.json
languages/i18n/inh.json
languages/i18n/ko.json
languages/i18n/ml.json
languages/i18n/nah.json
languages/i18n/nds-nl.json
languages/i18n/oc.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/sat.json
languages/i18n/sc.json
languages/i18n/shy-latn.json [new file with mode: 0644]
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/szl.json
languages/i18n/tt-cyrl.json
languages/i18n/ur.json
languages/i18n/vi.json
languages/i18n/zgh.json
languages/i18n/zh-hans.json
languages/i18n/zh-hk.json
languages/messages/MessagesAbs.php [new file with mode: 0644]
maintenance/getReplicaServer.php
maintenance/initEditCount.php
maintenance/lag.php
maintenance/mssql/tables.sql
maintenance/tables.sql
maintenance/updateSpecialPages.php
resources/Resources.php
resources/lib/CLDRPluralRuleParser/CLDRPluralRuleParser.js [new file with mode: 0644]
resources/src/mediawiki.libs.jpegmeta/export.js [new file with mode: 0644]
resources/src/mediawiki.libs.jpegmeta/jpegmeta.js [new file with mode: 0644]
resources/src/mediawiki.libs.pluralruleparser/export.js [new file with mode: 0644]
resources/src/mediawiki.libs/CLDRPluralRuleParser.js [deleted file]
resources/src/mediawiki.libs/mediawiki.libs.jpegmeta.js [deleted file]
resources/src/mediawiki.widgets.visibleLengthLimit/mediawiki.widgets.visibleLengthLimit.js
resources/src/mediawiki/mediawiki.sectionAnchor.css [deleted file]
resources/src/moment-dmy.js [deleted file]
resources/src/moment-global.js [deleted file]
resources/src/moment-locale-overrides.js [deleted file]
resources/src/moment/moment-dmy.js [new file with mode: 0644]
resources/src/moment/moment-global.js [new file with mode: 0644]
resources/src/moment/moment-locale-overrides.js [new file with mode: 0644]
tests/parser/ParserTestRunner.php
tests/phan/config.php
tests/phpunit/includes/MovePageTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/SampleTest.php
tests/phpunit/includes/Storage/RevisionStoreDbTest.php
tests/phpunit/includes/Storage/RevisionStoreTest.php
tests/phpunit/includes/api/ApiParseTest.php
tests/phpunit/includes/auth/EmailNotificationSecondaryAuthenticationProviderTest.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderSkinModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/site/DBSiteStoreTest.php
tests/phpunit/includes/skins/SkinTemplateTest.php

index 31e6eeb..d43a281 100644 (file)
@@ -17,7 +17,6 @@
                <exclude name="MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.SingleSpaceBeforeSingleLineComment" />
                <exclude name="MediaWiki.Usage.DbrQueryUsage.DbrQueryFound" />
                <exclude name="MediaWiki.Usage.ExtendClassUsage.FunctionVarUsage" />
-               <exclude name="MediaWiki.Usage.ForbiddenFunctions.assert" />
                <exclude name="MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals" />
                <exclude name="MediaWiki.Files.ClassMatchesFilename.WrongCase" />
                <exclude name="MediaWiki.Files.ClassMatchesFilename.NotMatch" />
index 898b48f..2f55868 100644 (file)
@@ -28,7 +28,7 @@ module.exports = function ( grunt ) {
                                '!resources/lib/**',
                                '!resources/src/jquery.tipsy/**',
                                '!resources/src/jquery/jquery.farbtastic.js',
-                               '!resources/src/mediawiki.libs/**',
+                               '!resources/src/mediawiki.libs.jpegmeta/**',
                                // Third-party code of PHPUnit coverage report
                                '!tests/coverage/**',
                                '!vendor/**',
index 8e5022c..98c1a8e 100644 (file)
@@ -46,7 +46,7 @@ MediaWiki supports over 350 languages. Many localisations are updated
 regularly. Below only new and removed languages are listed, as well as
 changes to languages because of Phabricator reports.
 
-* 
+* (T193566) Added language support for Ambonese Malay (abs).
 
 === Breaking changes in 1.32 ===
 * $wgRequestTime was removed (deprecated in 1.25).
@@ -70,12 +70,18 @@ changes to languages because of Phabricator reports.
   * Revision::getRawComment()
 * window.gM() from mediawiki.jqueryMsg was removed (deprecated in 1.23).
   Use mw.msg() or mw.message() instead.
+* The SqlDataUpdate class, deprecated in 1.28, has been removed.
 
 === Deprecations in 1.32 ===
 * Use of a StartProfiler.php file is deprecated in favour of placing
   configuration in LocalSettings.php.
 * HTMLForm::setSubmitProgressive() is deprecated. No need to call it. Submit
   button is already marked as progressive.
+* Skin::setupSkinUserCss() is deprecated. Adding of modules to load
+  has been centralised to Skin::getDefaultModules(), which is now capable
+  of queueing style modules as well.
+* OutputPage::addModuleScripts() and ParserOutput::addModuleScripts are deprecated.
+  Use addModules() instead.
 
 === Other changes in 1.32 ===
 * …
index b832863..e316bb5 100644 (file)
@@ -1482,7 +1482,6 @@ $wgAutoloadLocalClasses = [
        'SpecialWatchlist' => __DIR__ . '/includes/specials/SpecialWatchlist.php',
        'SpecialWhatLinksHere' => __DIR__ . '/includes/specials/SpecialWhatlinkshere.php',
        'SqlBagOStuff' => __DIR__ . '/includes/objectcache/SqlBagOStuff.php',
-       'SqlDataUpdate' => __DIR__ . '/includes/deferred/SqlDataUpdate.php',
        'SqlSearchResultSet' => __DIR__ . '/includes/search/SqlSearchResultSet.php',
        'Sqlite' => __DIR__ . '/maintenance/sqlite.inc',
        'SqliteInstaller' => __DIR__ . '/includes/installer/SqliteInstaller.php',
index 91b7e77..6e88d68 100644 (file)
@@ -71,7 +71,7 @@ want to write code destined for Wikipedia.
 It's often the case that the best algorithm to use for a given task
 depends on whether or not replication is in use. Due to our unabashed
 Wikipedia-centrism, we often just use the replication-friendly version,
-but if you like, you can use wfGetLB()->getServerCount() > 1 to
+but if you like, you can use LoadBalancer::getServerCount() > 1 to
 check to see if replication is in use.
 
 === Lag ===
@@ -107,7 +107,7 @@ in the session, and then at the start of each request, waiting for the
 slave to catch up to that position before doing any reads from it. If
 this wait times out, reads are allowed anyway, but the request is
 considered to be in "lagged slave mode". Lagged slave mode can be
-checked by calling wfGetLB()->getLaggedReplicaMode(). The only
+checked by calling LoadBalancer::getLaggedReplicaMode(). The only
 practical consequence at present is a warning displayed in the page
 footer.
 
index 6ea3b9d..2dc43fe 100644 (file)
@@ -1919,8 +1919,8 @@ $wgSQLiteDataDir = '';
  * $wgSharedSchema is the table schema for the shared database. It defaults to
  * $wgDBmwschema.
  *
- * @deprecated since 1.21 In new code, use the $wiki parameter to wfGetLB() to
- *   access remote databases. Using wfGetLB() allows the shared database to
+ * @deprecated since 1.21 In new code, use the $wiki parameter to LBFactory::getMainLB() to
+ *   access remote databases. Using LBFactory::getMainLB() allows the shared database to
  *   reside on separate servers to the wiki's own database, with suitable
  *   configuration of $wgLBFactoryConf.
  */
index 0b6e616..fbc7b60 100644 (file)
@@ -550,9 +550,7 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Add one or more modules recognized by ResourceLoader. Modules added
-        * through this function will be loaded by ResourceLoader when the
-        * page loads.
+        * Load one or more ResourceLoader modules on this page.
         *
         * @param string|array $modules Module name (string) or array of module names
         */
@@ -561,7 +559,7 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Get the list of module JS to include on this page
+        * Get the list of script-only modules to load on this page.
         *
         * @param bool $filter
         * @param string|null $position Unused
@@ -574,10 +572,13 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Add only JS of one or more modules recognized by ResourceLoader. Module
-        * scripts added through this function will be loaded by ResourceLoader when
-        * the page loads.
+        * Load the scripts of one or more ResourceLoader modules, on this page.
         *
+        * This method exists purely to provide the legacy behaviour of loading
+        * a module's scripts in the global scope, and without dependency resolution.
+        * See <https://phabricator.wikimedia.org/T188689>.
+        *
+        * @deprecated since 1.31 Use addModules() instead.
         * @param string|array $modules Module name (string) or array of module names
         */
        public function addModuleScripts( $modules ) {
@@ -585,7 +586,7 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Get the list of module CSS to include on this page
+        * Get the list of style-only modules to load on this page.
         *
         * @param bool $filter
         * @param string|null $position Unused
@@ -598,11 +599,11 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Add only CSS of one or more modules recognized by ResourceLoader.
+        * Load the styles of one or more ResourceLoader modules on this page.
         *
-        * Module styles added through this function will be added using standard link CSS
-        * tags, rather than as a combined Javascript and CSS package. Thus, they will
-        * load when JavaScript is disabled (unless CSS also happens to be disabled).
+        * Module styles added through this function will be loaded as a stylesheet,
+        * using a standard `<link rel=stylesheet>` HTML tag, rather than as a combined
+        * Javascript and CSS package. Thus, they will even load when JavaScript is disabled.
         *
         * @param string|array $modules Module name (string) or array of module names
         */
diff --git a/includes/api/i18n/zh-hk.json b/includes/api/i18n/zh-hk.json
new file mode 100644 (file)
index 0000000..5ea1800
--- /dev/null
@@ -0,0 +1,15 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Liuxinyu970226"
+               ]
+       },
+       "apihelp-block-param-hidename": "隱藏封鎖日誌的用戶名稱。 (需要 \"hideuser\" 權限)。",
+       "apihelp-block-param-allowusertalk": "允許用戶編輯自己的對話頁面 (依據 <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var> 的設定)。",
+       "apihelp-block-param-reblock": "若用戶已被封鎖,覆寫既有的封鎖設定值。",
+       "apihelp-block-param-watchuser": "監視用戶或 IP 的用戶頁面與對話頁面。",
+       "apihelp-createaccount-summary": "建立一個新用戶戶口。",
+       "apihelp-login-param-name": "用戶名稱。",
+       "apihelp-userrights-param-user": "用戶名稱。",
+       "apihelp-userrights-param-userid": "用戶 ID。"
+}
index 3947f4b..beac91e 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IDatabase;
 use Wikimedia\Rdbms\LoadBalancer;
 
@@ -59,7 +60,7 @@ abstract class DBAccessBase implements IDBAccessObject {
         * @return IDatabase
         */
        protected function getConnection( $id, $groups = [] ) {
-               $loadBalancer = wfGetLB( $this->wiki );
+               $loadBalancer = $this->getLoadBalancer();
 
                return $loadBalancer->getConnection( $id, $groups, $this->wiki );
        }
@@ -83,13 +84,14 @@ abstract class DBAccessBase implements IDBAccessObject {
        /**
         * Get the database type used for read operations.
         *
-        * @see wfGetLB
+        * @see MediaWikiServices::getDBLoadBalancer
         *
         * @since 1.21
         *
         * @return LoadBalancer The database load balancer object
         */
        public function getLoadBalancer() {
-               return wfGetLB( $this->wiki );
+               $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+               return $lbFactory->getMainLB( $this->wiki );
        }
 }
index 8913642..4ddd151 100644 (file)
@@ -177,15 +177,16 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
 
                // Commit and release the lock (if set)
                ScopedCallback::consume( $scopedLock );
-               // Run post-commit hooks without DBO_TRX
-               $this->getDB()->onTransactionIdle(
+               // Run post-commit hook handlers without DBO_TRX
+               DeferredUpdates::addUpdate( new AutoCommitUpdate(
+                       $this->getDB(),
+                       __METHOD__,
                        function () {
                                // Avoid PHP 7.1 warning from passing $this by reference
                                $linksUpdate = $this;
                                Hooks::run( 'LinksUpdateComplete', [ &$linksUpdate, $this->ticket ] );
-                       },
-                       __METHOD__
-               );
+                       }
+               ) );
        }
 
        /**
diff --git a/includes/deferred/SqlDataUpdate.php b/includes/deferred/SqlDataUpdate.php
deleted file mode 100644 (file)
index 2411bef..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
- * Base code for update jobs that put some secondary data extracted
- * from article content into the database.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-use Wikimedia\Rdbms\IDatabase;
-
-/**
- * @deprecated Since 1.28 Use DataUpdate directly, injecting the database
- */
-abstract class SqlDataUpdate extends DataUpdate {
-       /** @var IDatabase Database connection reference */
-       protected $mDb;
-       /** @var array SELECT options to be used (array) */
-       protected $mOptions = [];
-
-       public function __construct() {
-               parent::__construct();
-
-               $this->mDb = wfGetLB()->getLazyConnectionRef( DB_MASTER );
-       }
-}
index 53378e5..273d1d6 100644 (file)
@@ -24,6 +24,9 @@
  */
 use MediaWiki\Diff\ComplexityException;
 
+// FIXME: Don't use assert() in this file
+// phpcs:disable MediaWiki.Usage.ForbiddenFunctions.assert
+
 /**
  * This diff implementation is mainly lifted from the LCS algorithm of the Eclipse project which
  * in turn is based on Myers' "An O(ND) difference algorithm and its variations"
index ad80275..88631ed 100644 (file)
@@ -89,6 +89,8 @@ class WordAccumulator {
                                $this->flushLine( $tag );
                                $word = substr( $word, 1 );
                        }
+                       // FIXME: Don't use assert()
+                       // phpcs:ignore MediaWiki.Usage.ForbiddenFunctions.assert
                        assert( !strstr( $word, "\n" ) );
                        $this->group .= $word;
                }
index 06b21a8..cba21c8 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 
 /**
  * A foreign repository with a remote MediaWiki with an API thingy
@@ -332,7 +333,7 @@ class ForeignAPIRepo extends FileRepo {
         * @return bool|string
         */
        function getThumbUrlFromCache( $name, $width, $height, $params = "" ) {
-               $cache = ObjectCache::getMainWANInstance();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
                // We can't check the local cache using FileRepo functions because
                // we override fileExistsBatch(). We have to use the FileBackend directly.
                $backend = $this->getBackend(); // convenience
@@ -569,7 +570,7 @@ class ForeignAPIRepo extends FileRepo {
                        $url = $this->makeUrl( $query, 'api' );
                }
 
-               $cache = ObjectCache::getMainWANInstance();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
                return $cache->getWithSetCallback(
                        $this->getLocalCacheKey( static::class, $target, md5( $url ) ),
                        $cacheTTL,
index 249cd27..302b194 100644 (file)
  * @ingroup FileRepo
  */
 
+use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\LoadBalancer;
+
 /**
  * A foreign repository with a MediaWiki database accessible via the configured LBFactory
  *
@@ -59,14 +63,14 @@ class ForeignDBViaLBRepo extends LocalRepo {
         * @return IDatabase
         */
        function getMasterDB() {
-               return wfGetLB( $this->wiki )->getConnectionRef( DB_MASTER, [], $this->wiki );
+               return $this->getDBLoadBalancer()->getConnectionRef( DB_MASTER, [], $this->wiki );
        }
 
        /**
         * @return IDatabase
         */
        function getReplicaDB() {
-               return wfGetLB( $this->wiki )->getConnectionRef( DB_REPLICA, [], $this->wiki );
+               return $this->getDBLoadBalancer()->getConnectionRef( DB_REPLICA, [], $this->wiki );
        }
 
        /**
@@ -74,10 +78,18 @@ class ForeignDBViaLBRepo extends LocalRepo {
         */
        protected function getDBFactory() {
                return function ( $index ) {
-                       return wfGetLB( $this->wiki )->getConnectionRef( $index, [], $this->wiki );
+                       return $this->getDBLoadBalancer()->getConnectionRef( $index, [], $this->wiki );
                };
        }
 
+       /**
+        * @return LoadBalancer
+        */
+       protected function getDBLoadBalancer() {
+               $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+               return $lbFactory->getMainLB( $this->wiki );
+       }
+
        function hasSharedCache() {
                return $this->hasSharedCache;
        }
index 76043d5..03a9d44 100644 (file)
@@ -22,6 +22,7 @@
  * @ingroup FileRepo
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ResultWrapper;
 use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
@@ -200,7 +201,7 @@ class LocalRepo extends FileRepo {
                }
 
                $method = __METHOD__;
-               $redirDbKey = ObjectCache::getMainWANInstance()->getWithSetCallback(
+               $redirDbKey = MediaWikiServices::getInstance()->getMainWANObjectCache()->getWithSetCallback(
                        $memcKey,
                        $expiry,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $method, $title ) {
@@ -520,7 +521,7 @@ class LocalRepo extends FileRepo {
                if ( $key ) {
                        $this->getMasterDB()->onTransactionPreCommitOrIdle(
                                function () use ( $key ) {
-                                       ObjectCache::getMainWANInstance()->delete( $key );
+                                       MediaWikiServices::getInstance()->getMainWANObjectCache()->delete( $key );
                                },
                                __METHOD__
                        );
index d9763c6..65e4345 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup FileAbstraction
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Class representing a row of the 'filearchive' table
  *
@@ -251,7 +253,7 @@ class ArchivedFile {
                        'fa_deleted',
                        'fa_deleted_timestamp', /* Used by LocalFileRestoreBatch */
                        'fa_sha1',
-               ] + CommentStore::getStore()->getFields( 'fa_description' );
+               ] + MediaWikiServices::getInstance()->getCommentStore()->getFields( 'fa_description' );
        }
 
        /**
@@ -264,7 +266,7 @@ class ArchivedFile {
         *   - joins: (array) to include in the `$join_conds` to `IDatabase->select()`
         */
        public static function getQueryInfo() {
-               $commentQuery = CommentStore::getStore()->getJoin( 'fa_description' );
+               $commentQuery = MediaWikiServices::getInstance()->getCommentStore()->getJoin( 'fa_description' );
                $actorQuery = ActorMigration::newMigration()->getJoin( 'fa_user' );
                return [
                        'tables' => [ 'filearchive' ] + $commentQuery['tables'] + $actorQuery['tables'],
@@ -310,7 +312,7 @@ class ArchivedFile {
                $this->metadata = $row->fa_metadata;
                $this->mime = "$row->fa_major_mime/$row->fa_minor_mime";
                $this->media_type = $row->fa_media_type;
-               $this->description = CommentStore::getStore()
+               $this->description = MediaWikiServices::getInstance()->getCommentStore()
                        // Legacy because $row may have come from self::selectFields()
                        ->getCommentLegacy( wfGetDB( DB_REPLICA ), 'fa_description', $row )->text;
                $this->user = User::newFromAnyId( $row->fa_user, $row->fa_user_text, $row->fa_actor );
index cfd1cf2..7c87af3 100644 (file)
@@ -2065,7 +2065,7 @@ abstract class File implements IDBAccessObject {
 
                $renderUrl = $this->repo->getDescriptionRenderUrl( $this->getName(), $lang->getCode() );
                if ( $renderUrl ) {
-                       $cache = ObjectCache::getMainWANInstance();
+                       $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
                        $key = $this->repo->getLocalCacheKey(
                                'RemoteFileDescription',
                                'url',
index be88b49..1002b82 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup FileAbstraction
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Foreign file accessible through api.php requests.
  * Very hacky and inefficient, do not use :D
@@ -33,7 +35,7 @@ class ForeignAPIFile extends File {
        /** @var array */
        private $mInfo = [];
 
-       protected $repoClass = ForeignApiRepo::class;
+       protected $repoClass = ForeignAPIRepo::class;
 
        /**
         * @param Title|string|bool $title
@@ -360,7 +362,7 @@ class ForeignAPIFile extends File {
                $url = $this->repo->getDescriptionRenderUrl( $this->getName(), $wgContLang->getCode() );
                $key = $this->repo->getLocalCacheKey( 'RemoteFileDescription', 'url', md5( $url ) );
 
-               ObjectCache::getMainWANInstance()->delete( $key );
+               MediaWikiServices::getInstance()->getMainWANObjectCache()->delete( $key );
        }
 
        /**
@@ -368,7 +370,7 @@ class ForeignAPIFile extends File {
         */
        function purgeThumbnails( $options = [] ) {
                $key = $this->repo->getLocalCacheKey( 'ForeignAPIRepo', 'ThumbUrl', $this->getName() );
-               ObjectCache::getMainWANInstance()->delete( $key );
+               MediaWikiServices::getInstance()->getMainWANObjectCache()->delete( $key );
 
                $files = $this->getThumbnails();
                // Give media handler a chance to filter the purge list
index 388e950..05df45b 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup FileAbstraction
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\DBUnexpectedError;
 
 /**
@@ -150,7 +151,7 @@ class ForeignDBFile extends LocalFile {
                        return false; // no description page
                }
 
-               $cache = ObjectCache::getMainWANInstance();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
 
                return $cache->getWithSetCallback(
                        $this->repo->getLocalCacheKey(
index cff1044..c078e90 100644 (file)
@@ -226,7 +226,7 @@ class LocalFile extends File {
                        'img_actor' => $wgActorTableSchemaMigrationStage > MIGRATION_OLD ? 'img_actor' : null,
                        'img_timestamp',
                        'img_sha1',
-               ] + CommentStore::getStore()->getFields( 'img_description' );
+               ] + MediaWikiServices::getInstance()->getCommentStore()->getFields( 'img_description' );
        }
 
        /**
@@ -241,7 +241,7 @@ class LocalFile extends File {
         *   - joins: (array) to include in the `$join_conds` to `IDatabase->select()`
         */
        public static function getQueryInfo( array $options = [] ) {
-               $commentQuery = CommentStore::getStore()->getJoin( 'img_description' );
+               $commentQuery = MediaWikiServices::getInstance()->getCommentStore()->getJoin( 'img_description' );
                $actorQuery = ActorMigration::newMigration()->getJoin( 'img_user' );
                $ret = [
                        'tables' => [ 'image' ] + $commentQuery['tables'] + $actorQuery['tables'],
@@ -323,7 +323,7 @@ class LocalFile extends File {
                        return;
                }
 
-               $cache = ObjectCache::getMainWANInstance();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
                $cachedValues = $cache->getWithSetCallback(
                        $key,
                        $cache::TTL_WEEK,
@@ -388,7 +388,7 @@ class LocalFile extends File {
 
                $this->repo->getMasterDB()->onTransactionPreCommitOrIdle(
                        function () use ( $key ) {
-                               ObjectCache::getMainWANInstance()->delete( $key );
+                               MediaWikiServices::getInstance()->getMainWANObjectCache()->delete( $key );
                        },
                        __METHOD__
                );
@@ -579,7 +579,7 @@ class LocalFile extends File {
        function decodeRow( $row, $prefix = 'img_' ) {
                $decoded = $this->unprefixRow( $row, $prefix );
 
-               $decoded['description'] = CommentStore::getStore()
+               $decoded['description'] = MediaWikiServices::getInstance()->getCommentStore()
                        ->getComment( 'description', (object)$decoded )->text;
 
                $decoded['user'] = User::newFromAnyId(
@@ -1321,7 +1321,7 @@ class LocalFile extends File {
                        ) {
                                $props = $this->repo->getFileProps( $srcPath );
                        } else {
-                               $mwProps = new MWFileProps( MediaWiki\MediaWikiServices::getInstance()->getMimeAnalyzer() );
+                               $mwProps = new MWFileProps( MediaWikiServices::getInstance()->getMimeAnalyzer() );
                                $props = $mwProps->getPropsFromPath( $srcPath, true );
                        }
                }
@@ -1462,7 +1462,7 @@ class LocalFile extends File {
                # Test to see if the row exists using INSERT IGNORE
                # This avoids race conditions by locking the row until the commit, and also
                # doesn't deadlock. SELECT FOR UPDATE causes a deadlock for every race condition.
-               $commentStore = CommentStore::getStore();
+               $commentStore = MediaWikiServices::getInstance()->getCommentStore();
                list( $commentFields, $commentCallback ) =
                        $commentStore->insertWithTempTable( $dbw, 'img_description', $comment );
                $actorMigration = ActorMigration::newMigration();
@@ -2470,7 +2470,7 @@ class LocalFileDeleteBatch {
                $now = time();
                $dbw = $this->file->repo->getMasterDB();
 
-               $commentStore = CommentStore::getStore();
+               $commentStore = MediaWikiServices::getInstance()->getCommentStore();
                $actorMigration = ActorMigration::newMigration();
 
                $encTimestamp = $dbw->addQuotes( $dbw->timestamp( $now ) );
@@ -2830,7 +2830,7 @@ class LocalFileRestoreBatch {
 
                $dbw = $this->file->repo->getMasterDB();
 
-               $commentStore = CommentStore::getStore();
+               $commentStore = MediaWikiServices::getInstance()->getCommentStore();
                $actorMigration = ActorMigration::newMigration();
 
                $status = $this->file->repo->newGood();
index 3a6b879..aa434d0 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup FileAbstraction
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Class to represent a file in the oldimage table
  *
@@ -140,7 +142,7 @@ class OldLocalFile extends LocalFile {
                        'oi_timestamp',
                        'oi_deleted',
                        'oi_sha1',
-               ] + CommentStore::getStore()->getFields( 'oi_description' );
+               ] + MediaWikiServices::getInstance()->getCommentStore()->getFields( 'oi_description' );
        }
 
        /**
@@ -155,7 +157,7 @@ class OldLocalFile extends LocalFile {
         *   - joins: (array) to include in the `$join_conds` to `IDatabase->select()`
         */
        public static function getQueryInfo( array $options = [] ) {
-               $commentQuery = CommentStore::getStore()->getJoin( 'oi_description' );
+               $commentQuery = MediaWikiServices::getInstance()->getCommentStore()->getJoin( 'oi_description' );
                $actorQuery = ActorMigration::newMigration()->getJoin( 'oi_user' );
                $ret = [
                        'tables' => [ 'oldimage' ] + $commentQuery['tables'] + $actorQuery['tables'],
@@ -446,7 +448,8 @@ class OldLocalFile extends LocalFile {
                        return false;
                }
 
-               $commentFields = CommentStore::getStore()->insert( $dbw, 'oi_description', $comment );
+               $commentFields = MediaWikiServices::getInstance()->getCommentStore()
+                       ->insert( $dbw, 'oi_description', $comment );
                $actorFields = ActorMigration::newMigration()->getInsertValues( $dbw, 'oi_user', $user );
                $dbw->insert( 'oldimage',
                        [
index b68c7e3..dfe6a8a 100644 (file)
@@ -29,7 +29,7 @@ class HTMLExpiryField extends HTMLFormField {
         * Use whatever the relative field is as the standard HTML input.
         */
        public function getInputHTML( $value ) {
-               return $this->relativeField->getInputHtml( $value );
+               return $this->relativeField->getInputHTML( $value );
        }
 
        protected function shouldInfuseOOUI() {
index 6a55d69..cb0092d 100644 (file)
@@ -130,9 +130,9 @@ class WebInstallerOutput {
                global $wgStyleDirectory;
 
                $moduleNames = [
-                       // See SkinTemplate::setupSkinUserCss
+                       // Based on Skin::getDefaultModules
                        'mediawiki.legacy.shared',
-                       // See Vector::setupSkinUserCss
+                       // Based on Vector::setupSkinUserCss
                        'mediawiki.skinning.interface',
                ];
 
index c0b19c0..9bb5a85 100644 (file)
        "config-nofile": "Tiedostoa \"$1\" ei löytynyt. Onko se poistettu?",
        "config-extension-link": "Tiesitkö että wiki tukee [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions laajennuksia]?\n\nLaajennuksia voi hakea myös [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category luokittain].",
        "config-skins-screenshots": "$1 (kuvakaappaukset: $2)",
+       "config-extensions-requires": "$1 (vaatii $2)",
        "config-screenshot": "kuvakaappaus",
        "mainpagetext": "<strong>MediaWiki on onnistuneesti asennettu.</strong>",
        "mainpagedocfooter": "Lisätietoja wiki-ohjelmiston käytöstä on [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents käyttöoppaassa].\n\n=== Aloittaminen ===\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Asetusten teko-ohjeita]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWikin FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Sähköpostilista, jolla tiedotetaan MediaWikin uusista versioista]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Käännä MediaWikiä kielellesi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Katso, kuinka torjua spämmiä wikissäsi]\n\n=== Asetukset ===\n\nTarkista, että alla olevat taivutusmuodot ovat oikein. Jos eivät, tee tarvittavat muutokset tiedostoon LocalSettings.php seuraavasti:\n $wgGrammarForms['fi']['genitive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['partitive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['elative']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['inessive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['illative']['{{SITENAME}}'] = '...';\nTaivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) – {{GRAMMAR:partitive|{{SITENAME}}}} (yötä) – {{GRAMMAR:elative|{{SITENAME}}}} (yöstä) – {{GRAMMAR:inessive|{{SITENAME}}}} (yössä) – {{GRAMMAR:illative|{{SITENAME}}}} (yöhön)."
index dfffd68..f64add1 100644 (file)
@@ -1,8 +1,12 @@
 {
-    "@metadata": {
-        "authors": [
-            "Mark85296341"
-        ]
-    },
-    "mainpagedocfooter": "請參閱[https://meta.wikimedia.org/wiki/Help:Contents 用戶手冊]以獲得使用此 wiki 軟件的訊息!\n\n== 入門 ==\n* [https://www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki 配置設定清單]\n* [https://www.mediawiki.org/wiki/Manual:FAQ MediaWiki 常見問題解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件清單]"
+       "@metadata": {
+               "authors": [
+                       "Mark85296341",
+                       "Liuxinyu970226"
+               ]
+       },
+       "config-license-cc-by-sa": "共享創意姓名標示-相同方式分享",
+       "config-license-cc-by": "共享創意姓名標示",
+       "config-cc-not-chosen": "請選擇您要使用的共享創意授權條款,然後點選 \"proceed\"。",
+       "mainpagedocfooter": "請參閱[https://meta.wikimedia.org/wiki/Help:Contents 用戶手冊]以獲得使用此 wiki 軟件的訊息!\n\n== 入門 ==\n* [https://www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki 配置設定清單]\n* [https://www.mediawiki.org/wiki/Manual:FAQ MediaWiki 常見問題解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件清單]"
 }
index 5a996d9..657849a 100644 (file)
@@ -36,7 +36,7 @@ class Interwiki {
        protected $mAPI;
 
        /** @var string The name of the database (for a connection to be established
-        *    with wfGetLB( 'wikiid' ))
+        *    with LBFactory::getMainLB( 'wikiid' ))
         */
        protected $mWikiID;
 
index e115286..90e697e 100644 (file)
@@ -212,10 +212,10 @@ class ChronologyProtector implements LoggerAwareInterface {
                        $store->unlock( $this->key );
                } else {
                        $ok = false;
-                       $cpIndex = null; // nothing saved
                }
 
                if ( !$ok ) {
+                       $cpIndex = null; // nothing saved
                        $bouncedPositions = $this->shutdownPositions;
                        // Raced out too many times or stash is down
                        $this->logger->warning( __METHOD__ . ": failed to save master pos for " .
@@ -269,14 +269,16 @@ class ChronologyProtector implements LoggerAwareInterface {
                        // already be expired and thus treated as non-existing, maintaining correctness.
                        if ( $this->waitForPosIndex > 0 ) {
                                $data = null;
+                               $indexReached = null; // highest index reached in the position store
                                $loop = new WaitConditionLoop(
-                                       function () use ( &$data ) {
+                                       function () use ( &$data, &$indexReached ) {
                                                $data = $this->store->get( $this->key );
                                                if ( !is_array( $data ) ) {
                                                        return WaitConditionLoop::CONDITION_CONTINUE; // not found yet
                                                } elseif ( !isset( $data['writeIndex'] ) ) {
                                                        return WaitConditionLoop::CONDITION_REACHED; // b/c
                                                }
+                                               $indexReached = max( $data['writeIndex'], $indexReached );
 
                                                return ( $data['writeIndex'] >= $this->waitForPosIndex )
                                                        ? WaitConditionLoop::CONDITION_REACHED
@@ -288,11 +290,22 @@ class ChronologyProtector implements LoggerAwareInterface {
                                $waitedMs = $loop->getLastWaitTime() * 1e3;
 
                                if ( $result == $loop::CONDITION_REACHED ) {
-                                       $msg = "expected and found pos index {$this->waitForPosIndex} ({$waitedMs}ms)";
-                                       $this->logger->debug( $msg );
+                                       $this->logger->debug(
+                                               __METHOD__ . ": expected and found position index.",
+                                               [
+                                                       'cpPosIndex' => $this->waitForPosIndex,
+                                                       'waitTimeMs' => $waitedMs
+                                               ]
+                                       );
                                } else {
-                                       $msg = "expected but missed pos index {$this->waitForPosIndex} ({$waitedMs}ms)";
-                                       $this->logger->info( $msg );
+                                       $this->logger->warning(
+                                               __METHOD__ . ": expected but failed to find position index.",
+                                               [
+                                                       'cpPosIndex' => $this->waitForPosIndex,
+                                                       'indexReached' => $indexReached,
+                                                       'waitTimeMs' => $waitedMs
+                                               ]
+                                       );
                                }
                        } else {
                                $data = $this->store->get( $this->key );
index c94f62f..3432bff 100644 (file)
@@ -113,6 +113,10 @@ class DBConnRef implements IDatabase {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
+       public function preCommitCallbacksPending() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
        public function writesOrCallbacksPending() {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
index 8da1ca9..1517bd9 100644 (file)
@@ -677,6 +677,10 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                );
        }
 
+       public function preCommitCallbacksPending() {
+               return $this->trxLevel && $this->trxPreCommitCallbacks;
+       }
+
        /**
         * @return string|null
         */
index bfaa950..43e9751 100644 (file)
@@ -254,8 +254,15 @@ interface IDatabase {
        public function writesPending();
 
        /**
-        * Returns true if there is a transaction/round open with possible write
-        * queries or transaction pre-commit/idle callbacks waiting on it to finish.
+        * @return bool Whether there is a transaction open with pre-commit callbacks pending
+        * @since 1.32
+        */
+       public function preCommitCallbacksPending();
+
+       /**
+        * Whether there is a transaction open with either possible write queries
+        * or unresolved pre-commit/commit/resolution callbacks pending
+        *
         * This does *not* count recurring callbacks, e.g. from setTransactionListener().
         *
         * @return bool
index ccaebd3..fe18536 100644 (file)
@@ -246,7 +246,12 @@ abstract class LBFactory implements ILBFactory {
                /** @noinspection PhpUnusedLocalVariableInspection */
                $scope = $this->getScopedPHPBehaviorForCommit(); // try to ignore client aborts
                // Run pre-commit callbacks and suppress post-commit callbacks, aborting on failure
-               $this->forEachLBCallMethod( 'finalizeMasterChanges' );
+               do {
+                       $count = 0; // number of callbacks executed this iteration
+                       $this->forEachLB( function ( ILoadBalancer $lb ) use ( &$count ) {
+                               $count += $lb->finalizeMasterChanges();
+                       } );
+               } while ( $count > 0 );
                $this->trxRoundId = false;
                // Perform pre-commit checks, aborting on failure
                $this->forEachLBCallMethod( 'approveMasterChanges', [ $options ] );
@@ -254,6 +259,29 @@ abstract class LBFactory implements ILBFactory {
                $this->logIfMultiDbTransaction();
                // Actually perform the commit on all master DB connections and revert DBO_TRX
                $this->forEachLBCallMethod( 'commitMasterChanges', [ $fname ] );
+               // Run all post-commit callbacks in a separate step
+               $e = $this->executePostTransactionCallbacks();
+               $this->trxRoundStage = self::ROUND_CURSORY;
+               // Throw any last post-commit callback error
+               if ( $e instanceof Exception ) {
+                       throw $e;
+               }
+       }
+
+       final public function rollbackMasterChanges( $fname = __METHOD__ ) {
+               $this->trxRoundStage = self::ROUND_ROLLING_BACK;
+               $this->trxRoundId = false;
+               // Actually perform the rollback on all master DB connections and revert DBO_TRX
+               $this->forEachLBCallMethod( 'rollbackMasterChanges', [ $fname ] );
+               // Run all post-commit callbacks in a separate step
+               $this->executePostTransactionCallbacks();
+               $this->trxRoundStage = self::ROUND_CURSORY;
+       }
+
+       /**
+        * @return Exception|null
+        */
+       private function executePostTransactionCallbacks() {
                // Run all post-commit callbacks until new ones stop getting added
                $e = null; // first callback exception
                do {
@@ -267,20 +295,8 @@ abstract class LBFactory implements ILBFactory {
                        $ex = $lb->runMasterTransactionListenerCallbacks();
                        $e = $e ?: $ex;
                } );
-               $this->trxRoundStage = self::ROUND_CURSORY;
-               // Throw any last post-commit callback error
-               if ( $e instanceof Exception ) {
-                       throw $e;
-               }
-       }
 
-       final public function rollbackMasterChanges( $fname = __METHOD__ ) {
-               $this->trxRoundStage = self::ROUND_ROLLING_BACK;
-               $this->trxRoundId = false;
-               $this->forEachLBCallMethod( 'rollbackMasterChanges', [ $fname ] );
-               $this->forEachLBCallMethod( 'runMasterTransactionIdleCallbacks' );
-               $this->forEachLBCallMethod( 'runMasterTransactionListenerCallbacks' );
-               $this->trxRoundStage = self::ROUND_CURSORY;
+               return $e;
        }
 
        public function hasTransactionRound() {
index dd257e5..5d217e2 100644 (file)
@@ -380,6 +380,8 @@ interface ILoadBalancer {
         * Run pre-commit callbacks and defer execution of post-commit callbacks
         *
         * Use this only for mutli-database commits
+        *
+        * @return int Number of pre-commit callbacks run (since 1.32)
         */
        public function finalizeMasterChanges();
 
@@ -416,7 +418,7 @@ interface ILoadBalancer {
        public function commitMasterChanges( $fname = __METHOD__ );
 
        /**
-        * Consume and run all pending post-COMMIT/ROLLBACK callbacks
+        * Consume and run all pending post-COMMIT/ROLLBACK callbacks and commit dangling transactions
         *
         * @return Exception|null The first exception or null if there were none
         */
@@ -449,7 +451,7 @@ interface ILoadBalancer {
        public function hasMasterConnection();
 
        /**
-        * Determine if there are pending changes in a transaction by this thread
+        * Whether there are pending changes or callbacks in a transaction by this thread
         * @return bool
         */
        public function hasMasterChanges();
index ddc4277..cb6e4f4 100644 (file)
@@ -1263,10 +1263,11 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function finalizeMasterChanges() {
-               $this->assertTransactionRoundStage( self::ROUND_CURSORY );
+               $this->assertTransactionRoundStage( [ self::ROUND_CURSORY, self::ROUND_FINALIZED ] );
 
                $this->trxRoundStage = self::ROUND_ERROR; // "failed" until proven otherwise
                // Loop until callbacks stop adding callbacks on other connections
+               $total = 0;
                do {
                        $count = 0; // callbacks execution attempts
                        $this->forEachOpenMasterConnection( function ( Database $conn ) use ( &$count ) {
@@ -1274,12 +1275,15 @@ class LoadBalancer implements ILoadBalancer {
                                // Any error should cause all (peer) transactions to be rolled back together.
                                $count += $conn->runOnTransactionPreCommitCallbacks();
                        } );
+                       $total += $count;
                } while ( $count > 0 );
                // Defer post-commit callbacks until after COMMIT/ROLLBACK happens on all handles
                $this->forEachOpenMasterConnection( function ( Database $conn ) {
                        $conn->setTrxEndCallbackSuppression( true );
                } );
                $this->trxRoundStage = self::ROUND_FINALIZED;
+
+               return $total;
        }
 
        public function approveMasterChanges( array $options ) {
@@ -1494,13 +1498,21 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        /**
-        * @param string $stage
+        * @param string|string[] $stage
         */
        private function assertTransactionRoundStage( $stage ) {
-               if ( $this->trxRoundStage !== $stage ) {
+               $stages = (array)$stage;
+
+               if ( !in_array( $this->trxRoundStage, $stages, true ) ) {
+                       $stageList = implode(
+                               '/',
+                               array_map( function ( $v ) {
+                                       return "'$v'";
+                               }, $stages )
+                       );
                        throw new DBTransactionError(
                                null,
-                               "Transaction round stage must be '$stage' (not '{$this->trxRoundStage}')"
+                               "Transaction round stage must be $stageList (not '{$this->trxRoundStage}')"
                        );
                }
        }
index 24fdfb0..c047e96 100644 (file)
@@ -65,10 +65,11 @@ class LogPager extends ReverseChronologicalPager {
         * @param int|bool $month The month to start from. Default: false
         * @param string $tagFilter Tag
         * @param string $action Specific action (subtype) requested
+        * @param int $logId Log entry ID, to limit to a single log entry.
         */
        public function __construct( $list, $types = [], $performer = '', $title = '',
                $pattern = '', $conds = [], $year = false, $month = false, $tagFilter = '',
-               $action = ''
+               $action = '', $logId = false
        ) {
                parent::__construct( $list->getContext() );
                $this->mConds = $conds;
@@ -81,6 +82,7 @@ class LogPager extends ReverseChronologicalPager {
                $this->limitAction( $action );
                $this->getDateCond( $year, $month );
                $this->mTagFilter = $tagFilter;
+               $this->limitLogId( $logId );
 
                $this->mDb = wfGetDB( DB_REPLICA, 'logpager' );
        }
@@ -278,6 +280,17 @@ class LogPager extends ReverseChronologicalPager {
                }
        }
 
+       /**
+        * Limit to the (single) specified log ID.
+        * @param int $logId The log entry ID.
+        */
+       protected function limitLogId( $logId ) {
+               if ( !$logId ) {
+                       return;
+               }
+               $this->mConds['log_id'] = $logId;
+       }
+
        /**
         * Constructs the most part of the query. Extra conditions are sprinkled in
         * all over this class.
index f3a83db..aa015a6 100644 (file)
@@ -744,14 +744,24 @@ class ParserOutput extends CacheTime {
                }
        }
 
+       /**
+        * @see OutputPage::addModules
+        */
        public function addModules( $modules ) {
                $this->mModules = array_merge( $this->mModules, (array)$modules );
        }
 
+       /**
+        * @deprecated since 1.31 Use addModules() instead.
+        * @see OutputPage::addModuleScripts
+        */
        public function addModuleScripts( $modules ) {
                $this->mModuleScripts = array_merge( $this->mModuleScripts, (array)$modules );
        }
 
+       /**
+        * @see OutputPage::addModuleStyles
+        */
        public function addModuleStyles( $modules ) {
                $this->mModuleStyles = array_merge( $this->mModuleStyles, (array)$modules );
        }
index 64edbb2..104cd13 100644 (file)
@@ -566,6 +566,8 @@ class Preprocessor_DOM extends Preprocessor {
                        } elseif ( $found == 'line-end' ) {
                                $piece = $stack->top;
                                // A heading must be open, otherwise \n wouldn't have been in the search list
+                               // FIXME: Don't use assert()
+                               // phpcs:ignore MediaWiki.Usage.ForbiddenFunctions.assert
                                assert( $piece->open === "\n" );
                                $part = $piece->getCurrentPart();
                                // Search back through the input to see if it has a proper close.
index c7f630d..8e74380 100644 (file)
@@ -504,6 +504,8 @@ class Preprocessor_Hash extends Preprocessor {
                        } elseif ( $found == 'line-end' ) {
                                $piece = $stack->top;
                                // A heading must be open, otherwise \n wouldn't have been in the search list
+                               // FIXME: Don't use assert()
+                               // phpcs:ignore MediaWiki.Usage.ForbiddenFunctions.assert
                                assert( $piece->open === "\n" );
                                $part = $piece->getCurrentPart();
                                // Search back through the input to see if it has a proper close.
index fbd0a24..de25d32 100644 (file)
@@ -93,6 +93,9 @@ class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
        }
 
        /**
+        * Non-static proxy to ::getLogo (for overloading in sub classes or tests).
+        *
+        * @codeCoverageIgnore
         * @since 1.31
         * @param Config $conf
         * @return string|array
index 2247cc2..340bc2f 100644 (file)
@@ -174,23 +174,29 @@ abstract class Skin extends ContextSource {
        public function getDefaultModules() {
                $out = $this->getOutput();
                $config = $this->getConfig();
-               $user = $out->getUser();
+               $user = $this->getUser();
+
+               // Modules declared in the $modules literal are loaded
+               // for ALL users, on ALL pages, in ALL skins.
+               // Keep this list as small as possible!
                $modules = [
-                       // Styles key sets render blocking styles
-                       // Unlike other keys in this definition it is an associative array
-                       // where each key is the group name and points to a list of modules
                        'styles' => [
+                               // The 'styles' key sets render-blocking style modules
+                               // Unlike other keys in $modules, this is an associative array
+                               // where each key is its own group pointing to a list of modules
+                               'core' => [
+                                       'mediawiki.legacy.shared',
+                                       'mediawiki.legacy.commonPrint',
+                               ],
                                'content' => [],
+                               'syndicate' => [],
                        ],
-                       // modules not specific to any specific skin or page
                        'core' => [
-                               // Enforce various default modules for all pages and all skins
-                               // Keep this list as small as possible
                                'site',
                                'mediawiki.page.startup',
                                'mediawiki.user',
                        ],
-                       // modules that enhance the page content in some way
+                       // modules that enhance the content in some way
                        'content' => [
                                'mediawiki.page.ready',
                        ],
@@ -200,6 +206,8 @@ abstract class Skin extends ContextSource {
                        'watch' => [],
                        // modules which relate to the current users preferences
                        'user' => [],
+                       // modules relating to RSS/Atom Feeds
+                       'syndicate' => [],
                ];
 
                // Support for high-density display images if enabled
@@ -219,6 +227,12 @@ abstract class Skin extends ContextSource {
                        $modules['styles']['content'][] = 'jquery.makeCollapsible.styles';
                }
 
+               // Deprecated since 1.26: Unconditional loading of mediawiki.ui.button
+               // on every page is deprecated. Express a dependency instead.
+               if ( strpos( $out->getHTML(), 'mw-ui-button' ) !== false ) {
+                       $modules['styles']['content'][] = 'mediawiki.ui.button';
+               }
+
                if ( $out->isTOCEnabled() ) {
                        $modules['content'][] = 'mediawiki.toc';
                }
@@ -241,6 +255,11 @@ abstract class Skin extends ContextSource {
                if ( $out->isArticle() && $user->getOption( 'editondblclick' ) ) {
                        $modules['user'][] = 'mediawiki.action.view.dblClickEdit';
                }
+
+               if ( $out->isSyndicated() ) {
+                       $modules['styles']['syndicate'][] = 'mediawiki.feedlink';
+               }
+
                return $modules;
        }
 
@@ -412,14 +431,14 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * Add skin specific stylesheets
-        * Calling this method with an $out of anything but the same OutputPage
-        * inside ->getOutput() is deprecated. The $out arg is kept
-        * for compatibility purposes with skins.
-        * @param OutputPage $out
-        * @todo delete
+        * Hook point for adding style modules to OutputPage.
+        *
+        * @deprecated since 1.32 Use getDefaultModules() instead.
+        * @param OutputPage $out Legacy parameter, identical to $this->getOutput()
         */
-       abstract function setupSkinUserCss( OutputPage $out );
+       public function setupSkinUserCss( OutputPage $out ) {
+               // Stub.
+       }
 
        /**
         * TODO: document
index 4587533..1d5d534 100644 (file)
@@ -56,30 +56,6 @@ class SkinTemplate extends Skin {
        public $username;
        public $userpageUrlDetails;
 
-       /**
-        * Add specific styles for this skin
-        *
-        * @param OutputPage $out
-        */
-       public function setupSkinUserCss( OutputPage $out ) {
-               $moduleStyles = [
-                       'mediawiki.legacy.shared',
-                       'mediawiki.legacy.commonPrint',
-                       'mediawiki.sectionAnchor'
-               ];
-               if ( $out->isSyndicated() ) {
-                       $moduleStyles[] = 'mediawiki.feedlink';
-               }
-
-               // Deprecated since 1.26: Unconditional loading of mediawiki.ui.button
-               // on every page is deprecated. Express a dependency instead.
-               if ( strpos( $out->getHTML(), 'mw-ui-button' ) !== false ) {
-                       $moduleStyles[] = 'mediawiki.ui.button';
-               }
-
-               $out->addModuleStyles( $moduleStyles );
-       }
-
        /**
         * Create the template engine object; we feed it a bunch of data
         * and eventually it spits out some HTML. Should have interface
index 6a11bf4..bad1746 100644 (file)
@@ -51,6 +51,7 @@ class SpecialLog extends SpecialPage {
                $opts->add( 'dir', '' );
                $opts->add( 'offender', '' );
                $opts->add( 'subtype', '' );
+               $opts->add( 'logid', '' );
 
                // Set values
                $opts->fetchValuesFromRequest( $this->getRequest() );
@@ -169,6 +170,16 @@ class SpecialLog extends SpecialPage {
                return $subpages;
        }
 
+       /**
+        * Set options based on the subpage title parts:
+        * - One part that is a valid log type: Special:Log/logtype
+        * - Two parts: Special:Log/logtype/username
+        * - Otherwise, assume the whole subpage is a username.
+        *
+        * @param FormOptions $opts
+        * @param $par
+        * @throws ConfigException
+        */
        private function parseParams( FormOptions $opts, $par ) {
                # Get parameters
                $par = $par !== null ? $par : '';
@@ -204,7 +215,8 @@ class SpecialLog extends SpecialPage {
                        $opts->getValue( 'year' ),
                        $opts->getValue( 'month' ),
                        $opts->getValue( 'tagfilter' ),
-                       $opts->getValue( 'subtype' )
+                       $opts->getValue( 'subtype' ),
+                       $opts->getValue( 'logid' )
                );
 
                $this->addHeader( $opts->getValue( 'type' ) );
index 36e7779..e827911 100644 (file)
@@ -162,7 +162,7 @@ class SpecialRedirect extends FormSpecialPage {
 
        /**
         * Handle Special:Redirect/logid/xxx
-        * (by redirecting to index.php?title=Special:Log)
+        * (by redirecting to index.php?title=Special:Log&logid=xxx)
         *
         * @since 1.27
         * @return string|null Url to redirect to, or null if $mValue is invalid.
@@ -176,80 +176,8 @@ class SpecialRedirect extends FormSpecialPage {
                if ( $logid === 0 ) {
                        return null;
                }
-
-               $logQuery = ActorMigration::newMigration()->getJoin( 'log_user' );
-
-               $logparams = [
-                       'log_id' => 'log_id',
-                       'log_timestamp' => 'log_timestamp',
-                       'log_type' => 'log_type',
-                       'log_user_text' => $logQuery['fields']['log_user_text'],
-               ];
-
-               $dbr = wfGetDB( DB_REPLICA );
-
-               // Gets the nested SQL statement which
-               // returns timestamp of the log with the given log ID
-               $inner = $dbr->selectSQLText(
-                       'logging',
-                       [ 'log_timestamp' ],
-                       [ 'log_id' => $logid ]
-               );
-
-               // Returns all fields mentioned in $logparams of the logs
-               // with the same timestamp as the one returned by the statement above
-               $logsSameTimestamps = $dbr->select(
-                       [ 'logging' ] + $logQuery['tables'],
-                       $logparams,
-                       [ "log_timestamp = ($inner)" ],
-                       __METHOD__,
-                       [],
-                       $logQuery['joins']
-               );
-               if ( $logsSameTimestamps->numRows() === 0 ) {
-                       return null;
-               }
-
-               // Stores the row with the same log ID as the one given
-               $rowMain = [];
-               foreach ( $logsSameTimestamps as $row ) {
-                       if ( (int)$row->log_id === $logid ) {
-                               $rowMain = $row;
-                       }
-               }
-
-               array_shift( $logparams );
-
-               // Stores all the rows with the same values in each column
-               // as $rowMain
-               foreach ( $logparams as $key => $dummy ) {
-                       $matchedRows = [];
-                       foreach ( $logsSameTimestamps as $row ) {
-                               if ( $row->$key === $rowMain->$key ) {
-                                       $matchedRows[] = $row;
-                               }
-                       }
-                       if ( count( $matchedRows ) === 1 ) {
-                               break;
-                       }
-                       $logsSameTimestamps = $matchedRows;
-               }
-               $query = [ 'title' => 'Special:Log', 'limit' => count( $matchedRows ) ];
-
-               // A map of database field names from table 'logging' to the values of $logparams
-               $keys = [
-                       'log_timestamp' => 'offset',
-                       'log_type' => 'type',
-                       'log_user_text' => 'user'
-               ];
-
-               foreach ( $logparams as $logKey => $dummy ) {
-                       $query[$keys[$logKey]] = $matchedRows[0]->$logKey;
-               }
-               $query['offset'] = $query['offset'] + 1;
-               $url = $query;
-
-               return wfAppendQuery( wfScript( 'index' ), $url );
+               $query = [ 'title' => 'Special:Log', 'logid' => $logid ];
+               return wfAppendQuery( wfScript( 'index' ), $query );
        }
 
        /**
index 6d6bf0e..a05452d 100644 (file)
@@ -882,7 +882,7 @@ class UserrightsPage extends SpecialPage {
                                                }
                                                // T171345: Add a hidden form element so that other groups can still be manipulated,
                                                // otherwise saving errors out with an invalid expiry time for this group.
-                                               $expiryHtml .= Html::Hidden( "wpExpiry-$group",
+                                               $expiryHtml .= Html::hidden( "wpExpiry-$group",
                                                        $currentExpiry ? 'existing' : 'infinite' );
                                                $expiryHtml .= "<br />\n";
                                        } else {
index 4b5fe19..b2f1487 100644 (file)
@@ -519,8 +519,8 @@ class ImageListPager extends TablePager {
        }
 
        function getForm() {
-               $fields = [];
-               $fields['limit'] = [
+               $formDescriptor = [];
+               $formDescriptor['limit'] = [
                        'type' => 'select',
                        'name' => 'limit',
                        'label-message' => 'table_pager_limit_label',
@@ -529,7 +529,7 @@ class ImageListPager extends TablePager {
                ];
 
                if ( !$this->getConfig()->get( 'MiserMode' ) ) {
-                       $fields['ilsearch'] = [
+                       $formDescriptor['ilsearch'] = [
                                'type' => 'text',
                                'name' => 'ilsearch',
                                'id' => 'mw-ilsearch',
@@ -540,7 +540,7 @@ class ImageListPager extends TablePager {
                        ];
                }
 
-               $fields['user'] = [
+               $formDescriptor['user'] = [
                        'type' => 'user',
                        'name' => 'user',
                        'id' => 'mw-listfiles-user',
@@ -550,7 +550,7 @@ class ImageListPager extends TablePager {
                        'maxlength' => '255',
                ];
 
-               $fields['ilshowall'] = [
+               $formDescriptor['ilshowall'] = [
                        'type' => 'check',
                        'name' => 'ilshowall',
                        'id' => 'mw-listfiles-show-all',
@@ -565,17 +565,16 @@ class ImageListPager extends TablePager {
                unset( $query['ilshowall'] );
                unset( $query['user'] );
 
-               $form = new HTMLForm( $fields, $this->getContext() );
-
-               $form->setMethod( 'get' );
-               $form->setTitle( $this->getTitle() );
-               $form->setId( 'mw-listfiles-form' );
-               $form->setWrapperLegendMsg( 'listfiles' );
-               $form->setSubmitTextMsg( 'table_pager_limit_submit' );
-               $form->addHiddenFields( $query );
-
-               $form->prepareForm();
-               $form->displayForm( '' );
+               $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() );
+               $htmlForm
+                       ->setMethod( 'get' )
+                       ->setId( 'mw-listfiles-form' )
+                       ->setTitle( $this->getTitle() )
+                       ->setSubmitTextMsg( 'table_pager_limit_submit' )
+                       ->setWrapperLegendMsg( 'listfiles' )
+                       ->addHiddenFields( $query )
+                       ->prepareForm()
+                       ->displayForm( '' );
        }
 
        protected function getTableClass() {
index b8186d6..5a5139d 100644 (file)
@@ -414,7 +414,8 @@ class User implements IDBAccessObject, UserIdentity {
                                break;
                        case 'actor':
                                // Make sure this thread sees its own changes
-                               if ( wfGetLB()->hasOrMadeRecentMasterChanges() ) {
+                               $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
+                               if ( $lb->hasOrMadeRecentMasterChanges() ) {
                                        $flags |= self::READ_LATEST;
                                        $this->queryFlagsUsed = $flags;
                                }
index 710d6be..77b9375 100644 (file)
@@ -48,6 +48,7 @@ class Names {
        public static $names = [
                'aa' => 'Qafár af', # Afar
                'ab' => 'Аҧсшәа', # Abkhaz
+               'abs' => 'bahasa ambon', # Ambonese Malay, T193566
                'ace' => 'Acèh', # Aceh
                'ady' => 'адыгабзэ', # Adyghe
                'ady-cyrl' => 'адыгабзэ', # Adyghe
index c4eb969..89fd60b 100644 (file)
        "unlinkaccounts": "إزالة ربط الحسابات",
        "unlinkaccounts-success": "الحساب تم فك وصله.",
        "authenticationdatachange-ignored": "تغيير بيانات التحقق لم يتم التعامل معه. ربما لم يتم ضبط موفر؟",
-       "userjsispublic": "من فضلك لاحظ: صفحات الجافاسكريبت الفرعية لا ينبغي أن تحتوي غلى بيانات سرية بما أنها يمكن رؤيتها بواسطة المستخدمين الآخرين.",
+       "userjsispublic": "'''من فضلك لاحظ:''' صفحات الجافاسكريبت الفرعية لا ينبغي أن تحتوي على بياناتٍ سرية، وذلك لأنه يمكن مشاهدتها بواسطة المستخدمين الآخرين.",
        "userjsonispublic": "الرجاء ملاحظة أنه: يجب ألا تحتوي الصفحات الفرعية لجسون على بيانات سرية لأنها قابلة للعرض من قبل المستخدمين الآخرين.",
        "usercssispublic": "من فضل لاحظ: صفحات الCSS الفرعية لا ينبغي أن تحتوي على بيانات سرية بما أنها يمكن رؤيتها بواسطة المستخدمين الآخرين.",
        "restrictionsfield-badip": "عنوان أيبي أو نطاق غير صحيح: $1",
index 369ae41..29e7750 100644 (file)
        "rcfilters-filter-user-experience-level-registered-label": "Зарэгістраваныя",
        "rcfilters-filter-user-experience-level-registered-description": "Рэдактары, якія ўвайшлі ў сыстэму.",
        "rcfilters-filter-user-experience-level-unregistered-label": "Незарэгістраваныя",
-       "rcfilters-filter-user-experience-level-unregistered-description": "Рэдактары, якія не ўвайшлі ў сыстэму",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Рэдактары, якія не ўвайшлі ў сыстэму.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Навічкі",
        "rcfilters-filter-user-experience-level-newcomer-description": "Зарэгістраваныя рэдактары, якія маюць менш чым 10 правак ці 4 дні актыўнасьці.",
        "rcfilters-filter-user-experience-level-learner-label": "Вучні",
        "boteditletter": "р",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|назіральнік|назіральнікі|назіральнікаў}}]",
        "rc-change-size-new": "$1 {{PLURAL:$1|байт|байты|байтаў}} пасьля зьмены",
-       "newsectionsummary": "/* $1 */ новая сэкцыя",
+       "newsectionsummary": "/* $1 */ новы разьдзел",
        "rc-enhanced-expand": "Паказаць падрабязнасьці",
        "rc-enhanced-hide": "Схаваць падрабязнасьці",
        "rc-old-title": "зь першапачатковай назвай «$1»",
        "recentchangeslinked-feed": "Зьвязаныя праўкі",
        "recentchangeslinked-toolbox": "Зьвязаныя праўкі",
        "recentchangeslinked-title": "Зьвязаныя праўкі для «$1»",
-       "recentchangeslinked-summary": "Увядзіце назву старонкі, каб пабачыць зьмены старонак, на якія яна спасылаецца або якія спасылаюцца на яе (каб пабачыць старонкі з катэгорыі, увядзіце Катэгорыя:Назва). Зьмены старонак з [[Special:Watchlist|вашага сьпісу назіраньня]] пазначаныя <strong>тоўстым шрыфтам</strong>.",
+       "recentchangeslinked-summary": "Увядзіце назву старонкі, каб пабачыць зьмены старонак, на якія яна спасылаецца або якія спасылаюцца на яе (каб пабачыць старонкі з катэгорыі, увядзіце {{ns:category}}:Назва). Зьмены старонак з [[Special:Watchlist|вашага сьпісу назіраньня]] пазначаныя <strong>тоўстым шрыфтам</strong>.",
        "recentchangeslinked-page": "Назва старонкі:",
        "recentchangeslinked-to": "Замест гэтага паказваць зьмены на старонках, што спасылаюцца на гэтую старонку",
        "recentchanges-page-added-to-category": "[[:$1]] дададзеная да катэгорыі",
        "tag-mw-rollback": "Адкат",
        "tag-mw-rollback-description": "Праўкі, якія адкатваюць папярэднія рэдагаваньні з дапамогай спасылкі адкату",
        "tag-mw-undo": "Адмена",
-       "tag-mw-undo-description": "Праўкі, якія адмяняць папярэднія праўкі з дапамогай спасылкі адмены праўкі",
+       "tag-mw-undo-description": "Ð\9fÑ\80аÑ\9eкÑ\96, Ñ\8fкÑ\96Ñ\8f Ð°Ð´Ð¼Ñ\8fнÑ\8fÑ\8eÑ\86Ñ\8c Ð¿Ð°Ð¿Ñ\8fÑ\80Ñ\8dднÑ\96Ñ\8f Ð¿Ñ\80аÑ\9eкÑ\96 Ð· Ð´Ð°Ð¿Ð°Ð¼Ð¾Ð³Ð°Ð¹ Ñ\81паÑ\81Ñ\8bлкÑ\96 Ð°Ð´Ð¼ÐµÐ½Ñ\8b Ð¿Ñ\80аÑ\9eкÑ\96",
        "tags-title": "Меткі",
        "tags-intro": "На гэтай старонцы знаходзіцца сьпіс метак, якімі праграмнае забесьпячэньне можа пазначыць рэдагаваньне, і іх значэньне.",
        "tags-tag": "Назва меткі",
index 4df653e..0333b61 100644 (file)
@@ -38,8 +38,8 @@
        },
        "tog-underline": "Падкрэсліваць спасылкі:",
        "tog-hideminor": "Не паказваць дробныя праўкі",
-       "tog-hidepatrolled": "Без паказу ўхваленых правак у нядаўніх змяненнях",
-       "tog-newpageshidepatrolled": "Без паказу ўхваленых правак у пераліку новых старонак",
+       "tog-hidepatrolled": "Без паказу дагледжаных правак у апошніх зменах",
+       "tog-newpageshidepatrolled": "Без паказу дагледжаных правак у пераліку новых старонак",
        "tog-hidecategorization": "Схаваць катэгорызацыю старонак",
        "tog-extendwatchlist": "Паказваць усе змяненні, а не толькі апошнія",
        "tog-usenewrc": "Групаваць змены па старонках у апошніх зменах і спісе назірання",
@@ -63,7 +63,7 @@
        "tog-shownumberswatching": "Паказваць колькасць назіральнікаў",
        "tog-oldsig": "Ваш цяперашні подпіс:",
        "tog-fancysig": "Апрацоўваць подпіс як вікі-тэкст (без аўтаматычнай спасылкі)",
-       "tog-uselivepreview": "Паказваць папярэдні прагля без перазагрузкі старонкі",
+       "tog-uselivepreview": "Паказваць папярэдні прагляд без перазагрузкі старонкі",
        "tog-forceeditsummary": "Папярэджваць пра пустое поле тлумачэння праўкі",
        "tog-watchlisthideown": "Не паказваць маіх правак са спісу назірання",
        "tog-watchlisthidebots": "Не паказваць праўкі ботаў са спісу назірання",
@@ -75,7 +75,7 @@
        "tog-watchlisthidepatrolled": "Не паказваць ухваленых правак у старонках са спісу назірання",
        "tog-watchlisthidecategorization": "Схаваць катэгорызацыю старонак",
        "tog-ccmeonemails": "Слаць мне копіі маіх лістоў",
-       "tog-diffonly": "Не паказваць рэшты старонкі пад розніцай",
+       "tog-diffonly": "Не паказваць змест старонкі пад параўнаннем двух версій",
        "tog-showhiddencats": "Паказаць схаваныя катэгорыі",
        "tog-norollbackdiff": "Не паказваць розніцу ў выніку адкату",
        "tog-useeditwarning": "Папярэдзіць мяне, калі я пакідаю старонку з незахаванымі праўкамі",
        "prefs-dateformat": "Фармат даты",
        "prefs-timeoffset": "Часавы пояс",
        "prefs-advancedediting": "Агульныя настройкі",
+       "prefs-developertools": "Інструменты распрацоўшчыка",
        "prefs-editor": "Рэдактар",
        "prefs-preview": "Перадпаказ",
        "prefs-advancedrc": "Пашыраныя настройкі",
        "rcfilters-filter-user-experience-level-newcomer-label": "Навічкі",
        "rcfilters-filter-user-experience-level-newcomer-description": "Зарэгістраваныя рэдактары, якія маюць менш за 10 правак або 4 дзён актыўнасці.",
        "rcfilters-filter-user-experience-level-learner-label": "Вучні",
-       "rcfilters-filter-user-experience-level-learner-description": "Ð\97аÑ\80Ñ\8dгÑ\96Ñ\81Ñ\82Ñ\80аванÑ\8bÑ\8f Ñ\80Ñ\8dдакÑ\82аÑ\80Ñ\8b, Ð²Ð¾Ð¿Ñ\8bÑ\82 Ñ\8fкÑ\96Ñ\85 Ð·Ð½Ð°Ñ\85одзÑ\96Ñ\86Ñ\86а Ð¿Ð°Ð¼Ñ\96ж Â«Ð½Ð°Ð²Ñ\96Ñ\87камÑ\96» Ñ\96 Â«Ð´Ð°Ñ\81ведÑ\87анÑ\8bмÑ\96 Ñ\83дзельнікамі».",
+       "rcfilters-filter-user-experience-level-learner-description": "Ð\97аÑ\80Ñ\8dгÑ\96Ñ\81Ñ\82Ñ\80аванÑ\8bÑ\8f Ñ\80Ñ\8dдакÑ\82аÑ\80Ñ\8b, Ð²Ð¾Ð¿Ñ\8bÑ\82 Ñ\8fкÑ\96Ñ\85 Ð·Ð½Ð°Ñ\85одзÑ\96Ñ\86Ñ\86а Ð¿Ð°Ð¼Ñ\96ж Â«Ð½Ð°Ð²Ñ\96Ñ\87камÑ\96» Ñ\96 Â«Ð²Ð¾Ð¿Ñ\8bÑ\82нÑ\8bмÑ\96 Ñ\9eдзельнікамі».",
        "rcfilters-filter-user-experience-level-experienced-label": "Вопытныя ўдзельнікі",
        "rcfilters-filter-user-experience-level-experienced-description": "Зарэгістраваныя рэдактары з больш за 500 правак і 30 дзён актыўнасці.",
        "rcfilters-filtergroup-automated": "Аўтаматызаваны ўнёсак",
        "rcfilters-filter-major-description": "Праўкі, не пазначаныя як дробныя.",
        "rcfilters-filtergroup-watchlist": "Старонкі ў спісе назірання",
        "rcfilters-filter-watchlist-watched-label": "У спісе назірання",
-       "rcfilters-filter-watchlist-watched-description": "Змяненні старонак у Вашым спісе назірання.",
-       "rcfilters-filter-watchlist-watchednew-label": "Новыя змяненні ў спісе назірання",
+       "rcfilters-filter-watchlist-watched-description": "Змены ў старонках з Вашага спісу назірання.",
+       "rcfilters-filter-watchlist-watchednew-label": "Новыя змены ў спісе назірання",
        "rcfilters-filter-watchlist-watchednew-description": "Праўкі на старонках з Вашага спісу назірання, якія Вы не праглядалі з часу іх здзяйснення.",
        "rcfilters-filter-watchlist-notwatched-label": "Не ў спісе назірання",
        "rcfilters-filter-watchlist-notwatched-description": "Усё за выключэннем правак старонак з Вашага спісу назірання.",
        "rcfilters-liveupdates-button-title-off": "Паказваць навыя змены адразу пасля іх з’яўлення",
        "rcfilters-watchlist-markseen-button": "Пазначыць усе змены як прагледжаныя",
        "rcfilters-watchlist-edit-watchlist-button": "Рэдагаваць Ваш спіс назіраных старонак",
+       "rcfilters-watchlist-showupdated": "Змены старонак, якія Вы не наведвалі з таго часу, як яны адбыліся, выдзелены <strong>тлустым</strong> і пазначаны маркерам.",
        "rcfilters-preference-label": "Схаваць палепшаную версію «Апошніх змен»",
        "rcfilters-preference-help": "Адкатвае рэдызайн інтэрфейсу 2017 года і ўсе інструменты, дададзеныя з тых часоў.",
        "rcnotefrom": "Ніжэй {{PLURAL:$5|паказана змяненне|паказаны змены}} з <strong>$3, $4</strong> (не больш за <strong>$1</strong>).",
        "tag-filter-submit": "Фільтр",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Тэг|Тэгі}}]]: $2)",
        "tag-mw-contentmodelchange": "змена мадэлі змесціва",
+       "tag-mw-contentmodelchange-description": "Праўкі, якія [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel мяняюць мадэль змесціва] старонкі",
        "tag-mw-new-redirect": "Новая перасылка",
+       "tag-mw-new-redirect-description": "Праўкі, якімі створаны перасылкі або старонкі заменены на перасылкі",
        "tag-mw-removed-redirect": "Выдаленае перанакіраванне",
-       "tag-mw-changed-redirect-target": "Змяненне мэты перенаправления",
+       "tag-mw-removed-redirect-description": "Праўкі, якія замяняюць існуючую перасылку на не-перасылку",
+       "tag-mw-changed-redirect-target": "Змяненне мэты перасылкі",
+       "tag-mw-changed-redirect-target-description": "Праўкі, якія змяняюць мэту перасылкі",
        "tag-mw-blank": "ачыстка",
-       "tag-mw-blank-description": "Праўкі, ачышчальныя гэтую старонку",
+       "tag-mw-blank-description": "Праўкі, якія ачышчаюць старонку",
        "tag-mw-replace": "Заменена",
-       "tag-mw-rollback": "адкат",
-       "tag-mw-undo": "адмена",
+       "tag-mw-replace-description": "Праўкі, якія выдаляюць больш за 90% зместу старонкі",
+       "tag-mw-rollback": "Адкат",
+       "tag-mw-rollback-description": "Праўкі, якія адкатваюць папярэднія праўкі з дапамогай спасылкі адкату",
+       "tag-mw-undo": "Адмена",
+       "tag-mw-undo-description": "Праўкі, якія адмяняюць папярэднія праўкі з дапамогай спасылкі адмены праўкі",
        "tags-title": "Біркі",
        "tags-intro": "Тут пералічаныя біркі, якімі праграмы могуць пазначыць праўку, а таксама іх значэнні.",
        "tags-tag": "Назва біркі",
        "mw-widgets-mediasearch-input-placeholder": "Пошук мультымедыя",
        "mw-widgets-titleinput-description-new-page": "старонка яшчэ не існуе",
        "mw-widgets-titleinput-description-redirect": "перанакіраванне на $1",
+       "mw-widgets-usersmultiselect-placeholder": "Дадаць яшчэ...",
        "date-range-from": "Ад даты:",
        "date-range-to": "Да даты:",
        "randomrootpage": "Выпадковая карэнная старонка",
index c12d9bd..a5d7511 100644 (file)
        "mytalk": "Сан дийцаре агӀо",
        "anontalk": "Дийцаре",
        "navigation": "Навигаци",
-       "and": "&#32;а",
+       "and": ",",
        "faq": "СиХХ",
        "actions": "Дийраш",
        "namespaces": "ЦӀерийн меттигаш",
        "extlink_tip": "Арахьара хьажорг (йиц ма йе хӀотталушерг http://)",
        "headline_sample": "Йозан корта",
        "headline_tip": "Корта 2-гlа локхаллийца",
-       "nowiki_sample": "ЧÑ\83диллийÑ\88а ÐºÑ\85Ñ\83зе Ð±Ð°Ñ\80амÑ\85lоÑ\82Ñ\82онза Ð¹Ð¾Ð·Ð°.",
+       "nowiki_sample": "Ð\9aÑ\85Ñ\83за Ñ\85Ó\80оÑ\82Ñ\82аде Ñ\85ийÑ\86а Ð¾Ñ\8cÑ\88Ñ\83Ñ\88 Ð´Ð¾Ñ\86Ñ\83 Ð¹Ð¾Ð·Ð°",
        "nowiki_tip": "Тергал ца бо вики-бáрамхlоттор",
        "image_sample": "Example.jpg",
        "image_tip": "Чохь йолу файл",
        "boteditletter": "б",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|тӀехьожу декъашхо|тӀехьожу декъашхой}}]",
        "rc-change-size-new": "Хийцам бин чул тӀехьа болу барам: $1 {{PLURAL:$1|байт}}",
-       "newsectionsummary": "/* $1 */ Ð\9aеÑ\80ла Ñ\85Ñ\8cедаÑ\80",
+       "newsectionsummary": "/* $1 */ Ð\9aеÑ\80ла Ñ\82ема",
        "rc-enhanced-expand": "Гайта мадарра",
        "rc-enhanced-hide": "Ма дарра дерг къайладаккха",
        "rc-old-title": "дуьххьара кхоьллина яра «$1» цӀарца",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries чекхдаккха] тӀеххьара дехар; {{int:apisandbox-continue-clear}} чекхдаккхарца йолу параметраш цӀанъян.",
        "apisandbox-multivalue-all-namespaces": "$1 (Ерриге цӀерийн меттигаш)",
        "apisandbox-multivalue-all-values": "$1 (Дерриге маьӀнаш)",
-       "booksources": "Ð\96айнан хьосташ",
+       "booksources": "Ð\96айнийн хьосташ",
        "booksources-search-legend": "Жайнех лаьцна хаам лахар",
        "booksources-search": "Лахар",
        "booksources-text": "ХӀокху агӀонгахь гул бина сайтийн тӀе хьажоргийн могӀам оцу чохь шуна жайнах лаьцна хаам каро мега. И ю интернет-туьканаш а категорийн библиотекийн категорешкахь лахаран система а.",
        "confirm-unwatch-top": "ДӀаяккха хӀара агӀо хьай тергаме могӀанан юкъар?",
        "confirm-rollback-button": "ХӀаъ",
        "confirm-rollback-top": "ХӀокху агӀона нисдарш юхадаха?",
-       "comma-separator": " a,&#32;",
+       "comma-separator": ",&#32;",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← хьалха йоьду агӀо",
        "imgmultipagenext": "тӀаьхьа йоьгӀу агӀо →",
index cd66ff6..3382b30 100644 (file)
        "tog-hidepatrolled": "Kontrollierte Änderungen in den „Letzten Änderungen“ ausblenden",
        "tog-newpageshidepatrolled": "Kontrollierte Seiten bei den „Neuen Seiten“ ausblenden",
        "tog-hidecategorization": "Kategorisierungen von Seiten ausblenden",
-       "tog-extendwatchlist": "Alle und nicht nur die aktuellsten Änderungen in der Beobachtungsliste anzeigen",
+       "tog-extendwatchlist": "Alle Änderungen in der Beobachtungsliste anzeigen, nicht nur die aktuellsten",
        "tog-usenewrc": "Änderungen auf „Letzte Änderungen“ und der Beobachtungsliste nach Seite gruppieren",
        "tog-numberheadings": "Überschriften automatisch nummerieren",
        "tog-showtoolbar": "Bearbeiten-Werkzeugleiste anzeigen",
        "recentchangeslinked-feed": "Änderungen an verlinkten Seiten",
        "recentchangeslinked-toolbox": "Änderungen an verlinkten Seiten",
        "recentchangeslinked-title": "Änderungen an Seiten, die von „$1“ verlinkt sind",
-       "recentchangeslinked-summary": "Gib einen Seitennamen ein, um Änderungen auf Seiten zu sehen, die auf oder von dieser Seite verlinkt sind. Um Mitglieder einer Kategorie zu sehen, gib „Kategorie:''Name der Kategorie''“ ein. Änderungen an Seiten auf [[Special:Watchlist|deiner Beobachtungsliste]] sind <strong>fett</strong> hervorgehoben.",
+       "recentchangeslinked-summary": "Gib einen Seitennamen ein, um Änderungen auf Seiten zu sehen, die auf oder von dieser Seite verlinkt sind. Um Mitglieder einer Kategorie zu sehen, gib „{{ns:category}}:''Name der Kategorie''“ ein. Änderungen an Seiten auf [[Special:Watchlist|deiner Beobachtungsliste]] sind <strong>fett</strong> hervorgehoben.",
        "recentchangeslinked-page": "Seite:",
        "recentchangeslinked-to": "Zeige nur Änderungen an Seiten, die auf diese Seite verlinken",
        "recentchanges-page-added-to-category": "[[:$1]] zur Kategorie hinzugefügt",
index 741738a..09b2d3e 100644 (file)
        "recentchangeslinked-feed": "Related changes",
        "recentchangeslinked-toolbox": "Related changes",
        "recentchangeslinked-title": "Changes related to \"$1\"",
-       "recentchangeslinked-summary": "Enter a page name to see changes on pages linked to or from that page. (To see members of a category, enter Category:Name of category). Changes to pages on [[Special:Watchlist|your Watchlist]] are in <strong>bold</strong>.",
+       "recentchangeslinked-summary": "Enter a page name to see changes on pages linked to or from that page. (To see members of a category, enter {{ns:category}}:Name of category). Changes to pages on [[Special:Watchlist|your Watchlist]] are in <strong>bold</strong>.",
        "recentchangeslinked-page": "Page name:",
        "recentchangeslinked-to": "Show changes to pages linked to the given page instead",
        "recentchanges-page-added-to-category": "[[:$1]] added to category",
index 9d4b014..7353f90 100644 (file)
        "autoredircomment": "Alidirektigis al [[$1]]",
        "autosumm-new": "Nova paĝo kun '$1'",
        "autosumm-newblank": "Kreis nulan paĝon",
+       "size-bytes": "$1 {{PLURAL:$1|bajto|bajtoj}}",
        "lag-warn-normal": "Ŝanĝoj pli novaj ol $1 {{PLURAL:$1|sekundo|sekundoj}} eble ne estos montrataj en ĉi tiu listo.",
        "lag-warn-high": "Pro malrapideco de la servila datumbazo, ŝanĝoj pli novaj ol $1 {{PLURAL:$1|sekundo|sekundoj}} eble ne montriĝos en ĉi tiu listo.",
        "watchlistedit-normal-title": "Redakti atentaron",
index 1db40fd..0e22f6f 100644 (file)
        "customcssprotected": "Sinulla ei ole oikeutta muuttaa tätä CSS-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.",
        "customjsprotected": "Sinulla ei ole oikeutta muuttaa tätä JavaScript-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.",
        "mycustomcssprotected": "Sinulla ei ole oikeutta muokata tätä CSS-sivua.",
+       "mycustomjsonprotected": "Sinulla ei ole oikeutta muokata tätä JSON-sivua.",
        "mycustomjsprotected": "Sinulla ei ole oikeutta muokata tätä JavaScript-sivua.",
        "myprivateinfoprotected": "Sinulla ei ole oikeutta muuttaa omia yksityisiä tietojasi.",
        "mypreferencesprotected": "Sinulla ei ole oikeutta muuttaa omia asetuksiasi.",
        "recentchangeslinked-feed": "Linkitettyjen sivujen muutokset",
        "recentchangeslinked-toolbox": "Linkitettyjen sivujen muutokset",
        "recentchangeslinked-title": "Sivulta $1 linkitettyjen sivujen muutokset",
-       "recentchangeslinked-summary": "Kirjoita sivun nimi nähdäksesi muutokset sivuihin jotka on linkitetty tai ovat tältä sivulta. (Nähdäksesi luokan jäsenet, kirjoita Luokka:Luokan nimi). Muutokset sivuihin\n[[Special:Watchlist|tarkkailulistallasi]] on <strong>lihavoitu</strong>.",
+       "recentchangeslinked-summary": "Kirjoita sivun nimi nähdäksesi muutokset sivuihin jotka on linkitetty tai ovat tältä sivulta. (Nähdäksesi luokan jäsenet, kirjoita {{ns:category}}:Luokan nimi). Muutokset sivuihin [[Special:Watchlist|tarkkailulistallasi]] on <strong>lihavoitu</strong>.",
        "recentchangeslinked-page": "Sivun nimi:",
        "recentchangeslinked-to": "Näytä sen sijaan muutokset sivuihin, joista on linkki tähän sivuun",
        "recentchanges-page-added-to-category": "[[:$1]] lisätty luokkaan",
        "lockmanager-fail-closelock": "Tiedoston $1 lukkotiedostoa ei voitu sulkea.",
        "lockmanager-fail-deletelock": "Tiedoston $1 lukkotiedostoa ei voitu poistaa.",
        "lockmanager-fail-acquirelock": "Tiedostopolulle \"$1\" ei voitu luoda suojausta.",
-       "lockmanager-fail-openlock": "Tiedoston $1 lukkotiedostoa ei voitu avata.",
+       "lockmanager-fail-openlock": "Tiedoston $1 lukkotiedostoa ei voitu avata. Varmista että latauskansiosi on määritetty oikein ja verkkopalvelimellasi on oikeudet kirjoittaa tähän kansioon. Katso https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory saadaksesi lisätietoja.",
        "lockmanager-fail-releaselock": "Tiedoston $1 lukituksen avaaminen epäonnistui.",
        "lockmanager-fail-db-bucket": "Ei voitu yhdistää riittävästi tietokantoja kohdassa $1.",
        "lockmanager-fail-db-release": "Lukitusten vapauttaminen epäonnistui tietokannassa $1.",
index 59ada69..58bd170 100644 (file)
        "permissionserrorstext-withaction": "Vous ne pouvez pas $2, pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :",
        "contentmodelediterror": "Vous ne pouvez pas modifier cette révision car son modèle de contenu est <code>$1</code>, ce qui diffère du modèle de contenu actuel de la page <code>$2</code>.",
        "recreate-moveddeleted-warn": "<strong>Attention : vous êtes en train de recréer une page qui a été précédemment supprimée.</strong>\n\nAssurez-vous qu'il est pertinent de poursuivre les modifications sur cette page. \nLe journal des suppressions et des déplacements pour cette page est affiché ci-dessous à titre d'information :",
-       "moveddeleted-notice": "Cette page a été supprimée. \nLe journal des suppressions, des protections et des déplacements de la page est affiché ci-dessous pour référence.",
-       "moveddeleted-notice-recent": "Désolé, cette page a été récemment supprimée (dans les dernières 24 heures).\nLes journaux des suppressions, des protections et des renommages pour la page sont fournis ci-dessous pour référence.",
+       "moveddeleted-notice": "Cette page a été supprimée. \nLes journaux des suppressions, protections et déplacements pour la page sont fournis ci-dessous pour référence.",
+       "moveddeleted-notice-recent": "Désolé, cette page a été récemment supprimée (dans les dernières 24 heures).\nLes journaux des suppressions, protections et déplacements pour la page sont fournis ci-dessous pour référence.",
        "log-fulllog": "Voir le journal complet",
        "edit-hook-aborted": "Échec de la modification par une extension.\nAucune explication n’a été retournée.",
        "edit-gone-missing": "N’a pas pu mettre à jour la page.\nIl semble qu’elle ait été supprimée.",
        "recentchangeslinked-feed": "Suivi des pages liées",
        "recentchangeslinked-toolbox": "Suivi des pages liées",
        "recentchangeslinked-title": "Suivi des pages associées à « $1 »",
-       "recentchangeslinked-summary": "Entrer un nom de page pour voir les modifications faites récemment sur des pages liées depuis ou vers cette page (pour voir les membres d’une catégorie, entrez Catégorie:Nom de catégorie). Les modifications des pages de [[Special:Watchlist|votre liste de suivi]] sont <strong>en gras</strong>.",
+       "recentchangeslinked-summary": "Entrer un nom de page pour voir les modifications faites récemment sur des pages liées vers ou depuis cette page (pour voir les membres d’une catégorie, entrez {{ns:category}}:Nom de catégorie). Les modifications des pages de [[Special:Watchlist|votre liste de suivi]] sont <strong>en gras</strong>.",
        "recentchangeslinked-page": "Nom de la page :",
        "recentchangeslinked-to": "Afficher les modifications des pages qui comportent un lien vers la page donnée plutôt que l'inverse",
        "recentchanges-page-added-to-category": "[[:$1]] ajouté à la catégorie",
index 9ef7be4..584759b 100644 (file)
        "loginreqlink": "konèkté so kò",
        "newarticletext": "Zòt té ka swiv roun lyen vèr roun paj ki pa ka ègzisté òkò. \nAtò di kréyé sa paj, antré zòt tèks annan bwat ki aprè (zòt pé konsilté [$1 paj d'èd-a] pou plis enfòrmasyon).\nSi zòt pa rivé{{GENDER:|}} isi pa éròr, kliké asou bouton <strong>Routour</strong> di zòt navigatò.",
        "anontalkpagetext": "----\n<em>Zòt asou paj di diskisyon di oun itilizatò anonim ki pa òkò kréyé di kont ou ki pa ka an itilizé</em>.\nPou sa rézon, nou divèt itilizé so adrès IP pou idantifyé li.\nOun adrès IP pé sa partajé pa plizyò itilizatò.\nSi zòt roun itiliza{{GENDER:|ò|ris}} anonim é si zòt ka kontasté ki dé koumantèr ki pa ka konsèrné zòt sa adrèsé à zòt, zòt pé [[Special:CreateAccount|kréyé roun kont]] ou [[Special:UserLogin|konèkté zòt kò]] atò di évité tout konfizyon fitir ké ròt kontribitò anonim.",
-       "noarticletext": "I pa gen pou moman-an pyès tèks asou sa paj.\nZòt pé [[Special:Search/{{PAGENAME}}|lansé oun sasé asou sa tit]] annan ròt paj-ya,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sasé annan opérasyon-yan lyé]\nou [{{fullurl:{{FULLPAGENAME}}|action=edit}} kréyé sa paj]</span>.",
-       "noarticletext-nopermission": "I pa gen pou moman-an pyès tèks asou sa paj.\nZòt pé [[Special:Search/{{PAGENAME}}|fè roun sasé asou sa tit]] andan ròt paj-ya,\nou <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|paj={{FULLPAGENAMEE}}}} sasé andan journal asosyé]</span>, mè zòt pa gen pèrmisyon di kréyé sa paj.",
+       "noarticletext": "I pa gen atchwèlman pyès tèks asou sa paj.\nZòt pouvé [[Special:Search/{{PAGENAME}}|lansé oun sasé asou sa tit]] annan ròt paj-ya,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sasé annan opérasyon lyé]\noben [{{fullurl:{{FULLPAGENAME}}|action=edit}} kréyé sa paj]</span>.",
+       "noarticletext-nopermission": "I pa gen atchwèlman pyès tèks asou sa paj.\nZòt pouvé [[Special:Search/{{PAGENAME}}|fè roun sasé asou sa tit]] andan ròt paj-ya,\noben <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|paj={{FULLPAGENAMEE}}}} sasé annan journal asosyé]</span>, mè zòt pa gen pèrmisyon di kréyé sa paj.",
        "userpage-userdoesnotexist-view": "Kont itilizatò-a « $1 » pa anréjistré.",
        "clearyourcache": "<strong>Nòt :</strong> aprè zòt anréjistré zòt modifikasyon, zòt divèt forsé roucharjman konplè di kach di zòt navigatò pou wè chanjman-yan.\n* <strong>Firefox / Safari :</strong> mentné touch-a <em>Maj</em> (<em>Shift</em>) an klikan asou bouton-an <em>Atchwalizé</em> ou présé <em>Ctrl-F5</em> ou <em>Ctrl-R</em> (<em>⌘-R</em> asou roun Mac) \n* <strong>Google Chrome :</strong> apwiyé asou <em>Ctrl-Maj-R</em> (<em>⌘-Shift-R</em> asou roun Mac) \n* <strong>Internet Explorer :</strong> mentné touch-a <em>Ctrl</em> an klikan asou bouton-an <em>Atchwalizé</em> ou présé <em>Ctrl-F5</em> \n* <strong>Opera :</strong> alé annan <em>Menu → Settings</em> (<em>Opera → Préférences</em> asou roun Mac) é answit à <em>Konfidansyalité & sékrité → Éfasé doné d'èksplorasyon-yan → Imaj ké fiché an kach</em>.",
        "previewnote": "<strong>Raplé-zòt ki a jis roun prévizwalizasyon.</strong>\nZòt modifikasyon pa òkò anréjistré !",
index c20415e..e8d6e3a 100644 (file)
        "recentchangeslinked-feed": "שינויים בדפים המקושרים",
        "recentchangeslinked-toolbox": "שינויים בדפים המקושרים",
        "recentchangeslinked-title": "שינויים בדפים המקושרים מהדף \"$1\"",
-       "recentchangeslinked-summary": "יש להקליד שם דף כדי לראות את השינויים בדפים המקשרים לדף זה או המקושרים ממנו. (כדי לראות את הדפים החברים בקטגוריה, יש להקליד \"קטגוריה:שם הקטגוריה\".) שינויים בדפים ב[[Special:Watchlist|רשימת המעקב שלך]] מוצגים ב<strong>הדגשה</strong>.",
+       "recentchangeslinked-summary": "יש להקליד שם דף כדי לראות את השינויים בדפים המקשרים לדף זה או המקושרים ממנו. (כדי לראות את הדפים החברים בקטגוריה, יש להקליד \"{{ns:category}}:שם הקטגוריה\".) שינויים בדפים ב[[Special:Watchlist|רשימת המעקב שלך]] מוצגים ב<strong>הדגשה</strong>.",
        "recentchangeslinked-page": "שם הדף:",
        "recentchangeslinked-to": "הצגת השינויים בדפים המקשרים לדף הנתון במקום זאת",
        "recentchanges-page-added-to-category": "הדף [[:$1]] נוסף לקטגוריה",
        "upload-proto-error": "פרוטוקול שגוי",
        "upload-proto-error-text": "בהעלאה מרוחקת, יש להשתמש בכתובות URL המתחילות עם <code dir=\"ltr\">http://</code> או עם <code dir=\"ltr\">ftp://</code>.",
        "upload-file-error": "שגיאה פנימית",
-       "upload-file-error-text": "ש×\92×\99×\90×\94 ×¤× ×\99×\9e×\99ת ×\94תר×\97ש×\94 ×\91עת ×\94× ×\99ס×\99×\95×\9f ×\9c×\99צ×\95ר ×§×\95×\91×¥ ×\96×\9e× ×\99 ×¢×\9c ×\94שרת.\n×\90× ×\90 ×¦×¨×\95 קשר עם [[Special:ListUsers/sysop|מפעיל מערכת]].",
+       "upload-file-error-text": "ש×\92×\99×\90×\94 ×¤× ×\99×\9e×\99ת ×\94תר×\97ש×\94 ×\91עת ×\94× ×\99ס×\99×\95×\9f ×\9c×\99צ×\95ר ×§×\95×\91×¥ ×\96×\9e× ×\99 ×¢×\9c ×\94שרת.\n× ×\90 ×\9c×\99צ×\95ר קשר עם [[Special:ListUsers/sysop|מפעיל מערכת]].",
        "upload-misc-error": "שגיאת העלאה בלתי ידועה",
-       "upload-misc-error-text": "שגיאת העלאה בלתי ידועה התרחשה במהלך ההעלאה.\nאנא ודאו שכתובת ה־URL תקינה וזמינה ונסו שוב.\nאם הבעיה חוזרת על עצמה, אנא צרו קשר עם [[Special:ListUsers/sysop|מפעיל מערכת]].",
+       "upload-misc-error-text": "שגיאת העלאה בלתי־ידועה התרחשה במהלך ההעלאה.\nנא לוודא שכתובת ה־URL תקינה וזמינה ולנסות שוב.\nאם הבעיה חוזרת על עצמה, יש ליצור קשר עם [[Special:ListUsers/sysop|מפעיל מערכת]].",
        "upload-too-many-redirects": "הכתובת מכילה הפניות רבות מדי",
        "upload-http-error": "התרחשה שגיאת HTTP‏: $1",
        "upload-copy-upload-invalid-domain": "העלאת קבצים משרת זה אינה אפשרית.",
        "upload-form-label-infoform-categories": "קטגוריות",
        "upload-form-label-infoform-date": "תאריך",
        "upload-form-label-own-work-message-generic-local": "ההעלאה מבוצעת בהתאם לתנאי השירות ולמדיניות הרישיונות ב{{grammar:תחילית|{{SITENAME}}}}.",
-       "upload-form-label-not-own-work-message-generic-local": "אם אין באפשרותך להעלות את הקובץ הזה לפי המדיניות של {{SITENAME}}, עליך לסגור את התיבה הנוכחית ולנסות שיטה אחרת.",
+       "upload-form-label-not-own-work-message-generic-local": "אם אין באפשרותך להעלות את הקובץ הזה לפי המדיניות של {{SITENAME}}, {{GENDER:|עליך|עלייך}} לסגור את התיבה הנוכחית ולנסות שיטה אחרת.",
        "upload-form-label-not-own-work-local-generic-local": "באפשרותך לנסות להשתמש ב[[Special:Upload|דף ברירת המחדל להעלאת קבצים]].",
        "upload-form-label-own-work-message-generic-foreign": "ידוע לי שאני מעלה את הקובץ הזה למאגר משותף. ההעלאה מבוצעת בהתאם לתנאי השירות ולמדיניות הרישיונות שם.",
-       "upload-form-label-not-own-work-message-generic-foreign": "אם אין באפשרותך להעלות את הקובץ הזה לפי המדיניות של המאגר המשותף, עליך לסגור את התיבה הנוכחית ולנסות שיטה אחרת.",
+       "upload-form-label-not-own-work-message-generic-foreign": "אם אין באפשרותך להעלות את הקובץ הזה לפי המדיניות של המאגר המשותף, {{GENDER:|עליך|עלייך}} לסגור את התיבה הנוכחית ולנסות שיטה אחרת.",
        "upload-form-label-not-own-work-local-generic-foreign": "באפשרותך לנסות להשתמש ב[[Special:Upload|דף העלאת הקבצים ב{{grammar:תחילית|{{SITENAME}}}}]], אם ניתן להעלות את הקובץ הזה לשם לפי מדיניות האתר.",
        "backend-fail-stream": "לא הייתה אפשרות להזרים את הקובץ \"$1\".",
        "backend-fail-backup": "לא הייתה אפשרות לגבות את הקובץ \"$1\".",
        "uploadstash": "סליק העלאות",
        "uploadstash-summary": "דף זה מאפשר גישה לקבצים שהועלו (או נמצאים בתהליך העלאה), אך טרם פורסמו באתר הוויקי. קבצים אלה אינם גלויים לאיש מלבד המשתמש שהעלה אותם.",
        "uploadstash-clear": "מחיקת הקבצים בסליק",
-       "uploadstash-nofiles": "×\90×\99×\9f ×\9c×\9b×\9d קבצים בסליק.",
-       "uploadstash-badtoken": "×\91×\99צ×\95×¢ ×\94פע×\95×\9c×\94 × ×\9bש×\9c, ×\90×\95×\9c×\99 ×\91×\92×\9c×\9c ×¤×§×\99עת ×ª×\95קפ×\95 ×©×\9c ×\90ס×\99×\9e×\95×\9f ×\94ער×\99×\9b×\94 ×©×\9c×\9b×\9d. נא לנסות שוב.",
+       "uploadstash-nofiles": "×\90×\99×\9f ×\9c×\9a קבצים בסליק.",
+       "uploadstash-badtoken": "×\91×\99צ×\95×¢ ×\94פע×\95×\9c×\94 × ×\9bש×\9c, ×\90×\95×\9c×\99 ×\91×\92×\9c×\9c ×¤×§×\99עת ×ª×\95קפ×\95 ×©×\9c ×\90ס×\99×\9e×\95×\9f ×\94ער×\99×\9b×\94 ×©×\9c×\9a. נא לנסות שוב.",
        "uploadstash-errclear": "מחיקת הקבצים נכשלה.",
        "uploadstash-refresh": "רענון רשימת הקבצים",
        "uploadstash-thumbnail": "הצגת תמונה ממוזערת",
        "uploadstash-zero-length": "הקובץ באורך אפס.",
        "invalid-chunk-offset": "היסט גוש לא תקין",
        "img-auth-accessdenied": "הגישה נדחתה",
-       "img-auth-nopathinfo": "PATH_INFO ×\97סר.\n×\94שרת ×\90×\99× ×\95 ×\9e×\95×\92×\93ר ×\9c×\94×¢×\91רת ×\9e×\99×\93×¢ ×\96×\94.\n×\99×\99ת×\9b×\9f ×©×\94×\95×\90 ×\9e×\91×\95סס ×¢×\9c CGI ×\95×\9c×\9b×\9f ×\90×\99× ×\95 ×\99×\9b×\95×\9c ×\9cת×\9e×\95×\9a ×\91Ö¾img_auth.\nר×\90×\95 https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO ×\97סר.\n×\94שרת ×\90×\99× ×\95 ×\9e×\95×\92×\93ר ×\9c×\94×¢×\91רת ×\9e×\99×\93×¢ ×\96×\94.\n×\99×\99ת×\9b×\9f ×©×\94×\95×\90 ×\9e×\91×\95סס ×¢×\9c CGI ×\95×\9c×\9b×\9f ×\90×\99× ×\95 ×\99×\9b×\95×\9c ×\9cת×\9e×\95×\9a ×\91Ö¾img_auth.\n×\9c×\9e×\99×\93×¢ × ×\95סף: https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "הנתיב המבוקש אינו בתיקיית ההעלאות שהוגדרה.",
        "img-auth-badtitle": "לא ניתן ליצור כותרת תקינה מתוך \"$1\".",
-       "img-auth-nologinnWL": "×\90×\99× ×\9b×\9d ×\9e×\97×\95×\91ר×\99×\9d ×\9c×\97ש×\91×\95×\9f והדף \"$1\" אינו ברשימה המותרת.",
+       "img-auth-nologinnWL": "×\9c×\90 × ×\9bנסת ×\9c×\97ש×\91×\95×\9f, והדף \"$1\" אינו ברשימה המותרת.",
        "img-auth-nofile": "הקובץ \"$1\" אינו קיים.",
-       "img-auth-isdir": "×\90ת×\9d ×\9eנס×\99×\9d לגשת לתיקייה \"$1\".\nרק גישה לקבצים מותרת.",
-       "img-auth-streaming": "×\9e×\91צע הזרמה של \"$1\".",
+       "img-auth-isdir": "× ×\99ס×\99ת לגשת לתיקייה \"$1\".\nרק גישה לקבצים מותרת.",
+       "img-auth-streaming": "×\9eת×\91צעת הזרמה של \"$1\".",
        "img-auth-public": "img_auth.php משמש להצגת קבצים מתוך אתר ויקי פרטי.\nאתר ויקי זה מוגדר כציבורי.\nכדי להשיג אבטחה מרבית, img_auth.php מבוטל.",
        "img-auth-noread": "למשתמש אין הרשאה לקרוא את \"$1\".",
        "http-invalid-url": "כתובת URL בלתי תקינה: $1",
        "http-curl-error": "שגיאה בקבלת כתובת ה־URL‏: $1",
        "http-bad-status": "הייתה בעיה בשליחת בקשת ה־HTTP‏: $1 $2",
        "upload-curl-error6": "לא ניתן להגיע ל־URL",
-       "upload-curl-error6-text": "×\9c×\90 × ×\99ת×\9f ×\9c×\9bת×\95×\91ת ×\94Ö¾URL ×©× ×\9bת×\91×\94. ×\90× ×\90 ×\91×\93ק×\95 אם כתובת זו נכונה ואם האתר זמין.",
+       "upload-curl-error6-text": "×\9c×\90 × ×\99ת×\9f ×\9c×\94×\92×\99×¢ ×\9c×\9bת×\95×\91ת ×\94Ö¾URL ×©× ×\9bת×\91×\94.\n×\99ש ×\9c×\91×\93×\95ק אם כתובת זו נכונה ואם האתר זמין.",
        "upload-curl-error28": "הסתיים זמן ההמתנה להעלאה",
-       "upload-curl-error28-text": "לאתר לקח זמן רב מדי לענות. אנא בדקו שהאתר זמין, המתינו מעט ונסו שוב. ייתכן שתרצו לנסות בזמן פחות עמוס.",
+       "upload-curl-error28-text": "לאתר לקח זמן רב מדי לענות.\nנא לבדוק שהאתר זמין, להמתין מעט ולנסות שוב.\nייתכן שכדאי לנסות בזמן פחות עמוס.",
        "license": "רישיון:",
        "license-header": "רישיון",
-       "nolicense": "×\90×\99×\9f",
+       "nolicense": "×\9c×\90 × ×\91×\97ר",
        "licenses-edit": "עריכת אפשרויות רישיון",
        "license-nopreview": "(תצוגה מקדימה לא זמינה)",
        "upload_source_url": "(קובץ שבחרת מכתובת URL תקינה ונגישה לציבור)",
index fbc3d57..f547bdc 100644 (file)
        "filepage-nofile-link": "Ne postoji datoteka s ovim imenom, ali možete je [$1 postaviti].",
        "uploadnewversion-linktext": "Postavi novu inačicu datoteke",
        "shared-repo-from": "s projekta $1",
-       "shared-repo": "zajednički poslužitelj",
+       "shared-repo": "Zajednički poslužitelj",
        "shared-repo-name-wikimediacommons": "Zajednički poslužitelj",
        "upload-disallowed-here": "Ne možete prepisati ovu datoteku.",
        "filerevert": "Ukloni ← $1",
index 9cfe01c..19c20ab 100644 (file)
@@ -31,7 +31,8 @@
                        "Irus",
                        "Narek",
                        "23artashes",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Սահակ"
                ]
        },
        "tog-underline": "ընդգծել հղումները՝",
        "copyrightpage": "{{ns:project}}:Հեղինակային իրավունքներ",
        "currentevents": "Ընթացիկ իրադարձություններ",
        "currentevents-url": "Project:Ընթացիկ իրադարձություններ",
-       "disclaimers": "Ազատում պատասխանատվությունից",
+       "disclaimers": "Հրաժարագրեր",
        "disclaimerpage": "Project:Ազատում պատասխանատվությունից",
        "edithelp": "Խմբագրման ուղեցույց",
        "helppage-top-gethelp": "Օգնություն",
        "recentchangeslinked-page": "Էջի անվանումը՝",
        "recentchangeslinked-to": "Հակառա՛կը. ցույց տալ այս էջին հղող էջերի փոփոխությունները։",
        "recentchanges-page-added-to-category": "[[:$1]] էջը ավելացվել է կատեգորիայում",
-       "upload": "Բեռնել նիշք (ֆայլ)",
+       "upload": "Բեռնել նիշք",
        "uploadbtn": "Բեռնել նիշք",
        "reuploaddesc": "Վերադառնալ բեռնման ձևին։",
        "uploadnologin": "Դուք չեք մտել համակարգ",
index d739147..57f9712 100644 (file)
@@ -6,7 +6,7 @@
                        "아라"
                ]
        },
-       "tog-underline": "Okpürụ ahiri jikodo:",
+       "tog-underline": "Ahịrịàlà òjikọ:",
        "tog-hideminor": "Zonari orü ntàkírí na nwerue mẹrẹ ogẹ nsó",
        "tog-hidepatrolled": "Zonari orü ha hụrụ na nwerue mẹrẹ ogẹ nsó",
        "tog-newpageshidepatrolled": "Zonari orü ha hụrụ shí ndetu ihü ohúrù",
        "tog-diffonly": "É zìkwàlà ihe nọr na ihü di okpúrù íchiè",
        "tog-showhiddencats": "Zi ébéonọr zonari a zonari",
        "tog-norollbackdiff": "Kwà diff mgbe byárá na mgbe láázú mèchàrà",
-       "underline-always": "Ngbẹowula",
-       "underline-never": "Anáobulạ",
+       "underline-always": "M̀gbèọbụlà",
+       "underline-never": "Emelaème",
        "underline-default": "Ndatụ ihü njikota",
        "editfont-style": "Rüwa ámá udị mkpúrù èdè:",
        "editfont-monospace": "Otụ ihe ná kechí mkpúrù èdè",
        "editfont-sansserif": "Mkpúrù èdè sans-serif",
        "editfont-serif": "Mkpúrù èdè Serif",
-       "sunday": "Sondè",
-       "monday": "Mondè",
-       "tuesday": "Tusdè",
-       "wednesday": "Wensdè",
-       "thursday": "Torsdè",
-       "friday": "Fridè",
-       "saturday": "Satorde",
-       "sun": "Son",
-       "mon": "Mon",
-       "tue": "Tus",
-       "wed": "Wen",
-       "thu": "Tor",
-       "fri": "Fri",
-       "sat": "Sat",
-       "january": "Önwa Mbú",
-       "february": "Önwa Abụọ",
-       "march": "Önwa Atọ",
-       "april": "Önwa Anọ",
-       "may_long": "Önwa Ise",
-       "june": "Önwa Isii",
-       "july": "Önwa Asaa",
-       "august": "Önwa Asáto",
-       "september": "Önwa Itolu",
-       "october": "Önwa Iri",
-       "november": "Önwa Iri na otu",
-       "december": "Önwa Iri na abụọ",
-       "january-gen": "Önwa Mbú",
-       "february-gen": "Önwa Abụọ",
-       "march-gen": "Önwa Atọ",
-       "april-gen": "Önwa Anọ",
-       "may-gen": "Önwa Ise",
-       "june-gen": "Önwa Isii",
-       "july-gen": "Önwa Asaa",
-       "august-gen": "Önwa Asatọ",
-       "september-gen": "Önwa Itolu",
-       "october-gen": "Önwa Iri",
-       "november-gen": "Önwa Iri na otu",
-       "december-gen": "Önwa Iri na abụọ",
-       "jan": "ÖMbú",
-       "feb": "ÖAbụ",
-       "mar": "ÖAtọ",
-       "apr": "ÖAnọ",
-       "may": "ÖIse",
-       "jun": "ÖIsi",
-       "jul": "ÖAsa",
-       "aug": "ÖAsọ",
-       "sep": "ÖIto",
-       "oct": "ÖIri",
-       "nov": "ÖIrinotu",
-       "dec": "ÖIrinabụọ",
-       "pagecategories": "{{PLURAL:$1|Ébéonọr|Ébéonọr}}",
+       "sunday": "Èhìchim̀bụ",
+       "monday": "Èhìchiàbụọ",
+       "tuesday": "Èhìchiàtọ",
+       "wednesday": "Èhìchiànọ",
+       "thursday": "Èhìchiìse",
+       "friday": "Èhìchiìsiì",
+       "saturday": "Èhìchiọdụ̀",
+       "sun": "Chi1",
+       "mon": "Chi2",
+       "tue": "Chi3",
+       "wed": "Chi4",
+       "thu": "Chi5",
+       "fri": "Chi6",
+       "sat": "Chi7",
+       "january": "Ọnwam̀bụ",
+       "february": "Ọnwaàbụọ",
+       "march": "Ọnwaàtọ",
+       "april": "Ọnwaànọ",
+       "may_long": "Ọnwaìse",
+       "june": "Ọnwaìsiì",
+       "july": "Ọnwaàsaà",
+       "august": "Ọnwaàsatọ",
+       "september": "Ọnwaìtoolu",
+       "october": "Ọnwaìri",
+       "november": "Ọnwaìrinàotù",
+       "december": "Ọnwaìrinààbụọ",
+       "january-gen": "Ọnwam̀bụ",
+       "february-gen": "Ọnwaàbụọ",
+       "march-gen": "Ọnwaàtọ",
+       "april-gen": "Ọnwaànọ",
+       "may-gen": "Ọnwaìse",
+       "june-gen": "Ọnwaìsiì",
+       "july-gen": "Ọnwaàsaà",
+       "august-gen": "Ọnwaàsatọ",
+       "september-gen": "Ọnwaìtoolu",
+       "october-gen": "Ọnwaìri",
+       "november-gen": "Ọnwaìrinàotù",
+       "december-gen": "Ọnwaìrinààbụọ",
+       "jan": "ỌM̀bụ",
+       "feb": "ỌÀbụ",
+       "mar": "ỌÀtọ",
+       "apr": "ỌÀnọ",
+       "may": "ỌÌse",
+       "jun": "ỌÌsi",
+       "jul": "ỌÀsa",
+       "aug": "ỌÀst",
+       "sep": "ỌÌto",
+       "oct": "ỌÌri",
+       "nov": "Ọn11",
+       "dec": "Ọn12",
+       "january-date": "Ọnwam̀bụ $1",
+       "february-date": "Ọnwaàbụọ $1",
+       "march-date": "Ọnwaàtọ $1",
+       "april-date": "Ọnwaànọ $1",
+       "may-date": "Ọnwaìse $1",
+       "june-date": "Ọnwaìsiì $1",
+       "july-date": "Ọnwaàsaà $1",
+       "august-date": "Ọnwaàsatọ $1",
+       "september-date": "Ọnwaìtoolu $1",
+       "october-date": "Ọnwaìri $1",
+       "november-date": "Ọnwaìrinàotù $1",
+       "december-date": "Ọnwaìrinààbụọ",
+       "pagecategories": "{{PLURAL:$1|Ụdàkọ}}",
        "category_header": "Ihü nọr ime ébéonọr \"$1\"",
-       "subcategories": "Ébéonọr ime ime",
+       "subcategories": "Ụdàkọòkpurù",
        "category-media-header": "Nka nọr ime ébéonọr \"$1\"",
        "category-empty": "\"Ébéonọr nke enwéghị ihü ma nkà ímé ya.\"",
-       "hidden-categories": "{{PLURAL:$1|Ébéonọr zonari|Ébéonọr zonari}}",
+       "hidden-categories": "{{PLURAL:$1|Ụdàkọ nzezò}}",
        "hidden-category-category": "Ébéanọr zonari a zonari",
        "category-subcat-count": "{{PLURAL:$2|Ébéanọr nka nwerechạ ébéanọr-ime nkeá.|Ébéanọr nka nwere {{PLURAL:$1|ébéanọr-ime|$1 ébéanọr-ime}}, guru nke $2 total.}}",
        "category-subcat-count-limited": "Ébéonọr nke á nwèrè {{PLURAL:$1|íméébéanọr|íméébéanọr $1}} nke á.",
        "category-article-count-limited": "Nkeá {{PLURAL:$1|ihü dị|ihü $1 dị}} na ébéanọr nkeá.",
        "category-file-count": "{{PLURAL:$2|Ébéonọr nka nwèrè náni usòrò nka.|{{PLURAL:$1|Usòrò nka|Usòrò nke $1}} di na ímé ébéonọr nga, shí háníle di $2.}}",
        "category-file-count-limited": "Nkeá {{PLURAL:$1|usòrò dị|usòrò $1 dị}} na ébéanọr nkeá.",
-       "listingcontinuesabbrev": "mewá.",
+       "listingcontinuesabbrev": "gàzi.",
        "index-category": "Ẹdẹle Ihü",
        "noindex-category": "Ihü ẹdẹlebu",
        "broken-file-category": "Ihü nwere jkọdọ na ga fail gbajírí",
        "about": "Màkà",
        "article": "Ihü ihe dị",
        "newwindow": "(o na mepo na onyonyo ohúrù)",
-       "cancel": "Kàchá",
+       "cancel": "Hapụ̀",
        "moredotdotdot": "Ozókwá...",
        "mypage": "Ihü",
-       "mytalk": "Okwu",
-       "anontalk": "Owu màkà IP nká",
-       "navigation": "Otú Uzọr",
+       "mytalk": "Nkàta",
+       "anontalk": "Nkàta",
+       "navigation": "Nturuụzọ̀",
        "and": "&#32;ná",
        "faq": "FAQ",
        "actions": "Mmèmé",
-       "namespaces": "Ámááhà",
+       "namespaces": "Ahàm̀bara",
        "variants": "Nke ichè ichè",
        "errorpagetitle": "Nsogbú",
        "returnto": "Ganata na $1.",
        "tagline": "Oshị {{SITENAME}}",
        "help": "Inyeáká",
-       "search": "Chọwa",
-       "searchbutton": "Chọwa",
+       "search": "Tùwe",
+       "searchbutton": "Tùwe",
        "go": "Gá",
        "searcharticle": "Gá",
        "history": "Ịta ihüá",
        "history_short": "Ịta",
        "updatedmarker": "ihe gáráníru ké mgbe m byàrà nga mbu",
-       "printableversion": "Nkè I nweríkí dotié",
+       "printableversion": "Ùdì ǹke mbifụ̀",
        "permalink": "Jikodo ekechịrị",
        "print": "Dotié",
        "view": "Lèzí",
+       "view-foreign": "Zi nà $1",
        "edit": "Mèzi",
        "create": "Ké",
        "delete": "Kàcha",
        "protect_change": "gbanwe",
        "unprotect": "Nchẹdo mgbanwe",
        "newpage": "Ihü ohúrù",
-       "talkpagelinktext": "Okwu",
+       "talkpagelinktext": "nkàta",
        "specialpage": "Ihü mkpà",
-       "personaltools": "Ngwa nkem",
-       "talk": "Akíkó",
+       "personaltools": "Ngwa ọrụ ònwe",
+       "talk": "Nkpata okà",
        "views": "Há hụrụ ya olé",
-       "toolbox": "Ngwa Oru",
-       "imagepage": "Zi ihü usòrò",
-       "mediawikipage": "Zi ihü ozi",
-       "templatepage": "Zi ihü nkpurụ ihü",
-       "viewhelppage": "Zi ihü I nye áká",
-       "categorypage": "Zi ébé ihü nọr",
-       "viewtalkpage": "Zi akíkó",
-       "otherlanguages": "Na asụsụ ndị ozó",
-       "redirectedfrom": "(Kufùrù shi $1)",
+       "toolbox": "Ngwa ọrụ",
+       "imagepage": "Zìri ihu àfabà",
+       "mediawikipage": "Zìri ihunde ozi",
+       "templatepage": "Zìri ihunde àtụ̀",
+       "viewhelppage": "Zìri ihu nkwàdo",
+       "categorypage": "Zìri ihu ụdàkọ",
+       "viewtalkpage": "Zìri nkàta",
+       "otherlanguages": "Nà asụ̀sụ̀ ndị ọ̀zọ",
+       "redirectedfrom": "(Dupụ̀rụ̀ sì $1)",
        "redirectpagesub": "Kufù ebe ihü nka na ga",
        "lastmodifiedat": "Há rüchàrà na ihü nka na $1, mgbe $2",
        "viewcount": "Ha banyere ihü nka na {{PLURAL:$1|otu|$1 mgbe ole}}.",
        "protectedpage": "Ihü a cẹdolu a cẹdo",
-       "jumpto": "Wuá ébé:",
-       "jumptonavigation": "otú uzọr",
-       "jumptosearch": "chọwa",
+       "jumpto": "Wụ̀ ga:",
+       "jumptonavigation": "nturuụzọ̀",
+       "jumptosearch": "tùwe",
        "view-pool-error": "Ndó, ihe na enye juchàrà ejucha oge nka.\nMadu kachạrạ ndi choro ihu ihü nka.\nBiko chetukwa oge kà oruo mgbe I choro I banyé ihü nka ozor.\n\n$1",
        "pool-timeout": "Ógè e zuole Í ché ncedọ",
        "pool-queuefull": "Pool kyu zùrù",
        "pool-errorunknown": "Nsogbu nke námaghi",
-       "aboutsite": "Maka {{SITENAME}}",
-       "aboutpage": "Project:Ihe owù",
+       "aboutsite": "Màkà {{SITENAME}}",
+       "aboutpage": "Project:Màkà",
        "copyright": "Ihe di ime nọr okpúrụ $1",
        "copyrightpage": "{{ns:project}}:Iwu maka ijë ihe",
        "currentevents": "Ihe ne me ubuwá",
        "currentevents-url": "Project:I ne me ubüwá",
-       "disclaimers": "Ihe anyí chọrọ ki ma",
+       "disclaimers": "Ńwefụ̀aka",
        "disclaimerpage": "Project:Ihe I kweshiri ma",
        "edithelp": "Inyetuáká I rüwa",
-       "mainpage": "Ihü Mbu",
-       "mainpage-description": "Ihü Mbu",
+       "mainpage": "Ihu m̀bụ",
+       "mainpage-description": "Ihu m̀bụ",
        "policy-url": "Project:Iwu",
        "portal": "Ogbako ọtú",
        "portal-url": "Project:Ogbako Ọtú",
-       "privacy": "Iwu maka ndi ichi ichie",
-       "privacypage": "Project:Iwu maka ndi ichi ichie",
+       "privacy": "Ụmẹzù ǹzuzo",
+       "privacypage": "Project:Ụmẹzù ǹzuzo",
        "badaccess": "Nsogbu ébé ha na nyé ike I bàtá",
        "badaccess-group0": "I nwéghị ọdà Í kpárá ihe Í chọrí mė.",
        "badaccess-groups": "Ihe Í chọrí me bu ihe ndi ọ'bànifé nke ntàkírí nọr na {{PLURAL:$2|the group|ótù ọtú}} ne me náni: $1",
        "viewsourceold": "zi mkpurụ",
        "editlink": "mèzi",
        "viewsourcelink": "zi mkpurụ",
-       "editsectionhint": "Rüwa na élu nkeji: $1",
+       "editsectionhint": "Mèzi òkè: $1",
        "toc": "Ihe dị ime",
        "showtoc": "zi",
        "hidetoc": "zonari",
        "site-atom-feed": "$1 ntabì Atom",
        "page-rss-feed": "''$1'' ntabì RSS",
        "page-atom-feed": "''$1'' ntabì Atom",
-       "red-link-title": "$1 (ihü a di gì)",
+       "red-link-title": "$1 (ihu a dị gị̀)",
        "sort-descending": "Dozi shí àlà",
        "sort-ascending": "Dozi shí élú",
        "nstab-main": "Ihü",
-       "nstab-user": "Ihü ọ'bànifé",
+       "nstab-user": "Ihunde òjìème",
        "nstab-media": "Ihü nkà",
        "nstab-special": "Ihü mkpà",
        "nstab-project": "Ihü orürü",
-       "nstab-image": "Usòrò",
+       "nstab-image": "Àfabà",
        "nstab-mediawiki": "Ozi",
        "nstab-template": "Àtụ",
        "nstab-help": "Ihü ebe ha na nye áká",
-       "nstab-category": "Ébéonọr",
+       "nstab-category": "Ụdàkọ",
+       "mainpage-nstab": "Ihu m̀bụ",
        "nosuchaction": "Mmèmé adighi",
        "nosuchactiontext": "Ihe URL chọrọ Í me àdíghị ézíbóté.\nÍ nwèríkí dèfié URL è dèfie, ma ó nwèríkí bụ nà Í sọrọ jikodo nke àdíghị mma.\nIhe a nwèríkí bu ihe ne zi bug di na ngwa nsónùsòrò nke {{SITENAME}} jì à rü.",
        "nosuchspecialpage": "Ihü mkpà nka a nogị",
        "badtitletext": "Íshí ihü Í chọrọ à díghị ézíbóté, efù, mà ȯ dị jikodo di jikodo nke ojö na nke íshí asụsụ-mmékotárí ma wiki-mmékotárí.\nO nwèríkí nwé édé ótù ma nke ozor nke ékwéghị na íshí ihü.",
        "perfcached": "Ómárí á kachẹrẹ na o nwẹrẹ ki a kugwaghị ya na ogẹ di nso. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
        "viewsource": "Zi mkpurụ",
+       "viewsource-title": "Zi mkpụrụ $1",
        "actionthrottled": "Mmèmé a puziélé",
        "protectedpagetext": "Ihüá cedolụ maka orürü ạ gáa bá.",
        "viewsourcetext": "Í nwèríkí lé na Í jé mkpurụ ihüá:",
        "virus-scanfailed": "ojëjë orunotụ dàrà (edemede $1)",
        "virus-unknownscanner": "amaghị obubu onyá:",
        "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": "Áhà ọ'bànifé:",
+       "yourname": "Ahàǹjìème:",
+       "userlogin-yourname": "Ahàǹjìème",
        "yourpassword": "Okwúngáfè:",
+       "userlogin-yourpassword": "Okwungafè",
        "yourpasswordagain": "Detuari mkpurụ okwu ejị a gafẹ:",
        "yourdomainname": "Obí gi:",
-       "login": "Banyé",
+       "login": "Detùba",
        "nav-login-createaccount": "Banyé / ké buwá",
        "logout": "Fwuör",
        "userlogout": "Fwuör",
        "notloggedin": "I bátà bò",
        "createaccount": "Ké otụ buwa",
        "createaccountmail": "na e-mail",
+       "createacct-benefit-body1": "{{PLURAL:$1|ḿmezi}}",
        "badretype": "Mkpurụ okwu ejị a gafẹ é jëghị.",
        "userexists": "Áhè ọ'bànifé tírí di na áká onye ozor.\nBíkó nwèré áhà nke ozor.",
        "loginerror": "Nsogbu ngbe I choro I bata",
        "accountcreated": "Ndoté è mepólé",
        "createaccount-title": "Okìké bùwá màkà {{SITENAME}}",
        "loginlanguagelabel": "Asụsụ: $1",
+       "pt-login": "Debàta",
+       "pt-createaccount": "Kèta ngụrụòkè",
        "changepassword": "Gbanwe okwu éjị à gáfe",
        "resetpass_header": "Gbanwe okwúngáfè nke bùwá",
        "oldpassword": "Mkpurụ okwu ejị a gafẹ ochië:",
        "retypenew": "Dechákwari mkpurụ okwu ejị a gafẹ nke ohúrù:",
        "resetpass_submit": "Bá okwu éjị gáfè na áhà Í bànyè",
        "changepassword-success": "Mkpurụ okwu ejị a gafẹ a gbanwere nke oma!\nI na á banye...",
+       "botpasswords-label-cancel": "Hapụ̀",
        "resetpass_forbidden": "Okwu éjị à gáfè enwéghịkị gabnwe",
        "resetpass-submit-loggedin": "Gbanwe okwu éjị à gáfe",
-       "resetpass-submit-cancel": "Kàchá",
+       "resetpass-submit-cancel": "Hapụ̀",
        "resetpass-temp-password": "mkpurụ okwu ejị a gafẹ I gi kushi ngwa ngwa:",
        "passwordreset": "Nkuwaria okwúngáfè",
+       "passwordreset-username": "Ahàǹjìème:",
        "passwordreset-emailelement": "Áhà Ọ'banife: \n$1\n\nPasswod nke gi gbanwe: \n$2",
        "changeemail-none": "(efù)",
        "bold_sample": "Mkpúrù èdè íke",
        "subject": "Ihe gbasara/Ishi ahiri",
        "minoredit": "Ihe bu orü ntakírí",
        "watchthis": "Lèwá ihüá",
-       "savearticle": "Domá ihüa",
+       "savearticle": "Dònye ihuâ",
        "preview": "Lètú",
-       "showpreview": "Létu ntakìrí",
-       "showdiff": "Zi ihe gbanwere",
+       "showpreview": "Zìwe nkirimaàtụ̀",
+       "showdiff": "Zi mgbanwè",
        "anoneditwarning": "'''Kpàchákwá anya:''' Ị bághị bo.\nIP gi gí détụ na ákíkó mbu ihü a.",
        "missingcommenttext": "Biko tinyé ótù okwu na àlà nga.",
        "summary-preview": "Hutukwá mmẹkotá:",
        "history-title": "Ákíkó mbu màkà orü nọr na élú \"$1\"",
        "lineno": "Ahiri $1:",
        "compareselectedversions": "Sikwụ orü áká dị",
-       "editundo": "mẹ̀rí àzụ́",
-       "searchresults": "Ndọfùtà nchọwa",
+       "editundo": "mè la àzụ",
+       "searchresults": "Nchọfụ̀ta",
        "searchresults-title": "Ihe futárá nchowá màkà ''$1''",
        "titlematches": "Íshí ihü dàbànyèrè",
        "textmatches": "Mkpụrụ édémédé nwèrè ihü ȯ dị na",
        "shown-title": "Zí $1 {{PLURAL:$1|ihe fútárá|ihe fútárá}} na ótù ihü",
        "viewprevnext": "Lé ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-new": "'''Ké ihü \"[[:$1]]\" na wiki nke á!'''",
-       "searchprofile-articles": "Ihü ihe dị",
-       "searchprofile-images": "Nkaníle",
-       "searchprofile-everything": "Iheníle",
-       "searchprofile-advanced": "Nke kárí",
-       "searchprofile-articles-tooltip": "Chọwa na $1",
-       "searchprofile-images-tooltip": "Chọwa màkà usòrò",
-       "searchprofile-everything-tooltip": "Tùwé ihe nile (na okwu ihü)",
-       "searchprofile-advanced-tooltip": "Chọwa na ímé áhàámá nke gí Í kèrè",
+       "searchprofile-articles": "Ihu ịhe dị̀",
+       "searchprofile-images": "Oke-ǹkà",
+       "searchprofile-everything": "Ịhe níle",
+       "searchprofile-advanced": "Ọ̀kàkaà",
+       "searchprofile-articles-tooltip": "Tùwe na $1",
+       "searchprofile-images-tooltip": "Chọ̀wa àfabà",
+       "searchprofile-everything-tooltip": "Tùwe ịhe níle (mà nà ihu nkàta)",
+       "searchprofile-advanced-tooltip": "Tùwe nà ime ahàm̀bara ntụziri",
        "search-result-size": "$1 ({{PLURAL:$2|mkpurụ edemede 1|$2 mkpurụ edemede}})",
        "search-redirect": "(kúfù $1)",
        "search-section": "(nkeji $1)",
+       "search-category": "(ụdàkọ $1)",
        "search-suggest": "Ị̀ kwèshirí dé: $1",
        "search-interwiki-caption": "Orürü nwanne nwanyị",
        "search-interwiki-default": "$1 nke ziri:",
        "powersearch-togglelabel": "Lechányá:",
        "powersearch-toggleall": "Haníle",
        "powersearch-togglenone": "Efù",
-       "preferences": "Otu ha dosẹrẹ ihe",
-       "mypreferences": "Otú m shị na dose ihem",
+       "preferences": "Ndoziri",
+       "mypreferences": "Ndoziri",
        "prefs-skin": "Akpụkpọ",
        "skin-preview": "Lètú",
        "datedefault": "Otú é shị na dose ihe efù",
-       "prefs-user-pages": "Ihü ọ'bànifé",
+       "prefs-user-pages": "Ihunde òjìème",
        "prefs-personal": "Nkówá ọ'bànifé",
        "prefs-rc": "Mgbánwè ógè nso",
-       "prefs-watchlist": "Ndétụnlé",
+       "prefs-watchlist": "Ùlìle",
        "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}",
        "prefs-misc": "Mcheta-ma-mchetaghim",
        "prefs-resetpass": "Gbanwe okwu éjị à gáfe",
        "prefs-email": "Màkà e-mail",
        "prefs-rendering": "Ọdịdị",
-       "saveprefs": "Domá",
+       "saveprefs": "Dònye",
        "prefs-editing": "Írüwa",
-       "searchresultshead": "Chọwa",
+       "searchresultshead": "Tùwe",
        "stub-threshold-disabled": "Ápụgị òkò",
        "timezonelegend": "Nkeji ogẹ:",
        "localtime": "Ogẹ ebeanọr:",
        "timezoneregion-europe": "Alá Bèke",
        "timezoneregion-indian": "Abwädi Ukwu India",
        "timezoneregion-pacific": "Òrìmìlì Pasifik",
-       "prefs-searchoptions": "Màkà nchöwa",
-       "prefs-namespaces": "Áhàámá",
+       "prefs-searchoptions": "Tùwe",
+       "prefs-namespaces": "Ahàm̀bara",
        "default": "nke éjị bịdó",
-       "prefs-files": "Usòrò",
+       "prefs-files": "Àfabà",
        "prefs-custom-css": "CSS nà áká mádu",
        "prefs-custom-js": "JavaScript na áká mádu",
        "youremail": "E-mail:",
-       "username": "Áhà ọ'bànifé:",
+       "username": "{{GENDER:$1|Ahàǹjìème}}:",
        "prefs-memberingroups": "Onyé otu nke {{PLURAL:$1|ọtú|ọtú}}:",
        "yourrealname": "Ézíbóté áhà:",
        "yourlanguage": "Ásụ̀sụ̀:",
        "yournick": "Ndè áhà gi òhúrù:",
        "yourgender": "Nwayi/okpoho ma o nwoke:",
-       "gender-unknown": "Ámákwàghị",
+       "gender-unknown": "M̀gbè ha tụ̀rụ̀ gị aka, ndiriusòrò g'ị jiri okwu ụ̀dịnàètitì a kàtara èkèrè gị m̀gbè o nwèrè ike ị",
        "gender-male": "Òkò",
        "gender-female": "Ányị̀",
        "email": "ozi e-mail",
        "userrights-groupsmember": "Onye ọtú nke:",
        "userrights-reason": "Mgbághapụtà:",
        "group": "Ọtú:",
-       "group-user": "Ọ'bànifé",
+       "group-user": "Òjìème",
        "group-bot": "Bot",
        "group-sysop": "Ndi íshí",
        "group-bureaucrat": "Ọdọzị'obodo",
        "group-suppress": "Aghọ",
        "group-all": "(háníle)",
-       "group-user-member": "ọ'bànifé",
+       "group-user-member": "{{GENDER:$1|òjìème}}",
        "group-autoconfirmed-member": "ọ'bànifé kwé'nà'áká",
        "group-bot-member": "bot",
        "group-sysop-member": "onye íshí",
        "group-bureaucrat-member": "ọdọzị'obodo",
        "group-suppress-member": "aghọ",
-       "grouppage-user": "{{ns:project}}:Ọ'bànifé",
+       "grouppage-user": "{{ns:project}}:Òjìème",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Ndi Íshí wiki",
        "right-read": "Gụwá ihü",
        "right-edit": "Rüwa ihü",
        "right-createpage": "Ké ihü (nke nadíghị na ihü okwu)",
-       "right-move": "Páfù ihü",
-       "right-movefile": "Páfù usòrò",
+       "right-move": "Papụ̀ ihuâ",
+       "right-movefile": "Papụ̀ àfabà",
        "right-upload": "Tịnyé ihe na nsónùsòrò",
        "right-delete": "Kàchafu ihü",
        "right-bigdelete": "Kàcha ihü nwéré ákíkó mbu dí ógólógó",
        "newuserlogpage": "Ndétu nchétá ihe ọ'bànifé kèrè",
        "rightslog": "Ndetu échìchè íwú ọ'bànifé",
        "action-read": "guwa ihüá",
-       "action-edit": "rüo élu ihüá",
+       "action-edit": "mèzi ihu â",
        "action-createpage": "ké ihü",
-       "action-move": "puzié ihü nke",
+       "action-move": "papụ̀ ihuâ",
        "action-movefile": "puzié usòrò",
        "action-upload": "tinyé njikota èdèa",
        "action-reupload": "tinyé ihe ozor élu njikota èdèa",
        "action-delete": "kàcha ihü nka",
        "nchanges": "$1 {{PLURAL:$1|gbanwere|gbanwere}}",
+       "enhancedrc-history": "ị̀ta",
        "recentchanges": "Mgbánwè ógè nso",
        "recentchanges-legend": "Nràlụ màkà Ihe gbanwere ubwá",
        "recentchanges-feed-description": "Chóputà ihe ógẹ ǹsò na wiki ímé órírí nke á.",
        "recentchanges-label-minor": "Ihe bu orü ntakírí",
        "recentchanges-legend-newpage": "$1 - ihü ohúrù",
+       "rcfilters-savedqueries-cancel-label": "Hapụ̀",
        "rclistfrom": "Zìrí ihe gbanwere ọhúrù shí $3 $2",
        "rcshowhideminor": "orü ntákírí $1",
+       "rcshowhideminor-show": "Zi",
+       "rcshowhideminor-hide": "Zònarị",
        "rcshowhidebots": "bot $1",
+       "rcshowhidebots-show": "Zi",
+       "rcshowhidebots-hide": "Zònarị",
        "rcshowhideliu": "Ndi né ké dị $1 di íme",
+       "rcshowhideliu-show": "Zi",
+       "rcshowhideliu-hide": "Zònarị",
        "rcshowhideanons": "$1 ndi ọ'bànifé nke amághị",
+       "rcshowhideanons-show": "Zi",
+       "rcshowhideanons-hide": "Zònarị",
        "rcshowhidepatr": "$1 orü hä lèrè",
        "rcshowhidemine": "$1 ihe m rürü",
+       "rcshowhidemine-show": "Zi",
+       "rcshowhidemine-hide": "Zònarị",
        "rclinks": "Zí nke mbu $1 gbawere na ubochi gárá nke $2",
-       "diff": "Íchè",
+       "diff": "ichè",
        "hist": "akíkómbu",
        "hide": "Zonari",
        "show": "Zi",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|ọ'bànifé|ọ'bànifé}} ne lé anya]",
+       "rc-change-size-new": "{{PLURAL:$1|byte}} $1 ǹkè mgbanwè fọ̀rọ̀",
        "newsectionsummary": "/* $1 */ nkeji ohúrù",
        "rc-enhanced-expand": "Zi ihe di ime (Í gí nwere JavaScript)",
        "rc-enhanced-hide": "Zonari ihe di ime",
        "sourceurl": "URL mkpọlógwù:",
        "upload-description": "Nkówá usòrò",
        "watchthisupload": "Lèwá ákwúkwó orunotunị",
+       "upload-dialog-button-cancel": "Hapụ̀",
+       "upload-dialog-button-save": "Dònye",
+       "upload-form-label-infoform-categories": "Ụdàkọ",
        "http-read-error": "Nsogbu Í gü HTTP.",
        "upload-curl-error6": "Ènwéghịkị ruó URL",
        "license": "Nkwényé:",
        "license-header": "Nkwényé",
        "nolicense": "Ọ dígì nke áká di.",
-       "imgfile": "usòrò",
+       "imgfile": "àfabà",
        "listfiles": "Ndétu usòrò",
        "listfiles_thumb": "Nvọáká",
        "listfiles_date": "Ǹgụ́ụ̀bọ̀chị̀",
        "listfiles_name": "Áhà",
-       "listfiles_user": "Ọ'bànifé",
+       "listfiles_user": "Òjìème",
        "listfiles_size": "Ívụ",
        "listfiles_description": "Nkówá",
        "listfiles_count": "Ùdị",
-       "file-anchor-link": "Usòrò",
+       "file-anchor-link": "Àfabà",
        "filehist": "Ịta nke usòrò",
-       "filehist-help": "Kpàtá na úbochi/ógè Í zí usòrò ọtụ ȯ dị mgbe áhù.",
+       "filehist-help": "Bìri èhì/ogè k'ị hụ òtù ụ̀fa dị̀ m̀gbè ahụ̀.",
        "filehist-deleteall": "kàcha hanílé",
        "filehist-deleteone": "kàcha",
        "filehist-revert": "gbanwe lá àzú",
-       "filehist-current": "nka",
-       "filehist-datetime": "Afọ/Ogẹ",
-       "filehist-thumb": "Nvọáká",
+       "filehist-current": "dị ùgbu â",
+       "filehist-datetime": "Èhì/Ogè",
+       "filehist-thumb": "Mbọ-aka",
        "filehist-thumbtext": "NvóÁká màkà otù ȯ dị nà $1",
        "filehist-nothumb": "Nvọáká adịghị",
-       "filehist-user": "Ọ'bànifé",
+       "filehist-user": "Òjìème",
        "filehist-dimensions": "Ógólógó na asaá",
        "filehist-filesize": "Ívù usòrò",
-       "filehist-comment": "Okwu-nokwu",
+       "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.",
        "unusedtemplates": "Àtụ hè jí gị",
        "unusedtemplateswlh": "jikodo ndi ozor",
        "randompage": "Edemede nkeówúlạ",
+       "randomincategory-category": "Ụdàkọ",
        "randomincategory-submit": "Gá",
        "statistics": "Olìlé ọtụ ihe dị",
        "statistics-header-pages": "Ọmúmú-nà-ńlé ihü",
        "withoutinterwiki-legend": "Na íshí mkpụrụ okwu",
        "withoutinterwiki-submit": "Zi",
        "nbytes": "$1 {{PLURAL:$1|byte|byte di}}",
-       "ncategories": "{{PLURAL:$1|ébéonọr|ébéonọr}} $1",
+       "ncategories": "{{PLURAL:$1|ụdàkọ}} $1",
        "nlinks": "{{PLURAL:$1|jikodo|jikodo}} $1",
        "nmembers": "{{PLURAL:$1|ọ'bànifé|Ndi n'bànifé}} $1",
        "nrevisions": "{{PLURAL:$1|orübà|orübà}} $1",
        "usereditcount": "$1 {{PLURAL:$1|rüwá|orürü}}",
        "usercreated": "Kéré na $1 mgbe $2",
        "newpages": "Ihü ohúrù",
-       "newpages-username": "Áhà ọ'bànifé:",
+       "newpages-username": "Ahàǹjìème:",
        "ancientpages": "Ihü díkárí íchié",
-       "move": "Páfụ",
-       "movethispage": "Páfù ihüá",
+       "move": "Papụ̀",
+       "movethispage": "Papụ̀ ihuâ",
        "notargettitle": "Ntido adighị",
        "pager-newer-n": "{{PLURAL:$1|1 nke ohúrù|$1 nke ohúrù}}",
        "pager-older-n": "{{PLURAL:$1|1 nke ichié |$1 nke ichié}}",
        "apisandbox-results": "Nfụ́fụ̀tà",
        "booksources": "Ébé ákwúkwó shị",
        "booksources-search-legend": "Tuó íshí akwúkwó shì",
+       "booksources-search": "Tùwe",
        "specialloguserlabel": "Ọ'bànifé:",
        "speciallogtitlelabel": "Ishi:",
        "log": "Ndetu-nchétá",
        "prevpage": "Ihü nke búzọr ($1)",
        "allpagesfrom": "Zi ihü bídóró na:",
        "allpagesto": "Zi na ihu ihü ná kwúshí nà:",
-       "allarticles": "Ihü níle",
+       "allarticles": "Ihu níle",
        "allinnamespace": "Ihü níle (ámááhạ $1)",
        "allpagessubmit": "Gá",
-       "categories": "Ébéanọr",
+       "categories": "Ụdàkọ",
        "sp-deletedcontributions-contribs": "ihe rürü di mkpa",
        "linksearch": "Òtú jikodo di èzí",
-       "linksearch-ns": "Áhàámá:",
-       "linksearch-ok": "Chọwa",
+       "linksearch-ns": "Ahàm̀bara:",
+       "linksearch-ok": "Tùwe",
        "linksearch-line": "$1 jikọdọ shí $2",
        "listusers-submit": "Zi",
-       "listusers-noresult": "Ọ hügị ọ'bànifé.",
+       "listusers-noresult": "À chọfụ̀tàhụ̀ghị̀ òjìème.",
        "listusers-blocked": "(kwàchịrị)",
-       "activeusers-noresult": "Ọ hügị ọ'bànifé.",
+       "activeusers-noresult": "À chọfụ̀tàhụ̀ghị̀ òjìème.",
        "listgrouprights-group": "Ọtú",
        "listgrouprights-rights": "Nkwènyé",
        "listgrouprights-members": "(ndetu ndi nọr nga)",
        "listgrouprights-addgroup": "Gbàkọ {{PLURAL:$2|ọtú|ọtú}}: $1",
        "listgrouprights-addgroup-all": "Tìnyé ọtú nílé",
+       "listgrouprights-namespaceprotection-namespace": "Ahàm̀bara",
        "emailuser": "Zi onye á ózí-nsónùsòrò",
        "defemailsubject": "e-mail {{SITENAME}}",
+       "emailusername": "Ahàǹjìème:",
+       "emailusernamesubmit": "Zibànye",
        "emailfrom": "Onye banyere ya:",
        "emailto": "Onye o gi ru:",
        "emailsubject": "Gbàsịrị:",
        "emailmessage": "Ozi:",
        "emailsend": "Zí ozi",
        "emailsent": "E-mail zìrì",
-       "watchlist": "Ndetu ihem ne lé",
-       "mywatchlist": "Ndetu ihem ne lé",
+       "watchlist": "Ùlìle",
+       "mywatchlist": "Ùlìlem",
        "watchlistfor2": "Maka $1 $2",
        "addedwatchtext": "Ihü \"[[:$1]]\" à bányéré [[Special:Watchlist|ndétu ihe Í ne lé]].\nIhe gi gbanwe na ógè gi bya nà ihüá na ihü okwu ya gi di ndétu ngáhù, na ihü gi da na mkpụrụ édé '''sírí íke''' ímé [[Special:RecentChanges|ndétu gbanwere méré na ogè nso]] ka ȯ dí òfelè Í hü ya.",
        "removedwatchtext": "Ihü \"[[:$1]]\" à fwüó lá [[Special:Watchlist|ihe ndétu ihe Í ne lé]].",
        "watchlist-options": "Nrọta ndetu nlènlé",
        "watching": "O na hü...",
        "unwatching": "O mele ka o na á hü kwagi...",
-       "enotif_impersonal_salutation": "ọ'bànifé {{SITENAME}}",
+       "enotif_impersonal_salutation": "Òjìème {{SITENAME}}",
        "enotif_anon_editor": "ọ'bànifé ézíghị ihu $1",
        "created": "kèrè",
        "changed": "gbanwere",
        "maximum-size": "Ívù nke ukwu:",
        "pagesize": "(byte)",
        "restriction-edit": "Mèzi",
-       "restriction-move": "Páfụ",
+       "restriction-move": "Papụ̀",
        "restriction-create": "Ké",
        "restriction-upload": "Tinyénélú",
        "restriction-level-all": "ọtú nke ȯbulà",
        "undeletelink": "lé/dosimá",
        "undeleteviewlink": "lé",
        "undeletecomment": "Mgbághapụtà:",
-       "undelete-search-submit": "Chọwa",
+       "undelete-search-submit": "Tùwe",
        "undelete-show-file-submit": "Eeh",
-       "namespace": "Áhàámá:",
-       "invert": "kwùtúárí ihe áká nọr",
+       "namespace": "Ahàm̀bara:",
+       "invert": "Tụgha ǹke ǹhọ̀rọ",
        "blanknamespace": "(Ḿkpà)",
        "contributions": "Ihe ọ'bànifé rürü",
        "contributions-title": "Orü ọ'bànifé nà $1",
        "mycontris": "Ihem mẹtụrụ na orürü",
        "contribsub2": "Maka $1 ($2)",
-       "uctop": "(ishi)",
+       "uctop": "(dị ùgbu â)",
        "month": "Shi önwa (na nke ndi mbu):",
        "year": "Shi afọr (na ndi nke mbu):",
        "sp-contributions-newbies": "Zí orü áká ọ'bànifé ohúru náni",
        "sp-contributions-deleted": "orü ọ'bànifé gbakashịrị",
        "sp-contributions-uploads": "tinyere na élu.",
        "sp-contributions-logs": "ndetu-nchétá",
-       "sp-contributions-talk": "okwu",
+       "sp-contributions-talk": "nkàta",
        "sp-contributions-search": "Tuó ihe há rürü",
        "sp-contributions-username": "IP mà ọ bu áhà ọ'bànifé:",
-       "sp-contributions-submit": "Chọwa",
+       "sp-contributions-submit": "Tùwe",
        "whatlinkshere": "Ihe na bia nga",
        "whatlinkshere-title": "Ihü ná gá \"$1\" shí jikodo",
        "whatlinkshere-page": "Ihü:",
        "isimage": "jikodo nnunuuche",
        "whatlinkshere-prev": "{{PLURAL:$1|nke dí nà àzú|$1 nke dí nà àzú}}",
        "whatlinkshere-next": "{{PLURAL:$1|nke sọrọ|$1 nke sọrọ}}",
-       "whatlinkshere-links": " jikodo",
+       "whatlinkshere-links": "← òjikọ",
        "whatlinkshere-hideredirs": "$1 nke kufùrù",
        "whatlinkshere-hidetrans": "$1 ọ jè ákwúkwó usòrò",
        "whatlinkshere-hidelinks": "Jikodo $1",
        "ipb-unblock": "Ákwàchịrị áhà ọ'bànifé ma IP",
        "unblockip": "Ákwàchịrị ọ'bànifé",
        "unblocked": "há kwàchịrị [[User:$1|$1]]",
+       "autoblocklist-submit": "Tùwe",
        "ipblocklist": "Ọ'bànifé kwáchírí",
        "blocklist-target": "Ẹ́té",
        "blocklist-expiry": "Gbá ọ́kà",
-       "ipblocklist-submit": "Chọwa",
+       "ipblocklist-submit": "Tùwe",
        "infiniteblock": "ébìébì ùdìdì",
        "anononlyblock": "anon. náni",
        "emailblock": "ha kwàchịrị e-mail",
        "blocklink": "mèché",
        "unblocklink": "a kwadokwàlà",
        "change-blocklink": "gbanwe ngwùgwù",
-       "contribslink": "orürü",
+       "contribslink": "ọrụrụ",
        "blocklogpage": "Ndetù échìchè nke mbàchì",
        "blocklogentry": "kwụchi [[$1]] jí ógè ne $2 $3",
        "unblocklogentry": "àkwáchị gị $1",
        "block-log-flags-noemail": "ha kwàchịrị e-mail",
        "lockdb": "Gbàchí uche nsónùsòrò",
        "unlockbtn": "Ágbàchịkwàlà uche nsónùsòrò",
-       "move-page": "Páfụ $1",
+       "move-page": "Papụ̀ $1",
        "move-page-legend": "Páfù ihü",
        "movepagetext": "Í jí ákwúkwó òchá nke di na àlà gi gȯwá ótù ihü áhà ozor, na ȯ gi kwáfu ákíkó mbu ya na áhà nke ohürù.\nÍshí ihü nke ichié gi bu zi nkúfù gi gá áhà ohürù nke áhụ.\nÍ nwèríkí kúwárí nkúfù nke na ga áhà nke mbu na áká ya.\nȮ bu na Í chȯgị, kpàchákwá ánya Í lé má màkà nkúfù na gbá [[Special:DoubleRedirects|abụọ]] ma [[Special:BrokenRedirects|nkúfù gbájírí]].\nȮ dị na áká gi Í kpáchá ánya na jikodo na gá ébé o kwèshírí ga.\n\nChètákwá na ihü nke áhù '''ágághị''' a pú ȯ bu na ȯ dị ihü nwéré áhà áhù, bèelụ mà ȯ díghị ihe nọr ya na ímé ma ȯ bu nkúfù na onwé ya nke enweghị orürü nke mbu.\nIhe á fùtàrà na Í nwèríkí gọwáríá áhà ihü na nke mbu ya ȯ bu na Í gọrọ ọghọm, na Ì nwéghíkí dé na élú ihü di kwa.\n\n'''Kpàchákwá Ntị!'''\nIhe á nwèríkí bu ngbanwe ukwu mákà ihü ne wu;\nBiko kpàchá kwa ánya Í mà na ihe í ne mé na ógè gbárá mbu mgbè Í gí mé ya.",
        "movepagetalktext": "Ihü owu ya gi fwüor na áká ya na ihü nke gárá '''bèelụ mà:'''\n*Ihü okwu nke énwéghị ihe nọr na ímé ya na ȯ dị nà áhà ohürù nke áhù, mà\n*Í piáfù igbé nọr nà àlà ngá.\n\nNa nke, Í gi páfù na Í mékȯtá ihü nà onwé gi ọ bu nà Í chọrọ.",
        "newtitle": "Gá íshí édémédé nke:",
        "move-watch": "Lèmá ihü ó shị na ihü ȯ na gá",
-       "movepagebtn": "Páfù ihü",
+       "movepagebtn": "Papụ̀ ihuâ",
        "pagemovedsub": "Mpúzié ẹ meelá",
        "movepage-moved": "'''\"$1\" páfùrù Í gá \"$2\"'''",
        "articleexists": " Ihü ótù nwèkwàrà áhà nke áhù, mà áhà Í chọrọ à búghị ézíboté.\nBiko wèré áhà ozor.",
        "move-talk-subpages": "Páfù ihü-n-ímé nke ihü okwu (nè rú $1)",
        "movepage-page-moved": "Ihü $1 a páfùrù gá $2.",
        "movepage-page-unmoved": "Ihü $1 énweghịkị páfù gá $2.",
-       "movelogpage": "Páfù ntínyé",
+       "movelogpage": "Papụ̀ ndenye",
        "movereason": "Mgbághapụtà:",
        "revertmove": "gbanwe lá àzú",
        "delete_and_move_text": "== I kachafu gi me ==\nEbe ihü gé rú \"[[:$1]]\" di kwa.\nI chorí kàchafu ya ka uzor mepo maka mpuzie ne me?",
        "importlogpage": "Hubàtà ndetu",
        "tooltip-pt-userpage": "Ihü ọ'bànifé gi",
        "tooltip-pt-mytalk": "Ihü akíkó gi",
-       "tooltip-pt-preferences": "Otú Í shị na dose ihe gi",
+       "tooltip-pt-preferences": "Ndoziri {{GENDER:|gị}}",
        "tooltip-pt-watchlist": "Ndetu ihü Í ne lé màkà ihe gị gbanwe",
        "tooltip-pt-mycontris": "Ndetù ihe Í rürü",
        "tooltip-pt-login": "Anyi si ka Í gbanyé; chetákwá na nsogbu adighi I gbanye ma Í chógị gbànyé",
        "tooltip-pt-logout": "Fwuör",
        "tooltip-ca-talk": "Akíkó maka ihe di na ihü nka",
-       "tooltip-ca-edit": "Í nwẹríkí rü na ihü nka. Biko jí mkpátá nlélé mgbe Í na domá ihüá",
+       "tooltip-ca-edit": "Mèzi ihuâ",
        "tooltip-ca-addsection": "Binyíte nkeji ohúrù",
-       "tooltip-ca-viewsource": "Ihü nke cẹdolu.\nÍ nwèríkí lé mkpụrụ ya",
+       "tooltip-ca-viewsource": "Ihu â dị̀ ǹchèdò.\nỊ nwẹ̀rẹ̀ ike ị hụ mkpụrụ ya",
        "tooltip-ca-history": "Orü ichié na ihüá",
        "tooltip-ca-protect": "Cẹdolu ihüá",
        "tooltip-ca-unprotect": "Gbánwe ncẹdo ihüá",
        "tooltip-ca-delete": "Bakashia ihüá",
-       "tooltip-ca-move": "Puzie ihüá",
+       "tooltip-ca-move": "Papụ̀ ihuâ",
        "tooltip-ca-watch": "Tìnyé ihü á na ndétu ihe Í ne lé",
        "tooltip-ca-unwatch": "Kwáfụ ihüá shí ndetu ihe m ne lé",
-       "tooltip-search": "Chọwa {{SITENAME}}",
+       "tooltip-search": "Tu nà {{SITENAME}}",
        "tooltip-search-go": "Gá na ihü nwere kwa áhà nke ma o di",
        "tooltip-search-fulltext": "Chọwa na ihü maka mpkurụ okwu á",
-       "tooltip-p-logo": "Ga na ihü mbu",
-       "tooltip-n-mainpage": "Ga na ihü mbu",
+       "tooltip-p-logo": "Ga nà ihu m̀bụ",
+       "tooltip-n-mainpage": "Jèe ihu m̀bụ",
        "tooltip-n-mainpage-description": "Ga na ihü mbu",
        "tooltip-n-portal": "Maka orürü, gi ka Í nweríkí mé, ébé ha na tú ihe",
        "tooltip-n-currentevents": "Tuó ákíkó mbu màkà ihe ne me ubwá",
        "file-info-gif-looped": "etemte",
        "newimages-legend": "Nzàtà",
        "noimages": "Ọ díghì ihe di ngá Í lé.",
-       "ilsubmit": "Chọwa",
+       "ilsubmit": "Tùwe",
        "bydate": "shi afọ",
        "just-now": "ùgbú ùgbúa",
        "bad_image_list": "Ọtụ ȯ dị détùrù ngá:\n\nNání ndétu ihe (áhirí jí * bídó) dị na ihe ȯ chọrọ.\nJikodo bu nke mbu na áhìrì gí jikodo ya nà ȧkwúkwó orünotu di njö.\nJikodo nke gị byá àzú na áhìrì nke òfu á bu nke nwéríkí gáfè, díkà ihü ébé ȧkwúkwó orünotu áhu di ímé áhìrì ya.",
        "exif-imagelength": "Ógólógó",
        "exif-orientation": "Ívú nà àsáa",
        "exif-imagedescription": "Íshí nhuunuche",
+       "exif-software": "Ndiriusòrò ejìème",
        "exif-artist": "Odé ákwụ́kwọ́",
        "exif-exifversion": "Ùdị Exif",
        "exif-colorspace": "Ámá àgwà",
        "exif-citydest": "Ámá ukwu ziri",
        "exif-writer": "Òdìdè",
        "exif-languagecode": "Ásụ̀sụ̀",
-       "exif-iimcategory": "Ébéonọr",
+       "exif-iimcategory": "Ụdàkọ",
        "exif-label": "Ọdụ",
        "exif-orientation-1": "Nkịtị",
        "exif-exposureprogram-1": "Ònyèmáká",
        "exif-urgency-normal": "Nkịtị ($1)",
        "exif-urgency-low": "Nàlà ($1)",
        "exif-urgency-high": "Nélú ($1)",
-       "namespacesall": "nke níle",
+       "namespacesall": "ha níle",
        "monthsall": "nke níle",
        "recreate": "Ké ya ohúrù",
        "confirm_purge_button": "Ngwanu",
        "version-entrypoints-header-entrypoint": "Ébé ọ̀bụ̀bà",
        "version-entrypoints-header-url": "URL",
        "fileduplicatesearch-filename": "Áhà usòrò:",
-       "fileduplicatesearch-submit": "Chọwa",
+       "fileduplicatesearch-submit": "Tùwe",
        "specialpages": "Ihü mkpà",
        "specialpages-group-other": "Ihü mkpà nke ozor",
        "specialpages-group-login": "Banyé / ké buwa",
        "diff-form": "'''àhú'''",
        "dberr-problems": "Ndó! Ámá nka nwere nsogbu ime ime.",
        "htmlform-required": "Ọgụgụ nke gi dị",
-       "htmlform-submit": "Dànyé",
+       "htmlform-submit": "Zibànye",
        "htmlform-reset": "Emekwàlà gbanwere",
        "htmlform-selectorother-other": "Nke ozor",
+       "restore-count-files": "{{PLURAL:$1|1 àfabà |àfabà $1}}",
        "revdelete-content-hid": "ihe zọ̀nàri",
        "rightsnone": "(efù)",
+       "feedback-cancel": "Hapụ̀",
        "feedback-close": "Ọméchá.",
        "feedback-message": "Ozi:",
-       "searchsuggest-search": "Chọwa",
+       "feedback-submit": "Zibànye",
+       "searchsuggest-search": "Tu nà {{SITENAME}}",
        "expand_templates_ok": "Ngwanu",
+       "pagelang-submit": "Zibànye",
        "special-characters-group-latin": "Latin",
-       "special-characters-group-latinextended": "Latin dọrọ",
+       "special-characters-group-latinextended": "Latin dọsàrà",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Nkárí",
        "special-characters-group-greek": "Greek",
index 8c390c2..735d477 100644 (file)
                        "Tusholi"
                ]
        },
-       "tog-underline": "ТIатовжама кIала така хьакхар:",
-       "tog-hideminor": "Къайладаккха зӏамига дола хувцамаш керда хувцамашта юкъера",
-       "tog-hidepatrolled": "Къайладаккха ха дера чакхдаьнна дола (патрулированные) хувцамаш керда хувцамашта юкъера",
-       "tog-newpageshidepatrolled": "Ð\9aÑ\8aайлаÑ\8fÑ\8cккÑ\85а Ñ\85а Ð´ÐµÑ\80а Ñ\87акÑ\85Ñ\8aÑ\8fнна Ð¹Ð¾Ð»Ð° (паÑ\82Ñ\80Ñ\83лиÑ\80ованные) оагIонаш керда оагIонашта юкъера",
-       "tog-hidecategorization": "Ð\9aÑ\8aайлаÑ\8fÑ\85а Ð¾Ð°Ð³Ó\80онай ÐºÐ°Ñ\82егоÑ\80еш",
-       "tog-extendwatchlist": "Хьашеръяь йола зем бара список, массадола хувцамаш ше чулоацаш, тIеххьара даь хувцамаш хинна ца Iеш.",
-       "tog-usenewrc": "Ð¥Ñ\83вÑ\86амаÑ\88 Ñ\82оабаÑ\88 ÐµÑ\88 Ð»ÐµÐ»Ð°Ð´Ðµ ÐºÐµÑ\80да Ð½Ð¸Ð¹Ñ\81даÑ\80аÑ\88ка Ð°, Ð·ÐµÐ¼ Ð±Ð°Ñ\80а Ñ\81пиÑ\81ка чу а",
-       "tog-numberheadings": "Ð\90вÑ\82омаÑ\82иÑ\87еÑ\81ки Ð½Ñ\83меÑ\80аÑ\86и Ñ\85Ñ\8cае Ð´Ð¾Ð°ÐºÑ\8aой Ñ\86IеÑ\80ашта",
-       "tog-showtoolbar": "Ð\93IиÑ\80Ñ\81ий Ð¿Ð°Ð½ÐµÐ»Ñ\8c Ñ\85Ñ\8cаÑ\85Ñ\8cокÑ\85а Ñ\85Ñ\83вÑ\86ам Ð±ÐµÑ\87 хана",
+       "tog-underline": "ТIатовжамá кIала така хьакхар:",
+       "tog-hideminor": "Къайладаха зӏамагIа хувцамаш керда хувцамашта юкъера",
+       "tog-hidepatrolled": "Къайладаха техка чакхдаьнна дола (патрулированные, проверенные) хувцамаш керда хувцамашта юкъера",
+       "tog-newpageshidepatrolled": "Ð\9aÑ\8aайлаÑ\8fÑ\85а Ñ\82еÑ\85ка Ñ\87акÑ\85Ñ\8aÑ\8fнна Ð¹Ð¾Ð»Ð° (паÑ\82Ñ\80Ñ\83лиÑ\80ованнÑ\8bе, Ð¿Ñ\80овеÑ\80енные) оагIонаш керда оагIонашта юкъера",
+       "tog-hidecategorization": "Ð\9aÑ\8aайлаÑ\8fÑ\85а Ð¾Ð°Ð³Ó\80оний Ð¾Ð°Ð³Ó\80аÑ\82аш",
+       "tog-extendwatchlist": "Хьашеръе зéма хьаязъяьр шедола хувцамаш юкъелоацаш, тIехьара даь хувцамаш хинна ца Iеш.",
+       "tog-usenewrc": "Ð¥Ñ\83вÑ\86амеÑ\85 Ñ\82оабаÑ\88 Ðµ ÐºÐµÑ\80да Ð½Ð¸Ð¹Ñ\81даÑ\80аÑ\88ка Ð° Ð·Ã©Ð¼Ð° Ñ\85Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80а чу а",
+       "tog-numberheadings": "Ше-Ñ\88егIа Ð½Ð¾Ð¼ÐµÑ\80аÑ\88 Ñ\83вÑ\82Ñ\82ае ÐºÐµÐ¿Ð°ÐºÐµÑ\80Ñ\82ошта",
+       "tog-showtoolbar": "Ð\9aеÑ\87ала Ð¿Ð°Ð½ÐµÐ»Ñ\8c Ñ\85Ñ\8cаÑ\85Ñ\8cокÑ\85а Ñ\85Ñ\83вÑ\86ам Ð±ÐµÑ\87а хана",
        "tog-editondblclick": "Нисъе оагӀонаш шозза IотӀатоӀаеча (JavaScript)",
        "tog-editsectiononrightclick": "Нийсде дáкъа шозза дахка аьттехьара тоIаер тӀатоӀайича дáкъа цIера тIа (JavaScript)",
        "tog-watchcreations": "Зем беш йола оагIонашта а файлашта а тIатоха аз хьаяь оагIонаши чуяьккха файлаши",
@@ -55,8 +55,8 @@
        "tog-useeditwarning": "Хоамбе хьадаь хувцамаш дӀа а ца яздеш аз болх дӀаберзабеча хана",
        "underline-always": "Даиман",
        "underline-never": "ЦIаккха",
-       "underline-default": "Ð\91Ñ\80аÑ\83зеÑ\80а Ð³IиÑ\80Ñ\81аÑ\88 Ñ\82оаÑ\8fÑ\80аÑ\88 Ð»ÐµÐ»Ð°е",
-       "editfont-style": "Хувцама моттиге шрифта тайпа:",
+       "underline-default": "Ð\91Ñ\80аÑ\83зеÑ\80а Ð¾Ñ\82Ñ\82амаÑ\88 Ð»ÐµÐ»Ð°Ð´е",
+       "editfont-style": "Хувцам беча моттигера шрифта тайпа:",
        "editfont-monospace": "Цхьатарра йоаца шрифт",
        "editfont-sansserif": "Белгало йоаца шрифт",
        "editfont-serif": "Белгало йола шрифт",
        "category-subcat-count": "{{PLURAL:$2|Укх оагIата чу я алхха ер кIалоагIат.|Укх оагIата чу гуш я $2-нен юкъера $1 {{PLURAL:$1|кIалоагIат}} }}",
        "category-subcat-count-limited": "Укх категори чу {{PLURAL:$1|кIалхара категори|$1 кIалхара категореш}} я.",
        "category-article-count": "{{PLURAL:$2|Укх оагIата чу цаI мара оагIув яц.|Укх оагIата чу я $2 оагӀув, царех оагӀонгахьа {{PLURAL:$1|хьагойт $1 оагӀув}}}}",
-       "category-article-count-limited": "УкÑ\85 ÐºÐ°Ñ\82егоÑ\80и Ñ\87Ñ\83 {{PLURAL:$1|$1 Ð¾Ð°Ð³Ó\80Ñ\83в Ñ\8f|1=Ñ\86аI оагӀув мара яц}}.",
+       "category-article-count-limited": "УкÑ\85 Ð¾Ð°Ð³Ó\80аÑ\82а Ñ\87Ñ\83 {{PLURAL:$1|$1 Ð¾Ð°Ð³Ó\80Ñ\83в Ñ\8f|1=Ñ\86Ñ\85Ñ\8cа оагӀув мара яц}}.",
        "category-file-count": "{{PLURAL:$2|Укх оагIата чу цаI мара файл яц.|Укх оагIата чу долча $2 файлах {{PLURAL:$1|1=хьагойт $1 файл}} }}",
        "category-file-count-limited": "Укх категори чу {{PLURAL:$1|$1 файл|$1 файлаш|1=цаI мара файл яц}}.",
        "listingcontinuesabbrev": "(дIахо)",
        "anontalk": "Дувца оттадар",
        "navigation": "Навигаци",
        "and": "&#32;а",
-       "faq": "Ð\9aÐ\9bÐ¥",
+       "faq": "Ð\9aаÑ\81Ñ\82-каÑ\81Ñ\82Ñ\82а Ñ\82елаÑ\88 Ð´Ð¾Ð»Ð° Ñ\85аÑ\82Ñ\82аÑ\80аÑ\88",
        "actions": "Ардамаш",
        "namespaces": "ЦIерий аренаш",
        "variants": "Эршаш",
        "tagline": "Кечал я укхазара: {{grammar:genitive|{{SITENAME}}}}",
        "help": "Новкъoстал",
        "search": "Лахаp",
-       "searchbutton": "Хьалáха",
+       "searchbutton": "Хьалаха",
        "go": "Дехьавала",
        "searcharticle": "Дехьавала",
        "history": "Истори",
        "history_short": "Истори",
-       "updatedmarker": "Со Ñ\82IеÑ\85Ñ\85Ñ\8cаÑ\80а Ñ\83кÑ\85аз Ñ\85иннаÑ\87Ñ\83л Ñ\82IеÑ\85Ñ\8cагIа ÐºÐµÑ\80дадаÑ\8cккÑ\85ад",
+       "updatedmarker": "кеÑ\80дадаÑ\8cккÑ\85ад Ñ\81о Ñ\82IеÑ\85Ñ\85Ñ\8cаÑ\80а Ñ\83кÑ\85аза Ñ\85иннаÑ\87Ñ\83л Ñ\82IеÑ\85Ñ\8cагIа",
        "printableversion": "Зарба тохара эрш",
        "permalink": "Массаза болх бу тӏатовжам",
        "print": "Зарба тоха",
        "categorypage": "Категорен оагIон бIаргтоха",
        "viewtalkpage": "Дувца оттадара бIаргтоха",
        "otherlanguages": "Кхыча меттаех",
-       "redirectedfrom": "($1 дIа-сахьожаяьй укхаз)",
+       "redirectedfrom": "($1 яха оагIув дIа-хьа хьожаяьй укхаза)",
        "redirectpagesub": "ДIа-хьа хьожавара оагIув",
        "redirectto": "ДIа-хьа хьожавар укхаза:",
        "lastmodifiedat": "Ер оагӀув тӀеххьара хийца хиннай укх ха́на: $1, $2.",
        "pool-queuefull": "ДIахаттарий гулдер хьалдизад",
        "pool-errorunknown": "Довзаш доаца гӀалат",
        "poolcounter-usage-error": "Пайда эцара гIалат: $1",
-       "aboutsite": "{{grammar:genitive|{{SITENAME}}}} лаьца дар",
+       "aboutsite": "Википедех лаьца",
        "aboutpage": "Project:Сурт оттадар",
        "copyright": "Чулоацамá тIакхоачилга да $1 яхача лицензе бокъоношца, нагахь санна кхыдар белгалдаь деце.",
        "copyrightpage": "{{ns:project}}:Автора бокъонаш",
        "policy-url": "Project:Бокъонаш",
        "portal": "Юкъара ков",
        "portal-url": "Project:Юкъара ков",
-       "privacy": "КъайлагIара хIамай политика",
+       "privacy": "КъайлагIарча хIамай политика",
        "privacypage": "Project:КъайлагIара хIамай политика",
        "badaccess": "ТIакхоачилга гӀалат",
        "badaccess-group0": "Оаш дIадийха хинна ардам кхоачашде йиш яц шун.",
        "databaseerror-function": "Функци: $1",
        "databaseerror-error": "ГIалат: $1",
        "missing-article": "Дарий гуллам чу дIайийха текст яц укх оагIон «$1» чура $2 корадар дезаш хинна.\n\nИз мо гIалат нийсалуш хул тишъенна тIахьожаярга гIолла дIадаьккха оагӀон хувцама истори тӀа дехьавала гӀертача.\n\nНагахьа санна из иштта децe, шоана программни Ӏалашдар чу гIалат кораяь хила мега.\nДехар да, цу гIулакха хоам бе цхьа [[Special:ListUsers/sysop|мазаурхалдерчунга]], укхазар URL белгаляьккха.",
-       "missingarticle-rev": "(верси № $1)",
+       "missingarticle-rev": "(эрш № $1)",
        "missingarticle-diff": "(башхало: $1, $2)",
        "internalerror": "Чура гӀалат",
        "internalerror_info": "Чура гӀалат: $1",
        "welcomeuser": "Маьрша воагIалва, доакъашхо $1!",
        "yourname": "Дагара йоазон цIи:",
        "userlogin-yourname": "Доакъашхочун цӀи",
-       "userlogin-yourname-ph": "Iочуязъе хьай учёта яздара (доакъашхочун) цӀи",
+       "userlogin-yourname-ph": "Iочуязъе хьай дагара йоазон цӀи",
        "createacct-another-username-ph": "Iочуязъе доакъашхочун цӀи",
-       "yourpassword": "Ð\9aÑ\8aайладIоагIа:",
+       "yourpassword": "Ð\9fаÑ\80олÑ\8c:",
        "userlogin-yourpassword": "Пароль",
        "userlogin-yourpassword-ph": "Ӏочуязъе хьай пароль",
        "createacct-yourpassword-ph": "Ӏочуязъе пароль",
-       "yourpasswordagain": "ЮÑ\85аÑ\8fзде ÐºÑ\8aайладIоагIа:",
+       "yourpasswordagain": "Ð\9aÑ\85Ñ\8b Ñ\86Ñ\85Ñ\8cаÑ\8cкÑ\85аза Ð¿Ð°Ñ\80олÑ\8c Ñ\8fзÑ\8aÑ\8fÑ\80:",
        "createacct-yourpasswordagain": "Бакъйе пароль",
        "createacct-yourpasswordagain-ph": "Кхы цхьаькхаза Ӏочуязъе пароль",
        "userlogin-remembermypassword": "Ражача чувиса",
        "headline_tip": "2-гӀа лагӀара дáкъа цIи",
        "nowiki_sample": "Укхаза хувца езаш йоаца текст хьачуоттае",
        "nowiki_tip": "Теркал ма е вики-форматировани",
-       "image_tip": "Чуоттаяь файл",
+       "image_tip": "Чухьнахьара файл",
        "media_tip": "Файлá тIатовжам",
        "sig_tip": "Хьа кулгаяздар а, хӀанзара ха а",
        "hr_tip": "ПхьорагIен така (цох пайда эцар тIехдаьнна кастта ма де)",
        "summary": "Хувцамий сурт оттадар",
        "subject": "Тема/даькъа цIи:",
        "minoredit": "ЗӀамига хувцам",
-       "watchthis": "Зем бе укх оагӀон",
+       "watchthis": "Зем бе укх оагӀонна",
        "savearticle": "ОагӀув дIаязъе",
        "preview": "Хьалххе бIаргтохар",
        "showpreview": "Хьалххе бIаргтохар",
        "undo-failure": "Ер нийсдар юхадаккха йиш яц юкъе даь хувцамаш бахьане",
        "viewpagelogs": "Укх оагӀон тептараш хьахьокха",
        "currentrev-asof": "ТӀехьара эрш $1",
-       "revisionasof": "Ð\92еÑ\80Ñ\81и $1",
-       "revision-info": "Ð\92еÑ\80Ñ\81и $1; {{GENDER:$6|$2}}$7",
-       "previousrevision": "← Xьалхарча",
-       "nextrevision": "ТIехьайоагIараш →",
+       "revisionasof": "ЭÑ\80Ñ\88 $1",
+       "revision-info": "ЭÑ\80Ñ\88 ($1); {{GENDER:$6|$2}}$7",
+       "previousrevision": "← XьалхайоагIа",
+       "nextrevision": "ТIехьайоагIа →",
        "currentrevisionlink": "ХIанзара верси",
        "cur": "хӀанза.",
        "next": "тӀехь.",
        "searchprofile-advanced": "Шердаь",
        "searchprofile-articles-tooltip": "$1 чу лахар",
        "searchprofile-images-tooltip": "Файлаш лахар",
-       "searchprofile-everything-tooltip": "Массайола оагIонаш тIа лахар (дувцар оттадара оагIонаш чулоацаш)",
-       "searchprofile-advanced-tooltip": "Iочуязаяь цIерий аренашка лаха",
+       "searchprofile-everything-tooltip": "Массайолча оагIонаш тIа лахар (дувцара оагIонаш чу а лоацаш)",
+       "searchprofile-advanced-tooltip": "Лаха хьахержача цIерий аренашка",
        "search-result-size": "$1 ({{PLURAL:$2|$2 дош|$2 дешаш}})",
        "search-result-category-size": "$1 {{PLURAL:$1|юкъедахар}} ($2 {{PLURAL:$2|кIалоагIат}}, $3 {{PLURAL:$3|файл}})",
-       "search-redirect": "(дIа-хьахьожадар $1 тIара)",
+       "search-redirect": "($1 яхача оагIон тIара дIа-хьа хьожадар)",
        "search-section": "(дáкъа «$1»)",
        "search-file-match": "(цхьатара хул файла чударца)",
        "search-suggest": "Хьона эшар ер хила мега: $1",
        "nchanges": "$1 {{PLURAL:$1|хувцам}}",
        "enhancedrc-history": "истори",
        "recentchanges": "Керда хувцамаш",
-       "recentchanges-legend": "Ð\9aеÑ\80да Ñ\85Ñ\83вÑ\86амий Ð³IиÑ\80Ñ\81аÑ\88 Ñ\82оаÑ\8fÑ\80аш",
+       "recentchanges-legend": "Ð\9aеÑ\80да Ñ\85Ñ\83вÑ\86амий Ð¾Ñ\82Ñ\82амаш",
        "recentchanges-summary": "КIалхагIа Iохьоахадаьд Википеден оагIонаш чу даь хувцамаш тIехьардараш лакхе долаш.",
        "recentchanges-noresult": "Белгалъяьча хана цхьаккха хувцамаш даь хинна дац.",
        "recentchanges-feed-description": "Хьéжа укх потоке вики чу тIехьара хувцамашка.",
        "license": "Лицензи ялар:",
        "license-header": "Лицензировани",
        "imgfile": "файл",
-       "listfiles": "Файлай хьаязъяьр",
-       "listfiles_date": "ТаÑ\8cÑ\80аÑ\85Ñ\8c",
+       "listfiles": "Файлий хьаязъяьр",
+       "listfiles_date": "Ð\94и",
        "listfiles_name": "Файла цӀи",
        "listfiles_user": "Доакъашхо",
        "listfiles_size": "Боарам",
        "listfiles_description": "Йоазонца сурт оттадар",
-       "listfiles_count": "Ð\92еÑ\80Ñ\81и",
+       "listfiles_count": "ЭÑ\80Ñ\88",
        "file-anchor-link": "Файл",
        "filehist": "Файла истори",
-       "filehist-help": "ТаÑ\8cÑ\80аÑ\85Ñ\8c\85а Ñ\82Iа Ñ\82оIабе Ñ\86Ñ\83 Ñ\85ан Ñ\84айл Ð¼Ð¸Ñ\88Ñ\82а Ñ\85иннай Ñ\85Ñ\8cожаpгдолаш",
+       "filehist-help": "Ð\94и/Ñ\85а Ð´Ð¾Ð»Ñ\87а IоÑ\82IаÑ\82оIае Ñ\86Ñ\83 Ñ\85ана Ñ\84айл Ð¼Ð¸Ñ\88Ñ\82а Ñ\85иннай Ñ\85Ñ\8cажа Ð¹Ð¸Ñ\88 Ñ\85Ñ\83pгÑ\8cйолаш",
        "filehist-revert": "юхаяьккха",
        "filehist-current": "xIанзара",
-       "filehist-datetime": "ТаÑ\8cÑ\80аÑ\85Ñ\8c/Ха",
+       "filehist-datetime": "Ð\94и/Ха",
        "filehist-thumb": "ЗIамигасурт",
-       "filehist-thumbtext": "Ð\97Iамига Ñ\81Ñ\83Ñ\80Ñ\82 Ñ\83кÑ\85 Ð²ÐµÑ\80Ñ\81ин $1",
+       "filehist-thumbtext": "Ð\97IамагIа Ð¹Ð¾Ð»Ð° Ñ\8dÑ\80Ñ\88 Ñ\83кÑ\85 Ñ\85ана Ñ\85инна: $1",
        "filehist-nothumb": "Миниатюра яц",
        "filehist-user": "Доакъашхо",
        "filehist-dimensions": "Файла боарам",
        "sharedupload": "Ер файл $1 чура я, из пайда эцаш лелае мегаш я кхыйола проекташ чу.",
        "sharedupload-desc-here": "Ер файл $1 чура я, иштта кхыйола проекташ чу пайда эца аьттув болаш я.\nЦун [$2 сурт оттадара оагIон] хоам кIалхахь хьабоалабаьб.",
        "filepage-nofile": "Ишта цӀи йола файл йоацаш я.",
-       "uploadnewversion-linktext": "ЧÑ\83Ñ\8fккÑ\85а Ñ\83кÑ\85 Ñ\84айла ÐºÐµÑ\80да Ð²ÐµÑ\80Ñ\81и",
+       "uploadnewversion-linktext": "Ð¥Ñ\8cаÑ\87Ñ\83Ñ\8fккÑ\85а Ñ\83кÑ\85 Ñ\84айла ÐºÐµÑ\80да Ñ\8dÑ\80Ñ\88",
        "upload-disallowed-here": "Хьа бокъо яц ер файл юха дӀаязъе.",
        "filerevert-comment": "Бахьан:",
        "filedelete-comment": "Бахьан:",
        "filedelete-reason-otherlist": "Кхыдола бахьан",
        "download": "хьачуяккха",
        "unwatchedpages": "Цхьанне а зем беш йоаца оагIонаш",
-       "randompage": "Ца ховш нийсъенна статья",
-       "statistics": "СÑ\82аÑ\82иÑ\81Ñ\82ика",
+       "randompage": "Цаховш нийсъенна статья",
+       "statistics": "Ð\93Ó\80Ñ\83лакÑ\85\85Ñ\8cал",
        "statistics-articles": "Статьяш",
        "statistics-pages": "ОагIонаш",
-       "double-redirect-fixer": "Ð\94Ó\80а-Ñ\81аÑ\85Ñ\8cожадаÑ\80аÑ\88 Ñ\82оадер",
+       "double-redirect-fixer": "Ð\94Ó\80а-Ñ\85Ñ\8cа Ñ\85Ñ\8cожаваÑ\80а Ð¾Ð°Ð³IонаÑ\88 Ñ\82оаер",
        "brokenredirects-edit": "нийсъе",
        "brokenredirects-delete": "дӀаяккха",
        "withoutinterwiki-submit": "Хьахьокха",
        "categories": "ОагIаташ",
        "linksearch": "Арахьара тIахьожаяргаш лахар",
        "linksearch-ns": "ЦIерий аренаш:",
-       "linksearch-ok": "Хьалáха",
-       "linksearch-line": "$2 — тIахьожаярг укхаз $1",
+       "linksearch-ok": "Хьалаха",
+       "linksearch-line": "$1 яхача оагIонна тIатовжам $2 чура",
        "listgrouprights-members": "(доакъашхой хьаязъяьр)",
        "listgrouprights-namespaceprotection-namespace": "ЦIерий аре",
        "emailuser": "Доакъашхочоа каьхат",
        "watchlist-details": "Хьа зем бара хьаязъяьр чу $1 {{PLURAL:$1|оагIув}} я (иштта дувца оттадара оагIонаш а).",
        "wlheader-showupdated": "Хувцаенна оагIонаш '''сома''' шрифтаца белгалъяьй.",
        "wlnote": "КIалха хьагойт {{PLURAL:$2|тIехьарча сахьата|тIехьарча <strong>$2</strong> сахьата}} даь хинна {{PLURAL:$1|тIеххьара хувцам|тIеххьара <strong>$1</strong> хувцам}} ($3 $4).",
-       "wlshowlast": "Хьахьокха тIехьара $1 сахьатах $2 дийнахь",
+       "wlshowlast": "Хьахьокха тIехьарча $2 ден $1 сахьатá",
        "watchlist-options": "Зем бара хьаязъяьра тоадараш",
        "watching": "Зем бара хьаязъяьр чу тIатохар",
        "unwatching": "Зем бара хьаязъяьр чура дIадаккхар",
        "tooltip-pt-mycontris": "{{GENDER:|хьа}} хувцамаш",
        "tooltip-pt-login": "Укхаза хьай цIи аьле чувала/яла йиша я, амма из параз дац",
        "tooltip-pt-logout": "Аравала/яла",
-       "tooltip-pt-createaccount": "Хьа бокъо я дагара йоазув кхелла система чувала, амма параз долаш дац из.",
-       "tooltip-ca-talk": "Ð\9eагIон Ñ\87Ñ\83даÑ\80 Ð´Ñ\83вÑ\86а Ð¾Ñ\82Ñ\82адар",
+       "tooltip-pt-createaccount": "Хьа бокъо я дагара йоазув хьа а кхелла ражача чувала.",
+       "tooltip-ca-talk": "Ð\9eагIон Ñ\87Ñ\83лоаÑ\86амаÑ\85 Ð»Ð°Ñ\8cÑ\86а Ð´Ñ\83вÑ\86ар",
        "tooltip-ca-edit": "Нийсъе ер оагIув",
        "tooltip-ca-addsection": "Керда дáкъа хьаде",
-       "tooltip-ca-viewsource": "Ер оагIув хувцамбарах гIо теха (лорая) я, амма цунна дIадолалу текстага хьажа а, из тIерхьаязъе а бокъо я.",
+       "tooltip-ca-viewsource": "Ер оагIув хувца йиш хургьйоацаш лораяь я, амма цун чухьнахьарча текстага хьажа а из тIера хьаязъе а вIаштехьа да.",
        "tooltip-ca-history": "Укх оагIон даь хувцамаш тIа дола тептар",
        "tooltip-ca-protect": "Лорае ер оагIув хувцамаш дергдоацаш",
        "tooltip-ca-delete": "ДӀаяккха ер оагӀув",
        "tooltip-ca-move": "Укх оагӀон цӀи хувца",
-       "tooltip-ca-watch": "ТIатоха ер оагIув хьа зем бара хьаязъяьра",
+       "tooltip-ca-watch": "ТIатоха ер оагIув хьай зéма хьаязъяьрá",
        "tooltip-ca-unwatch": "ДӀаяккха ер оагӀув шоай зема хьаязъяьра тIара",
        "tooltip-search": "Хьалáха {{grammar:prepositional|{{SITENAME}}}} чу",
        "tooltip-search-go": "Изза мо цӀи йолаш оагӀон тӀa дехьавала",
        "tooltip-n-randompage": "Башхало йоаца ца ховш нийсъенна оагӀув хьаела",
        "tooltip-n-help": "Новкъостал лаха мегаш йола моттиг",
        "tooltip-t-whatlinkshere": "Укхаза тӏатовжаш йола оагӏонаш",
-       "tooltip-t-recentchangeslinked": "УкÑ\85 Ð¾Ð°Ð³Iо Ñ\82IаÑ\85Ñ\8cожавеÑ\88 Ð¹Ð¾Ð»Ñ\87а Ð¾Ð°Ð³Iонай Ñ\82IеÑ\85хьара хувцамаш",
+       "tooltip-t-recentchangeslinked": "Ð\95Ñ\80 Ð¾Ð°Ð³IÑ\83в Ñ\82IаÑ\82овжаÑ\88 Ð¹Ð¾Ð»Ñ\87а Ð¾Ð°Ð³IонаÑ\88 Ñ\87Ñ\83Ñ\80а Ñ\82Iехьара хувцамаш",
        "tooltip-feed-rss": "RSS чу гойтар укх оагIон",
        "tooltip-feed-atom": "Укх оагIонна лаьрххIа Atom чу трансляци яр",
        "tooltip-t-contributions": "{{GENDER:$1|Укх доакъашхочо хийца}} йола оагIонаш",
        "tooltip-ca-nstab-category": "ОагIата оагӀув",
        "tooltip-minoredit": "Ер хувцар кIезига дар санна белгалде",
        "tooltip-save": "Хьа хувцамаш лорадеш дIаязде",
-       "tooltip-preview": "Ð\94еÑ\85аÑ\80 Ð´Ð°, Ð¾Ð°Ð³Ó\80Ñ\83в Ð»Ð¾Ñ\80аеÑ\88Ñ\8c Ð´IаÑ\8fзÑ\8aелеÑ\85Ñ\8c Ð¸Ð· Ð¼Ð¸Ñ\88Ñ\82а Ñ\8f Ñ\82аÑ\85ка Ñ\85Ñ\8cалÑ\85Ñ\85е Ð±IаÑ\80гÑ\82оÑ\85аÑ\80аÑ\85 Ð¿Ð°Ð¹Ð´Ð° Ñ\8dÑ\86аÑ\88!",
+       "tooltip-preview": "Ð\9eагIонна Ñ\85Ñ\8cалÑ\85Ñ\85е Ð±IаÑ\80гÑ\82оÑ\85аÑ\80.\nÐ\94еÑ\85аÑ\80 Ð´Ð°, Ð¾Ð°Ð³Ó\80Ñ\83в Ð´IаÑ\8fзÑ\8aелеÑ\85Ñ\8c Ñ\85Ñ\8cажа Ð¸Ð· Ð¼Ð¸Ñ\88Ñ\82а Ñ\8f!",
        "tooltip-diff": "ДIадолалу текстаца даь хувцамаш хьахьокха",
        "tooltip-compareselectedversions": "Укх оагIон хержа шин версешта юкъе йола башхалога хьажа.",
        "tooltip-watch": "ТIатоха ер оагIув хьа зем бара хьаязъяьра",
-       "tooltip-rollback": "ЦкÑ\8aа Ð¿Iелг Ñ\82оIабе Ð´IадаккÑ\85а Ñ\82IеÑ\85Ñ\8cаÑ\80а Ñ\80едакÑ\82оÑ\80аÑ\81 даь хувцамаш",
+       "tooltip-rollback": "ЦкÑ\8aа Ð¿Iелг Ñ\82оIабаÑ\8c Ð´IадаÑ\85а Ñ\82IеÑ\85Ñ\8cаÑ\80Ñ\87а Ñ\80едакÑ\82оÑ\80о даь хувцамаш",
        "tooltip-undo": "Даь хувцар дIадаьккха, хьалххе бIаргтохар хьахьокха, дIадаккхара бахьан Iочуязде аьттув болаш.",
        "tooltip-summary": "Лоаца сурт оттадар Iочуязде",
        "simpleantispam-label": "Анти-спам тахкар.\n<strong>Цхьа</strong> хIама ма язъе укхаз!",
        "pageinfo-few-watchers": "{{PLURAL:$1|Зем бер}} $1-ннел кIезигагIа ба",
        "pageinfo-redirects-name": "Укх оагӀонна дӀа-сахьожадарий дуккхал",
        "pageinfo-subpages-name": "Укх оагӀон кIалоагӀонаш",
-       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|дIа-Ñ\81аÑ\85Ñ\8cожадаÑ\80}}; $3 {{PLURAL:$3|обÑ\8bÑ\87наÑ\8f|обÑ\8bÑ\87нÑ\8bе|обÑ\8bÑ\87нÑ\8bÑ\85}})",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|дIа-Ñ\85Ñ\8cа Ñ\85Ñ\8cожаÑ\8fÑ\8cÑ\80}}; $3 {{PLURAL:$3|кÑ\85Ñ\8bÑ\8fÑ\80}})",
        "pageinfo-firstuser": "ОагӀув кхеллар",
-       "pageinfo-firsttime": "ОагӀув кхелла хинна таьрахь",
+       "pageinfo-firsttime": "ОагӀув кхелла хинна ди",
        "pageinfo-lastuser": "ТӀехьара хувцам баьр",
        "pageinfo-lasttime": "ТӀехьара нийсдар даь хинна таьрахь",
        "pageinfo-edits": "Дерригача нийсдарий дукхал",
        "metadata": "Мета-дараш",
        "metadata-help": "Файло кхыдола дараш чулоаца, цифровой суртдоакхарго е сканеро тIатохаш дола. Нагахьа файл чуякхачул тIехьа хийца хинна дале, цхьаццайола параметраш хIанзара сурта тIара йоацаш хила мегаш я.",
        "metadata-expand": "Хьахьокха кхыдола дараш",
-       "metadata-collapse": "Ð\9aÑ\8aайладаккха кхыдола дараш",
+       "metadata-collapse": "Ð\94IакÑ\8aайладаха кхыдола дараш",
        "metadata-fields": "Укх хьаяьзъяра чу дагaрадаь суртий метахоамий йистош, хьахьекха хургда сурта оагIон тIа, хьоарчадаь метахоамий ильг долаш. Юхедиса йистош къайла хургда.\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",
        "exif-imagewidth": "Шерал",
        "exif-imagelength": "Лакхал",
        "exif-orientation": "Сурта белгало",
        "exif-xresolution": "ПхьорагIа тIера боарам",
        "exif-yresolution": "УрагIа тIера боарам",
-       "exif-datetime": "Файл хийца хинна таьрахьи хаи",
+       "exif-datetime": "Файл хийца хинна дии хаи",
        "exif-imagedescription": "Сурта цIи",
        "exif-make": "Камера кийчъяь арахийцар",
        "exif-model": "Камера модель",
index 9fd042f..4110c28 100644 (file)
        "recentchangeslinked-feed": "가리키는 글의 최근 바뀜",
        "recentchangeslinked-toolbox": "가리키는 글의 최근 바뀜",
        "recentchangeslinked-title": "\"$1\" 문서에 관련된 문서 바뀜",
-       "recentchangeslinked-summary": "해당 문서에 연결된 문서의 변경사항을 확인하려면 문서 이름을 입력하십시오. (분류에 들어있는 문서를 보려면 분류:분류명으로 입력하십시오). [[Special:Watchlist|내 주시문서 목록]]에 있는 문서의 변경사항은 <strong>굵게</strong> 나타납니다.",
+       "recentchangeslinked-summary": "해당 문서에 연결된 문서의 변경사항을 확인하려면 문서 이름을 입력하십시오. (분류에 들어있는 문서를 보려면 {{ns:category}}:분류명으로 입력하십시오). [[Special:Watchlist|내 주시문서 목록]]에 있는 문서의 변경사항은 <strong>굵게</strong> 나타납니다.",
        "recentchangeslinked-page": "문서 이름:",
        "recentchangeslinked-to": "해당 문서를 가리키는 문서의 최근 바뀜 보기",
        "recentchanges-page-added-to-category": "[[:$1]]에 분류를 추가하였습니다",
index c0e17e8..bfd785d 100644 (file)
        "recentchangeslinked-feed": "അനുബന്ധ മാറ്റങ്ങൾ",
        "recentchangeslinked-toolbox": "അനുബന്ധ മാറ്റങ്ങൾ",
        "recentchangeslinked-title": "$1 എന്ന താളുമായി ബന്ധപ്പെട്ട മാറ്റങ്ങൾ",
-       "recentchangeslinked-summary": "ഒരു പ്രത്യേക താളിൽ നിന്നു കണ്ണി ചേർക്കപ്പെട്ടിട്ടുള്ള താളുകളിൽ അവസാനമായി വരുത്തിയ മാറ്റങ്ങളുടെ പട്ടിക താഴെ പ്രദർശിപ്പിച്ചിരിക്കുന്നു. ഈ പട്ടികയിൽ പെടുന്ന [[Special:Watchlist|താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകൾ]] '''കടുപ്പിച്ച്''' കാണിച്ചിരിക്കുന്നു.",
+       "recentchangeslinked-summary": "ഒരു പ്രത്യേക താളിൽ നിന്നു കണ്ണി ചേർക്കപ്പെട്ടിട്ടുള്ള താളുകളിൽ അവസാനമായി വരുത്തിയ മാറ്റങ്ങളുടെ പട്ടിക താഴെ പ്രദർശിപ്പിച്ചിരിക്കുന്നു. (ഒരു വർഗ്ഗത്തിലെ താളുകൾ കാണാൻ {{ns:category}}:വർഗ്ഗത്തിന്റെ പേര് എന്ന് നൽകുക) ഈ പട്ടികയിൽ പെടുന്ന [[Special:Watchlist|താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകൾ]] '''കടുപ്പിച്ച്''' കാണിച്ചിരിക്കുന്നു.",
        "recentchangeslinked-page": "താളിന്റെ പേര്:",
        "recentchangeslinked-to": "തന്നിരിക്കുന്ന താളിലെ മാറ്റങ്ങൾക്കു പകരം ബന്ധപ്പെട്ട താളുകളിലെ മാറ്റങ്ങൾ കാണിക്കുക",
        "recentchanges-page-added-to-category": "[[:$1]] വർഗ്ഗത്തിലേക്ക് ചേർത്തിരിക്കുന്നു",
        "cannotauth-not-allowed-title": "അനുമതി നിഷേധിച്ചിരിക്കുന്നു",
        "cannotauth-not-allowed": "ഈ താൾ ഉപയോഗിക്കാൻ താങ്കൾക്ക് അനുവാദമില്ല",
        "credentialsform-account": "അംഗത്വ നാമം:",
+       "cannotlink-no-provider-title": "കണ്ണി ചേർക്കാവുന്ന അംഗത്വങ്ങൾ ഒന്നുമില്ല",
+       "cannotlink-no-provider": "കണ്ണി ചേർക്കാവുന്ന അംഗത്വങ്ങൾ ഒന്നുമില്ല",
+       "linkaccounts": "അംഗത്വങ്ങൾ കണ്ണി ചേർക്കുക",
+       "linkaccounts-success-text": "അംഗത്വം കണ്ണി ചേർത്തു.",
+       "linkaccounts-submit": "അംഗത്വങ്ങൾ കണ്ണി ചേർക്കുക",
+       "unlinkaccounts": "അംഗത്വങ്ങൾ കണ്ണി മാറ്റുക",
+       "unlinkaccounts-success": "അംഗത്വം കണ്ണി മാറ്റി.",
        "restrictionsfield-badip": "അസാധുവായ ഐ.പി. വിലാസം അല്ലെങ്കിൽ പരിധി:$1",
        "restrictionsfield-label": "അനുവദിച്ചിട്ടുള്ള ഐ.പി. പരിധികൾ:",
        "edit-error-short": "പിഴവ്: $1",
index f65f5df..e7aa2ae 100644 (file)
@@ -35,7 +35,7 @@
        "tog-enotifminoredits": "Notech moēhualtia cē maltzinteyōtl netitlaniztli nō ihcuāc mopatla tepitōn zāzanilli in notlachiyaliz.",
        "tog-enotifrevealaddr": "Ticnēxtīz mo e-mailcān āxcāncayōtechcopa āmatlacuilizpan",
        "tog-shownumberswatching": "Tiquinttāz tlatequitiltilīlli tlein tlachiyacateh",
-       "tog-oldsig": "Nicān tōcāyoh:",
+       "tog-oldsig": "Iuh otictlalih motoca:",
        "tog-fancysig": "Wikitext īpan ticmatiz tōcāyoh (in ahtleh auto-link)",
        "tog-forceeditsummary": "Xinēchnōtzāz ihcuāc ahmo niquihtōz inōn ōnitlapatlac",
        "tog-watchlisthideown": "Tictlatiz mopatlaliz ipan motlachiyaliz",
        "article": "Tlahcuilolamatl",
        "newwindow": "(Motlapoaz ce yancuic tlanexillotl)",
        "cancel": "Moxitiniz",
-       "moredotdotdot": "Huehca ōmpa...",
-       "mypage": "Noāmauh",
+       "moredotdotdot": "Ocachi...",
+       "mypage": "Notlahcuilolamauh",
        "mytalk": "Teixnamiquiliztli",
        "anontalk": "Teixnamiquiliztli",
        "navigation": "Panoliztli",
        "namespaces": "Tocatlacauhtli",
        "variants": "Nepapan",
        "navigation-heading": "Nemiliztlahtolpohualamatl",
-       "errorpagetitle": "Aiuhcāyōtl",
+       "errorpagetitle": "Ahiuhcayotl",
        "returnto": "Ximocuepa ihuic $1.",
        "tagline": "Itechcopa {{SITENAME}}",
        "help": "Tepalehuiliztli",
        "imagepage": "Tiquittaz in tlahcuilolamatl itecpanaliztlapiyaliz",
        "mediawikipage": "Xiquitta tetitlaniliztli itlahcuilolamauh",
        "templatepage": "Xiquitta tlahcuilolamatl ineixcuitil",
-       "viewhelppage": "Xiquitta tēpalēhuiliztli zāzanilli",
+       "viewhelppage": "Xiquitta in tepalehuiliztli itlahcuilolamauh",
        "categorypage": "Tiquittaz neneuhcayotl itlahcuilolamauh",
-       "viewtalkpage": "Xiquitta tēixnāmiquiliztli zāzanilli",
-       "otherlanguages": "Occequintin tlahtlahtolcopa",
+       "viewtalkpage": "Xiquitta in teixnamiquiliztli",
+       "otherlanguages": "Occequi tlahtolli",
        "redirectedfrom": "(Omocuep ihuicpa $1)",
-       "redirectpagesub": "Ōmotlacuep zāzanilli",
+       "redirectpagesub": "Tlacueptli itlahcuilolamauh",
        "lastmodifiedat": "Inin tlahcuilolamatl omopatlac immanin $1, ipan $2.",
        "viewcount": "Inīn zāzanilli quintlapōhua {{PLURAL:$1|cē tlahpololiztli|$1 tlahpololiztli}}.",
-       "protectedpage": "Ōmoquīxtix zāzanilli",
+       "protectedpage": "Tlamaquixtilli tlahcuilolamatl",
        "jumpto": "Ticholoz ihuicpa:",
        "jumptonavigation": "amapanoliztli",
        "jumptosearch": "Tlatemoliztli",
        "currentevents-url": "Project:Axcancayotl",
        "disclaimers": "tlamamalquixtiliztli",
        "edithelp": "Tepalehuiliztli ica tlapatlaliztli",
-       "helppage-top-gethelp": "Tēpalēhuiliztli",
+       "helppage-top-gethelp": "Tepalehuiliztli",
        "mainpage": "Yacatlahcuilolli",
        "mainpage-description": "Yacatlahcuilolli",
        "policy-url": "Project:Nahuatīltōn",
        "toc": "In tlein quipiya inin tlahcuilolli",
        "showtoc": "xicnēxti",
        "hidetoc": "xictlāti",
-       "collapsible-collapse": "Motlàtìs",
-       "collapsible-expand": "Monèxtìs",
-       "confirmable-yes": "Quēmah",
-       "confirmable-no": "Ahmō",
-       "thisisdeleted": "¿Tiquittaz nozo ahticpolōz $1?",
-       "viewdeleted": "¿Tiquiēlēhuia tiquitta $1?",
-       "restorelink": "{{PLURAL:$1|cē tlapatlaliztli polotic|$1 tlapatlaliztli polotic}}",
-       "feedlinks": "Olōlpōl:",
+       "collapsible-collapse": "Motlatiz",
+       "collapsible-expand": "Monextiz",
+       "confirmable-yes": "Quemah",
+       "confirmable-no": "Ahmo",
+       "thisisdeleted": "¿Tiquittaz nozo ahticpoloz $1?",
+       "viewdeleted": "¿Cuix tiquittaznequi $1?",
+       "restorelink": "{{PLURAL:$1|cē tlapatlaliztli mopoloh|$1 tlapatlaliztin mopolohqueh}}",
+       "feedlinks": "Nemaccayotl:",
        "site-rss-feed": "$1 RSS huelītiliztli",
        "site-atom-feed": "Atom tlamantli itech $1",
        "page-rss-feed": "\"$1\" RSS huelītiliztli",
        "nosuchaction": "Ahmo ia tlachīhualiztli",
        "nosuchspecialpage": "Âmò ka inòn nònkuâkìskàtlaìxtlapalli",
        "nospecialpagetext": "<strong>Tiknẻki sè nònkuâkìskàtlaìxtlapalli tlèn âmò kä.</strong>\n\nKualli tikỉtas sè ìntlapòpòwaltekpànal in nònkuâkìskàtlaìxtlapaltìn ìpan [[Special:SpecialPages|{{int:specialpages}}]].",
-       "error": "Ahcuallōtl",
+       "error": "Ahiuhcayotl",
        "databaseerror": "Tlahcuilōltzintlān īahcuallo",
        "databaseerror-query": "Tlahtlanilli: $1",
+       "databaseerror-error": "Ahiuhcayotl $1",
        "laggedslavemode": "Xiquitta: huel ahmo ia achi yancuīc in tlapatlaliztli inīn zāzanilco.",
        "readonly": "Mactzīntlantli tzahtzacticah",
        "missingarticle-rev": "(tlachiyaliztli ītlapōhual: $1)",
        "missingarticle-diff": "(Ahneneuh.: $1, $2)",
-       "internalerror": "Ahcuallōtl tlahtic",
-       "internalerror_info": "Ahcuallōtl tlahtic: $1",
+       "internalerror": "Ahiuhcayotl tlahtic",
+       "internalerror_info": "Ahiuhcayotl tlahtic: $1",
        "filecopyerror": "Ahmō ōmohuelītic tlacopīna \"$1\" īhuīc \"$2\".",
        "filerenameerror": "Ahmō ōmohuelītic tlazaca \"$1\" īhuīc \"$2\".",
        "filedeleteerror": "Ahmō ōmohuelītic tlapoloa \"$1\".",
        "userlogout": "Xiquīza",
        "notloggedin": "Ahmō ōtimocalac",
        "userlogin-noaccount": "Cuix ahmo titlapohualeh?",
-       "createaccount": "Xicchīhua tlapōhualli",
+       "createaccount": "Xicchihua ce tlapohualli",
        "createacct-email-ph": "xiquihcuilo mocorreo electrónico",
        "createaccountmail": "Ticnemītīz ahmo cemihcac zāzoichtacātlahtōlli nō in tiquēhualtīz in maltzinteyōtl monetitlanizyeyān",
        "createacct-reason": "Tleīpampa",
        "permissionserrors": "Tēmācāhualiztli aiuhcāyōtl",
        "permissionserrorstext": "Ahmo tihuelīti quichīhua inōn, inīn {{PLURAL:$1|īxtlamatilizpampa}}:",
        "permissionserrorstext-withaction": "Ahmo tiquihuelīti $2 inīn {{PLURAL:$1|īxtlamatilizpampa}}:",
-       "moveddeleted-notice": "Inin tlahcuilolamatl omopoloh.\nIn tlapololiztli ihuan in tlazacaliztli tlahcuilolloh cah tlani.",
+       "moveddeleted-notice": "Inin tlahcuilolamatl omopoloh.\nIn tlapololiztli ihuan in tlazacaliztli itlahcuilolloh cah tlani.",
        "edit-gone-missing": "Ahmo huelīti yancuīya zāzanilli.\nHueliz ōmopolo.",
        "edit-conflict": "Tlapatlaliztli yāōyōtōn",
        "edit-already-exists": "Ahmo mohuelīti mochīhua yancuīc zāzanilli.\nYe ia.",
        "content-model-javascript": "JavaScript",
        "cantcreateaccount-text": "[[User:$3|$3]] ōcquīxti cuentah tlachīhualiztli īpal inīn IP ('''$1''').\n\nĪxtlamatiliztli īpal $3 cah ''$2''",
-       "viewpagelogs": "Tiquinttāz tlahcuilōlloh inīn zāzaniltechcopa",
+       "viewpagelogs": "Tiquittaz in tlahcuilolamatl itlahtollouh",
        "nohistory": "Nicān ahmō oncah tlaīxtlapatlaliztlahtōllōtl.",
        "currentrev": "Āxcān tlapatlaliztli",
        "currentrev-asof": "Āxcān tlachiyaliztli īpan $1",
        "histfirst": "in achto",
        "histlast": "in tlatzaucticah",
        "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
-       "historyempty": "(iztāc)",
+       "historyempty": "(cactic)",
        "history-feed-title": "Tlaceppahuiliztlahtōllōtl",
        "history-feed-description": "Tlachiyaliztli tlahcuilōlloh inīn zāzaniltechcopa huiquipan",
        "history-feed-item-nocomment": "$1 īpan $2",
        "mergehistory-comment": "Ōmocēntili [[:$1]] īpan [[:$2]]: $3",
        "mergehistory-reason": "Tleīpampa:",
        "revertmerge": "Ticahtletiliz in cetiliztli",
-       "history-title": "«$1» ītlaceppahuiliztlahtōllo",
+       "history-title": "Nepapan tlahcuilollotl itechpa «$1»",
        "lineno": "Pantli $1:",
        "editundo": "Ticxitiniz",
        "searchresults": "motlatemoliz itlananquilizhuan",
        "searchprofile-articles": "Itech tlahcuilolamatl",
        "searchprofile-images": "Nepapan media",
        "searchprofile-everything": "Mochi",
-       "searchprofile-advanced": "Huehca ōmpa",
-       "searchprofile-articles-tooltip": "Tictēmōz īpan $1",
+       "searchprofile-advanced": "Quizqui",
+       "searchprofile-articles-tooltip": "Tictemoz ipan $1",
        "searchprofile-images-tooltip": "motemoz tlapiyaliztecpaliztli",
        "searchprofile-everything-tooltip": "Tictemoz ipan mochi tlapiyaliztli (noihuan tlahcuilolamatl iteixnamiquiliz)",
        "search-result-size": "$1 ({{PLURAL:$2|1 tlahtol|$2 tlahtoltin}})",
        "search-category": "(neneuhcayotl $1)",
        "search-suggest": "Ahnōceh tiquihtōznequiya: $1",
        "search-interwiki-caption": "Tlachīhualiztli īcnīhuān",
-       "search-interwiki-more": "(huehca ōmpa)",
+       "search-interwiki-more": "(ocachi)",
        "search-relatedarticle": "Ītechcopa",
        "searchrelated": "ītechcopa",
        "searchall": "mochīntīn",
        "group": "Necentlaliliztli:",
        "group-user": "Tequihuihqueh",
        "group-bot": "Tepoztlācah",
-       "group-sysop": "Tlahcuilōlpixqueh",
+       "group-sysop": "Huiquipixqueh",
        "group-all": "(mochīntīn)",
        "group-user-member": "{{GENDER:$1|tlatequitiltilīlli}}",
        "group-bot-member": "{{GENDER:$1|tepozcuāyōllōtl}}",
-       "group-sysop-member": "{{GENDER:$1|tētlamahmacani}}",
+       "group-sysop-member": "{{GENDER:$1|huiquipixqui}}",
        "grouppage-user": "{{ns:project}}:Tlatequitiltilīlli",
        "grouppage-bot": "{{ns:project}}:Tepoztlācah",
-       "grouppage-sysop": "{{ns:project}}:Tlahcuilōlpixqueh",
-       "right-read": "Tiquimpōhuāz zāzaniltin",
-       "right-edit": "Tiquimpatlāz zāzaniltin",
-       "right-createpage": "Ticchīhuāz zāzaniltin (ahmo tēixnāmiquiliztli zāzaniltin)",
-       "right-createtalk": "Ticchīhuāz tēixnāmiquiliztli zāzaniltin",
+       "grouppage-sysop": "{{ns:project}}:Huiquipixqueh",
+       "right-read": "Tiquimpohuaz tlahcuilolamameh",
+       "right-edit": "Tiquimpatlaz tlahcuilolamameh",
+       "right-createpage": "Ticchihuaz tlahcuilolamameh (ahmo teixnamiquiliztli tlahcuilolamatl)",
+       "right-createtalk": "Ticchihuaz teixnamiquiliztli itlahcuilolamauh",
        "right-createaccount": "Ticchīhuaz yancuic tlapōhualli",
        "right-minoredit": "Ticpatlāz quemeh tlapatlalitzintli",
        "right-move": "Tiquinzacāz zāzaniltin",
        "statistics-header-edits": "Tlapatlaliztli tlapōhualli",
        "statistics-header-users": "Tlatequitiltilīlli ītlapōhualiz",
        "statistics-articles": "Tlapiyaliztli zāzanilli",
-       "statistics-pages": "Zāzaniltin",
+       "statistics-pages": "Tlahcuilolamameh",
        "statistics-pages-desc": "Mochīntīn zāzaniltin huiquipan, mopiyah tēixnāmiquiliztli, tlacuepaliztli, etz.",
        "statistics-files": "Tlahcuilōlli ōmoquetz",
        "doubleredirects": "Ōntetl tlacuepaliztli",
        "deadendpages": "Ahtlaquīzaliztli zāzaniltin",
        "protectedpages": "Zāzaniltin ōmoquīxti",
        "protectedpages-indef": "Zan ahcāhuitl tlaquīxtiliztli",
-       "protectedpages-page": "Tlaīxtli",
+       "protectedpages-page": "Tlahcuilolamatl",
        "protectedpages-reason": "Tleīpampa",
        "protectedtitles": "Tōcāitl ōmoquīxtih",
        "listusers": "Tlatequitiltilīlli",
        "booksources-search-legend": "Tiquixtemoz amoxtli itzintiliz",
        "booksources-search": "Tlatemoliztli",
        "specialloguserlabel": "Tlatequitiltilīlli:",
-       "speciallogtitlelabel": "Tōcāitl:",
+       "speciallogtitlelabel": "Ahciliztli (itoca nozo {{ns:user}}:tequitiuhqui itoca):",
        "log": "Tlahcuilolloh",
        "all-logs-page": "Mochintin nohuiyanyoh intlahcuilolhuan",
        "allpages": "Mochintin tlahcuilolamatl",
        "linksearch-line": "$1 tzonhuīlo īxquichca $2",
        "listusers-submit": "Tiquittāz",
        "activeusers-submit": "Xiquitta",
-       "listgrouprights-group": "Olōlli",
+       "listgrouprights-group": "Necentlaliliztli",
        "listgrouprights-rights": "Huelītiliztli",
        "emailuser": "Tiquēhualtlīz maltzinteyōtl netitlaniztli inīn tlatequitiltilīlli",
        "defemailsubject": "{{SITENAME}} correo tlatequitiltilīlhuīc $1",
        "watch": "Titlachiyaz",
        "watchthispage": "Tictlachiyāz inīn zāzanilli",
        "unwatch": "Ahmo titlachiyaz",
-       "watchlist-details": "{{PLURAL:$1|$1 zāzanilli|$1 zāzaniltin}} motlachiyaliz, ahmo mopōhua tēixnāmiquiliztli.",
-       "wlshowlast": "Tiquinttāz tlapatlaliztli īhuīcpa achto $1 yēmpohualminuhtli, $2 tōnaltin",
+       "watchlist-details": "Oncah {{PLURAL:$1|$1 tlahcuilolamatl|$1 tlahcuilolamameh}} ipan motlachiyaliz (oc tlahcuilolamatl iteixnamiquiliz).",
+       "wlshowlast": "Tiquittaz itlapatlaliz itech $1 horas, $2 tonaltin",
        "watching": "Tlachiyacah...",
        "unwatching": "Ahtlachiyacah...",
        "enotif_impersonal_salutation": "tlatequitiltilīlli īpan {{SITENAME}}",
        "whatlinkshere-page": "Tlahcuilolamatl:",
        "linkshere": "Inīn zāzaniltin quitzonhuiliah '''[[:$1]]''' īhuīc:",
        "nolinkshere": "Ahtle quitzonhuilia '''[[:$1]]''' īhuīc.",
-       "isredirect": "ōmotlacuep zāzanilli",
+       "isredirect": "Tlacueptli tlahcuilolamatl",
        "isimage": "īxiptlahtli tzonhuiliztli",
        "whatlinkshere-prev": "{{PLURAL:$1|achtopa|$1 achtopa}}",
        "whatlinkshere-next": "{{PLURAL:$1|niman|$1 niman}}",
        "whatlinkshere-links": "← tzohuiliztin",
        "whatlinkshere-hideredirs": "$1 tlacuepaliztli",
        "whatlinkshere-hidelinks": "$1 tzonhuiliztli",
-       "whatlinkshere-hideimages": "$1 tlahcuilōltzonhuīliztli",
+       "whatlinkshere-hideimages": "$1 tlahcuiloltzonhuiliztli",
        "whatlinkshere-filters": "Tlatzetzelōni",
        "blockip": "Tiquitzacuilīz tlatequitiltilīlli",
        "ipaddressorusername": "IP nozo tlatequitiltilīlli ītōcā:",
        "movelogpage": "Tlazacaliztli tlahcuilōlloh",
        "movereason": "Īxtlamatiliztli:",
        "revertmove": "tlacuepāz",
-       "delete_and_move_confirm": "Quēmah, ticpolōz in zāzanilli",
-       "immobile-source-namespace": "Ahmo huelīti mozaca zāzanilli tōcātzimpan \"$1\"",
-       "immobile-target-namespace": "Ahmo huelīti mozaca zāzanilli tōcātzinhuīc \"$1\"",
-       "immobile-source-page": "Ahmo huelīti mozacāz zāzanilli.",
+       "delete_and_move_confirm": "Quemah, ticpohpoloz in tlahcuilolamatl",
+       "immobile-source-namespace": "Ahmo hueli ticzaca inin tlahcuilolamatl ompa \"$1\"",
+       "immobile-target-namespace": "Ahmo hueli ticzaca inin tlahcuilolamatl ompa\"$1\"",
+       "immobile-source-page": "Ahmo hueli occepa tictocayotia inin tlahcuilolamatl.",
        "move-leave-redirect": "Ma ticcahua ce tlatzonhuiliztli",
        "export": "Tiquinnamacāz zāzaniltin",
        "export-submit": "Ticnamacāz",
        "tooltip-feed-rss": "RSS tlachicahualiztli inin tlahcuilolamatl",
        "tooltip-feed-atom": "Atom tlachicāhualiztli inīn zāzaniltechcopa",
        "tooltip-t-contributions": "Tlapōhualmatl ītechpa {{GENDER:$1|inīn tlatequitiltilīlli}} ītlahcuilōl",
-       "tooltip-t-emailuser": "Tiquihcuilōz inīn tlatequitiltililhuīc",
+       "tooltip-t-emailuser": "Tictitlantiz ce mail ihuicpa {{GENDER:$1|inin tequitiuhqui}}",
        "tooltip-t-upload": "Tiquinquetzaz tlahcuiloltin",
        "tooltip-t-specialpages": "Intlahtoltecpanaliz mochtin in noncuahquizquitlahcuiloltin",
        "tooltip-t-print": "Tepoztlahcuilolli",
        "tooltip-summary": "Xiquihcuilo ce tepiton tlahcuiloltontli",
        "anonymous": "Ahtōcāitl {{PLURAL:$1|tlatequitiltilīlli}} īpan {{SITENAME}}",
        "siteuser": "$1 tlatequitiltilīlli īpan {{SITENAME}}",
-       "lastmodifiedatby": "Inin tlahcuilolamatl omopatlac ipan $2, $1 ipan $3.",
+       "lastmodifiedatby": "$3 oquipatlac inin tlahcuilolamatl ipan tonalli $1 immanin $2.",
        "others": "occequīntīn",
        "siteusers": "$1 {{PLURAL:$2|{{GENDER:$1|tequitiuhqui}}|tequitiuhqueh}} īpan {{SITENAME}}",
        "spam_reverting": "Mocuepacah īhuīc xōcoyōc tlapatlaliztli ahmo tzonhuilizca īhuīc $1",
        "exif-lightsource-1": "Tōnameyōtl",
        "exif-lightsource-2": "Nāltic",
        "exif-lightsource-4": "Flax",
-       "exif-lightsource-10": "Mixxoh",
-       "exif-lightsource-11": "Ecahuīlli",
-       "exif-lightsource-12": "Nāltic tōnallāhuīlli (D 5700 – 7100K)",
-       "exif-lightsource-13": "Nāltic iztāc tōnallāhuīlli (N 4600 – 5400K)",
-       "exif-lightsource-14": "Nāltic cecec iztāc (W 3900 – 4500K)",
+       "exif-lightsource-10": "Mixtentoc",
+       "exif-lightsource-11": "Ecahuilloh",
+       "exif-lightsource-12": "Naltonac (D 5700 – 7100K)",
+       "exif-lightsource-13": "Iztac naltonac (N 4600 – 5400K)",
+       "exif-lightsource-14": "Cecec iztac naltonac (W 3900 – 4500K)",
        "exif-lightsource-15": "Nāltic iztāc (WW 3200 – 3700K)",
        "exif-lightsource-17": "Yēctli tlāhuīlli A",
        "exif-lightsource-18": "Yēctli tlāhuīlli B",
        "scarytranscludetoolong": "[In URL huel hueyac]",
        "recreate": "Ticchīhuāz occeppa",
        "confirm_purge_button": "Cualli",
-       "imgmultipageprev": "← achto zāzanilli",
-       "imgmultipagenext": "niman zāzanilli →",
+       "imgmultipageprev": "← achto tlahcuilolamatl",
+       "imgmultipagenext": "niman tlahcuilolamatl →",
        "imgmultigo": "¡Ma xiyauh!",
        "imgmultigoto": "Yaliztica ihuicpa tlahtolamatl $1",
        "ascending_abbrev": "quetza",
        "descending_abbrev": "temoa",
-       "table_pager_next": "Niman zāzanilli",
-       "table_pager_prev": "Achto zāzanilli",
-       "table_pager_first": "Achtopa zāzanilli",
-       "table_pager_last": "Xōcoyōc zāzanilli",
+       "table_pager_next": "Niman tlahcuilolamatl",
+       "table_pager_prev": "Achto tlahcuilolamatl",
+       "table_pager_first": "Achtopa tlahcuilolamatl",
+       "table_pager_last": "Xocoyoc tlahcuilolamatl",
        "table_pager_limit_submit": "Yaliztica",
        "table_pager_empty": "Ahtlein",
        "autosumm-blank": "Tlaiztaliztli in tlahcuilolamatl",
        "specialpages-group-highuse": "Zāzaniltin tlatequitiliztechcopa",
        "specialpages-group-pages": "Mochintin tlahcuilolamameh",
        "specialpages-group-redirects": "Tlatēmoliztli īhuān  tlacuepaliztli",
-       "blankpage": "Iztāc zāzanilli",
-       "htmlform-selectorother-other": "Occe",
+       "blankpage": "Iztac tlahcuilolamatl",
+       "htmlform-selectorother-other": "Occequi",
        "rightsnone": "ahtlein",
        "feedback-cancel": "Moxitiniz",
        "searchsuggest-search": "Tlatemoliztli",
        "special-characters-group-thai": "Taitlahcuilōlli",
        "special-characters-group-lao": "Laotlahcuilōlli",
        "special-characters-group-khmer": "Jemertlahcuilōlli",
-       "randomrootpage": "Zazantlen nelhuatlahcuilolamatl"
+       "randomrootpage": "Itech nepapan tlahcuilolamatl, iteyacatica"
 }
index b8dd678..c023aac 100644 (file)
        "filereadonlyerror": "Kon t bestaand \"$1\" niet anpassen umdat de bestaandsmap \"$2\" op dit moment op allinnig-lezen steet.\n\nDe op-egeven reden is: \"$3\".",
        "invalidtitle-knownnamespace": "Ongeldige titel mit naamruumte \"$2\" en tekste \"$3\"",
        "invalidtitle-unknownnamespace": "Ongeldige titel mit onbekend naamruumtenummer $1 en tekste \"$2\"",
-       "exception-nologin": "Nyt an-emeld",
+       "exception-nologin": "Neet an-emelded",
        "exception-nologin-text": "Um disse zied te bekieken of disse haandeling uut te kunnen voeren mu'j [[Special:Userlogin|an-emeld]] ween bie disse wiki.",
        "virus-badscanner": "Slichte konfigurasie: onbekend antivirusprogramma: ''$1''",
        "virus-scanfailed": "inlezen is mislokt (kode $1)",
        "nav-login-createaccount": "Anmelden",
        "logout": "Ofmelden",
        "userlogout": "Aofmelden",
-       "notloggedin": "Nyt an-emeld",
+       "notloggedin": "Neet an-emelded",
        "userlogin-noaccount": "Heb jy noch gyn gebrukersname?",
        "userlogin-joinproject": "Wörd lid van {{SITENAME}}",
        "createaccount": "Inskryven",
        "enhancedrc-history": "geschiedenisse",
        "recentchanges": "Lätste wysigingen",
        "recentchanges-legend": "Opsies veur leste wiezigingen",
-       "recentchanges-summary": "Op disse zied ku'j de leste wiezigingen van disse wiki bekieken.",
+       "recentchanges-summary": "Up disse syde kün jy de lätste wysigingen van disse wiki bekyken.",
        "recentchanges-noresult": "Der waren in disse periode gien wiezigingen die an de kriteria voldoon.",
        "recentchanges-feed-description": "Zeuk naor de alderleste wiezingen op disse wiki in disse voer.",
-       "recentchanges-label-newpage": "Mid disse bewarking is een nye syde an-emaakt",
-       "recentchanges-label-minor": "Dit is een kleyne wysiging",
+       "recentchanges-label-newpage": "Mid disse bewarking is een nye syde an-emaked",
+       "recentchanges-label-minor": "Dit is een kleine wysiging",
        "recentchanges-label-bot": "Disse bewarking is uutevoord döär een bot",
-       "recentchanges-label-unpatrolled": "Disse bewarking is noch nyt nå-ekeaken",
+       "recentchanges-label-unpatrolled": "Disse bewarking is noch neet nå-ekeaken",
        "recentchanges-label-plusminus": "Disse sydegroutte is mid dit antal bytes ewysigd",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sy ouk de [[Special:NewPages|lyste mid nye syden]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (see ouk de [[Special:NewPages|lyste mid nye syden]])",
        "recentchanges-submit": "Bekiek",
        "rcfilters-legend-heading": "<strong>Lyste mid ofkortingen:</strong>",
        "rcfilters-group-results-by-page": "Resultaoten per zied groeperen",
        "rcfilters-savedqueries-add-new-title": "Filterinstellingen upslån",
        "rcfilters-restore-default-filters": "Standardfilters weerummezetten",
        "rcfilters-clear-all-filters": "Alle filters vortdoon",
-       "rcfilters-search-placeholder": "Filter wysigingen (gebruuk et menu of söök up filtername)",
+       "rcfilters-search-placeholder": "Filter wysigingen (gebruuk et menü of söök up filtername)",
        "rcfilters-filterlist-feedbacklink": "Låt uns weaten wat jy van disse (nye) filterhülpmiddels vinden",
        "rcfilters-highlightbutton-title": "Resultåten markeren",
        "rcfilters-highlightmenu-title": "Kies n kleur",
        "rcfilters-filtergroup-userExpLevel": "Gebrukersanmelding en ervåring",
        "rcfilters-filter-user-experience-level-registered-label": "An-emeld",
        "rcfilters-filter-user-experience-level-registered-description": "An-emelde bewarkers.",
-       "rcfilters-filter-user-experience-level-unregistered-label": "Nyt an-emeld",
-       "rcfilters-filter-user-experience-level-unregistered-description": "Bewarkers dy nyt an-emeld binnen.",
+       "rcfilters-filter-user-experience-level-unregistered-label": "Neet an-emelded",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Bewarkers dee neet an-emelded binnen.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Anwas",
-       "rcfilters-filter-user-experience-level-newcomer-description": "An-emelde bewarkers dy minder as 10 bewarkingen edån hebben of 4 dagen aktiv ewest binnen.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "An-emelden bewarkers dee minder as 10 bewarkingen edån hebben of 4 dagen aktiv ewesd hebben.",
        "rcfilters-filter-user-experience-level-learner-label": "Learlingen",
-       "rcfilters-filter-user-experience-level-learner-description": "An-emelde bewarkers mid meer ervåring as \"anwas\", mär minder as \"ervåren gebrukers\".",
+       "rcfilters-filter-user-experience-level-learner-description": "An-emelde bewarkers mid meyr ervåring as \"anwas\", mär minder as \"ervåren gebrukers\".",
        "rcfilters-filter-user-experience-level-experienced-label": "Ervåren gebrukers",
-       "rcfilters-filter-user-experience-level-experienced-description": "An-emelde bewarkers mid meer as 500 bewarkingen en 30 dagen van aktiviteyt.",
+       "rcfilters-filter-user-experience-level-experienced-description": "An-emelde bewarkers mid meyr as 500 bewarkingen en 30 dagen van aktiviteit.",
        "rcfilters-filter-bots-label": "Bot",
-       "rcfilters-filter-humans-label": "Meanskelik (gyn bot)",
+       "rcfilters-filter-humans-label": "Meanskelik (geyn bot)",
        "rcfilters-filter-humans-description": "Bewarkingen döär meanskelike bewarkers.",
        "rcfilters-filtergroup-reviewstatus": "Beoordelingsstaotus",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "Niet nao-ekeken",
        "rcfilters-filtergroup-significance": "Petansie",
-       "rcfilters-filter-minor-label": "Kleyne bewarkingen",
-       "rcfilters-filter-major-label": "Gyn kleyne bewarking",
+       "rcfilters-filter-minor-label": "Kleine bewarkingen",
+       "rcfilters-filter-minor-description": "Bewarkingen dee döär de bewarker emarkeerd binnen as klein.",
+       "rcfilters-filter-major-label": "Geyn kleine bewarking",
        "rcfilters-filter-major-description": "Bewarkingen niet emarkeerd as klein.",
        "rcfilters-filtergroup-watchlist": "Evolgde ziejen",
        "rcfilters-filter-watchlist-watched-label": "Op de volglieste",
        "rcfilters-filter-watchlist-watchednew-label": "Nieje volgliestwiezigingen",
        "rcfilters-filter-watchlist-notwatched-label": "Niet op de volglieste",
        "rcfilters-filter-watchlist-notwatched-description": "Alles behalve wiezigingen an ziejen die op joew volglieste staon.",
+       "rcfilters-filtergroup-changetype": "Soort wysiging",
        "rcfilters-filter-pageedits-label": "Sydebewarkingen",
        "rcfilters-filter-pageedits-description": "Wysigingen an de wiki-inhold, diskussys, kategorybeskryvingen…",
        "rcfilters-filter-newpages-label": "Nye syden",
        "rcfilters-filter-newpages-description": "Bewarkingen wårmead jy een nye syde anmaken.",
        "rcfilters-filter-categorization-label": "Kategorywysigingen",
-       "rcfilters-filter-categorization-description": "Upgave van syden dy tovoogd of vortedån wörden uut kategoryen.",
+       "rcfilters-filter-categorization-description": "Upgave van syden dee to-evoogd of vortedån wörden uut kategoryen.",
        "rcfilters-filter-logactions-label": "Eregistreerde aktys",
+       "rcfilters-filter-logactions-description": "Administrative handelingen, nye kontos, et vortdoon van syden, upstüren van bestanden…",
        "rcfilters-filtergroup-lastRevision": "Lätste versys",
        "rcfilters-filter-lastrevision-label": "Lätste versy",
        "rcfilters-filter-lastrevision-description": "Allinnig de lätste wysiging an een syde.",
-       "rcfilters-filter-previousrevision-label": "Nyt de lätste versy",
-       "rcfilters-filter-previousrevision-description": "Alle wysigingen dy nyt de \"lätste versy\" binnen.",
+       "rcfilters-filter-previousrevision-label": "Neet de lätste versy",
+       "rcfilters-filter-previousrevision-description": "Alle wysigingen dee neet de \"lätste versy\" binnen.",
        "rcfilters-view-namespaces-tooltip": "Filter resultåten up naamruumte",
        "rcfilters-view-tags-tooltip": "Filter resultåten döär gebruuk te maken van bewarkingsetiketten",
        "rcfilters-liveupdates-button": "Rechtstreakse aktualisering",
        "uploadbtn": "Bestand upstüren",
        "reuploaddesc": "Weerumme naor de opstuurzied",
        "upload-tryagain": "Bestaandsbeschrieving biewarken",
-       "uploadnologin": "Nyt an-emeld",
+       "uploadnologin": "Neet an-emelded",
        "uploadnologintext": "Je mutten $1 ween um bestaanden op te kunnen sturen.",
        "upload_directory_missing": "De inlaojmap veur bestaanden ($1) is vort en kon niet an-emaakt wörden deur de webserver.",
        "upload_directory_read_only": "Op t moment ku'j gien bestaanden opsturen vanwegen techniese problemen ($1).",
        "listgrouprights-addgroup-self-all": "Kan alle groepen bie de eigen gebruker doon",
        "listgrouprights-removegroup-self-all": "Kan alle groepen vortdoon van eigen gebruker",
        "trackingcategories": "Volgkategorieën",
-       "mailnologin": "Nyt an-emeld.",
+       "mailnologin": "Neet an-emelded.",
        "mailnologintext": "Je mutten [[Special:UserLogin|an-emeld]] ween en n geldig e-mailadres in \"[[Special:Preferences|mien veurkeuren]]\" invoeren um disse funksie te kunnen gebruken.",
        "emailuser": "Gebruker een bericht stüren",
        "emailuser-title-target": "Disse {{GENDER:$1|gebruker}} n bericht sturen",
        "watchlistfor2": "Veur $1 ($2)",
        "nowatchlist": "Gien artikels in volglieste.",
        "watchlistanontext": "$1 is verplicht um joew volglieste te bekieken of te wiezigen.",
-       "watchnologin": "Nyt an-emeld",
+       "watchnologin": "Neet an-emelded",
        "addwatch": "Op mien volglieste zetten",
        "addedwatchtext": "De zied \"[[:$1]]\" steet noen op joew [[Special:Watchlist|volglieste]].\nToekomstige wiezigingen op disse zied en de overlegzied zullen hier vermeld wörden.",
        "removewatch": "Van mien volglieste aofhaolen",
        "movepage-page-moved": "De zied $1 is herneumd naor $2.",
        "movepage-page-unmoved": "De zied $1 kon niet herneumd wörden naor $2.",
        "movepage-max-pages": "t Maximale antal automaties te herneumen ziejen is bereikt ({{PLURAL:$1|$1|$1}}).\nDe aandere ziejen wörden niet automaties herneumd.",
-       "movelogpage": "Herneumlogboek",
+       "movelogpage": "Hernöömlogbook",
        "movelogpagetext": "Hieronder steet n lieste mit ziejen die herneumd bin.",
        "movesubpage": "{{PLURAL:$1|Zied die deronder hank|Ziejen die deronder hangen}}",
        "movesubpagetext": "De {{PLURAL:$1|zied die onder disse zied hank|$1 ziejen die onder disse zied hangen}} vie'j hieronder.",
        "table_pager_empty": "Gien resultaoten",
        "autosumm-blank": "Zied leegemaakt",
        "autosumm-replace": "Tekste vervöngen deur '$1'",
-       "autoredircomment": "deurverwiezing naor [[$1]]",
+       "autoredircomment": "döärverwysing når [[$1]]",
        "autosumm-new": "Nieje zied: '$1'",
        "size-kilobytes": "$1 kB",
        "lag-warn-normal": "Wiezigingen die niejer bin as $1 {{PLURAL:$1|seconde|seconden}} staon misschien nog niet in de lieste.",
        "tag-filter": "[[Special:Tags|Etiketfilter]]:",
        "tag-filter-submit": "Filtreren",
        "tag-list-wrapper": "([[Special:Tags|Etiket{{PLURAL:$1||ten}}]]: $2)",
+       "tag-mw-new-redirect": "Nye döärverwysing",
+       "tag-mw-removed-redirect": "Döärverwysing vortedån",
        "tags-title": "Etiket",
        "tags-intro": "Op disse zied staon de etiketten waormee de programmatuur elke bewarking kan markeren, en de betekenisse dervan.",
        "tags-tag": "Etiketnaam",
        "htmlform-no": "Nee",
        "htmlform-yes": "Ja",
        "htmlform-chosen-placeholder": "Kies n opsie",
-       "logentry-delete-delete": "$1 hef de zied $3 {{GENDER:$2|vortedaon}}",
+       "logentry-delete-delete": "$1 hevt de syde $3 {{GENDER:$2|vortedån}}",
        "logentry-delete-restore": "$1 hef de zied $3 {{GENDER:$2|weerummezet}}",
        "logentry-delete-event": "$1 hef de zichtbaorheid van {{PLURAL:$5|n logboekregel|$5 logboekregels}} van $3 {{GENDER:$2|ewiezigd}}: $4",
        "logentry-delete-revision": "$1 hef de zichtbaorheid van {{PLURAL:$5|een versie|$5 versies}} van de zied $3 {{GENDER:$2|ewiezigd}}: $4",
        "revdelete-unrestricted": "hef beparkingen veur beheerders deraof ehaold",
        "logentry-block-block": "$1 {{GENDER:$2|hef}} {{GENDER:$4|$3}} eblokkeerd veur de duur van $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|hef}} {{GENDER:$4|$3}} eblokkeerd veur de duur van $5 $6",
-       "logentry-move-move": "$1 hef de zied $3 {{GENDER:$2|herneumd}} naor $4",
-       "logentry-move-move-noredirect": "$1 hef de zied $3 {{GENDER:$2|herneumd}} naor $4 zonder n deurverwiezing achter te laoten",
-       "logentry-move-move_redir": "$1 hef de zied $3 {{GENDER:$2|herneumd}} naor $4 over n deurverwiezing heer",
-       "logentry-move-move_redir-noredirect": "$1 hef de zied $3 {{GENDER:$2|herneumd}} naor $4 over n deurverwiezing heer zonder n deurverwiezing achter te laoten",
+       "logentry-move-move": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} når $4",
+       "logentry-move-move-noredirect": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} når $4 sunder een döärverwysing achter te låten",
+       "logentry-move-move_redir": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} når $4 oaver een döärverwysing hear",
+       "logentry-move-move_redir-noredirect": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} når $4 oaver een döärverwysing hear sunder een döärverwysing achter te låten",
        "logentry-patrol-patrol": "$1 hef versie $4 van de zied $3 op {{GENDER:$2|nao-ekeken}} ezet",
        "logentry-patrol-patrol-auto": "$1 hef versie $4 van de zied $3 automaties op {{GENDER:$2|nao-ekeken}} ezet",
        "logentry-newusers-newusers": "Gebruker $1 is {{GENDER:$2|an-emaakt}}",
index a8eddc8..f11e4fd 100644 (file)
        "expansion-depth-exceeded-warning": "Pagina depassant la prigondor d'espandiment",
        "parser-unstrip-loop-warning": "Bocla pas desmontabla detectada",
        "unstrip-depth-warning": "Limit de recursion pas desmontable depassat ($1)",
+       "unstrip-depth-category": "Paginas que la limita de prigondor de desvolopament i  es despassada",
+       "unstrip-size-warning": "Limita de mesura de desvolopament despassada ($1)",
+       "unstrip-size-category": "Paginas que la limita de la mesura de desvolopament es despassada",
        "converter-manual-rule-error": "Error detectada dins la règla manuala de conversion de lenga",
        "undo-success": "Aquesta modificacion va èsser desfaita. Confirmatz los cambiaments (visibles en bas d'aquesta pagina), puèi salvatz se sètz d’acòrdi. Mercés de motivar l’anullacion dins la bóstia de resumit.",
        "undo-failure": "Aquesta modificacion a pas pogut èsser desfaita a causa de conflictes amb de modificacions intermediàrias.",
        "mergehistory-fail-bad-timestamp": "L’orodatatge es pas valid.",
        "mergehistory-fail-invalid-source": "La pagina font es pas valida.",
        "mergehistory-fail-invalid-dest": "La pagina de destinacion es invalida",
+       "mergehistory-fail-no-change": "La fusion d'istoric a pas fusionat cap de revision. Tornatz  verificar la pagina e los paramètres de temps.",
+       "mergehistory-fail-permission": "Avètz pas de permissions sufisentas per fusionar l'istoric.",
+       "mergehistory-fail-self-merge": "Las paginas d'origina e de destinacion son las meteissas",
+       "mergehistory-fail-timestamps-overlap": "Las revisions d'origina se superpausan o seguisson las de destinacion.",
        "mergehistory-fail-toobig": "Impossible d’efectuar la fusion de l’istoric perque un nombre de {{PLURAL:$1|revisions}} superior al limit de $1 deuriá èsser desplaçat.",
        "mergehistory-no-source": "La pagina d'origina $1 existís pas.",
        "mergehistory-no-destination": "La pagina de destinacion $1 existís pas.",
        "diff-multi-sameuser": "({{PLURAL:$1|Una revision intermediària pel meteis utilizaire pas afichada|$1 revisions intermediàrias pel meteis utilizaire pas afichadas}})",
        "diff-multi-otherusers": "({{PLURAL:$1|Una revision intermediària|$1 revisions intermediàrias}} per {{PLURAL:$2|un autre utilizaire|$2 utilizaires}} pas {{PLURAL:$1|afichada|afichadas}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Una revision intermediària amagada|$1 revisions intermediàrias amagadas}}) per ({{PLURAL:$2|un utilizaire pas afichada|$2 utilizaires pas afichadas}})",
+       "diff-paragraph-moved-tonew": "Lo paragraf foguèt desplaçat. Fasètz un clic per anar a l'emplaçament nòu.",
+       "diff-paragraph-moved-toold": "Lo paragraf foguèt desplaçat. Fasètz un clic par anar a l'emplaçament ancian.",
        "difference-missing-revision": "{{PLURAL:$2|Una revision|$2 revisions}} d'aquesta diferéncia ($1) {{PLURAL:$2|es pas estada trobada|son pas estadas trobadas}}.\n\nAquò se produtz en general en seguent un ligam de diferéncia obsolèta cap a una pagina qu'es estada suprimada.\nPodètz trobar de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de las supressions].",
        "searchresults": "Resultats de la recèrca",
        "searchresults-title": "Resultats de la recèrca per « $1 »",
        "search-category": "(categoria $1)",
        "search-file-match": "(correspond al contengut del fichièr)",
        "search-suggest": "Avètz volgut dire : $1",
+       "search-rewritten": "S’i mòstran los resultats de $1. Cercatz «$2» en luòc d'aquò.",
        "search-interwiki-caption": "Resultats dels projèctes fraires",
        "search-interwiki-default": "Resultats de $1 :",
        "search-interwiki-more": "(mai)",
        "search-external": "Recèrca extèrna",
        "searchdisabled": "La recèrca sus {{SITENAME}} es desactivada.\nEn esperant la reactivacion, podètz efectuar una recèrca via Google.\nAtencion, lor indexacion de contengut {{SITENAME}} benlèu es pas a jorn.",
        "search-error": "Una error s'es produita en recercant : $1",
+       "search-warning": "Una error s'es produsida en cercant : $1",
        "preferences": "Preferéncias",
        "mypreferences": "Preferéncias",
        "prefs-edits": "Nombre d’edicions :",
        "stub-threshold-disabled": "Desactivat",
        "recentchangesdays": "Nombre de jorns d'afichar dins los darrièrs cambiaments :",
        "recentchangesdays-max": "(maximum $1 {{PLURAL:$1|jorn|jorns}})",
-       "recentchangescount": "Nombre de modificacions d'afichar per defaut :",
-       "prefs-help-recentchangescount": "Aquò inclutz las modificacions recentas, las paginas d’istorics e los jornals.",
+       "recentchangescount": "Nombre de modificacions d'afichar per defauta dins los cambiaments recents, los istorics e los logs :",
+       "prefs-help-recentchangescount": "Nombre maximum : 1000",
        "prefs-help-watchlist-token2": "Aquí la clau secreta del flux Web de vòstra lista de seguiment.\nTota persona que la coneis poirà legir vòstra lista de seguiment, doncas, la comuniquetz pas.\nSe necessari, [[Special:ResetTokens|clicatz aicí per la reïnicializar]].",
        "savedprefs": "Las preferéncias son estadas salvadas.",
        "savedrights": "Los dreits d'utilizaire de {{GENDER:$1|$1}} son estats enregistrats.",
        "timezoneregion-indian": "Ocean Indian",
        "timezoneregion-pacific": "Ocean Pacific",
        "allowemail": "Autorizar los autres utilizaires a me mandar de corrièls",
+       "email-allow-new-users-label": "Autorizar corrièr electronic d'utilizaires nòus",
        "prefs-searchoptions": "Recèrca",
        "prefs-namespaces": "Noms d’espacis",
        "default": "defaut",
index 29869a1..8a28548 100644 (file)
                        "Gombang",
                        "Trizek (WMF)",
                        "Acamicamacaraca",
-                       "Avatar6"
+                       "Avatar6",
+                       "Akapochtli"
                ]
        },
        "sidebar": "{{notranslate}}",
index b2fa321..fc930a1 100644 (file)
        "rcfilters-filter-bots-description": "Modificări făcute cu unelte automate.",
        "rcfilters-filter-humans-label": "Om (nu robot)",
        "rcfilters-filter-humans-description": "Modificări făcute de oameni.",
-       "rcfilters-filtergroup-reviewstatus": "Revizuiți starea",
+       "rcfilters-filtergroup-reviewstatus": "Statutul reviziei",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "Nepatrulate",
        "rcfilters-filtergroup-significance": "Semnificație",
        "rcfilters-filter-minor-label": "Modificări minore",
        "rcfilters-filter-watchlistactivity-seen-label": "Schimbări văzute",
        "rcfilters-filter-watchlistactivity-seen-description": "Modificările paginilor pe care le-ați vizitat de la efectuarea schimbărilor.",
        "rcfilters-filtergroup-changetype": "Tipul modificării",
-       "rcfilters-filter-pageedits-label": "Editări ale paginii",
+       "rcfilters-filter-pageedits-label": "Modificări în pagini",
        "rcfilters-filter-pageedits-description": "Editări ale conținutului wiki, discuții, descrieri de categorii…",
        "rcfilters-filter-newpages-label": "Creare de pagini",
        "rcfilters-filter-newpages-description": "Modificări care au dus la crearea de pagini noi.",
index c6b9521..65f27f6 100644 (file)
@@ -16,7 +16,8 @@
                        "MtDu",
                        "Manik Soren",
                        "Ramjit Tudu",
-                       "R Ashwani Banjan Murmu"
+                       "R Ashwani Banjan Murmu",
+                       "Fagunkoyel Hansdah"
                ]
        },
        "tog-underline": "ᱡᱚᱱᱚᱲ ᱞᱟᱛᱟᱨᱨᱮ ᱫᱟᱜᱽ ᱩᱫᱩᱜᱽᱢᱮ:",
        "pool-timeout": "Somoy paromena cạbi lạgit́te tạṅgi hoyoḱkana",
        "pool-queuefull": "Pool queue is full",
        "pool-errorunknown": "ᱵᱟᱝ ᱵᱟᱰᱟᱭ ᱦᱩᱲᱟᱹᱜ",
-       "aboutsite": "ᱵᱟᱵᱚᱛ {{SITENAME}}",
+       "aboutsite": "{{SITENAME}} ᱵᱟᱵᱚᱛ",
        "aboutpage": "Project: ᱵᱟᱵᱚᱛ",
        "copyright": "ᱩᱱᱩᱫᱩᱜ ᱫᱚ ᱧᱟᱢᱚᱜ-ᱟ $1 ᱞᱮᱠᱟᱛᱮ  ᱵᱟᱝᱠᱷᱟᱱ ᱚᱞ ᱛᱟᱦᱮᱱᱟ",
        "copyrightpage": "{{ns:project}}: ᱮᱠᱛᱤᱭᱟᱨ",
        "listfiles_date": "ᱢᱟᱹᱦᱤᱛ",
        "listfiles_name": "ᱧᱩᱛᱩᱢ",
        "listfiles_user": "ᱵᱮᱵᱦᱟᱨᱤᱡ",
+       "listfiles-latestversion-yes": "ᱦᱮᱸ",
+       "listfiles-latestversion-no": "ᱵᱟᱝ",
        "file-anchor-link": "ᱨᱮᱫ",
        "filehist": "ᱨᱮᱫ ᱨᱮᱭᱟᱜ ᱱᱟᱜᱟᱢ",
        "filehist-help": "ᱚᱠᱛᱚ ᱨᱮ ᱞᱤᱱ ᱢᱮ/ᱚᱠᱛᱚ ᱨᱮ ᱨᱮᱫ ᱧᱮᱞ ᱞᱟᱹᱜᱤᱛ ᱞᱤᱱ ᱢᱮ",
        "filehist-nothumb": "ᱵᱟᱹᱱᱩᱜ-ᱟ ᱴᱤᱯ-ᱨᱟᱢᱟ",
        "filehist-user": "ᱵᱮᱵᱦᱟᱨᱤᱡ",
        "filehist-dimensions": "ᱡᱚᱠᱷᱟ",
+       "filehist-filesize": "ᱨᱮᱫ ᱥᱟᱭᱤᱡᱽ",
        "filehist-comment": "ᱠᱟᱛᱷᱟ",
        "imagelinks": "ᱯᱷᱟᱭᱤᱞ ᱵᱮᱣᱦᱟᱨ",
        "linkstoimage": "ᱞᱟᱛᱟᱨ ᱨᱮᱭᱟᱜ {{PLURAL:$1|ᱥᱟᱦᱴᱟ ᱡᱚᱱᱚᱲᱠᱚ|$1 ᱥᱟᱦᱴᱟᱠᱚ ᱡᱚᱱᱚᱲ}} ᱱᱤᱭᱟᱹ ᱨᱮᱫ ᱨᱮ:",
        "sharedupload-desc-here": "ᱱᱚᱣᱟ ᱨᱮᱫ ᱫᱚ ᱱᱚᱸᱰᱮ ᱠᱷᱚᱱ $1 ᱟᱨ ᱯᱟᱥᱮᱡ ᱮᱴᱟᱜ-ᱟ ᱯᱚᱨᱡᱮᱠᱴ ᱨᱮᱦᱚᱸ ᱵᱮᱵᱦᱟᱨᱚᱜ ᱠᱟᱱᱟ᱾\nᱱᱚᱣᱟ ᱨᱮᱭᱟ ᱯᱟᱥᱱᱟᱣ ᱠᱟᱛᱷᱟ [$2 ᱨᱮᱫ ᱯᱟᱥᱱᱟᱣ ᱥᱟᱦᱴᱟ] ᱞᱟᱛᱟᱨᱨᱮ ᱮᱢ ᱮᱱᱟ᱾",
        "filepage-nofile": "ᱱᱚᱶᱟ ᱧᱩᱛᱩᱢᱟᱜ ᱨᱮᱫ ᱵᱟᱹᱱᱩᱜ-ᱟ ᱾",
        "upload-disallowed-here": "ᱟᱢᱫᱚ ᱱᱚᱣᱟ ᱨᱮᱫ ᱪᱮᱛᱟᱱ ᱵᱟᱢ ᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾",
+       "filerevert-comment": "ᱚᱡᱮ:",
        "mimesearch": "MIME ᱥᱮᱸᱫᱽᱨᱟ",
        "randompage": "ᱡᱚᱲᱟᱣ ᱥᱟᱦᱴᱟ",
        "statistics": "ᱦᱟᱞᱚᱛ",
        "prefixindex": "ᱡᱚᱛᱚ ᱥᱟᱦᱴᱟᱠᱚ prefix ᱥᱟᱶ",
        "shortpages": "ᱦᱩᱰᱤᱧ ᱥᱟᱦᱴᱟᱠᱚ",
        "longpages": "ᱡᱤᱞᱤᱧ ᱥᱟᱦᱴᱟᱠᱚ",
+       "protectedpages-page": "ᱥᱟᱦᱴᱟ",
+       "protectedpages-reason": "ᱚᱡᱮ",
        "listusers": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱛᱟᱹᱞᱠᱟᱹ",
        "listusers-creationsort": "ᱛᱮᱭᱟᱨᱟᱠᱟᱱ ᱢᱟᱹᱦᱤᱛ ᱞᱮᱠᱟᱛᱮ ᱯᱟᱱᱛᱮ",
        "usercreated": "{{GENDER:$3|ᱵᱮᱱᱟᱣᱠᱟᱱ}} $1 ᱢᱟᱹᱦᱤᱛᱨᱮ $2 ᱚᱠᱛᱚᱨᱮ",
        "listusers-blocked": "(ᱮᱥᱮᱫ ᱜᱮᱭᱟ)",
        "listgrouprights-group": "ᱜᱟᱶᱛᱟ",
        "listgrouprights-rights": "ᱟᱹᱭᱫᱟᱹᱨᱤᱠᱚ",
-       "listgrouprights-helppage": "ᱜᱚᱲᱚᱸ:ᱜᱟᱫᱮᱞ ᱟᱹᱭᱫᱟᱹᱨ",
+       "listgrouprights-helppage": "Help:ᱜᱟᱫᱮᱞ ᱟᱹᱭᱫᱟᱹᱨ",
        "listgrouprights-members": "(ᱥᱚᱦᱮᱫᱠᱩᱣᱟᱜ ᱛᱟᱹᱞᱠᱟᱹ)",
        "listgrouprights-addgroup-all": "ᱡᱚᱛᱚ ᱜᱟᱶᱛᱟᱠᱩ ᱥᱮᱞᱮᱫ ᱠᱩ ᱢᱮ",
        "listgrouprights-removegroup-all": "ᱡᱚᱛᱚ ᱜᱟᱶᱛᱟᱠᱩ ᱚᱪᱚᱜ ᱠᱩ ᱢᱮ",
        "undeletelink": "ᱧᱮᱞ/ᱫᱚᱦᱚ ᱨᱩᱣᱟᱹᱲ",
        "undeleteviewlink": "ᱧᱮᱞ",
        "undelete-search-submit": "ᱥᱮᱸᱫᱽᱨᱟ",
+       "undelete-show-file-submit": "ᱦᱮᱸ",
        "namespace": "ᱧᱤᱛᱩᱢ ᱡᱟᱜᱟ",
        "invert": "ᱥᱮᱪ ᱵᱟᱪᱷᱟᱣ",
        "tooltip-invert": "ᱱᱚᱶᱟ ᱵᱟᱠᱥᱟ ᱴᱤᱠ ᱢᱮ ᱥᱟᱦᱴᱟ ᱠᱷᱚᱱ ᱵᱚᱫᱚᱞᱟᱜᱠᱚ ᱫᱟᱱᱟᱝ ᱞᱟᱹᱜᱤᱫ  ᱵᱟᱛᱷᱚᱱ ᱨᱟᱠᱷᱟ ᱧᱩᱛᱩᱢ ᱥᱟᱶᱛᱮ (ᱟᱨ ᱡᱚᱯᱚᱲᱟᱣᱟᱱ ᱨᱟᱠᱷᱟ ᱧᱩᱛᱩᱢ ᱡᱩᱫᱤ ᱴᱤᱠ ᱟᱠᱟᱱᱟ)",
        "allmessagesname": "ᱧᱩᱛᱩᱢ",
        "allmessagesdefault": "Bań bhul mesag ol",
        "allmessages-filter-all": "ᱡᱚᱛᱚ",
+       "allmessages-language": "ᱯᱟᱹᱨᱥᱤ:",
        "allmessages-filter-submit": "ᱪᱟᱞᱟᱜ ᱢᱮ",
+       "allmessages-filter-translate": "ᱛᱚᱨᱡᱚᱢᱟ",
        "thumbnail-more": "ᱞᱟᱹᱴᱩᱭ ᱢᱮ",
        "thumbnail_error": "Benawakan unuduḱ kạṭuṕ do baṅ ṭhika: $1",
        "import-upload-filename": "ᱨᱮᱫᱧᱩᱛᱩᱢᱺ",
        "pageinfo-toolboxlink": "ᱥᱦᱟᱴᱟ ᱨᱮᱭᱟᱜ ᱠᱷᱚᱵᱚᱨ",
        "pageinfo-contentpage": "ᱩᱱᱩᱫᱩᱜ ᱥᱟᱦᱴᱟ ᱞᱮᱠᱟᱛᱮ ᱞᱮᱠᱷᱟ ᱦᱟᱠᱟᱱᱟ",
        "pageinfo-contentpage-yes": "ᱦᱮᱸ",
+       "pageinfo-protect-cascading-yes": "ᱦᱮᱸ",
        "patrol-log-page": "ᱛᱩᱱᱠᱷᱤᱭᱤᱡᱟᱜ ᱞᱚᱜᱽ",
        "previousdiff": "← ᱢᱟᱨᱮᱱᱟᱜ ᱥᱟᱯᱲᱟᱣ",
        "nextdiff": "ᱱᱟᱣᱟᱱᱟᱜ ᱥᱟᱯᱲᱟᱣ →",
        "exif-subsectime": "ᱢᱟᱹᱦᱤᱛ ᱚᱠᱛᱚ ᱴᱤᱯᱤᱡ",
        "exif-exposuretime-format": "$1 ᱴᱤᱯᱤᱡ ($2)",
        "exif-gpsdatestamp": "GPS ᱢᱟᱹᱦᱤᱛ",
+       "exif-languagecode": "ᱯᱟᱹᱨᱥᱤ",
        "exif-unknowndate": "ᱚᱪᱤᱱᱦᱟᱹᱣ ᱢᱟᱹᱦᱤᱛ",
        "exif-orientation-1": "ᱥᱟᱫᱷᱟᱨᱚᱱ",
+       "exif-contrast-0": "ᱱᱚᱨᱢᱟᱞ",
+       "exif-saturation-0": "ᱱᱚᱨᱢᱟᱞ",
+       "exif-sharpness-0": "ᱱᱚᱨᱢᱟᱞ",
        "exif-dc-date": "ᱢᱟᱹᱦᱤᱛ",
+       "exif-urgency-normal": "ᱱᱚᱨᱢᱟᱞ ($1)",
        "namespacesall": "ᱡᱚᱛᱚ",
        "monthsall": "ᱡᱚᱛᱚ",
        "quotation-marks": "\"$1\"",
        "tags-hitcount": "$1 {{PLURAL:$1|ᱟᱹᱨᱩ|ᱟᱹᱨᱩᱠᱚ}}",
        "compare-page1": "ᱥᱟᱦᱴᱟ ᱑",
        "compare-rev1": "ᱧᱮᱞᱟᱹᱨᱩ ᱑",
+       "htmlform-no": "ᱵᱟᱝ",
+       "htmlform-yes": "ᱦᱮᱸ",
        "logentry-delete-delete": "$3 ᱥᱟᱦᱴᱟ $1 {{GENDER:$2|ᱜᱮᱫ ᱠᱮᱜ-ᱟᱭ}}",
        "logentry-delete-restore": "$1 {{GENDER:$2|ᱨᱟᱠᱷᱟ ᱫᱚᱲᱦᱟ}} ᱠᱮᱜ-ᱟ ᱥᱟᱦᱴᱟ $3 ($4)",
        "logentry-delete-revision": "$1 {{GENDER:$2|ᱵᱚᱫᱚᱞᱠᱮᱜ-ᱟᱭ}} ᱧᱮᱞᱚᱜᱟᱜ {{PLURAL:$5|ᱫᱚᱦᱲᱟᱭᱮᱱᱟᱜ|$5 ᱫᱚᱦᱲᱟᱭᱮᱱᱟᱜ ᱠᱚ}} $3: $4 ᱥᱟᱦᱴᱟ ᱪᱮᱛᱟᱱᱨᱮ",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|ᱞᱟᱫᱮᱭᱮᱱᱟ}} ᱢᱤᱫ ᱱᱟᱶᱟ ᱵᱷᱟᱨᱥᱚᱱ $3 ᱨᱮᱱᱟᱜ",
        "searchsuggest-search": "ᱥᱮᱸᱫᱽᱨᱟ {{SITENAME}}",
        "duration-days": "$1 {{PLURAL:$1|ᱢᱟᱦᱟᱸ|ᱢᱟᱸᱦᱟᱸ}}",
+       "pagelanguage": "ᱥᱟᱦᱴᱟ ᱯᱟᱹᱨᱥᱤ ᱵᱚᱫᱚᱞ",
+       "pagelang-language": "ᱯᱟᱹᱨᱥᱤ",
+       "right-pagelang": "ᱥᱟᱦᱴᱟ ᱯᱟᱹᱨᱥᱤ ᱵᱚᱫᱚᱞ",
        "mw-widgets-dateinput-no-date": "ᱢᱟᱹᱦᱤᱛ ᱵᱟᱝ ᱵᱟᱪᱷᱚᱱ ᱟᱠᱟᱱᱟ",
        "mw-widgets-mediasearch-input-placeholder": "ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ ᱢᱮᱰᱤᱭᱟ",
        "date-range-from": "ᱢᱟᱹᱦᱤᱛ ᱠᱷᱚᱱ:",
index 6f3fefc..4e2d7aa 100644 (file)
        "redirectedfrom": "(Reindiritzadu dae $1)",
        "redirectpagesub": "Pàgina de reindiritzamentu",
        "redirectto": "Reindiritzat a:",
-       "lastmodifiedat": "Ùrtimu càmbiu su $1, a is $2.",
+       "lastmodifiedat": "Ùrtima modìfica su $1, a is $2.",
        "viewcount": "Custu artìculu l'ant lèghidu {{PLURAL:$1|borta|$1 bortas}}.",
        "protectedpage": "Pàgina amparada",
        "jumpto": "Bae a:",
        "linkstoimage-redirect": "$1 (reindiritzamentu file) $2",
        "sharedupload": "Custu file benit dae $1 e podet èssere impreadu in àteros progetos.",
        "sharedupload-desc-here": "Custu documentu benit dae $1 e podet èssere impreadu in àteros progetos.\nA sighire est ammustrada sa descritzione in sa sua [$2 pàgina de descritzione de su documentu].",
+       "filepage-nofile": "Non b'at perunu documentu cun custu nùmene.",
        "uploadnewversion-linktext": "Carriga una versione noa de custu file",
        "shared-repo-from": "dae $1",
        "filerevert-comment": "Motivu:",
        "booksources": "Fontes libràrias",
        "booksources-search-legend": "Chirca fontes libràrias",
        "booksources-isbn": "ISBN:",
+       "booksources-search": "Chirca",
        "specialloguserlabel": "Atzione fata dae:",
        "speciallogtitlelabel": "Atzione fata subra:",
        "log": "Registros",
        "watchlist-options": "Optziones subra sa lista de pàginas annotadas",
        "watching": "Giunghende a sa watchlist...",
        "unwatching": "Boghende dae sa watchlist...",
+       "enotif_reset": "Marca totu sas pàginas bisitadas",
        "enotif_impersonal_salutation": "Impitadore de {{SITENAME}}",
        "enotif_anon_editor": "impitadore anònimu $1",
        "created": "creada",
        "contributions": "Cuntributos {{GENDER:$1|utente}}",
        "contributions-title": "Contributziones de $1",
        "mycontris": "Contributos mios",
+       "anoncontribs": "Contributziones",
        "contribsub2": "Pro {{GENDER:$3|$1}} ($2)",
        "nocontribs": "Nessuna modifica trovata conformemente a questi criteri.",
        "uctop": "(atuale)",
        "importstart": "Importande is pàginas...",
        "import-revision-count": "$1 {{PLURAL:$1|revisione|revisiones}}",
        "importlogpage": "Importatziones",
-       "tooltip-pt-userpage": "Sa pàgina utente tua",
+       "tooltip-pt-userpage": "Sa pàgina impitadore {{GENDER:|tua}}",
        "tooltip-pt-mytalk": "Sa pàgina de is cuntierras tuas",
-       "tooltip-pt-preferences": "Is preferèntzias chi podes seberare",
+       "tooltip-pt-preferences": "Is preferèntzias {{GENDER:|tuas}}",
        "tooltip-pt-watchlist": "Lista de is pàginas annotadas dae tue pro is mudàntzias",
        "tooltip-pt-mycontris": "Sa lista de is contributos mios",
        "tooltip-pt-login": "Sa registratzione est cussigiada; mancari chi non siat obligatoria",
        "tooltip-feed-rss": "RSS feed pro custa pàgina",
        "tooltip-feed-atom": "Atom feed pro custa pàgina",
        "tooltip-t-contributions": "Càstia sa lista de is cuntributos de custu utente",
-       "tooltip-t-emailuser": "Ispedi una email a custu impitadore",
+       "tooltip-t-emailuser": "Imbia una e-lìtera a {{GENDER:$1|custu impreadore}}",
        "tooltip-t-upload": "Càrriga documentu multimediale",
        "tooltip-t-specialpages": "Lista de is pàginas ispetziales",
        "tooltip-t-print": "Versione de custa pàgina pro s'imprenta",
        "tooltip-t-permalink": "Ligàmene permanente a custa versione de sa pàgina",
        "tooltip-ca-nstab-main": "Càstia su cuntenutu de sa pàgina",
        "tooltip-ca-nstab-user": "Càstia sa pàgina utente",
-       "tooltip-ca-nstab-special": "Custa est una pàgina ispetziale, non si podet modificare",
+       "tooltip-ca-nstab-special": "Custa est una pàgina ispetziale, non podet èssere modificada",
        "tooltip-ca-nstab-project": "Càstia sa pàgina de servìtziu",
        "tooltip-ca-nstab-image": "Càstia sa pàgina de su file",
        "tooltip-ca-nstab-template": "Càstia su template",
        "file-nohires": "Non si tenent risolutziones prus artas.",
        "svg-long-desc": "file in formadu SVG, mannesa nominale $1 × $2 pixel, mannesa de su file: $3",
        "show-big-image": "Versione a risolutzione arta",
+       "show-big-image-size": "$1 × $2 pixels",
        "imagelisttext": "Innoe sighendi du est una lista de '''$1''' {{PLURAL:$1|file|files}} ordinada $2.",
        "newimages-legend": "Filtru",
        "ilsubmit": "Chirca",
        "metadata-expand": "Ammustra particulares",
        "metadata-collapse": "Cua particulares",
        "metadata-fields": "Is campos de is metadatos de imàgine listados in custu messàgiu ant a èssere ammustrados in sa pàgina de s'immàgine candu sa tabella de is metadatos est presentada in forma breve. Pro impostatzione predefinida, is àteros campos ant a èssere cuaos.\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",
+       "exif-orientation": "Orientamentu",
        "exif-artist": "Autore",
        "exif-exposuretime-format": "$1 s ($2)",
        "exif-fnumber-format": "f/$1",
        "version-software-version": "Versione",
        "version-entrypoints-header-url": "URL",
        "redirect-submit": "Bae",
+       "redirect-value": "Valore:",
        "redirect-user": "ID impitadore",
        "redirect-page": "ID pàgina",
+       "redirect-revision": "Versione de sa pàgina",
+       "redirect-file": "Nùmene documentu",
        "fileduplicatesearch-submit": "Chirca",
        "specialpages": "Pàginas ispetziales",
        "specialpages-note-top": "Legenda",
        "feedback-close": "Fatu",
        "feedback-message": "Messàgiu:",
        "feedback-subject": "Ogetu:",
-       "searchsuggest-search": "Chirca",
+       "searchsuggest-search": "Chirca in intro de {{SITENAME}}",
        "expand_templates_ok": "OK",
        "expand_templates_preview": "Antiprima",
        "pagelang-name": "Pàgina",
diff --git a/languages/i18n/shy-latn.json b/languages/i18n/shy-latn.json
new file mode 100644 (file)
index 0000000..7649054
--- /dev/null
@@ -0,0 +1,630 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Vikoula5"
+               ]
+       },
+       "tog-underline": "Aderrer n iseɣwan:",
+       "tog-hideminor": "Ffer ibeddilen ifessasen deg yibeddilen imaynuten",
+       "tog-hidepatrolled": "Ffer ibeddilen yettwaɣran deg yibeddilen imaynuten",
+       "tog-newpageshidepatrolled": "Ffer isebtar yettwaɣran deg tebdart n isebtar imaynten",
+       "tog-hidecategorization": "Ffer taggayin n isebtar",
+       "tog-extendwatchlist": "Ssemɣer umuɣ n uɛessi iwakken ad muqleɣ akk n wayen zemreɣ ad beddleɣ",
+       "tog-usenewrc": "Ssegrew ibeddlen s usebtar deg ibeddilen imaynuten d umuɣ n uḍfar",
+       "tog-numberheadings": "Izwal ɣur-sen imḍanen mebla ma serseɣ-iten",
+       "tog-showtoolbar": "Ssken tafeggagt n ifecka n ubeddel",
+       "tog-editondblclick": "Beddel isebtar mi wekkiɣ snat n tikwal",
+       "tog-editsectiononrightclick": "Ssermed abeddel n tigezmi s ukliki ayeffus ɣef izwal",
+       "tog-watchcreations": "Rnu isebtar i xelqeɣ deg wumuɣ n uɛessi inu",
+       "tog-watchdefault": "Rnu isebtar i ttbeddileɣ deg wumuɣ n uɛessi inu",
+       "tog-watchmoves": "Rnu isebtar i smimḍeɣ deg wumuɣ n uɛessi inu",
+       "tog-watchdeletion": "Rnu isebtar i mḥiɣ deg wumuɣ n uɛessi inu",
+       "tog-watchuploads": "Rnu ifuyla imaynuten i suliɣ ar tebdart-iw n uqreɛ",
+       "tog-watchrollback": "Rnu ar tebdart-iw n uḍfaṛ n isebtar anida hwiɣ albaɛd",
+       "tog-minordefault": "Rcem akk ibeddlen am ibeddlen ifessasen d ameslugen",
+       "tog-previewontop": "Ssken pre-timeẓriwt uqbel tankult ubeddel",
+       "tog-previewonfirst": "Ssken pre-timeẓriwt akk d ubeddel amezwaru",
+       "tog-enotifwatchlistpages": "Azen-iyi-d e-mail m'ara yettubeddel asebter i ttɛassaɣ",
+       "tog-enotifusertalkpages": "Azen-iyi-d e-mail asmi sɛiɣ izen amaynut",
+       "tog-enotifminoredits": "Azen-iyi-d e-mail ma llan ibeddlen ifessasen",
+       "tog-enotifrevealaddr": "Ssken e-mail inu asmi yettwazen email n talɣut",
+       "tog-shownumberswatching": "Ssken geddac yellan n yimseqdacen iɛessasen",
+       "tog-oldsig": "Azmul-ik yellan :",
+       "tog-fancysig": "Eǧǧ azmul am yettili (war azday awurman)",
+       "tog-uselivepreview": "Sken tiskanin s war asmiren n usebter",
+       "tog-forceeditsummary": "Ini-iyi-d mi sskecmeɣ agzul amecluc",
+       "tog-watchlisthideown": "Ffer ibeddlen inu seg wumuɣ n uɛessi inu",
+       "tog-watchlisthidebots": "Ffer ibeddlen n iboṭiyen seg wumuɣ n uɛessi inu",
+       "tog-watchlisthideminor": "Ffer ibeddlen ifessasen seg wumuɣ n uɛessi inu",
+       "tog-watchlisthideliu": "Ffer ibeddlen n iseqdacen yelan deg umuɣ n tiḍefri",
+       "tog-watchlistreloadautomatically": "Ales asali s wudem awurman n tebdart n uḍfaṛ ticki iɣewwaṛen n usizdeg ttwabeddlen (Ilaq JavaScript)",
+       "tog-watchlistunwatchlinks": "Rnu iseɣwan srid n uḍfaṛ/aseḥbes ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) n uḍfaṛ i yinekcam n tebdart n uḍfaṛ(Ilaq JavaScript i usefrek n tmahilt-agi)",
+       "tog-watchlisthideanons": "Ffer ibeddlen n iseqdacen udrigen deg umuɣ n tiḍefri",
+       "tog-watchlisthidepatrolled": "Ffer ibeddlen iɛessan deg umuɣ n tiḍefri",
+       "tog-watchlisthidecategorization": "Ffer taggayin n isebtar",
+       "tog-ccmeonemails": "Azen-iyi-d email n wayen uzneɣ i imseqdacen wiyaḍ",
+       "tog-diffonly": "Ur temliḍ-iyi-d ara ayen yellan seddaw imgerraden",
+       "tog-showhiddencats": "Beqqeḍ taggayin yeffren",
+       "tog-norollbackdiff": "Ur skan  ara amgired seld aḥway",
+       "tog-useeditwarning": "Σeggen iyid mi ara fγaγ seg usebter mebla ma skeslaγ ibeddilen.",
+       "tog-prefershttps": "Seqdac yal tikelt tuqqna taɣelsant akken ad teqqneḍ",
+       "underline-always": "Yal tikelt",
+       "underline-never": "Werǧin",
+       "underline-default": "Azal s lexṣas n iminig neɣ n usentel",
+       "editfont-style": "Aɣanib n tasefsit n taɣzut ubeqqeḍ",
+       "editfont-monospace": "Tasefsit s lqedd usbiḍ",
+       "editfont-sansserif": "Tasefsit \"Sans-serif\"",
+       "editfont-serif": "Tasefsit \"Serif\"",
+       "sunday": "Acer",
+       "monday": "Arim",
+       "tuesday": "Aram",
+       "wednesday": "Ahad",
+       "thursday": "Amhad",
+       "friday": "Sem",
+       "saturday": "Sed",
+       "sun": "Ace.",
+       "mon": "Ari.",
+       "tue": "Ara.",
+       "wed": "Aha.",
+       "thu": "Amh.",
+       "fri": "Sem",
+       "sat": "Sed",
+       "january": "Yannayer",
+       "february": "Furar",
+       "march": "Meɣres",
+       "april": "Brir",
+       "may_long": "Mayu",
+       "june": "Yunyu",
+       "july": "Yulyez",
+       "august": "Ɣuct",
+       "september": "Ctember",
+       "october": "Kuber",
+       "november": "Wember",
+       "december": "Jember",
+       "january-gen": "Yannayer",
+       "february-gen": "Furar",
+       "march-gen": "Meɣres",
+       "april-gen": "Brir",
+       "may-gen": "Mayu",
+       "june-gen": "Yunyu",
+       "july-gen": "Yulyez",
+       "august-gen": "Ɣuct",
+       "september-gen": "Ctember",
+       "october-gen": "Kuber",
+       "november-gen": "Wember",
+       "december-gen": "Jember",
+       "jan": "Yan",
+       "feb": "Fur",
+       "mar": "Meɣ",
+       "apr": "Bri",
+       "may": "May",
+       "jun": "Yun",
+       "jul": "Yul",
+       "aug": "Ɣuc",
+       "sep": "Cte",
+       "oct": "Kub",
+       "nov": "Wem",
+       "dec": "Jem",
+       "january-date": "Yannayer $1",
+       "february-date": "Furar $1",
+       "march-date": "Meɣres $1",
+       "april-date": "Brir $1",
+       "may-date": "Mayu $1",
+       "june-date": "Yunyu $1",
+       "july-date": "Yulyez $1",
+       "august-date": "Ɣuct $1",
+       "september-date": "Ctember $1",
+       "october-date": "Kuber $1",
+       "november-date": "Wember $1",
+       "december-date": "Jember $1",
+       "period-am": "FT",
+       "period-pm": "MD",
+       "pagecategories": "{{PLURAL:$1|Taggayt|Taggayin}}",
+       "category_header": "Isebtar deg taggayt \"$1\"",
+       "subcategories": "Adutaggayin",
+       "category-media-header": "Media deg taggayt \"$1\"",
+       "category-empty": "<em>Taggayt agi ur tesɛa asebtar, adu-taggayt neɣ afaylu agetmedia.</em>",
+       "hidden-categories": "{{PLURAL:$1|Taggayt yeffren|Taggayin yeffren}}",
+       "hidden-category-category": "Taggayin yeffren",
+       "category-subcat-count": "Taggayt-agi {{PLURAL:$2|0=ur tegbir ula d yiwet n taggayt tasnawt|1=tegber kan taggayt tasnawant ddaw-a|tegber $2 n taggayin tisnawanin, gar-asent {{PLURAL:$1|0=ula d yiwet|1=tin|tigad $1}} ddaw-a}}.",
+       "category-subcat-count-limited": "Taggayt-agi tegber {{PLURAL:$1|n taggayt tasnawant|$1 n taggayin tisnawanin}} ddaw-a.",
+       "category-article-count": "Taggayt-agi{{PLURAL:$2|0=ur tegbur ula d yiwen n usebtert|1=tegber kan yiwen n usebterddaw-a|tegber $2 n isebtar, gar-asen {{PLURAL:$1|0=ula d yiwen|1=tin| $1}} n ddaw-a}}.",
+       "category-article-count-limited": "{{PLURAL:$1|Asebter agi yella|$1 isebtar agi llan}} deg taggayt agi.",
+       "category-file-count": "Taggayt agi tesɛa {{PLURAL:$2|afaylu agi|$2 ifuyla, ɣef ayed {{PLURAL:$1|t-agi|t-igi $1}} ddaw-agi}}.",
+       "category-file-count-limited": "{{PLURAL:$1|Afaylu agi yella|$1 ifuyla agi llan}} deg taggayt agi.",
+       "listingcontinuesabbrev": "asartu",
+       "index-category": "Isebtar s umatar",
+       "noindex-category": "Asebter-agi ur ɣur-s ara amatar",
+       "broken-file-category": "Isebtar s iseɣwan n ifuyla iṛzan",
+       "about": "Awal ɣef...",
+       "article": "Ayen yella deg usebter",
+       "newwindow": "(ad d-yeldi deg usfaylu amaynut)",
+       "cancel": "Eǧǧ-it am yella",
+       "moredotdotdot": "Ugar...",
+       "morenotlisted": "Tabdart-agi ur temmid ara",
+       "mypage": "Asebter",
+       "mytalk": "Asqerdec",
+       "anontalk": "Asqerdec",
+       "navigation": "Assilel",
+       "and": "&#32;akked",
+       "faq": "Isteqsiyen FAQ",
+       "actions": "Tigawtin",
+       "namespaces": "Talluntin n isemawen",
+       "variants": "Tineḍwa",
+       "navigation-heading": "Umuɣ n tunigin",
+       "errorpagetitle": "Agul",
+       "returnto": "Uɣal ar $1.",
+       "tagline": "Seg {{SITENAME}}",
+       "help": "Tallalt",
+       "search": "Iruzzi",
+       "search-ignored-headings": "#<!-- eǧǧ izirigen-agi akken llan --><pre>\n# Izwal n tgezmiyin ad ttwazeglen deg unadi\n# Ibeddilen yettwagen dagi ad ddun ticki asebter s uzwel yettwarna ar umatar.\n# Tzemreḍ ad ḥettmeḍ tulsa n tmerna ar umatar n usebter s usnifel ilem\n# Taseddast d tagi :\n#   * Yal iziirig ibeddun s \"#\" d awennit\n#   * Yal izirig yeččuren d azwel ara tzegleḍ, ula d taṛuzi n usekkil\nTimsisɣal\nIseɣwan izɣarayen\nWali daɣen\n #</pre><!-- eǧǧ izirig-agi akken yella -->",
+       "searchbutton": "Iruzzi",
+       "go": "Ẓer",
+       "searcharticle": "Ẓer",
+       "history": "Amezruy n usebter",
+       "history_short": "Amazray",
+       "history_small": "amazray",
+       "updatedmarker": "yettubeddel segmi tarzeft taneggarut inu",
+       "printableversion": "Lqem n usiggez",
+       "permalink": "Azday ur yettbeddil ara",
+       "print": "Siggez",
+       "view": "Ɣeṛ",
+       "view-foreign": "Sken di $1",
+       "edit": "Glef",
+       "edit-local": "Rnu aglam adigan",
+       "create": "Snulfu",
+       "create-local": "Rnu aglam n adigan",
+       "delete": "Mḥu",
+       "undelete_short": "Fakk amḥay n {{PLURAL:$1|yiwen ubeddel|$1 yibeddlen}}",
+       "viewdeleted_short": "Ẓeṛ {{PLURAL:$1|yiwen abeddel yettumḥan|$1 Ibeddlen yettumḥan}}",
+       "protect": "Ḥrez",
+       "protect_change": "beddel tiḥḥerzi",
+       "unprotect": "Beddel amesten",
+       "newpage": "Asebter amaynut",
+       "talkpagelinktext": "Mmeslay",
+       "specialpage": "Asebter uslig",
+       "personaltools": "Dduzan inu",
+       "talk": "Asqerdec",
+       "views": "Tuẓrin",
+       "toolbox": "Ifecka",
+       "tool-link-userrights": "Snifel igrawen n {{GENDER:$1|useqdac}}",
+       "tool-link-userrights-readonly": "Sken igrawen n {{GENDER:$1|useqdac}}",
+       "tool-link-emailuser": "Azen emayl i {{GENDER:$1|useqdac}}",
+       "imagepage": "Ẓer asebter n tugna",
+       "mediawikipage": "Ẓer asebter n izen",
+       "templatepage": "Ẓer asebter n talɣa",
+       "viewhelppage": "Ẓer asebter n tallalt",
+       "categorypage": "Ẓer asebter n taggayin",
+       "viewtalkpage": "Wali asqerdec",
+       "otherlanguages": "S tutlayin tiyaḍ",
+       "redirectedfrom": "(Yettusmimeḍ seg $1)",
+       "redirectpagesub": "Asebter usemmimeḍ",
+       "redirectto": "Welleh ar:",
+       "lastmodifiedat": "Asebter-agi ibeddel i tikelt taneggarut di $2, $1.",
+       "viewcount": "Asebter-agi yettwakcem {{PLURAL:$1|yiwet tikelt|$1 tikwal}}.",
+       "protectedpage": "Asebter yettwaḥerzen",
+       "jumpto": "Neggez ar:",
+       "jumptonavigation": "ẓer isebtar",
+       "jumptosearch": "iruzzi",
+       "view-pool-error": "Suref-aɣ, iqeddacen iwziren tura.\nAṭas iseqdacen tnadin ad ẓṛen asebter agi.\nIlaq ad arǧuḍ imir uqbel ad εreḍeḍ tikkelt nniḍen .\n\n$1",
+       "generic-pool-error": "Suref-aɣ, iqeddacen ur stufan ara akka tura.\nDdeqs n iseqdacen ttnadin ad ẓṛen taɣbalut-agi.\nMa ulac aɣilif, rǧu cwiṭ send ad tεreḍeḍ ad tkecmeḍ tikkelt-nniḍen.",
+       "pool-timeout": "Amenḍar iɛedda deg taganit n uzekṛun",
+       "pool-queuefull": "Adras n umahil yečuṛ",
+       "pool-errorunknown": "Tuccḍa tarussint",
+       "pool-servererror": "Amẓlu n uḥerri ur iheegi ara ($1)",
+       "poolcounter-usage-error": "Tuccḍa  n useqdec: $1",
+       "aboutsite": "Ɣef {{SITENAME}}",
+       "aboutpage": "Project:Ɣef",
+       "copyright": "Agbur yella ddaw $1 ḥaca ma abdar anemgal.",
+       "copyrightpage": "{{ns:project}}:Copyrights",
+       "currentevents": "Isallen",
+       "currentevents-url": "Project:Isallen",
+       "disclaimers": "Ilɣa",
+       "disclaimerpage": "Project:Ilɣa imuta",
+       "edithelp": "Tallelt ɣef teẓrigt",
+       "helppage-top-gethelp": "Tallelt",
+       "mainpage": "Amzawru Tasfhit",
+       "mainpage-description": "Amzawru Tasfhit",
+       "policy-url": "Project:Ilugan",
+       "portal": "Awwur n timetti",
+       "portal-url": "Project:Awwur n timetti",
+       "privacy": "Tasertit n tbaḍnit",
+       "privacypage": "Project:Tasertit n tbaḍnit",
+       "badaccess": "Agul n turagt",
+       "badaccess-group0": "Ur tettalaseḍ ara ad texedmeḍ tigawt i tseqsiḍ.",
+       "badaccess-groups": "Tigawt id steqsiḍ t-uffar kan i iseqdacen n {{PLURAL:$2|ugraw|igrawen}} : $1.",
+       "versionrequired": "Yessefk ad tesɛiḍ tasiwelt $1 n MediaWiki",
+       "versionrequiredtext": "Yessefk ad tesɛiḍ tasiwelt $1 n MediaWiki iwakken ad tesseqdceḍ asebter-agi. Ẓer [[Special:Version|tasiwelt n usebter]].",
+       "ok": "Seɣbel",
+       "retrievedfrom": "Yettwaddem seg \"$1\"",
+       "youhavenewmessages": "{{PLURAL:$3|Ɣur-k}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Tesɛiḍ}}  $1 n {{PLURAL:$3|useqdac nniḍen|$3 iseqdacen nniḍen}} ( $2 ).",
+       "youhavenewmessagesmanyusers": "Tesɛiḍ $1 n aṭas n iseqdacen ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|izen amaynut|999=inzan imaynuten}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|abeddel aneggaru|999=ibeddilen ineggura}}",
+       "youhavenewmessagesmulti": "Tesɛiḍ iznan imaynuten deg $1",
+       "editsection": "glef",
+       "editold": "glef",
+       "viewsourceold": "ẓeṛ aɣbalu",
+       "editlink": "glef",
+       "viewsourcelink": "ẓeṛ aɣbalu",
+       "editsectionhint": "Glef tagzemt: $1",
+       "toc": "Agbur",
+       "showtoc": "Ssken",
+       "hidetoc": "Ffer",
+       "collapsible-collapse": "Seggelmes",
+       "collapsible-expand": "Beqqeḍ",
+       "confirmable-confirm": "D tidett d {{GENDER:$1|kečč|kem}}?",
+       "confirmable-yes": "Ih",
+       "confirmable-no": "Uhu",
+       "thisisdeleted": "Ẓer neɣ err $1 am yella?",
+       "viewdeleted": "Ẓer $1?",
+       "restorelink": "{{PLURAL:$1|Yiwen abeddel yettumḥan|$1 Ibeddlen yettumḥan}}",
+       "feedlinks": "Asuddem:",
+       "feed-invalid": "Anaw n usuddem mačči ṣaḥiḥ.",
+       "feed-unavailable": "Isuddman RSS ur yestufan ara",
+       "site-rss-feed": "Asuddem RSS n $1",
+       "site-atom-feed": "Taneflit Atom n $1",
+       "page-rss-feed": "Asuddem RSS n \"$1\"",
+       "page-atom-feed": "Taneflit Atom n \"$1\"",
+       "red-link-title": "$1 (ulac asebter)",
+       "sort-descending": "Afran akaray",
+       "sort-ascending": "Afran aseffes",
+       "nstab-main": "Amagrad",
+       "nstab-user": "Asebter n wemseqdac",
+       "nstab-media": "Asebter n media",
+       "nstab-special": "Asebter uzzig",
+       "nstab-project": "Awal ɣef...",
+       "nstab-image": "Afaylu",
+       "nstab-mediawiki": "Izen",
+       "nstab-template": "Tamudemt",
+       "nstab-help": "Tallalt",
+       "nstab-category": "Taggayt",
+       "mainpage-nstab": "Asebter agejdan",
+       "nosuchaction": "Tigawt ulac-itt",
+       "nosuchactiontext": "Wiki ur teɛqil ara tigawt-nni n URL",
+       "nosuchspecialpage": "Asebter uslig am wagi ulac-it.",
+       "nospecialpagetext": "<strong>Tseqsiḍ ɣef usebter uslig ulac-it, tzemreḍ ad tafeḍ isebtar</strong>\nusligen n ṣṣeḥ deg [[Special:SpecialPages|wumuɣ n isebtar usligen]].",
+       "error": "Agul",
+       "databaseerror": "Agul n database",
+       "databaseerror-text": "Tuccḍa n tuttra deg taffa n isefka teḍra-d. Ahat yella afuqes deg useɣẓan.",
+       "databaseerror-textcl": "Tuccḍa n tuttra deg taffa n isefka teḍra-d",
+       "databaseerror-query": "Tuttra : $1",
+       "databaseerror-function": "Tuccḍa: $1",
+       "databaseerror-error": "Agul: $1",
+       "laggedslavemode": "<strong>Aɣtal:</strong> Ahat asebter ur yesɛi ara akk ibeddlen imaynuten.",
+       "readonly": "Database d tamsekkert",
+       "enterlockreason": "Ini ayɣer tsekkreḍ database, ini daɣen melmi ara ad ifukk asekker",
+       "readonlytext": "Taffa n isefka teskweṛ akka tura ɣef sebba n kra n inekcam d usnifel-nniḍen, ahat ɣef kra n uxeddim n uṣeggem, ticki ifuk ad tuɣal.\n\nAndbal n unagraw iṣekṛen taffa yenna-d acimi: $1",
+       "missing-article": "Taffa n isefka ur t-ufa ara aḍris n yiwen usebter ilaq at af, s-isem \"$1\"$2.\n\nUmata, wagi yeḍra mi neḍfeṛ azday ɣer yiwen diff aqbur naɣ ɣer amazray n usebter yemḥan.\n\nMa mačči d-tajṛut agi, ihi d-taniwit deg uhil.\nIlaq ad εeggenem yiwen [[Special:ListUsers/sysop|anedbal]] war ad ttum asefkem URL n uzday.",
+       "missingarticle-rev": "(uṭṭun n lqem#: $1)",
+       "missingarticle-diff": "(Diff: $1, $2)",
+       "readonly_lag": "Database d tamsekkert (weḥdes) axaṭer kra n serveur ɛeṭṭlen",
+       "internalerror": "Agul zdaxel",
+       "internalerror_info": "Anezri agensan : $1",
+       "filecopyerror": "Ur yezmir ara ad yexdem alsaru n ufaylu \"$1\" ar \"$2\".",
+       "filerenameerror": "Ur yezmir ara ad ibeddel isem ufaylu \"$1\" ar \"$2\".",
+       "filedeleteerror": "Ulamek an mḥu afaylu \"$1\".",
+       "directorycreateerror": "Ulamek an snulfu akaram \"$1\"",
+       "directoryreadonlyerror": "Akaram \"$1\" i tɣuri kan.",
+       "directorynotreadableerror": "Akaram \"$1\" ur yettwaɣray ara.",
+       "filenotfound": "Ur yezmir ara ad yaf afaylu \"$1\".",
+       "unexpected": "Agul: \"$1\"=\"$2\".",
+       "formerror": "Agul: ur yezmir ara ad yazen talɣa",
+       "badarticleerror": "Ur yezmir ara ad yexdem tigawt-agi deg usebter-agi.",
+       "cannotdelete": "Ulamek ad yemḥu asebter naɣ afaylu \"$1\".\nAhat amdan wayeḍ yemḥa-t.",
+       "cannotdelete-title": "Ulamek an kkes  asebter \"$1\"",
+       "delete-hook-aborted": "Tukkesa tesemmet s usiɣzef.\nUlac asefru ɣef wagi.",
+       "no-null-revision": "Ur nezmer ara ad n-snulfu tacaggart tilemnt tamaynut i usebtar \"$1\"",
+       "badtitle": "Azwel ur yelhi",
+       "badtitletext": "Asebter i testeqsiḍ fell-as mačči ṣaḥiḥ, d ilem, neɣ yella ugul deg wezday seg wikipedia s tutlayt tayeḍ neɣ deg wezday n wiki nniḍen. Ahat tesɛa asekkil ur yezmir ara ad yettuseqdac deg wezwel.",
+       "title-invalid-empty": "Azwel n usebter d-tessutreḍ d ilem neɣ yegber kan isem n tallunt n yismawen.",
+       "title-invalid-utf8": "Azwel n usebter d-tessutreḍ yegber tagzemt UTF-8 taruɣbilt",
+       "title-invalid-talk-namespace": "Azwel n usebter d-tessutreḍ yettwellih ar usebter n usqerdec ay izemren ulac-it",
+       "title-invalid-characters": "Azwel n usebter d-tessutreḍ yegber isekkilen iruɣbilen: \"$1\".",
+       "perfcached": "Talɣut deg ukessar seg lkac u waqila mačči d tasiwelt taneggarut. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
+       "perfcachedts": "Talɣut deg ukessar seg lkac, tasiwelt taneggarut n wass $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+       "querypage-no-updates": "Ibeddlen n usebter-agi ur ttbanen ara tura. Tilɣa ines qrib a d-banen.",
+       "viewsource": "Ẓer aɣbalu",
+       "viewsource-title": "Ẓeṛ aɣbalu n $1",
+       "actionthrottled": "Tigawt tesɛa talast",
+       "actionthrottledtext": "Akken ad nsiḥbiber mgal tuzna n ispamen, aseqdec n tigawt-agi tesɛa talast n umḍan n tikalt n wakud wezzilen kan ihi tɛeddaḍ talast.\nƐred tikelt-nniḍen di kra n tisdatin.",
+       "protectedpagetext": "Asebter-agi yetwaḥrez i uqareɛ n ubeddel neɣ tigawin nniḍen.",
+       "viewsourcetext": "Tzemreḍ ad twaliḍ u txedmeḍ alsaru n uɣbalu n usebter-agi:",
+       "viewyourtext": "Tzemṛeḍ ad ẓṛeḍ dɣa ad nɣeleḍ agbur n \"ibeddlen inek/inem\" deg usebter agi :",
+       "protectedinterface": "Asebter-agi d amsekker axaṭer yettuseqdac i weḍris n software.",
+       "editinginterface": "<strong>Ɣuṛ-k:</strong> Aqla-k tettbeddileḍ asebter yettuseqdacen i tmerna n uḍris n ugrudem n useɣẓan. \nIbeddilen ɣef usebter-agi ad ḥazen udem n ugrudem n useqdac i yiseqdacen-nniḍen n uwiki.",
+       "translateinterface": "Akken ad ternuḍ neɣ ad tbeddleḍ tisuqilin i yiwikiyen meṛṛa, seqdec [https://translatewiki.net/ translatewiki.net], asenfaṛ n usideg utlayan n MediaWiki.",
+       "cascadeprotected": "Asebter-agi yettwammesten mgal abeddel acku yedda deh {{PLURAL:$1|usebter d-iteddun yettwammestnen|isebtar-agi d-itedduun yettwammestnen}} s usefran \"ammesten s udabdar\" urmid:\n$2",
+       "namespaceprotected": "Ur tesɛiḍ ara turagt iwakken ad beddeleḍ isebtar n tallunt n isemawen <strong>$1</strong>.",
+       "customcssprotected": "Ur tesɛiḍ ara turagt iwakken ad beddeleḍ asebter agi n CSS, acku tesɛa iɣewwaren n yiwen useqdac nniḍen.",
+       "customjsprotected": "Ur tesɛiḍ ara turagt iwakken ad beddeleḍ asebter agi n Javascript, acku tesɛa iɣewwaren n yiwen useqdac nniḍen.",
+       "mycustomcssprotected": "Ur tesɛiḍ ara turagt i ubeddel n usebtar agi CSS.",
+       "mycustomjsonprotected": "Ur tesɛiḍ ara turagt i ubeddel n usebtar agi JSON.",
+       "mycustomjsprotected": "Ur tesɛiḍ ara turagt i ubeddel n usebtar agi JavaScript.",
+       "myprivateinfoprotected": "Ur tesɛiḍ ara turagt ad beddeleḍ tilɣa inek(em) tusligtin.",
+       "mypreferencesprotected": "Ur tesɛiḍ ara turagt ad beddeleḍ iɣewwaren inek(em).",
+       "ns-specialprotected": "Ur t-zemred ara ad beddeleḍ isebtar usligen",
+       "titleprotected": "Azwel agi yegdel deg usnulfu ɣef [[User:$1|$1]].\nTaɣẓint id yenna : <em>$2</em>",
+       "filereadonlyerror": "Ulamek ad nbeddel afaylu \"$1\" acku akaram n ifuyla \"$2\" yella deg uskar n tɣuri kan.\n\nAnedbal n unagraw i t-isekkweṛen, yefka-d asegzi-agi : \"$3\".",
+       "invalidtitle-knownnamespace": "Azwel ur i ɣbel ara s tallunt n isemawen « $2 » dɣa d-uglam « $3 »",
+       "invalidtitle-unknownnamespace": "Azwel ur i ɣbel ara s uṭṭun n tallunt n isemawen $1 dɣa d-uglam « $2 » warisem",
+       "exception-nologin": "Ur tekcimeḍ ara",
+       "exception-nologin-text": "Qqen akken ad tizmireḍ ad tkecmeḍ ar usebter-agineɣ tigawt-agi.",
+       "exception-nologin-text-manual": "$1 iwakken ad kecmeḍ ar asebtar neɣ tigawt agi.",
+       "virus-badscanner": "Yir tawila : anafraḍ n infafaden warisem : <em>$1</em>",
+       "virus-scanfailed": "Abrir n unadi (tangalt $1)",
+       "virus-unknownscanner": "amgelanfafad warisem :",
+       "logouttext": "<strong>Tura tesensereḍ.</strong>\n\nKra n isebtar zemren ad sskanen belli mazal-ik s yisem n wemseqdac inek armi temḥuḍ tazarkatut.",
+       "cannotlogoutnow-title": "Ur tezmireḍ ara ad teffɣeḍ tura",
+       "cannotlogoutnow-text": "Tuffɣa d tawezɣit ticki tseqdaceḍ $1.",
+       "welcomeuser": "Anṣuf, $1 !",
+       "welcomecreation-msg": "Amian inek(em) yesnulfad.\nTzemreḍ ad beddeleḍ {{SITENAME}} [[Special:Preferences|ismenyifen]] inek(em) ma tebɣiḍ",
+       "yourname": "Isem n useqdac:",
+       "userlogin-yourname": "Isem n useqdac",
+       "userlogin-yourname-ph": "Sekcem isem-ik(im) n useqdac",
+       "createacct-another-username-ph": "Sekcem isem n useqdac",
+       "yourpassword": "Awal n uɛeddi:",
+       "userlogin-yourpassword": "Awal n uɛeddi",
+       "userlogin-yourpassword-ph": "Sekcem awal-ik(im) n uɛeddi",
+       "createacct-yourpassword-ph": "Sekcem awal n uɛeddi",
+       "yourpasswordagain": "Ɛiwed ssekcem awal n uɛeddi",
+       "createacct-yourpasswordagain": "Sentem awal n uɛeddi",
+       "createacct-yourpasswordagain-ph": "Sekcem awal n uɛeddi tikelt nniḍen",
+       "userlogin-remembermypassword": "Eǧǧ taɣimit inu turmidt",
+       "userlogin-signwithsecure": "Seqdec tuqqna yettwaḥerzen",
+       "cannotlogin-title": "Ur izmir ara ad yeqqen",
+       "cannotlogin-text": "Tuqqna d tawezɣit.",
+       "cannotloginnow-title": "Ur izmir ara ad yeqqen tura",
+       "cannotloginnow-text": "Tuqqna d tawezɣit ticki tseqdaceḍ $1.",
+       "cannotcreateaccount-title": "Ur izmir ara ad yernu imiḍanen",
+       "cannotcreateaccount-text": "Timerna srid n imiḍanen n iseqdacen ur termid ara ɣef uwiki-agi.",
+       "yourdomainname": "Taɣult inek",
+       "password-change-forbidden": "Ur zemreḍ ara ad beddeleḍ awalen n uɛaddi ɣef uwiki agi.",
+       "externaldberror": "Yella ugul aberrani n database neɣ ur tettalaseḍ ara ad tbeddleḍ isem an wemseqdac aberrani inek.",
+       "login": "Kcem",
+       "login-security": "Senqed timagit-ik",
+       "nav-login-createaccount": "Kcem / Xleq isem n wemseqdac",
+       "logout": "Ffeɣ",
+       "userlogout": "Ffeɣ",
+       "notloggedin": "Ur tekcimeḍ ara",
+       "userlogin-noaccount": "Ur tesɛiḍ ara amiḍan ?",
+       "userlogin-joinproject": "Ddukkel ar {{SITENAME}}",
+       "createaccount": "Xleq amivan",
+       "userlogin-resetpassword-link": "Ettuḍ awal n uɛaddi ?",
+       "userlogin-helplink2": "Tallelt i tuqqna",
+       "userlogin-loggedin": "Teqqneḍ yakan am {{GENDER:$1|$1}}. Seqdec tiferkit ddaw-agi iwakken ad teqqneḍ s umiḍan nniḍen.",
+       "userlogin-reauth": "Snulfud amiḍan nniḍen",
+       "userlogin-createanother": "Snulfud amiḍan nniḍen",
+       "createacct-emailrequired": "Tansa email",
+       "createacct-emailoptional": "Tansa email (axetṛan)",
+       "createacct-email-ph": "Sekcem tansa email inek(m)",
+       "createacct-another-email-ph": "Sekcem tansa email",
+       "createaccountmail": "Seqdec awal n uɛaddi agacuran akudan dɣa ceggeε-it ar tansa email yemlen",
+       "createacct-realname": "Isem n tidets (axetṛan)",
+       "createacct-reason": "Taɣẓint",
+       "createacct-reason-ph": "Ayɣer ad snulfuḍ amiḍan nniḍen",
+       "createacct-reason-help": "Izen yettwaseknen deg uɣmis n tmerna n umiḍan",
+       "createacct-submit": "Rnu amiḍan-ik(m)",
+       "createacct-another-submit": "Rnu amiḍan",
+       "createacct-continue-submit": "Kemmel timerna n umiḍan",
+       "createacct-another-continue-submit": "Kemmel timerna n umiḍan",
+       "createacct-benefit-heading": "{{SITENAME}} yetwexdem sɣur medden am kečč/kem.",
+       "createacct-benefit-body1": "{{PLURAL:$1|abeddel|ibeddilen}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|asebter|isebtar}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|atekki amaynut|ittekkiyen imaynuten}}",
+       "badretype": "Awal n tbaḍnit amezwaru d wis sin mačči d kif-kif.",
+       "userexists": "Isem n wemseqdac yeddem-as amdan wayeḍ. Fren yiwen nniḍen.",
+       "loginerror": "Agul n ukcam",
+       "createacct-error": "Tuccda deg usnulfu n umiḍan",
+       "createaccounterror": "Ulamek ad nesnulfu amiḍan: $1",
+       "nocookiesnew": "Isem n wemseqdac-agi yettwaxleq, meɛna ur tekcimeḍ ara. {{SITENAME}} yesseqdac ikukiyen (cookies) iwakken ad tkecmeḍ. Tekseḍ ikukiyen-nni. Eǧǧ-aten, umbeɛd kecm s yisem n wemseqdac akk d wawal n tbaḍnit inek.",
+       "nocookieslogin": "{{SITENAME}} yesseqdac ikukiyen (cookies) iwakken ad tkecmeḍ. Tekseḍ ikukiyen-nni. Eǧǧ-aten iwakken ad tkecmeḍ.",
+       "nocookiesfornew": "Amiḍan n useqdac ur d-isnulfu ara, acku ur nezmer ara an sulu azar-is.\nSelken ma sermedeḍ \"cookies\", sismeḍ asebter dɣa εreḍ tikkelt nniḍen.",
+       "noname": "Ur tefkiḍ ara isem n wemseqdac ṣaḥiḥ.",
+       "loginsuccesstitle": "Taqqneḍ",
+       "loginsuccess": "<strong>Tkecmeḍ ar {{SITENAME}} s yisem n wemseqdac \"$1\".</strong>",
+       "nosuchuser": "Aseqdac $1 ulac-it d-agi.\nIsmawen n iseqdacen ṭṭafaṛen taruẓi n usekkil.\nSenqed tira, neɣ [[Special:CreateAccount|rnu amiḍan amaynut]].",
+       "nosuchusershort": "Ulac isem n wemseqdac s yisem \"$1\". Ssenqed tira n yisem-nni.",
+       "nouserspecified": "Yessefk ad tefkeḍ isem n wemseqdac.",
+       "login-userblocked": "Aseqdac agi i sewḥel. Tuqqna t-ugwi.",
+       "wrongpassword": "Awal n tbaḍnit ɣaleṭ. Ɛreḍ daɣen",
+       "wrongpasswordempty": "Awal n tbaḍnit ɣaleṭ. Ɛreḍ daɣen",
+       "passwordtooshort": "Awal-ik (im) n uɛaddi ilaq ad i sɛu adday {{PLURAL:$1|1 asekkil|$1 isekkilen}}.",
+       "password-name-match": "Ilaq awal n uɛaddi ad yili imeẓli s-isem n useqdac.",
+       "password-login-forbidden": "aseqdac agi d awal n uɛaddi agi d-izenbigen.",
+       "mailmypassword": "Awennez tikkelt nniḍen n awal uɛaddi",
+       "passwordremindertitle": "Asmekti n wawal n tbaḍnit seg {{SITENAME}}",
+       "passwordremindertext": "Amdan (waqila d kečč/kem, seg tansa IP $1) yesteqsa iwakken a nazen\nAwal n uɛaddi amaynut i {{SITENAME}} ($4). Awal n uɛaddi i wemseqdac \"$2\" yuɣal-d tura \"$3\".\nMliḥ lukan tkecmeḍ u tbeddleḍ Awal n uɛaddi tura.\nTasewti n awal agi n uɛaddi amaynut ad yaweḍ deg {{PLURAL:$5|yiwen ass|$5 ussan}}\n\nLukan mačči d kečč i yesteqsan naɣ tecfiḍ ɣef awal n uɛaddi, tzemreḍ ad tkemmleḍ mebla ma tbeddleḍ awal n uɛaddi.",
+       "noemail": "\"$1\" ur yesɛi ara email.",
+       "noemailcreate": "Ilaq ad efkeḍ tansa e-mail i sɛan aseɣbel.",
+       "passwordsent": "Awal n tbaḍnit amaynut yettwazen i emal inek, aylaw n \"$1\".\nG leɛnaya-k, kcem tikelt nniḍen yis-s.",
+       "blocked-mailpassword": "Tansa-ik IP tewḥel i unifel. Akken ad nsewḥel yir aseqdec, ur tezmireḍ ara ad tesqedceḍ tiririt n wawal uffir si tansa-agi IP.",
+       "eauthentsent": "Yiwen email yetweceggeε ar tansa id efkeḍ.\nUqbel ad n-ceggeε email nniḍen, ilaq ad ḍfereḍ ayen yellan deg email dɣa ad sergegeḍ amiḍan agi d win inek(m).",
+       "throttled-mailpassword": "Neceggɛed yakan tirawt n uwennez i awal-ik/im n uɛaddi deg {{PLURAL:$1|asrag agi aneggaru|$1 isragen agi ineggura}}. Awennez n uwal n uɛaddi yettwaceggaɛ tikelt kan deg {{PLURAL:$1|asrag|$1 isragen}}.",
+       "mailerror": "Agul asmi yettwazen e-mail: $1",
+       "acct_creation_throttle_hit": "Inebgawen iseqdacen tansa IP-ik rnan {{PLURAL:$1|n umiḍan|$1 n imiḍanen}} deg $2 n yisragen ineggura, d ayen yessawḍen ar talast tafellayt yettwasirgen deg uzilal-agi n wakud.\nIhi, timerna n imiḍanen i yinebgawen iseqdacen tansa-agi IP tewḥel akka tura.",
+       "emailauthenticated": "Tansa-ik(im) imayl tettwasentem di $2 af $3.",
+       "emailnotauthenticated": "Tansa email inek mazal ur tettuɛqel. Ur d netceggaɛ ara email i yal tiseɣnin agi.",
+       "noemailprefs": "Efk tansa e-mail iwakken ad leḥḥun iḍaɣaren-nni.",
+       "emailconfirmlink": "Sentem tansa-ik imayl",
+       "invalidemailaddress": "Tansa e-mail-agi ur telhi, ur tesɛi ara taseddast n lɛali. Ssekcem tansa e-mail s taseddast n lɛali neɣ ur tefkiḍ acemma.",
+       "cannotchangeemail": "Ur t-zemreḍ ara ad beddeleḍ tansa e-mail deg uwiki agi.",
+       "emaildisabled": "Asmel agi ur yezmer ara ad i cegaɛ e-mail.",
+       "accountcreated": "Isem n wemseqdac yettwaxleq",
+       "accountcreatedtext": "Amiḍan n useqdac i [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|asqerdec]]) yettwarna.",
+       "createaccount-title": "Asnulfu n umiḍan i {{SITENAME}}",
+       "createaccount-text": "Albeɛḍ yesnulfu-d amiḍan i tansa e-amil inek/inem ɣef {{SITENAME}} ($4) s-isem n-useqdac « $2 », s awal n uɛaddi « $3 ».\nIlaq tura ad lldiḍ taɣimit dɣa ad beddeleḍ awal ik/im n uɛaddi.",
+       "login-throttled": "Tɛerdeḍ ad qqeneḍ aṭas tiqwal deg dqiqat agi iɛddan.\nIlaq ad rǧuḍ $1 uqbel ad ɛerdeḍ tikkelt nniḍen.",
+       "login-abort-generic": "Awraḍ-ik n tuqqna ur yeddi ara",
+       "login-migrated-generic": "Amiḍan-ik iguǧ, isem-ik n useqdac qerǧin yella deg uwiki-agi.",
+       "loginlanguagelabel": "Tutlayt: $1",
+       "suspicious-userlogout": "Asuter n usenser yugwi acku yella ugur s iminig naɣ s tazarkatut n uqeddac proxy.",
+       "createacct-another-realname-tip": "Isem n ṣṣeḥ d-axeṭran.\nMa teɛzemeḍ a t-tefkeḍ, ad yettuseqdac iwakken ad snen medden anwa yuran tikkin inek.",
+       "pt-login": "Qqen",
+       "pt-login-button": "Qqen",
+       "pt-login-continue-button": "Kemmel tuqqna",
+       "pt-createaccount": "Rnu amiḍan",
+       "pt-userlogout": "Ffeɣ",
+       "php-mail-error-unknown": "anezri warisem deg tawuri mail() n PHP",
+       "user-mail-no-addy": "Ɛred ad icegaɛ e-mail war tansa e-mail",
+       "user-mail-no-body": "Arram n uceggaɛ email s tafekka tilemt neɣ d-awezlan aṭas.",
+       "changepassword": "Beddel awal n tbaḍnit",
+       "resetpass_announce": "Akken ad tfakeḍ ajerred-ik, yessefk ad tmuddeḍ awal uffir amaynut.",
+       "resetpass_header": "Beddel awal n uɛassi n umiḍan",
+       "oldpassword": "Awal n tbaḍnit aqdim:",
+       "newpassword": "Awal n tbaḍnit amaynut:",
+       "retypenew": "Ɛiwed ssekcem n tbaḍnit amaynut:",
+       "resetpass_submit": "Eg awal n tbaḍnit u kcem",
+       "changepassword-success": "Awal-ik uffir ibeddel!",
+       "changepassword-throttled": "Tɛerdeḍ ad qqeneḍ aṭas tiqwal deg dqiqat agi iɛddan.\nIlaq ad rǧuḍ $1 uqbel ad ɛerdeḍ tikkelt nniḍen.",
+       "botpasswords": "Iwalen uffiren n iṛubuten",
+       "botpasswords-disabled": "Awalen uffiren n iṛubuten nsan.",
+       "botpasswords-no-central-id": "Akken ad tesqedceḍ awalen uffiren n  iṛubuten, yessefk ad teqqneḍ amiḍan yettwaslemsen.",
+       "botpasswords-existing": "Awalen uffiren n uṛubuten yellan",
+       "botpasswords-createnew": "Rnu awal uffir n iṛubuten amaynut",
+       "botpasswords-editexisting": "Ẓreg awal uffir n iṛubuten yellan",
+       "botpasswords-label-appid": "Isem n uṛubut:",
+       "botpasswords-label-create": "Rnu",
+       "botpasswords-label-update": "Leqqem",
+       "botpasswords-label-cancel": "Sefsex",
+       "botpasswords-label-delete": "Kkes",
+       "botpasswords-label-resetpassword": "Wennez awal uffir",
+       "botpasswords-label-grants": "Izerfan yettwasnasen:",
+       "botpasswords-label-grants-column": "Ttunefken izerfan",
+       "botpasswords-bad-appid": "Isem n uṛubut \"$1\" mačči d ameɣtu.",
+       "botpasswords-insert-failed": "Ur isaweḍ ara ad yernu isem n uṛubut \"$1\". Yettwarna yakan?",
+       "botpasswords-update-failed": "Maqqdesh leqqem isen n uṛubut ''$1''. Rah Kkes ?",
+       "botpasswords-created-title": "Awal uffir n iṛubuten yettwarna",
+       "botpasswords-created-body": "Awal n uâddi n iṛubuten l isem n uṛubut ''$1'' n {{GENDER:$2|useqdac}} ''$2'' rnu",
+       "botpasswords-updated-title": "Awal n uâddi n iṛbuten ibeddel",
+       "botpasswords-updated-body": "Awal n uâddi n iṛubuten l isem n uṛubut ''$1'' n {{GENDER:$2|useqdac}} ''$2'' ibeddel",
+       "botpasswords-deleted-title": "Awal uffir n iṛubuten yettwakkes",
+       "botpasswords-deleted-body": "Awal n uâddi n uṛubut \"$1\" n {{GENDER:$2|useqdac}} \"$2\" yettwakkes.",
+       "botpasswords-no-provider": "Asaǧǧaw n tɣimit n wawal n uâddi n iṛubuten ulac-it.",
+       "resetpass_forbidden": "Ur zemreḍ ara ad beddeleḍ awalen n uɛaddi",
+       "resetpass_forbidden-reason": "Ur tezmireḍ ara ad tẓergeḍ awal uffir : $1",
+       "resetpass-no-info": "Ilaq ad qqeneḍ iwakken ad ẓṛeḍ asebter agi.",
+       "resetpass-submit-loggedin": "Beddel awal n uɛaddi",
+       "resetpass-submit-cancel": "Semmewet",
+       "resetpass-wrong-oldpass": "Awal n uɛaddi d askudan neɣ amira mačči d ameɣtu.\nAhat tbeddleḍ yakanawal-ik uffir neɣ tsutreḍ-d askudan-nniḍen.",
+       "resetpass-temp-password": "Awal n uɛaddi amakud",
+       "resetpass-abort-generic": "Asiɣzef yesemmewet abeddel n uwal n uɛaddi.",
+       "passwordreset": "Awennez tikkelt nniḍen n awal uɛaddi",
+       "passwordreset-text-one": "Ččur tiferkit agi iwakken ad wennezeḍ awal-ik/im n uɛaddi.",
+       "passwordreset-text-many": "{{PLURAL:$1|Čcur yiwet n tiɣwezza iwakken ad rmeseḍ awal n uɛaddi uɛḍil deg tirawt.}}",
+       "passwordreset-disabled": "Awennez n awal uɛaddi yensa deg uwiki agi.",
+       "passwordreset-emaildisabled": "Tiseɣnin email nsant ɣef wiki agi.",
+       "passwordreset-username": "Isem n useqdac:",
+       "passwordreset-domain": "Talɣut :",
+       "passwordreset-email": "Tansa e-mail:",
+       "passwordreset-emailtitle": "Tilɣa n umiḍan ɣef {{SITENAME}}",
+       "passwordreset-emailtext-ip": "Yiwen (Ahat kečč/kem, seg tansa IP $1) yessutered awennez n awal n uɛaddi i {{SITENAME}} ($4). {{PLURAL:$3|Amiḍan n useqdac agi yeqqen|imiḍanen n iseqdacen agi qqenen}} s tansa e-mail agi :\n\n$2\n\n{{PLURAL:$3|Awal n uɛaddi uɛḍil agi ad i aff tasewti-s|Awalen n uɛaddi uɛḍilen agi ad affen taseweti nsen}} deg {{PLURAL:$5|yiwen ass|$5 ussan}}. Ilaq tura ad qqeneḍ dɣa ad freneḍ awal n uɛaddi amaynut. Lukan mačči d kečč/kem i xedmen asuter agi, naɣ tecfiḍ tura i awal n uɛaddi inek/inem, tzemreḍ ad eǧǧeḍ izen agi.",
+       "passwordreset-emailtext-user": "Aseqdac $1 ɣef {{SITENAME}} yessutered awennez n awal n uɛaddi i {{SITENAME}} ($4). {{PLURAL:$3|Amiḍan n useqdac agi yeqqen|imiḍanen n iseqdacen agi qqenen}} s tansa e-mail agi :\n\n$2\n\n{{PLURAL:$3|Awal n uɛaddi uɛḍil agi ad i aff tasewti-s|Awalen n uɛaddi uɛḍilen agi ad affen taseweti nsen}} deg {{PLURAL:$5|yiwen ass|$5 ussan}}. Ilaq tura ad qqeneḍ dɣa ad freneḍ awal n uɛaddi amaynut. Lukan mačči d kečč/kem i xedmen asuter agi, naɣ tecfiḍ tura i awal n uɛaddi inek/inem, tzemreḍ ad eǧǧeḍ izen agi.",
+       "passwordreset-emailelement": "Isem n useqdac : \n$1\n\nAwal n uɛddi akudan : \n$2",
+       "passwordreset-emailsentemail": "Ma yella imayl-agi icudd ar umiḍan-ik, awennez n wawal uffir ad yettwazen ar yimayl.",
+       "passwordreset-invalidemail": "Tansa imayl d tarameɣtut",
+       "changeemail": "Beddel neɣ kkes tansa n imayl",
+       "changeemail-no-info": "Ilaq ad qqeneḍ iwakken ad ẓṛeḍ asebter agi.",
+       "changeemail-oldemail": "Tansa e-mail n tura:",
+       "changeemail-newemail": "Tansa e-mail tamaynut:",
+       "changeemail-newemail-help": "Laissez ce champ vide si vous voulez supprimer votre adresse de courriel. Sans adresse de courriel renseignée, vous ne pourrez plus réinitialiser votre mot de passe en cas d’oubli ni recevoir de courriels à partir de ce wiki.",
+       "changeemail-none": "(ulac)",
+       "changeemail-password": "Awal-ik/im n uɛaddi ɣef {{SITENAME}}:",
+       "changeemail-submit": "Beddel tansa e-mail",
+       "changeemail-throttled": "Tɛerdeḍ ad qqeneḍ aṭas tiqwal.\nIlaq ad rǧuḍ $1 uqbel ad ɛerdeḍ tikkelt nniḍen.",
+       "changeemail-nochange": "Ttxilek sekcem tansa i imayl nniḍen.",
+       "resettokens": "Wennez tiddas",
+       "resettokens-text": "D-agi tzemreḍ ad twennezeḍ tiddas i ɛemmeden ad kecmeḍ ar isefka usligen i qqenen ar amiḍan inek/inem.\n\nIlaq ad twennezeḍ tiddas ma tferqeḍ-ten s tuccḍa s umseqdac nniḍen neɣ ma amiḍan inek/inem yexṣer.",
+       "resettokens-no-tokens": "Ulac tiddas an wennez.",
+       "resettokens-tokens": "Tiddas:",
+       "resettokens-token-label": "$1 (azal amiran: $2)",
+       "resettokens-watchlist-token": "Tiddest i usuddem (Atom/RSS) web n [[Special:Watchlist|ibeddilen n isebtar n umuɣ inek/inem n uḍfar]]",
+       "resettokens-done": "Tiddas i wennezen.",
+       "resettokens-resetbutton": "Wennez tiddas i fernen",
+       "bold_sample": "Aḍris aberbuz",
+       "bold_tip": "Aḍris aberbuz",
+       "italic_sample": "Aḍris aṭalyani",
+       "italic_tip": "Aḍris aṭalyani",
+       "link_sample": "Azwel n uzday",
+       "link_tip": "Azday zdaxel",
+       "extlink_sample": "http://www.example.com azwel n uzday",
+       "extlink_tip": "Azday aberrani (cfu belli yessefk at tebduḍ s http://)",
+       "headline_sample": "Aḍris n uzwel azellum",
+       "headline_tip": "Aswir 2 n uzwel azellum",
+       "nowiki_sample": "Sideff da tirra bla taseddast(formatting) n wiki",
+       "nowiki_tip": "Ttu taseddast n wiki",
+       "image_tip": "Tugna yettussekcmen",
+       "media_tip": "Azday n ufaylu media",
+       "sig_tip": "Azmul inek s uzemz",
+       "hr_tip": "Ajerriḍ aglawan (ur teččerɛiḍ ara)",
+       "summary": "Agzul:",
+       "subject": "Asentel:",
+       "minoredit": "Wagi d abeddel afessas",
+       "watchthis": "Ɛass asebter-agi",
+       "savearticle": "Beddel asebter",
+       "savechanges": "Sekles asnifel",
+       "publishpage": "Suffeɣ-d asebter",
+       "publishchanges": "Suffeɣ-d asnifel",
+       "preview": "azar-asekdan",
+       "showpreview": "Ssken azar-asekdan",
+       "showdiff": "Ssken ibeddlen",
+       "blankarticle": "<strong>Ɣur-ek:</strong> Asebter d-tesɣenweḍ d ilem.\nMayel tkketaḍ daɣen ɣef \"$1\", ad iɣnew usebter war agbur.",
+       "anoneditwarning": "<strong>Ɣur-k:</strong> ur teqqineḍ ara. Tansa-ik IP ad d-ban i yal yiwen ma yella ur teggiḍ ara abeddel. Ma yella <strong>[$1 teqqneḍ]</strong> neɣ <strong>[$2 rnu amiḍan]</strong>, abeddel-ik ad ittusemmi s yisem-ik, s ufareṣ n tignatin-nniḍen.",
+       "anonpreviewwarning": "<em>Ur tesuluḍ ara. Aḥraz ad yekles tansa IP inek/inem deg umezruy n ibeddilen n usebter.</em>",
+       "missingsummary": "<strong>Ur tettuḍ ara:</strong> Ur tefkiḍ ara azwel i ubeddel inek. Lukan twekkiḍ ''Smekti'' ''$1'' tikelt nniḍen, abeddel inek ad yettusmekti mebla azwel.",
+       "missingcommenttext": "Ssekcem awennit deg ukessar.",
+       "missingcommentheader": "<strong>Asmekti:</strong> ur d-muddeḍ ara asentel n uwennit-agi.\nMa tsenndeḍ tikelt-nniḍen ɣef \"$1\", abeddel-ik ad yettwasekles s war asentel.",
+       "summary-preview": "Taskant n ugzul n ubeddel:",
+       "subject-preview": "Taskant n usentel:",
+       "blockedtitle": "Amseqdac iɛekkel",
+       "blockedtext": "<strong>Amiḍan-ik n useqdac neɣ tansa n IP weḥlen.</strong>\n\nAsewḥel yega-t $1.\nTaɣẓint d tagi : <em>$2</em>.\n\n* Tazwara n usewḥel : $8\n* Tagara n usewḥel : $6\n* Amiḍan iweḥlen : $7.\n\n\nTzemreḍ ad tnermseḍ $1 neɣ [[{{MediaWiki:Grouppage-sysop}}|anedbal]]-nniḍen akken ad tsmelayem.\nUr tezmireḍ ara ad tesqedceḍ tawuri \"nemres aseqdac-agi\" ma yella tella tensa tameɣtut deg[[Special:Preferences|ismenyifen n useqdac]], udiɣ ma yella tawuri-agi ur tewḥil ara. Tansa-ik IP n tura d $3, ID n usewḥeld #$5.\nSuddu-d akk talɣut-agi deg tuttriwin ara d-azdneḍ.",
+       "autoblockedtext": "Tansa-ik IP tewḥel s wudem awurman acku i tt-yesseqdacen  yesweḥli-t $1.\n\n\nTaɣẓint d tagi :\n:<em>$2</em>\n\n* Tazwara n usewḥel : $8\n* Tagara n usewḥel : $6\n* Amiḍan iweḥlen : $7.\n\n\nTzemreḍ ad tnermseḍ $1 neɣ [[{{MediaWiki:Grouppage-sysop}}|anedbal]]-nniḍen akken ad tsmelayem.\nUr tezmireḍ ara ad tesqedceḍ tawuri \"nermres aseqdac-agi\" ma yella tella tensa tameɣtut deg[[Special:Preferences|ismenyifen n useqdac]], udiɣ ma yella tawuri-agi ur tewḥil ara. \n\nTansa-ik IP n tura d $3, ID n usewḥeld #$5.\nSuddu-d akk talɣut-agi deg tuttriwin ara d-azdneḍ.",
+       "blockednoreason": "Ulac taɣẓint",
+       "whitelistedittext": "Yessefk ad $1 iwakken ad tbeddleḍ isebtar.",
+       "confirmedittext": "Yessefk ad tsentmeḍ tansa e-mail inek uqbel abeddel. Xtar tansa e-mail di [[Special:Preferences|isemyifiyen n wemseqdac]].",
+       "nosuchsectiontitle": "Ulamek an af tigezmi",
+       "nosuchsectiontext": "Tɛerḍeḍ ad tbeddleḍ tigezmi ur llan ara.",
+       "loginreqtitle": "Yessefk ad tkecmeḍ",
+       "loginreqlink": "Kcem",
+       "loginreqpagetext": "Yessefk $1 iwakken ad teẓriḍ isebtar wiyaḍ.",
+       "accmailtitle": "Awal n uɛaddi yettwazen.",
+       "accmailtext": "Awal n uɛaddi id yuran s ugacur i [[User talk:$1|$1]] yetweceggaɛ i $2.\nYezmer ad yetbeddel ɣef usebtar [[Special:ChangePassword|Abeddel n awal uɛddi]] sakin tuqqna.",
+       "newarticle": "(Amaynut)",
+       "newarticletext": "Tḍefreḍ azday ɣer usebter mazal ur yettwaxleq ara.\nAkken ad txelqeḍ asebter-nni, aru deg tenkult i tella deg ukessar\n(ẓer [$1 asebter n tallalt] akken ad tessneḍ kter).\nMa tɣelṭeḍ, wekki kan ɣef tqeffalt \"Back/Précédent\" n browser/explorateur inek.",
+       "anontalkpagetext": "----\n<em>Aqla-k deg usebter n usqerdec n useqdac udrig ur yernan ara yakan amiḍan neɣ ur t-yesseqdacen ara </em>.\nƔef aya, yessefk ad nseqdec tansa-is IP akken ad t-nissin.\nTansa IP tezmer ad tettwabḍu sɣuṛ ddeqs n iseqdacen.\nMa telliḍ d {{GENDER:|||}} d {{GENDER:|aseqdac udrig|taseqdact tudrigt}} udiɣ twalaḍ d akken iwenniten ur k-neɛni ara ttwaznen-ak-d, tzemreḍ [[Special:CreateAccount|ad ternuḍ amiḍan]] neɣ [[Special:UserLogin|ad teqqneḍ]] akken ad tzegleḍ akk ar zdat anexluḍ akked imttekkiyen udrigen.",
+       "noarticletext": "Ulac aḍris deg usebter-agi akka tura Tzemreḍ [[Special:Search/{{PAGENAME}}|ad tnadiḍ aswel n usebter-agi]] deg isebtar-nniḍen,<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nadi ti temhalin icudden ɣur-s],\nneɣ [{{fullurl:{{FULLPAGENAME}}|action=edit}} rnu asebter-agi]</span",
+       "noarticletext-nopermission": "Imira ulac aḍris deg usebter agi.\nTzemreḍ [[Special:Search/{{PAGENAME}}|ad nadiḍ ɣef azwel agi]] deg isebtaren nniḍen,\nnaɣ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|asebter={{FULLPAGENAMEE}}}} ad nadiḍ deg iɣmisen iqqenen]</span>.",
+       "missing-revision": "Tacaggart #$1 n usebter s isem « {{FULLPAGENAME}} » ulac-itt.\n\nAcku azday n umezruy, ɣef wayen tsennedeḍ, d-aqbur. Asebter yemḥa.\nTzemreḍ ad affeḍ tilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} uɣmis n isebtar yemḥan].",
+       "userpage-userdoesnotexist": "Amiḍan n useqdac « <nowiki>$1</nowiki> » ur yekles ara. Ilaq ad selkeneḍ ma tebɣiḍ ad snulfuḍ asebter agi.",
+       "userpage-userdoesnotexist-view": "Amiḍan n useqdac ''$1'' ur yekles ara.",
+       "blocked-notice-logextract": "Aseqdac agi yekyef.\nAsekcem aneggaru n useklas n ikyafen yella ddaw agi:",
+       "clearyourcache": "<strong>Tamawt :</strong> deffir mi nsekles ibeddilen-ik, yessefk ad tḥettmeḍ asmiren ummid n tuffirt n yiminig-ikakken ad twaliḍ ibeddilen.\n* <strong>Firefox / Safari :</strong> eǧǧ afus-ik ɣef taqeffalt <em>Maj</em> (<em>Shift</em>) sakin senned ɣef tqeffalt <em>Smiren</em> neɣ senned <em>Ctrl-F5</em> neɣ <em>Ctrl-R</em> (<em>⌘-R</em> di Mac) \n* <strong>Google Chrome :</strong> senned ɣef  <em>Ctrl-Maj-R</em> (<em>⌘-Shift-R</em> di Mac) \n* <strong>Internet Explorer :</strong> senned ɣef tqeffalt  <em>Ctrl</em> udiɣ ɣef tqeffalt <em>Smiren</em> neɣ senned ɣef <em>Ctrl-F5</em> \n* <strong>Opera :</strong> ddu ar wumuɣ <em>Umuɣ → Iɣewwaṛen</em> (<em>Opera → Ismenyifen</em> ɣef Mac) sakin ɣef <em>Tabaḍnit & taɣellit → Sfeḍ isefka n usnirem → Tugniwin akked d iful=yla n tuffirt</em>.",
+       "usercssyoucanpreview": "<strong>taxbalut:</strong> Sseqdec taqeffalt « {{int:showpreview}} » iwakken ad tɛerḍeḍ asebter CSS inek/inem amaynut  uqbel ad aklasteḍ.",
+       "userjsonyoucanpreview": "<strong>taxbalut:</strong> Sseqdec taqeffalt « {{int:showpreview}} » iwakken ad tɛerḍeḍ asebter JSON inek/inem amaynut  uqbel ad aklasteḍ.",
+       "userjsyoucanpreview": "<strong>taxbalut:</strong> Sseqdec taqeffalt « {{int:showpreview}} » iwakken ad tɛerḍeḍ asebter JavaScript inek/inem amaynut  uqbel ad aklasteḍ.",
+       "usercsspreview": "<strong>Cfu-d, wagi d-azaraskan n usebter ik/im n CSS.\nMmazal ur yettusmekti ara!</strong>",
+       "userjsonpreview": "<strong>Cfu-d, wagi d-azaraskan n usebter ik/im n JSON.\nMmazal ur yettusmekti ara!</strong>",
+       "userjspreview": "<strong>Cfu-d, wagi d-azaraskan n usebter ik/im n JavaScript.\nMmazal ur yettusmekti ara!</strong>",
+       "sitecsspreview": "<strong>Smekti belli aql-ak tɛerḍeḍ asebter CSS agi inek kan.\nMazal ur yettusmekti ara!</strong>",
+       "sitejsonpreview": "<strong>Smekti belli aql-ak tɛerḍeḍ asebter JSON config agi inek kan.\nMazal ur yettusmekti ara!</strong>",
+       "sitejspreview": "<strong>Smekti belli aql-ak tɛerḍeḍ asebter JavaScript inek kan.\nMazal ur yettusmekti ara!</strong>",
+       "editing": "Aglaf n $1",
+       "editingsection": "Aglaf n $1 (tagzemt)",
+       "search-result-size": "$1 ({{PLURAL:$2|1 awal|$2 awalen}})",
+       "search-section": "(tagzemt $1)",
+       "searchresultshead": "Iruzzi",
+       "prefs-searchoptions": "Iruzzi",
+       "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
+       "linksearch-ok": "Iruzzi",
+       "undelete-search-submit": "Iruzzi",
+       "sp-contributions-submit": "Iruzzi",
+       "ipblocklist-submit": "Iruzzi",
+       "tooltip-search": "Iruzzi {{SITENAME}}",
+       "show-big-image-size": "$1 × $2 pixels",
+       "ilsubmit": "Iruzzi",
+       "days": "{{PLURAL:$1|$1 ass|$1 ussan}}",
+       "fileduplicatesearch-submit": "Iruzzi",
+       "searchsuggest-search": "Iruzzi",
+       "duration-days": "$1 {{PLURAL:$1|ass|ussan}}"
+}
index 8e3c459..2d87bfb 100644 (file)
        "recentchangeslinked-feed": "Sorodne spremembe",
        "recentchangeslinked-toolbox": "Sorodne spremembe",
        "recentchangeslinked-title": "Spremembe, povezane z \"$1\"",
-       "recentchangeslinked-summary": "Vnesite ime strani, da vidite spremembe strani, povezanih na ali s te strani. (Da vidite člane kategorije, vnesite Kategorija:Ime kategorije.)\nStrani z [[Special:Watchlist|vašega spiska nadzorov]] so <strong>odebeljene</strong>.",
+       "recentchangeslinked-summary": "Vnesite ime strani, da vidite spremembe strani, povezanih na ali s te strani. (Da vidite člane kategorije, vnesite {{ns:category}}:Ime kategorije.)\nStrani z [[Special:Watchlist|vašega spiska nadzorov]] so <strong>odebeljene</strong>.",
        "recentchangeslinked-page": "Naslov strani:",
        "recentchangeslinked-to": "Prikaži spremembe na določeno stran povezanih strani",
        "recentchanges-page-added-to-category": "[[:$1]] dodano v kategorijo",
index f7a70a0..c0e0968 100644 (file)
        "rcfilters-filter-watchlistactivity-unseen-description": "Измене страница које нисте посетили од када су направљене измене.",
        "rcfilters-filter-watchlistactivity-seen-label": "Погледане измене",
        "rcfilters-filter-watchlistactivity-seen-description": "Измене страница које сте посетили од када су направљене измене.",
-       "rcfilters-filtergroup-changetype": "Ð\92Ñ\80Ñ\81Ñ\82а измене",
+       "rcfilters-filtergroup-changetype": "Тип измене",
        "rcfilters-filter-pageedits-label": "Измене страница",
        "rcfilters-filter-pageedits-description": "Измене вики садржаја, расправа, описа категорија…",
        "rcfilters-filter-newpages-label": "Прављење страница",
index 575466f..d78fcd1 100644 (file)
        "laggedslavemode": "Dej pozůr: Ta zajta może ńy mjeć nojnowszych aktualizacyjůw.",
        "readonly": "Baza danych je zawarto",
        "enterlockreason": "Naszkryflej sam powůd zawarćo bazy danych a za wjela (myńi-wjyncyj) ja uodymkńesz",
-       "readonlytext": "Baza danych jest terozki zawarto\n- ńy do śe wćepywać nowych artikli ńi sprowjać już wćepanych. Powodym\nsům prawdopodańy czynnośći admińistracyjne. Po jejich zakůńczyńu cołko funkcjonalność bazy bydźe prziwrůcono.\nAdministrator, kery zablokowoł baza, podoł takie wyjaśńyńy:<br /> $1",
+       "readonlytext": "Baza danych je terŏzki zawartŏ na nowe informacyje i pōmiynianie przōdzij wkludzōnych. Je to nojpewnij skuli czynności administracyjnych. Po jejich skōńczyniu baza bydzie nazŏd fungować.\nAdministratōr, kery zablokowoł bazã, doł takie tuplikowaniy:<br /> $1",
        "missing-article": "W databaźe ńy idzie nolyźć treść zajty „$1” $2.\n\nUobwykle je to spůsobiůne tym, że sznupoł żeś po ńyaktualnym linku na zmjyny mjyndzy půmjyńańami, abo do wyćepanyj wersyje z gyszichty sprowjyń zajty.\n\nEli tak ńy je, możno śe trefił feler we softwaru MediaWiki. Kej ja, pedz uo tym [[Special:ListUsers/sysop|admińistratorowi]] a podej mu adres URL.",
        "missingarticle-rev": "(wersyjo#: $1)",
        "missingarticle-diff": "(dyferencyjo: $1, $2)",
        "viewyourtext": "We tekst zdrzůduowy tyj zajty możno dali filować, idźe go tyż kopjować.",
        "protectedinterface": "Na tyj zajće znojduje śe tekst interfejsu uoprogramowańo, bestůż uůna je zawarto uod sprowjańo. Coby doćepnůńć abo sprowjić tůmaczyńa wszyskich serwerůw, użyj [https://translatewiki.net/ translatewiki.net], průjyktu lokalizacyji MediaWiki.",
        "editinginterface": "''''Dej pozůr:''' Sprowjosz zajta, na keryj je tekst interfejsu uoprogramowańo. Pomjyńyńa na tyj zajće zmjyńům wyglůnd interfejsu lo inkszych użytkowńikůw. Coby doćepnůńć abo sprowjić tůmaczyńa, użyj [https://translatewiki.net/wiki/Main_Page?setlang=szl translatewiki.net].",
-       "cascadeprotected": "Ta zajta je zawarto uod sprowjańo, po takymu, co uůna je załůnczůno na {{PLURAL:$1|nastympujůncyj zajće, kero zostoła zawarto|nastympujůncych zajtach, kere zostoły zawarte}} ze załůnczůnům uopcyjům dźedźiczyńo:\n$2",
+       "cascadeprotected": "Ta zajta je chrōniōnŏ ôd edycyje, skuli tego co je ôna wkludzōnŏ do {{PLURAL:$1|nastympujōncyj zajty, kerŏ ôstała ôchrōniōnŏ|nastympujōncych zajtach, kere ôstały ôchrōniōne}} ze załōnczōnōm ôpcyjōm erbowaniŏ:\n$2",
        "namespaceprotected": "Ńy mosz uprowńyń, coby sprowjać zajty we raumje mjan '''$1'''.",
        "customcssprotected": "Ńy mosz uprawńyń do sprowjańo tyj zajty, bo na ńij sům uosobiste sztalowańo inkszego użytkowńika.",
        "customjsprotected": "Ńy mosz uprawńyń do sprowjańo tyj zajty, bo na ńij sům uosobiste sztalowańo inkszego użytkowńika.",
        "noname": "To ńy je poprowne mjano użytkowńika.",
        "loginsuccesstitle": "Logowańy udane",
        "loginsuccess": "'''Terozki jeżeś zalogowany do {{SITENAME}} kej \"$1\".'''",
-       "nosuchuser": "Ńy ma sam użytkowńika uo mjańe \"$1\".\nSprowdź szrajbůng, abo [[Special:CreateAccount|utwůrz nowe kůnto]].",
+       "nosuchuser": "Niy ma używŏcza ô mianie \"$1\".\nBadnij szrajbōng, abo [[Special:CreateAccount|sprŏw nowe kōnto]].",
        "nosuchusershort": "Ńy mo sam użytkowńika uo mjańe \"$1\".",
        "nouserspecified": "Podej mjano użytkowńika.",
        "login-userblocked": "Tyn sprowjorz mo zawarte sprowjyńa. Ńy idźe śe zalogować.",
index a5c8ec0..c15d558 100644 (file)
        "action-edit": "бу битне үзгәртү",
        "action-createpage": "бу битне төзү",
        "action-createtalk": "бу бәхәс битен төзү",
+       "action-createaccount": "бу кулланучы язмасын ясау",
        "action-move": "бу битне күчерергә",
        "action-sendemail": "электрон хат җибәрү",
        "nchanges": "$1 {{PLURAL:$1|үзгәртү}}",
        "newsectionsummary": "/* $1 */ яңа бүлек",
        "rc-enhanced-expand": "Ваклыкларны күрсәтү",
        "rc-enhanced-hide": "Ваклыкларны яшерү",
+       "rc-old-title": "башта «$1» буларак ясала",
        "recentchangeslinked": "Бәйләнешле үзгәртүләр",
        "recentchangeslinked-feed": "Бәйләнешле үзгәртүләр",
        "recentchangeslinked-toolbox": "Бәйләнешле үзгәртүләр",
        "unwatch": "Күзәтмәү",
        "unwatchthispage": "Күзәтүне туктат",
        "notanarticle": "Мәкалә түгел",
-       "watchlist-details": "Күзәтү исемлегегездә, бәхәс битләрен санамыйча, {{PLURAL:$1|$1 бит}} бар.",
+       "watchlist-details": "Күзәтү исемлегегездә (бәхәс битләре белән бергә) {{PLURAL:$1|$1 бит}}.",
        "wlheader-enotif": "Электрон почта аша белдерүләр ачык.",
        "wlheader-showupdated": "Сезнең соңгы төзәтмәләрдән соң үзгәргән битләр <strong>калын</strong> шрифт белән күрсәтелгән.",
        "wlnote": "Түбәндә $3 $4 вакыт аралыгының {{PLURAL:$2|соңгы сәгатендә|соңгы <strong>$2</strong> сәгатендә}} ясалган {{PLURAL:$1|ахыргы төзәтмә|ахыргы <strong>$1</strong> төзәтмә}} күрсәтелгән.",
        "mycontris": "Кертем",
        "anoncontribs": "Кертем",
        "contribsub2": "Кертем {{GENDER:$3|$1}} ($2)",
+       "nocontribs": "Күрсштелгән шартларга җавап биргән үзгәрешләр таҗылмады.",
        "uctop": "(хәзерге)",
        "month": "Айдан башлап (һәм элегрәк):",
        "year": "Елдан башлап (һәм элегрәк):",
        "emaillink": "хат язу",
        "blocklogpage": "Тыю көндәлеге",
        "blocklogentry": "[[$1]] $2 вакытка тыелды $3",
+       "reblock-logentry": "[[$1]] тыю көләүләрен $2 $3 вакыт арасына үзгәртте",
        "unblocklogentry": "$1 кулланучысының тыелу вакыты бетте",
        "block-log-flags-anononly": "аноним кулланучылар гына",
        "block-log-flags-nocreate": "яңа хисап язмасы теркәү тыелган",
index e9fb2bb..7f10673 100644 (file)
        "rcfilters-target-page-placeholder": "ایک صفحہ کا نام (یا زمرہ) درج کریں",
        "rcnotefrom": "ذیل میں <strong>$2</strong> سے کی گئی {{PLURAL:$5|تبدیلی|تبدیلیاں}} <strong>$1</strong> تک دکھائی جا رہی ہیں۔",
        "rclistfromreset": "انتخاب تاریخ کی ترتیب نو",
-       "rclistfrom": "$2، $3ء سے ہونے والی نئی تبدیلیاں دکھائیں",
+       "rclistfrom": "$2، $3 سے ہونے والی نئی تبدیلیاں دکھائیں",
        "rcshowhideminor": "معمولی ترامیم $1",
        "rcshowhideminor-show": "دکھائیں",
        "rcshowhideminor-hide": "چھپائیں",
index 73a9b83..aa78905 100644 (file)
        "savechanges": "Lưu các thay đổi",
        "publishpage": "Đăng trang",
        "publishchanges": "Đăng thay đổi",
+       "savearticle-start": "Lưu trang...",
+       "savechanges-start": "Lưu thay đổi...",
+       "publishpage-start": "Đăng trang...",
+       "publishchanges-start": "Đăng thay đổi...",
        "preview": "Xem trước",
        "showpreview": "Xem trước",
        "showdiff": "Xem thay đổi",
index 6fe93cb..cc2c27e 100644 (file)
@@ -17,6 +17,7 @@
        "tog-ccmeonemails": "ⴰⵣⵏ ⵉⵢⵉ ⴷ ⵜⵓⵏⵖⵉⵍⵉⵏ ⵏ ⵉⵎⴰⵢⵍⵏ ⵏⵏⴰ ⵓⵣⵏⵖ ⵉ ⵉⵎⵙⵙⵎⵔⵙⵏ ⵢⴰⴹⵏ",
        "tog-diffonly": "ⴰⴷ ⵓⵔ ⵜⵙⵙⴽⴷ ⵜⵓⵎⴰⵢⵜ ⵏ ⵜⴰⵙⵏⴰ ⴷⴷⵓ ⵉⵎⵣⴰⵔⴰⵢⵏ",
        "tog-showhiddencats": "ⵙⴽⵏ ⵜⴰⴳⴳⴰⵢⵉⵏ ⵉⵜⵜⵓⵃⴹⴰⵏ",
+       "underline-never": "ⵓⵙⴰⵔ",
        "sunday": "ⴰⵙⴰⵎⴰⵙ",
        "monday": "ⴰⵢⵏⴰⵙ",
        "tuesday": "ⴰⵙⵉⵏⴰⵙ",
        "botpasswords-label-delete": "ⴽⴽⵙ",
        "passwordreset": "ⵔⴰⵔ ⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ",
        "changeemail-newemail": "ⵉⵎⴰⵢⵍ ⴰⵎⴰⵢⵏⵓ:",
+       "changeemail-none": "(ⵓⵍⴰ ⵢⴰⵏ)",
        "bold_sample": "ⴰⴹⵔⵉⵙ ⴰⵣⵓⵔⴰⵔ",
        "bold_tip": "ⴰⴹⵔⵉⵙ ⴰⵣⵓⵔⴰⵔ",
        "italic_sample": "ⴰⴹⵔⵉⵙ ⵓⵣⵍⵉⴳ",
        "logentry-move-move-noredirect": "{{GENDER:$2|ⵉⵙⵎⵓⵜⵜⵉ}} $1 ⵜⴰⵙⵏⴰ $3 ⵖⵔ $4 ⵎⵉⵏ ⴰⴷ ⵉⴼⵍ redirect",
        "logentry-newusers-create": "{{GENDER:$2|ⵉⵙⵏⴼⵍ ⵓⵏⵙⵙⵎⵔⵙ|ⵜⵙⵏⴼⵍ ⵜⵏⵙⵙⵎⵔⵙⵜ}} $1 ⴰⵎⵉⴹⴰⵏ ⵏⵙ",
        "logentry-upload-upload": "{{GENDER:$2|ⵉⵙⴽⵜⵔ|ⵜⵙⴽⵜⵔ}} $1 $3",
+       "rightsnone": "(ⵓⵍⴰ ⵢⴰⵏ)",
        "feedback-thanks-title": "ⵜⴰⵏⵎⵎⵉⵔⵜ!",
        "searchsuggest-search": "ⵔⵣⵓ ⴳ {{SITENAME}}",
        "duration-days": "$1 ⵏ {{PLURAL:$1|ⵡⴰⵙⵙ|ⵡⵓⵙⵙⴰⵏ}}",
index 692c366..f7ad13c 100644 (file)
        "recentchangeslinked-feed": "相关更改",
        "recentchangeslinked-toolbox": "相关更改",
        "recentchangeslinked-title": "与“$1”有关的更改",
-       "recentchangeslinked-summary": "输入页面名称以查看链入(或链自)相关页面的更改。(要查看分类的成员,请输入Category:分类名称)。对[[Special:Watchlist|您的监视列表]]上页面的更改以<strong>粗体</strong>显示。",
+       "recentchangeslinked-summary": "输入页面名称以查看链入(或链自)相关页面的更改。(要查看分类的成员,请输入{{ns:category}}:分类名称)。对[[Special:Watchlist|您的监视列表]]上页面的更改以<strong>粗体</strong>显示。",
        "recentchangeslinked-page": "页面名称:",
        "recentchangeslinked-to": "显示链到所给出的页面",
        "recentchanges-page-added-to-category": "[[:$1]]已添加至分类",
index b0389b9..f16aab4 100644 (file)
 {
-    "@metadata": {
-        "authors": [
-            "Horacewai2",
-            "Kayau",
-            "Mark85296341",
-            "PhiLiP",
-            "Shizhao",
-            "Waihorace",
-            "Wong128hk",
-            "Yukiseaside",
-            "Yuyu"
-        ]
-    },
-    "tog-watchlisthidebots": "監視列表中隱藏機械人的編輯",
-    "january": "一月",
-    "february": "二月",
-    "march": "三月",
-    "april": "四月",
-    "may_long": "五月",
-    "june": "六月",
-    "july": "七月",
-    "august": "八月",
-    "september": "九月",
-    "october": "十月",
-    "november": "十一月",
-    "december": "十二月",
-    "mytalk": "我的討論頁",
-    "tagline": "從 {{SITENAME}}",
-    "search": "搜尋",
-    "printableversion": "可打印版",
-    "permalink": "永久連接",
-    "print": "打印",
-    "specialpage": "特殊頁面",
-    "jumpto": "跳到:",
-    "jumptosearch": "搜尋",
-    "aboutpage": "Project:關於我們",
-    "privacy": "私隱政策",
-    "privacypage": "Project:私隱政策",
-    "red-link-title": "$1 (頁面不存在)",
-    "nstab-special": "特殊頁面",
-    "nav-login-createaccount": "登入/創造帳戶",
-    "userlogin": "登入/創造帳戶",
-    "editing": "正在編輯 $1",
-    "rev-deleted-comment": "(註釋已除)",
-    "rev-deleted-event": "(日誌已除)",
-    "revdelete-suppress-text": "壓制'''只'''應用於以下的情況:\n* 不合適的個人資料\n*: ''地址、電話號碼、身份證號碼等。''",
-    "editundo": "撤銷",
-    "search-mwsuggest-disabled": "沒有意見",
-    "prefs-help-gender": "可選:用於軟件中的性別指定。此項資料將會被公開。",
-    "group-bot": "機械人",
-    "group-bot-member": "機械人",
-    "grouppage-bot": "{{ns:project}}:機械人",
-    "recentchanges-label-bot": "這次編輯是由機械人進行",
-    "rcshowhidebots": "$1機械人的編輯",
-    "activeusers-hidebots": "隱藏機械人",
-    "contribslink": "貢獻",
-    "tooltip-search": "搜尋 {{SITENAME}}",
-    "tooltip-search-go": "若是真有其頁,則進入相同名字的頁面",
-    "tooltip-search-fulltext": "在此頁面內搜尋此文字",
-    "tooltip-n-mainpage": "回到首頁",
-    "tooltip-n-mainpage-description": "回到首頁",
-    "tooltip-n-randompage": "跳到一個隨機抽取的頁面",
-    "tooltip-t-print": "這個頁面的可打印版本",
-    "showhidebots": "($1機械人)",
-    "specialpages": "特殊頁面"
+       "@metadata": {
+               "authors": [
+                       "Horacewai2",
+                       "Kayau",
+                       "Mark85296341",
+                       "PhiLiP",
+                       "Shizhao",
+                       "Waihorace",
+                       "Wong128hk",
+                       "Yukiseaside",
+                       "Yuyu",
+                       "Hello903hello",
+                       "Justincheng12345",
+                       "LNDDYL",
+                       "Liuxinyu970226",
+                       "Quest for Truth"
+               ]
+       },
+       "tog-watchlisthidebots": "隱藏監視清單中機械人的編輯",
+       "january": "一月",
+       "february": "二月",
+       "march": "三月",
+       "april": "四月",
+       "may_long": "五月",
+       "june": "六月",
+       "july": "七月",
+       "august": "八月",
+       "september": "九月",
+       "october": "十月",
+       "november": "十一月",
+       "december": "十二月",
+       "mytalk": "我的討論頁",
+       "tagline": "從 {{SITENAME}}",
+       "search": "搜尋",
+       "printableversion": "可打印版",
+       "permalink": "靜態連結",
+       "print": "打印",
+       "specialpage": "特殊頁面",
+       "jumpto": "跳到:",
+       "jumptosearch": "搜尋",
+       "aboutpage": "Project:關於我們",
+       "privacy": "私隱政策",
+       "privacypage": "Project:私隱政策",
+       "red-link-title": "$1 (頁面不存在)",
+       "nstab-user": "用戶頁面",
+       "nstab-special": "特殊頁面",
+       "nstab-template": "模板",
+       "editinginterface": "<strong>警告:</strong>您正在編輯的頁面文字是用來作為軟件介面使用。更改此頁面將會影響其他用戶在此 Wiki 上看到的用戶介面。",
+       "yourname": "用戶名稱:",
+       "userlogin-yourname": "用戶名稱",
+       "nav-login-createaccount": "登入/創造帳戶",
+       "wrongpassword": "您輸入的密碼有錯誤,請再試一次。",
+       "botpasswords": "機械人密碼",
+       "botpasswords-summary": "<em>機械人密碼</em>可在不使用帳號的主要登入密碼情況下,允許透過 API 存取使用者帳號。使用機械人密碼登入的使用者權限或會有所限制。\n\n若你並非必須設定此密碼,你便不應使用此功能。任何人都不會索取你的機械人密碼。",
+       "botpasswords-disabled": "機械人密碼已停用。",
+       "botpasswords-no-central-id": "要使用機械人密碼,您必須登入帳號集中管理系統。",
+       "botpasswords-existing": "現有機械人密碼",
+       "botpasswords-createnew": "建立新機械人密碼",
+       "botpasswords-editexisting": "編輯現有機械人密碼",
+       "botpasswords-bad-appid": "機械人名稱「$1」無效。",
+       "botpasswords-insert-failed": "無法新增機械人名稱「$1」,是否早已加入?",
+       "botpasswords-update-failed": "無法刪除機械人名稱「$1」,是否早已刪除?",
+       "botpasswords-created-body": "{{GENDER:$2|使用者}}「$2」的機械人「$1」的機械人密碼已建立。",
+       "botpasswords-updated-body": "{{GENDER:$2|使用者}}「$2」的機械人「$1」的機械人密碼已更新。",
+       "botpasswords-deleted-body": "{{GENDER:$2|使用者}}「$2」的機械人「$1」的機械人密碼已刪除。",
+       "botpasswords-newpassword": "用來登入<strong>$1</strong>的新密碼為<strong>$2</strong>。<em>請記錄此密碼以供未來參考使用。</em><br>(舊式機械人的登入名稱需與最終使用者名稱相同,您亦可使用<strong>$3</strong>作為使用者名稱,<strong>$4</strong>作為密碼。)",
+       "botpasswords-restriction-failed": "機械人密碼限制已拒絕是次登入。",
+       "passwordreset-username": "用戶名稱:",
+       "editing": "正在編輯 $1",
+       "rev-deleted-comment": "(註釋已除)",
+       "rev-deleted-event": "(日誌已除)",
+       "revdelete-suppress-text": "壓制'''只'''應用於以下的情況:\n* 不合適的個人資料\n*: ''地址、電話號碼、身份證號碼等。''",
+       "editundo": "撤銷",
+       "prefs-user-pages": "用戶頁面",
+       "username": "{{GENDER:$1|用戶名稱}}:",
+       "prefs-help-gender": "可選:用於軟件中的性別指定。此項資料將會被公開。",
+       "group-user": "用戶",
+       "group-autoconfirmed": "自動確認用戶",
+       "group-bot": "機械人",
+       "group-user-member": "{{GENDER:$1|用戶}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|自動確認用戶}}",
+       "group-bot-member": "機械人",
+       "grouppage-user": "{{ns:project}}:用戶",
+       "grouppage-bot": "{{ns:project}}:機械人",
+       "right-viewmyprivateinfo": "編輯自己的私隱數據(如:電子郵件位址及真實姓名)",
+       "right-editmyprivateinfo": "編輯自己的私隱數據(如:電子郵件位址及真實姓名)",
+       "action-block": "封鎖此用戶的編輯權限",
+       "recentchanges-label-bot": "此編輯由機械人執行",
+       "rcfilters-filter-bots-label": "機械人",
+       "rcfilters-filter-humans-label": "人類(非機械人)",
+       "rcshowhidebots": "$1機械人的編輯",
+       "rcshowhideliu": "$1 已註冊的用戶",
+       "rcshowhideanons": "$1 匿名用戶",
+       "upload": "上載檔案",
+       "listfiles_user": "用戶",
+       "filehist-user": "用戶",
+       "uncategorizedtemplates": "待分類模板",
+       "listusers": "用戶清單",
+       "newpages-username": "用戶名稱:",
+       "speciallogtitlelabel": "目標 (標題或用戶):",
+       "checkbox-select": "選擇: $1",
+       "emailusername": "用戶名稱:",
+       "wlshowhidebots": "機械人",
+       "blockip": "封鎖{{GENDER:$1|用戶}}",
+       "contribslink": "貢獻",
+       "blocklogtext": "這是用戶的封禁與解禁操作的日誌記錄。\n自動封禁的 IP 位址不予包含。\n請參考 [[Special:BlockList|封禁清單]] 以檢視目前的封禁。",
+       "tooltip-search": "搜尋 {{SITENAME}}",
+       "tooltip-search-go": "若是真有其頁,則進入相同名字的頁面",
+       "tooltip-search-fulltext": "在此頁面內搜尋此文字",
+       "tooltip-n-mainpage": "回到首頁",
+       "tooltip-n-mainpage-description": "回到首頁",
+       "tooltip-n-randompage": "跳到一個隨機抽取的頁面",
+       "tooltip-t-contributions": "此用戶的貢獻清單",
+       "tooltip-t-upload": "上載檔案",
+       "tooltip-t-print": "這個頁面的可打印版本",
+       "tooltip-ca-nstab-user": "檢視用戶頁面",
+       "newimages-showbots": "顯示機械人上傳的檔案",
+       "exif-rowsperstrip": "每帶行數",
+       "redirect-user": "用戶 ID",
+       "specialpages": "特殊頁面",
+       "tags-source-manual": "由使用者與機械人手動套用",
+       "logentry-managetags-activate": "$1{{GENDER:$2|已啟用}}標籤「$4」供使用者與機械人使用"
 }
diff --git a/languages/messages/MessagesAbs.php b/languages/messages/MessagesAbs.php
new file mode 100644 (file)
index 0000000..8cbe79b
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+/** Ambonese Malay (Bahasa Ambon)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'id';
index 43e876e..c0c6284 100644 (file)
@@ -23,6 +23,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Maintenance script that reports the hostname of a replica DB server.
  *
@@ -43,7 +45,7 @@ class GetSlaveServer extends Maintenance {
                        $db = $this->getDB( DB_REPLICA, $this->getOption( 'group' ) );
                        $host = $db->getServer();
                } else {
-                       $lb = wfGetLB();
+                       $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
                        $i = $lb->getReaderIndex();
                        $host = $lb->getServerName( $i );
                }
index f7ef7a2..1b9dac0 100644 (file)
@@ -24,6 +24,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use MediaWiki\MediaWikiServices;
+
 class InitEditCount extends Maintenance {
        public function __construct() {
                parent::__construct();
@@ -48,7 +50,8 @@ in the load balancer, usually indicating a replication environment.' );
                } elseif ( $this->hasOption( 'quick' ) ) {
                        $backgroundMode = false;
                } else {
-                       $backgroundMode = wfGetLB()->getServerCount() > 1;
+                       $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
+                       $backgroundMode = $lb->getServerCount() > 1;
                }
 
                $actorQuery = ActorMigration::newMigration()->getJoin( 'rev_user' );
index f041e15..08df8dc 100644 (file)
@@ -23,6 +23,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Maintenance script to show database lag.
  *
@@ -36,8 +38,8 @@ class DatabaseLag extends Maintenance {
        }
 
        public function execute() {
+               $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
                if ( $this->hasOption( 'r' ) ) {
-                       $lb = wfGetLB();
                        echo 'time     ';
 
                        $serverCount = $lb->getServerCount();
@@ -58,7 +60,6 @@ class DatabaseLag extends Maintenance {
                                sleep( 5 );
                        }
                } else {
-                       $lb = wfGetLB();
                        $lags = $lb->getLagTimes();
                        foreach ( $lags as $i => $lag ) {
                                $name = $lb->getServerName( $i );
index 65ede90..0c78712 100644 (file)
@@ -1091,7 +1091,7 @@ CREATE TABLE /*_*/interwiki (
   -- The URL of the file api.php
   iw_api nvarchar(max) NOT NULL,
 
-  -- The name of the database (for a connection to be established with wfGetLB( 'wikiid' ))
+  -- The name of the database (for a connection to be established with LBFactory::getMainLB( 'wikiid' ))
   iw_wikiid nvarchar(64) NOT NULL,
 
   -- A boolean value indicating whether the wiki is in this project
index df3264a..8c9be05 100644 (file)
@@ -1540,7 +1540,7 @@ CREATE TABLE /*_*/interwiki (
   -- The URL of the file api.php
   iw_api blob NOT NULL,
 
-  -- The name of the database (for a connection to be established with wfGetLB( 'wikiid' ))
+  -- The name of the database (for a connection to be established with LBFactory::getMainLB( 'wikiid' ))
   iw_wikiid varchar(64) NOT NULL,
 
   -- A boolean value indicating whether the wiki is in this project
index 1c6f9b3..1491e62 100644 (file)
@@ -24,6 +24,9 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\DBReplicationWaitError;
+
 /**
  * Maintenance script to update cached special pages.
  *
@@ -119,16 +122,22 @@ class UpdateSpecialPages extends Maintenance {
         * mysql connection to "go away"
         */
        private function reopenAndWaitForReplicas() {
-               if ( !wfGetLB()->pingAll() ) {
+               $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+               $lb = $lbFactory->getMainLB();
+               if ( !$lb->pingAll() ) {
                        $this->output( "\n" );
                        do {
                                $this->error( "Connection failed, reconnecting in 10 seconds..." );
                                sleep( 10 );
-                       } while ( !wfGetLB()->pingAll() );
+                       } while ( !$lb->pingAll() );
                        $this->output( "Reconnected\n\n" );
                }
-               # Wait for the replica DB to catch up
-               wfWaitForSlaves();
+               // Wait for the replica DB to catch up
+               try {
+                       $lbFactory->waitForReplication();
+               } catch ( DBReplicationWaitError $e ) {
+                       // ignore
+               }
        }
 
        public function doSpecialPageCacheUpdates( $dbw ) {
index 12a7bf4..160aeb3 100644 (file)
@@ -728,7 +728,7 @@ return [
        'moment' => [
                'scripts' => [
                        // HACK: For some reason if you don't define window.moment first, loading moment fatals
-                       'resources/src/moment-global.js',
+                       'resources/src/moment/moment-global.js',
                        'resources/lib/moment/moment.js',
                ],
                'languageScripts' => [
@@ -755,7 +755,7 @@ return [
                        'de-ch' => 'resources/lib/moment/locale/de-ch.js',
                        'dv' => 'resources/lib/moment/locale/dv.js',
                        'el' => 'resources/lib/moment/locale/el.js',
-                       'en' => 'resources/src/moment-dmy.js',
+                       'en' => 'resources/src/moment/moment-dmy.js',
                        'en-au' => 'resources/lib/moment/locale/en-au.js',
                        'en-ca' => 'resources/lib/moment/locale/en-ca.js',
                        'en-gb' => 'resources/lib/moment/locale/en-gb.js',
@@ -843,7 +843,7 @@ return [
                // after locale definitions
                'skinScripts' => [
                        'default' => [
-                               'resources/src/moment-locale-overrides.js',
+                               'resources/src/moment/moment-locale-overrides.js',
                        ],
                ],
                'dependencies' => [
@@ -1213,11 +1213,6 @@ return [
                        'mediawiki.api',
                ],
        ],
-       'mediawiki.sectionAnchor' => [
-               // Back-compat to hide it on cached pages (T18691; Ie9e334e973; 2015-03-17)
-               'styles' => 'resources/src/mediawiki/mediawiki.sectionAnchor.css',
-               'targets' => [ 'desktop', 'mobile' ],
-       ],
        'mediawiki.storage' => [
                'scripts' => 'resources/src/mediawiki/mediawiki.storage.js',
                'targets' => [ 'desktop', 'mobile' ],
@@ -1632,7 +1627,10 @@ return [
        ],
 
        'mediawiki.libs.pluralruleparser' => [
-               'scripts' => 'resources/src/mediawiki.libs/CLDRPluralRuleParser.js',
+               'scripts' => [
+                       'resources/lib/CLDRPluralRuleParser/CLDRPluralRuleParser.js',
+                       'resources/src/mediawiki.libs.pluralruleparser/export.js',
+               ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
 
@@ -1672,7 +1670,10 @@ return [
        /* MediaWiki Libs */
 
        'mediawiki.libs.jpegmeta' => [
-               'scripts' => 'resources/src/mediawiki.libs/mediawiki.libs.jpegmeta.js',
+               'scripts' => [
+                       'resources/src/mediawiki.libs.jpegmeta/jpegmeta.js',
+                       'resources/src/mediawiki.libs.jpegmeta/export.js',
+               ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
 
diff --git a/resources/lib/CLDRPluralRuleParser/CLDRPluralRuleParser.js b/resources/lib/CLDRPluralRuleParser/CLDRPluralRuleParser.js
new file mode 100644 (file)
index 0000000..1491e3d
--- /dev/null
@@ -0,0 +1,608 @@
+/**
+ * cldrpluralparser.js
+ * A parser engine for CLDR plural rules.
+ *
+ * Copyright 2012-2014 Santhosh Thottingal and other contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ * @version 0.1.0
+ * @source https://github.com/santhoshtr/CLDRPluralRuleParser
+ * @author Santhosh Thottingal <santhosh.thottingal@gmail.com>
+ * @author Timo Tijhof
+ * @author Amir Aharoni
+ */
+
+/**
+ * Evaluates a plural rule in CLDR syntax for a number
+ * @param {string} rule
+ * @param {integer} number
+ * @return {boolean} true if evaluation passed, false if evaluation failed.
+ */
+
+// UMD returnExports https://github.com/umdjs/umd/blob/master/returnExports.js
+(function(root, factory) {
+       if (typeof define === 'function' && define.amd) {
+               // AMD. Register as an anonymous module.
+               define(factory);
+       } else if (typeof exports === 'object') {
+               // Node. Does not work with strict CommonJS, but
+               // only CommonJS-like environments that support module.exports,
+               // like Node.
+               module.exports = factory();
+       } else {
+               // Browser globals (root is window)
+               root.pluralRuleParser = factory();
+       }
+}(this, function() {
+
+function pluralRuleParser(rule, number) {
+       'use strict';
+
+       /*
+       Syntax: see http://unicode.org/reports/tr35/#Language_Plural_Rules
+       -----------------------------------------------------------------
+       condition     = and_condition ('or' and_condition)*
+               ('@integer' samples)?
+               ('@decimal' samples)?
+       and_condition = relation ('and' relation)*
+       relation      = is_relation | in_relation | within_relation
+       is_relation   = expr 'is' ('not')? value
+       in_relation   = expr (('not')? 'in' | '=' | '!=') range_list
+       within_relation = expr ('not')? 'within' range_list
+       expr          = operand (('mod' | '%') value)?
+       operand       = 'n' | 'i' | 'f' | 't' | 'v' | 'w'
+       range_list    = (range | value) (',' range_list)*
+       value         = digit+
+       digit         = 0|1|2|3|4|5|6|7|8|9
+       range         = value'..'value
+       samples       = sampleRange (',' sampleRange)* (',' ('…'|'...'))?
+       sampleRange   = decimalValue '~' decimalValue
+       decimalValue  = value ('.' value)?
+       */
+
+       // We don't evaluate the samples section of the rule. Ignore it.
+       rule = rule.split('@')[0].replace(/^\s*/, '').replace(/\s*$/, '');
+
+       if (!rule.length) {
+               // Empty rule or 'other' rule.
+               return true;
+       }
+
+       // Indicates the current position in the rule as we parse through it.
+       // Shared among all parsing functions below.
+       var pos = 0,
+               operand,
+               expression,
+               relation,
+               result,
+               whitespace = makeRegexParser(/^\s+/),
+               value = makeRegexParser(/^\d+/),
+               _n_ = makeStringParser('n'),
+               _i_ = makeStringParser('i'),
+               _f_ = makeStringParser('f'),
+               _t_ = makeStringParser('t'),
+               _v_ = makeStringParser('v'),
+               _w_ = makeStringParser('w'),
+               _is_ = makeStringParser('is'),
+               _isnot_ = makeStringParser('is not'),
+               _isnot_sign_ = makeStringParser('!='),
+               _equal_ = makeStringParser('='),
+               _mod_ = makeStringParser('mod'),
+               _percent_ = makeStringParser('%'),
+               _not_ = makeStringParser('not'),
+               _in_ = makeStringParser('in'),
+               _within_ = makeStringParser('within'),
+               _range_ = makeStringParser('..'),
+               _comma_ = makeStringParser(','),
+               _or_ = makeStringParser('or'),
+               _and_ = makeStringParser('and');
+
+       function debug() {
+               // console.log.apply(console, arguments);
+       }
+
+       debug('pluralRuleParser', rule, number);
+
+       // Try parsers until one works, if none work return null
+       function choice(parserSyntax) {
+               return function() {
+                       var i, result;
+
+                       for (i = 0; i < parserSyntax.length; i++) {
+                               result = parserSyntax[i]();
+
+                               if (result !== null) {
+                                       return result;
+                               }
+                       }
+
+                       return null;
+               };
+       }
+
+       // Try several parserSyntax-es in a row.
+       // All must succeed; otherwise, return null.
+       // This is the only eager one.
+       function sequence(parserSyntax) {
+               var i, parserRes,
+                       originalPos = pos,
+                       result = [];
+
+               for (i = 0; i < parserSyntax.length; i++) {
+                       parserRes = parserSyntax[i]();
+
+                       if (parserRes === null) {
+                               pos = originalPos;
+
+                               return null;
+                       }
+
+                       result.push(parserRes);
+               }
+
+               return result;
+       }
+
+       // Run the same parser over and over until it fails.
+       // Must succeed a minimum of n times; otherwise, return null.
+       function nOrMore(n, p) {
+               return function() {
+                       var originalPos = pos,
+                               result = [],
+                               parsed = p();
+
+                       while (parsed !== null) {
+                               result.push(parsed);
+                               parsed = p();
+                       }
+
+                       if (result.length < n) {
+                               pos = originalPos;
+
+                               return null;
+                       }
+
+                       return result;
+               };
+       }
+
+       // Helpers - just make parserSyntax out of simpler JS builtin types
+       function makeStringParser(s) {
+               var len = s.length;
+
+               return function() {
+                       var result = null;
+
+                       if (rule.substr(pos, len) === s) {
+                               result = s;
+                               pos += len;
+                       }
+
+                       return result;
+               };
+       }
+
+       function makeRegexParser(regex) {
+               return function() {
+                       var matches = rule.substr(pos).match(regex);
+
+                       if (matches === null) {
+                               return null;
+                       }
+
+                       pos += matches[0].length;
+
+                       return matches[0];
+               };
+       }
+
+       /**
+        * Integer digits of n.
+        */
+       function i() {
+               var result = _i_();
+
+               if (result === null) {
+                       debug(' -- failed i', parseInt(number, 10));
+
+                       return result;
+               }
+
+               result = parseInt(number, 10);
+               debug(' -- passed i ', result);
+
+               return result;
+       }
+
+       /**
+        * Absolute value of the source number (integer and decimals).
+        */
+       function n() {
+               var result = _n_();
+
+               if (result === null) {
+                       debug(' -- failed n ', number);
+
+                       return result;
+               }
+
+               result = parseFloat(number, 10);
+               debug(' -- passed n ', result);
+
+               return result;
+       }
+
+       /**
+        * Visible fractional digits in n, with trailing zeros.
+        */
+       function f() {
+               var result = _f_();
+
+               if (result === null) {
+                       debug(' -- failed f ', number);
+
+                       return result;
+               }
+
+               result = (number + '.').split('.')[1] || 0;
+               debug(' -- passed f ', result);
+
+               return result;
+       }
+
+       /**
+        * Visible fractional digits in n, without trailing zeros.
+        */
+       function t() {
+               var result = _t_();
+
+               if (result === null) {
+                       debug(' -- failed t ', number);
+
+                       return result;
+               }
+
+               result = (number + '.').split('.')[1].replace(/0$/, '') || 0;
+               debug(' -- passed t ', result);
+
+               return result;
+       }
+
+       /**
+        * Number of visible fraction digits in n, with trailing zeros.
+        */
+       function v() {
+               var result = _v_();
+
+               if (result === null) {
+                       debug(' -- failed v ', number);
+
+                       return result;
+               }
+
+               result = (number + '.').split('.')[1].length || 0;
+               debug(' -- passed v ', result);
+
+               return result;
+       }
+
+       /**
+        * Number of visible fraction digits in n, without trailing zeros.
+        */
+       function w() {
+               var result = _w_();
+
+               if (result === null) {
+                       debug(' -- failed w ', number);
+
+                       return result;
+               }
+
+               result = (number + '.').split('.')[1].replace(/0$/, '').length || 0;
+               debug(' -- passed w ', result);
+
+               return result;
+       }
+
+       // operand       = 'n' | 'i' | 'f' | 't' | 'v' | 'w'
+       operand = choice([n, i, f, t, v, w]);
+
+       // expr          = operand (('mod' | '%') value)?
+       expression = choice([mod, operand]);
+
+       function mod() {
+               var result = sequence(
+                       [operand, whitespace, choice([_mod_, _percent_]), whitespace, value]
+               );
+
+               if (result === null) {
+                       debug(' -- failed mod');
+
+                       return null;
+               }
+
+               debug(' -- passed ' + parseInt(result[0], 10) + ' ' + result[2] + ' ' + parseInt(result[4], 10));
+
+               return parseInt(result[0], 10) % parseInt(result[4], 10);
+       }
+
+       function not() {
+               var result = sequence([whitespace, _not_]);
+
+               if (result === null) {
+                       debug(' -- failed not');
+
+                       return null;
+               }
+
+               return result[1];
+       }
+
+       // is_relation   = expr 'is' ('not')? value
+       function is() {
+               var result = sequence([expression, whitespace, choice([_is_]), whitespace, value]);
+
+               if (result !== null) {
+                       debug(' -- passed is : ' + result[0] + ' == ' + parseInt(result[4], 10));
+
+                       return result[0] === parseInt(result[4], 10);
+               }
+
+               debug(' -- failed is');
+
+               return null;
+       }
+
+       // is_relation   = expr 'is' ('not')? value
+       function isnot() {
+               var result = sequence(
+                       [expression, whitespace, choice([_isnot_, _isnot_sign_]), whitespace, value]
+               );
+
+               if (result !== null) {
+                       debug(' -- passed isnot: ' + result[0] + ' != ' + parseInt(result[4], 10));
+
+                       return result[0] !== parseInt(result[4], 10);
+               }
+
+               debug(' -- failed isnot');
+
+               return null;
+       }
+
+       function not_in() {
+               var i, range_list,
+                       result = sequence([expression, whitespace, _isnot_sign_, whitespace, rangeList]);
+
+               if (result !== null) {
+                       debug(' -- passed not_in: ' + result[0] + ' != ' + result[4]);
+                       range_list = result[4];
+
+                       for (i = 0; i < range_list.length; i++) {
+                               if (parseInt(range_list[i], 10) === parseInt(result[0], 10)) {
+                                       return false;
+                               }
+                       }
+
+                       return true;
+               }
+
+               debug(' -- failed not_in');
+
+               return null;
+       }
+
+       // range_list    = (range | value) (',' range_list)*
+       function rangeList() {
+               var result = sequence([choice([range, value]), nOrMore(0, rangeTail)]),
+                       resultList = [];
+
+               if (result !== null) {
+                       resultList = resultList.concat(result[0]);
+
+                       if (result[1][0]) {
+                               resultList = resultList.concat(result[1][0]);
+                       }
+
+                       return resultList;
+               }
+
+               debug(' -- failed rangeList');
+
+               return null;
+       }
+
+       function rangeTail() {
+               // ',' range_list
+               var result = sequence([_comma_, rangeList]);
+
+               if (result !== null) {
+                       return result[1];
+               }
+
+               debug(' -- failed rangeTail');
+
+               return null;
+       }
+
+       // range         = value'..'value
+       function range() {
+               var i, array, left, right,
+                       result = sequence([value, _range_, value]);
+
+               if (result !== null) {
+                       debug(' -- passed range');
+
+                       array = [];
+                       left = parseInt(result[0], 10);
+                       right = parseInt(result[2], 10);
+
+                       for (i = left; i <= right; i++) {
+                               array.push(i);
+                       }
+
+                       return array;
+               }
+
+               debug(' -- failed range');
+
+               return null;
+       }
+
+       function _in() {
+               var result, range_list, i;
+
+               // in_relation   = expr ('not')? 'in' range_list
+               result = sequence(
+                       [expression, nOrMore(0, not), whitespace, choice([_in_, _equal_]), whitespace, rangeList]
+               );
+
+               if (result !== null) {
+                       debug(' -- passed _in:' + result);
+
+                       range_list = result[5];
+
+                       for (i = 0; i < range_list.length; i++) {
+                               if (parseInt(range_list[i], 10) === parseInt(result[0], 10)) {
+                                       return (result[1][0] !== 'not');
+                               }
+                       }
+
+                       return (result[1][0] === 'not');
+               }
+
+               debug(' -- failed _in ');
+
+               return null;
+       }
+
+       /**
+        * The difference between "in" and "within" is that
+        * "in" only includes integers in the specified range,
+        * while "within" includes all values.
+        */
+       function within() {
+               var range_list, result;
+
+               // within_relation = expr ('not')? 'within' range_list
+               result = sequence(
+                       [expression, nOrMore(0, not), whitespace, _within_, whitespace, rangeList]
+               );
+
+               if (result !== null) {
+                       debug(' -- passed within');
+
+                       range_list = result[5];
+
+                       if ((result[0] >= parseInt(range_list[0], 10)) &&
+                               (result[0] < parseInt(range_list[range_list.length - 1], 10))) {
+
+                               return (result[1][0] !== 'not');
+                       }
+
+                       return (result[1][0] === 'not');
+               }
+
+               debug(' -- failed within ');
+
+               return null;
+       }
+
+       // relation      = is_relation | in_relation | within_relation
+       relation = choice([is, not_in, isnot, _in, within]);
+
+       // and_condition = relation ('and' relation)*
+       function and() {
+               var i,
+                       result = sequence([relation, nOrMore(0, andTail)]);
+
+               if (result) {
+                       if (!result[0]) {
+                               return false;
+                       }
+
+                       for (i = 0; i < result[1].length; i++) {
+                               if (!result[1][i]) {
+                                       return false;
+                               }
+                       }
+
+                       return true;
+               }
+
+               debug(' -- failed and');
+
+               return null;
+       }
+
+       // ('and' relation)*
+       function andTail() {
+               var result = sequence([whitespace, _and_, whitespace, relation]);
+
+               if (result !== null) {
+                       debug(' -- passed andTail' + result);
+
+                       return result[3];
+               }
+
+               debug(' -- failed andTail');
+
+               return null;
+
+       }
+       //  ('or' and_condition)*
+       function orTail() {
+               var result = sequence([whitespace, _or_, whitespace, and]);
+
+               if (result !== null) {
+                       debug(' -- passed orTail: ' + result[3]);
+
+                       return result[3];
+               }
+
+               debug(' -- failed orTail');
+
+               return null;
+       }
+
+       // condition     = and_condition ('or' and_condition)*
+       function condition() {
+               var i,
+                       result = sequence([and, nOrMore(0, orTail)]);
+
+               if (result) {
+                       for (i = 0; i < result[1].length; i++) {
+                               if (result[1][i]) {
+                                       return true;
+                               }
+                       }
+
+                       return result[0];
+               }
+
+               return false;
+       }
+
+       result = condition();
+
+       /**
+        * For success, the pos must have gotten to the end of the rule
+        * and returned a non-null.
+        * n.b. This is part of language infrastructure,
+        * so we do not throw an internationalizable message.
+        */
+       if (result === null) {
+               throw new Error('Parse error at position ' + pos.toString() + ' for rule: ' + rule);
+       }
+
+       if (pos !== rule.length) {
+               debug('Warning: Rule not parsed completely. Parser stopped at ' + rule.substr(0, pos) + ' for rule: ' + rule);
+       }
+
+       return result;
+}
+
+return pluralRuleParser;
+
+}));
diff --git a/resources/src/mediawiki.libs.jpegmeta/export.js b/resources/src/mediawiki.libs.jpegmeta/export.js
new file mode 100644 (file)
index 0000000..e8913aa
--- /dev/null
@@ -0,0 +1,12 @@
+/* global JpegMeta */
+( function ( mw ) {
+
+       // Export as module
+       module.exports = function ( fileReaderResult, fileName ) {
+               return new JpegMeta.JpegFile( fileReaderResult, fileName );
+       };
+
+       // Back-compat: Also expose via mw.lib
+       // @deprecated since 1.31
+       mw.log.deprecate( mw.libs, 'jpegmeta', module.exports );
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.libs.jpegmeta/jpegmeta.js b/resources/src/mediawiki.libs.jpegmeta/jpegmeta.js
new file mode 100644 (file)
index 0000000..ed85914
--- /dev/null
@@ -0,0 +1,731 @@
+/**
+ * This is JsJpegMeta v1.0
+ * From: https://code.google.com/p/jsjpegmeta/downloads/list
+ * From: https://github.com/bennoleslie/jsjpegmeta/blob/v1.0.0/jpegmeta.js
+ *
+ * Ported to MediaWiki ResourceLoader by Bryan Tong Minh
+ * Changes:
+ * - Add closure.
+ * - Add this.JpegMeta assignment to expose it as global.
+ */
+
+( function () {
+       /*
+       Copyright (c) 2009 Ben Leslie
+       
+       Permission is hereby granted, free of charge, to any person obtaining a copy
+       of this software and associated documentation files (the "Software"), to deal
+       in the Software without restriction, including without limitation the rights
+       to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+       copies of the Software, and to permit persons to whom the Software is
+       furnished to do so, subject to the following conditions:
+       
+       The above copyright notice and this permission notice shall be included in
+       all copies or substantial portions of the Software.
+       
+       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+       IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+       AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+       LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+       OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+       THE SOFTWARE.
+       */
+       
+       /*
+        This JavaScript library is used to parse meta-data from files 
+        with mime-type image/jpeg.
+       
+        Include it with something like:
+       
+          <script type="text/javascript" src="jpegmeta.js"></script>
+       
+        This adds a single 'module' object called 'JpegMeta' to the global
+        namespace.
+       
+        Public Functions
+        ----------------
+        JpegMeta.parseNum - parse unsigned integers from binary data
+        JpegMeta.parseSnum - parse signed integers from binary data
+       
+        Public Classes
+        --------------
+        JpegMeta.Rational - A rational number class
+        JpegMeta.JfifSegment
+        JpegMeta.ExifSegment
+        JpegMeta.JpegFile - Primary class for Javascript parsing
+       */
+
+       var JpegMeta = {};
+       // MediaWiki: Expose as global
+       this.JpegMeta = JpegMeta;
+       
+       /* 
+          parse an unsigned number of size bytes at offset in some binary string data.
+          If endian
+          is "<" parse the data as little endian, if endian
+          is ">" parse as big-endian.
+       */
+       JpegMeta.parseNum = function parseNum(endian, data, offset, size) {
+           var i;
+           var ret;
+           var big_endian = (endian === ">");
+           if (offset === undefined) offset = 0;
+           if (size === undefined) size = data.length - offset;
+           for (big_endian ? i = offset : i = offset + size - 1; 
+                big_endian ? i < offset + size : i >= offset; 
+                big_endian ? i++ : i--) {
+               ret <<= 8;
+               ret += data.charCodeAt(i);
+           }
+           return ret;
+       };
+       
+       /* 
+          parse an signed number of size bytes at offset in some binary string data.
+          If endian
+          is "<" parse the data as little endian, if endian
+          is ">" parse as big-endian.
+       */
+       JpegMeta.parseSnum = function parseSnum(endian, data, offset, size) {
+           var i;
+           var ret;
+           var neg;
+           var big_endian = (endian === ">");
+           if (offset === undefined) offset = 0;
+           if (size === undefined) size = data.length - offset;
+           for (big_endian ? i = offset : i = offset + size - 1; 
+                big_endian ? i < offset + size : i >= offset; 
+                big_endian ? i++ : i--) {
+               if (neg === undefined) {
+                   /* Negative if top bit is set */
+                   neg = (data.charCodeAt(i) & 0x80) === 0x80;
+               }
+               ret <<= 8;
+               /* If it is negative we invert the bits */
+               ret += neg ? ~data.charCodeAt(i) & 0xff: data.charCodeAt(i);
+           }
+           if (neg) {
+               /* If it is negative we do two's complement */
+               ret += 1;
+               ret *= -1;
+           }
+           return ret;
+       };
+       
+       /* Rational number class */
+       JpegMeta.Rational = function Rational(num, den)
+       {
+           this.num = num;
+           this.den = den || 1;
+           return this;
+       };
+       
+       /* Rational number methods */
+       JpegMeta.Rational.prototype.toString = function toString() {
+           if (this.num === 0) {
+               return "" + this.num;
+           }
+           if (this.den === 1) {
+               return "" + this.num;
+           }
+           if (this.num === 1) {
+               return this.num + " / " + this.den;
+           }
+           return this.num / this.den; // + "/" + this.den;
+       };
+       
+       JpegMeta.Rational.prototype.asFloat = function asFloat() {
+           return this.num / this.den;
+       };
+       
+       /* MetaGroup class */
+       JpegMeta.MetaGroup = function MetaGroup(fieldName, description) {
+           this.fieldName = fieldName;
+           this.description = description;
+           this.metaProps = {};
+           return this;
+       };
+       
+       JpegMeta.MetaGroup.prototype._addProperty = function _addProperty(fieldName, description, value) {
+           var property = new JpegMeta.MetaProp(fieldName, description, value);
+           this[property.fieldName] = property;
+           this.metaProps[property.fieldName] = property;
+       };
+       
+       JpegMeta.MetaGroup.prototype.toString = function toString() {
+           return "[MetaGroup " + this.description + "]";
+       };
+
+       /* MetaProp class */
+       JpegMeta.MetaProp = function MetaProp(fieldName, description, value) {
+           this.fieldName = fieldName;
+           this.description = description;
+           this.value = value;
+           return this;
+       };
+       
+       JpegMeta.MetaProp.prototype.toString = function toString() {
+           return "" + this.value;
+       };
+
+       /* JpegFile class */
+       JpegMeta.JpegFile = function JpegFile(binary_data, filename) {
+           /* Change this to EOI if we want to parse. */
+           var break_segment = this._SOS;
+           
+           this.metaGroups = {};
+           this._binary_data = binary_data;
+           this.filename = filename;
+           
+           /* Go through and parse. */
+           var pos = 0;
+           var pos_start_of_segment = 0;
+           var delim;
+           var mark;
+           var _mark;
+           var segsize;
+           var headersize;
+           var mark_code;
+           var mark_fn;
+       
+           /* Check to see if this looks like a JPEG file */
+           if (this._binary_data.slice(0, 2) !== this._SOI_MARKER) {
+               throw new Error("Doesn't look like a JPEG file. First two bytes are " + 
+                               this._binary_data.charCodeAt(0) + "," + 
+                               this._binary_data.charCodeAt(1) + ".");
+           }
+           
+           pos += 2;
+           
+           while (pos < this._binary_data.length) {
+               delim = this._binary_data.charCodeAt(pos++);
+               mark = this._binary_data.charCodeAt(pos++);
+               
+               pos_start_of_segment = pos;
+               
+               if (delim != this._DELIM) {
+                   break;
+               }
+               
+               if (mark === break_segment) {
+                   break;
+               }
+               
+               headersize = JpegMeta.parseNum(">", this._binary_data, pos, 2);
+               
+               /* Find the end */
+               pos += headersize;
+               while (pos < this._binary_data.length) {
+                   delim = this._binary_data.charCodeAt(pos++);
+                   if (delim == this._DELIM) {
+                       _mark = this._binary_data.charCodeAt(pos++);
+                       if (_mark != 0x0) {
+                           pos -= 2;
+                           break;
+                       }
+                   }
+               }
+               
+               segsize = pos - pos_start_of_segment;
+               
+               if (this._markers[mark]) {
+                   mark_code = this._markers[mark][0];
+                   mark_fn = this._markers[mark][1];
+               } else {
+                   mark_code = "UNKN";
+                   mark_fn = undefined;
+               }
+               
+               if (mark_fn) {
+                   this[mark_fn](mark, pos_start_of_segment + 2);
+               }
+               
+           }
+           
+           if (this.general === undefined) {
+               throw Error("Invalid JPEG file.");
+           }
+           
+           return this;
+       };
+       
+       this.JpegMeta.JpegFile.prototype.toString = function () {
+           return "[JpegFile " + this.filename + " " + 
+               this.general.type + " " + 
+               this.general.pixelWidth + "x" + 
+               this.general.pixelHeight +
+               " Depth: " + this.general.depth + "]";
+       };
+       
+       /* Some useful constants */
+       this.JpegMeta.JpegFile.prototype._SOI_MARKER = '\xff\xd8';
+       this.JpegMeta.JpegFile.prototype._DELIM = 0xff;
+       this.JpegMeta.JpegFile.prototype._EOI = 0xd9;
+       this.JpegMeta.JpegFile.prototype._SOS = 0xda;
+       
+       this.JpegMeta.JpegFile.prototype._sofHandler = function _sofHandler (mark, pos) {
+           if (this.general !== undefined) {
+               throw Error("Unexpected multiple-frame image");
+           }
+       
+           this._addMetaGroup("general", "General");
+           this.general._addProperty("depth", "Depth", JpegMeta.parseNum(">", this._binary_data, pos, 1));
+           this.general._addProperty("pixelHeight", "Pixel Height", JpegMeta.parseNum(">", this._binary_data, pos + 1, 2));
+           this.general._addProperty("pixelWidth", "Pixel Width",JpegMeta.parseNum(">", this._binary_data, pos + 3, 2));
+           this.general._addProperty("type", "Type", this._markers[mark][2]);
+       };
+       
+       /* JFIF idents */
+       this.JpegMeta.JpegFile.prototype._JFIF_IDENT = "JFIF\x00";
+       this.JpegMeta.JpegFile.prototype._JFXX_IDENT = "JFXX\x00";
+       
+       /* Exif idents */
+       this.JpegMeta.JpegFile.prototype._EXIF_IDENT = "Exif\x00";
+       
+       /* TIFF types */
+       this.JpegMeta.JpegFile.prototype._types = {
+           /* The format is identifier : ["type name", type_size_in_bytes ] */
+           1 : ["BYTE", 1],
+           2 : ["ASCII", 1],
+           3 : ["SHORT", 2],
+           4 : ["LONG", 4],
+           5 : ["RATIONAL", 8],
+           6 : ["SBYTE", 1],
+           7 : ["UNDEFINED", 1],
+           8 : ["SSHORT", 2],
+           9 : ["SLONG", 4],
+           10 : ["SRATIONAL", 8],
+           11 : ["FLOAT", 4],
+           12 : ["DOUBLE", 8]
+       };
+       
+       this.JpegMeta.JpegFile.prototype._tifftags = {
+           /* A. Tags relating to image data structure */
+           256 : ["Image width", "ImageWidth"],
+           257 : ["Image height", "ImageLength"],
+           258 : ["Number of bits per component", "BitsPerSample"],
+           259 : ["Compression scheme", "Compression", 
+                  {1 : "uncompressed", 6 : "JPEG compression" }],
+           262 : ["Pixel composition", "PhotmetricInerpretation",
+                  {2 : "RGB", 6 : "YCbCr"}],
+           274 : ["Orientation of image", "Orientation",
+                  /* FIXME: Check the mirror-image / reverse encoding and rotation */
+                  {1 : "Normal", 2 : "Reverse?", 
+                   3 : "Upside-down", 4 : "Upside-down Reverse",
+                   5 : "90 degree CW", 6 : "90 degree CW reverse",
+                   7 : "90 degree CCW", 8 : "90 degree CCW reverse"}],
+           277 : ["Number of components", "SamplesPerPixel"],
+           284 : ["Image data arrangement", "PlanarConfiguration",
+                  {1 : "chunky format", 2 : "planar format"}],
+           530 : ["Subsampling ratio of Y to C", "YCbCrSubSampling"],
+           531 : ["Y and C positioning", "YCbCrPositioning",
+                  {1 : "centered", 2 : "co-sited"}],
+           282 : ["X Resolution", "XResolution"],
+           283 : ["Y Resolution", "YResolution"],
+           296 : ["Resolution Unit", "ResolutionUnit",
+                  {2 : "inches", 3 : "centimeters"}],
+           /* B. Tags realting to recording offset */
+           273 : ["Image data location", "StripOffsets"],
+           278 : ["Number of rows per strip", "RowsPerStrip"],
+           279 : ["Bytes per compressed strip", "StripByteCounts"],
+           513 : ["Offset to JPEG SOI", "JPEGInterchangeFormat"],
+           514 : ["Bytes of JPEG Data", "JPEGInterchangeFormatLength"],
+           /* C. Tags relating to image data characteristics */
+           301 : ["Transfer function", "TransferFunction"],
+           318 : ["White point chromaticity", "WhitePoint"],
+           319 : ["Chromaticities of primaries", "PrimaryChromaticities"],
+           529 : ["Color space transformation matrix coefficients", "YCbCrCoefficients"],
+           532 : ["Pair of black and white reference values", "ReferenceBlackWhite"],
+           /* D. Other tags */
+           306 : ["Date and time", "DateTime"],
+           270 : ["Image title", "ImageDescription"],
+           271 : ["Make", "Make"],
+           272 : ["Model", "Model"],
+           305 : ["Software", "Software"],
+           315 : ["Person who created the image", "Artist"],
+           316 : ["Host Computer", "HostComputer"],
+           33432 : ["Copyright holder", "Copyright"],
+           
+           34665 : ["Exif tag", "ExifIfdPointer"],
+           34853 : ["GPS tag", "GPSInfoIfdPointer"]
+       };
+       
+       this.JpegMeta.JpegFile.prototype._exiftags = {
+           /* Tag Support Levels (2) - 0th IFX Exif Private Tags */
+           /* A. Tags Relating to Version */
+           36864 : ["Exif Version", "ExifVersion"],
+           40960 : ["FlashPix Version", "FlashpixVersion"],
+           
+           /* B. Tag Relating to Image Data Characteristics */
+           40961 : ["Color Space", "ColorSpace"],
+           
+           /* C. Tags Relating to Image Configuration */
+           37121 : ["Meaning of each component", "ComponentsConfiguration"],
+           37122 : ["Compressed Bits Per Pixel", "CompressedBitsPerPixel"],
+           40962 : ["Pixel X Dimension", "PixelXDimension"],
+           40963 : ["Pixel Y Dimension", "PixelYDimension"],
+           
+           /* D. Tags Relating to User Information */
+           37500 : ["Manufacturer notes", "MakerNote"],
+           37510 : ["User comments", "UserComment"],
+           
+           /* E. Tag Relating to Related File Information */
+           40964 : ["Related audio file", "RelatedSoundFile"],
+           
+           /* F. Tags Relating to Date and Time */
+           36867 : ["Date Time Original", "DateTimeOriginal"],
+           36868 : ["Date Time Digitized", "DateTimeDigitized"],
+           37520 : ["DateTime subseconds", "SubSecTime"],
+           37521 : ["DateTimeOriginal subseconds", "SubSecTimeOriginal"],
+           37522 : ["DateTimeDigitized subseconds", "SubSecTimeDigitized"],
+           
+           /* G. Tags Relating to Picture-Taking Conditions */
+           33434 : ["Exposure time", "ExposureTime"],
+           33437 : ["FNumber", "FNumber"],
+           34850 : ["Exposure program", "ExposureProgram"],
+           34852 : ["Spectral sensitivity", "SpectralSensitivity"],
+           34855 : ["ISO Speed Ratings", "ISOSpeedRatings"],
+           34856 : ["Optoelectric coefficient", "OECF"],
+           37377 : ["Shutter Speed",  "ShutterSpeedValue"],
+           37378 : ["Aperture Value", "ApertureValue"],
+           37379 : ["Brightness", "BrightnessValue"],
+           37380 : ["Exposure Bias Value", "ExposureBiasValue"],
+           37381 : ["Max Aperture Value", "MaxApertureValue"],
+           37382 : ["Subject Distance", "SubjectDistance"],
+           37383 : ["Metering Mode", "MeteringMode"],
+           37384 : ["Light Source", "LightSource"],
+           37385 : ["Flash", "Flash"],
+           37386 : ["Focal Length", "FocalLength"],
+           37396 : ["Subject Area", "SubjectArea"],
+           41483 : ["Flash Energy", "FlashEnergy"],
+           41484 : ["Spatial Frequency Response", "SpatialFrequencyResponse"],
+           41486 : ["Focal Plane X Resolution", "FocalPlaneXResolution"],
+           41487 : ["Focal Plane Y Resolution", "FocalPlaneYResolution"],
+           41488 : ["Focal Plane Resolution Unit", "FocalPlaneResolutionUnit"],
+           41492 : ["Subject Location", "SubjectLocation"],
+           41493 : ["Exposure Index", "ExposureIndex"],
+           41495 : ["Sensing Method", "SensingMethod"],
+           41728 : ["File Source", "FileSource"],
+           41729 : ["Scene Type", "SceneType"],
+           41730 : ["CFA Pattern", "CFAPattern"],
+           41985 : ["Custom Rendered", "CustomRendered"],
+           41986 : ["Exposure Mode", "Exposure Mode"],
+           41987 : ["White Balance", "WhiteBalance"],
+           41988 : ["Digital Zoom Ratio", "DigitalZoomRatio"],
+           41990 : ["Scene Capture Type", "SceneCaptureType"],
+           41991 : ["Gain Control", "GainControl"],
+           41992 : ["Contrast", "Contrast"],
+           41993 : ["Saturation", "Saturation"],
+           41994 : ["Sharpness", "Sharpness"],
+           41995 : ["Device settings description", "DeviceSettingDescription"],
+           41996 : ["Subject distance range", "SubjectDistanceRange"],
+           
+           /* H. Other Tags */
+           42016 : ["Unique image ID", "ImageUniqueID"],
+           
+           40965 : ["Interoperability tag", "InteroperabilityIFDPointer"]
+       };
+       
+       this.JpegMeta.JpegFile.prototype._gpstags = {
+           /* A. Tags Relating to GPS */
+           0 : ["GPS tag version", "GPSVersionID"],
+           1 : ["North or South Latitude", "GPSLatitudeRef"],
+           2 : ["Latitude", "GPSLatitude"],
+           3 : ["East or West Longitude", "GPSLongitudeRef"],
+           4 : ["Longitude", "GPSLongitude"],
+           5 : ["Altitude reference", "GPSAltitudeRef"],
+           6 : ["Altitude", "GPSAltitude"],
+           7 : ["GPS time (atomic clock)", "GPSTimeStamp"],
+           8 : ["GPS satellites usedd for measurement", "GPSSatellites"],
+           9 : ["GPS receiver status", "GPSStatus"],
+           10 : ["GPS mesaurement mode", "GPSMeasureMode"],
+           11 : ["Measurement precision", "GPSDOP"],
+           12 : ["Speed unit", "GPSSpeedRef"],
+           13 : ["Speed of GPS receiver", "GPSSpeed"],
+           14 : ["Reference for direction of movement", "GPSTrackRef"],
+           15 : ["Direction of movement", "GPSTrack"],
+           16 : ["Reference for direction of image", "GPSImgDirectionRef"],
+           17 : ["Direction of image", "GPSImgDirection"],
+           18 : ["Geodetic survey data used", "GPSMapDatum"],
+           19 : ["Reference for latitude of destination", "GPSDestLatitudeRef"],
+           20 : ["Latitude of destination", "GPSDestLatitude"],
+           21 : ["Reference for longitude of destination", "GPSDestLongitudeRef"],
+           22 : ["Longitude of destination", "GPSDestLongitude"],
+           23 : ["Reference for bearing of destination", "GPSDestBearingRef"],
+           24 : ["Bearing of destination", "GPSDestBearing"],
+           25 : ["Reference for distance to destination", "GPSDestDistanceRef"],
+           26 : ["Distance to destination", "GPSDestDistance"],
+           27 : ["Name of GPS processing method", "GPSProcessingMethod"],
+           28 : ["Name of GPS area", "GPSAreaInformation"],
+           29 : ["GPS Date", "GPSDateStamp"],
+           30 : ["GPS differential correction", "GPSDifferential"]
+       };
+
+       this.JpegMeta.JpegFile.prototype._markers = {
+           /* Start Of Frame markers, non-differential, Huffman coding */
+           0xc0: ["SOF0", "_sofHandler", "Baseline DCT"],
+           0xc1: ["SOF1", "_sofHandler", "Extended sequential DCT"],
+           0xc2: ["SOF2", "_sofHandler", "Progressive DCT"],
+           0xc3: ["SOF3", "_sofHandler", "Lossless (sequential)"],
+           
+           /* Start Of Frame markers, differential, Huffman coding */
+           0xc5: ["SOF5", "_sofHandler", "Differential sequential DCT"],
+           0xc6: ["SOF6", "_sofHandler", "Differential progressive DCT"],
+           0xc7: ["SOF7", "_sofHandler", "Differential lossless (sequential)"],
+           
+           /* Start Of Frame markers, non-differential, arithmetic coding */
+           0xc8: ["JPG", null, "Reserved for JPEG extensions"],
+           0xc9: ["SOF9", "_sofHandler", "Extended sequential DCT"],
+           0xca: ["SOF10", "_sofHandler", "Progressive DCT"],
+           0xcb: ["SOF11", "_sofHandler", "Lossless (sequential)"],
+           
+           /* Start Of Frame markers, differential, arithmetic coding */
+           0xcd: ["SOF13", "_sofHandler", "Differential sequential DCT"],
+           0xce: ["SOF14", "_sofHandler", "Differential progressive DCT"],
+           0xcf: ["SOF15", "_sofHandler", "Differential lossless (sequential)"],
+           
+           /* Huffman table specification */
+           0xc4: ["DHT", null, "Define Huffman table(s)"],
+           0xcc: ["DAC", null, "Define arithmetic coding conditioning(s)"],
+           
+           /* Restart interval termination" */
+           0xd0: ["RST0", null, "Restart with modulo 8 count “0”"],
+           0xd1: ["RST1", null, "Restart with modulo 8 count “1”"],
+           0xd2: ["RST2", null, "Restart with modulo 8 count “2”"],
+           0xd3: ["RST3", null, "Restart with modulo 8 count “3”"],
+           0xd4: ["RST4", null, "Restart with modulo 8 count “4”"],
+           0xd5: ["RST5", null, "Restart with modulo 8 count “5”"],
+           0xd6: ["RST6", null, "Restart with modulo 8 count “6”"],
+           0xd7: ["RST7", null, "Restart with modulo 8 count “7”"],
+           
+           /* Other markers */
+           0xd8: ["SOI", null, "Start of image"],
+           0xd9: ["EOI", null, "End of image"],
+           0xda: ["SOS", null, "Start of scan"],
+           0xdb: ["DQT", null, "Define quantization table(s)"],
+           0xdc: ["DNL", null, "Define number of lines"],
+           0xdd: ["DRI", null, "Define restart interval"],
+           0xde: ["DHP", null, "Define hierarchical progression"],
+           0xdf: ["EXP", null, "Expand reference component(s)"],
+           0xe0: ["APP0", "_app0Handler", "Reserved for application segments"],
+           0xe1: ["APP1", "_app1Handler"],
+           0xe2: ["APP2", null],
+           0xe3: ["APP3", null],
+           0xe4: ["APP4", null],
+           0xe5: ["APP5", null],
+           0xe6: ["APP6", null],
+           0xe7: ["APP7", null],
+           0xe8: ["APP8", null],
+           0xe9: ["APP9", null],
+           0xea: ["APP10", null],
+           0xeb: ["APP11", null],
+           0xec: ["APP12", null],
+           0xed: ["APP13", null],
+           0xee: ["APP14", null],
+           0xef: ["APP15", null],
+           0xf0: ["JPG0", null], /* Reserved for JPEG extensions */
+           0xf1: ["JPG1", null],
+           0xf2: ["JPG2", null],
+           0xf3: ["JPG3", null],
+           0xf4: ["JPG4", null],
+           0xf5: ["JPG5", null],
+           0xf6: ["JPG6", null],
+           0xf7: ["JPG7", null],
+           0xf8: ["JPG8", null],
+           0xf9: ["JPG9", null],
+           0xfa: ["JPG10", null],
+           0xfb: ["JPG11", null],
+           0xfc: ["JPG12", null],
+           0xfd: ["JPG13", null],
+           0xfe: ["COM", null], /* Comment */
+           
+           /* Reserved markers */
+           0x01: ["JPG13", null] /* For temporary private use in arithmetic coding */
+           /* 02 -> bf are reserverd */
+       };
+
+       /* Private methods */
+       this.JpegMeta.JpegFile.prototype._addMetaGroup = function _addMetaGroup(name, description) {
+           var group = new JpegMeta.MetaGroup(name, description);
+           this[group.fieldName] = group;
+           this.metaGroups[group.fieldName] = group;
+           return group;
+       };
+
+       this.JpegMeta.JpegFile.prototype._parseIfd = function _parseIfd(endian, _binary_data, base, ifd_offset, tags, name, description) {
+           var num_fields = JpegMeta.parseNum(endian, _binary_data, base + ifd_offset, 2);
+           /* Per tag variables */
+           var i, j;
+           var tag_base;
+           var tag_field;
+           var type, type_field, type_size;
+           var num_values;
+           var value_offset;
+           var value;
+           var _val;
+           var num;
+           var den;
+           
+           var group;
+           
+           group = this._addMetaGroup(name, description);
+       
+           for (var i = 0; i < num_fields; i++) {
+               /* parse the field */
+               tag_base = base + ifd_offset + 2 + (i * 12);
+               tag_field = JpegMeta.parseNum(endian, _binary_data, tag_base, 2);
+               type_field = JpegMeta.parseNum(endian, _binary_data, tag_base + 2, 2);
+               num_values = JpegMeta.parseNum(endian, _binary_data, tag_base + 4, 4);
+               value_offset = JpegMeta.parseNum(endian, _binary_data, tag_base + 8, 4);
+               if (this._types[type_field] === undefined) {
+                   continue;
+               }
+               type = this._types[type_field][0];
+               type_size = this._types[type_field][1];
+               
+               if (type_size * num_values <= 4) {
+                   /* Data is in-line */
+                   value_offset = tag_base + 8;
+               } else {
+                   value_offset = base + value_offset;
+               }
+               
+               /* Read the value */
+               if (type == "UNDEFINED") {
+                   value = _binary_data.slice(value_offset, value_offset + num_values);
+               } else if (type == "ASCII") {
+                   value = _binary_data.slice(value_offset, value_offset + num_values);
+                   value = value.split('\x00')[0];
+                   /* strip trail nul */
+               } else {
+                   value = new Array();
+                   for (j = 0; j < num_values; j++, value_offset += type_size) {
+                       if (type == "BYTE" || type == "SHORT" || type == "LONG") {
+                           value.push(JpegMeta.parseNum(endian, _binary_data, value_offset, type_size));
+                       }
+                       if (type == "SBYTE" || type == "SSHORT" || type == "SLONG") {
+                           value.push(JpegMeta.parseSnum(endian, _binary_data, value_offset, type_size));
+                       }
+                       if (type == "RATIONAL") {
+                           num = JpegMeta.parseNum(endian, _binary_data, value_offset, 4);
+                           den = JpegMeta.parseNum(endian, _binary_data, value_offset + 4, 4);
+                           value.push(new JpegMeta.Rational(num, den));
+                       }
+                       if (type == "SRATIONAL") {
+                           num = JpegMeta.parseSnum(endian, _binary_data, value_offset, 4);
+                           den = JpegMeta.parseSnum(endian, _binary_data, value_offset + 4, 4);
+                           value.push(new JpegMeta.Rational(num, den));
+                       }
+                       value.push();
+                   }
+                   if (num_values === 1) {
+                       value = value[0];
+                   }
+               }
+               if (tags[tag_field] !== undefined) {
+                       group._addProperty(tags[tag_field][1], tags[tag_field][0], value);
+               }
+           }
+       };
+
+       this.JpegMeta.JpegFile.prototype._jfifHandler = function _jfifHandler(mark, pos) {
+           if (this.jfif !== undefined) {
+               throw Error("Multiple JFIF segments found");
+           }
+           this._addMetaGroup("jfif", "JFIF");
+           this.jfif._addProperty("version_major", "Version Major", this._binary_data.charCodeAt(pos + 5));
+           this.jfif._addProperty("version_minor", "Version Minor", this._binary_data.charCodeAt(pos + 6));
+           this.jfif._addProperty("version", "JFIF Version", this.jfif.version_major.value + "." + this.jfif.version_minor.value);
+           this.jfif._addProperty("units", "Density Unit", this._binary_data.charCodeAt(pos + 7));
+           this.jfif._addProperty("Xdensity", "X density", JpegMeta.parseNum(">", this._binary_data, pos + 8, 2));
+           this.jfif._addProperty("Ydensity", "Y Density", JpegMeta.parseNum(">", this._binary_data, pos + 10, 2));
+           this.jfif._addProperty("Xthumbnail", "X Thumbnail", JpegMeta.parseNum(">", this._binary_data, pos + 12, 1));
+           this.jfif._addProperty("Ythumbnail", "Y Thumbnail", JpegMeta.parseNum(">", this._binary_data, pos + 13, 1));
+       };
+
+       /* Handle app0 segments */
+       this.JpegMeta.JpegFile.prototype._app0Handler = function app0Handler(mark, pos) {
+           var ident = this._binary_data.slice(pos, pos + 5);
+           if (ident == this._JFIF_IDENT) {
+               this._jfifHandler(mark, pos);
+           } else if (ident == this._JFXX_IDENT) {
+               /* Don't handle JFXX Ident yet */
+           } else {
+               /* Don't know about other idents */
+           }
+       };
+
+       /* Handle app1 segments */
+       this.JpegMeta.JpegFile.prototype._app1Handler = function _app1Handler(mark, pos) {
+           var ident = this._binary_data.slice(pos, pos + 5);
+           if (ident == this._EXIF_IDENT) {
+               this._exifHandler(mark, pos + 6);
+           } else {
+               /* Don't know about other idents */
+           }
+       };
+
+       /* Handle exif segments */
+       JpegMeta.JpegFile.prototype._exifHandler = function _exifHandler(mark, pos) {
+           if (this.exif !== undefined) {
+               throw new Error("Multiple JFIF segments found");
+           }
+           
+           /* Parse this TIFF header */
+           var endian;
+           var magic_field;
+           var ifd_offset;
+           var primary_ifd, exif_ifd, gps_ifd;
+           var endian_field = this._binary_data.slice(pos, pos + 2);
+           
+           /* Trivia: This 'I' is for Intel, the 'M' is for Motorola */
+           if (endian_field === "II") {
+               endian = "<";
+           } else if (endian_field === "MM") {
+               endian = ">";
+           } else {
+               throw new Error("Malformed TIFF meta-data. Unknown endianess: " + endian_field);
+           }
+           
+           magic_field = JpegMeta.parseNum(endian, this._binary_data, pos + 2, 2);
+           
+           if (magic_field !== 42) {
+               throw new Error("Malformed TIFF meta-data. Bad magic: " + magic_field);
+           }
+           
+           ifd_offset = JpegMeta.parseNum(endian, this._binary_data, pos + 4, 4);
+           
+           /* Parse 0th IFD */
+           this._parseIfd(endian, this._binary_data, pos, ifd_offset, this._tifftags, "tiff", "TIFF");
+           
+           if (this.tiff.ExifIfdPointer) {
+               this._parseIfd(endian, this._binary_data, pos, this.tiff.ExifIfdPointer.value, this._exiftags, "exif", "Exif");
+           }
+           
+           if (this.tiff.GPSInfoIfdPointer) {
+               this._parseIfd(endian, this._binary_data, pos, this.tiff.GPSInfoIfdPointer.value, this._gpstags, "gps", "GPS");
+               if (this.gps.GPSLatitude) {
+                   var latitude;
+                   latitude = this.gps.GPSLatitude.value[0].asFloat() + 
+                       (1 / 60) * this.gps.GPSLatitude.value[1].asFloat() + 
+                       (1 / 3600) * this.gps.GPSLatitude.value[2].asFloat();
+                   if (this.gps.GPSLatitudeRef.value === "S") {
+                       latitude = -latitude;
+                   }
+                   this.gps._addProperty("latitude", "Dec. Latitude", latitude);
+               }
+               if (this.gps.GPSLongitude) {
+                   var longitude;
+                   longitude = this.gps.GPSLongitude.value[0].asFloat() + 
+                       (1 / 60) * this.gps.GPSLongitude.value[1].asFloat() + 
+                       (1 / 3600) * this.gps.GPSLongitude.value[2].asFloat();
+                   if (this.gps.GPSLongitudeRef.value === "W") {
+                       longitude = -longitude;
+                   }
+                   this.gps._addProperty("longitude", "Dec. Longitude", longitude);
+               }
+           }
+       };
+
+}() );
diff --git a/resources/src/mediawiki.libs.pluralruleparser/export.js b/resources/src/mediawiki.libs.pluralruleparser/export.js
new file mode 100644 (file)
index 0000000..28449d3
--- /dev/null
@@ -0,0 +1,5 @@
+// Expose via module.exports
+module.exports = window.pluralRuleParser;
+
+// Back-compat: Also expose via mw.lib
+mediaWiki.libs.pluralRuleParser = window.pluralRuleParser;
diff --git a/resources/src/mediawiki.libs/CLDRPluralRuleParser.js b/resources/src/mediawiki.libs/CLDRPluralRuleParser.js
deleted file mode 100644 (file)
index 549a9ab..0000000
+++ /dev/null
@@ -1,596 +0,0 @@
-/* This is CLDRPluralRuleParser v1.1.3, ported to MediaWiki ResourceLoader */
-
-/**
-* CLDRPluralRuleParser.js
-* A parser engine for CLDR plural rules.
-*
-* Copyright 2012-2014 Santhosh Thottingal and other contributors
-* Released under the MIT license
-* http://opensource.org/licenses/MIT
-*
-* @source https://github.com/santhoshtr/CLDRPluralRuleParser
-* @author Santhosh Thottingal <santhosh.thottingal@gmail.com>
-* @author Timo Tijhof
-* @author Amir Aharoni
-*/
-
-( function ( mw ) {
-/**
- * Evaluates a plural rule in CLDR syntax for a number
- * @param {string} rule
- * @param {integer} number
- * @return {boolean} true if evaluation passed, false if evaluation failed.
- */
-
-function pluralRuleParser(rule, number) {
-       'use strict';
-
-       /*
-       Syntax: see http://unicode.org/reports/tr35/#Language_Plural_Rules
-       -----------------------------------------------------------------
-       condition     = and_condition ('or' and_condition)*
-               ('@integer' samples)?
-               ('@decimal' samples)?
-       and_condition = relation ('and' relation)*
-       relation      = is_relation | in_relation | within_relation
-       is_relation   = expr 'is' ('not')? value
-       in_relation   = expr (('not')? 'in' | '=' | '!=') range_list
-       within_relation = expr ('not')? 'within' range_list
-       expr          = operand (('mod' | '%') value)?
-       operand       = 'n' | 'i' | 'f' | 't' | 'v' | 'w'
-       range_list    = (range | value) (',' range_list)*
-       value         = digit+
-       digit         = 0|1|2|3|4|5|6|7|8|9
-       range         = value'..'value
-       samples       = sampleRange (',' sampleRange)* (',' ('…'|'...'))?
-       sampleRange   = decimalValue '~' decimalValue
-       decimalValue  = value ('.' value)?
-       */
-
-       // We don't evaluate the samples section of the rule. Ignore it.
-       rule = rule.split('@')[0].replace(/^\s*/, '').replace(/\s*$/, '');
-
-       if (!rule.length) {
-               // Empty rule or 'other' rule.
-               return true;
-       }
-
-       // Indicates the current position in the rule as we parse through it.
-       // Shared among all parsing functions below.
-       var pos = 0,
-               operand,
-               expression,
-               relation,
-               result,
-               whitespace = makeRegexParser(/^\s+/),
-               value = makeRegexParser(/^\d+/),
-               _n_ = makeStringParser('n'),
-               _i_ = makeStringParser('i'),
-               _f_ = makeStringParser('f'),
-               _t_ = makeStringParser('t'),
-               _v_ = makeStringParser('v'),
-               _w_ = makeStringParser('w'),
-               _is_ = makeStringParser('is'),
-               _isnot_ = makeStringParser('is not'),
-               _isnot_sign_ = makeStringParser('!='),
-               _equal_ = makeStringParser('='),
-               _mod_ = makeStringParser('mod'),
-               _percent_ = makeStringParser('%'),
-               _not_ = makeStringParser('not'),
-               _in_ = makeStringParser('in'),
-               _within_ = makeStringParser('within'),
-               _range_ = makeStringParser('..'),
-               _comma_ = makeStringParser(','),
-               _or_ = makeStringParser('or'),
-               _and_ = makeStringParser('and');
-
-       function debug() {
-               // console.log.apply(console, arguments);
-       }
-
-       debug('pluralRuleParser', rule, number);
-
-       // Try parsers until one works, if none work return null
-       function choice(parserSyntax) {
-               return function() {
-                       var i, result;
-
-                       for (i = 0; i < parserSyntax.length; i++) {
-                               result = parserSyntax[i]();
-
-                               if (result !== null) {
-                                       return result;
-                               }
-                       }
-
-                       return null;
-               };
-       }
-
-       // Try several parserSyntax-es in a row.
-       // All must succeed; otherwise, return null.
-       // This is the only eager one.
-       function sequence(parserSyntax) {
-               var i, parserRes,
-                       originalPos = pos,
-                       result = [];
-
-               for (i = 0; i < parserSyntax.length; i++) {
-                       parserRes = parserSyntax[i]();
-
-                       if (parserRes === null) {
-                               pos = originalPos;
-
-                               return null;
-                       }
-
-                       result.push(parserRes);
-               }
-
-               return result;
-       }
-
-       // Run the same parser over and over until it fails.
-       // Must succeed a minimum of n times; otherwise, return null.
-       function nOrMore(n, p) {
-               return function() {
-                       var originalPos = pos,
-                               result = [],
-                               parsed = p();
-
-                       while (parsed !== null) {
-                               result.push(parsed);
-                               parsed = p();
-                       }
-
-                       if (result.length < n) {
-                               pos = originalPos;
-
-                               return null;
-                       }
-
-                       return result;
-               };
-       }
-
-       // Helpers - just make parserSyntax out of simpler JS builtin types
-       function makeStringParser(s) {
-               var len = s.length;
-
-               return function() {
-                       var result = null;
-
-                       if (rule.substr(pos, len) === s) {
-                               result = s;
-                               pos += len;
-                       }
-
-                       return result;
-               };
-       }
-
-       function makeRegexParser(regex) {
-               return function() {
-                       var matches = rule.substr(pos).match(regex);
-
-                       if (matches === null) {
-                               return null;
-                       }
-
-                       pos += matches[0].length;
-
-                       return matches[0];
-               };
-       }
-
-       /**
-        * Integer digits of n.
-        */
-       function i() {
-               var result = _i_();
-
-               if (result === null) {
-                       debug(' -- failed i', parseInt(number, 10));
-
-                       return result;
-               }
-
-               result = parseInt(number, 10);
-               debug(' -- passed i ', result);
-
-               return result;
-       }
-
-       /**
-        * Absolute value of the source number (integer and decimals).
-        */
-       function n() {
-               var result = _n_();
-
-               if (result === null) {
-                       debug(' -- failed n ', number);
-
-                       return result;
-               }
-
-               result = parseFloat(number, 10);
-               debug(' -- passed n ', result);
-
-               return result;
-       }
-
-       /**
-        * Visible fractional digits in n, with trailing zeros.
-        */
-       function f() {
-               var result = _f_();
-
-               if (result === null) {
-                       debug(' -- failed f ', number);
-
-                       return result;
-               }
-
-               result = (number + '.').split('.')[1] || 0;
-               debug(' -- passed f ', result);
-
-               return result;
-       }
-
-       /**
-        * Visible fractional digits in n, without trailing zeros.
-        */
-       function t() {
-               var result = _t_();
-
-               if (result === null) {
-                       debug(' -- failed t ', number);
-
-                       return result;
-               }
-
-               result = (number + '.').split('.')[1].replace(/0$/, '') || 0;
-               debug(' -- passed t ', result);
-
-               return result;
-       }
-
-       /**
-        * Number of visible fraction digits in n, with trailing zeros.
-        */
-       function v() {
-               var result = _v_();
-
-               if (result === null) {
-                       debug(' -- failed v ', number);
-
-                       return result;
-               }
-
-               result = (number + '.').split('.')[1].length || 0;
-               debug(' -- passed v ', result);
-
-               return result;
-       }
-
-       /**
-        * Number of visible fraction digits in n, without trailing zeros.
-        */
-       function w() {
-               var result = _w_();
-
-               if (result === null) {
-                       debug(' -- failed w ', number);
-
-                       return result;
-               }
-
-               result = (number + '.').split('.')[1].replace(/0$/, '').length || 0;
-               debug(' -- passed w ', result);
-
-               return result;
-       }
-
-       // operand       = 'n' | 'i' | 'f' | 't' | 'v' | 'w'
-       operand = choice([n, i, f, t, v, w]);
-
-       // expr          = operand (('mod' | '%') value)?
-       expression = choice([mod, operand]);
-
-       function mod() {
-               var result = sequence(
-                       [operand, whitespace, choice([_mod_, _percent_]), whitespace, value]
-               );
-
-               if (result === null) {
-                       debug(' -- failed mod');
-
-                       return null;
-               }
-
-               debug(' -- passed ' + parseInt(result[0], 10) + ' ' + result[2] + ' ' + parseInt(result[4], 10));
-
-               return parseInt(result[0], 10) % parseInt(result[4], 10);
-       }
-
-       function not() {
-               var result = sequence([whitespace, _not_]);
-
-               if (result === null) {
-                       debug(' -- failed not');
-
-                       return null;
-               }
-
-               return result[1];
-       }
-
-       // is_relation   = expr 'is' ('not')? value
-       function is() {
-               var result = sequence([expression, whitespace, choice([_is_]), whitespace, value]);
-
-               if (result !== null) {
-                       debug(' -- passed is : ' + result[0] + ' == ' + parseInt(result[4], 10));
-
-                       return result[0] === parseInt(result[4], 10);
-               }
-
-               debug(' -- failed is');
-
-               return null;
-       }
-
-       // is_relation   = expr 'is' ('not')? value
-       function isnot() {
-               var result = sequence(
-                       [expression, whitespace, choice([_isnot_, _isnot_sign_]), whitespace, value]
-               );
-
-               if (result !== null) {
-                       debug(' -- passed isnot: ' + result[0] + ' != ' + parseInt(result[4], 10));
-
-                       return result[0] !== parseInt(result[4], 10);
-               }
-
-               debug(' -- failed isnot');
-
-               return null;
-       }
-
-       function not_in() {
-               var i, range_list,
-                       result = sequence([expression, whitespace, _isnot_sign_, whitespace, rangeList]);
-
-               if (result !== null) {
-                       debug(' -- passed not_in: ' + result[0] + ' != ' + result[4]);
-                       range_list = result[4];
-
-                       for (i = 0; i < range_list.length; i++) {
-                               if (parseInt(range_list[i], 10) === parseInt(result[0], 10)) {
-                                       return false;
-                               }
-                       }
-
-                       return true;
-               }
-
-               debug(' -- failed not_in');
-
-               return null;
-       }
-
-       // range_list    = (range | value) (',' range_list)*
-       function rangeList() {
-               var result = sequence([choice([range, value]), nOrMore(0, rangeTail)]),
-                       resultList = [];
-
-               if (result !== null) {
-                       resultList = resultList.concat(result[0]);
-
-                       if (result[1][0]) {
-                               resultList = resultList.concat(result[1][0]);
-                       }
-
-                       return resultList;
-               }
-
-               debug(' -- failed rangeList');
-
-               return null;
-       }
-
-       function rangeTail() {
-               // ',' range_list
-               var result = sequence([_comma_, rangeList]);
-
-               if (result !== null) {
-                       return result[1];
-               }
-
-               debug(' -- failed rangeTail');
-
-               return null;
-       }
-
-       // range         = value'..'value
-       function range() {
-               var i, array, left, right,
-                       result = sequence([value, _range_, value]);
-
-               if (result !== null) {
-                       debug(' -- passed range');
-
-                       array = [];
-                       left = parseInt(result[0], 10);
-                       right = parseInt(result[2], 10);
-
-                       for (i = left; i <= right; i++) {
-                               array.push(i);
-                       }
-
-                       return array;
-               }
-
-               debug(' -- failed range');
-
-               return null;
-       }
-
-       function _in() {
-               var result, range_list, i;
-
-               // in_relation   = expr ('not')? 'in' range_list
-               result = sequence(
-                       [expression, nOrMore(0, not), whitespace, choice([_in_, _equal_]), whitespace, rangeList]
-               );
-
-               if (result !== null) {
-                       debug(' -- passed _in:' + result);
-
-                       range_list = result[5];
-
-                       for (i = 0; i < range_list.length; i++) {
-                               if (parseInt(range_list[i], 10) === parseInt(result[0], 10)) {
-                                       return (result[1][0] !== 'not');
-                               }
-                       }
-
-                       return (result[1][0] === 'not');
-               }
-
-               debug(' -- failed _in ');
-
-               return null;
-       }
-
-       /**
-        * The difference between "in" and "within" is that
-        * "in" only includes integers in the specified range,
-        * while "within" includes all values.
-        */
-       function within() {
-               var range_list, result;
-
-               // within_relation = expr ('not')? 'within' range_list
-               result = sequence(
-                       [expression, nOrMore(0, not), whitespace, _within_, whitespace, rangeList]
-               );
-
-               if (result !== null) {
-                       debug(' -- passed within');
-
-                       range_list = result[5];
-
-                       if ((result[0] >= parseInt(range_list[0], 10)) &&
-                               (result[0] < parseInt(range_list[range_list.length - 1], 10))) {
-
-                               return (result[1][0] !== 'not');
-                       }
-
-                       return (result[1][0] === 'not');
-               }
-
-               debug(' -- failed within ');
-
-               return null;
-       }
-
-       // relation      = is_relation | in_relation | within_relation
-       relation = choice([is, not_in, isnot, _in, within]);
-
-       // and_condition = relation ('and' relation)*
-       function and() {
-               var i,
-                       result = sequence([relation, nOrMore(0, andTail)]);
-
-               if (result) {
-                       if (!result[0]) {
-                               return false;
-                       }
-
-                       for (i = 0; i < result[1].length; i++) {
-                               if (!result[1][i]) {
-                                       return false;
-                               }
-                       }
-
-                       return true;
-               }
-
-               debug(' -- failed and');
-
-               return null;
-       }
-
-       // ('and' relation)*
-       function andTail() {
-               var result = sequence([whitespace, _and_, whitespace, relation]);
-
-               if (result !== null) {
-                       debug(' -- passed andTail' + result);
-
-                       return result[3];
-               }
-
-               debug(' -- failed andTail');
-
-               return null;
-
-       }
-       //  ('or' and_condition)*
-       function orTail() {
-               var result = sequence([whitespace, _or_, whitespace, and]);
-
-               if (result !== null) {
-                       debug(' -- passed orTail: ' + result[3]);
-
-                       return result[3];
-               }
-
-               debug(' -- failed orTail');
-
-               return null;
-       }
-
-       // condition     = and_condition ('or' and_condition)*
-       function condition() {
-               var i,
-                       result = sequence([and, nOrMore(0, orTail)]);
-
-               if (result) {
-                       for (i = 0; i < result[1].length; i++) {
-                               if (result[1][i]) {
-                                       return true;
-                               }
-                       }
-
-                       return result[0];
-               }
-
-               return false;
-       }
-
-       result = condition();
-
-       /**
-        * For success, the pos must have gotten to the end of the rule
-        * and returned a non-null.
-        * n.b. This is part of language infrastructure,
-        * so we do not throw an internationalizable message.
-        */
-       if (result === null) {
-               throw new Error('Parse error at position ' + pos.toString() + ' for rule: ' + rule);
-       }
-
-       if (pos !== rule.length) {
-               debug('Warning: Rule not parsed completely. Parser stopped at ' + rule.substr(0, pos) + ' for rule: ' + rule);
-       }
-
-       return result;
-}
-
-/* pluralRuleParser ends here */
-mw.libs.pluralRuleParser = pluralRuleParser;
-module.exports = pluralRuleParser;
-
-} )( mediaWiki );
diff --git a/resources/src/mediawiki.libs/mediawiki.libs.jpegmeta.js b/resources/src/mediawiki.libs/mediawiki.libs.jpegmeta.js
deleted file mode 100644 (file)
index d837420..0000000
+++ /dev/null
@@ -1,742 +0,0 @@
-/**
- * This is JsJpegMeta v1.0
- * From: https://code.google.com/p/jsjpegmeta/downloads/list
- * From: https://github.com/bennoleslie/jsjpegmeta/blob/v1.0.0/jpegmeta.js
- *
- * Ported to MediaWiki ResourceLoader by Bryan Tong Minh
- * Changes:
- * - Add closure.
- * - Add this.JpegMeta assignment to expose it as global.
- * - Add export as module.
- * - Add mw.libs.jpegmeta wrapper.
- */
-
-( function ( mw ) {
-       /*
-       Copyright (c) 2009 Ben Leslie
-       
-       Permission is hereby granted, free of charge, to any person obtaining a copy
-       of this software and associated documentation files (the "Software"), to deal
-       in the Software without restriction, including without limitation the rights
-       to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-       copies of the Software, and to permit persons to whom the Software is
-       furnished to do so, subject to the following conditions:
-       
-       The above copyright notice and this permission notice shall be included in
-       all copies or substantial portions of the Software.
-       
-       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-       IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-       AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-       LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-       OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-       THE SOFTWARE.
-       */
-       
-       /*
-        This JavaScript library is used to parse meta-data from files 
-        with mime-type image/jpeg.
-       
-        Include it with something like:
-       
-          <script type="text/javascript" src="jpegmeta.js"></script>
-       
-        This adds a single 'module' object called 'JpegMeta' to the global
-        namespace.
-       
-        Public Functions
-        ----------------
-        JpegMeta.parseNum - parse unsigned integers from binary data
-        JpegMeta.parseSnum - parse signed integers from binary data
-       
-        Public Classes
-        --------------
-        JpegMeta.Rational - A rational number class
-        JpegMeta.JfifSegment
-        JpegMeta.ExifSegment
-        JpegMeta.JpegFile - Primary class for Javascript parsing
-       */
-
-       var JpegMeta = {};
-       // MediaWiki: Expose as global
-       this.JpegMeta = JpegMeta;
-       
-       /* 
-          parse an unsigned number of size bytes at offset in some binary string data.
-          If endian
-          is "<" parse the data as little endian, if endian
-          is ">" parse as big-endian.
-       */
-       JpegMeta.parseNum = function parseNum(endian, data, offset, size) {
-           var i;
-           var ret;
-           var big_endian = (endian === ">");
-           if (offset === undefined) offset = 0;
-           if (size === undefined) size = data.length - offset;
-           for (big_endian ? i = offset : i = offset + size - 1; 
-                big_endian ? i < offset + size : i >= offset; 
-                big_endian ? i++ : i--) {
-               ret <<= 8;
-               ret += data.charCodeAt(i);
-           }
-           return ret;
-       };
-       
-       /* 
-          parse an signed number of size bytes at offset in some binary string data.
-          If endian
-          is "<" parse the data as little endian, if endian
-          is ">" parse as big-endian.
-       */
-       JpegMeta.parseSnum = function parseSnum(endian, data, offset, size) {
-           var i;
-           var ret;
-           var neg;
-           var big_endian = (endian === ">");
-           if (offset === undefined) offset = 0;
-           if (size === undefined) size = data.length - offset;
-           for (big_endian ? i = offset : i = offset + size - 1; 
-                big_endian ? i < offset + size : i >= offset; 
-                big_endian ? i++ : i--) {
-               if (neg === undefined) {
-                   /* Negative if top bit is set */
-                   neg = (data.charCodeAt(i) & 0x80) === 0x80;
-               }
-               ret <<= 8;
-               /* If it is negative we invert the bits */
-               ret += neg ? ~data.charCodeAt(i) & 0xff: data.charCodeAt(i);
-           }
-           if (neg) {
-               /* If it is negative we do two's complement */
-               ret += 1;
-               ret *= -1;
-           }
-           return ret;
-       };
-       
-       /* Rational number class */
-       JpegMeta.Rational = function Rational(num, den)
-       {
-           this.num = num;
-           this.den = den || 1;
-           return this;
-       };
-       
-       /* Rational number methods */
-       JpegMeta.Rational.prototype.toString = function toString() {
-           if (this.num === 0) {
-               return "" + this.num;
-           }
-           if (this.den === 1) {
-               return "" + this.num;
-           }
-           if (this.num === 1) {
-               return this.num + " / " + this.den;
-           }
-           return this.num / this.den; // + "/" + this.den;
-       };
-       
-       JpegMeta.Rational.prototype.asFloat = function asFloat() {
-           return this.num / this.den;
-       };
-       
-       /* MetaGroup class */
-       JpegMeta.MetaGroup = function MetaGroup(fieldName, description) {
-           this.fieldName = fieldName;
-           this.description = description;
-           this.metaProps = {};
-           return this;
-       };
-       
-       JpegMeta.MetaGroup.prototype._addProperty = function _addProperty(fieldName, description, value) {
-           var property = new JpegMeta.MetaProp(fieldName, description, value);
-           this[property.fieldName] = property;
-           this.metaProps[property.fieldName] = property;
-       };
-       
-       JpegMeta.MetaGroup.prototype.toString = function toString() {
-           return "[MetaGroup " + this.description + "]";
-       };
-
-       /* MetaProp class */
-       JpegMeta.MetaProp = function MetaProp(fieldName, description, value) {
-           this.fieldName = fieldName;
-           this.description = description;
-           this.value = value;
-           return this;
-       };
-       
-       JpegMeta.MetaProp.prototype.toString = function toString() {
-           return "" + this.value;
-       };
-
-       /* JpegFile class */
-       JpegMeta.JpegFile = function JpegFile(binary_data, filename) {
-           /* Change this to EOI if we want to parse. */
-           var break_segment = this._SOS;
-           
-           this.metaGroups = {};
-           this._binary_data = binary_data;
-           this.filename = filename;
-           
-           /* Go through and parse. */
-           var pos = 0;
-           var pos_start_of_segment = 0;
-           var delim;
-           var mark;
-           var _mark;
-           var segsize;
-           var headersize;
-           var mark_code;
-           var mark_fn;
-       
-           /* Check to see if this looks like a JPEG file */
-           if (this._binary_data.slice(0, 2) !== this._SOI_MARKER) {
-               throw new Error("Doesn't look like a JPEG file. First two bytes are " + 
-                               this._binary_data.charCodeAt(0) + "," + 
-                               this._binary_data.charCodeAt(1) + ".");
-           }
-           
-           pos += 2;
-           
-           while (pos < this._binary_data.length) {
-               delim = this._binary_data.charCodeAt(pos++);
-               mark = this._binary_data.charCodeAt(pos++);
-               
-               pos_start_of_segment = pos;
-               
-               if (delim != this._DELIM) {
-                   break;
-               }
-               
-               if (mark === break_segment) {
-                   break;
-               }
-               
-               headersize = JpegMeta.parseNum(">", this._binary_data, pos, 2);
-               
-               /* Find the end */
-               pos += headersize;
-               while (pos < this._binary_data.length) {
-                   delim = this._binary_data.charCodeAt(pos++);
-                   if (delim == this._DELIM) {
-                       _mark = this._binary_data.charCodeAt(pos++);
-                       if (_mark != 0x0) {
-                           pos -= 2;
-                           break;
-                       }
-                   }
-               }
-               
-               segsize = pos - pos_start_of_segment;
-               
-               if (this._markers[mark]) {
-                   mark_code = this._markers[mark][0];
-                   mark_fn = this._markers[mark][1];
-               } else {
-                   mark_code = "UNKN";
-                   mark_fn = undefined;
-               }
-               
-               if (mark_fn) {
-                   this[mark_fn](mark, pos_start_of_segment + 2);
-               }
-               
-           }
-           
-           if (this.general === undefined) {
-               throw Error("Invalid JPEG file.");
-           }
-           
-           return this;
-       };
-       
-       this.JpegMeta.JpegFile.prototype.toString = function () {
-           return "[JpegFile " + this.filename + " " + 
-               this.general.type + " " + 
-               this.general.pixelWidth + "x" + 
-               this.general.pixelHeight +
-               " Depth: " + this.general.depth + "]";
-       };
-       
-       /* Some useful constants */
-       this.JpegMeta.JpegFile.prototype._SOI_MARKER = '\xff\xd8';
-       this.JpegMeta.JpegFile.prototype._DELIM = 0xff;
-       this.JpegMeta.JpegFile.prototype._EOI = 0xd9;
-       this.JpegMeta.JpegFile.prototype._SOS = 0xda;
-       
-       this.JpegMeta.JpegFile.prototype._sofHandler = function _sofHandler (mark, pos) {
-           if (this.general !== undefined) {
-               throw Error("Unexpected multiple-frame image");
-           }
-       
-           this._addMetaGroup("general", "General");
-           this.general._addProperty("depth", "Depth", JpegMeta.parseNum(">", this._binary_data, pos, 1));
-           this.general._addProperty("pixelHeight", "Pixel Height", JpegMeta.parseNum(">", this._binary_data, pos + 1, 2));
-           this.general._addProperty("pixelWidth", "Pixel Width",JpegMeta.parseNum(">", this._binary_data, pos + 3, 2));
-           this.general._addProperty("type", "Type", this._markers[mark][2]);
-       };
-       
-       /* JFIF idents */
-       this.JpegMeta.JpegFile.prototype._JFIF_IDENT = "JFIF\x00";
-       this.JpegMeta.JpegFile.prototype._JFXX_IDENT = "JFXX\x00";
-       
-       /* Exif idents */
-       this.JpegMeta.JpegFile.prototype._EXIF_IDENT = "Exif\x00";
-       
-       /* TIFF types */
-       this.JpegMeta.JpegFile.prototype._types = {
-           /* The format is identifier : ["type name", type_size_in_bytes ] */
-           1 : ["BYTE", 1],
-           2 : ["ASCII", 1],
-           3 : ["SHORT", 2],
-           4 : ["LONG", 4],
-           5 : ["RATIONAL", 8],
-           6 : ["SBYTE", 1],
-           7 : ["UNDEFINED", 1],
-           8 : ["SSHORT", 2],
-           9 : ["SLONG", 4],
-           10 : ["SRATIONAL", 8],
-           11 : ["FLOAT", 4],
-           12 : ["DOUBLE", 8]
-       };
-       
-       this.JpegMeta.JpegFile.prototype._tifftags = {
-           /* A. Tags relating to image data structure */
-           256 : ["Image width", "ImageWidth"],
-           257 : ["Image height", "ImageLength"],
-           258 : ["Number of bits per component", "BitsPerSample"],
-           259 : ["Compression scheme", "Compression", 
-                  {1 : "uncompressed", 6 : "JPEG compression" }],
-           262 : ["Pixel composition", "PhotmetricInerpretation",
-                  {2 : "RGB", 6 : "YCbCr"}],
-           274 : ["Orientation of image", "Orientation",
-                  /* FIXME: Check the mirror-image / reverse encoding and rotation */
-                  {1 : "Normal", 2 : "Reverse?", 
-                   3 : "Upside-down", 4 : "Upside-down Reverse",
-                   5 : "90 degree CW", 6 : "90 degree CW reverse",
-                   7 : "90 degree CCW", 8 : "90 degree CCW reverse"}],
-           277 : ["Number of components", "SamplesPerPixel"],
-           284 : ["Image data arrangement", "PlanarConfiguration",
-                  {1 : "chunky format", 2 : "planar format"}],
-           530 : ["Subsampling ratio of Y to C", "YCbCrSubSampling"],
-           531 : ["Y and C positioning", "YCbCrPositioning",
-                  {1 : "centered", 2 : "co-sited"}],
-           282 : ["X Resolution", "XResolution"],
-           283 : ["Y Resolution", "YResolution"],
-           296 : ["Resolution Unit", "ResolutionUnit",
-                  {2 : "inches", 3 : "centimeters"}],
-           /* B. Tags realting to recording offset */
-           273 : ["Image data location", "StripOffsets"],
-           278 : ["Number of rows per strip", "RowsPerStrip"],
-           279 : ["Bytes per compressed strip", "StripByteCounts"],
-           513 : ["Offset to JPEG SOI", "JPEGInterchangeFormat"],
-           514 : ["Bytes of JPEG Data", "JPEGInterchangeFormatLength"],
-           /* C. Tags relating to image data characteristics */
-           301 : ["Transfer function", "TransferFunction"],
-           318 : ["White point chromaticity", "WhitePoint"],
-           319 : ["Chromaticities of primaries", "PrimaryChromaticities"],
-           529 : ["Color space transformation matrix coefficients", "YCbCrCoefficients"],
-           532 : ["Pair of black and white reference values", "ReferenceBlackWhite"],
-           /* D. Other tags */
-           306 : ["Date and time", "DateTime"],
-           270 : ["Image title", "ImageDescription"],
-           271 : ["Make", "Make"],
-           272 : ["Model", "Model"],
-           305 : ["Software", "Software"],
-           315 : ["Person who created the image", "Artist"],
-           316 : ["Host Computer", "HostComputer"],
-           33432 : ["Copyright holder", "Copyright"],
-           
-           34665 : ["Exif tag", "ExifIfdPointer"],
-           34853 : ["GPS tag", "GPSInfoIfdPointer"]
-       };
-       
-       this.JpegMeta.JpegFile.prototype._exiftags = {
-           /* Tag Support Levels (2) - 0th IFX Exif Private Tags */
-           /* A. Tags Relating to Version */
-           36864 : ["Exif Version", "ExifVersion"],
-           40960 : ["FlashPix Version", "FlashpixVersion"],
-           
-           /* B. Tag Relating to Image Data Characteristics */
-           40961 : ["Color Space", "ColorSpace"],
-           
-           /* C. Tags Relating to Image Configuration */
-           37121 : ["Meaning of each component", "ComponentsConfiguration"],
-           37122 : ["Compressed Bits Per Pixel", "CompressedBitsPerPixel"],
-           40962 : ["Pixel X Dimension", "PixelXDimension"],
-           40963 : ["Pixel Y Dimension", "PixelYDimension"],
-           
-           /* D. Tags Relating to User Information */
-           37500 : ["Manufacturer notes", "MakerNote"],
-           37510 : ["User comments", "UserComment"],
-           
-           /* E. Tag Relating to Related File Information */
-           40964 : ["Related audio file", "RelatedSoundFile"],
-           
-           /* F. Tags Relating to Date and Time */
-           36867 : ["Date Time Original", "DateTimeOriginal"],
-           36868 : ["Date Time Digitized", "DateTimeDigitized"],
-           37520 : ["DateTime subseconds", "SubSecTime"],
-           37521 : ["DateTimeOriginal subseconds", "SubSecTimeOriginal"],
-           37522 : ["DateTimeDigitized subseconds", "SubSecTimeDigitized"],
-           
-           /* G. Tags Relating to Picture-Taking Conditions */
-           33434 : ["Exposure time", "ExposureTime"],
-           33437 : ["FNumber", "FNumber"],
-           34850 : ["Exposure program", "ExposureProgram"],
-           34852 : ["Spectral sensitivity", "SpectralSensitivity"],
-           34855 : ["ISO Speed Ratings", "ISOSpeedRatings"],
-           34856 : ["Optoelectric coefficient", "OECF"],
-           37377 : ["Shutter Speed",  "ShutterSpeedValue"],
-           37378 : ["Aperture Value", "ApertureValue"],
-           37379 : ["Brightness", "BrightnessValue"],
-           37380 : ["Exposure Bias Value", "ExposureBiasValue"],
-           37381 : ["Max Aperture Value", "MaxApertureValue"],
-           37382 : ["Subject Distance", "SubjectDistance"],
-           37383 : ["Metering Mode", "MeteringMode"],
-           37384 : ["Light Source", "LightSource"],
-           37385 : ["Flash", "Flash"],
-           37386 : ["Focal Length", "FocalLength"],
-           37396 : ["Subject Area", "SubjectArea"],
-           41483 : ["Flash Energy", "FlashEnergy"],
-           41484 : ["Spatial Frequency Response", "SpatialFrequencyResponse"],
-           41486 : ["Focal Plane X Resolution", "FocalPlaneXResolution"],
-           41487 : ["Focal Plane Y Resolution", "FocalPlaneYResolution"],
-           41488 : ["Focal Plane Resolution Unit", "FocalPlaneResolutionUnit"],
-           41492 : ["Subject Location", "SubjectLocation"],
-           41493 : ["Exposure Index", "ExposureIndex"],
-           41495 : ["Sensing Method", "SensingMethod"],
-           41728 : ["File Source", "FileSource"],
-           41729 : ["Scene Type", "SceneType"],
-           41730 : ["CFA Pattern", "CFAPattern"],
-           41985 : ["Custom Rendered", "CustomRendered"],
-           41986 : ["Exposure Mode", "Exposure Mode"],
-           41987 : ["White Balance", "WhiteBalance"],
-           41988 : ["Digital Zoom Ratio", "DigitalZoomRatio"],
-           41990 : ["Scene Capture Type", "SceneCaptureType"],
-           41991 : ["Gain Control", "GainControl"],
-           41992 : ["Contrast", "Contrast"],
-           41993 : ["Saturation", "Saturation"],
-           41994 : ["Sharpness", "Sharpness"],
-           41995 : ["Device settings description", "DeviceSettingDescription"],
-           41996 : ["Subject distance range", "SubjectDistanceRange"],
-           
-           /* H. Other Tags */
-           42016 : ["Unique image ID", "ImageUniqueID"],
-           
-           40965 : ["Interoperability tag", "InteroperabilityIFDPointer"]
-       };
-       
-       this.JpegMeta.JpegFile.prototype._gpstags = {
-           /* A. Tags Relating to GPS */
-           0 : ["GPS tag version", "GPSVersionID"],
-           1 : ["North or South Latitude", "GPSLatitudeRef"],
-           2 : ["Latitude", "GPSLatitude"],
-           3 : ["East or West Longitude", "GPSLongitudeRef"],
-           4 : ["Longitude", "GPSLongitude"],
-           5 : ["Altitude reference", "GPSAltitudeRef"],
-           6 : ["Altitude", "GPSAltitude"],
-           7 : ["GPS time (atomic clock)", "GPSTimeStamp"],
-           8 : ["GPS satellites usedd for measurement", "GPSSatellites"],
-           9 : ["GPS receiver status", "GPSStatus"],
-           10 : ["GPS mesaurement mode", "GPSMeasureMode"],
-           11 : ["Measurement precision", "GPSDOP"],
-           12 : ["Speed unit", "GPSSpeedRef"],
-           13 : ["Speed of GPS receiver", "GPSSpeed"],
-           14 : ["Reference for direction of movement", "GPSTrackRef"],
-           15 : ["Direction of movement", "GPSTrack"],
-           16 : ["Reference for direction of image", "GPSImgDirectionRef"],
-           17 : ["Direction of image", "GPSImgDirection"],
-           18 : ["Geodetic survey data used", "GPSMapDatum"],
-           19 : ["Reference for latitude of destination", "GPSDestLatitudeRef"],
-           20 : ["Latitude of destination", "GPSDestLatitude"],
-           21 : ["Reference for longitude of destination", "GPSDestLongitudeRef"],
-           22 : ["Longitude of destination", "GPSDestLongitude"],
-           23 : ["Reference for bearing of destination", "GPSDestBearingRef"],
-           24 : ["Bearing of destination", "GPSDestBearing"],
-           25 : ["Reference for distance to destination", "GPSDestDistanceRef"],
-           26 : ["Distance to destination", "GPSDestDistance"],
-           27 : ["Name of GPS processing method", "GPSProcessingMethod"],
-           28 : ["Name of GPS area", "GPSAreaInformation"],
-           29 : ["GPS Date", "GPSDateStamp"],
-           30 : ["GPS differential correction", "GPSDifferential"]
-       };
-
-       this.JpegMeta.JpegFile.prototype._markers = {
-           /* Start Of Frame markers, non-differential, Huffman coding */
-           0xc0: ["SOF0", "_sofHandler", "Baseline DCT"],
-           0xc1: ["SOF1", "_sofHandler", "Extended sequential DCT"],
-           0xc2: ["SOF2", "_sofHandler", "Progressive DCT"],
-           0xc3: ["SOF3", "_sofHandler", "Lossless (sequential)"],
-           
-           /* Start Of Frame markers, differential, Huffman coding */
-           0xc5: ["SOF5", "_sofHandler", "Differential sequential DCT"],
-           0xc6: ["SOF6", "_sofHandler", "Differential progressive DCT"],
-           0xc7: ["SOF7", "_sofHandler", "Differential lossless (sequential)"],
-           
-           /* Start Of Frame markers, non-differential, arithmetic coding */
-           0xc8: ["JPG", null, "Reserved for JPEG extensions"],
-           0xc9: ["SOF9", "_sofHandler", "Extended sequential DCT"],
-           0xca: ["SOF10", "_sofHandler", "Progressive DCT"],
-           0xcb: ["SOF11", "_sofHandler", "Lossless (sequential)"],
-           
-           /* Start Of Frame markers, differential, arithmetic coding */
-           0xcd: ["SOF13", "_sofHandler", "Differential sequential DCT"],
-           0xce: ["SOF14", "_sofHandler", "Differential progressive DCT"],
-           0xcf: ["SOF15", "_sofHandler", "Differential lossless (sequential)"],
-           
-           /* Huffman table specification */
-           0xc4: ["DHT", null, "Define Huffman table(s)"],
-           0xcc: ["DAC", null, "Define arithmetic coding conditioning(s)"],
-           
-           /* Restart interval termination" */
-           0xd0: ["RST0", null, "Restart with modulo 8 count “0”"],
-           0xd1: ["RST1", null, "Restart with modulo 8 count “1”"],
-           0xd2: ["RST2", null, "Restart with modulo 8 count “2”"],
-           0xd3: ["RST3", null, "Restart with modulo 8 count “3”"],
-           0xd4: ["RST4", null, "Restart with modulo 8 count “4”"],
-           0xd5: ["RST5", null, "Restart with modulo 8 count “5”"],
-           0xd6: ["RST6", null, "Restart with modulo 8 count “6”"],
-           0xd7: ["RST7", null, "Restart with modulo 8 count “7”"],
-           
-           /* Other markers */
-           0xd8: ["SOI", null, "Start of image"],
-           0xd9: ["EOI", null, "End of image"],
-           0xda: ["SOS", null, "Start of scan"],
-           0xdb: ["DQT", null, "Define quantization table(s)"],
-           0xdc: ["DNL", null, "Define number of lines"],
-           0xdd: ["DRI", null, "Define restart interval"],
-           0xde: ["DHP", null, "Define hierarchical progression"],
-           0xdf: ["EXP", null, "Expand reference component(s)"],
-           0xe0: ["APP0", "_app0Handler", "Reserved for application segments"],
-           0xe1: ["APP1", "_app1Handler"],
-           0xe2: ["APP2", null],
-           0xe3: ["APP3", null],
-           0xe4: ["APP4", null],
-           0xe5: ["APP5", null],
-           0xe6: ["APP6", null],
-           0xe7: ["APP7", null],
-           0xe8: ["APP8", null],
-           0xe9: ["APP9", null],
-           0xea: ["APP10", null],
-           0xeb: ["APP11", null],
-           0xec: ["APP12", null],
-           0xed: ["APP13", null],
-           0xee: ["APP14", null],
-           0xef: ["APP15", null],
-           0xf0: ["JPG0", null], /* Reserved for JPEG extensions */
-           0xf1: ["JPG1", null],
-           0xf2: ["JPG2", null],
-           0xf3: ["JPG3", null],
-           0xf4: ["JPG4", null],
-           0xf5: ["JPG5", null],
-           0xf6: ["JPG6", null],
-           0xf7: ["JPG7", null],
-           0xf8: ["JPG8", null],
-           0xf9: ["JPG9", null],
-           0xfa: ["JPG10", null],
-           0xfb: ["JPG11", null],
-           0xfc: ["JPG12", null],
-           0xfd: ["JPG13", null],
-           0xfe: ["COM", null], /* Comment */
-           
-           /* Reserved markers */
-           0x01: ["JPG13", null] /* For temporary private use in arithmetic coding */
-           /* 02 -> bf are reserverd */
-       };
-
-       /* Private methods */
-       this.JpegMeta.JpegFile.prototype._addMetaGroup = function _addMetaGroup(name, description) {
-           var group = new JpegMeta.MetaGroup(name, description);
-           this[group.fieldName] = group;
-           this.metaGroups[group.fieldName] = group;
-           return group;
-       };
-
-       this.JpegMeta.JpegFile.prototype._parseIfd = function _parseIfd(endian, _binary_data, base, ifd_offset, tags, name, description) {
-           var num_fields = JpegMeta.parseNum(endian, _binary_data, base + ifd_offset, 2);
-           /* Per tag variables */
-           var i, j;
-           var tag_base;
-           var tag_field;
-           var type, type_field, type_size;
-           var num_values;
-           var value_offset;
-           var value;
-           var _val;
-           var num;
-           var den;
-           
-           var group;
-           
-           group = this._addMetaGroup(name, description);
-       
-           for (var i = 0; i < num_fields; i++) {
-               /* parse the field */
-               tag_base = base + ifd_offset + 2 + (i * 12);
-               tag_field = JpegMeta.parseNum(endian, _binary_data, tag_base, 2);
-               type_field = JpegMeta.parseNum(endian, _binary_data, tag_base + 2, 2);
-               num_values = JpegMeta.parseNum(endian, _binary_data, tag_base + 4, 4);
-               value_offset = JpegMeta.parseNum(endian, _binary_data, tag_base + 8, 4);
-               if (this._types[type_field] === undefined) {
-                   continue;
-               }
-               type = this._types[type_field][0];
-               type_size = this._types[type_field][1];
-               
-               if (type_size * num_values <= 4) {
-                   /* Data is in-line */
-                   value_offset = tag_base + 8;
-               } else {
-                   value_offset = base + value_offset;
-               }
-               
-               /* Read the value */
-               if (type == "UNDEFINED") {
-                   value = _binary_data.slice(value_offset, value_offset + num_values);
-               } else if (type == "ASCII") {
-                   value = _binary_data.slice(value_offset, value_offset + num_values);
-                   value = value.split('\x00')[0];
-                   /* strip trail nul */
-               } else {
-                   value = new Array();
-                   for (j = 0; j < num_values; j++, value_offset += type_size) {
-                       if (type == "BYTE" || type == "SHORT" || type == "LONG") {
-                           value.push(JpegMeta.parseNum(endian, _binary_data, value_offset, type_size));
-                       }
-                       if (type == "SBYTE" || type == "SSHORT" || type == "SLONG") {
-                           value.push(JpegMeta.parseSnum(endian, _binary_data, value_offset, type_size));
-                       }
-                       if (type == "RATIONAL") {
-                           num = JpegMeta.parseNum(endian, _binary_data, value_offset, 4);
-                           den = JpegMeta.parseNum(endian, _binary_data, value_offset + 4, 4);
-                           value.push(new JpegMeta.Rational(num, den));
-                       }
-                       if (type == "SRATIONAL") {
-                           num = JpegMeta.parseSnum(endian, _binary_data, value_offset, 4);
-                           den = JpegMeta.parseSnum(endian, _binary_data, value_offset + 4, 4);
-                           value.push(new JpegMeta.Rational(num, den));
-                       }
-                       value.push();
-                   }
-                   if (num_values === 1) {
-                       value = value[0];
-                   }
-               }
-               if (tags[tag_field] !== undefined) {
-                       group._addProperty(tags[tag_field][1], tags[tag_field][0], value);
-               }
-           }
-       };
-
-       this.JpegMeta.JpegFile.prototype._jfifHandler = function _jfifHandler(mark, pos) {
-           if (this.jfif !== undefined) {
-               throw Error("Multiple JFIF segments found");
-           }
-           this._addMetaGroup("jfif", "JFIF");
-           this.jfif._addProperty("version_major", "Version Major", this._binary_data.charCodeAt(pos + 5));
-           this.jfif._addProperty("version_minor", "Version Minor", this._binary_data.charCodeAt(pos + 6));
-           this.jfif._addProperty("version", "JFIF Version", this.jfif.version_major.value + "." + this.jfif.version_minor.value);
-           this.jfif._addProperty("units", "Density Unit", this._binary_data.charCodeAt(pos + 7));
-           this.jfif._addProperty("Xdensity", "X density", JpegMeta.parseNum(">", this._binary_data, pos + 8, 2));
-           this.jfif._addProperty("Ydensity", "Y Density", JpegMeta.parseNum(">", this._binary_data, pos + 10, 2));
-           this.jfif._addProperty("Xthumbnail", "X Thumbnail", JpegMeta.parseNum(">", this._binary_data, pos + 12, 1));
-           this.jfif._addProperty("Ythumbnail", "Y Thumbnail", JpegMeta.parseNum(">", this._binary_data, pos + 13, 1));
-       };
-
-       /* Handle app0 segments */
-       this.JpegMeta.JpegFile.prototype._app0Handler = function app0Handler(mark, pos) {
-           var ident = this._binary_data.slice(pos, pos + 5);
-           if (ident == this._JFIF_IDENT) {
-               this._jfifHandler(mark, pos);
-           } else if (ident == this._JFXX_IDENT) {
-               /* Don't handle JFXX Ident yet */
-           } else {
-               /* Don't know about other idents */
-           }
-       };
-
-       /* Handle app1 segments */
-       this.JpegMeta.JpegFile.prototype._app1Handler = function _app1Handler(mark, pos) {
-           var ident = this._binary_data.slice(pos, pos + 5);
-           if (ident == this._EXIF_IDENT) {
-               this._exifHandler(mark, pos + 6);
-           } else {
-               /* Don't know about other idents */
-           }
-       };
-
-       /* Handle exif segments */
-       JpegMeta.JpegFile.prototype._exifHandler = function _exifHandler(mark, pos) {
-           if (this.exif !== undefined) {
-               throw new Error("Multiple JFIF segments found");
-           }
-           
-           /* Parse this TIFF header */
-           var endian;
-           var magic_field;
-           var ifd_offset;
-           var primary_ifd, exif_ifd, gps_ifd;
-           var endian_field = this._binary_data.slice(pos, pos + 2);
-           
-           /* Trivia: This 'I' is for Intel, the 'M' is for Motorola */
-           if (endian_field === "II") {
-               endian = "<";
-           } else if (endian_field === "MM") {
-               endian = ">";
-           } else {
-               throw new Error("Malformed TIFF meta-data. Unknown endianess: " + endian_field);
-           }
-           
-           magic_field = JpegMeta.parseNum(endian, this._binary_data, pos + 2, 2);
-           
-           if (magic_field !== 42) {
-               throw new Error("Malformed TIFF meta-data. Bad magic: " + magic_field);
-           }
-           
-           ifd_offset = JpegMeta.parseNum(endian, this._binary_data, pos + 4, 4);
-           
-           /* Parse 0th IFD */
-           this._parseIfd(endian, this._binary_data, pos, ifd_offset, this._tifftags, "tiff", "TIFF");
-           
-           if (this.tiff.ExifIfdPointer) {
-               this._parseIfd(endian, this._binary_data, pos, this.tiff.ExifIfdPointer.value, this._exiftags, "exif", "Exif");
-           }
-           
-           if (this.tiff.GPSInfoIfdPointer) {
-               this._parseIfd(endian, this._binary_data, pos, this.tiff.GPSInfoIfdPointer.value, this._gpstags, "gps", "GPS");
-               if (this.gps.GPSLatitude) {
-                   var latitude;
-                   latitude = this.gps.GPSLatitude.value[0].asFloat() + 
-                       (1 / 60) * this.gps.GPSLatitude.value[1].asFloat() + 
-                       (1 / 3600) * this.gps.GPSLatitude.value[2].asFloat();
-                   if (this.gps.GPSLatitudeRef.value === "S") {
-                       latitude = -latitude;
-                   }
-                   this.gps._addProperty("latitude", "Dec. Latitude", latitude);
-               }
-               if (this.gps.GPSLongitude) {
-                   var longitude;
-                   longitude = this.gps.GPSLongitude.value[0].asFloat() + 
-                       (1 / 60) * this.gps.GPSLongitude.value[1].asFloat() + 
-                       (1 / 3600) * this.gps.GPSLongitude.value[2].asFloat();
-                   if (this.gps.GPSLongitudeRef.value === "W") {
-                       longitude = -longitude;
-                   }
-                   this.gps._addProperty("longitude", "Dec. Longitude", longitude);
-               }
-           }
-       };
-
-       // MediaWiki: Export as module
-       module.exports = function( fileReaderResult, fileName ) {
-               return new JpegMeta.JpegFile( fileReaderResult, fileName );
-       };
-
-       // MediaWiki: Add mw.libs wrapper
-       // @deprecated since 1.31
-       mw.log.deprecate( mw.libs, 'jpegmeta', module.exports );
-
-}( mediaWiki ) );
index c92c5e5..aab1e7c 100644 (file)
 
                function updateCount() {
                        var remaining = limit - byteLength( textInputWidget.getValue() );
-                       remaining = mw.language.convertNumber( remaining );
+                       if ( remaining > 99 ) {
+                               remaining = '';
+                       } else {
+                               remaining = mw.language.convertNumber( remaining );
+                       }
                        textInputWidget.setLabel( remaining );
                }
                textInputWidget.on( 'change', updateCount );
 
                function updateCount() {
                        var remaining = limit - codePointLength( textInputWidget.getValue() );
-                       remaining = mw.language.convertNumber( remaining );
+                       if ( remaining > 99 ) {
+                               remaining = '';
+                       } else {
+                               remaining = mw.language.convertNumber( remaining );
+                       }
                        textInputWidget.setLabel( remaining );
                }
                textInputWidget.on( 'change', updateCount );
diff --git a/resources/src/mediawiki/mediawiki.sectionAnchor.css b/resources/src/mediawiki/mediawiki.sectionAnchor.css
deleted file mode 100644 (file)
index f8f0022..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-.mw-headline-anchor {
-       display: none;
-}
diff --git a/resources/src/moment-dmy.js b/resources/src/moment-dmy.js
deleted file mode 100644 (file)
index 2b7ca16..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-// Use DMY date format for Moment.js, in accordance with MediaWiki's date formatting routines.
-// This affects English only (and languages without localisations, that fall back to English).
-// http://momentjs.com/docs/#/customization/long-date-formats/
-/* global moment */
-moment.updateLocale( 'en', {
-       longDateFormat: {
-               // Unchanged, but have to be repeated here:
-               LT: 'h:mm A',
-               LTS: 'h:mm:ss A',
-               // Customized:
-               L: 'DD/MM/YYYY',
-               LL: 'D MMMM YYYY',
-               LLL: 'D MMMM YYYY LT',
-               LLLL: 'dddd, D MMMM YYYY LT'
-       }
-} );
diff --git a/resources/src/moment-global.js b/resources/src/moment-global.js
deleted file mode 100644 (file)
index ba01a24..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-// Back-compat: Export module as global
-window.moment = module.exports;
diff --git a/resources/src/moment-locale-overrides.js b/resources/src/moment-locale-overrides.js
deleted file mode 100644 (file)
index bafb86a..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/* global mediaWiki, moment */
-
-( function ( mw ) {
-       // HACK: Overwrite moment's i18n with MediaWiki's for the current language so that
-       // wgTranslateNumerals is respected.
-       moment.updateLocale( moment.locale(), {
-               preparse: function ( s ) {
-                       var i,
-                               table = mw.language.getDigitTransformTable();
-                       if ( mw.config.get( 'wgTranslateNumerals' ) ) {
-                               for ( i = 0; i < 10; i++ ) {
-                                       if ( table[ i ] !== undefined ) {
-                                               s = s.replace( new RegExp( mw.RegExp.escape( table[ i ] ), 'g' ), i );
-                                       }
-                               }
-                       }
-                       // HACK: momentjs replaces commas in some languages, which is the only other use of preparse
-                       // aside from digit transformation. We can only override preparse, not extend it, so we
-                       // have to replicate the comma replacement functionality here.
-                       if ( [ 'ar', 'ar-sa', 'fa' ].indexOf( mw.config.get( 'wgUserLanguage' ) ) !== -1 ) {
-                               s = s.replace( /،/g, ',' );
-                       }
-                       return s;
-               },
-               postformat: function ( s ) {
-                       var i,
-                               table = mw.language.getDigitTransformTable();
-                       if ( mw.config.get( 'wgTranslateNumerals' ) ) {
-                               for ( i = 0; i < 10; i++ ) {
-                                       if ( table[ i ] !== undefined ) {
-                                               s = s.replace( new RegExp( i, 'g' ), table[ i ] );
-                                       }
-                               }
-                       }
-                       // HACK: momentjs replaces commas in some languages, which is the only other use of postformat
-                       // aside from digit transformation. We can only override postformat, not extend it, so we
-                       // have to replicate the comma replacement functionality here.
-                       if ( [ 'ar', 'ar-sa', 'fa' ].indexOf( mw.config.get( 'wgUserLanguage' ) ) !== -1 ) {
-                               s = s.replace( /,/g, '،' );
-                       }
-                       return s;
-               }
-       } );
-}( mediaWiki ) );
diff --git a/resources/src/moment/moment-dmy.js b/resources/src/moment/moment-dmy.js
new file mode 100644 (file)
index 0000000..2b7ca16
--- /dev/null
@@ -0,0 +1,16 @@
+// Use DMY date format for Moment.js, in accordance with MediaWiki's date formatting routines.
+// This affects English only (and languages without localisations, that fall back to English).
+// http://momentjs.com/docs/#/customization/long-date-formats/
+/* global moment */
+moment.updateLocale( 'en', {
+       longDateFormat: {
+               // Unchanged, but have to be repeated here:
+               LT: 'h:mm A',
+               LTS: 'h:mm:ss A',
+               // Customized:
+               L: 'DD/MM/YYYY',
+               LL: 'D MMMM YYYY',
+               LLL: 'D MMMM YYYY LT',
+               LLLL: 'dddd, D MMMM YYYY LT'
+       }
+} );
diff --git a/resources/src/moment/moment-global.js b/resources/src/moment/moment-global.js
new file mode 100644 (file)
index 0000000..ba01a24
--- /dev/null
@@ -0,0 +1,2 @@
+// Back-compat: Export module as global
+window.moment = module.exports;
diff --git a/resources/src/moment/moment-locale-overrides.js b/resources/src/moment/moment-locale-overrides.js
new file mode 100644 (file)
index 0000000..bafb86a
--- /dev/null
@@ -0,0 +1,44 @@
+/* global mediaWiki, moment */
+
+( function ( mw ) {
+       // HACK: Overwrite moment's i18n with MediaWiki's for the current language so that
+       // wgTranslateNumerals is respected.
+       moment.updateLocale( moment.locale(), {
+               preparse: function ( s ) {
+                       var i,
+                               table = mw.language.getDigitTransformTable();
+                       if ( mw.config.get( 'wgTranslateNumerals' ) ) {
+                               for ( i = 0; i < 10; i++ ) {
+                                       if ( table[ i ] !== undefined ) {
+                                               s = s.replace( new RegExp( mw.RegExp.escape( table[ i ] ), 'g' ), i );
+                                       }
+                               }
+                       }
+                       // HACK: momentjs replaces commas in some languages, which is the only other use of preparse
+                       // aside from digit transformation. We can only override preparse, not extend it, so we
+                       // have to replicate the comma replacement functionality here.
+                       if ( [ 'ar', 'ar-sa', 'fa' ].indexOf( mw.config.get( 'wgUserLanguage' ) ) !== -1 ) {
+                               s = s.replace( /،/g, ',' );
+                       }
+                       return s;
+               },
+               postformat: function ( s ) {
+                       var i,
+                               table = mw.language.getDigitTransformTable();
+                       if ( mw.config.get( 'wgTranslateNumerals' ) ) {
+                               for ( i = 0; i < 10; i++ ) {
+                                       if ( table[ i ] !== undefined ) {
+                                               s = s.replace( new RegExp( i, 'g' ), table[ i ] );
+                                       }
+                               }
+                       }
+                       // HACK: momentjs replaces commas in some languages, which is the only other use of postformat
+                       // aside from digit transformation. We can only override postformat, not extend it, so we
+                       // have to replicate the comma replacement functionality here.
+                       if ( [ 'ar', 'ar-sa', 'fa' ].indexOf( mw.config.get( 'wgUserLanguage' ) ) !== -1 ) {
+                               s = s.replace( /,/g, '،' );
+                       }
+                       return s;
+               }
+       } );
+}( mediaWiki ) );
index 77ef43e..08ec9f6 100644 (file)
@@ -1243,7 +1243,7 @@ class ParserTestRunner {
                $teardown[] = $this->markSetupDone( 'setupDatabase' );
 
                # CREATE TEMPORARY TABLE breaks if there is more than one server
-               if ( wfGetLB()->getServerCount() != 1 ) {
+               if ( MediaWikiServices::getInstance()->getDBLoadBalancer()->getServerCount() != 1 ) {
                        $this->useTemporaryTables = false;
                }
 
index 71ebd6f..5ea72b2 100644 (file)
@@ -72,7 +72,6 @@ return [
                'maintenance/',
                'mw-config/',
                'resources/',
-               'skins/',
                'vendor/',
        ],
 
@@ -100,8 +99,6 @@ return [
                'maintenance/language/',
                // External class
                'includes/libs/jsminplus.php',
-               // separate repositories
-               'skins/',
        ],
 
        /**
index 2bde97b..583b751 100644 (file)
@@ -43,6 +43,8 @@ class MovePageTest extends MediaWikiTestCase {
        /**
         * Integration test to catch regressions like T74870. Taken and modified
         * from SemanticMediaWiki
+        *
+        * @covers Title::moveTo
         */
        public function testTitleMoveCompleteIntegrationTest() {
                $oldTitle = Title::newFromText( 'Help:Some title' );
index a5a7364..91655ea 100644 (file)
@@ -151,6 +151,7 @@ class OutputPageTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideCdnCacheEpoch
+        * @covers OutputPage::getCdnCacheEpoch
         */
        public function testCdnCacheEpoch( $params ) {
                $out = TestingAccessWrapper::newFromObject( $this->newInstance() );
index 3d74ae3..4747466 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @coversNothing Just a sample
+ */
 class SampleTest extends MediaWikiLangTestCase {
 
        /**
index 7d6906c..2a92956 100644 (file)
@@ -1259,7 +1259,8 @@ class RevisionStoreDbTest extends MediaWikiTestCase {
         */
        public function testNewMutableRevisionFromArray_legacyEncoding( array $array ) {
                $cache = new WANObjectCache( [ 'cache' => new HashBagOStuff() ] );
-               $blobStore = new SqlBlobStore( wfGetLB(), $cache );
+               $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
+               $blobStore = new SqlBlobStore( $lb, $cache );
                $blobStore->setLegacyEncoding( 'windows-1252', Language::factory( 'en' ) );
 
                $factory = $this->getMockBuilder( BlobStoreFactory::class )
index 0bce572..fed9a0c 100644 (file)
@@ -614,11 +614,12 @@ class RevisionStoreTest extends MediaWikiTestCase {
         */
        public function testNewRevisionFromRow_legacyEncoding_applied( $encoding, $locale, $row, $text ) {
                $cache = new WANObjectCache( [ 'cache' => new HashBagOStuff() ] );
+               $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
 
-               $blobStore = new SqlBlobStore( wfGetLB(), $cache );
+               $blobStore = new SqlBlobStore( $lb, $cache );
                $blobStore->setLegacyEncoding( $encoding, Language::factory( $locale ) );
 
-               $store = $this->getRevisionStore( wfGetLB(), $blobStore, $cache );
+               $store = $this->getRevisionStore( $lb, $blobStore, $cache );
 
                $record = $store->newRevisionFromRow(
                        $this->makeRow( $row ),
@@ -640,11 +641,12 @@ class RevisionStoreTest extends MediaWikiTestCase {
                ];
 
                $cache = new WANObjectCache( [ 'cache' => new HashBagOStuff() ] );
+               $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
 
-               $blobStore = new SqlBlobStore( wfGetLB(), $cache );
+               $blobStore = new SqlBlobStore( $lb, $cache );
                $blobStore->setLegacyEncoding( 'windows-1252', Language::factory( 'en' ) );
 
-               $store = $this->getRevisionStore( wfGetLB(), $blobStore, $cache );
+               $store = $this->getRevisionStore( $lb, $blobStore, $cache );
 
                $record = $store->newRevisionFromRow(
                        $this->makeRow( $row ),
index a04271f..8a40266 100644 (file)
@@ -133,6 +133,7 @@ class ApiParseTest extends ApiTestCase {
                                ->getMock();
                        $skin->expects( $this->once() )->method( 'getDefaultModules' )
                                ->willReturn( [
+                                       'styles' => [ 'core' => [ 'quux.styles' ] ],
                                        'core' => [ 'foo', 'bar' ],
                                        'content' => [ 'baz' ]
                                ] );
@@ -686,7 +687,7 @@ class ApiParseTest extends ApiTestCase {
                        'resp.parse.modulescripts'
                );
                $this->assertSame(
-                       [ 'foo.styles' ],
+                       [ 'foo.styles', 'quux.styles' ],
                        $res[0]['parse']['modulestyles'],
                        'resp.parse.modulestyles'
                );
index 1a7ed12..ff22def 100644 (file)
@@ -5,6 +5,9 @@ namespace MediaWiki\Auth;
 use Psr\Log\LoggerInterface;
 use Wikimedia\TestingAccessWrapper;
 
+/**
+ * @covers \MediaWiki\Auth\EmailNotificationSecondaryAuthenticationProvider
+ */
 class EmailNotificationSecondaryAuthenticationProviderTest extends \PHPUnit\Framework\TestCase {
        public function testConstructor() {
                $config = new \HashConfig( [
index ed4c977..b715b1f 100644 (file)
@@ -157,12 +157,18 @@ class LBFactoryTest extends MediaWikiTestCase {
                global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype, $wgSQLiteDataDir;
 
                $factory = new LBFactoryMulti( [
-                       'sectionsByDB' => [],
+                       'sectionsByDB' => [
+                               's1wiki' => 's1',
+                       ],
                        'sectionLoads' => [
+                               's1' => [
+                                       'test-db3' => 0,
+                                       'test-db4' => 100,
+                               ],
                                'DEFAULT' => [
                                        'test-db1' => 0,
                                        'test-db2' => 100,
-                               ],
+                               ]
                        ],
                        'serverTemplate' => [
                                'dbname'      => $wgDBname,
@@ -174,7 +180,9 @@ class LBFactoryTest extends MediaWikiTestCase {
                        ],
                        'hostsByName' => [
                                'test-db1'  => $wgDBserver,
-                               'test-db2'  => $wgDBserver
+                               'test-db2'  => $wgDBserver,
+                               'test-db3'  => $wgDBserver,
+                               'test-db4'  => $wgDBserver
                        ],
                        'loadMonitorClass' => LoadMonitorNull::class
                ] );
@@ -186,8 +194,25 @@ class LBFactoryTest extends MediaWikiTestCase {
                $dbr = $lb->getConnection( DB_REPLICA );
                $this->assertTrue( $dbr->getLBInfo( 'replica' ), 'slave shows as slave' );
 
+               // Test that LoadBalancer instances made during commitMasterChanges() do not throw
+               // DBTransactionError due to transaction ROUND_* stages being mismatched.
+               $factory->beginMasterChanges( __METHOD__ );
+               $dbw->onTransactionPreCommitOrIdle( function () use ( $factory ) {
+                       // Trigger s1 LoadBalancer instantiation during "finalize" stage.
+                       // There is no s1wiki DB to select so it is not in getConnection(),
+                       // but this fools getMainLB() at least.
+                       $factory->getMainLB( 's1wiki' )->getConnection( DB_MASTER );
+               } );
+               $factory->commitMasterChanges( __METHOD__ );
+
+               $count = 0;
+               $factory->forEachLB( function () use ( &$count ) {
+                       ++$count;
+               } );
+               $this->assertEquals( 2, $count );
+
                $factory->shutdown();
-               $lb->closeAll();
+               $factory->closeAll();
        }
 
        /**
index c101523..f45bb93 100644 (file)
@@ -170,6 +170,8 @@ class DefaultPreferencesFactoryTest extends MediaWikiTestCase {
 
        /**
         * The rclimit preference should accept non-integer input and filter it to become an integer.
+        *
+        * @covers \MediaWiki\Preferences\DefaultPreferencesFactory::saveFormData
         */
        public function testIntvalFilter() {
                // Test a string with leading zeros (i.e. not octal) and spaces.
index a1b1422..61ab8a5 100644 (file)
@@ -71,8 +71,7 @@ CSS
 
        /**
         * @dataProvider provideGetStyles
-        * @covers ResourceLoaderSkinModule::normalizeStyles
-        * @covers ResourceLoaderSkinModule::getStyles
+        * @covers ResourceLoaderSkinModule
         */
        public function testGetStyles( $parent, $logo, $expected ) {
                $module = $this->getMockBuilder( ResourceLoaderSkinModule::class )
index 4e9f539..e811d87 100644 (file)
@@ -99,6 +99,22 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                $resourceLoader->register( 'test', new stdClass() );
        }
 
+       /**
+        * @covers ResourceLoader::register
+        */
+       public function testRegisterDuplicate() {
+               $logger = $this->getMockBuilder( Psr\Log\LoggerInterface::class )->getMock();
+               $logger->expects( $this->once() )
+                       ->method( 'warning' );
+               $resourceLoader = new EmptyResourceLoader( null, $logger );
+
+               $module1 = new ResourceLoaderTestModule();
+               $module2 = new ResourceLoaderTestModule();
+               $resourceLoader->register( 'test', $module1 );
+               $resourceLoader->register( 'test', $module2 );
+               $this->assertSame( $module2, $resourceLoader->getModule( 'test' ) );
+       }
+
        /**
         * @covers ResourceLoader::getModuleNames
         */
index 7c16f6c..da6e9f9 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Tests for the DBSiteStore class.
  *
@@ -37,7 +39,8 @@ class DBSiteStoreTest extends MediaWikiTestCase {
        private function newDBSiteStore() {
                // NOTE: Use the real DB load balancer for now. Eventually, the test framework should
                // provide a LoadBalancer that is safe to use in unit tests.
-               return new DBSiteStore( wfGetLB() );
+               $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
+               return new DBSiteStore( $lb );
        }
 
        /**
index 06b0667..6ea5b40 100644 (file)
@@ -49,53 +49,61 @@ class SkinTemplateTest extends MediaWikiTestCase {
                $mock->expects( $this->once() )
                        ->method( 'isSyndicated' )
                        ->will( $this->returnValue( $isSyndicated ) );
-               $mock->expects( $this->once() )
+               $mock->expects( $this->any() )
                        ->method( 'getHTML' )
                        ->will( $this->returnValue( $html ) );
                return $mock;
        }
 
-       public function provideSetupSkinUserCss() {
+       public function provideGetDefaultModules() {
                $defaultStyles = [
                        'mediawiki.legacy.shared',
                        'mediawiki.legacy.commonPrint',
-                       'mediawiki.sectionAnchor',
                ];
                $buttonStyle = 'mediawiki.ui.button';
                $feedStyle = 'mediawiki.feedlink';
                return [
                        [
-                               $this->getMockOutputPage( false, '' ),
+                               false,
+                               '',
                                $defaultStyles
                        ],
                        [
-                               $this->getMockOutputPage( true, '' ),
+                               true,
+                               '',
                                array_merge( $defaultStyles, [ $feedStyle ] )
                        ],
                        [
-                               $this->getMockOutputPage( false, 'FOO mw-ui-button BAR' ),
+                               false,
+                               'FOO mw-ui-button BAR',
                                array_merge( $defaultStyles, [ $buttonStyle ] )
                        ],
                        [
-                               $this->getMockOutputPage( true, 'FOO mw-ui-button BAR' ),
-                               array_merge( $defaultStyles, [ $feedStyle, $buttonStyle ] )
+                               true,
+                               'FOO mw-ui-button BAR',
+                               array_merge( $defaultStyles, [ $buttonStyle, $feedStyle ] )
                        ],
                ];
        }
 
        /**
-        * @param PHPUnit_Framework_MockObject_MockObject|OutputPage $outputPageMock
-        * @param string[] $expectedModuleStyles
-        *
-        * @covers SkinTemplate::setupSkinUserCss
-        * @dataProvider provideSetupSkinUserCss
+        * @covers Skin::getDefaultModules
+        * @dataProvider provideGetDefaultModules
         */
-       public function testSetupSkinUserCss( $outputPageMock, $expectedModuleStyles ) {
-               $outputPageMock->expects( $this->once() )
-                       ->method( 'addModuleStyles' )
-                       ->with( $expectedModuleStyles );
+       public function testgetDefaultModules( $isSyndicated, $html, $expectedModuleStyles ) {
+               $skin = new SkinTemplate();
 
-               $skinTemplate = new SkinTemplate();
-               $skinTemplate->setupSkinUserCss( $outputPageMock );
+               $context = new DerivativeContext( $skin->getContext() );
+               $context->setOutput( $this->getMockOutputPage( $isSyndicated, $html ) );
+               $skin->setContext( $context );
+
+               $modules = $skin->getDefaultModules();
+
+               $actualStylesModule = call_user_func_array( 'array_merge', $modules['styles'] );
+               $this->assertArraySubset(
+                       $expectedModuleStyles,
+                       $actualStylesModule,
+                       'style modules'
+               );
        }
 }