Merge "OutputPage.php: Remove misleading comment"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 11 Feb 2016 04:06:13 +0000 (04:06 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 11 Feb 2016 04:06:13 +0000 (04:06 +0000)
255 files changed:
.jshintrc
.travis.yml
INSTALL
RELEASE-NOTES-1.27
autoload.php
composer.json
docs/contenthandler.txt
docs/hooks.txt
includes/DefaultSettings.php
includes/EditPage.php
includes/EventRelayerGroup.php [new file with mode: 0644]
includes/Linker.php
includes/MergeHistory.php [new file with mode: 0644]
includes/OutputPage.php
includes/PHPVersionCheck.php
includes/Revision.php
includes/Setup.php
includes/Title.php
includes/WebResponse.php
includes/actions/EditAction.php
includes/api/ApiMain.php
includes/api/ApiMergeHistory.php [new file with mode: 0644]
includes/api/ApiMessage.php
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/fr.json
includes/api/i18n/he.json
includes/api/i18n/it.json
includes/api/i18n/lb.json
includes/api/i18n/qqq.json
includes/api/i18n/ru.json
includes/api/i18n/sh.json [new file with mode: 0644]
includes/api/i18n/tr.json
includes/api/i18n/zh-hans.json
includes/cache/LinkBatch.php
includes/changes/ChangesList.php
includes/content/ContentHandler.php
includes/db/Database.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabaseSqlite.php
includes/debug/logger/monolog/WikiProcessor.php
includes/deferred/CdnCacheUpdate.php
includes/deferred/LinksUpdate.php
includes/diff/DiffFormatter.php
includes/diff/TableDiffFormatter.php
includes/diff/UnifiedDiffFormatter.php
includes/filebackend/SwiftFileBackend.php
includes/installer/CliInstaller.php
includes/installer/Installer.php
includes/installer/InstallerSessionProvider.php [new file with mode: 0644]
includes/installer/LocalSettingsGenerator.php
includes/installer/WebInstallerExistingWiki.php
includes/installer/i18n/eu.json
includes/installer/i18n/nb.json
includes/installer/i18n/pl.json
includes/installer/i18n/ps.json
includes/installer/i18n/sh.json
includes/installer/i18n/war.json
includes/interwiki/Interwiki.php
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobQueueMemory.php
includes/jobqueue/JobQueueRedis.php
includes/libs/ReplacementArray.php
includes/libs/objectcache/BagOStuff.php
includes/libs/objectcache/MemcachedClient.php
includes/mail/EmailNotification.php
includes/page/ImageHistoryList.php
includes/page/ImageHistoryPseudoPager.php
includes/page/WikiPage.php
includes/parser/LinkHolderArray.php
includes/parser/ParserOptions.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderModule.php
includes/session/BotPasswordSessionProvider.php
includes/session/CookieSessionProvider.php
includes/session/PHPSessionHandler.php
includes/session/SessionBackend.php
includes/session/SessionInfo.php
includes/session/SessionManager.php
includes/skins/BaseTemplate.php
includes/specialpage/QueryPage.php
includes/specials/SpecialLog.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWatchlist.php
includes/user/BotPassword.php
includes/user/User.php
includes/utils/AutoloadGenerator.php
includes/utils/MWCryptRand.php
languages/FakeConverter.php
languages/Language.php
languages/LanguageConverter.php
languages/classes/LanguageGan.php
languages/classes/LanguageIu.php
languages/classes/LanguageKk.php
languages/classes/LanguageKu.php
languages/classes/LanguageShi.php
languages/classes/LanguageSr.php
languages/classes/LanguageUz.php
languages/classes/LanguageZh.php
languages/data/Names.php
languages/i18n/ar.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/be-tarask.json
languages/i18n/bn.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/crh-cyrl.json
languages/i18n/cu.json
languages/i18n/cv.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/frr.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/id.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jam.json
languages/i18n/ko.json
languages/i18n/ku-latn.json
languages/i18n/la.json
languages/i18n/lb.json
languages/i18n/mai.json
languages/i18n/my.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/pl.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ru.json
languages/i18n/sah.json
languages/i18n/sh.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/tyv.json
languages/i18n/uk.json
languages/i18n/war.json
languages/i18n/wuu.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesGom.php
languages/messages/MessagesGom_deva.php
languages/messages/MessagesLki.php [new file with mode: 0644]
maintenance/jsduck/custom_tags.rb
maintenance/namespaceDupes.php
maintenance/updateSearchIndex.php
mw-config/index.php
package.json
resources/ResourcesOOUI.php
resources/lib/oojs-ui/i18n/eo.json
resources/lib/oojs-ui/i18n/om.json
resources/lib/oojs-ui/i18n/sd.json
resources/lib/oojs-ui/i18n/sr-el.json
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-core-apex.css
resources/lib/oojs-ui/oojs-ui-core-mediawiki.css
resources/lib/oojs-ui/oojs-ui-core.js
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-toolbars-apex.css
resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css
resources/lib/oojs-ui/oojs-ui-toolbars.js
resources/lib/oojs-ui/oojs-ui-widgets-apex.css
resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css
resources/lib/oojs-ui/oojs-ui-widgets.js
resources/lib/oojs-ui/oojs-ui-windows-apex.css
resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css
resources/lib/oojs-ui/oojs-ui-windows.js
resources/lib/oojs-ui/themes/apex/icons-content.json
resources/lib/oojs-ui/themes/apex/icons-editing-advanced.json
resources/lib/oojs-ui/themes/apex/images/icons/attachment-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/attachment-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/attachment-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/attachment-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/language-ltr.png
resources/lib/oojs-ui/themes/apex/images/icons/language-ltr.svg
resources/lib/oojs-ui/themes/apex/images/icons/language-rtl.png
resources/lib/oojs-ui/themes/apex/images/icons/language-rtl.svg
resources/lib/oojs-ui/themes/apex/images/icons/upload-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/upload-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/upload-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/upload-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/icons-editing-advanced.json
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl.svg
resources/src/jquery/jquery.tablesorter.less
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki.skinning/content.css
resources/src/mediawiki.skinning/images/sort_both_readonly.png [deleted file]
resources/src/mediawiki.skinning/images/sort_both_readonly.svg [deleted file]
resources/src/mediawiki.special/mediawiki.special.apisandbox.js
resources/src/mediawiki/mediawiki.Title.js
resources/src/mediawiki/mediawiki.checkboxtoggle.js
resources/src/mediawiki/mediawiki.feedback.js
resources/src/mediawiki/mediawiki.js
resources/src/oojs-ui-styles-skip.js [new file with mode: 0644]
resources/src/startup.js
tests/phpunit/includes/EditPageTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/MergeHistoryTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiMessageTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/libs/ArrayUtilsTest.php
tests/phpunit/includes/media/IPTCTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/session/BotPasswordSessionProviderTest.php
tests/phpunit/includes/session/CookieSessionProviderTest.php
tests/phpunit/includes/session/PHPSessionHandlerTest.php
tests/phpunit/includes/session/SessionInfoTest.php
tests/phpunit/includes/session/SessionManagerTest.php
tests/phpunit/includes/site/CachingSiteStoreTest.php
tests/phpunit/includes/site/SiteImporterTest.php
tests/phpunit/languages/classes/LanguageGanTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageIuTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageKkTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageKuTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageShiTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageTgTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageZhTest.php [new file with mode: 0644]
tests/phpunit/phpunit.php

index b776e8f..62b9d82 100644 (file)
--- a/.jshintrc
+++ b/.jshintrc
@@ -2,14 +2,15 @@
        // Enforcing
        "bitwise": true,
        "eqeqeq": true,
-       "es3": true,
+       "esversion": 3,
        "freeze": true,
-       "latedef": true,
+       "futurehostile": true,
+       "latedef": "nofunc",
        "noarg": true,
        "nonew": true,
+       "strict": false,
        "undef": true,
        "unused": true,
-       "strict": false,
 
        // Relaxing
        "laxbreak": true,
index 2d07596..9062194 100644 (file)
@@ -12,9 +12,9 @@ matrix:
   fast_finish: true
   include:
     - env: dbtype=mysql
-      php: 5.3
+      php: 5.5
     - env: dbtype=postgres
-      php: 5.3
+      php: 5.5
     - env: dbtype=mysql
       php: hhvm
     - env: dbtype=mysql
diff --git a/INSTALL b/INSTALL
index 2054a57..4651a0c 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -6,7 +6,7 @@ Starting with MediaWiki 1.2.0, it's possible to install and configure the wiki
 "in-place", as long as you have the necessary prerequisites available.
 
 Required software:
-* Web server with PHP 5.3.3 or higher.
+* Web server with PHP 5.5.9 or higher.
 * A SQL server, the following types are supported
 ** MySQL 5.0.3 or higher
 ** PostgreSQL 8.3 or higher
index 5b9b2b8..6e2ca15 100644 (file)
@@ -8,6 +8,10 @@ THIS IS NOT A RELEASE YET
 MediaWiki 1.27 is an alpha-quality branch and is not recommended for use in
 production.
 
+=== PHP version requirement ===
+As of 1.27, MediaWiki now requires PHP 5.5.9 or higher. This corresponds with
+HHVM 3.1.
+
 === Configuration changes in 1.27 ===
 * $wgUseLinkNamespaceDBFields was removed.
 * Deprecated $wgResourceLoaderMinifierStatementsOnOwnLine and
@@ -158,6 +162,13 @@ production.
   aria-describedby, aria-flowto, aria-label, aria-labelledby, aria-owns.
 * Removed "presentation" restriction on the HTML role attribute in wikitext.
   All values are now allowed for the role attribute.
+* $wgContentHandlers now also supports callbacks to create an instance of the
+  appropriate ContentHandler subclass.
+* Added $wgAuthenticationTokenVersion, which if non-null prevents the
+  user_token database field from being exposed in cookies. Setting this would
+  be a good idea, but will log out all current sessions.
+* $wgEventRelayerConfig was added, for managing PubSub event relay configuration,
+  specifically for reliable CDN url purges.
 
 === External library changes in 1.27 ===
 
@@ -312,7 +323,7 @@ changes to languages because of Phabricator reports.
 
 == Compatibility ==
 
-MediaWiki 1.27 requires PHP 5.3.3 or later. There is experimental support for
+MediaWiki 1.27 requires PHP 5.5.9 or later. There is experimental support for
 HHVM 3.6.5 or later.
 
 MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
index 4d48de0..d6e4077 100644 (file)
@@ -52,6 +52,7 @@ $wgAutoloadLocalClasses = array(
        'ApiLogout' => __DIR__ . '/includes/api/ApiLogout.php',
        'ApiMain' => __DIR__ . '/includes/api/ApiMain.php',
        'ApiManageTags' => __DIR__ . '/includes/api/ApiManageTags.php',
+       'ApiMergeHistory' => __DIR__ . '/includes/api/ApiMergeHistory.php',
        'ApiMessage' => __DIR__ . '/includes/api/ApiMessage.php',
        'ApiModuleManager' => __DIR__ . '/includes/api/ApiModuleManager.php',
        'ApiMove' => __DIR__ . '/includes/api/ApiMove.php',
@@ -394,6 +395,7 @@ $wgAutoloadLocalClasses = array(
        'EraseArchivedFile' => __DIR__ . '/maintenance/eraseArchivedFile.php',
        'ErrorPageError' => __DIR__ . '/includes/exception/ErrorPageError.php',
        'EventRelayer' => __DIR__ . '/includes/libs/eventrelayer/EventRelayer.php',
+       'EventRelayerGroup' => __DIR__ . '/includes/EventRelayerGroup.php',
        'EventRelayerMCRD' => __DIR__ . '/includes/libs/eventrelayer/EventRelayerMCRD.php',
        'EventRelayerNull' => __DIR__ . '/includes/libs/eventrelayer/EventRelayer.php',
        'Exif' => __DIR__ . '/includes/media/Exif.php',
@@ -591,6 +593,7 @@ $wgAutoloadLocalClasses = array(
        'InstallDocFormatter' => __DIR__ . '/includes/installer/InstallDocFormatter.php',
        'Installer' => __DIR__ . '/includes/installer/Installer.php',
        'InstallerOverrides' => __DIR__ . '/mw-config/overrides.php',
+       'InstallerSessionProvider' => __DIR__ . '/includes/installer/InstallerSessionProvider.php',
        'Interwiki' => __DIR__ . '/includes/interwiki/Interwiki.php',
        'InvalidPassword' => __DIR__ . '/includes/password/InvalidPassword.php',
        'IteratorDecorator' => __DIR__ . '/includes/utils/iterators/IteratorDecorator.php',
@@ -825,6 +828,7 @@ $wgAutoloadLocalClasses = array(
        'MemcachedPhpBagOStuff' => __DIR__ . '/includes/libs/objectcache/MemcachedPhpBagOStuff.php',
        'MemoizedCallable' => __DIR__ . '/includes/libs/MemoizedCallable.php',
        'MemoryFileBackend' => __DIR__ . '/includes/filebackend/MemoryFileBackend.php',
+       'MergeHistory' => __DIR__ . '/includes/MergeHistory.php',
        'MergeHistoryPager' => __DIR__ . '/includes/specials/SpecialMergeHistory.php',
        'MergeLogFormatter' => __DIR__ . '/includes/logging/MergeLogFormatter.php',
        'MergeMessageFileList' => __DIR__ . '/maintenance/mergeMessageFileList.php',
index 17edfbf..0b50c2a 100644 (file)
@@ -21,9 +21,9 @@
                "ext-iconv": "*",
                "liuggio/statsd-php-client": "1.0.18",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.15.2",
-               "oyejorge/less.php": "1.7.0.9",
-               "php": ">=5.3.3",
+               "oojs/oojs-ui": "0.15.3",
+               "oyejorge/less.php": "1.7.0.10",
+               "php": ">=5.5.9",
                "psr/log": "1.0.0",
                "wikimedia/assert": "0.2.2",
                "wikimedia/base-convert": "1.0.1",
index 5f9a0b0..f1f478e 100644 (file)
@@ -148,7 +148,8 @@ using a model or format different from the default will result in an error.
 
 There are some new globals that can be used to control the behavior of the ContentHandler facility:
 
-* $wgContentHandlers associates content model IDs with the names of the appropriate ContentHandler subclasses.
+* $wgContentHandlers associates content model IDs with the names of the appropriate ContentHandler subclasses
+  or callbacks that create an instance of the appropriate ContentHandler subclass.
 
 * $wgNamespaceContentModels maps namespace IDs to a content model that should be the default for that namespace.
 
index 79bc5f5..0fe888f 100644 (file)
@@ -3483,7 +3483,7 @@ Return false to prevent setting of the cookie.
 &$name: Cookie name passed to WebResponse::setcookie()
 &$value: Cookie value passed to WebResponse::setcookie()
 &$expire: Cookie expiration, as for PHP's setcookie()
-$options: Options passed to WebResponse::setcookie()
+&$options: Options passed to WebResponse::setcookie()
 
 'wfShellWikiCmd': Called when generating a shell-escaped command line string to
 run a MediaWiki cli script.
index 9c7106f..a6a0c75 100644 (file)
@@ -75,7 +75,7 @@ $wgConfigRegistry = array(
  * MediaWiki version number
  * @since 1.2
  */
-$wgVersion = '1.27alpha';
+$wgVersion = '1.27.0-alpha';
 
 /**
  * Name of the site. It must be changed in LocalSettings.php
@@ -904,7 +904,8 @@ $wgMediaHandlers = array(
 
 /**
  * Plugins for page content model handling.
- * Each entry in the array maps a model id to a class name.
+ * Each entry in the array maps a model id to a class name or callback
+ * that creates an instance of the appropriate ContentHandler subclass.
  *
  * @since 1.21
  */
@@ -7964,6 +7965,25 @@ $wgPopularPasswordFile = __DIR__ . '/../serialized/commonpasswords.cdb';
  */
 $wgMaxUserDBWriteDuration = false;
 
+/**
+ * Mapping of event channels to EventRelayer configuration.
+ *
+ * By setting up a PubSub system (like Kafka) and enabling a corresponding EventRelayer class
+ * that uses it, MediaWiki can broadcast events to all subscribers. Certain features like WAN
+ * cache purging and CDN cache purging will emit events to this system. Appropriate listers can
+ * subscribe to the channel and take actions based on the events. For example, a local daemon
+ * can run on each CDN cache node and perfom local purges based on the URL purge channel events.
+ *
+ * The 'default' channel is for all channels without an explicit entry here.
+ *
+ * @since 1.27
+ */
+$wgEventRelayerConfig = array(
+       'default' => array(
+               'class' => 'EventRelayerNull',
+       )
+);
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index 277a6cc..914bad4 100644 (file)
@@ -2232,8 +2232,6 @@ class EditPage {
                        $wgOut->addModules( 'mediawiki.action.edit.stash' );
                }
 
-               $wgOut->setRobotPolicy( 'noindex,nofollow' );
-
                # Enabled article-related sidebar, toplinks, etc.
                $wgOut->setArticleRelated( true );
 
diff --git a/includes/EventRelayerGroup.php b/includes/EventRelayerGroup.php
new file mode 100644 (file)
index 0000000..3af756d
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Factory class for spawning EventRelayer objects using configuration
+ *
+ * @author Aaron Schulz
+ * @since 1.27
+ */
+class EventRelayerGroup {
+       /** @var array[] */
+       protected $configByChannel = array();
+
+       /** @var EventRelayer[] */
+       protected $relayers = array();
+
+       /** @var EventRelayerGroup */
+       protected static $instance = null;
+
+       /**
+        * @param Config $config
+        */
+       protected function __construct( Config $config ) {
+               $this->configByChannel = $config->get( 'EventRelayerConfig' );
+       }
+
+       /**
+        * @return EventRelayerGroup
+        */
+       public static function singleton() {
+               if ( !self::$instance ) {
+                       self::$instance = new self( RequestContext::getMain()->getConfig() );
+               }
+
+               return self::$instance;
+       }
+
+       /**
+        * @param string $channel
+        * @return EventRelayer Relayer instance that handles the given channel
+        */
+       public function getRelayer( $channel ) {
+               $channelKey = isset( $this->configByChannel[$channel] )
+                       ? $channel
+                       : 'default';
+
+               if ( !isset( $this->relayers[$channelKey] ) ) {
+                       if ( !isset( $this->configByChannel[$channelKey] ) ) {
+                               throw new UnexpectedValueException( "No config for '$channelKey'" );
+                       }
+
+                       $config = $this->configByChannel[$channelKey];
+                       $class = $config['class'];
+
+                       $this->relayers[$channelKey] = new $class( $config );
+               }
+
+               return $this->relayers[$channelKey];
+       }
+}
index 4b9b963..f0a2963 100644 (file)
@@ -188,6 +188,7 @@ class Linker {
         *       Has compatibility issues on some setups, so avoid wherever possible.
         *     'http': Force a full URL with http:// as the scheme.
         *     'https': Force a full URL with https:// as the scheme.
+        *     'stubThreshold' => (int): Stub threshold to use when determining link classes.
         * @return string HTML <a> attribute
         */
        public static function link(
@@ -218,7 +219,7 @@ class Linker {
                $target = self::normaliseSpecialPage( $target );
 
                # If we don't know whether the page exists, let's find out.
-               if ( !in_array( 'known', $options ) && !in_array( 'broken', $options ) ) {
+               if ( !in_array( 'known', $options, true ) && !in_array( 'broken', $options, true ) ) {
                        if ( $target->isKnown() ) {
                                $options[] = 'known';
                        } else {
@@ -227,14 +228,14 @@ class Linker {
                }
 
                $oldquery = array();
-               if ( in_array( "forcearticlepath", $options ) && $query ) {
+               if ( in_array( "forcearticlepath", $options, true ) && $query ) {
                        $oldquery = $query;
                        $query = array();
                }
 
                # Note: we want the href attribute first, for prettiness.
                $attribs = array( 'href' => self::linkUrl( $target, $query, $options ) );
-               if ( in_array( 'forcearticlepath', $options ) && $oldquery ) {
+               if ( in_array( 'forcearticlepath', $options, true ) && $oldquery ) {
                        $attribs['href'] = wfAppendQuery( $attribs['href'], $oldquery );
                }
 
@@ -277,7 +278,7 @@ class Linker {
        private static function linkUrl( $target, $query, $options ) {
                # We don't want to include fragments for broken links, because they
                # generally make no sense.
-               if ( in_array( 'broken', $options ) && $target->hasFragment() ) {
+               if ( in_array( 'broken', $options, true ) && $target->hasFragment() ) {
                        $target = clone $target;
                        $target->setFragment( '' );
                }
@@ -285,15 +286,15 @@ class Linker {
                # If it's a broken link, add the appropriate query pieces, unless
                # there's already an action specified, or unless 'edit' makes no sense
                # (i.e., for a nonexistent special page).
-               if ( in_array( 'broken', $options ) && empty( $query['action'] )
+               if ( in_array( 'broken', $options, true ) && empty( $query['action'] )
                        && !$target->isSpecialPage() ) {
                        $query['action'] = 'edit';
                        $query['redlink'] = '1';
                }
 
-               if ( in_array( 'http', $options ) ) {
+               if ( in_array( 'http', $options, true ) ) {
                        $proto = PROTO_HTTP;
-               } elseif ( in_array( 'https', $options ) ) {
+               } elseif ( in_array( 'https', $options, true ) ) {
                        $proto = PROTO_HTTPS;
                } else {
                        $proto = PROTO_RELATIVE;
@@ -316,11 +317,11 @@ class Linker {
                global $wgUser;
                $defaults = array();
 
-               if ( !in_array( 'noclasses', $options ) ) {
+               if ( !in_array( 'noclasses', $options, true ) ) {
                        # Now build the classes.
                        $classes = array();
 
-                       if ( in_array( 'broken', $options ) ) {
+                       if ( in_array( 'broken', $options, true ) ) {
                                $classes[] = 'new';
                        }
 
@@ -328,8 +329,11 @@ class Linker {
                                $classes[] = 'extiw';
                        }
 
-                       if ( !in_array( 'broken', $options ) ) { # Avoid useless calls to LinkCache (see r50387)
-                               $colour = self::getLinkColour( $target, $wgUser->getStubThreshold() );
+                       if ( !in_array( 'broken', $options, true ) ) { # Avoid useless calls to LinkCache (see r50387)
+                               $colour = self::getLinkColour(
+                                       $target,
+                                       isset( $options['stubThreshold'] ) ? $options['stubThreshold'] : $wgUser->getStubThreshold()
+                               );
                                if ( $colour !== '' ) {
                                        $classes[] = $colour; # mw-redirect or stub
                                }
@@ -343,7 +347,7 @@ class Linker {
                if ( $target->getPrefixedText() == '' ) {
                        # A link like [[#Foo]].  This used to mean an empty title
                        # attribute, but that's silly.  Just don't output a title.
-               } elseif ( in_array( 'known', $options ) ) {
+               } elseif ( in_array( 'known', $options, true ) ) {
                        $defaults['title'] = $target->getPrefixedText();
                } else {
                        // This ends up in parser cache!
@@ -1845,7 +1849,7 @@ class Linker {
                }
 
                $editCount = false;
-               if ( in_array( 'verify', $options ) ) {
+               if ( in_array( 'verify', $options, true ) ) {
                        $editCount = self::getRollbackEditCount( $rev, true );
                        if ( $editCount === false ) {
                                return '';
@@ -1854,7 +1858,7 @@ class Linker {
 
                $inner = self::buildRollbackLink( $rev, $context, $editCount );
 
-               if ( !in_array( 'noBrackets', $options ) ) {
+               if ( !in_array( 'noBrackets', $options, true ) ) {
                        $inner = $context->msg( 'brackets' )->rawParams( $inner )->escaped();
                }
 
diff --git a/includes/MergeHistory.php b/includes/MergeHistory.php
new file mode 100644 (file)
index 0000000..a3861ee
--- /dev/null
@@ -0,0 +1,351 @@
+<?php
+
+/**
+ *
+ *
+ * Created on Dec 29, 2015
+ *
+ * Copyright © 2015 Geoffrey Mon <geofbot@gmail.com>
+ *
+ * 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
+ */
+
+/**
+ * Handles the backend logic of merging the histories of two
+ * pages.
+ *
+ * @since 1.27
+ */
+class MergeHistory {
+
+       /** @const int Maximum number of revisions that can be merged at once (avoid too much slave lag) */
+       const REVISION_LIMIT = 5000;
+
+       /** @var Title Page from which history will be merged */
+       protected $source;
+
+       /** @var Title Page to which history will be merged */
+       protected $dest;
+
+       /** @var DatabaseBase Database that we are using */
+       protected $dbw;
+
+       /** @var MWTimestamp Maximum timestamp that we can use (oldest timestamp of dest) */
+       protected $maxTimestamp;
+
+       /** @var string SQL WHERE condition that selects source revisions to insert into destination */
+       protected $timeWhere;
+
+       /** @var MWTimestamp|boolean Timestamp upto which history from the source will be merged */
+       protected $timestampLimit;
+
+       /** @var integer Number of revisions merged (for Special:MergeHistory success message) */
+       protected $revisionsMerged;
+
+       /**
+        * MergeHistory constructor.
+        * @param Title $source Page from which history will be merged
+        * @param Title $dest Page to which history will be merged
+        * @param string|boolean $timestamp Timestamp up to which history from the source will be merged
+        */
+       public function __construct( Title $source, Title $dest, $timestamp = false ) {
+               // Save the parameters
+               $this->source = $source;
+               $this->dest = $dest;
+
+               // Get the database
+               $this->dbw = wfGetDB( DB_MASTER );
+
+               // Max timestamp should be min of destination page
+               $firstDestTimestamp = $this->dbw->selectField(
+                       'revision',
+                       'MIN(rev_timestamp)',
+                       array( 'rev_page' => $this->dest->getArticleID() ),
+                       __METHOD__
+               );
+               $this->maxTimestamp = new MWTimestamp( $firstDestTimestamp );
+
+               // Get the timestamp pivot condition
+               try {
+                       if ( $timestamp ) {
+                               // If we have a requested timestamp, use the
+                               // latest revision up to that point as the insertion point
+                               $mwTimestamp = new MWTimestamp( $timestamp );
+                               $lastWorkingTimestamp = $this->dbw->selectField(
+                                       'revision',
+                                       'MAX(rev_timestamp)',
+                                       array(
+                                               'rev_timestamp <= ' . $this->dbw->timestamp( $mwTimestamp ),
+                                               'rev_page' => $this->source->getArticleID()
+                                       ),
+                                       __METHOD__
+                               );
+                               $mwLastWorkingTimestamp = new MWTimestamp( $lastWorkingTimestamp );
+
+                               $timeInsert = $mwLastWorkingTimestamp;
+                               $this->timestampLimit = $mwLastWorkingTimestamp;
+                       } else {
+                               // If we don't, merge entire source page history into the
+                               // beginning of destination page history
+
+                               // Get the latest timestamp of the source
+                               $lastSourceTimestamp = $this->dbw->selectField(
+                                       array( 'page', 'revision' ),
+                                       'rev_timestamp',
+                                       array( 'page_id' => $this->source->getArticleID(),
+                                               'page_latest = rev_id'
+                                       ),
+                                       __METHOD__
+                               );
+                               $lasttimestamp = new MWTimestamp( $lastSourceTimestamp );
+
+                               $timeInsert = $this->maxTimestamp;
+                               $this->timestampLimit = $lasttimestamp;
+                       }
+
+                       $this->timeWhere = "rev_timestamp <= {$this->dbw->timestamp( $timeInsert )}";
+               } catch ( TimestampException $ex ) {
+                       // The timestamp we got is screwed up and merge cannot continue
+                       // This should be detected by $this->isValidMerge()
+                       $this->timestampLimit = false;
+               }
+       }
+
+       /**
+        * Get the number of revisions that will be moved
+        * @return int
+        */
+       public function getRevisionCount() {
+               $count = $this->dbw->selectRowCount( 'revision', '1',
+                       array( 'rev_page' => $this->source->getArticleID(), $this->timeWhere ),
+                       __METHOD__,
+                       array( 'LIMIT' => self::REVISION_LIMIT + 1 )
+               );
+
+               return $count;
+       }
+
+       /**
+        * Get the number of revisions that were moved
+        * Used in the SpecialMergeHistory success message
+        * @return int
+        */
+       public function getMergedRevisionCount() {
+               return $this->revisionsMerged;
+       }
+
+       /**
+        * Check if the merge is possible
+        * @param User $user
+        * @param string $reason
+        * @return Status
+        */
+       public function checkPermissions( User $user, $reason ) {
+               $status = new Status();
+
+               // Check if user can edit both pages
+               $errors = wfMergeErrorArrays(
+                       $this->source->getUserPermissionsErrors( 'edit', $user ),
+                       $this->dest->getUserPermissionsErrors( 'edit', $user )
+               );
+
+               // Convert into a Status object
+               if ( $errors ) {
+                       foreach ( $errors as $error ) {
+                               call_user_func_array( array( $status, 'fatal' ), $error );
+                       }
+               }
+
+               // Anti-spam
+               if ( EditPage::matchSummarySpamRegex( $reason ) !== false ) {
+                       // This is kind of lame, won't display nice
+                       $status->fatal( 'spamprotectiontext' );
+               }
+
+               // Check mergehistory permission
+               if ( !$user->isAllowed( 'mergehistory' ) ) {
+                       // User doesn't have the right to merge histories
+                       $status->fatal( 'mergehistory-fail-permission' );
+               }
+
+               return $status;
+       }
+
+       /**
+        * Does various sanity checks that the merge is
+        * valid. Only things based on the two pages
+        * should be checked here.
+        *
+        * @return Status
+        */
+       public function isValidMerge() {
+               $status = new Status();
+
+               // If either article ID is 0, then revisions cannot be reliably selected
+               if ( $this->source->getArticleID() === 0 ) {
+                       $status->fatal( 'mergehistory-fail-invalid-source' );
+               }
+               if ( $this->dest->getArticleID() === 0 ) {
+                       $status->fatal( 'mergehistory-fail-invalid-dest' );
+               }
+
+               // Make sure page aren't the same
+               if ( $this->source->equals( $this->dest ) ) {
+                       $status->fatal( 'mergehistory-fail-self-merge' );
+               }
+
+               // Make sure the timestamp is valid
+               if ( !$this->timestampLimit ) {
+                       $status->fatal( 'mergehistory-fail-bad-timestamp' );
+               }
+
+               // $this->timestampLimit must be older than $this->maxTimestamp
+               if ( $this->timestampLimit > $this->maxTimestamp ) {
+                       $status->fatal( 'mergehistory-fail-timestamps-overlap' );
+               }
+
+               // Check that there are not too many revisions to move
+               if ( $this->timestampLimit && $this->getRevisionCount() > self::REVISION_LIMIT ) {
+                       $status->fatal( 'mergehistory-fail-toobig', Message::numParam( self::REVISION_LIMIT ) );
+               }
+
+               return $status;
+       }
+
+       /**
+        * Actually attempt the history move
+        *
+        * @todo if all versions of page A are moved to B and then a user
+        * tries to do a reverse-merge via the "unmerge" log link, then page
+        * A will still be a redirect (as it was after the original merge),
+        * though it will have the old revisions back from before (as expected).
+        * The user may have to "undo" the redirect manually to finish the "unmerge".
+        * Maybe this should delete redirects at the source page of merges?
+        *
+        * @param User $user
+        * @param string $reason
+        * @return Status status of the history merge
+        */
+       public function merge( User $user, $reason = '' ) {
+               $status = new Status();
+
+               // Check validity and permissions required for merge
+               $validCheck = $this->isValidMerge(); // Check this first to check for null pages
+               if ( !$validCheck->isOK() ) {
+                       return $validCheck;
+               }
+               $permCheck = $this->checkPermissions( $user, $reason );
+               if ( !$permCheck->isOK() ) {
+                       return $permCheck;
+               }
+
+               $this->dbw->update(
+                       'revision',
+                       array( 'rev_page' => $this->dest->getArticleID() ),
+                       array( 'rev_page' => $this->source->getArticleID(), $this->timeWhere ),
+                       __METHOD__
+               );
+
+               // Check if this did anything
+               $this->revisionsMerged = $this->dbw->affectedRows();
+               if ( $this->revisionsMerged < 1 ) {
+                       $status->fatal( 'mergehistory-fail-no-change' );
+                       return $status;
+               }
+
+               // Make the source page a redirect if no revisions are left
+               $haveRevisions = $this->dbw->selectField(
+                       'revision',
+                       'rev_timestamp',
+                       array( 'rev_page' => $this->source->getArticleID() ),
+                       __METHOD__,
+                       array( 'FOR UPDATE' )
+               );
+               if ( !$haveRevisions ) {
+                       if ( $reason ) {
+                               $reason = wfMessage(
+                                       'mergehistory-comment',
+                                       $this->source->getPrefixedText(),
+                                       $this->dest->getPrefixedText(),
+                                       $reason
+                               )->inContentLanguage()->text();
+                       } else {
+                               $reason = wfMessage(
+                                       'mergehistory-autocomment',
+                                       $this->source->getPrefixedText(),
+                                       $this->dest->getPrefixedText()
+                               )->inContentLanguage()->text();
+                       }
+
+                       $contentHandler = ContentHandler::getForTitle( $this->source );
+                       $redirectContent = $contentHandler->makeRedirectContent(
+                               $this->dest,
+                               wfMessage( 'mergehistory-redirect-text' )->inContentLanguage()->plain()
+                       );
+
+                       if ( $redirectContent ) {
+                               $redirectPage = WikiPage::factory( $this->source );
+                               $redirectRevision = new Revision( array(
+                                       'title' => $this->source,
+                                       'page' => $this->source->getArticleID(),
+                                       'comment' => $reason,
+                                       'content' => $redirectContent ) );
+                               $redirectRevision->insertOn( $this->dbw );
+                               $redirectPage->updateRevisionOn( $this->dbw, $redirectRevision );
+
+                               // Now, we record the link from the redirect to the new title.
+                               // It should have no other outgoing links...
+                               $this->dbw->delete(
+                                       'pagelinks',
+                                       array( 'pl_from' => $this->dest->getArticleID() ),
+                                       __METHOD__
+                               );
+                               $this->dbw->insert( 'pagelinks',
+                                       array(
+                                               'pl_from' => $this->dest->getArticleID(),
+                                               'pl_from_namespace' => $this->dest->getNamespace(),
+                                               'pl_namespace' => $this->dest->getNamespace(),
+                                               'pl_title' => $this->dest->getDBkey() ),
+                                       __METHOD__
+                               );
+                       } else {
+                               // Warning if we couldn't create the redirect
+                               $status->warning( 'mergehistory-warning-redirect-not-created' );
+                       }
+               } else {
+                       $this->source->invalidateCache(); // update histories
+               }
+               $this->dest->invalidateCache(); // update histories
+
+               // Update our logs
+               $logEntry = new ManualLogEntry( 'merge', 'merge' );
+               $logEntry->setPerformer( $user );
+               $logEntry->setComment( $reason );
+               $logEntry->setTarget( $this->source );
+               $logEntry->setParameters( array(
+                       '4::dest' => $this->dest->getPrefixedText(),
+                       '5::mergepoint' => $this->timestampLimit->getTimestamp( TS_MW )
+               ) );
+               $logId = $logEntry->insert();
+               $logEntry->publish( $logId );
+
+               Hooks::run( 'ArticleMergeComplete', array( $this->source, $this->dest ) );
+
+               return $status;
+       }
+}
index 244b713..e527001 100644 (file)
@@ -1573,11 +1573,42 @@ class OutputPage extends ContextSource {
         * @return ParserOptions
         */
        public function parserOptions( $options = null ) {
+               if ( $options !== null && !empty( $options->isBogus ) ) {
+                       // Someone is trying to set a bogus pre-$wgUser PO. Check if it has
+                       // been changed somehow, and keep it if so.
+                       $anonPO = ParserOptions::newFromAnon();
+                       $anonPO->setEditSection( false );
+                       if ( !$options->matches( $anonPO ) ) {
+                               wfLogWarning( __METHOD__ . ': Setting a changed bogus ParserOptions: ' . wfGetAllCallers( 5 ) );
+                               $options->isBogus = false;
+                       }
+               }
+
                if ( !$this->mParserOptions ) {
+                       if ( !$this->getContext()->getUser()->isSafeToLoad() ) {
+                               // $wgUser isn't unstubbable yet, so don't try to get a
+                               // ParserOptions for it. And don't cache this ParserOptions
+                               // either.
+                               $po = ParserOptions::newFromAnon();
+                               $po->setEditSection( false );
+                               $po->isBogus = true;
+                               if ( $options !== null ) {
+                                       $this->mParserOptions = empty( $options->isBogus ) ? $options : null;
+                               }
+                               return $po;
+                       }
+
                        $this->mParserOptions = ParserOptions::newFromContext( $this->getContext() );
                        $this->mParserOptions->setEditSection( false );
                }
-               return wfSetVar( $this->mParserOptions, $options );
+
+               if ( $options !== null && !empty( $options->isBogus ) ) {
+                       // They're trying to restore the bogus pre-$wgUser PO. Do the right
+                       // thing.
+                       return wfSetVar( $this->mParserOptions, null, true );
+               } else {
+                       return wfSetVar( $this->mParserOptions, $options );
+               }
        }
 
        /**
@@ -4055,5 +4086,8 @@ class OutputPage extends ContextSource {
                        'oojs-ui.styles.textures',
                        'mediawiki.widgets.styles',
                ) );
+               // Used by 'skipFunction' of the four 'oojs-ui.styles.*' modules. Please don't treat this as a
+               // public API or you'll be severely disappointed when T87871 is fixed and it disappears.
+               $this->addMeta( 'X-OOUI-PHP', '1' );
        }
 }
index eaab9c8..1eafcfa 100644 (file)
@@ -31,7 +31,7 @@
  */
 function wfEntryPointCheck( $entryPoint ) {
        $mwVersion = '1.27';
-       $minimumVersionPHP = '5.3.3';
+       $minimumVersionPHP = '5.5.9';
        $phpVersion = PHP_VERSION;
 
        if ( !function_exists( 'version_compare' )
index f4f6dca..e76d19e 100644 (file)
@@ -101,22 +101,22 @@ class Revision implements IDBAccessObject {
 
        /**
         * Load either the current, or a specified, revision
-        * that's attached to a given title. If not attached
-        * to that title, will return null.
+        * that's attached to a given link target. If not attached
+        * to that link target, will return null.
         *
         * $flags include:
         *      Revision::READ_LATEST  : Select the data from the master
         *      Revision::READ_LOCKING : Select & lock the data from the master
         *
-        * @param Title $title
+        * @param LinkTarget $linkTarget
         * @param int $id (optional)
         * @param int $flags Bitfield (optional)
         * @return Revision|null
         */
-       public static function newFromTitle( $title, $id = 0, $flags = 0 ) {
+       public static function newFromTitle( LinkTarget $linkTarget, $id = 0, $flags = 0 ) {
                $conds = array(
-                       'page_namespace' => $title->getNamespace(),
-                       'page_title' => $title->getDBkey()
+                       'page_namespace' => $linkTarget->getNamespace(),
+                       'page_title' => $linkTarget->getDBkey()
                );
                if ( $id ) {
                        // Use the specified ID
index ba3d628..b9a1c37 100644 (file)
@@ -796,13 +796,15 @@ foreach ( $wgExtensionFunctions as $func ) {
 
 // If the session user has a 0 id but a valid name, that means we need to
 // autocreate it.
-$sessionUser = MediaWiki\Session\SessionManager::getGlobalSession()->getUser();
-if ( $sessionUser->getId() === 0 && User::isValidUserName( $sessionUser->getName() ) ) {
-       $ps_autocreate = Profiler::instance()->scopedProfileIn( $fname . '-autocreate' );
-       MediaWiki\Session\SessionManager::autoCreateUser( $sessionUser );
-       Profiler::instance()->scopedProfileOut( $ps_autocreate );
+if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
+       $sessionUser = MediaWiki\Session\SessionManager::getGlobalSession()->getUser();
+       if ( $sessionUser->getId() === 0 && User::isValidUserName( $sessionUser->getName() ) ) {
+               $ps_autocreate = Profiler::instance()->scopedProfileIn( $fname . '-autocreate' );
+               MediaWiki\Session\SessionManager::autoCreateUser( $sessionUser );
+               Profiler::instance()->scopedProfileOut( $ps_autocreate );
+       }
+       unset( $sessionUser );
 }
-unset( $sessionUser );
 
 wfDebug( "Fully initialised\n" );
 $wgFullyInitialised = true;
index 55c7179..50721af 100644 (file)
@@ -161,9 +161,9 @@ class Title implements LinkTarget {
         * Avoid usage of this singleton by using TitleValue
         * and the associated services when possible.
         *
-        * @return TitleParser
+        * @return MediaWikiTitleCodec
         */
-       private static function getTitleParser() {
+       private static function getMediaWikiTitleCodec() {
                global $wgContLang, $wgLocalInterwikis;
 
                static $titleCodec = null;
@@ -200,9 +200,9 @@ class Title implements LinkTarget {
         * @return TitleFormatter
         */
        private static function getTitleFormatter() {
-               // NOTE: we know that getTitleParser() returns a MediaWikiTitleCodec,
+               // NOTE: we know that getMediaWikiTitleCodec() returns a MediaWikiTitleCodec,
                //      which implements TitleFormatter.
-               return self::getTitleParser();
+               return self::getMediaWikiTitleCodec();
        }
 
        function __construct() {
@@ -3353,7 +3353,7 @@ class Title implements LinkTarget {
                // @note: splitTitleString() is a temporary hack to allow MediaWikiTitleCodec to share
                //        the parsing code with Title, while avoiding massive refactoring.
                // @todo: get rid of secureAndSplit, refactor parsing code.
-               $titleParser = self::getTitleParser();
+               $titleParser = self::getMediaWikiTitleCodec();
                // MalformedTitleException can be thrown here
                $parts = $titleParser->splitTitleString( $dbkey, $this->getDefaultNamespace() );
 
index fd48005..e46d86f 100644 (file)
@@ -128,7 +128,7 @@ class WebResponse {
 
                $func = $options['raw'] ? 'setrawcookie' : 'setcookie';
 
-               if ( Hooks::run( 'WebResponseSetCookie', array( &$name, &$value, &$expire, $options ) ) ) {
+               if ( Hooks::run( 'WebResponseSetCookie', array( &$name, &$value, &$expire, &$options ) ) ) {
                        $cookie = $options['prefix'] . $name;
                        $data = array(
                                'name' => (string)$cookie,
index 643d1c4..9b70994 100644 (file)
@@ -43,8 +43,9 @@ class EditAction extends FormlessAction {
        public function show() {
                $this->useTransactionalTimeLimit();
 
+               $out = $this->getOutput();
+               $out->setRobotPolicy( 'noindex,nofollow' );
                if ( $this->getContext()->getConfig()->get( 'UseMediaWikiUIEverywhere' ) ) {
-                       $out = $this->getOutput();
                        $out->addModuleStyles( array(
                                'mediawiki.ui.input',
                                'mediawiki.ui.checkbox',
index 458fd18..3b62541 100644 (file)
@@ -90,6 +90,7 @@ class ApiMain extends ApiBase {
                'revisiondelete' => 'ApiRevisionDelete',
                'managetags' => 'ApiManageTags',
                'tag' => 'ApiTag',
+               'mergehistory' => 'ApiMergeHistory',
        );
 
        /**
@@ -1180,27 +1181,44 @@ class ApiMain extends ApiBase {
                        && in_array( 'bot', $this->getUser()->getGroups() )
                        && wfGetLB()->getServerCount() > 1
                ) {
-                       // Figure out how many servers have passed the lag threshold
-                       $numLagged = 0;
-                       $lagLimit = $this->getConfig()->get( 'APIMaxLagThreshold' );
-                       foreach ( wfGetLB()->getLagTimes() as $lag ) {
-                               if ( $lag > $lagLimit ) {
-                                       ++$numLagged;
-                               }
-                       }
-                       // If a majority of slaves are too lagged then disallow writes
-                       $slaveCount = wfGetLB()->getServerCount() - 1;
-                       if ( $numLagged >= ceil( $slaveCount / 2 ) ) {
-                               $parsed = $this->parseMsg( array( 'readonlytext' ) );
-                               $this->dieUsage(
-                                       $parsed['info'],
-                                       $parsed['code'],
-                                       /* http error */
-                                       0,
-                                       array( 'readonlyreason' => "Waiting for $numLagged lagged database(s)" )
-                               );
+                       $this->checkBotReadOnly();
+               }
+       }
+
+       /**
+        * Check whether we are readonly for bots
+        */
+       private function checkBotReadOnly() {
+               // Figure out how many servers have passed the lag threshold
+               $numLagged = 0;
+               $lagLimit = $this->getConfig()->get( 'APIMaxLagThreshold' );
+               $laggedServers = array();
+               $loadBalancer = wfGetLB();
+               foreach ( $loadBalancer->getLagTimes() as $serverIndex => $lag ) {
+                       if ( $lag > $lagLimit ) {
+                               ++$numLagged;
+                               $laggedServers[] = $loadBalancer->getServerName( $serverIndex ) . " ({$lag}s)";
                        }
                }
+
+               // If a majority of slaves are too lagged then disallow writes
+               $slaveCount = wfGetLB()->getServerCount() - 1;
+               if ( $numLagged >= ceil( $slaveCount / 2 ) ) {
+                       $laggedServers = join( ', ', $laggedServers );
+                       wfDebugLog(
+                               'api-readonly',
+                               "Api request failed as read only because the following DBs are lagged: $laggedServers"
+                       );
+
+                       $parsed = $this->parseMsg( array( 'readonlytext' ) );
+                       $this->dieUsage(
+                               $parsed['info'],
+                               $parsed['code'],
+                               /* http error */
+                               0,
+                               array( 'readonlyreason' => "Waiting for $numLagged lagged database(s)" )
+                       );
+               }
        }
 
        /**
@@ -1263,7 +1281,9 @@ class ApiMain extends ApiBase {
                $module = $this->setupModule();
                $this->mModule = $module;
 
-               $this->setRequestExpectations( $module );
+               if ( !$this->mInternalMode ) {
+                       $this->setRequestExpectations( $module );
+               }
 
                $this->checkExecutePermissions( $module );
 
diff --git a/includes/api/ApiMergeHistory.php b/includes/api/ApiMergeHistory.php
new file mode 100644 (file)
index 0000000..8fa9d28
--- /dev/null
@@ -0,0 +1,143 @@
+<?php
+/**
+ *
+ *
+ * Created on Dec 29, 2015
+ *
+ * Copyright © 2015 Geoffrey Mon <geofbot@gmail.com>
+ *
+ * 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
+ */
+
+/**
+ * API Module to merge page histories
+ * @ingroup API
+ */
+class ApiMergeHistory extends ApiBase {
+
+       public function execute() {
+               $this->useTransactionalTimeLimit();
+
+               $user = $this->getUser();
+               $params = $this->extractRequestParams();
+
+               $this->requireOnlyOneParameter( $params, 'from', 'fromid' );
+               $this->requireOnlyOneParameter( $params, 'to', 'toid' );
+
+               // Get page objects (nonexistant pages get caught in MergeHistory::isValidMerge())
+               if ( isset( $params['from'] ) ) {
+                       $fromTitle = Title::newFromText( $params['from'] );
+                       if ( !$fromTitle || $fromTitle->isExternal() ) {
+                               $this->dieUsageMsg( array( 'invalidtitle', $params['from'] ) );
+                       }
+               } elseif ( isset( $params['fromid'] ) ) {
+                       $fromTitle = Title::newFromID( $params['fromid'] );
+                       if ( !$fromTitle ) {
+                               $this->dieUsageMsg( array( 'nosuchpageid', $params['fromid'] ) );
+                       }
+               }
+
+               if ( isset( $params['to'] ) ) {
+                       $toTitle = Title::newFromText( $params['to'] );
+                       if ( !$toTitle || $toTitle->isExternal() ) {
+                               $this->dieUsageMsg( array( 'invalidtitle', $params['to'] ) );
+                       }
+               } elseif ( isset( $params['toid'] ) ) {
+                       $toTitle = Title::newFromID( $params['toid'] );
+                       if ( !$toTitle ) {
+                               $this->dieUsageMsg( array( 'nosuchpageid', $params['toid'] ) );
+                       }
+               }
+
+               $reason = $params['reason'];
+               $timestamp = $params['timestamp'];
+
+               // Merge!
+               $status = $this->merge( $fromTitle, $toTitle, $timestamp, $reason );
+               if ( !$status->isOK() ) {
+                       $this->dieStatus( $status );
+               }
+
+               $r = array(
+                       'from' => $fromTitle->getPrefixedText(),
+                       'to' => $toTitle->getPrefixedText(),
+                       'timestamp' => wfTimestamp( TS_ISO_8601, $params['timestamp'] ),
+                       'reason' => $params['reason']
+               );
+               $result = $this->getResult();
+
+               $result->addValue( null, $this->getModuleName(), $r );
+       }
+
+       /**
+        * @param Title $from
+        * @param Title $to
+        * @param string $timestamp
+        * @param string $reason
+        * @return Status
+        */
+       protected function merge( Title $from, Title $to, $timestamp, $reason ) {
+               $mh = new MergeHistory( $from, $to, $timestamp );
+
+               return $mh->merge( $this->getUser(), $reason );
+       }
+
+       public function mustBePosted() {
+               return true;
+       }
+
+       public function isWriteMode() {
+               return true;
+       }
+
+       public function getAllowedParams() {
+               return array(
+                       'from' => null,
+                       'fromid' => array(
+                               ApiBase::PARAM_TYPE => 'integer'
+                       ),
+                       'to' => null,
+                       'toid' => array(
+                               ApiBase::PARAM_TYPE => 'integer'
+                       ),
+                       'timestamp' => array(
+                               ApiBase::PARAM_TYPE => 'timestamp'
+                       ),
+                       'reason' => '',
+               );
+       }
+
+       public function needsToken() {
+               return 'csrf';
+       }
+
+       protected function getExamplesMessages() {
+               return array(
+                       'action=mergehistory&from=Oldpage&to=Newpage&token=123ABC&' .
+                       'reason=Reason'
+                       => 'apihelp-mergehistory-example-merge',
+                       'action=mergehistory&from=Oldpage&to=Newpage&token=123ABC&' .
+                       'reason=Reason&timestamp=2015-12-31T04%3A37%3A41Z' // TODO
+                       => 'apihelp-mergehistory-example-merge-timestamp',
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Mergehistory';
+       }
+}
index 5c3434f..f24a7cc 100644 (file)
@@ -63,15 +63,57 @@ interface IApiMessage extends MessageSpecifier {
        public function setApiData( array $data );
 }
 
+/**
+ * Trait to implement the IApiMessage interface for Message subclasses
+ * @since 1.27
+ * @ingroup API
+ */
+trait ApiMessageTrait {
+       protected $apiCode = null;
+       protected $apiData = array();
+
+       public function getApiCode() {
+               return $this->apiCode === null ? $this->getKey() : $this->apiCode;
+       }
+
+       public function setApiCode( $code, array $data = null ) {
+               $this->apiCode = $code;
+               if ( $data !== null ) {
+                       $this->setApiData( $data );
+               }
+       }
+
+       public function getApiData() {
+               return $this->apiData;
+       }
+
+       public function setApiData( array $data ) {
+               $this->apiData = $data;
+       }
+
+       public function serialize() {
+               return serialize( array(
+                       'parent' => parent::serialize(),
+                       'apiCode' => $this->apiCode,
+                       'apiData' => $this->apiData,
+               ) );
+       }
+
+       public function unserialize( $serialized ) {
+               $data = unserialize( $serialized );
+               parent::unserialize( $data['parent'] );
+               $this->apiCode = $data['apiCode'];
+               $this->apiData = $data['apiData'];
+       }
+}
+
 /**
  * Extension of Message implementing IApiMessage
  * @since 1.25
  * @ingroup API
- * @todo: Would be nice to use a Trait here to avoid code duplication
  */
 class ApiMessage extends Message implements IApiMessage {
-       protected $apiCode = null;
-       protected $apiData = array();
+       use ApiMessageTrait;
 
        /**
         * Create an IApiMessage for the message
@@ -119,51 +161,15 @@ class ApiMessage extends Message implements IApiMessage {
                $this->apiCode = $code;
                $this->apiData = (array)$data;
        }
-
-       public function getApiCode() {
-               return $this->apiCode === null ? $this->getKey() : $this->apiCode;
-       }
-
-       public function setApiCode( $code, array $data = null ) {
-               $this->apiCode = $code;
-               if ( $data !== null ) {
-                       $this->setApiData( $data );
-               }
-       }
-
-       public function getApiData() {
-               return $this->apiData;
-       }
-
-       public function setApiData( array $data ) {
-               $this->apiData = $data;
-       }
-
-       public function serialize() {
-               return serialize( array(
-                       'parent' => parent::serialize(),
-                       'apiCode' => $this->apiCode,
-                       'apiData' => $this->apiData,
-               ) );
-       }
-
-       public function unserialize( $serialized ) {
-               $data = unserialize( $serialized );
-               parent::unserialize( $data['parent'] );
-               $this->apiCode = $data['apiCode'];
-               $this->apiData = $data['apiData'];
-       }
 }
 
 /**
  * Extension of RawMessage implementing IApiMessage
  * @since 1.25
  * @ingroup API
- * @todo: Would be nice to use a Trait here to avoid code duplication
  */
 class ApiRawMessage extends RawMessage implements IApiMessage {
-       protected $apiCode = null;
-       protected $apiData = array();
+       use ApiMessageTrait;
 
        /**
         * @param RawMessage|string|array $msg
@@ -189,38 +195,4 @@ class ApiRawMessage extends RawMessage implements IApiMessage {
                $this->apiCode = $code;
                $this->apiData = (array)$data;
        }
-
-       public function getApiCode() {
-               return $this->apiCode === null ? $this->getKey() : $this->apiCode;
-       }
-
-       public function setApiCode( $code, array $data = null ) {
-               $this->apiCode = $code;
-               if ( $data !== null ) {
-                       $this->setApiData( $data );
-               }
-       }
-
-       public function getApiData() {
-               return $this->apiData;
-       }
-
-       public function setApiData( array $data ) {
-               $this->apiData = $data;
-       }
-
-       public function serialize() {
-               return serialize( array(
-                       'parent' => parent::serialize(),
-                       'apiCode' => $this->apiCode,
-                       'apiData' => $this->apiData,
-               ) );
-       }
-
-       public function unserialize( $serialized ) {
-               $data = unserialize( $serialized );
-               parent::unserialize( $data['parent'] );
-               $this->apiCode = $data['apiCode'];
-               $this->apiData = $data['apiData'];
-       }
 }
index 47e8e22..0d965e6 100644 (file)
        "apihelp-managetags-example-delete": "Löscht die <kbd>vandlaism</kbd>-Markierung mit der Begründung <kbd>Misspelt</kbd>.",
        "apihelp-managetags-example-activate": "Aktiviert eine Markierung namens <kbd>spam</kbd> mit der Begründung <kbd>For use in edit patrolling</kbd> (für die Eingangskontrolle).",
        "apihelp-managetags-example-deactivate": "Deaktiviert eine Markierung namens <kbd>spam</kbd> mit der Begründung <kbd>No longer required</kbd> (nicht mehr benötigt).",
+       "apihelp-mergehistory-description": "Führt Versionsgeschichten von Seiten zusammen.",
        "apihelp-move-description": "Eine Seite verschieben.",
        "apihelp-move-param-from": "Titel der zu verschiebenden Seite. Kann nicht zusammen mit <var>$1fromid</var> verwendet werden.",
        "apihelp-move-param-fromid": "Seitenkennung der zu verschiebenden Seite. Kann nicht zusammen mit <var>$1from</var> verwendet werden.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Ergänzt den Titel des Interwikis.",
        "apihelp-query+iwbacklinks-param-dir": "Die Auflistungsrichtung.",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Ergänzt die vollständige URL.",
+       "apihelp-query+iwlinks-param-limit": "Wie viele Interwiki-Links zurückgegeben werden sollen.",
+       "apihelp-query+iwlinks-param-prefix": "Gibt nur Interwiki-Links mit diesem Präfix zurück.",
        "apihelp-query+iwlinks-param-dir": "Die Auflistungsrichtung.",
        "apihelp-query+langbacklinks-param-limit": "Wie viele Gesamtseiten zurückgegeben werden sollen.",
        "apihelp-query+langbacklinks-param-dir": "Die Auflistungsrichtung.",
        "apihelp-query+langlinks-param-limit": "Wie viele Sprachlinks zurückgegeben werden sollen.",
        "apihelp-query+langlinks-paramvalue-prop-url": "Ergänzt die vollständige URL.",
        "apihelp-query+langlinks-param-dir": "Die Auflistungsrichtung.",
+       "apihelp-query+links-param-limit": "Wie viele Links zurückgegeben werden sollen.",
        "apihelp-query+links-param-dir": "Die Auflistungsrichtung.",
        "apihelp-query+links-example-simple": "Links von der <kbd>Hauptseite</kbd> abrufen",
        "apihelp-query+linkshere-description": "Alle Seiten finden, die auf die angegebenen Seiten verlinken.",
        "apihelp-query+linkshere-paramvalue-prop-pageid": "Die Seitenkennung jeder Seite.",
+       "apihelp-query+linkshere-paramvalue-prop-title": "Titel jeder Seite.",
        "apihelp-query+logevents-description": "Ereignisse von den Logbüchern abrufen.",
+       "apihelp-query+logevents-paramvalue-prop-type": "Ergänzt den Typ des Logbuchereignisses.",
+       "apihelp-query+logevents-paramvalue-prop-comment": "Ergänzt den Kommentar des Logbuchereignisses.",
        "apihelp-query+logevents-example-simple": "Listet die letzten Logbuch-Ereignisse auf.",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "Fügt die Seitenkennung hinzu.",
        "apihelp-query+pageswithprop-param-limit": "Die maximale Anzahl zurückzugebender Seiten.",
        "apihelp-query+prefixsearch-param-search": "Such-Zeichenfolge.",
        "apihelp-query+prefixsearch-param-offset": "Anzahl der zu überspringenden Ergebnisse.",
+       "apihelp-query+querypage-param-limit": "Anzahl der zurückzugebenden Ergebnisse.",
+       "apihelp-query+recentchanges-description": "Listet die letzten Änderungen auf.",
        "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Ergänzt den Zeitstempel für die Bearbeitung.",
        "apihelp-query+recentchanges-paramvalue-prop-tags": "Listet Markierungen für den Eintrag auf.",
        "apihelp-query+recentchanges-example-simple": "Listet die letzten Änderungen auf.",
index a1b303f..4a1f2f1 100644 (file)
        "apihelp-managetags-example-activate": "Activate a tag named <kbd>spam</kbd> with the reason <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-deactivate": "Deactivate a tag named <kbd>spam</kbd> with the reason <kbd>No longer required</kbd>",
 
+       "apihelp-mergehistory-description": "Merge page histories.",
+       "apihelp-mergehistory-param-from": "Title of the page from which history will be merged. Cannot be used together with <var>$1fromid</var>.",
+       "apihelp-mergehistory-param-fromid": "Page ID of the page from which history will be merged. Cannot be used together with <var>$1from</var>.",
+       "apihelp-mergehistory-param-to": "Title of the page to which history will be merged. Cannot be used together with <var>$1toid</var>.",
+       "apihelp-mergehistory-param-toid": "Page ID of the page to which history will be merged. Cannot be used together with <var>$1to</var>.",
+       "apihelp-mergehistory-param-timestamp": "Timestamp up to which revisions will be moved from the source page's history to the destination page's history. If omitted, the entire page history of the source page will be merged into the destination page.",
+       "apihelp-mergehistory-param-reason": "Reason for the history merge.",
+       "apihelp-mergehistory-example-merge": "Merge the entire history of <kbd>Oldpage</kbd> into <kbd>Newpage</kbd>.",
+       "apihelp-mergehistory-example-merge-timestamp": "Merge the page revisions of <kbd>Oldpage</kbd> dating up to <kbd>2015-12-31T04:37:41Z</kbd> into <kbd>Newpage</kbd>.",
+
        "apihelp-move-description": "Move a page.",
        "apihelp-move-param-from": "Title of the page to rename. Cannot be used together with <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "Page ID of the page to rename. Cannot be used together with <var>$1from</var>.",
index a0af3b2..309724c 100644 (file)
        "apihelp-managetags-example-delete": "Supprimer la balise <kbd>vandlaism</kbd> avec le motif <kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "Activer une balise nommée <kbd>spam</kbd> avec le motif <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-deactivate": "Désactiver une balise nommée <kbd>spam</kbd> avec le motif <kbd>No longer required</kbd>",
+       "apihelp-mergehistory-description": "Fusionner les historiques des pages.",
+       "apihelp-mergehistory-param-from": "Titre de la page depuis laquelle l’historique sera fusionné. Impossible à utiliser avec <var>$1fromid</var>.",
+       "apihelp-mergehistory-param-fromid": "ID de la page depuis laquelle l’historique sera fusionné. Impossible à utiliser avec <var>$1from</var>.",
+       "apihelp-mergehistory-param-to": "Titre de la page vers laquelle l’historique sera fusionné. Impossible à utiliser avec <var>$1toid</var>.",
+       "apihelp-mergehistory-param-toid": "ID de la page vers laquelle l’historique sera fusionné. Impossible à utiliser avec <var>$1to</var>.",
+       "apihelp-mergehistory-param-timestamp": "Horodatage jusqu’auquel les révisions seront déplacées de l’historique de la page source vers l’historique de la page de destination. S’il est omis, tout l’historique de la page source sera fusionné avec celui de la page de destination.",
+       "apihelp-mergehistory-param-reason": "Raison pour fusionner l’historique.",
+       "apihelp-mergehistory-example-merge": "Fusionner l’historique complet de  <kbd>AnciennePage</kbd> dans <kbd>NouvellePage</kbd>.",
+       "apihelp-mergehistory-example-merge-timestamp": "Fusionner les révisions de la page <kbd>AnciennePage</kbd> jusqu’au <kbd>2015-12-31T04:37:41Z</kbd> dans <kbd>NouvellePage</kbd>.",
        "apihelp-move-description": "Déplacer une page.",
        "apihelp-move-param-from": "Titre de la page à renommer. Impossible de l’utiliser avec <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "ID de la page à renommer. Impossible à utiliser avec <var>$1from</var>.",
index 4da0430..e18cd60 100644 (file)
        "apihelp-managetags-example-delete": "מחיקת התג <kbd>vandlaism</kbd> עם הסיבה <kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "הפעלת התג <kbd>spam</kbd> עם הסיבה <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-deactivate": "כיבוי התג <kbd>spam</kbd> עם הסיבה <kbd>No longer required</kbd>",
+       "apihelp-mergehistory-description": "מיזוג גרסאות של דפים.",
+       "apihelp-mergehistory-param-from": "כותרת הדף שההיסטוריה שלו תמוזג. לא ניתן להשתמש בזה יחד עם <var>$1fromid</var>.",
+       "apihelp-mergehistory-param-fromid": "מזהה הדף שממנו תמוזג ההיסטוריה. לא ניתן להשתמש בזה יחד עם <var>$1from</var>.",
+       "apihelp-mergehistory-param-to": "כותרת הדף שההיסטוריה תמוזג אליו. לא ניתן להשתמש בזה יחד עם <var>$1toid</var>.",
+       "apihelp-mergehistory-param-toid": "מזהה הדף שההיסטוריה תמוזג אליו. לא ניתן להשתמש בזה יחד עם <var>$1to</var>.",
+       "apihelp-mergehistory-param-timestamp": "חותם־הזמן שהגרסאות עד אליו יועברו מההיסטוריה של דף המקור על ההיסטוריה של דף היעד. אם מושמט, כל ההיסטוריה של דף המקור תמוזג עם דף היעד.",
+       "apihelp-mergehistory-param-reason": "סיבה למיזוג ההיסטוריה.",
+       "apihelp-mergehistory-example-merge": "מיזוג כל ההיסטוריה של <kbd>Oldpage</kbd> אל <kbd>Newpage</kbd>.",
+       "apihelp-mergehistory-example-merge-timestamp": "מיזוג גרסאות הדפים של <kbd>Oldpage</kbd> עד <kbd dir=\"ltr\">2015-12-31T04:37:41Z</kbd> אל <kbd>Newpage</kbd>.",
        "apihelp-move-description": "העברת עמוד.",
        "apihelp-move-param-from": "שם הדף ששמו ישונה. לא יכול לשמש יחד עם <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "מזהה הדף של הדף שצריך לשנות את שמו. לא יכול לשמש עם <var>$1from</var>.",
index bca4a43..ae4c71a 100644 (file)
        "apihelp-login-param-password": "Password.",
        "apihelp-login-param-domain": "Dominio (opzionale).",
        "apihelp-login-example-login": "Entra.",
+       "apihelp-mergehistory-description": "Unisce cronologie pagine.",
+       "apihelp-mergehistory-param-from": "Il titolo della pagina da cui cronologia sarà unita. Non può essere usato insieme a <var>$1fromid</var>.",
+       "apihelp-mergehistory-param-fromid": "L'ID della pagina da cui cronologia sarà unita. Non può essere usato insieme a <var>$1from</var>.",
+       "apihelp-mergehistory-param-to": "Il titolo della pagina in cui cronologia sarà unita. Non può essere usato insieme a <var>$1toid</var>.",
+       "apihelp-mergehistory-param-toid": "L'ID della pagina in cui cronologia sarà unita. Non può essere usato insieme a <var>$1to</var>.",
+       "apihelp-mergehistory-param-timestamp": "Il timestamp fino a cui le versioni saranno spostate dalla cronologia della pagina di origine a quella della pagina di destinazione. Se omesso, l'intera cronologia della pagina di origine sarà unita nella pagina di destinazione.",
+       "apihelp-mergehistory-param-reason": "Motivo per l'unione della cronologia.",
+       "apihelp-mergehistory-example-merge": "Unisci l'intera cronologia di <kbd>Oldpage</kbd> in <kbd>Newpage</kbd>.",
+       "apihelp-mergehistory-example-merge-timestamp": "Unisci le versioni della pagina <kbd>Oldpage</kbd> fino a <kbd>2015-12-31T04:37:41Z</kbd> in <kbd>Newpage</kbd>.",
        "apihelp-move-description": "Sposta una pagina.",
        "apihelp-move-param-reason": "Motivo della rinomina.",
        "apihelp-move-param-movetalk": "Rinomina la pagina di discussione, se esiste.",
index e7bfbe1..8ac4d51 100644 (file)
        "api-help-datatypes-header": "Datentypen",
        "api-help-param-type-user": "Typ: {{PLURAL:$1|1=Benotzernumm|2=Lëscht vu Benotzernimm}}",
        "api-help-examples": "{{PLURAL:$1|Beispill|Beispiler}}:",
-       "api-help-permissions": "{{PLURAL:$1|Autorisatioun|Autorisatiounen}}:"
+       "api-help-permissions": "{{PLURAL:$1|Autorisatioun|Autorisatiounen}}:",
+       "api-help-open-in-apisandbox": "<small>[an der Sandkëscht opmaachen]</small>"
 }
index e3354aa..df4f881 100644 (file)
        "apihelp-managetags-example-delete": "{{doc-apihelp-example|managetags|info={{doc-important|The text \"vandlaism\" in this message is intentionally misspelled; the example being documented by this message is the deletion of a misspelled tag.}}}}",
        "apihelp-managetags-example-activate": "{{doc-apihelp-example|managetags}}",
        "apihelp-managetags-example-deactivate": "{{doc-apihelp-example|managetags}}",
+       "apihelp-mergehistory-description": "{{doc-apihelp-description|mergehistory}}",
+       "apihelp-mergehistory-param-from": "{{doc-apihelp-param|mergehistory|from}}",
+       "apihelp-mergehistory-param-fromid": "{{doc-apihelp-param|mergehistory|fromid}}",
+       "apihelp-mergehistory-param-to": "{{doc-apihelp-param|mergehistory|to}}",
+       "apihelp-mergehistory-param-toid": "{{doc-apihelp-param|mergehistory|toid}}",
+       "apihelp-mergehistory-param-timestamp": "{{doc-apihelp-param|mergehistory|timestamp}}",
+       "apihelp-mergehistory-param-reason": "{{doc-apihelp-param|mergehistory|reason}}",
+       "apihelp-mergehistory-example-merge": "{{doc-apihelp-example|mergehistory}}",
+       "apihelp-mergehistory-example-merge-timestamp": "{{doc-apihelp-example|mergehistory}}",
        "apihelp-move-description": "{{doc-apihelp-description|move}}",
        "apihelp-move-param-from": "{{doc-apihelp-param|move|from}}",
        "apihelp-move-param-fromid": "{{doc-apihelp-param|move|fromid}}",
index 508a4c4..a692ff2 100644 (file)
@@ -12,7 +12,8 @@
                        "Nzeemin",
                        "INS Pirat",
                        "Macofe",
-                       "Краснорядцева Елена"
+                       "Краснорядцева Елена",
+                       "Iniquity"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Документация]]\n* [[mw:API:FAQ|ЧаВО]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Почтовая рассылка]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Новости API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Ошибки и запросы]\n</div>\n<strong>Статус:</strong> Все отображаемые на этой странице функции должны работать, однако API находится в статусе активной разработки, и может измениться в любой момент. Подпишитесь на  [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ почтовую рассылку mediawiki-api-announce], чтобы быть в курсе обновлений.\n\n<strong>Ошибочные запросы:</strong> Если API получает запрос с ошибкой, вернётся заголовок HTTP с ключом \"MediaWiki-API-Error\", после чего значение заголовка и код ошибки будут отправлены обратно и установлены в то же значение. Более подробную информацию см. [[mw:API:Errors_and_warnings|API: Ошибки и предупреждения]].",
        "apihelp-login-param-domain": "Домен (необязательно).",
        "apihelp-login-example-login": "Войти",
        "apihelp-logout-description": "Выйти и очистить данные сессии.",
+       "apihelp-mergehistory-description": "Объединение историй правок",
        "apihelp-move-description": "Переместить страницу.",
        "apihelp-move-param-to": "Заголовок, в который следует переименовать страницу.",
        "apihelp-move-param-reason": "Причина переименования.",
        "apihelp-upload-param-url": "URL-Адрес для извлечения файла из.",
        "apihelp-upload-param-offset": "Смещение блока в байтах.",
        "apihelp-upload-param-chunk": "Кусок содержимого.",
-       "apihelp-upload-param-asyncdownload": "Сделать извлечение URL-адреса асинхронно",
        "apihelp-upload-example-url": "Загрузить через URL",
        "apihelp-userrights-description": "Изменить членство в группе пользователей.",
        "apihelp-userrights-param-user": "Имя пользователя",
diff --git a/includes/api/i18n/sh.json b/includes/api/i18n/sh.json
new file mode 100644 (file)
index 0000000..19d31d4
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Conquistador"
+               ]
+       },
+       "apihelp-login-param-password": "Lozinka."
+}
index a10452d..f611160 100644 (file)
@@ -6,11 +6,13 @@
                        "Uğurkent",
                        "Gorizon",
                        "HakanIST",
-                       "Imabadplayer"
+                       "Imabadplayer",
+                       "İnternion"
                ]
        },
        "apihelp-block-description": "Bir kullanıcıyı engelle.",
        "apihelp-block-param-reason": "Engelleme sebebi.",
+       "apihelp-createaccount-description": "Yeni bir kullanıcı hesabı oluşturun.",
        "apihelp-createaccount-param-name": "Kullanıcı adı.",
        "apihelp-createaccount-param-password": "Parola (ignored if <var>$1mailpassword</var> is set).",
        "apihelp-createaccount-param-email": "Kullanıcının e-posta adresi (isteğe bağlı).",
index bf18a7e..41ce9c4 100644 (file)
@@ -17,7 +17,8 @@
                        "RyRubyy",
                        "Umherirrender",
                        "Apflu",
-                       "Hzy980512"
+                       "Hzy980512",
+                       "PhiLiP"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|文档]]\n* [[mw:API:FAQ|常见问题]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 程序错误与功能请求]\n</div>\n<strong>状态信息:</strong>本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n<strong>错误请求:</strong>当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅[[mw:API:Errors_and_warnings|API: 错误与警告]]。\n\n<strong>测试中:</strong>测试API请求的易用性,请参见[[Special:ApiSandbox]]。",
        "apihelp-managetags-example-delete": "删除<kbd>vandlaism</kbd>标签,原因<kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "激活一个名为<kbd>spam</kbd>的标签,原因<kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-deactivate": "停用一个名为<kbd>spam</kbd>的标签,原因<kbd>No longer required</kbd>",
+       "apihelp-mergehistory-description": "合并页面历史。",
+       "apihelp-mergehistory-param-from": "将被合并历史的页面的标题。不能与<var>$1fromid</var>一起使用。",
+       "apihelp-mergehistory-param-fromid": "将被合并历史的页面的页面ID。不能与<var>$1from</var>一起使用。",
+       "apihelp-mergehistory-param-to": "将要合并历史的页面的标题。不能与<var>$1toid</var>一起使用。",
+       "apihelp-mergehistory-param-toid": "将要合并历史的页面的页面ID。不能与<var>$1to</var>一起使用。",
+       "apihelp-mergehistory-param-reason": "历史合并的原因。",
+       "apihelp-mergehistory-example-merge": "将<kbd>Oldpage</kbd>的完整历史合并至<kbd>Newpage</kbd>。",
+       "apihelp-mergehistory-example-merge-timestamp": "将<kbd>Oldpage</kbd>直到<kbd>2015-12-31T04:37:41Z</kbd>的页面修订版本合并至<kbd>Newpage</kbd>。",
        "apihelp-move-description": "移动一个页面。",
        "apihelp-move-param-from": "要重命名的页面标题。不能与<var>$1fromid</var>一起使用。",
        "apihelp-move-param-fromid": "您希望移动的页面ID。不能与<var>$1from</var>一起使用。",
        "apihelp-query+allrevisions-param-generatetitles": "当作为生成器使用时,生成标题而不是修订ID。",
        "apihelp-query+allrevisions-example-user": "列出由用户<kbd>Example</kbd>作出的最近50次贡献。",
        "apihelp-query+allrevisions-example-ns-main": "列举主名字空间中的前50次修订。",
-       "apihelp-query+mystashedfiles-description": "获取当前用户的上传藏匿中的文件列表。",
+       "apihelp-query+mystashedfiles-description": "获取当前用户上传暂存库中的文件列表。",
        "apihelp-query+mystashedfiles-param-prop": "要检索文件的属性。",
        "apihelp-query+mystashedfiles-paramvalue-prop-size": "检索文件大小和图片尺寸。",
        "apihelp-query+mystashedfiles-paramvalue-prop-type": "检索文件的MIME类型和媒体类型。",
-       "apihelp-query+mystashedfiles-param-limit": "获取多少文件。",
+       "apihelp-query+mystashedfiles-param-limit": "要获取文件的数量。",
+       "apihelp-query+mystashedfiles-example-simple": "获取当前用户上传暂存库中的文件的filekey、大小和像素尺寸。",
        "apihelp-query+alltransclusions-description": "列出所有嵌入页面(使用&#123;&#123;x&#125;&#125;嵌入的页面),包括不存在的。",
        "apihelp-query+alltransclusions-param-from": "要列举的起始嵌入标题。",
        "apihelp-query+alltransclusions-param-to": "要列举的最终嵌入标题。",
        "apihelp-query+imageinfo-param-urlwidth": "如果$2prop=url被设定,将返回至缩放到此宽度的一张图片的URL。\n由于性能原因,如果此消息被使用,将不会返回超过$1张被缩放的图片。",
        "apihelp-query+imageinfo-param-urlheight": "与$1urlwidth类似。",
        "apihelp-query+imageinfo-param-metadataversion": "要使用的元数据版本。如果<kbd>latest</kbd>被指定,则使用最新版本。默认为<kbd>1</kbd>以便向下兼容。",
-       "apihelp-query+imageinfo-param-extmetadatalanguage": "要取得extmetadata的语言。This affects both which translation to fetch, if multiple are available, as well as how things like numbers and various values are formatted.",
+       "apihelp-query+imageinfo-param-extmetadatalanguage": "要取得extmetadata的语言。这会影响到抓取翻译的选择,如果有多个可用的话,还会影响到数字等数值的格式。",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "如果用于extmetadata属性的翻译可用,则全部取得。",
        "apihelp-query+imageinfo-param-extmetadatafilter": "如果指定且非空,则只为$1prop=extmetadata返回这些键。",
        "apihelp-query+imageinfo-param-urlparam": "处理器特定的参数字符串。例如PDF可能使用<kbd>page15-100px</kbd>。<var>$1urlwidth</var>必须被使用,并与<var>$1urlparam</var>一致。",
        "apihelp-query+redirects-param-show": "只显示符合这些标准的项目:\n;fragment:只显示带碎片的重定向。\n;!fragment:只显示不带碎片的重定向。",
        "apihelp-query+redirects-example-simple": "获取至[[Main Page]]的重定向列表。",
        "apihelp-query+redirects-example-generator": "获取所有重定向至[[Main Page]]的信息。",
-       "apihelp-query+revisions-description": "获取修订版本信息。\n\n可用于以下几个方面:\n# Get data about a set of pages (last revision), by setting titles or pageids.\n# Get revisions for one given page, by using titles or pageids with start, end, or limit.\n# Get data about a set of revisions by setting their IDs with revids.",
+       "apihelp-query+revisions-description": "获取修订版本信息。\n\n可用于以下几个方面:\n# 通过设置标题或页面ID获取一批页面(最新修订)的数据。\n# 通过使用带start、end或limit的标题或页面ID获取给定页面的多个修订。\n# 通过revid设置一批修订的ID获取它们的数据。",
        "apihelp-query+revisions-paraminfo-singlepageonly": "可能只能与单一页面使用(模式#2)。",
        "apihelp-query+revisions-param-startid": "从哪个修订版本ID开始列举。",
        "apihelp-query+revisions-param-endid": "在此修订版本ID停止修订列举。",
        "apihelp-query+stashimageinfo-param-filekey": "用于识别一次临时藏匿的早前上传的关键字。",
        "apihelp-query+stashimageinfo-param-sessionkey": "$1filekey的别名,用于向后兼容。",
        "apihelp-query+stashimageinfo-example-simple": "返回藏匿文件的信息。",
+       "apihelp-query+stashimageinfo-example-params": "返回两个藏匿文件的缩略图。",
        "apihelp-query+tags-description": "列出更改标签。",
        "apihelp-query+tags-param-limit": "列出标签的最大数量。",
        "apihelp-query+tags-param-prop": "要获取哪个属性:",
        "apihelp-query+usercontribs-param-start": "返回的起始时间戳。",
        "apihelp-query+usercontribs-param-end": "返回的最终时间戳。",
        "apihelp-query+usercontribs-param-user": "要检索贡献的用户。",
+       "apihelp-query+usercontribs-param-userprefix": "取得所有用户名以这个值开头的用户的贡献。覆盖$1user。",
        "apihelp-query+usercontribs-param-namespace": "只列出这些名字空间的贡献。",
        "apihelp-query+usercontribs-param-prop": "包含额外的信息束:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "添加页面ID和修订ID。",
        "apihelp-watch-example-unwatch": "取消监视页面<kbd>Main Page</kbd>。",
        "apihelp-watch-example-generator": "监视主名字空间中的最少几个页面。",
        "apihelp-format-example-generic": "返回查询结果为$1格式。",
+       "apihelp-format-param-wrappedhtml": "作为一个JSON对象返回渲染好的HTML和关联的ResouceLoader模块。",
        "apihelp-json-description": "输出数据为JSON格式。",
        "apihelp-json-param-callback": "如果指定,将输出内容包裹在一个指定的函数调用中。出于安全考虑,所有用户相关的数据将被限制。",
        "apihelp-json-param-utf8": "如果指定,使用十六进制转义序列将大多数(但不是全部)非ASCII的字符编码为UTF-8,而不是替换它们。默认当<var>formatversion</var>不是<kbd>1</kbd>时。",
index d6c610a..8f334cc 100644 (file)
@@ -56,13 +56,13 @@ class LinkBatch {
        }
 
        /**
-        * @param Title|TitleValue $title
+        * @param LinkTarget $linkTarget
         */
-       public function addObj( $title ) {
-               if ( is_object( $title ) ) {
-                       $this->add( $title->getNamespace(), $title->getDBkey() );
+       public function addObj( $linkTarget ) {
+               if ( is_object( $linkTarget ) ) {
+                       $this->add( $linkTarget->getNamespace(), $linkTarget->getDBkey() );
                } else {
-                       wfDebug( "Warning: LinkBatch::addObj got invalid Title or TitleValue object\n" );
+                       wfDebug( "Warning: LinkBatch::addObj got invalid LinkTarget object\n" );
                }
        }
 
index 1741e64..73c7548 100644 (file)
@@ -491,10 +491,9 @@ class ChangesList extends ContextSource {
                        return '';
                }
                $cache = $this->watchMsgCache;
-               $that = $this;
                return $cache->getWithSetCallback( $count, $cache::TTL_INDEFINITE,
-                       function () use ( $that, $count ) {
-                               return $that->msg( 'number_of_watching_users_RCview' )
+                       function () use ( $count ) {
+                               return $this->msg( 'number_of_watching_users_RCview' )
                                        ->numParams( $count )->escaped();
                        }
                );
index acaa288..e898e72 100644 (file)
@@ -357,11 +357,16 @@ abstract class ContentHandler {
                                throw new MWException( "ContentHandlerForModelID must supply a ContentHandler instance" );
                        }
                } else {
-                       $class = $wgContentHandlers[$modelId];
-                       $handler = new $class( $modelId );
+                       $classOrCallback = $wgContentHandlers[$modelId];
+
+                       if ( is_callable( $classOrCallback ) ) {
+                               $handler = call_user_func( $classOrCallback, $modelId );
+                       } else {
+                               $handler = new $classOrCallback( $modelId );
+                       }
 
                        if ( !( $handler instanceof ContentHandler ) ) {
-                               throw new MWException( "$class from \$wgContentHandlers is not " .
+                               throw new MWException( "$classOrCallback from \$wgContentHandlers is not " .
                                        "compatible with ContentHandler" );
                        }
                }
index a4d0ad0..bd1e375 100644 (file)
@@ -1925,14 +1925,10 @@ abstract class DatabaseBase implements IDatabase {
        /**
         * Get the name of an index in a given table.
         *
-        * @protected Don't use outside of DatabaseBase and childs
         * @param string $index
         * @return string
         */
-       public function indexName( $index ) {
-               // @FIXME: Make this protected once we move away from PHP 5.3
-               // Needs to be public because of usage in closure (in DatabaseBase::replaceVars)
-
+       protected function indexName( $index ) {
                // Backwards-compatibility hack
                $renamed = array(
                        'ar_usertext_timestamp' => 'usertext_timestamp',
@@ -3100,7 +3096,6 @@ abstract class DatabaseBase implements IDatabase {
         * @return string The new SQL statement with variables replaced
         */
        protected function replaceVars( $ins ) {
-               $that = $this;
                $vars = $this->getSchemaVars();
                return preg_replace_callback(
                        '!
@@ -3109,19 +3104,19 @@ abstract class DatabaseBase implements IDatabase {
                                `\{\$ (\w+) }`                    | # 4. addIdentifierQuotes
                                /\*\$ (\w+) \*/                     # 5. leave unencoded
                        !x',
-                       function ( $m ) use ( $that, $vars ) {
+                       function ( $m ) use ( $vars ) {
                                // Note: Because of <https://bugs.php.net/bug.php?id=51881>,
                                // check for both nonexistent keys *and* the empty string.
                                if ( isset( $m[1] ) && $m[1] !== '' ) {
                                        if ( $m[1] === 'i' ) {
-                                               return $that->indexName( $m[2] );
+                                               return $this->indexName( $m[2] );
                                        } else {
-                                               return $that->tableName( $m[2] );
+                                               return $this->tableName( $m[2] );
                                        }
                                } elseif ( isset( $m[3] ) && $m[3] !== '' && array_key_exists( $m[3], $vars ) ) {
-                                       return $that->addQuotes( $vars[$m[3]] );
+                                       return $this->addQuotes( $vars[$m[3]] );
                                } elseif ( isset( $m[4] ) && $m[4] !== '' && array_key_exists( $m[4], $vars ) ) {
-                                       return $that->addIdentifierQuotes( $vars[$m[4]] );
+                                       return $this->addIdentifierQuotes( $vars[$m[4]] );
                                } elseif ( isset( $m[5] ) && $m[5] !== '' && array_key_exists( $m[5], $vars ) ) {
                                        return $vars[$m[5]];
                                } else {
@@ -3179,10 +3174,9 @@ abstract class DatabaseBase implements IDatabase {
                        return null;
                }
 
-               $that = $this;
-               $unlocker = new ScopedCallback( function () use ( $that, $lockKey, $fname ) {
-                       $that->commit( __METHOD__, 'flush' );
-                       $that->unlock( $lockKey, $fname );
+               $unlocker = new ScopedCallback( function () use ( $lockKey, $fname ) {
+                       $this->commit( __METHOD__, 'flush' );
+                       $this->unlock( $lockKey, $fname );
                } );
 
                $this->commit( __METHOD__, 'flush' );
index 29106ab..c5aafea 100644 (file)
@@ -692,17 +692,16 @@ abstract class DatabaseMysqlBase extends Database {
                        $this->getLBInfo( 'clusterMasterHost' ) ?: $this->getServer()
                );
 
-               $that = $this;
                return $cache->getWithSetCallback(
                        $key,
                        $cache::TTL_INDEFINITE,
-                       function () use ( $that, $cache, $key ) {
+                       function () use ( $cache, $key ) {
                                // Get and leave a lock key in place for a short period
                                if ( !$cache->lock( $key, 0, 10 ) ) {
                                        return false; // avoid master connection spike slams
                                }
 
-                               $conn = $that->getLazyMasterHandle();
+                               $conn = $this->getLazyMasterHandle();
                                if ( !$conn ) {
                                        return false; // something is misconfigured
                                }
index bb3028d..664484b 100644 (file)
@@ -429,7 +429,7 @@ class DatabaseSqlite extends Database {
         * @param string $index
         * @return string
         */
-       function indexName( $index ) {
+       protected function indexName( $index ) {
                return $index;
        }
 
index a52f636..9a357ee 100644 (file)
@@ -21,7 +21,7 @@
 namespace MediaWiki\Logger\Monolog;
 
 /**
- * Injects `wfHostname()` and `wfWikiID()` in all records.
+ * Injects `wfHostname()`, `wfWikiID()` and `$wgVersion` in all records.
  *
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
@@ -34,11 +34,13 @@ class WikiProcessor {
         * @return array
         */
        public function __invoke( array $record ) {
+               global $wgVersion;
                $record['extra'] = array_merge(
                        $record['extra'],
                        array(
                                'host' => wfHostname(),
                                'wiki' => wfWikiID(),
+                               'mwversion' => $wgVersion,
                        )
                );
                return $record;
index 9f7d8ca..b5e323b 100644 (file)
@@ -108,10 +108,22 @@ class CdnCacheUpdate implements DeferrableUpdate, MergeableUpdate {
 
                wfDebugLog( 'squid', __METHOD__ . ': ' . implode( ' ', $urlArr ) );
 
+               // Reliably broadcast the purge to all edge nodes
+               $relayer = EventRelayerGroup::singleton()->getRelayer( 'cdn-url-purges' );
+               $relayer->notify(
+                       'cdn-url-purges',
+                       array(
+                               'urls' => array_values( $urlArr ), // JSON array
+                               'timestamp' => microtime( true )
+                       )
+               );
+
+               // Send lossy UDP broadcasting if enabled
                if ( $wgHTCPRouting ) {
                        self::HTCPPurge( $urlArr );
                }
 
+               // Do direct server purges if enabled (this does not scale very well)
                if ( $wgSquidServers ) {
                        // Maximum number of parallel connections per squid
                        $maxSocketsPerSquid = 8;
index 3021af1..9cd20fc 100644 (file)
@@ -143,9 +143,8 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
                Hooks::run( 'LinksUpdate', array( &$this ) );
                $this->doIncrementalUpdate();
 
-               $that = $this;
-               $this->mDb->onTransactionIdle( function() use ( $that ) {
-                       Hooks::run( 'LinksUpdateComplete', array( &$that ) );
+               $this->mDb->onTransactionIdle( function() {
+                       Hooks::run( 'LinksUpdateComplete', array( &$this ) );
                } );
        }
 
index 33ca931..23e39ea 100644 (file)
@@ -49,6 +49,9 @@ abstract class DiffFormatter {
         */
        protected $trailingContextLines = 0;
 
+       /** @var string The output buffer; holds the output while it is built. */
+       private $result = '';
+
        /**
         * Format a diff.
         *
@@ -146,15 +149,24 @@ abstract class DiffFormatter {
        }
 
        protected function startDiff() {
-               ob_start();
+               $this->result = '';
+       }
+
+       /**
+        * Writes a string to the output buffer.
+        *
+        * @param string $text
+        */
+       protected function writeOutput( $text ) {
+               $this->result .= $text;
        }
 
        /**
         * @return string
         */
        protected function endDiff() {
-               $val = ob_get_contents();
-               ob_end_clean();
+               $val = $this->result;
+               $this->result = '';
 
                return $val;
        }
@@ -185,7 +197,7 @@ abstract class DiffFormatter {
         * @param string $header
         */
        protected function startBlock( $header ) {
-               echo $header . "\n";
+               $this->writeOutput( $header . "\n" );
        }
 
        /**
@@ -203,7 +215,7 @@ abstract class DiffFormatter {
         */
        protected function lines( $lines, $prefix = ' ' ) {
                foreach ( $lines as $line ) {
-                       echo "$prefix $line\n";
+                       $this->writeOutput( "$prefix $line\n" );
                }
        }
 
@@ -236,7 +248,7 @@ abstract class DiffFormatter {
         */
        protected function changed( $orig, $closing ) {
                $this->deleted( $orig );
-               echo "---\n";
+               $this->writeOutput( "---\n" );
                $this->added( $closing );
        }
 
index be38e87..f1826ed 100644 (file)
@@ -80,7 +80,7 @@ class TableDiffFormatter extends DiffFormatter {
         * @param string $header
         */
        protected function startBlock( $header ) {
-               echo $header;
+               $this->writeOutput( $header );
        }
 
        protected function endBlock() {
@@ -157,9 +157,9 @@ class TableDiffFormatter extends DiffFormatter {
         */
        protected function added( $lines ) {
                foreach ( $lines as $line ) {
-                       echo '<tr>' . $this->emptyLine() .
+                       $this->writeOutput( '<tr>' . $this->emptyLine() .
                                $this->addedLine( '<ins class="diffchange">' .
-                                       htmlspecialchars( $line ) . '</ins>' ) . "</tr>\n";
+                                       htmlspecialchars( $line ) . '</ins>' ) . "</tr>\n" );
                }
        }
 
@@ -170,9 +170,9 @@ class TableDiffFormatter extends DiffFormatter {
         */
        protected function deleted( $lines ) {
                foreach ( $lines as $line ) {
-                       echo '<tr>' . $this->deletedLine( '<del class="diffchange">' .
+                       $this->writeOutput( '<tr>' . $this->deletedLine( '<del class="diffchange">' .
                                        htmlspecialchars( $line ) . '</del>' ) .
-                               $this->emptyLine() . "</tr>\n";
+                               $this->emptyLine() . "</tr>\n" );
                }
        }
 
@@ -183,9 +183,9 @@ class TableDiffFormatter extends DiffFormatter {
         */
        protected function context( $lines ) {
                foreach ( $lines as $line ) {
-                       echo '<tr>' .
+                       $this->writeOutput( '<tr>' .
                                $this->contextLine( htmlspecialchars( $line ) ) .
-                               $this->contextLine( htmlspecialchars( $line ) ) . "</tr>\n";
+                               $this->contextLine( htmlspecialchars( $line ) ) . "</tr>\n" );
                }
        }
 
@@ -207,13 +207,13 @@ class TableDiffFormatter extends DiffFormatter {
                $line = array_shift( $del );
                while ( $line ) {
                        $aline = array_shift( $add );
-                       echo '<tr>' . $this->deletedLine( $line ) .
-                               $this->addedLine( $aline ) . "</tr>\n";
+                       $this->writeOutput( '<tr>' . $this->deletedLine( $line ) .
+                               $this->addedLine( $aline ) . "</tr>\n" );
                        $line = array_shift( $del );
                }
                foreach ( $add as $line ) { # If any leftovers
-                       echo '<tr>' . $this->emptyLine() .
-                               $this->addedLine( $line ) . "</tr>\n";
+                       $this->writeOutput( '<tr>' . $this->emptyLine() .
+                               $this->addedLine( $line ) . "</tr>\n" );
                }
        }
 
index 5f3ad3d..72f1a66 100644 (file)
@@ -42,7 +42,7 @@ class UnifiedDiffFormatter extends DiffFormatter {
         */
        protected function lines( $lines, $prefix = ' ' ) {
                foreach ( $lines as $line ) {
-                       echo "{$prefix}{$line}\n";
+                       $this->writeOutput( "{$prefix}{$line}\n" );
                }
        }
 
index 93d8d07..1f64692 100644 (file)
@@ -278,16 +278,15 @@ class SwiftFileBackend extends FileBackendStore {
                        'body' => $params['content']
                ) );
 
-               $that = $this;
                $method = __METHOD__;
-               $handler = function ( array $request, Status $status ) use ( $that, $method, $params ) {
+               $handler = function ( array $request, Status $status ) use ( $method, $params ) {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
                        if ( $rcode === 201 ) {
                                // good
                        } elseif ( $rcode === 412 ) {
                                $status->fatal( 'backend-fail-contenttype', $params['dst'] );
                        } else {
-                               $that->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
+                               $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
                };
 
@@ -343,16 +342,15 @@ class SwiftFileBackend extends FileBackendStore {
                        'body' => $handle // resource
                ) );
 
-               $that = $this;
                $method = __METHOD__;
-               $handler = function ( array $request, Status $status ) use ( $that, $method, $params ) {
+               $handler = function ( array $request, Status $status ) use ( $method, $params ) {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
                        if ( $rcode === 201 ) {
                                // good
                        } elseif ( $rcode === 412 ) {
                                $status->fatal( 'backend-fail-contenttype', $params['dst'] );
                        } else {
-                               $that->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
+                               $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
                };
 
@@ -392,16 +390,15 @@ class SwiftFileBackend extends FileBackendStore {
                        ) + $this->sanitizeHdrs( $params ), // extra headers merged into object
                ) );
 
-               $that = $this;
                $method = __METHOD__;
-               $handler = function ( array $request, Status $status ) use ( $that, $method, $params ) {
+               $handler = function ( array $request, Status $status ) use ( $method, $params ) {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
                        if ( $rcode === 201 ) {
                                // good
                        } elseif ( $rcode === 404 ) {
                                $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
                        } else {
-                               $that->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
+                               $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
                };
 
@@ -450,9 +447,8 @@ class SwiftFileBackend extends FileBackendStore {
                        );
                }
 
-               $that = $this;
                $method = __METHOD__;
-               $handler = function ( array $request, Status $status ) use ( $that, $method, $params ) {
+               $handler = function ( array $request, Status $status ) use ( $method, $params ) {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
                        if ( $request['method'] === 'PUT' && $rcode === 201 ) {
                                // good
@@ -461,7 +457,7 @@ class SwiftFileBackend extends FileBackendStore {
                        } elseif ( $rcode === 404 ) {
                                $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
                        } else {
-                               $that->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
+                               $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
                };
 
@@ -491,9 +487,8 @@ class SwiftFileBackend extends FileBackendStore {
                        'headers' => array()
                ) );
 
-               $that = $this;
                $method = __METHOD__;
-               $handler = function ( array $request, Status $status ) use ( $that, $method, $params ) {
+               $handler = function ( array $request, Status $status ) use ( $method, $params ) {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
                        if ( $rcode === 204 ) {
                                // good
@@ -502,7 +497,7 @@ class SwiftFileBackend extends FileBackendStore {
                                        $status->fatal( 'backend-fail-delete', $params['src'] );
                                }
                        } else {
-                               $that->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
+                               $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
                };
 
@@ -550,16 +545,15 @@ class SwiftFileBackend extends FileBackendStore {
                        'headers' => $metaHdrs + $customHdrs
                ) );
 
-               $that = $this;
                $method = __METHOD__;
-               $handler = function ( array $request, Status $status ) use ( $that, $method, $params ) {
+               $handler = function ( array $request, Status $status ) use ( $method, $params ) {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
                        if ( $rcode === 202 ) {
                                // good
                        } elseif ( $rcode === 404 ) {
                                $status->fatal( 'backend-fail-describe', $params['src'] );
                        } else {
-                               $that->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
+                               $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
                };
 
index 7290740..55ec8df 100644 (file)
@@ -75,6 +75,7 @@ class CliInstaller extends Installer {
                        $wgContLang = Language::factory( $option['lang'] );
                        $wgLang = Language::factory( $option['lang'] );
                        $wgLanguageCode = $option['lang'];
+                       RequestContext::getMain()->setLanguage( $wgLang );
                }
 
                $this->setVar( 'wgSitename', $siteName );
index de84199..0e8633d 100644 (file)
@@ -223,6 +223,7 @@ abstract class Installer {
                // $wgLogo is probably wrong (bug 48084); set something that will work.
                // Single quotes work fine here, as LocalSettingsGenerator outputs this unescaped.
                'wgLogo' => '$wgResourceBasePath/resources/assets/wiki.png',
+               'wgAuthenticationTokenVersion' => 1,
        );
 
        /**
@@ -360,6 +361,10 @@ abstract class Installer {
        public function __construct() {
                global $wgMessagesDirs, $wgUser;
 
+               // Don't attempt to load user language options (T126177)
+               // This will be overridden in the web installer with the user-specified language
+               RequestContext::getMain()->setLanguage( 'en' );
+
                // Disable the i18n cache
                Language::getLocalisationCache()->disableBackend();
                // Disable LoadBalancer and wfGetDB etc.
@@ -384,6 +389,7 @@ abstract class Installer {
 
                // Having a user with id = 0 safeguards us from DB access via User::loadOptions().
                $wgUser = User::newFromId( 0 );
+               RequestContext::getMain()->setUser( $wgUser );
 
                $this->settings = $this->internalDefaults;
 
@@ -404,7 +410,7 @@ abstract class Installer {
                }
 
                $this->parserTitle = Title::newFromText( 'Installer' );
-               $this->parserOptions = new ParserOptions; // language will be wrong :(
+               $this->parserOptions = new ParserOptions( $wgUser ); // language will be wrong :(
                $this->parserOptions->setEditSection( false );
        }
 
@@ -1779,6 +1785,15 @@ abstract class Installer {
 
                // Some of the environment checks make shell requests, remove limits
                $GLOBALS['wgMaxShellMemory'] = 0;
+
+               $GLOBALS['wgSessionProviders'] = array(
+                       array(
+                               'class' => 'InstallerSessionProvider',
+                               'args' => array( array(
+                                       'priority' => 1,
+                               ) )
+                       )
+               );
        }
 
        /**
diff --git a/includes/installer/InstallerSessionProvider.php b/includes/installer/InstallerSessionProvider.php
new file mode 100644 (file)
index 0000000..2b9f418
--- /dev/null
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Session provider which always provides the same session ID and doesn't
+ * persist the session. For use in the installer when ObjectCache doesn't
+ * work anyway.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+use MediaWiki\Session\SessionProvider;
+use MediaWiki\Session\SessionBackend;
+use MediaWiki\Session\SessionInfo;
+
+class InstallerSessionProvider extends SessionProvider {
+       /**
+        * Pretend there is a session, to avoid MWCryptRand overhead
+        */
+       public function provideSessionInfo( WebRequest $request ) {
+               return new SessionInfo( 1, array(
+                       'provider' => $this,
+                       'id' => str_repeat( 'x', 32 ),
+               ) );
+       }
+
+       /**
+        * Yes we will treat your data with great care!
+        */
+       public function persistsSessionId() {
+               return true;
+       }
+
+       /**
+        * Sure, you can be whoever you want, as long as you have ID 0
+        */
+       public function canChangeUser() {
+               return true;
+       }
+
+       public function persistSession( SessionBackend $session, WebRequest $request ) {
+       }
+
+       public function unpersistSession( WebRequest $request ) {
+       }
+}
index 3b6a37f..4f20c70 100644 (file)
@@ -65,7 +65,7 @@ class LocalSettingsGenerator {
                                'wgRightsText', '_MainCacheType', 'wgEnableUploads',
                                '_MemCachedServers', 'wgDBserver', 'wgDBuser',
                                'wgDBpassword', 'wgUseInstantCommons', 'wgUpgradeKey', 'wgDefaultSkin',
-                               'wgMetaNamespace', 'wgLogo',
+                               'wgMetaNamespace', 'wgLogo', 'wgAuthenticationTokenVersion',
                        ),
                        $db->getGlobalNames()
                );
@@ -396,6 +396,9 @@ ${serverSetting}
 
 \$wgSecretKey = \"{$this->values['wgSecretKey']}\";
 
+# Changing this will log out all existing sessions.
+\$wgAuthenticationTokenVersion = \"{$this->values['wgAuthenticationTokenVersion']}\";
+
 # Site upgrade key. Must be set to a string (default provided) to turn on the
 # web installer while LocalSettings.php is in place
 \$wgUpgradeKey = \"{$this->values['wgUpgradeKey']}\";
index 2c08c9c..1d17c94 100644 (file)
@@ -178,6 +178,13 @@ class WebInstallerExistingWiki extends WebInstallerPage {
                // All good
                $this->setVar( '_ExistingDBSettings', true );
 
+               // Copy $wgAuthenticationTokenVersion too, if it exists
+               $this->setVar( 'wgAuthenticationTokenVersion',
+                       isset( $vars['wgAuthenticationTokenVersion'] )
+                               ? $vars['wgAuthenticationTokenVersion']
+                               : null
+               );
+
                return $status;
        }
 
index 75475ad..a0f3ed7 100644 (file)
@@ -43,6 +43,7 @@
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] instalatuta dago",
        "config-diff3-bad": "GNU diff3 ez da aurkitu.",
        "config-db-type": "Datu-base mota:",
+       "config-db-host": "Datu-basearen zerbitzaria:",
        "config-db-host-oracle": "Datu-baseko TNS:",
        "config-db-wiki-settings": "Wiki hau identifikatu",
        "config-db-name": "Datu-base izena:",
index c86698b..6ba3151 100644 (file)
@@ -6,7 +6,8 @@
                        "아라",
                        "Danmichaelo",
                        "Jeblad",
-                       "Macofe"
+                       "Macofe",
+                       "SuperPotato"
                ]
        },
        "config-desc": "Installasjonsprogrammet for MediaWiki",
@@ -15,7 +16,7 @@
        "config-localsettings-upgrade": "En <code>LocalSettings.php</code>-fil har blitt oppdaget.\nFor å oppgradere denne installasjonen, skriv inn verdien av <code>$wgUpgradeKey</code> i boksen nedenfor.\nDu finner denne i <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "Filen ''<code>LocalSettings.php</code>'' er funnet.\nFor å oppgradere denne installasjonen, vennligst kjør ''update.php'' i stedet",
        "config-localsettings-key": "Oppgraderingsnøkkel:",
-       "config-localsettings-badkey": "Nøkkelen du oppga er feil.",
+       "config-localsettings-badkey": "Oppgraderingsnøkkelen du oppga er feil.",
        "config-upgrade-key-missing": "En eksisterende installasjon av MediaWiki er funnet.\nFor å oppgradere denne installasjonen, vær vennlig å legge til følgende linje helt til slutt i din ''<code>LocalSettings.php</code>''-fil:\n\n$1",
        "config-localsettings-incomplete": "Den eksisterende ''<code>LocalSettings.php</code>'' ser ut til å være ufullstendig.\nVariabelen $1 har ingen verdi.\nVær vennlig å endre ''<code>LocalSettings.php</code>'' slik at variabelen får en verdi, og klikk ''{{int:Config-continue}}''.",
        "config-localsettings-connection-error": "Det ble funnet en feil ved tilknytning av databasen med innstillingene i ''<code>LocalSettings.php</code>'' eller ''<code>AdminSettings.php</code>''. Vær vennlig å rette opp disse innstillingene og prøv igjen.\n\n$1",
@@ -64,7 +65,7 @@
        "config-magic-quotes-sybase": "'''Kritisk: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] er aktiv!'''\nDette alternativet ødelegger inndata på en uforutsigbar måte.\nDu kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
        "config-mbstring": "'''Kritisk: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] er aktiv!'''\nDette alternativet fører til feil og kan ødelegge data på en uforutsigbar måte.\nDu kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
        "config-safe-mode": "'''Advarsel:''' PHPs [http://www.php.net/features.safe-mode safe mode] er aktiv.\nDet kan føre til problem, spesielt hvis du bruker støtte for filopplastinger og <code>math</code>.",
-       "config-xml-bad": "PHPs XML-modul mangler.\nMediaWiki krever funksjonene i denne modulen og vil ikke virke i denne konfigurasjonen.\nHvis du kjører Mandrak, installer pakken php-xml.",
+       "config-xml-bad": "PHPs XML-modul mangler.\nMediaWiki krever funksjonene i denne modulen og vil ikke virke i denne konfigurasjonen.\nDu må kanskje laste ned php-xml RPM pakken.",
        "config-pcre-old": "'''Alvorlig:''' PCRE $1 eller senere kreves.\nDin PHP-kode er lenket med PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Nærmere informasjon].",
        "config-pcre-no-utf8": "'''Fatal''': PHPs PCRE modul ser ut til å være kompilert uten PCRE_UTF8-støtte.\nMediaWiki krever UTF-8-støtte for å fungere riktig.",
        "config-memory-raised": "PHPs <code>memory_limit</code> er $1, økt til $2.",
@@ -76,6 +77,7 @@
        "config-apc": "[http://www.php.net/apc APC] er innstallert",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] er installert",
        "config-no-cache": "'''Advarsel:''' Kunne ikke finne [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] eller [http://www.iis.net/download/WinCacheForPhp WinCache].\nObjekthurtiglagring er ikke aktivert.",
+       "config-no-cache-apcu": "<strong>Advarsel:</strong> Kunne ikke finne [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] eller [http://www.iis.net/download/WinCacheForPhp WinCache].\nObjekthurtiglagring er ikke aktivert.",
        "config-mod-security": "'''Advarsel''': Din web-tjener har [http://modsecurity.org/ mod_security] påslått. Hvis denne er feilinnstilt, kan det gi problemer for MediaWiki eller annen programvare som tillater brukere å poste vilkårlig innhold.\nSjekk [http://modsecurity.org/documentation/ mod_security-dokumentasjonen] eller ta kontakt med din nettleverandør hvis du opplever tilfeldige feil.",
        "config-diff3-bad": "GNU diff3 ikke funnet.",
        "config-git": "Har funnet Git version control software: <code>$1</code>.",
        "config-nofile": "Filen \"$1\" ble ikke funnet. Kan den være blitt slettet?",
        "config-extension-link": "Visste du at wikien din kan brukes sammen med en mengde [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions utvidelser]?\n\nDu kan sjekke gjennom [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category utvidelser per kategori] eller [//www.mediawiki.org/wiki/Extension_Matrix utvidelsesmatrisen] for å se den komplette listen av utvidelser.",
        "mainpagetext": "'''MediaWiki-programvaren er nå installert.'''",
-       "mainpagedocfooter": "Sjekk [//meta.wikimedia.org/wiki/Help:Contents brukerveiledningen] for å få informasjon om hvordan du bruker wiki-programvaren.\n\n==Hvordan komme igang==\n*[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Innstillingsliste]\n*[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Ofte stilte spørsmål om MediaWiki]\n*[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-postliste]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Tilpass MediaWiki for ditt språk]"
+       "mainpagedocfooter": "Sjekk [//meta.wikimedia.org/wiki/Help:Contents brukerveiledningen] for å få informasjon om hvordan du bruker wiki-programvaren.\n\n==Hvordan komme igang==\n*[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Innstillingsliste]\n*[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Ofte stilte spørsmål om MediaWiki]\n*[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-postliste]\n*[//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Tilpass MediaWiki for ditt språk]\n*[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Lær deg å beskytte deg mot spam på wikien din]"
 }
index b3999f6..8051d35 100644 (file)
        "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] jest funkcją, która pozwala wiki używać obrazów, dźwięków i innych mediów znalezionych na  witrynie [//commons.wikimedia.org/ Wikimedia Commons].\nAby to zrobić, MediaWiki wymaga dostępu do internetu.\n\nAby uzyskać więcej informacji na temat tej funkcji, w tym instrukcje dotyczące sposobu ustawiania go na wiki innych niż Wikimedia Commons, sprawdź w [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos podręczniku].",
        "config-cc-error": "Wybieranie licencji Creative Commons nie dało wyniku.\nWpisz nazwę licencji ręcznie.",
        "config-cc-again": "Wybierz jeszcze raz...",
-       "config-cc-not-chosen": "Wybierz którą chcesz licencję Creative Commons i kliknij „proceed”.",
+       "config-cc-not-chosen": "Wybierz, którą chcesz licencję Creative Commons i kliknij „proceed”.",
        "config-advanced-settings": "Konfiguracja zaawansowana",
        "config-cache-options": "Ustawienia buforowania obiektów:",
        "config-cache-help": "Buforowanie obiekto jest używane aby przyspieszyć MediaWiki przez trzymanie w pamięci podręcznej często używanych danych.\nŚrednie oraz duże witryny są wysoce zachęcane by je włączyć, a małe witryny także dostrzegą korzyści.",
index 7bcb58f..4a6526c 100644 (file)
@@ -8,7 +8,7 @@
        "config-title": "مېډياويکي $1 نصبېدنه",
        "config-information": "مالومات",
        "config-localsettings-key": "کونجۍ نومهالول:",
-       "config-localsettings-badkey": "کومه کونجۍ مو چې ورکړه ناسمه ده.",
+       "config-localsettings-badkey": "کومه اوسمهاله شوې کونجۍ مو چې ورکړې، ناسمه ده.",
        "config-your-language": "ستاسې ژبه:",
        "config-wiki-language": "د ويکي ژبه:",
        "config-back": "← پر شا تلل",
index da8a16e..f6ccb97 100644 (file)
@@ -2,9 +2,11 @@
        "@metadata": {
                "authors": [
                        "OC Ripper",
-                       "Seb35"
+                       "Seb35",
+                       "Conquistador"
                ]
        },
+       "config-admin-password": "Lozinka:",
        "mainpagetext": "'''MediaWiki softver is uspješno instaliran.'''",
        "mainpagedocfooter": "Kontaktirajte [//meta.wikimedia.org/wiki/Help:Contents uputstva za korisnike] za informacije o upotrebi wiki programa.\n\n== Početak ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista postavki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki najčešće postavljana pitanja]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index 71c6c17..bbecf18 100644 (file)
        "config-page-copying": "Nagkokopya",
        "config-restart": "Oo, utroha patikanga",
        "config-welcome": "=== Mga pagpanginano panlibong ===\nMagkakamay-ada yano nga panginano para masabtan kun ini nga libong in naaangay para hiton pagtataod hiton MediaWiki. Hinumdomi iton paglakip hinin nga impormasyon kun karuyag mo mangaro hin suporta kun paunan-on humanon an pagtataod.",
+       "config-env-php": "Gin-install an PHP $1.",
+       "config-env-hhvm": "Gin-install an HHVM $1.",
+       "config-unicode-using-intl": "Gamita an [http://pecl.php.net/intl intl PECL extension] para han normalisasyon han Unicode.",
+       "config-unicode-pure-php-warning": "<strong>Pahimatngon:</strong> An [http://pecl.php.net/intl intl PECL extension] in waray akos kumapot hin Unicode normalization, tungod hini mabalik ha mahinay nga puro-PHP nga implementasyon.\nKun nagpapadalagan ka hin high-traffic site, alayon pagbasa hin guti han [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].",
        "config-no-db": "Diri nakakabiling hin naaangay nga database driver! Kinahanglan mo magtaod hin uska database driver para han PHP. An masunod nga mga klase hin database in ginsusuporatahan: $1.\n\nKun ikaw mismo an nag-compile han PHP, kinahanglan ma-reconfigure iton nga para maapandar an database client, pananglitan, han paggamit han <code>./configure --with-mysqli</code>.\nKun gintaod mo an PHP tikang ha uska Debian o Ubuntu nga pakete, kinahanglan nimo magtaod liwat, pananglitan, hiton an <code>php5-mysql</code> nga pakete.",
        "config-pcre-old": "<strong>Nangangarat-an:</strong> Nagkikinahanglan hin PCRE $1 o mas urhi pa.\nAn imo PHP nga binaryo in nakasumpay hin PCRE $2. [https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE More information].",
        "config-db-name": "Ngaran han database:",
index be16bcf..d50e381 100644 (file)
@@ -281,18 +281,16 @@ class Interwiki {
         * @since 1.19
         */
        protected static function getAllPrefixesCached( $local ) {
-               global $wgInterwikiCache, $wgInterwikiScopes, $wgInterwikiFallbackSite;
-               static $db, $site;
+               global $wgInterwikiScopes, $wgInterwikiFallbackSite;
+               static $site;
 
                wfDebug( __METHOD__ . "()\n" );
                $data = array();
                try {
-                       if ( !$db ) {
-                               $db = CdbReader::open( $wgInterwikiCache );
-                       }
                        /* Resolve site name */
                        if ( $wgInterwikiScopes >= 3 && !$site ) {
-                               $site = $db->get( '__sites:' . wfWikiID() );
+                               $site = self::getCacheValue( '__sites:' . wfWikiID() );
+
                                if ( $site == '' ) {
                                        $site = $wgInterwikiFallbackSite;
                                }
@@ -311,9 +309,9 @@ class Interwiki {
                        $sources[] = wfWikiID();
 
                        foreach ( $sources as $source ) {
-                               $list = $db->get( "__list:{$source}" );
+                               $list = self::getCacheValue( '__list:' . $source );
                                foreach ( explode( ' ', $list ) as $iw_prefix ) {
-                                       $row = $db->get( "{$source}:{$iw_prefix}" );
+                                       $row = self::getCacheValue( "{$source}:{$iw_prefix}" );
                                        if ( !$row ) {
                                                continue;
                                        }
index f10866e..51dec65 100644 (file)
@@ -181,11 +181,10 @@ class JobQueueDB extends JobQueue {
        protected function doBatchPush( array $jobs, $flags ) {
                $dbw = $this->getMasterDB();
 
-               $that = $this;
                $method = __METHOD__;
                $dbw->onTransactionIdle(
-                       function () use ( $dbw, $that, $jobs, $flags, $method ) {
-                               $that->doBatchPushInternal( $dbw, $jobs, $flags, $method );
+                       function () use ( $dbw, $jobs, $flags, $method ) {
+                               $this->doBatchPushInternal( $dbw, $jobs, $flags, $method );
                        }
                );
        }
index 7dad748..7e9c0c9 100644 (file)
@@ -175,11 +175,10 @@ class JobQueueMemory extends JobQueue {
                        return new ArrayIterator( array() );
                }
 
-               $that = $this;
                return new MappedIterator(
                        $unclaimed,
-                       function ( $value ) use ( $that ) {
-                               $that->jobFromSpecInternal( $value );
+                       function ( $value ) {
+                               $this->jobFromSpecInternal( $value );
                        }
                );
        }
@@ -195,11 +194,10 @@ class JobQueueMemory extends JobQueue {
                        return new ArrayIterator( array() );
                }
 
-               $that = $this;
                return new MappedIterator(
                        $claimed,
-                       function ( $value ) use ( $that ) {
-                               $that->jobFromSpecInternal( $value );
+                       function ( $value ) {
+                               $this->jobFromSpecInternal( $value );
                        }
                );
        }
index eda3e9c..408828d 100644 (file)
@@ -573,12 +573,10 @@ LUA;
         * @return MappedIterator
         */
        protected function getJobIterator( RedisConnRef $conn, array $uids ) {
-               $that = $this;
-
                return new MappedIterator(
                        $uids,
-                       function ( $uid ) use ( $that, $conn ) {
-                               return $that->getJobFromUidInternal( $uid, $conn );
+                       function ( $uid ) use ( $conn ) {
+                               return $this->getJobFromUidInternal( $uid, $conn );
                        },
                        array( 'accept' => function ( $job ) {
                                return is_object( $job );
index ea50a85..02762f3 100644 (file)
  */
 
 /**
- * Replacement array for FSS with fallback to strtr()
- * Supports lazy initialisation of FSS resource
+ * Wrapper around strtr() that holds replacements
  */
 class ReplacementArray {
        private $data = false;
-       private $fss = false;
 
        /**
         * Create an object with the specified replacement array
         * The array should have the same form as the replacement array for strtr()
         * @param array $data
         */
-       public function __construct( $data = array() ) {
+       public function __construct( $data = [] ) {
                $this->data = $data;
        }
 
@@ -42,17 +40,12 @@ class ReplacementArray {
                return array( 'data' );
        }
 
-       public function __wakeup() {
-               $this->fss = false;
-       }
-
        /**
         * Set the whole replacement array at once
         * @param array $data
         */
        public function setArray( $data ) {
                $this->data = $data;
-               $this->fss = false;
        }
 
        /**
@@ -69,7 +62,6 @@ class ReplacementArray {
         */
        public function setPair( $from, $to ) {
                $this->data[$from] = $to;
-               $this->fss = false;
        }
 
        /**
@@ -77,7 +69,6 @@ class ReplacementArray {
         */
        public function mergeArray( $data ) {
                $this->data = $data + $this->data;
-               $this->fss = false;
        }
 
        /**
@@ -85,7 +76,6 @@ class ReplacementArray {
         */
        public function merge( ReplacementArray $other ) {
                $this->data = $other->data + $this->data;
-               $this->fss = false;
        }
 
        /**
@@ -93,7 +83,6 @@ class ReplacementArray {
         */
        public function removePair( $from ) {
                unset( $this->data[$from] );
-               $this->fss = false;
        }
 
        /**
@@ -103,7 +92,6 @@ class ReplacementArray {
                foreach ( $data as $from => $to ) {
                        $this->removePair( $from );
                }
-               $this->fss = false;
        }
 
        /**
@@ -111,18 +99,6 @@ class ReplacementArray {
         * @return string
         */
        public function replace( $subject ) {
-               if (
-                       function_exists( 'fss_prep_replace' ) &&
-                       version_compare( PHP_VERSION, '5.5.0' ) < 0
-               ) {
-                       if ( $this->fss === false ) {
-                               $this->fss = fss_prep_replace( $this->data );
-                       }
-                       $result = fss_exec_replace( $this->fss, $subject );
-               } else {
-                       $result = strtr( $subject, $this->data );
-               }
-
-               return $result;
+               return strtr( $subject, $this->data );
        }
 }
index 3736103..a7e8a47 100644 (file)
@@ -397,18 +397,15 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
                }
 
                $lSince = microtime( true ); // lock timestamp
-               // PHP 5.3: Can't use $this in a closure
-               $that = $this;
-               $logger = $this->logger;
 
-               return new ScopedCallback( function() use ( $that, $logger, $key, $lSince, $expiry ) {
+               return new ScopedCallback( function() use ( $key, $lSince, $expiry ) {
                        $latency = .050; // latency skew (err towards keeping lock present)
                        $age = ( microtime( true ) - $lSince + $latency );
                        if ( ( $age + $latency ) >= $expiry ) {
-                               $logger->warning( "Lock for $key held too long ($age sec)." );
+                               $this->logger->warning( "Lock for $key held too long ($age sec)." );
                                return; // expired; it's not "safe" to delete the key
                        }
-                       $that->unlock( $key );
+                       $this->unlock( $key );
                } );
        }
 
index 8007a53..ae82ca1 100644 (file)
@@ -350,7 +350,7 @@ class MemcachedClient {
                $res = $this->_fgets( $sock );
 
                if ( $this->_debug ) {
-                       $this->_debugprint( sprintf( "MemCache: delete %s (%s)\n", $key, $res ) );
+                       $this->_debugprint( sprintf( "MemCache: delete %s (%s)", $key, $res ) );
                }
 
                if ( $res == "DELETED" || $res == "NOT_FOUND" ) {
@@ -429,7 +429,7 @@ class MemcachedClient {
        public function get( $key, &$casToken = null ) {
 
                if ( $this->_debug ) {
-                       $this->_debugprint( "get($key)\n" );
+                       $this->_debugprint( "get($key)" );
                }
 
                if ( !is_array( $key ) && strval( $key ) === '' ) {
@@ -464,7 +464,7 @@ class MemcachedClient {
 
                if ( $this->_debug ) {
                        foreach ( $val as $k => $v ) {
-                               $this->_debugprint( sprintf( "MemCache: sock %s got %s\n", serialize( $sock ), $k ) );
+                               $this->_debugprint( sprintf( "MemCache: sock %s got %s", serialize( $sock ), $k ) );
                        }
                }
 
@@ -532,7 +532,7 @@ class MemcachedClient {
 
                if ( $this->_debug ) {
                        foreach ( $val as $k => $v ) {
-                               $this->_debugprint( sprintf( "MemCache: got %s\n", $k ) );
+                               $this->_debugprint( sprintf( "MemCache: got %s", $k ) );
                        }
                }
 
@@ -756,7 +756,7 @@ class MemcachedClient {
                        MediaWiki\restoreWarnings();
                }
                if ( !$sock ) {
-                       $this->_error_log( "Error connecting to $host: $errstr\n" );
+                       $this->_error_log( "Error connecting to $host: $errstr" );
                        $this->_dead_host( $host );
                        return false;
                }
@@ -1037,7 +1037,7 @@ class MemcachedClient {
                        $val = serialize( $val );
                        $flags |= self::SERIALIZED;
                        if ( $this->_debug ) {
-                               $this->_debugprint( sprintf( "client: serializing data as it is not scalar\n" ) );
+                               $this->_debugprint( sprintf( "client: serializing data as it is not scalar" ) );
                        }
                }
 
@@ -1051,7 +1051,7 @@ class MemcachedClient {
 
                        if ( $c_len < $len * ( 1 - self::COMPRESSION_SAVINGS ) ) {
                                if ( $this->_debug ) {
-                                       $this->_debugprint( sprintf( "client: compressing data; was %d bytes is now %d bytes\n", $len, $c_len ) );
+                                       $this->_debugprint( sprintf( "client: compressing data; was %d bytes is now %d bytes", $len, $c_len ) );
                                }
                                $val = $c_val;
                                $len = $c_len;
@@ -1071,7 +1071,7 @@ class MemcachedClient {
                $line = $this->_fgets( $sock );
 
                if ( $this->_debug ) {
-                       $this->_debugprint( sprintf( "%s %s (%s)\n", $cmd, $key, $line ) );
+                       $this->_debugprint( sprintf( "%s %s (%s)", $cmd, $key, $line ) );
                }
                if ( $line == "STORED" ) {
                        return true;
@@ -1173,7 +1173,7 @@ class MemcachedClient {
                        }
                }
                $msg = str_replace( '$1', $peer, $msg );
-               $this->_error_log( "$msg\n" );
+               $this->_error_log( "$msg" );
                $this->_dead_sock( $sock );
        }
 
index 8bac6b8..9bda12c 100644 (file)
@@ -74,11 +74,15 @@ class EmailNotification {
        /**
         * @param User $editor The editor that triggered the update.  Their notification
         *  timestamp will not be updated(they have already seen it)
-        * @param Title $title The title to update timestamps for
+        * @param LinkTarget $linkTarget The link target of the title to update timestamps for
         * @param string $timestamp Set the update timestamp to this value
         * @return int[] Array of user IDs
         */
-       public static function updateWatchlistTimestamp( User $editor, Title $title, $timestamp ) {
+       public static function updateWatchlistTimestamp(
+               User $editor,
+               LinkTarget $linkTarget,
+               $timestamp
+       ) {
                global $wgEnotifWatchlist, $wgShowUpdatedMarker;
 
                if ( !$wgEnotifWatchlist && !$wgShowUpdatedMarker ) {
@@ -90,8 +94,8 @@ class EmailNotification {
                        array( 'wl_user' ),
                        array(
                                'wl_user != ' . intval( $editor->getID() ),
-                               'wl_namespace' => $title->getNamespace(),
-                               'wl_title' => $title->getDBkey(),
+                               'wl_namespace' => $linkTarget->getNamespace(),
+                               'wl_title' => $linkTarget->getDBkey(),
                                'wl_notificationtimestamp IS NULL',
                        ), __METHOD__
                );
@@ -105,14 +109,14 @@ class EmailNotification {
                        // Update wl_notificationtimestamp for all watching users except the editor
                        $fname = __METHOD__;
                        $dbw->onTransactionIdle(
-                               function () use ( $dbw, $timestamp, $watchers, $title, $fname ) {
+                               function () use ( $dbw, $timestamp, $watchers, $linkTarget, $fname ) {
                                        $dbw->update( 'watchlist',
                                                array( /* SET */
                                                        'wl_notificationtimestamp' => $dbw->timestamp( $timestamp )
                                                ), array( /* WHERE */
                                                        'wl_user' => $watchers,
-                                                       'wl_namespace' => $title->getNamespace(),
-                                                       'wl_title' => $title->getDBkey(),
+                                                       'wl_namespace' => $linkTarget->getNamespace(),
+                                                       'wl_title' => $linkTarget->getDBkey(),
                                                ), $fname
                                        );
                                }
index 32638a5..4c36729 100644 (file)
@@ -53,7 +53,7 @@ class ImageHistoryList extends ContextSource {
         */
        public function __construct( $imagePage ) {
                global $wgShowArchiveThumbnails;
-               $this->current = $imagePage->getFile();
+               $this->current = $imagePage->getPage()->getFile();
                $this->img = $imagePage->getDisplayedFile();
                $this->title = $imagePage->getTitle();
                $this->imagePage = $imagePage;
index e421d23..f541387 100644 (file)
@@ -111,7 +111,7 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
                if ( $this->mQueryDone ) {
                        return;
                }
-               $this->mImg = $this->mImagePage->getFile(); // ensure loading
+               $this->mImg = $this->mImagePage->getPage()->getFile(); // ensure loading
                if ( !$this->mImg->exists() ) {
                        return;
                }
index b7eef8f..74d4904 100644 (file)
@@ -1793,6 +1793,8 @@ class WikiPage implements Page, IDBAccessObject {
 
                $changed = !$content->equals( $oldContent );
 
+               $dbw = wfGetDB( DB_MASTER );
+
                if ( $changed ) {
                        $prepStatus = $content->prepareSave( $this, $flags, $oldid, $user );
                        $status->merge( $prepStatus );
@@ -1800,14 +1802,13 @@ class WikiPage implements Page, IDBAccessObject {
                                return $status;
                        }
 
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->begin( __METHOD__ );
+                       $dbw->startAtomic( __METHOD__ );
                        // Get the latest page_latest value while locking it.
                        // Do a CAS style check to see if it's the same as when this method
                        // started. If it changed then bail out before touching the DB.
                        $latestNow = $this->lockAndGetLatest();
                        if ( $latestNow != $oldid ) {
-                               $dbw->commit( __METHOD__ );
+                               $dbw->endAtomic( __METHOD__ );
                                // Page updated or deleted in the mean time
                                $status->fatal( 'edit-conflict' );
 
@@ -1855,7 +1856,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                        $user->incEditCount();
 
-                       $dbw->commit( __METHOD__ );
+                       $dbw->endAtomic( __METHOD__ );
                        $this->mTimestamp = $now;
                } else {
                        // Bug 32948: revision ID must be set to page {{REVISIONID}} and
@@ -1863,17 +1864,6 @@ class WikiPage implements Page, IDBAccessObject {
                        $revision->setId( $this->getLatest() );
                }
 
-               // Update links tables, site stats, etc.
-               $this->doEditUpdates(
-                       $revision,
-                       $user,
-                       array(
-                               'changed' => $changed,
-                               'oldcountable' => $meta['oldCountable'],
-                               'oldrevision' => $meta['oldRevision']
-                       )
-               );
-
                if ( $changed ) {
                        // Return the new revision to the caller
                        $status->value['revision'] = $revision;
@@ -1884,11 +1874,32 @@ class WikiPage implements Page, IDBAccessObject {
                        $this->mTitle->invalidateCache( $now );
                }
 
-               // Trigger post-save hook
-               $hook_args = array( &$this, &$user, $content, $summary,
-                       $flags & EDIT_MINOR, null, null, &$flags, $revision, &$status, $meta['baseRevId'] );
-               ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $hook_args );
-               Hooks::run( 'PageContentSaveComplete', $hook_args );
+               // Do secondary updates once the main changes have been committed...
+               $that = $this;
+               $dbw->onTransactionIdle(
+                       function () use (
+                               $dbw, &$that, $revision, &$user, $content, $summary, &$flags,
+                               $changed, $meta, &$status
+                       ) {
+                               // Do per-page updates in a transaction
+                               $dbw->setFlag( DBO_TRX );
+                               // Update links tables, site stats, etc.
+                               $that->doEditUpdates(
+                                       $revision,
+                                       $user,
+                                       array(
+                                               'changed' => $changed,
+                                               'oldcountable' => $meta['oldCountable'],
+                                               'oldrevision' => $meta['oldRevision']
+                                       )
+                               );
+                               // Trigger post-save hook
+                               $params = array( &$that, &$user, $content, $summary, $flags & EDIT_MINOR,
+                                       null, null, &$flags, $revision, &$status, $meta['baseRevId'] );
+                               ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $params );
+                               Hooks::run( 'PageContentSaveComplete', $params );
+                       }
+               );
 
                return $status;
        }
@@ -2200,7 +2211,7 @@ class WikiPage implements Page, IDBAccessObject {
         *   - 'no-change': don't update the article count, ever
         */
        public function doEditUpdates( Revision $revision, User $user, array $options = array() ) {
-               global $wgRCWatchCategoryMembership;
+               global $wgRCWatchCategoryMembership, $wgContLang;
 
                $options += array(
                        'changed' => true,
@@ -2329,6 +2340,10 @@ class WikiPage implements Page, IDBAccessObject {
                        }
 
                        MessageCache::singleton()->replace( $shortTitle, $msgtext );
+
+                       if ( $wgContLang->hasVariants() ) {
+                               $wgContLang->updateConversionTable( $this->mTitle );
+                       }
                }
 
                if ( $options['created'] ) {
@@ -3276,6 +3291,8 @@ class WikiPage implements Page, IDBAccessObject {
         * @param Title $title
         */
        public static function onArticleDelete( Title $title ) {
+               global $wgContLang;
+
                // Update existence markers on article/talk tabs...
                $other = $title->getOtherPage();
 
@@ -3291,6 +3308,10 @@ class WikiPage implements Page, IDBAccessObject {
                // Messages
                if ( $title->getNamespace() == NS_MEDIAWIKI ) {
                        MessageCache::singleton()->replace( $title->getDBkey(), false );
+
+                       if ( $wgContLang->hasVariants() ) {
+                               $wgContLang->updateConversionTable( $title );
+                       }
                }
 
                // Images
index 6329fd7..7fc9a16 100644 (file)
@@ -440,8 +440,11 @@ class LinkHolderArray {
                # Make interwiki link HTML
                $output = $this->parent->getOutput();
                $replacePairs = array();
+               $options = array(
+                       'stubThreshold' => $this->parent->getOptions()->getStubThreshold(),
+               );
                foreach ( $this->interwikis as $key => $link ) {
-                       $replacePairs[$key] = Linker::link( $link['title'], $link['text'] );
+                       $replacePairs[$key] = Linker::link( $link['title'], $link['text'], array(), array(), $options );
                        $output->addInterwikiLink( $link['title'] );
                }
                $replacer = new HashtableReplacer( $replacePairs, 1 );
index 0e8d76d..49c6ce9 100644 (file)
@@ -601,6 +601,7 @@ class ParserOptions {
 
        /**
         * Get a ParserOptions object for an anonymous user
+        * @since 1.27
         * @return ParserOptions
         */
        public static function newFromAnon() {
index d7b51b8..51a6225 100644 (file)
@@ -618,11 +618,8 @@ class ResourceLoader implements LoggerAwareInterface {
                if ( !$modules ) {
                        return '';
                }
-               // Support: PHP 5.3 ("$this" for anonymous functions was added in PHP 5.4.0)
-               // http://php.net/functions.anonymous
-               $rl = $this;
-               $hashes = array_map( function ( $module ) use ( $rl, $context ) {
-                       return $rl->getModule( $module )->getVersionHash( $context );
+               $hashes = array_map( function ( $module ) use ( $context ) {
+                       return $this->getModule( $module )->getVersionHash( $context );
                }, $modules );
                return self::makeHash( implode( $hashes ) );
        }
index bcd159f..14132d6 100644 (file)
@@ -434,16 +434,28 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                try {
                        // If the list has been modified since last time we cached it, update the cache
                        if ( $localFileRefs !== $this->getFileDependencies( $context ) ) {
+                               $cache = ObjectCache::getLocalClusterInstance();
+                               $key = $cache->makeKey( __METHOD__, $this->getName() );
+                               $scopeLock = $cache->getScopedLock( $key, 0 );
+                               if ( !$scopeLock ) {
+                                       return; // T124649; avoid write slams
+                               }
+
                                $vary = $context->getSkin() . '|' . $context->getLanguage();
                                $dbw = wfGetDB( DB_MASTER );
                                $dbw->replace( 'module_deps',
-                                       array( array( 'md_module', 'md_skin' ) ), array(
+                                       array( array( 'md_module', 'md_skin' ) ),
+                                       array(
                                                'md_module' => $this->getName(),
                                                'md_skin' => $vary,
                                                // Use relative paths to avoid ghost entries when $IP changes (T111481)
                                                'md_deps' => FormatJson::encode( self::getRelativePaths( $localFileRefs ) ),
                                        )
                                );
+
+                               $dbw->onTransactionIdle( function () use ( &$scopeLock ) {
+                                       ScopedCallback::consume( $scopeLock ); // release after commit
+                               } );
                        }
                } catch ( Exception $e ) {
                        wfDebugLog( 'resourceloader', __METHOD__ . ": failed to update DB: $e" );
index d9c60c7..81c7ebf 100644 (file)
@@ -118,26 +118,44 @@ class BotPasswordSessionProvider extends ImmutableSessionProviderWithCookie {
                        array_keys( $metadata )
                );
                if ( $missingKeys ) {
-                       $this->logger->info( "Session $info: Missing metadata: " . join( ', ', $missingKeys ) );
+                       $this->logger->info( 'Session "{session}": Missing metadata: {missing}', array(
+                               'session' => $info,
+                               'missing' => join( ', ', $missingKeys ),
+                       ) );
                        return false;
                }
 
                $bp = BotPassword::newFromCentralId( $metadata['centralId'], $metadata['appId'] );
                if ( !$bp ) {
                        $this->logger->info(
-                               "Session $info: No BotPassword for {$metadata['centralId']} {$metadata['appId']}"
-                       );
+                               'Session "{session}": No BotPassword for {centralId} {appId}',
+                               array(
+                                       'session' => $info,
+                                       'centralId' => $metadata['centralId'],
+                                       'appId' => $metadata['appId'],
+                       ) );
                        return false;
                }
 
                if ( !hash_equals( $metadata['token'], $bp->getToken() ) ) {
-                       $this->logger->info( "Session $info: BotPassword token check failed" );
+                       $this->logger->info( 'Session "{session}": BotPassword token check failed', array(
+                               'session' => $info,
+                               'centralId' => $metadata['centralId'],
+                               'appId' => $metadata['appId'],
+                       ) );
                        return false;
                }
 
                $status = $bp->getRestrictions()->check( $request );
                if ( !$status->isOk() ) {
-                       $this->logger->info( "Session $info: Restrictions check failed", $status->getValue() );
+                       $this->logger->info(
+                               'Session "{session}": Restrictions check failed',
+                               array(
+                                       'session' => $info,
+                                       'restrictions' => $status->getValue(),
+                                       'centralId' => $metadata['centralId'],
+                                       'appId' => $metadata['appId'],
+                       ) );
                        return false;
                }
 
index f989cbc..3177dc2 100644 (file)
@@ -123,11 +123,28 @@ class CookieSessionProvider extends SessionProvider {
 
                        // Sanity check
                        if ( $userName !== null && $userInfo->getName() !== $userName ) {
+                               $this->logger->warning(
+                                       'Session "{session}" requested with mismatched UserID and UserName cookies.',
+                                       array(
+                                               'session' => $info['id'],
+                                               'mismatch' => array(
+                                                       'userid' => $userId,
+                                                       'cookie_username' => $userName,
+                                                       'username' => $userInfo->getName(),
+                                               ),
+                               ) );
                                return null;
                        }
 
                        if ( $token !== null ) {
                                if ( !hash_equals( $userInfo->getToken(), $token ) ) {
+                                       $this->logger->warning(
+                                               'Session "{session}" requested with invalid Token cookie.',
+                                               array(
+                                                       'session' => $info['id'],
+                                                       'userid' => $userId,
+                                                       'username' => $userInfo->getName(),
+                                        ) );
                                        return null;
                                }
                                $info['userInfo'] = $userInfo->verified();
@@ -140,6 +157,15 @@ class CookieSessionProvider extends SessionProvider {
                        }
                } elseif ( isset( $info['id'] ) ) {
                        // No UserID cookie, so insist that the session is anonymous.
+                       // Note: this event occurs for several normal activities:
+                       // * anon visits Special:UserLogin
+                       // * anon browsing after seeing Special:UserLogin
+                       // * anon browsing after edit or preview
+                       $this->logger->debug(
+                               'Session "{session}" requested without UserID cookie',
+                               array(
+                                       'session' => $info['id'],
+                       ) );
                        $info['userInfo'] = UserInfo::newAnonymous();
                } else {
                        // No session ID and no user is the same as an empty session, so
index 4dea274..7d7e1cb 100644 (file)
@@ -28,13 +28,10 @@ use BagOStuff;
 
 /**
  * Adapter for PHP's session handling
- * @todo Once we drop support for PHP < 5.4, use SessionHandlerInterface
- *  (should just be a matter of adding "implements SessionHandlerInterface" and
- *  changing the session_set_save_handler() call).
  * @ingroup Session
  * @since 1.27
  */
-class PHPSessionHandler {
+class PHPSessionHandler implements \SessionHandlerInterface {
        /** @var PHPSessionHandler */
        protected static $instance = null;
 
@@ -132,20 +129,9 @@ class PHPSessionHandler {
                // Also set a sane serialization handler
                \Wikimedia\PhpSessionSerializer::setSerializeHandler();
 
-               session_set_save_handler(
-                       array( self::$instance, 'open' ),
-                       array( self::$instance, 'close' ),
-                       array( self::$instance, 'read' ),
-                       array( self::$instance, 'write' ),
-                       array( self::$instance, 'destroy' ),
-                       array( self::$instance, 'gc' )
-               );
-
-               // It's necessary to register a shutdown function to call session_write_close(),
-               // because by the time the request shutdown function for the session module is
-               // called, other needed objects may have already been destroyed. Shutdown functions
-               // registered this way are called before object destruction.
-               register_shutdown_function( array( self::$instance, 'handleShutdown' ) );
+               // Register this as the save handler, and register an appropriate
+               // shutdown function.
+               session_set_save_handler( self::$instance, true );
        }
 
        /**
@@ -247,8 +233,10 @@ class PHPSessionHandler {
                        // This can happen under normal circumstances, if the session exists but is
                        // invalid. Let's emit a log warning instead of a PHP warning.
                        $this->logger->warning(
-                               __METHOD__ . ": Session \"$id\" cannot be loaded, skipping write."
-                       );
+                               __METHOD__ . ': Session "{session}" cannot be loaded, skipping write.',
+                               array(
+                                       'session' => $id,
+                       ) );
                        return true;
                }
 
@@ -366,18 +354,4 @@ class PHPSessionHandler {
                $this->store->deleteObjectsExpiringBefore( $before );
                return true;
        }
-
-       /**
-        * Shutdown function.
-        *
-        * See the comment inside self::install for rationale.
-        * @codeCoverageIgnore
-        * @private For internal use only
-        */
-       public function handleShutdown() {
-               if ( $this->enable ) {
-                       session_write_close();
-               }
-       }
-
 }
index 2bff173..fe446e3 100644 (file)
@@ -138,7 +138,11 @@ final class SessionBackend {
                        $this->data = array();
                        $this->dataDirty = true;
                        $this->metaDirty = true;
-                       $this->logger->debug( "SessionBackend $this->id is unsaved, marking dirty in constructor" );
+                       $this->logger->debug(
+                               'SessionBackend "{session}" is unsaved, marking dirty in constructor',
+                               array(
+                                       'session' => $this->id,
+                       ) );
                } else {
                        $this->data = $blob['data'];
                        if ( isset( $blob['metadata']['loggedOut'] ) ) {
@@ -149,8 +153,10 @@ final class SessionBackend {
                        } else {
                                $this->metaDirty = true;
                                $this->logger->debug(
-                                       "SessionBackend $this->id metadata dirty due to missing expiration timestamp"
-                               );
+                                       'SessionBackend "{session}" metadata dirty due to missing expiration timestamp',
+                               array(
+                                       'session' => $this->id,
+                               ) );
                        }
                }
                $this->dataHash = md5( serialize( $this->data ) );
@@ -218,8 +224,11 @@ final class SessionBackend {
                        $this->provider->sessionIdWasReset( $this, $oldId );
                        $this->metaDirty = true;
                        $this->logger->debug(
-                               "SessionBackend $this->id metadata dirty due to ID reset (formerly $oldId)"
-                       );
+                               'SessionBackend "{session}" metadata dirty due to ID reset (formerly "{oldId}")',
+                               array(
+                                       'session' => $this->id,
+                                       'oldId' => $oldId,
+                       ) );
 
                        if ( $restart ) {
                                session_id( (string)$this->id );
@@ -263,7 +272,11 @@ final class SessionBackend {
                        $this->persist = true;
                        $this->forcePersist = true;
                        $this->metaDirty = true;
-                       $this->logger->debug( "SessionBackend $this->id force-persist due to persist()" );
+                       $this->logger->debug(
+                               'SessionBackend "{session}" force-persist due to persist()',
+                               array(
+                                       'session' => $this->id,
+                       ) );
                        $this->autosave();
                } else {
                        $this->renew();
@@ -288,7 +301,11 @@ final class SessionBackend {
                if ( $this->remember !== (bool)$remember ) {
                        $this->remember = (bool)$remember;
                        $this->metaDirty = true;
-                       $this->logger->debug( "SessionBackend $this->id metadata dirty due to remember-user change" );
+                       $this->logger->debug(
+                               'SessionBackend "{session}" metadata dirty due to remember-user change',
+                               array(
+                                       'session' => $this->id,
+                       ) );
                        $this->autosave();
                }
        }
@@ -345,7 +362,11 @@ final class SessionBackend {
 
                $this->user = $user;
                $this->metaDirty = true;
-               $this->logger->debug( "SessionBackend $this->id metadata dirty due to user change" );
+               $this->logger->debug(
+                       'SessionBackend "{session}" metadata dirty due to user change',
+                       array(
+                               'session' => $this->id,
+               ) );
                $this->autosave();
        }
 
@@ -377,7 +398,11 @@ final class SessionBackend {
                if ( $this->forceHTTPS !== (bool)$force ) {
                        $this->forceHTTPS = (bool)$force;
                        $this->metaDirty = true;
-                       $this->logger->debug( "SessionBackend $this->id metadata dirty due to force-HTTPS change" );
+                       $this->logger->debug(
+                               'SessionBackend "{session}" metadata dirty due to force-HTTPS change',
+                               array(
+                                       'session' => $this->id,
+                       ) );
                        $this->autosave();
                }
        }
@@ -400,8 +425,10 @@ final class SessionBackend {
                        $this->loggedOut = $ts;
                        $this->metaDirty = true;
                        $this->logger->debug(
-                               "SessionBackend $this->id metadata dirty due to logged-out-timestamp change"
-                       );
+                               'SessionBackend "{session}" metadata dirty due to logged-out-timestamp change',
+                               array(
+                                       'session' => $this->id,
+                       ) );
                        $this->autosave();
                }
        }
@@ -428,8 +455,10 @@ final class SessionBackend {
                        $this->providerMetadata = $metadata;
                        $this->metaDirty = true;
                        $this->logger->debug(
-                               "SessionBackend $this->id metadata dirty due to provider metadata change"
-                       );
+                               'SessionBackend "{session}" metadata dirty due to provider metadata change',
+                               array(
+                                       'session' => $this->id,
+                       ) );
                        $this->autosave();
                }
        }
@@ -461,8 +490,11 @@ final class SessionBackend {
                                $data[$key] = $value;
                                $this->dataDirty = true;
                                $this->logger->debug(
-                                       "SessionBackend $this->id data dirty due to addData(): " . wfGetAllCallers( 5 )
-                               );
+                                       'SessionBackend "{session}" data dirty due to addData(): {callers}',
+                                       array(
+                                               'session' => $this->id,
+                                               'callers' => wfGetAllCallers( 5 ),
+                               ) );
                        }
                }
        }
@@ -474,8 +506,11 @@ final class SessionBackend {
        public function dirty() {
                $this->dataDirty = true;
                $this->logger->debug(
-                       "SessionBackend $this->id data dirty due to dirty(): " . wfGetAllCallers( 5 )
-               );
+                       'SessionBackend "{session}" data dirty due to dirty(): {callers}',
+                       array(
+                               'session' => $this->id,
+                               'callers' => wfGetAllCallers( 5 ),
+               ) );
        }
 
        /**
@@ -488,13 +523,19 @@ final class SessionBackend {
                if ( time() + $this->lifetime / 2 > $this->expires ) {
                        $this->metaDirty = true;
                        $this->logger->debug(
-                               "SessionBackend $this->id metadata dirty for renew(): " . wfGetAllCallers( 5 )
-                       );
+                               'SessionBackend "{callers}" metadata dirty for renew(): {callers}',
+                               array(
+                                       'session' => $this->id,
+                                       'callers' => wfGetAllCallers( 5 ),
+                       ) );
                        if ( $this->persist ) {
                                $this->forcePersist = true;
                                $this->logger->debug(
-                                       "SessionBackend $this->id force-persist for renew(): " . wfGetAllCallers( 5 )
-                               );
+                                       'SessionBackend "{session}" force-persist for renew(): {callers}',
+                                       array(
+                                               'session' => $this->id,
+                                               'callers' => wfGetAllCallers( 5 ),
+                               ) );
                        }
                }
                $this->autosave();
@@ -508,13 +549,11 @@ final class SessionBackend {
         * @return \ScopedCallback When this goes out of scope, a save will be triggered
         */
        public function delaySave() {
-               $that = $this;
                $this->delaySave++;
-               $ref = &$this->delaySave;
-               return new \ScopedCallback( function () use ( $that, &$ref ) {
-                       if ( --$ref <= 0 ) {
-                               $ref = 0;
-                               $that->save();
+               return new \ScopedCallback( function () {
+                       if ( --$this->delaySave <= 0 ) {
+                               $this->delaySave = 0;
+                               $this->save();
                        }
                } );
        }
@@ -535,9 +574,12 @@ final class SessionBackend {
        public function save( $closing = false ) {
                if ( $this->provider->getManager()->isUserSessionPrevented( $this->user->getName() ) ) {
                        $this->logger->debug(
-                               "SessionBackend $this->id not saving, " .
-                                       "user {$this->user} was passed to SessionManager::preventSessionsForUser"
-                       );
+                               'SessionBackend "{session}" not saving, user {user} was ' .
+                               'passed to SessionManager::preventSessionsForUser',
+                               array(
+                                       'session' => $this->id,
+                                       'user' => $this->user,
+                       ) );
                        return;
                }
 
@@ -546,8 +588,11 @@ final class SessionBackend {
                $anon = $this->user->isAnon();
                if ( !$anon && !$this->user->getToken( false ) ) {
                        $this->logger->debug(
-                               "SessionBackend $this->id creating token for user {$this->user} on save"
-                       );
+                               'SessionBackend "{session}" creating token for user {user} on save',
+                               array(
+                                       'session' => $this->id,
+                                       'user' => $this->user,
+                       ) );
                        $this->user->setToken();
                        if ( !wfReadOnly() ) {
                                $this->user->saveSettings();
@@ -559,8 +604,13 @@ final class SessionBackend {
                if ( !$this->metaDirty && !$this->dataDirty &&
                        $this->dataHash !== md5( serialize( $this->data ) )
                ) {
-                       $this->logger->debug( "SessionBackend $this->id data dirty due to hash mismatch, " .
-                               "$this->dataHash !== " . md5( serialize( $this->data ) ) );
+                       $this->logger->debug(
+                               'SessionBackend "{session}" data dirty due to hash mismatch, {expected} !== {got}',
+                               array(
+                                       'session' => $this->id,
+                                       'expected' => $this->dataHash,
+                                       'got' => md5( serialize( $this->data ) ),
+                       ) );
                        $this->dataDirty = true;
                }
 
@@ -568,11 +618,15 @@ final class SessionBackend {
                        return;
                }
 
-               $this->logger->debug( "SessionBackend $this->id save: " .
-                       'dataDirty=' . (int)$this->dataDirty . ' ' .
-                       'metaDirty=' . (int)$this->metaDirty . ' ' .
-                       'forcePersist=' . (int)$this->forcePersist
-               );
+               $this->logger->debug(
+                       'SessionBackend "{session}" save: dataDirty={dataDirty} ' .
+                       'metaDirty={metaDirty} forcePersist={forcePersist}',
+                       array(
+                               'session' => $this->id,
+                               'dataDirty' => (int)$this->dataDirty,
+                               'metaDirty' => (int)$this->metaDirty,
+                               'forcePersist' => (int)$this->forcePersist,
+               ) );
 
                // Persist to the provider, if flagged
                if ( $this->persist && ( $this->metaDirty || $this->forcePersist ) ) {
@@ -636,15 +690,18 @@ final class SessionBackend {
        private function checkPHPSession() {
                if ( !$this->checkPHPSessionRecursionGuard ) {
                        $this->checkPHPSessionRecursionGuard = true;
-                       $ref = &$this->checkPHPSessionRecursionGuard;
-                       $reset = new \ScopedCallback( function () use ( &$ref ) {
-                               $ref = false;
+                       $reset = new \ScopedCallback( function () {
+                               $this->checkPHPSessionRecursionGuard = false;
                        } );
 
                        if ( $this->usePhpSessionHandling && session_id() === '' && PHPSessionHandler::isEnabled() &&
                                SessionManager::getGlobalSession()->getId() === (string)$this->id
                        ) {
-                               $this->logger->debug( "SessionBackend $this->id: Taking over PHP session" );
+                               $this->logger->debug(
+                                       'SessionBackend "{session}" Taking over PHP session',
+                                       array(
+                                               'session' => $this->id,
+                               ) );
                                session_id( (string)$this->id );
                                \MediaWiki\quietCall( 'session_start' );
                        }
index 9fe2cdf..ff40aa5 100644 (file)
 
 namespace MediaWiki\Session;
 
-use Psr\Log\LoggerInterface;
-use BagOStuff;
-use WebRequest;
-
 /**
  * Value object returned by SessionProvider
  *
index 57d5664..83c30ab 100644 (file)
@@ -28,8 +28,6 @@ use BagOStuff;
 use CachedBagOStuff;
 use Config;
 use FauxRequest;
-use Language;
-use Message;
 use User;
 use WebRequest;
 
@@ -216,8 +214,11 @@ final class SessionManager implements SessionManagerInterface {
                        try {
                                $session = $this->getEmptySessionInternal( $request, $id );
                        } catch ( \Exception $ex ) {
-                               $this->logger->error( __METHOD__ . ': failed to create empty session: ' .
-                                       $ex->getMessage() );
+                               $this->logger->error( 'Failed to create empty session: {exception}',
+                                       array(
+                                               'method' => __METHOD__,
+                                               'exception' => $ex,
+                               ) );
                                $session = null;
                        }
                }
@@ -462,14 +463,21 @@ final class SessionManager implements SessionManagerInterface {
 
                // Checks passed, create the user...
                $from = isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : 'CLI';
-               $logger->info( __METHOD__ . ": creating new user ($userName) - from: $from" );
+               $logger->info( __METHOD__ . ': creating new user ({username}) - from: {url}',
+                       array(
+                               'username' => $userName,
+                               'url' => $from,
+               ) );
 
                try {
                        // Insert the user into the local DB master
                        $status = $user->addToDatabase();
                        if ( !$status->isOK() ) {
                                // @codeCoverageIgnoreStart
-                               $logger->error( __METHOD__ . ': failed with message ' . $status->getWikiText() );
+                               $logger->error( __METHOD__ . ': failed with message ' . $status->getWikiText(),
+                                       array(
+                                               'username' => $userName,
+                               ) );
                                $user->setId( 0 );
                                $user->loadFromId();
                                return false;
@@ -477,7 +485,10 @@ final class SessionManager implements SessionManagerInterface {
                        }
                } catch ( \Exception $ex ) {
                        // @codeCoverageIgnoreStart
-                       $logger->error( __METHOD__ . ': failed with exception ' . $ex->getMessage() );
+                       $logger->error( __METHOD__ . ': failed with exception {exception}', array(
+                               'exception' => $ex,
+                               'username' => $userName,
+                       ) );
                        // Do not keep throwing errors for a while
                        $cache->set( $backoffKey, 1, 600 );
                        // Bubble up error; which should normally trigger DB rollbacks
@@ -520,13 +531,6 @@ final class SessionManager implements SessionManagerInterface {
        public function preventSessionsForUser( $username ) {
                $this->preventUsers[$username] = true;
 
-               // Reset the user's token to kill existing sessions
-               $user = User::newFromName( $username );
-               if ( $user && $user->getToken( false ) ) {
-                       $user->setToken();
-                       $user->saveSettings();
-               }
-
                // Instruct the session providers to kill any other sessions too.
                foreach ( $this->getProviders() as $provider ) {
                        $provider->preventSessionsForUser( $username );
@@ -669,7 +673,9 @@ final class SessionManager implements SessionManagerInterface {
                if ( $blob !== false ) {
                        // Sanity check: blob must be an array, if it's saved at all
                        if ( !is_array( $blob ) ) {
-                               $this->logger->warning( "Session $info: Bad data" );
+                               $this->logger->warning( 'Session "{session}": Bad data', array(
+                                       'session' => $info,
+                               ) );
                                $this->store->delete( $key );
                                return false;
                        }
@@ -678,7 +684,9 @@ final class SessionManager implements SessionManagerInterface {
                        if ( !isset( $blob['data'] ) || !is_array( $blob['data'] ) ||
                                !isset( $blob['metadata'] ) || !is_array( $blob['metadata'] )
                        ) {
-                               $this->logger->warning( "Session $info: Bad data structure" );
+                               $this->logger->warning( 'Session "{session}": Bad data structure', array(
+                                       'session' => $info,
+                               ) );
                                $this->store->delete( $key );
                                return false;
                        }
@@ -693,7 +701,9 @@ final class SessionManager implements SessionManagerInterface {
                                !array_key_exists( 'userToken', $metadata ) ||
                                !array_key_exists( 'provider', $metadata )
                        ) {
-                               $this->logger->warning( "Session $info: Bad metadata" );
+                               $this->logger->warning( 'Session "{session}": Bad metadata', array(
+                                       'session' => $info,
+                               ) );
                                $this->store->delete( $key );
                                return false;
                        }
@@ -703,13 +713,21 @@ final class SessionManager implements SessionManagerInterface {
                        if ( $provider === null ) {
                                $newParams['provider'] = $provider = $this->getProvider( $metadata['provider'] );
                                if ( !$provider ) {
-                                       $this->logger->warning( "Session $info: Unknown provider, " . $metadata['provider'] );
+                                       $this->logger->warning(
+                                               'Session "{session}": Unknown provider ' . $metadata['provider'],
+                                               array(
+                                                       'session' => $info,
+                                               )
+                                       );
                                        $this->store->delete( $key );
                                        return false;
                                }
                        } elseif ( $metadata['provider'] !== (string)$provider ) {
-                               $this->logger->warning( "Session $info: Wrong provider, " .
-                                       $metadata['provider'] . ' !== ' . $provider );
+                               $this->logger->warning( 'Session "{session}": Wrong provider ' .
+                                       $metadata['provider'] . ' !== ' . $provider,
+                                       array(
+                                               'session' => $info,
+                               ) );
                                return false;
                        }
 
@@ -727,7 +745,12 @@ final class SessionManager implements SessionManagerInterface {
                                                        $newParams['metadata'] = $newProviderMetadata;
                                                }
                                        } catch ( \UnexpectedValueException $ex ) {
-                                               $this->logger->warning( "Session $info: Metadata merge failed: " . $ex->getMessage() );
+                                               $this->logger->warning(
+                                                       'Session "{session}": Metadata merge failed: {exception}',
+                                                       array(
+                                                               'session' => $info,
+                                                               'exception' => $ex,
+                                               ) );
                                                return false;
                                        }
                                }
@@ -746,7 +769,10 @@ final class SessionManager implements SessionManagerInterface {
                                                $userInfo = UserInfo::newAnonymous();
                                        }
                                } catch ( \InvalidArgumentException $ex ) {
-                                       $this->logger->error( "Session $info: " . $ex->getMessage() );
+                                       $this->logger->error( 'Session "{session}": {exception}', array(
+                                               'session' => $info,
+                                               'exception' => $ex,
+                                       ) );
                                        return false;
                                }
                                $newParams['userInfo'] = $userInfo;
@@ -755,8 +781,13 @@ final class SessionManager implements SessionManagerInterface {
                                // is no saved ID and the names match.
                                if ( $metadata['userId'] ) {
                                        if ( $metadata['userId'] !== $userInfo->getId() ) {
-                                               $this->logger->warning( "Session $info: User ID mismatch, " .
-                                                       $metadata['userId'] . ' !== ' . $userInfo->getId() );
+                                               $this->logger->warning(
+                                                       'Session "{session}": User ID mismatch, {uid_a} !== {uid_b}',
+                                                       array(
+                                                               'session' => $info,
+                                                               'uid_a' => $metadata['userId'],
+                                                               'uid_b' => $userInfo->getId(),
+                                               ) );
                                                return false;
                                        }
 
@@ -764,24 +795,35 @@ final class SessionManager implements SessionManagerInterface {
                                        if ( $metadata['userName'] !== null &&
                                                $userInfo->getName() !== $metadata['userName']
                                        ) {
-                                               $this->logger->warning( "Session $info: User ID matched but name didn't (rename?), " .
-                                                       $metadata['userName'] . ' !== ' . $userInfo->getName() );
+                                               $this->logger->warning(
+                                                       'Session "{session}": User ID matched but name didn\'t (rename?), {uname_a} !== {uname_b}',
+                                                       array(
+                                                               'session' => $info,
+                                                               'uname_a' => $metadata['userName'],
+                                                               'uname_b' => $userInfo->getName(),
+                                               ) );
                                                return false;
                                        }
 
                                } elseif ( $metadata['userName'] !== null ) { // Shouldn't happen, but just in case
                                        if ( $metadata['userName'] !== $userInfo->getName() ) {
-                                               $this->logger->warning( "Session $info: User name mismatch, " .
-                                                       $metadata['userName'] . ' !== ' . $userInfo->getName() );
+                                               $this->logger->warning(
+                                                       'Session "{session}": User name mismatch, {uname_a} !== {uname_b}',
+                                                       array(
+                                                               'session' => $info,
+                                                               'uname_a' => $metadata['userName'],
+                                                               'uname_b' => $userInfo->getName(),
+                                               ) );
                                                return false;
                                        }
                                } elseif ( !$userInfo->isAnon() ) {
                                        // Metadata specifies an anonymous user, but the passed-in
                                        // user isn't anonymous.
                                        $this->logger->warning(
-                                               "Session $info: Metadata has an anonymous user, " .
-                                                       'but a non-anon user was provided'
-                                       );
+                                               'Session "{session}": Metadata has an anonymous user, but a non-anon user was provided',
+                                               array(
+                                                       'session' => $info,
+                                       ) );
                                        return false;
                                }
                        }
@@ -790,7 +832,9 @@ final class SessionManager implements SessionManagerInterface {
                        if ( $metadata['userToken'] !== null &&
                                $userInfo->getToken() !== $metadata['userToken']
                        ) {
-                               $this->logger->warning( "Session $info: User token mismatch" );
+                               $this->logger->warning( 'Session "{session}": User token mismatch', array(
+                                       'session' => $info,
+                               ) );
                                return false;
                        }
                        if ( !$userInfo->isVerified() ) {
@@ -813,7 +857,11 @@ final class SessionManager implements SessionManagerInterface {
                } else {
                        // No metadata, so we can't load the provider if one wasn't given.
                        if ( $info->getProvider() === null ) {
-                               $this->logger->warning( "Session $info: Null provider and no metadata" );
+                               $this->logger->warning(
+                                       'Session "{session}": Null provider and no metadata',
+                                       array(
+                                               'session' => $info,
+                               ) );
                                return false;
                        }
 
@@ -823,14 +871,18 @@ final class SessionManager implements SessionManagerInterface {
                                        $newParams['userInfo'] = UserInfo::newAnonymous();
                                } else {
                                        $this->logger->info(
-                                               "Session $info: No user provided and provider cannot set user"
-                                       );
+                                               'Session "{session}": No user provided and provider cannot set user',
+                                               array(
+                                                       'session' => $info,
+                                       ) );
                                        return false;
                                }
                        } elseif ( !$info->getUserInfo()->isVerified() ) {
                                $this->logger->warning(
-                                       "Session $info: Unverified user provided and no metadata to auth it"
-                               );
+                                       'Session "{session}": Unverified user provided and no metadata to auth it',
+                                       array(
+                                               'session' => $info,
+                               ) );
                                return false;
                        }
 
@@ -870,7 +922,9 @@ final class SessionManager implements SessionManagerInterface {
                        'SessionCheckInfo',
                        array( &$reason, $info, $request, $metadata, $data )
                ) ) {
-                       $this->logger->warning( "Session $info: $reason" );
+                       $this->logger->warning( 'Session "{session}": ' . $reason, array(
+                               'session' => $info,
+                       ) );
                        return false;
                }
 
index 143b621..85b17f9 100644 (file)
@@ -574,7 +574,7 @@ abstract class BaseTemplate extends QuickTemplate {
         * display the text from footericons instead of the images and don't want a
         * duplicate copyright statement because footerlinks already rendered one.
         * @param string $option
-        * @return string
+        * @return array
         */
        function getFooterIcons( $option = null ) {
                // Generate additional footer icons
index 27e645a..bb26cf3 100644 (file)
@@ -336,13 +336,12 @@ abstract class QueryPage extends SpecialPage {
                                        );
                                }
 
-                               $that = $this;
                                $dbw->doAtomicSection(
                                        __METHOD__,
-                                       function ( IDatabase $dbw, $fname ) use ( $that, $vals ) {
+                                       function ( IDatabase $dbw, $fname ) use ( $vals ) {
                                                # Clear out any old cached data
                                                $dbw->delete( 'querycache',
-                                                       array( 'qc_type' => $that->getName() ),
+                                                       array( 'qc_type' => $this->getName() ),
                                                        $fname
                                                );
                                                # Save results into the querycache table on the master
@@ -351,11 +350,11 @@ abstract class QueryPage extends SpecialPage {
                                                }
                                                # Update the querycache_info record for the page
                                                $dbw->delete( 'querycache_info',
-                                                       array( 'qci_type' => $that->getName() ),
+                                                       array( 'qci_type' => $this->getName() ),
                                                        $fname
                                                );
                                                $dbw->insert( 'querycache_info',
-                                                       array( 'qci_type' => $that->getName(),
+                                                       array( 'qci_type' => $this->getName(),
                                                                'qci_timestamp' => $dbw->timestamp() ),
                                                        $fname
                                                );
index 28ff1c7..a164c1e 100644 (file)
@@ -262,15 +262,15 @@ class SpecialLog extends SpecialPage {
                // Select: All, None, Invert
                $links = array();
                $links[] = Html::element(
-                       'a', array( 'href' => '#', 'id' => 'checkbox-all' ),
+                       'a', array( 'href' => '#', 'class' => 'mw-checkbox-all' ),
                        $this->msg( 'checkbox-all' )->text()
                );
                $links[] = Html::element(
-                       'a', array( 'href' => '#', 'id' => 'checkbox-none' ),
+                       'a', array( 'href' => '#', 'class' => 'mw-checkbox-none' ),
                        $this->msg( 'checkbox-none' )->text()
                );
                $links[] = Html::element(
-                       'a', array( 'href' => '#', 'id' => 'checkbox-invert' ),
+                       'a', array( 'href' => '#', 'class' => 'mw-checkbox-invert' ),
                        $this->msg( 'checkbox-invert' )->text()
                );
 
index 0a25180..0cefb38 100644 (file)
@@ -347,138 +347,17 @@ class SpecialMergeHistory extends SpecialPage {
                if ( $targetTitle->getArticleID() == $destTitle->getArticleID() ) {
                        return false;
                }
-               # Verify that this timestamp is valid
-               # Must be older than the destination page
-               $dbw = wfGetDB( DB_MASTER );
-               # Get timestamp into DB format
-               $this->mTimestamp = $this->mTimestamp ? $dbw->timestamp( $this->mTimestamp ) : '';
-               # Max timestamp should be min of destination page
-               $maxtimestamp = $dbw->selectField(
-                       'revision',
-                       'MIN(rev_timestamp)',
-                       array( 'rev_page' => $this->mDestID ),
-                       __METHOD__
-               );
-               # Destination page must exist with revisions
-               if ( !$maxtimestamp ) {
-                       $this->getOutput()->addWikiMsg( 'mergehistory-fail' );
 
-                       return false;
-               }
-               # Get the latest timestamp of the source
-               $lasttimestamp = $dbw->selectField(
-                       array( 'page', 'revision' ),
-                       'rev_timestamp',
-                       array( 'page_id' => $this->mTargetID, 'page_latest = rev_id' ),
-                       __METHOD__
-               );
-               # $this->mTimestamp must be older than $maxtimestamp
-               if ( $this->mTimestamp >= $maxtimestamp ) {
-                       $this->getOutput()->addWikiMsg( 'mergehistory-fail' );
+               // MergeHistory object
+               $mh = new MergeHistory( $targetTitle, $destTitle, $this->mTimestamp );
 
+               // Merge!
+               $mergeStatus = $mh->merge( $this->getUser(), $this->mComment );
+               if ( !$mergeStatus->isOK() ) {
+                       // Failed merge
+                       $this->getOutput()->addWikiMsg( $mergeStatus->getMessage() );
                        return false;
                }
-               # Get the timestamp pivot condition
-               if ( $this->mTimestamp ) {
-                       $timewhere = "rev_timestamp <= {$this->mTimestamp}";
-                       $timestampLimit = wfTimestamp( TS_MW, $this->mTimestamp );
-               } else {
-                       $timewhere = "rev_timestamp <= {$maxtimestamp}";
-                       $timestampLimit = wfTimestamp( TS_MW, $lasttimestamp );
-               }
-               # Check that there are not too many revisions to move
-               $limit = 5000; // avoid too much slave lag
-               $count = $dbw->selectRowCount( 'revision', '1',
-                       array( 'rev_page' => $this->mTargetID, $timewhere ),
-                       __METHOD__,
-                       array( 'LIMIT' => $limit + 1 )
-               );
-               if ( $count > $limit ) {
-                       $this->getOutput()->addWikiMsg( 'mergehistory-fail-toobig' );
-
-                       return false;
-               }
-               # Do the moving...
-               $dbw->update(
-                       'revision',
-                       array( 'rev_page' => $this->mDestID ),
-                       array( 'rev_page' => $this->mTargetID, $timewhere ),
-                       __METHOD__
-               );
-
-               $count = $dbw->affectedRows();
-               # Make the source page a redirect if no revisions are left
-               $haveRevisions = $dbw->selectField(
-                       'revision',
-                       'rev_timestamp',
-                       array( 'rev_page' => $this->mTargetID ),
-                       __METHOD__,
-                       array( 'FOR UPDATE' )
-               );
-               if ( !$haveRevisions ) {
-                       if ( $this->mComment ) {
-                               $comment = $this->msg(
-                                       'mergehistory-comment',
-                                       $targetTitle->getPrefixedText(),
-                                       $destTitle->getPrefixedText(),
-                                       $this->mComment
-                               )->inContentLanguage()->text();
-                       } else {
-                               $comment = $this->msg(
-                                       'mergehistory-autocomment',
-                                       $targetTitle->getPrefixedText(),
-                                       $destTitle->getPrefixedText()
-                               )->inContentLanguage()->text();
-                       }
-
-                       $contentHandler = ContentHandler::getForTitle( $targetTitle );
-                       $redirectContent = $contentHandler->makeRedirectContent( $destTitle );
-
-                       if ( $redirectContent ) {
-                               $redirectPage = WikiPage::factory( $targetTitle );
-                               $redirectRevision = new Revision( array(
-                                       'title' => $targetTitle,
-                                       'page' => $this->mTargetID,
-                                       'comment' => $comment,
-                                       'content' => $redirectContent ) );
-                               $redirectRevision->insertOn( $dbw );
-                               $redirectPage->updateRevisionOn( $dbw, $redirectRevision );
-
-                               # Now, we record the link from the redirect to the new title.
-                               # It should have no other outgoing links...
-                               $dbw->delete( 'pagelinks', array( 'pl_from' => $this->mDestID ), __METHOD__ );
-                               $dbw->insert( 'pagelinks',
-                                       array(
-                                               'pl_from' => $this->mDestID,
-                                               'pl_from_namespace' => $destTitle->getNamespace(),
-                                               'pl_namespace' => $destTitle->getNamespace(),
-                                               'pl_title' => $destTitle->getDBkey() ),
-                                       __METHOD__
-                               );
-                       } else {
-                               // would be nice to show a warning if we couldn't create a redirect
-                       }
-               } else {
-                       $targetTitle->invalidateCache(); // update histories
-               }
-               $destTitle->invalidateCache(); // update histories
-               # Check if this did anything
-               if ( !$count ) {
-                       $this->getOutput()->addWikiMsg( 'mergehistory-fail' );
-
-                       return false;
-               }
-               # Update our logs
-               $logEntry = new ManualLogEntry( 'merge', 'merge' );
-               $logEntry->setPerformer( $this->getUser() );
-               $logEntry->setComment( $this->mComment );
-               $logEntry->setTarget( $targetTitle );
-               $logEntry->setParameters( array(
-                       '4::dest' => $destTitle->getPrefixedText(),
-                       '5::mergepoint' => $timestampLimit
-               ) );
-               $logId = $logEntry->insert();
-               $logEntry->publish( $logId );
 
                $targetLink = Linker::link(
                        $targetTitle,
@@ -490,11 +369,9 @@ class SpecialMergeHistory extends SpecialPage {
                $this->getOutput()->addWikiMsg( $this->msg( 'mergehistory-done' )
                        ->rawParams( $targetLink )
                        ->params( $destTitle->getPrefixedText() )
-                       ->numParams( $count )
+                       ->numParams( $mh->getMergedRevisionCount() )
                );
 
-               Hooks::run( 'ArticleMergeComplete', array( $targetTitle, $destTitle ) );
-
                return true;
        }
 
index 078f032..5e08e51 100644 (file)
@@ -675,13 +675,14 @@ class PageArchive {
  * @ingroup SpecialPage
  */
 class SpecialUndelete extends SpecialPage {
-       private $mAction;
+       private $mAction;
        private $mTarget;
        private $mTimestamp;
        private $mRestore;
+       private $mRevdel;
        private $mInvert;
        private $mFilename;
-       private $mTargetTimestamp;
+       private $mTargetTimestamp;
        private $mAllowed;
        private $mCanView;
        private $mComment;
@@ -719,6 +720,7 @@ class SpecialUndelete extends SpecialPage {
                $posted = $request->wasPosted() &&
                        $user->matchEditToken( $request->getVal( 'wpEditToken' ) );
                $this->mRestore = $request->getCheck( 'restore' ) && $posted;
+               $this->mRevdel = $request->getCheck( 'revdel' ) && $posted;
                $this->mInvert = $request->getCheck( 'invert' ) && $posted;
                $this->mPreview = $request->getCheck( 'preview' ) && $posted;
                $this->mDiff = $request->getCheck( 'diff' );
@@ -831,13 +833,42 @@ class SpecialUndelete extends SpecialPage {
                        } else {
                                $this->showFile( $this->mFilename );
                        }
-               } elseif ( $this->mRestore && $this->mAction == 'submit' ) {
-                       $this->undelete();
+               } elseif ( $this->mAction === "submit" ) {
+                       if ( $this->mRestore ) {
+                               $this->undelete();
+                       } elseif ( $this->mRevdel ) {
+                               $this->redirectToRevDel();
+                       }
+
                } else {
                        $this->showHistory();
                }
        }
 
+       /**
+        * Convert submitted form data to format expected by RevisionDelete and
+        * redirect the request
+        */
+       private function redirectToRevDel() {
+               $archive = new PageArchive( $this->mTargetObj );
+
+               $revisions = array();
+
+               foreach ( $this->getRequest()->getValues() as $key => $val ) {
+                       $matches = array();
+                       if ( preg_match( "/^ts(\d{14})$/", $key, $matches ) ) {
+                               $revisions[ $archive->getRevision( $matches[1] )->getId() ] = 1;
+                       }
+               }
+               $query = array(
+                       "type" => "revision",
+                       "ids" => $revisions,
+                       "target" => wfUrlencode( $this->mTargetObj->getPrefixedText() )
+               );
+               $url = SpecialPage::getTitleFor( "RevisionDelete" )->getFullURL( $query );
+               $this->getOutput()->redirect( $url );
+       }
+
        function showSearchForm() {
                $out = $this->getOutput();
                $out->setPageTitle( $this->msg( 'undelete-search-title' ) );
@@ -1356,7 +1387,20 @@ class SpecialUndelete extends SpecialPage {
                $out->addHTML( Xml::element( 'h2', null, $this->msg( 'history' )->text() ) . "\n" );
 
                if ( $haveRevisions ) {
-                       # The page's stored (deleted) history:
+                       # Show the page's stored (deleted) history
+
+                       if ( $this->getUser()->isAllowed( 'deleterevision' ) ) {
+                               $out->addHTML( Html::element(
+                                       'button',
+                                       array(
+                                               'name' => 'revdel',
+                                               'type' => 'submit',
+                                               'class' => 'deleterevision-log-submit mw-log-deleterevision-button'
+                                       ),
+                                       $this->msg( 'showhideselectedversions' )->text()
+                               ) . "\n" );
+                       }
+
                        $out->addHTML( '<ul>' );
                        $remaining = $revisions->numRows();
                        $earliestLiveTime = $this->mTargetObj->getEarliestRevTime();
@@ -1466,13 +1510,9 @@ class SpecialUndelete extends SpecialPage {
                        $attribs['class'] = implode( ' ', $classes );
                }
 
-               // Revision delete links
-               $revdlink = Linker::getRevDeleteLink( $user, $rev, $this->mTargetObj );
-
-               $revisionRow = $this->msg( 'undelete-revision-row' )
+               $revisionRow = $this->msg( 'undelete-revision-row2' )
                        ->rawParams(
                                $checkBox,
-                               $revdlink,
                                $last,
                                $pageLink,
                                $userLink,
index a628902..17442be 100644 (file)
@@ -126,7 +126,7 @@ class SpecialVersion extends SpecialPage {
                                break;
 
                        default:
-                               $out->addModules( 'mediawiki.special.version' );
+                               $out->addModuleStyles( 'mediawiki.special.version' );
                                $out->addWikiText(
                                        $this->getMediaWikiCredits() .
                                        $this->softwareInformation() .
index cc5c150..03e555f 100644 (file)
@@ -32,6 +32,10 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                parent::__construct( $page, $restriction );
        }
 
+       public function doesWrites() {
+               return true;
+       }
+
        /**
         * Main execution point
         *
index 6f713f1..fca7775 100644 (file)
@@ -18,9 +18,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-use MediaWiki\Session\BotPasswordSessionProvider;
-use MediaWiki\Session\SessionInfo;
-
 /**
  * Utility class for bot passwords
  * @since 1.27
index 01afd97..749ec46 100644 (file)
@@ -45,6 +45,11 @@ class User implements IDBAccessObject {
         */
        const TOKEN_LENGTH = 32;
 
+       /**
+        * @const string An invalid value for user_token
+        */
+       const INVALID_TOKEN = '*** INVALID ***';
+
        /**
         * Global constant made accessible as class constants so that autoloader
         * magic can be used.
@@ -310,7 +315,14 @@ class User implements IDBAccessObject {
        }
 
        /**
-        * Test if it's safe to load this User object
+        * Test if it's safe to load this User object. You should typically check this before using
+        * $wgUser or RequestContext::getUser in a method that might be called before the system has
+        * been fully initialized. If the object is unsafe, you should use an anonymous user:
+        * \code
+        * $user = $wgUser->isSafeToLoad() ? $wgUser : new User;
+        * \endcode
+        *
+        * @since 1.27
         * @return bool
         */
        public function isSafeToLoad() {
@@ -650,7 +662,8 @@ class User implements IDBAccessObject {
                $user = self::newFromRow( $row );
 
                // A user is considered to exist as a non-system user if it has a
-               // password set, or a temporary password set, or an email set.
+               // password set, or a temporary password set, or an email set, or a
+               // non-invalid token.
                $passwordFactory = new PasswordFactory();
                $passwordFactory->init( RequestContext::getMain()->getConfig() );
                try {
@@ -666,7 +679,7 @@ class User implements IDBAccessObject {
                        $newpassword = PasswordFactory::newInvalidPassword();
                }
                if ( !$password instanceof InvalidPassword || !$newpassword instanceof InvalidPassword
-                       || $user->mEmail
+                       || $user->mEmail || $user->mToken !== self::INVALID_TOKEN
                ) {
                        // User exists. Steal it?
                        if ( !$options['steal'] ) {
@@ -686,11 +699,11 @@ class User implements IDBAccessObject {
                                __METHOD__
                        );
                        $user->invalidateEmail();
+                       $user->mToken = self::INVALID_TOKEN;
                        $user->saveSettings();
+                       SessionManager::singleton()->preventSessionsForUser( $user->getName() );
                }
 
-               SessionManager::singleton()->preventSessionsForUser( $user->getName() );
-
                return $user;
        }
 
@@ -2482,13 +2495,18 @@ class User implements IDBAccessObject {
                        $this->setToken();
                }
 
-               // If the user doesn't have a token, return null to indicate that.
-               // Otherwise, hmac the version with the secret if we have a version.
                if ( !$this->mToken ) {
+                       // The user doesn't have a token, return null to indicate that.
                        return null;
+               } elseif ( $this->mToken === self::INVALID_TOKEN ) {
+                       // We return a random value here so existing token checks are very
+                       // likely to fail.
+                       return MWCryptRand::generateHex( self::TOKEN_LENGTH );
                } elseif ( $wgAuthenticationTokenVersion === null ) {
+                       // $wgAuthenticationTokenVersion not in use, so return the raw secret
                        return $this->mToken;
                } else {
+                       // $wgAuthenticationTokenVersion in use, so hmac it.
                        $ret = MWCryptHash::hmac( $wgAuthenticationTokenVersion, $this->mToken, false );
 
                        // The raw hash can be overly long. Shorten it up.
@@ -2509,7 +2527,10 @@ class User implements IDBAccessObject {
         */
        public function setToken( $token = false ) {
                $this->load();
-               if ( !$token ) {
+               if ( $this->mToken === self::INVALID_TOKEN ) {
+                       \MediaWiki\Logger\LoggerFactory::getInstance( 'session' )
+                               ->debug( __METHOD__ . ": Ignoring attempt to set token for system user \"$this\"" );
+               } elseif ( !$token ) {
                        $this->mToken = MWCryptRand::generateHex( self::TOKEN_LENGTH );
                } else {
                        $this->mToken = $token;
@@ -3464,22 +3485,21 @@ class User implements IDBAccessObject {
                                return;
                        }
 
-                       $that = $this;
                        // Try to update the DB post-send and only if needed...
-                       DeferredUpdates::addCallableUpdate( function() use ( $that, $title, $oldid ) {
-                               if ( !$that->getNewtalk() ) {
+                       DeferredUpdates::addCallableUpdate( function() use ( $title, $oldid ) {
+                               if ( !$this->getNewtalk() ) {
                                        return; // no notifications to clear
                                }
 
                                // Delete the last notifications (they stack up)
-                               $that->setNewtalk( false );
+                               $this->setNewtalk( false );
 
                                // If there is a new, unseen, revision, use its timestamp
                                $nextid = $oldid
                                        ? $title->getNextRevisionID( $oldid, Title::GAID_FOR_UPDATE )
                                        : null;
                                if ( $nextid ) {
-                                       $that->setNewtalk( true, Revision::newFromId( $nextid ) );
+                                       $this->setNewtalk( true, Revision::newFromId( $nextid ) );
                                }
                        } );
                }
@@ -4850,9 +4870,8 @@ class User implements IDBAccessObject {
         * Deferred version of incEditCountImmediate()
         */
        public function incEditCount() {
-               $that = $this;
-               wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle( function() use ( $that ) {
-                       $that->incEditCountImmediate();
+               wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle( function() {
+                       $this->incEditCountImmediate();
                } );
        }
 
index 7d63156..69426d7 100644 (file)
@@ -310,6 +310,7 @@ class ClassCollector {
                case T_NAMESPACE:
                case T_CLASS:
                case T_INTERFACE:
+               case T_TRAIT:
                        $this->startToken = $token;
                }
        }
@@ -331,6 +332,7 @@ class ClassCollector {
 
                case T_CLASS:
                case T_INTERFACE:
+               case T_TRAIT:
                        $this->tokens[] = $token;
                        if ( is_array( $token ) && $token[0] === T_STRING ) {
                                $this->classes[] = $this->namespace . $this->implodeTokens();
index 10606c1..c5112ff 100644 (file)
@@ -250,14 +250,7 @@ class MWCryptRand {
                }
 
                if ( strlen( $buffer ) < $bytes ) {
-                       // If available make use of openssl's random_pseudo_bytes method to
-                       // attempt to generate randomness. However don't do this on Windows
-                       // with PHP < 5.3.4 due to a bug:
-                       // http://stackoverflow.com/questions/1940168/openssl-random-pseudo-bytes-is-slow-php
-                       // http://git.php.net/?p=php-src.git;a=commitdiff;h=cd62a70863c261b07f6dadedad9464f7e213cad5
-                       if ( function_exists( 'openssl_random_pseudo_bytes' )
-                               && ( !wfIsWindows() || version_compare( PHP_VERSION, '5.3.4', '>=' ) )
-                       ) {
+                       if ( function_exists( 'openssl_random_pseudo_bytes' ) ) {
                                $rem = $bytes - strlen( $buffer );
                                $openssl_bytes = openssl_random_pseudo_bytes( $rem, $openssl_strong );
                                if ( $openssl_bytes === false ) {
index 1b6e9d6..b953405 100644 (file)
@@ -114,4 +114,7 @@ class FakeConverter {
        function translate( $text, $variant ) {
                return $text;
        }
+
+       public function updateConversionTable( Title $title ) {
+       }
 }
index 42c5a57..c094215 100644 (file)
@@ -4231,6 +4231,16 @@ class Language {
                return $this->mConverter->getParsedTitle();
        }
 
+       /**
+        * Refresh the cache of conversion tables when
+        * MediaWiki:Conversiontable* is updated.
+        *
+        * @param Title $titleobj The Title of the page being updated
+        */
+       public function updateConversionTable( Title $title ) {
+               $this->mConverter->updateConversionTable( $title );
+       }
+
        /**
         * Prepare external link text for conversion. When the text is
         * a URL, it shouldn't be converted, and it'll be wrapped in
index b00aa34..4eeba64 100644 (file)
@@ -1053,24 +1053,12 @@ class LanguageConverter {
        }
 
        /**
-        * Hook to refresh the cache of conversion tables when
+        * Refresh the cache of conversion tables when
         * MediaWiki:Conversiontable* is updated.
-        * @private
         *
-        * @param WikiPage $page
-        * @param User $user User object for the current user
-        * @param Content $content New page content
-        * @param string $summary Edit summary of the edit
-        * @param bool $isMinor Was the edit marked as minor?
-        * @param null $isWatch Unused.
-        * @param null $section Unused.
-        * @param int $flags Bitfield
-        * @param Revision|null $revision New Revision object or null
-        * @return bool True
+        * @param Title $titleobj The Title of the page being updated
         */
-       function OnPageContentSaveComplete( $page, $user, $content, $summary, $isMinor,
-                       $isWatch, $section, $flags, $revision ) {
-               $titleobj = $page->getTitle();
+       public function updateConversionTable( Title $titleobj ) {
                if ( $titleobj->getNamespace() == NS_MEDIAWIKI ) {
                        $title = $titleobj->getDBkey();
                        $t = explode( '/', $title, 3 );
@@ -1081,7 +1069,6 @@ class LanguageConverter {
                                }
                        }
                }
-               return true;
        }
 
        /**
index 9dc3a86..7582f56 100644 (file)
@@ -78,7 +78,6 @@ class GanConverter extends LanguageConverter {
  */
 class LanguageGan extends LanguageZh {
        function __construct() {
-               global $wgHooks;
                parent::__construct();
 
                $variants = array( 'gan', 'gan-hans', 'gan-hant' );
@@ -95,8 +94,6 @@ class LanguageGan extends LanguageZh {
                        $variants, $variantfallbacks,
                        array(),
                        $ml );
-
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 
        /**
index af0431f..93cc2c8 100644 (file)
@@ -190,8 +190,6 @@ class IuConverter extends LanguageConverter {
  */
 class LanguageIu extends Language {
        function __construct() {
-               global $wgHooks;
-
                parent::__construct();
 
                $variants = array( 'iu', 'ike-cans', 'ike-latn' );
@@ -203,6 +201,5 @@ class LanguageIu extends Language {
 
                $flags = array();
                $this->mConverter = new IuConverter( $this, 'iu', $variants, $variantfallbacks, $flags );
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 }
index 0357730..bac493b 100644 (file)
@@ -392,7 +392,6 @@ class KkConverter extends LanguageConverter {
  */
 class LanguageKk extends LanguageKk_cyrl {
        function __construct() {
-               global $wgHooks;
                parent::__construct();
 
                $variants = array( 'kk', 'kk-cyrl', 'kk-latn', 'kk-arab', 'kk-kz', 'kk-tr', 'kk-cn' );
@@ -407,8 +406,6 @@ class LanguageKk extends LanguageKk_cyrl {
                );
 
                $this->mConverter = new KkConverter( $this, 'kk', $variants, $variantfallbacks );
-
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 
        /**
index c14f468..ee54b8b 100644 (file)
@@ -230,7 +230,6 @@ class KuConverter extends LanguageConverter {
 class LanguageKu extends LanguageKu_ku {
 
        function __construct() {
-               global $wgHooks;
                parent::__construct();
 
                $variants = array( 'ku', 'ku-arab', 'ku-latn' );
@@ -241,6 +240,5 @@ class LanguageKu extends LanguageKu_ku {
                );
 
                $this->mConverter = new KuConverter( $this, 'ku', $variants, $variantfallbacks );
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 }
index afd7283..2787ca3 100644 (file)
@@ -166,8 +166,6 @@ class ShiConverter extends LanguageConverter {
  */
 class LanguageShi extends Language {
        function __construct() {
-               global $wgHooks;
-
                parent::__construct();
 
                $variants = array( 'shi', 'shi-tfng', 'shi-latn' );
@@ -179,6 +177,5 @@ class LanguageShi extends Language {
 
                $flags = array();
                $this->mConverter = new ShiConverter( $this, 'shi', $variants, $variantfallbacks, $flags );
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 }
index ece50e8..1ffb321 100644 (file)
@@ -198,8 +198,6 @@ class SrConverter extends LanguageConverter {
  */
 class LanguageSr extends Language {
        function __construct() {
-               global $wgHooks;
-
                parent::__construct();
 
                $variants = array( 'sr', 'sr-ec', 'sr-el' );
@@ -214,6 +212,5 @@ class LanguageSr extends Language {
                        'W' => 'W', 'реч' => 'W', 'reč' => 'W', 'ријеч' => 'W', 'riječ' => 'W'
                );
                $this->mConverter = new SrConverter( $this, 'sr', $variants, $variantfallbacks, $flags );
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 }
index 6910d9c..d37a207 100644 (file)
@@ -132,7 +132,6 @@ class UzConverter extends LanguageConverter {
  */
 class LanguageUz extends Language {
        function __construct() {
-               global $wgHooks;
                parent::__construct();
 
                $variants = array( 'uz', 'uz-latn', 'uz-cyrl' );
@@ -143,6 +142,5 @@ class LanguageUz extends Language {
                );
 
                $this->mConverter = new UzConverter( $this, 'uz', $variants, $variantfallbacks );
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 }
index 51b09f6..36345c9 100644 (file)
@@ -111,8 +111,6 @@ class ZhConverter extends LanguageConverter {
  */
 class LanguageZh extends LanguageZh_hans {
        function __construct() {
-               global $wgHooks;
-
                parent::__construct();
 
                $variants = array(
@@ -148,8 +146,6 @@ class LanguageZh extends LanguageZh_hans {
                                                                $variants, $variantfallbacks,
                                                                array(),
                                                                $ml );
-
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 
        /**
index 7711d8f..c2d3ee1 100644 (file)
@@ -170,9 +170,9 @@ class Names {
                'gl' => 'galego',               # Galician
                'glk' => 'گیلکی',  # Gilaki
                'gn' => 'Avañe\'ẽ',  # Guaraní, Paraguayan
-               'gom' => 'à¤\97à¥\8bवा à¤\95à¥\8bà¤\82à¤\95णà¥\80 / Gova Konknni',      # Goan Konkani
-               'gom-deva' => 'à¤\97à¥\8bवा à¤\95à¥\8bà¤\82à¤\95णà¥\80',        # Goan Konkani (Devanagari script)
-               'gom-latn' => 'Gova Konknni',   # Goan Konkani (Latin script)
+               'gom' => 'à¤\97à¥\8bà¤\82यà¤\9aà¥\80 à¤\95à¥\8bà¤\82à¤\95णà¥\80 / Gõychi Konknni',     # Goan Konkani
+               'gom-deva' => 'à¤\97à¥\8bà¤\82यà¤\9aà¥\80 à¤\95à¥\8bà¤\82à¤\95णà¥\80',  # Goan Konkani (Devanagari script)
+               'gom-latn' => 'Gõychi Konknni',        # Goan Konkani (Latin script)
                'got' => '𐌲𐌿𐍄𐌹𐍃𐌺',    # Gothic
                'grc' => 'Ἀρχαία ἑλληνικὴ', # Ancient Greek
                'gsw' => 'Alemannisch', # Alemannic
@@ -260,6 +260,7 @@ class Names {
                'li' => 'Limburgs',     # Limburgian
                'lij' => 'Ligure',      # Ligurian
                'liv' => 'Līvõ kēļ',        # Livonian
+               'lki' => 'لەکی‎', # Laki
                'lmo' => 'lumbaart',    # Lombard
                'ln' => 'lingála',             # Lingala
                'lo' => 'ລາວ',    # Laotian
index 0b35f9b..bcedf4a 100644 (file)
        "apisandbox-reset": "إفراغ",
        "apisandbox-retry": "أعد المحاولة",
        "apisandbox-examples": "أمثلة",
-       "apisandbox-results": "النتيجة",
+       "apisandbox-results": "النتائج",
        "apisandbox-request-url-label": "مسار الطلب:",
        "apisandbox-request-time": "وقت الطلب: $1",
        "booksources": "مصادر كتاب",
index 0892cfc..5da6f7a 100644 (file)
        "sig_tip": "سیزین ایمضانیز واخت ایله",
        "hr_tip": "دوزئی خط (آز ایشلدین)",
        "summary": "قیساسی:",
-       "subject": "Ù\82Ù\88Ù\86Ù\88:",
+       "subject": "Ù\85Ù\88ضÙ\88ع:",
        "minoredit": "بو بیر کیچیک دَییشدیرمه‌دیر",
        "watchthis": "بو صفحه‌نی ایزله",
-       "savearticle": "صÙ\81Ø­Ù\87â\80\8cÙ\86Û\8c Ø³Ø§Ø®Ù\84ا",
+       "savearticle": "صÙ\81Ø­Ù\87â\80\8cÙ\86Û\8c Ø°Ø®Û\8cرÙ\87 Ø§Ø¦Øª",
        "preview": "اؤن‌گؤستریش",
        "showpreview": "سیناق گؤستریش",
        "showdiff": "دَییشیکلیکلری گؤستر",
        "double-redirect-fixed-move": "[[$1]] آپاریلمیش‌دیر.\nاوْتوماتیک اوْلاراق گۆنجل‌له‌نیبدیر و ایندی [[$2]]-ه یوْل‌لاندیریر.",
        "double-redirect-fixed-maintenance": "[[$1]]-دن [[$2]]-ه ایکی‌قات یوْل‌لاندیرما، بیر ساخلاما ایشین‌ده، اوْتوماتیک اوْلاراق دۆزلدیلیر.",
        "double-redirect-fixer": "يؤنلندیرمه تعمیرجیسی",
-       "brokenredirects": "خطالی ایستیقامتلندیرمه",
+       "brokenredirects": "خطالی یوْللاندیرمالار",
        "brokenredirectstext": "آشاغی‌داکی ایستیقامتلندیرمه‌لر مؤوجود اولمایان صحیفه‌لره کئچید وئریر:",
        "brokenredirects-edit": "دَییشدیر",
        "brokenredirects-delete": "سیل",
        "specialpage-empty": "بو صحیفه بوشدور",
        "lonelypages": "يئتیم صحیفه‌‌لر",
        "lonelypagestext": "آشاغی‌داکی صحیفه‌لره {{SITENAME}} سایتین‌داکی دیگر صحیفه‌لردن علاقه وئریلممیش یا دا چارپاز داخیل ائدیلممیش.",
-       "uncategorizedpages": "بؤلمه‌سیز صحیفه‌لر",
+       "uncategorizedpages": "بؤلمه‌سیز صفحه‌لر",
        "uncategorizedcategories": "بؤلمه‌سیز بؤلمه‌لر",
-       "uncategorizedimages": "بؤلمه‌سیز شکیل‌لر",
+       "uncategorizedimages": "بؤلمه‌سیز فایللار",
        "uncategorizedtemplates": "بؤلمه‌سیز شابلونلار",
        "unusedcategories": "ایستیفاده ائدیلمه‌میش بؤلمه‌لر",
        "unusedimages": "ایشلنمه‌میش فایل‌لار",
        "email-legend": "باشقا {{SITENAME}} ایستیفاده‌چیسینه ایمیل گؤندر",
        "emailfrom": "کیم‌دن:",
        "emailto": "کیمه:",
-       "emailsubject": "Ù\82Ù\88Ù\86Ù\88:",
+       "emailsubject": "Ù\85Ù\88ضÙ\88ع:",
        "emailmessage": "مئساژ",
        "emailsend": "گؤندر",
        "emailccme": "مئساژیمین بیر کوپیسینی ده منه ایمیل ائت.",
        "deleting-backlinks-warning": "'''اخطار:''' بو سیلمگه قصدینیز اولان صفحه‌یه، [[Special:WhatLinksHere/{{FULLPAGENAME}}|باشقا صفحه‌لر]] باغلانتی وئریب یا اونو اؤزلرین‌ده ایشلدیب‌لر.",
        "rollback": "اوولکی نوسخه لر",
        "rollbacklink": "قایتار",
-       "rollbacklinkcount": "گیتیرلمه $1  {{PLURAL:$1|دییشمک |دییشمک}} دییشدیرمه",
+       "rollbacklinkcount": "$1 دییشدیرمه‌نی قایتار",
        "rollbacklinkcount-morethan": "گیتیرلمه آرتیق $1 {{PLURAL:$1|دییشمک |دییشمک}} دییشدیرمه",
        "rollbackfailed": "گئری قایتارما اوغورسوزدور",
        "cantrollback": "دییشدیر گئری قایتاریلا بیلمز؛ آخیرینجی دییشدیر صحیفه‌ده اولان یئگانه فالیت‌دیر.",
        "protect-level-autoconfirmed": "تکجه اوْتوماتیک تأیید اوْلموش ایشلدن‌لره ایجازه وئر",
        "protect-level-sysop": "یالنیز ایداره‌چیلره ایجازه وئر",
        "protect-summary-cascade": "پیلله‌لی",
-       "protect-expiring": "$1 (UTC)- تاریخینده واختی بیتیر",
-       "protect-expiring-local": "$1-ده بیتیر",
+       "protect-expiring": "$1 (UTC)- تاریخینده وقتی قۇرتولور",
+       "protect-expiring-local": "$1-ده قۇرتولور",
        "protect-expiry-indefinite": "سوْن‌سۇز",
        "protect-cascade": "بو صحیفه‌ده ایستیفاده ائدیلن بوتون صحیفه‌لری قوروماغا آل (پیلله‌لی قوروماق)",
        "protect-cantedit": "بو صحیفه‌نین محافظه درجه‌سینی دییش‌دیره بیلمزسینیز، چونکی بو دییشیک‌لیک اوچون حقوقونوز یوخ‌دور.",
        "reblock-logentry": "[[$1]] اوچون سون تاریخی $2 $3 اولماق اوزره بلوک پارامئترلری دییشدیریلدی",
        "blocklogtext": "ایستیفاده‌چی‌لرین باغلانماسی و باغلانماقین گؤتورولمه‌سی سیاهی‌سی.\nآوتوماتیک باغلانمیش ای پی-عنوان‌لار بورادا گؤستریلمیر.\nحال-هازیرکی [[Special:BlockList|قاداغا‌لارین و بلوکلاما‌لارین سیاهی‌سی]]نا باخ.",
        "unblocklogentry": "$1 اوزرین‌دکی آچیلدی",
-       "block-log-flags-anononly": "يالنیز قئيدیاتسیز ایستیفاده‌چیلر",
+       "block-log-flags-anononly": "\nتکجه تایید اوْلونمامیش ایشلدنلر",
        "block-log-flags-nocreate": "حساب یاراتماق اولماز",
        "block-log-flags-noautoblock": "آوتوبلوکلاما غيری مومکوندور",
        "block-log-flags-noemail": "ائ-مایل بلوکلانیب",
        "import-rootpage-invalid": "وئریلن کؤک صحیفه‌‌سی اعتبارسیز آددیر.",
        "import-rootpage-nosubpage": "آد فضا سی  \"$1\" آنا باسئ ٔآلت صحیفه اوچون اجازه وئرمیر.",
        "importlogpage": "چیخاریلما گونده‌لیگی",
-       "importlogpagetext": "باشÙ\82ا Ù\88Û\8cÚ©Û\8cÙ\84ردÙ\86Ø\8c Ø¯Ù\8eÛ\8cÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ© Ú¯Ø¦Ú\86Ù\85Û\8cØ´Ù\84رÛ\8cÙ\84Ù\87 Ø¨Û\8cرÙ\84Û\8cÚ©â\80\8cدÙ\87 Ú¯ØªÛ\8cرÛ\8cÙ\84Ù\85Û\8cØ´ ØµØ­Û\8cÙ\81ه‌لر.",
+       "importlogpagetext": "Ø¢Û\8cرÛ\8c Ù\88Û\8cÚ©Û\8cÙ\84ردÙ\86Ø\8c Ø¯Ù\8eÛ\8cÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ© Ú¯Ø¦Ú\86Ù\85Û\8cØ´Ù\84رÛ\8cÙ\84Ù\87 Ø¨Û\8cرÙ\84Û\8cÚ©â\80\8cدÙ\87 Ú¯ØªÛ\8cرÛ\8cÙ\84Ù\85Û\8cØ´ ØµÙ\81Ø­ه‌لر.",
        "import-logentry-upload-detail": "{{PLURAL:$1|بیر|$1}} نوسخه ایچری گتیریلدی",
        "import-logentry-interwiki-detail": "$2-دن {{PLURAL:$1|بیر|$1}} نوسخه ایچری گتیریلدی",
        "javascripttest": "جاوااسکریپت تِستی",
        "logentry-delete-delete": "$1، $3 صفحه‌سینی {{GENDER:$2|سیلدی}}",
        "logentry-delete-restore": "$1، $3 صفحه‌سینی {{GENDER:$2|قایتاردی}}",
        "logentry-delete-event": "$1، $3-ده $5 سیاهی اولایینین {{PLURAL:$5|گؤرونوشونو|گؤرونوشلرینی}} {{GENDER:$2|دَییشدیردی}}: $4",
-       "logentry-delete-revision": "$1، $3 صحیفه‌سینده $5 نوسخه‌نین {{PLURAL:گؤرونوشونو|گؤرونوشلرینی}} {{GENDER:$2|دَییشدیردی}}: $4",
+       "logentry-delete-revision": "$1، $3 صفحه‌سینده $5 نوسخه‌نین {{PLURAL:گؤرونوشونو|گؤرونوشلرینی}} {{GENDER:$2|دَییشدیردی}}: $4",
        "logentry-delete-event-legacy": "$1، $3-ده سیاهی اولایلارینین گؤرونوشلرینی {{GENDER:$2|دَییشدیردی}}",
        "logentry-delete-revision-legacy": "$1، $3 صحیفه‌سینده نوسخه‌لرین گؤرونوشلرینی {{GENDER:$2|دَییشدیردی}}",
        "logentry-suppress-delete": "$1، $3 صفحه‌سینی {{GENDER:$2|یاتیردی}}",
        "logentry-suppress-event": "$1، $3-ده $5 سیاهی اولایینین {{PLURAL:$5|گؤرونوشونو|گؤرونوشلرینی}} گیزلینجه {{GENDER:$2|دَییشدیردی}}: $4",
-       "logentry-suppress-revision": "$1، $3 صحیفه‌سینده $5 نوسخه‌نین {{PLURAL:گؤرونوشونو|گؤرونوشلرینی}} گیزلینجه {{GENDER:$2|دَییشدیردی}}: $4",
+       "logentry-suppress-revision": "$1، $3 صفحه‌سینده $5 نوسخه‌نین {{PLURAL:گؤرونوشونو|گؤرونوشلرینی}} گیزلینجه {{GENDER:$2|دَییشدیردی}}: $4",
        "logentry-suppress-event-legacy": "$1، $3-ده سیاهی اولایلارینین گؤرونوشلرینی گیزلینجه {{GENDER:$2|دَییشدیردی}}",
        "logentry-suppress-revision-legacy": "$1، $3 صحیفه‌سینده نوسخه‌لرین گؤرونوشلرینی گیزلینجه {{GENDER:$2|دَییشدیردی}}",
        "revdelete-content-hid": "ایچینده‌کیلر گیزلی‌دیر",
        "revdelete-uname-unhid": "ایستیفاده‌چی آدی گیزلیلیک‌دن چیخدی",
        "revdelete-restricted": "ایداره‌چیلره محدودیت قویدو",
        "revdelete-unrestricted": "ایداره‌چیلرین محدودیتلرینی گؤتوردو",
-       "logentry-block-block": "$1 {{GENDER:$4|$3}}-نی {{GENDER:$2|بلوکلادی}}. قورتارماق تاریخی: $5 $6",
+       "logentry-block-block": "$1 {{GENDER:$4|$3}}-نی {{GENDER:$2|باغلادی}}. قۇرتارماق تاریخی: $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$4|$3}}-نین {{GENDER:$2|بلوکلاماغینی قالدیردی}}",
+       "logentry-import-upload": "$1 $3-نی فایل یوکله‌مه یولو ایله {{GENDER:$2|ایچری گتیردی}}",
+       "logentry-import-upload-details": "$1 $3-نی فایل یوکله‌مه یولو ایله {{GENDER:$2|ایچری گتیردی}} ($4 {{PLURAL:$4|نوسخه}})",
+       "logentry-import-interwiki-details": "$1 $3-نی $5-دن {{GENDER:$2|ایچری گتیردی}} ($4 {{PLURAL:$4|نوسخه}})",
        "logentry-move-move": "$1، $3 صفحه‌سینی $4-ه {{GENDER:$2|آپاردی}}",
        "logentry-move-move-noredirect": "$1، $3 صفحه‌سینی، یوْل‌لاندیرما قوْیماماق‌لا، $4-ه {{GENDER:$2|آپاردی}}",
        "logentry-move-move_redir": "$1، $3 صفحه‌سینی، $4-ده یوْل‌لاندیرما اۆستونه {{GENDER:$2|آپاردی}}",
        "logentry-move-move_redir-noredirect": "$1، $3 صفحه‌سینی، یوْل‌لاندیرما قوْیماماق‌لا، یوْل‌لاندیرما اوْلان $4 اۆستونه {{GENDER:$2|آپاردی}}",
        "logentry-patrol-patrol": "$1، $3 صحیفه‌سینین $4 نوسخه‌سینی، نظارتلنمیش {{GENDER:$2|نیشانلادی}}",
-       "logentry-patrol-patrol-auto": "$1، $3 صحیفه‌سینین $4 نوسخه‌سینی، اوتوماتیک اولاراق نظارتلنمیش {{GENDER:$2|نیشانلادی}}",
+       "logentry-patrol-patrol-auto": "$1، $3 صفحه‌سینین $4 نوسخه‌سینی، اوْتوماتیک یوْخلانمیش {{GENDER:$2|علامتلدی}}",
        "logentry-newusers-newusers": " بیر ایستیفاده‌چی حسابی $1 {{GENDER:$2|یاراتدی}}",
        "logentry-newusers-create": "$1 ایشلدن حسابی {{GENDER:$2|یارادیلدی}}",
        "logentry-newusers-create2": "$1 ایستیفاده‌چی، $3 حسابی {{GENDER:$2|یاراتدی}}",
        "feedback-error2": "خطا: دَییشدیرمه باشاری‌سیز اولدو",
        "feedback-error3": "خطا: API-دان جاواب گلمه‌دی",
        "feedback-message": "مئساژ:",
-       "feedback-subject": "Ù\82Ù\88Ù\86Ù\88:",
+       "feedback-subject": "Ù\85Ù\88ضÙ\88ع:",
        "feedback-submit": "گؤندر",
        "feedback-thanks": "تشکورلر! سیزین گئری-بیلدیریمینیز «[$2 $1]» صحیفه‌سینه گؤندریلدی.",
        "feedback-thanks-title": "تشکورلر!",
index 4d8cfae..8bc2270 100644 (file)
        "contributions": "{{GENDER:$1|Ҡатнашыусы}} башҡарған эш",
        "contributions-title": "$1 исемле ҡатнашыусы башҡарған эш",
        "mycontris": "Башҡарған эштәр",
+       "anoncontribs": "башҡарған эштәр",
        "contribsub2": "{{GENDER:$3|$1}} башҡарған эше ($2)",
        "nocontribs": "Күрһәтелгән шарттарға яуап биргән үҙгәртеүҙәр табылманы.",
        "uctop": "(ағымдағы)",
index f560173..b4b85e3 100644 (file)
        "botpasswords-created-title": "Пароль робата створаны",
        "botpasswords-created-body": "Пароль робата «$1» быў пасьпяхова створаны.",
        "botpasswords-updated-title": "Пароль робата абноўлены",
+       "botpasswords-updated-body": "Пароль робата «$1» быў пасьпяхова абноўлены.",
+       "botpasswords-deleted-title": "Пароль робата выдалены",
+       "botpasswords-deleted-body": "Пароль робата «$1» быў выдалены.",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider недаступны.",
+       "botpasswords-invalid-name": "Пададзенае імя ўдзельніка ня ўтрымлівае падзяляльнік для паролю робата («$1»).",
        "resetpass_forbidden": "Пароль ня можа быць зьменены",
        "resetpass-no-info": "Для непасрэднага доступу да гэтай старонкі Вам неабходна ўвайсьці ў сыстэму.",
        "resetpass-submit-loggedin": "Зьмяніць пароль",
        "apihelp-no-such-module": "Модуль «$1» ня знойдзены.",
        "apisandbox": "Пясочніца API",
        "apisandbox-api-disabled": "API забаронены на гэтым сайце.",
-       "apisandbox-intro": "Выкарыстоўвайце гэтую старонку для экспэрымэнтаў з '''API вэб-сэрвісу MediaWiki'''.\nЗьвяртайцеся да [//www.mediawiki.org/wiki/API:Main_page дакумэнтацыі API] для дадатковай інфармацыі па выкарыстаньні API. Напрыклад, [//www.mediawiki.org/wiki/API#A_simple_example як атрымаць зьмест галоўнай старонкі]. Абярыце дзеяньне, каб пабачыць болей узораў.\n\nЗьвярніце ўвагу, што нягледзячы на тое, што гэта пясочніца, вашыя дзеяньні могуць унесьці зьмены ў вікі.",
+       "apisandbox-intro": "Выкарыстоўвайце гэтую старонку для экспэрымэнтаў з <strong>API вэб-сэрвісу MediaWiki</strong>.\nЗьвяртайцеся да [[mw:API:Main page|дакумэнтацыі API]] для дадатковай інфармацыі па выкарыстаньні API. Напрыклад, [//www.mediawiki.org/wiki/API#A_simple_example як атрымаць зьмест галоўнай старонкі]. Абярыце дзеяньне, каб пабачыць болей узораў.\n\nЗьвярніце ўвагу, што нягледзячы на тое, што гэта пясочніца, вашыя дзеяньні могуць унесьці зьмены ў вікі.",
        "apisandbox-submit": "Зрабіць запыт",
        "apisandbox-reset": "Ачысьціць",
        "apisandbox-examples": "Прыклады",
        "apisandbox-results": "Вынікі",
        "apisandbox-request-url-label": "URL-адрас запыту:",
-       "apisandbox-request-time": "ЧаÑ\81 Ð°Ð¿Ñ\80аÑ\86оÑ\9eкÑ\96 Ð·Ð°Ð¿Ñ\8bÑ\82Ñ\83: $1",
+       "apisandbox-request-time": "ЧаÑ\81 Ð·Ð°Ð¿Ñ\8bÑ\82Ñ\83: {{PLURAL:$1|$1 Ð¼Ñ\81}}",
        "booksources": "Крыніцы кніг",
        "booksources-search-legend": "Пошук кніг",
        "booksources-isbn": "ISBN:",
index 7104082..252074a 100644 (file)
        "laggedslavemode": "সতর্কীকরণ: পাতাটি সম্ভবত সম্প্রতি হালনাগাদকৃত নয়।",
        "readonly": "ডেটাবেজের ব্যবহার সীমাবদ্ধ",
        "enterlockreason": "তালাবদ্ধ করার কারণ কি তা বলুন, সাথে কখন তালা খুলবেন তার আনুমানিক সময় উল্লখ্য করুন",
-       "readonlytext": "নতà§\81ন à¦­à§\81à¦\95à§\8dতি à¦\8fবà¦\82 à¦\85নà§\8dযানà§\8dয à¦¸à¦®à§\8dপাদনার à¦\9cনà§\8dয à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦¬à¦°à§\8dতমানà§\87 à¦¬à¦¨à§\8dধ à¦\95রা à¦\86à¦\9bà§\87। à¦¸à¦®à§\8dভবত à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦°à¦\95à§\8dষণাবà§\87à¦\95à§\8dষণà§\87র à¦¨à¦¿à¦¯à¦¼à¦®à¦¿à¦¤ à¦\95াà¦\9c à¦\9aলà¦\9bà§\87। à¦\95িà¦\9bà§\81à¦\95à§\8dষণ à¦ªà¦°à§\87 à¦\8fà¦\9fি à¦¸à§\8dবাভাবিà¦\95 à¦\85বসà§\8dথায় à¦«à¦¿à¦°à§\87 à¦\86সবà§\87।\n\nপà§\8dরশাসà¦\95 এই ব্যাখ্যা দিয়েছেন: $1",
+       "readonlytext": "নতà§\81ন à¦­à§\81à¦\95à§\8dতি à¦\8fবà¦\82 à¦\85নà§\8dযানà§\8dয à¦¸à¦®à§\8dপাদনার à¦\9cনà§\8dয à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦¬à¦°à§\8dতমানà§\87 à¦¬à¦¨à§\8dধ à¦\95রা à¦\86à¦\9bà§\87। à¦¸à¦®à§\8dভবত à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦°à¦\95à§\8dষণাবà§\87à¦\95à§\8dষণà§\87র à¦¨à¦¿à¦¯à¦¼à¦®à¦¿à¦¤ à¦\95াà¦\9c à¦\9aলà¦\9bà§\87। à¦\95িà¦\9bà§\81à¦\95à§\8dষণ à¦ªà¦°à§\87 à¦\8fà¦\9fি à¦¸à§\8dবাভাবিà¦\95 à¦\85বসà§\8dথায় à¦«à¦¿à¦°à§\87 à¦\86সবà§\87।\n\nসিসà§\8dà¦\9fà§\87ম à¦ªà§\8dরশাসà¦\95 à¦¯à¦¿à¦¨à¦¿ à¦\8fà¦\9fি à¦¬à¦¨à§\8dধ à¦\95রà§\87à¦\9bà§\87ন à¦¤à¦¿à¦¨à¦¿ এই ব্যাখ্যা দিয়েছেন: $1",
        "missing-article": "\"$1\" $2 লেখাটি ডাটাবেসের কোন পাতায় খুজে পাওয়া যায়নি।\n\nমুছে ফেলা কোন পাতায় সংযোগ থাকার কারনেই সাধারণত এমনটি ঘটে।\n\nযদি এমনটি না হয়, তাহলে আপনি সফটওয়্যারে কোন ত্রুটি খুজে পেয়েছেন।\nদয়াকরে এ ব্যাপার সম্পর্কে ইউআরএল সহ কোন [[Special:ListUsers/sysop|প্রশাসককে]] জানান।",
        "missingarticle-rev": "(সংস্করণ#: $1)",
        "missingarticle-diff": "(পার্থক্য: $1, $2)",
        "mypreferencesprotected": "আপনার পছন্দসমূহ সম্পাদনা করতে আপনার অনুমতি নেই",
        "ns-specialprotected": "বিশেষ পাতাসমূহ সম্পাদনা করা যাবে না।",
        "titleprotected": "[[User:$1|$1]] কর্তৃক এই শিরোনামটি সৃষ্টি করা থেকে সুরক্ষিত করা হয়েছে। কারণ: \"<em>$2</em>\"।",
-       "filereadonlyerror": "\"$1\" à¦«à¦¾à¦\87লà¦\9fিà¦\95à§\87 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রা à¦¸à¦®à§\8dভব à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾ à¦\95ারন \"$2\" à¦«à¦¾à¦\87ল à¦°à¦¿à¦ªà§\8bসিà¦\9fà§\8bরি à¦°à¦¿à¦¡-à¦\85নলি-মà§\8bডà§\87 à¦\86à¦\9bà§\87।\n\nà¦\8fà¦\95à¦\9cন à¦ªà§\8dরশাসà¦\95 à¦¯à¦¿à¦¨à¦¿ à¦\8fà¦\9fাà¦\95à§\87 à¦²à¦\95ড à¦\95রà§\87à¦\9bà§\87ন à¦¤à¦¾à¦° à¦¯à§\8cà¦\95à§\8dতিà¦\95তা à¦¦à§\87à¦\93য়া à¦¹à¦²: \"$3\"",
+       "filereadonlyerror": "\"$1\" à¦«à¦¾à¦\87লà¦\9fিà¦\95à§\87 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রা à¦¸à¦®à§\8dভব à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾ à¦\95ারণ \"$2\" à¦«à¦¾à¦\87ল à¦¸à¦\82à¦\97à§\8dরহসà§\8dথল à¦¶à§\81ধà§\81মাতà§\8dর-পঠন à¦®à§\8bডà§\87 à¦\86à¦\9bà§\87।\n\nসিসà§\8dà¦\9fà§\87ম à¦ªà§\8dরশাসà¦\95 à¦¯à¦¿à¦¨à¦¿ à¦\8fà¦\9fি à¦¬à¦¨à§\8dধ à¦\95রà§\87à¦\9bà§\87ন à¦¤à¦¿à¦¨à¦¿ à¦\8fà¦\87 à¦¬à§\8dযাà¦\96à§\8dযা à¦¦à¦¿à¦¯à¦¼à§\87à¦\9bà§\87ন: \"$3\"।",
        "invalidtitle-knownnamespace": "অবৈধ শিরোনাম, যেখানে নামস্থান \"$2\" এবং লেখা হয়েছে \"$3\"",
        "invalidtitle-unknownnamespace": "অবৈধ শিরোনাম, যেখানে ব্যবহৃত হয়েছে অপরিচিত নামস্থান সংখ্যা $1 এবং লেখা হয়েছে \"$2\"",
        "exception-nologin": "লগইন করা হয়নি",
        "botpasswords-updated-title": "বট পাসওয়ার্ড আপডেট করা হয়েছে",
        "botpasswords-updated-body": "\"$1\" বট পাসওয়ার্ডটি সফলভাবে হালনাগাদ করা হয়েছে।",
        "botpasswords-deleted-title": "বট পাসওয়ার্ড অপসারণ করা হয়েছে",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider উপলব্ধ নয়।",
        "resetpass_forbidden": "পাসওয়ার্ড পরিবর্তন করা সম্ভব নয়",
        "resetpass-no-info": "এই পাতাটিতে সরাসরি প্রবেশাধিকার পেতে আপনাকে অবশ্যই লগইন করতে হবে।",
        "resetpass-submit-loggedin": "পাসওয়ার্ড পরিবর্তন",
        "passwordreset-emailtext-ip": "কেউ একজন (সম্ভবত আপনি, $1 আইপি ঠিকানা থেকে) {{SITENAME}} ($4) সাইটের জন্য আপনার\nপাসওয়ার্ড বদলের জন্য অনুরোধ করেছে। নিচের ব্যবহারকারী {{PLURAL:$3|অ্যাকাউন্টটি|অ্যাকাউন্টগুলো}}\nএই ই-মেইল ঠিকানার সাথে সংযুক্ত:\n\n$2\n\n{{PLURAL:$3|এই অস্থায়ী পাসওয়ার্ডটি|এই অস্থায়ী পাসওয়ার্ডগুলো}} আগামী {{PLURAL:$5|এক দিন|$5 দিন}} পর মেয়াদোত্তীর্ণ হয়ে যাবে।\nআপনার অবশ্যই লগ-ইন করে একটি নতুন পাসওয়ার্ড পছন্দ করা উচিত। যদি অন্য কেউ এই অনুরোধ করে থাকে,\nঅথবা আপনি যদি পুরোনো পাসওয়ার্ড মনে করতে পারেন, এবং আপনার সেটি পরিবর্তন করার কোনো ইচ্ছা না থাকে, তবে\nআপনি এই বার্তাটি উপেক্ষা করতে পারে, এবং আপনার পুরোনো পাসওয়ার্ড ব্যবহার করা চালিয়ে যেতে পারেন।",
        "passwordreset-emailtext-user": "ব্যবহারকারী $1 {{SITENAME}} ($4) সাইটের জন্য আপনার পাসওয়ার্ড বদলের জন্য অনুরোধ করেছে। নিচের ব্যবহারকারী {{PLURAL:$3|অ্যাকাউন্টটি|অ্যাকাউন্টগুলো}}\nএই ই-মেইল ঠিকানার সাথে সংযুক্ত:\n\n$2\n\n{{PLURAL:$3|এই অস্থায়ী পাসওয়ার্ডটি|এই অস্থায়ী পাসওয়ার্ডগুলো}} আগামী {{PLURAL:$5|এক দিন|$5 দিন}} পর মেয়াদোত্তীর্ণ হয়ে যাবে।\nআপনার অবশ্যই লগ-ইন করে একটি নতুন পাসওয়ার্ড পছন্দ করা উচিত। যদি অন্য কেউ এই অনুরোধ করে থাকে,\nঅথবা আপনি যদি পুরোনো পাসওয়ার্ড মনে করতে পারেন, এবং আপনার সেটি পরিবর্তন করার কোনো ইচ্ছা না থাকে, তবে\nআপনি এই বার্তাটি উপেক্ষা করতে পারে, এবং আপনার পুরোনো পাসওয়ার্ড ব্যবহার করা চালিয়ে যেতে পারেন।",
        "passwordreset-emailelement": "ব্যবহারকারী নাম: \n$1\n\nঅস্থায়ী পাসওয়ার্ড: \n$2",
-       "passwordreset-emailsentemail": "যদি à¦\86পনার à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87র à¦\9cনà§\8dয à¦\8fà¦\9fি à¦\8fà¦\95à¦\9fি à¦¨à¦¿à¦¬à¦¨à§\8dধিত à¦\87মà§\87ল à¦ à¦¿à¦\95ানা à¦¹à¦¯à¦¼, তাহলে একটি পাসওয়ার্ড বদলের ইমেইল পাঠানো হবে।",
+       "passwordreset-emailsentemail": "যদি à¦\8fà¦\87 à¦\87-মà§\87à¦\87ল à¦ à¦¿à¦\95ানা à¦\86পনার à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87র à¦¸à¦¾à¦¥à§\87 à¦¸à¦\82যà§\81à¦\95à§\8dত à¦\95রা à¦¥à¦¾à¦\95à§\87, তাহলে একটি পাসওয়ার্ড বদলের ইমেইল পাঠানো হবে।",
        "passwordreset-emailsent-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল করা হয়েছে, যা নিচে দেখানো হচ্ছে।",
        "passwordreset-emailerror-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 {{GENDER:$2|ব্যবহারকারীকে}} এটি পাঠানো যায়নি!",
        "changeemail": "ই-মেইল ঠিকানা পরিবর্তন বা বাতিল",
        "copyrightwarning2": "অনুগ্রহ করে লক্ষ করুন: {{SITENAME}}-এর এই ভুক্তিতে আপনার লেখা বা অবদান অন্যান্য ব্যবহারকারীরা পরিবর্তন বা পরিবর্ধন করতে, এমনকি মুছে ফেলতে পারবেন। {{SITENAME}} এ আপনার সকল লেখালেখি/অবদান গনু ফ্রি ডকুমেন্টেশনের ($1) আওতায় বিনামূল্যে প্রাপ্য ও হস্তান্তরযোগ্য। আপনার জমা দেয়া লেখা যে কেউ হৃদয়হীনভাবে সম্পাদনা করতে এবং যথেচ্ছভাবে ব্যবহার করতে পারেন। আপনি যদি এ ব্যাপারে একমত না হন, তাহলে এখানে আপনার লেখা জমা দেবেন না। আপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন (তবে কোন মৌলিক গবেষণা নয়) বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন। '''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না।'''",
        "editpage-cannot-use-custom-model": "এই পাতার বিষয়বস্তুর মডেল পরিবর্তন করা যাবে না।",
        "longpageerror": "'''ত্রুটি:  আপনার জমা দেয়া টেক্সটের পরিমাণ {{PLURAL:$1|এক কিলোবাইট|$1 কিলোবাইট}}, যা সর্বোচ্চ সীমা {{PLURAL:$2|এক কিলোবাইটের|$2 কিলোবাইটের}} চেয়ে বেশি।'''\nএটি সংরক্ষণ করা সম্ভব নয়।",
-       "readonlywarning": "'''সতর্কীকরণ: রক্ষণাবেক্ষণের জন্য ডাটাবেজ অবরুদ্ধ রাখা হয়েছে, তাই এই মুহূর্তে আপনার সম্পাদনা সংরক্ষণ করতে পারবেন না।'''\nআপনি চাইলে লেখাটি কাট এবং পেষ্ট করে ভবিষ্যতের জন্য কোন টেক্সট ফাইলে সংরক্ষণ করতে পারেন।\n\nযে প্রশাসক এই ডাটাবেজটি অবরুদ্ধ করেছেন তিনি যা ব্যাখ্যা দিয়েছেন: $1",
+       "readonlywarning": "<strong>সতর্কীকরণ: রক্ষণাবেক্ষণের জন্য ডাটাবেজ অবরুদ্ধ রাখা হয়েছে, তাই এই মুহূর্তে আপনি আপনার সম্পাদনা সংরক্ষণ করতে পারবেন না।</strong>\nআপনি চাইলে লেখাটি অনুলিপি করে ও কোন টেক্সট ফাইলে প্রতিলেপন করার দ্বারা ভবিষ্যতের জন্য সংরক্ষণ করতে পারেন।\n\nসিস্টেম প্রশাসক যিনি এটি বন্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: $1",
        "protectedpagewarning": "'''সতর্কীকরণ: এই পাতাটি বন্ধ করা হয়েছে; কেবলমাত্র প্রশাসক মর্যাদার ব্যবহারকারীরাই এটি সম্পাদনা করতে পারবেন।'''\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
        "semiprotectedpagewarning": "'''নোট:''' এই পাতাটির ব্যবহার নিয়ন্ত্রণ করা হয়েছে তাই নিবন্ধনকৃত ব্যবহারকারী এটি সম্পাদনা করতে পারবেন।\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
        "cascadeprotectedwarning": "<strong>সতর্কীকরণ:</strong> এই পাতাটি সুরক্ষিত, ফলে এটি শুধুমাত্র প্রশাসক অধিকারপ্রাপ্ত ব্যবহারকারীগণ সম্পাদনা করতে পারেন, কারণ এটি নিচের প্রপাতাকার-সুরক্ষিত {{PLURAL:$1|পাতায়|পাতাসমূহে}} অন্তর্ভুক্ত আছে:",
        "prefs-watchlist-days": "যত দিনের নজরতালিকা দেখানো হবে:",
        "prefs-watchlist-days-max": "সর্বোচ্চ $1 {{PLURAL:$1|দিন|দিন}}",
        "prefs-watchlist-edits": "সম্প্রসারিত নজর তালিকায় সর্বোচ্চ সংখ্যার পরিবর্তন দেখানোর জন্য:",
-       "prefs-watchlist-edits-max": "সরà§\8dবà§\8bà¦\9aà§\8dà¦\9a à¦¨à¦¾à¦®à§\8dবার: ১০০০",
+       "prefs-watchlist-edits-max": "সরà§\8dবà§\8bà¦\9aà§\8dà¦\9a à¦¨à¦®à§\8dবর: ১০০০",
        "prefs-watchlist-token": "নজরতালিকা টোকেন:",
        "prefs-misc": "বিবিধ",
        "prefs-resetpass": "পাসওয়ার্ড পরিবর্তন",
        "foreign-structured-upload-form-label-infoform-categories": "বিষয়শ্রেণীসমূহ",
        "foreign-structured-upload-form-label-infoform-date": "তারিখ",
        "foreign-structured-upload-form-label-not-own-work-local-local": "এছাড়াও আপনি [[Special:Upload|ডিফল্ট আপলোডের পাতা]] চেষ্টা করতে পারেন।",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "এছাড়াও আপনি [[Special:Upload|{{SITENAME}}-এর আপলোডের পাতা]] ব্যবহার করার চেষ্টা করতে পারেন, যদি এই ফাইলটি তাদের নীতিমালা অধীনে সেখানে আপলোড করা যায়।",
+       "foreign-structured-upload-form-label-own-work-message-shared": "আমি প্রত্যয়ন করছি যে আমি এই ফাইলের স্বত্তাধিকারী, এবং [https://creativecommons.org/licenses/by-sa/4.0/deed.bn ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন-শেয়ার অ্যালাইক ৪.০] লাইসেন্সের অধীনে এই ফাইলটি উইকিমিডিয়া কমন্সে অপরিবর্তনীয় প্রকাশে সম্মত হচ্ছি, এবং আমি [https://wikimediafoundation.org/wiki/Terms_of_Use ব্যবহারের শর্তাবলীর] সাথে সম্মত।",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "যদি আপনি এই ফাইলের স্বত্তাধিকারী না হন, বা আপনি একটি ভিন্ন লাইসেন্সের আওতায় প্রকাশ করতে ইচ্ছুক থাকেন, তাহলে [https://commons.wikimedia.org/wiki/Special:UploadWizard?uselang=bn কমন্স আপলোড উইজার্ড] ব্যবহার করতে বিবেচনা করুন।",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "এছাড়াও আপনি [[Special:Upload|{{SITENAME}}-এর আপলোডের পাতা]] ব্যবহার করার চেষ্টা করতে পারেন, যদি সাইটটি তাদের নীতিমালার অধীনে এই ফাইল আপলোড করার অনুমতি দেয়।",
        "foreign-structured-upload-form-2-label-ccbysa": "[https://creativecommons.org/licenses/by-sa/4.0/deed.bn ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন-শেয়ার অ্যালাইক ৪.০] লাইসেন্সের আওতায় এটি ইন্টারনেটে <strong>চিরতরে প্রকাশ করা ঠিক হবে</strong>",
+       "foreign-structured-upload-form-2-label-termsofuse": "ফাইল আপলোড করার দ্বারা, আপনি প্রত্যয়ন করছেন যে আপনি এই ফাইলের স্বত্তাধিকারী, এবং ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন-শেয়ারআলাইক ৪.০ লাইসেন্সের অধীনে এই ফাইলটি উইকিমিডিয়া কমন্সে অপরিবর্তনীয় প্রকাশে সম্মত হচ্ছেন, এবং আপনি [https://wikimediafoundation.org/wiki/Terms_of_Use ব্যবহারের শর্তাবলীর] সাথে সম্মত।",
        "foreign-structured-upload-form-3-label-question-website": "আপনি কি একটি ওয়েবসাইট থেকে এই ছবি ডাউনলোড করেছেন, বা একটি চিত্র অনুসন্ধান থেকে এটি পেয়েছেন?",
+       "foreign-structured-upload-form-3-label-question-ownwork": "আপনি কি নিজে এই ছবিটি (তোলা ছবি, অঙ্কন, স্কেচ, ইত্যাদি) তৈরি করেছেন?",
        "foreign-structured-upload-form-3-label-yes": "হ্যাঁ",
        "foreign-structured-upload-form-3-label-no": "না",
        "backend-fail-stream": "\"$1\" ফাইলের স্ট্রিম দেখানো যাচ্ছে না।",
        "apisandbox-api-disabled": "এপিআই এই সাইটে নিষ্ক্রিয় করা আছে।",
        "apisandbox-submit": "অনুরোধ রাখুন",
        "apisandbox-reset": "পরিস্কার",
+       "apisandbox-retry": "পুনঃচেষ্টা করুন",
        "apisandbox-examples": "উদাহরণ",
        "apisandbox-results": "ফলাফল",
-       "apisandbox-request-time": "অনুরোধের সময়: $1",
+       "apisandbox-request-time": "অনুরোধের সময়: {{PLURAL:$1|$1 মি.সে.}}",
        "booksources": "বইয়ের উৎস",
        "booksources-search-legend": "বইয়ের উৎসের জন্য অনুসন্ধান করা হোক",
        "booksources-isbn": "আইএসবিএন:",
        "move-page": "$1 স্থানান্তর",
        "move-page-legend": "পাতা স্থানান্তর",
        "movepagetext": "নিচের ফর্মটি ব্যবহার করে একটি পাতার শিরোনাম পরিবর্তন করা যাবে, এবং সেই সাথে নতুন শিরোনামে এর সমগ্র ইতিহাস স্থানান্তর করা যাবে।\nপুরনো শিরোনামটি নতুন শিরোনামটির প্রতি একটি পুনর্নির্দেশনা ধারণ করবে।\nযেসমস্ত পুনর্নির্দেশনা পুরনো শিরোনামটির দিকে নির্দেশ করছিল, সেগুলি স্বয়ংক্রিয়ভাবে হালনাগাদ করতে পারবেন।\nযদি তা না চান, তবে [[Special:DoubleRedirects|দ্বি-পুনর্নির্দেশনা]] বা [[Special:BrokenRedirects|অচল পুনর্নির্দেশনাগুলি]] পরীক্ষা করে দেখতে ভুলবেন না।\nসংযোগগুলি যাতে তাদের লক্ষ্যে পৌঁছায়, তা নিশ্চিত করার দায়িত্ব আপনার।\n\nলক্ষ্য করুন যে যদি নতুন শিরোনামে ইতিমধ্যেই একটি পাতা থেকে থাকে, তবে উৎস পাতাটি সেই শিরোনামে স্থানান্তর করা হবে <strong>না</strong>, যদি না নতুন শিরোনামের পাতাটি খালি থাকে বা একটি পুননির্দেশনা হয় এবং এর কোন অতীত সম্পাদনা ইতিহাস না থাকে।\nঅর্থাৎ আপনি ভুল করে নাম পরিবর্তন করলে সহজেই পুরনো নামে ফেরত যেতে পারবেন, কিন্তু ইতিমধ্যে বিদ্যমান কোন পাতার উপরে লিখতে পারবেন না।\n\n<strong>টীকা:</strong>\nকোন জনপ্রিয় পাতার ক্ষেত্রে এই পরিবর্তনটি খুবই আকস্মিক হতে পারে; অগ্রসর হবার আগে এই কাজটির ফলাফল কী হতে পারে, সে ব্যাপারে অনুগ্রহ করে নিশ্চিত হোন।",
-       "movepagetext-noredirectfixer": "নিচের ফর্মটি ব্যবহার করে একটি পাতার শিরোনাম পরিবর্তন করা যাবে, এবং সেই সাথে নতুন শিরোনামে এর সমগ্র ইতিহাস স্থানান্তর করা যাবে।\nপুরনো শিরোনামটি নতুন শিরোনামটির প্রতি একটি পুনর্নির্দেশনা ধারণ করবে।\n[[Special:DoubleRedirects|দ্বি-পুনর্নির্দেশনা]] বা [[Special:BrokenRedirects|অচল পুনর্নির্দেশনাগুলি]] পরীক্ষা করে দেখতে ভুলবেন না।\nসংযোগগুলি যাতে তাদের লক্ষ্যে পৌঁছায়, তা নিশ্চিত করার দায়িত্ব আপনার।\n\nলক্ষ্য করুন যে যদি নতুন শিরোনামে ইতিমধ্যেই একটি পাতা থেকে থাকে, তবে উৎস পাতাটি সেই শিরোনামে স্থানান্তর করা হবে '''না''', যদি না নতুন শিরোনামের পাতাটি খালি থাকে বা একটি পুননির্দেশনা হয় এবং এর কোন অতীত সম্পাদনা ইতিহাস না থাকে। \nঅর্থাৎ আপনি ভুল করে নাম পরিবর্তন করলে সহজেই পুরনো নামে ফেরত যেতে পারবেন, কিন্তু ইতিমধ্যে বিদ্যমান কোন পাতার উপরে লিখতে পারবেন না।\n\n'''সতর্কীকরণ!'''\nকোন জনপ্রিয় পাতার ক্ষেত্রে এই পরিবর্তনটি খুবই আকস্মিক হতে পারে;\nঅগ্রসর হবার আগে এই কাজটির ফলাফল কী হতে পারে, সে ব্যাপারে অনুগ্রহ করে নিশ্চিত হোন।",
+       "movepagetext-noredirectfixer": "নিচের ফর্মটি ব্যবহার করে একটি পাতার শিরোনাম পরিবর্তন করা যাবে, এবং সেই সাথে নতুন শিরোনামে এর সমগ্র ইতিহাস স্থানান্তর করা যাবে।\nপুরনো শিরোনামটি নতুন শিরোনামটির প্রতি একটি পুনর্নির্দেশনা ধারণ করবে।\n[[Special:DoubleRedirects|দ্বি-পুনর্নির্দেশনা]] বা [[Special:BrokenRedirects|অচল পুনর্নির্দেশনাগুলি]] পরীক্ষা করে দেখতে ভুলবেন না।\nসংযোগগুলি যাতে তাদের লক্ষ্যে পৌঁছায়, তা নিশ্চিত করার দায়িত্ব আপনার।\n\nলক্ষ্য করুন যে যদি নতুন শিরোনামে ইতিমধ্যেই একটি পাতা থেকে থাকে, তবে উৎস পাতাটি সেই শিরোনামে স্থানান্তর করা হবে <strong>না</strong>, যদি না নতুন শিরোনামের পাতাটি খালি থাকে বা একটি পুননির্দেশনা হয় এবং এর কোন অতীত সম্পাদনা ইতিহাস না থাকে। \nঅর্থাৎ আপনি ভুল করে নাম পরিবর্তন করলে সহজেই পুরনো নামে ফেরত যেতে পারবেন, কিন্তু ইতিমধ্যে বিদ্যমান কোন পাতার উপরে লিখতে পারবেন না।\n\n<strong>টীকা:</strong>\nকোন জনপ্রিয় পাতার ক্ষেত্রে এই পরিবর্তনটি খুবই আকস্মিক হতে পারে;\nঅগ্রসর হবার আগে এই কাজটির ফলাফল কী হতে পারে, সে ব্যাপারে অনুগ্রহ করে নিশ্চিত হোন।",
        "movepagetalktext": "পাতাটির সাথে সাথে সংশ্লিষ্ট আলোচনা পাতাটিও স্বয়ংক্রিয়ভাবে সরানো হবে '''যদি না:'''\n*খালি নয় এমন একটি আলাপ পাতা নতুন শিরোনামটির অধীনে ইতিমধ্যেই বিদ্যমান থাকে, অথবা\n*আপনি নিচের বাক্সটি থেকে টিক সরিয়ে নিতে পারেন।\n\nএসব ক্ষেত্রে আপনি চাইলে নিজের হাতে পাতাটিকে সরাতে বা একত্রীকরণ করতে পারেন।",
        "moveuserpage-warning": "'''সতর্কতা:''' আপনি একটি ব্যবহারকারী পাতা স্থানান্তর করছেন। অনুগ্রহ করে লক্ষ্য করুন যে এর মাধ্যমে কেবলমাত্র পাতাটি স্থানান্তর হবে, কিন্তু পাতার নাম পরিবর্তন হবে ''না''।",
        "movecategorypage-warning": "<strong>সতর্কীকরণ:</strong> আপনি একটি বিষয়শ্রেণীর পাতা স্থানান্তর করতে চলেছেন। দয়া করে মনে রাখবেন যে এতে শুধুমাত্র পাতাটি স্থানান্তরিত হবে এবং পুরাতন বিষয়শ্রেণীতে থাকা কোন পাতা নতুনটিতে পুনঃশ্রেণীকরণ করা হবে <em>না</em>।",
        "anonymous": "{{SITENAME}} এর বেনামী {{PLURAL:$1|ব্যবহারকারী|ব্যবহারকারীবৃন্দ}}",
        "siteuser": "{{SITENAME}} ব্যবহারকারী $1",
        "anonuser": "{{SITENAME}} বেনামী ব্যবহারকারী $1",
-       "lastmodifiedatby": "এই পাতাটিতে শেষ পরিবর্তন হয়েছিল $2, $1 by $3।",
+       "lastmodifiedatby": "$3 কর্তৃক $2, $1 তারিখে এই পাতাটিতে শেষ পরিবর্তন করা হয়েছিল।",
        "othercontribs": "$1-এর কাজের উপর ভিত্তি করে।",
        "others": "অন্যান্য",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|ব্যবহারকারী|ব্যবহারকারী}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|ব্যবহারকারী}}|ব্যবহারকারী}} $1",
        "anonusers": "{{SITENAME}} বেনামী {{PLURAL:$2|ব্যবহারকারী|ব্যবহারকারীগণ}} $1",
        "creditspage": "পাতার স্বীকৃতি",
        "nocredits": "এই পাতাটির জন্য কোন কৃতিত্ব-সম্পর্কিত তথ্য নেই।",
        "metadata-help": "এই ফাইলে অতিরিক্ত কিছু তথ্য আছে। সম্ভবত যে ডিজিটাল ক্যামেরা বা স্ক্যানারের মাধ্যমে এটি তৈরি বা ডিজিটায়িত করা হয়েছিল, সেটি কর্তৃক তথ্যগুলি যুক্ত হয়েছে। যদি ফাইলটি তার আদি অবস্থা থেকে পরিবর্তিত হয়ে থাকে, কিছু কিছু বিবরণ পরিবর্তিত ফাইলটির জন্য প্রযোজ্য না-ও হতে পারে।",
        "metadata-expand": "সম্প্রসারিত সবিস্তারে দেখাও",
        "metadata-collapse": "সম্প্রসারিত সবিস্তারে দেখিও না",
-       "metadata-fields": "à¦\8fà¦\87 à¦¬à¦¾à¦°à§\8dতায় à¦¤à¦¾à¦²à¦¿à¦\95াভà§\81à¦\95à§\8dত à¦\9aিতà§\8dর à¦®à§\87à¦\9fাডাà¦\9fা à¦\95à§\8dষà§\87তà§\8dরà¦\97à§\81লি à¦\9bবির à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦ªà§\8dরদরà§\8dশন à¦\95রা à¦¹à¦¬à§\87, à¦¯à¦\96ন à¦\85ধি-à¦\89পাতà§\8dত à¦¸à¦¾à¦°à¦£à¦¿à¦\9fি à¦¸à¦\82à¦\95à§\81à¦\9aিত à¦\95রা à¦¹à¦¬à§\87। à¦\85নà§\8dয à¦\95à§\8dষà§\87তà§\8dরà¦\97à§\81লি à¦¸à§\8dবাভাবিà¦\95 à¦\85বসà§\8dথায় à¦²à§\81à¦\95à§\8dà¦\95ায়িত à¦¥à¦¾à¦\95বà§\87।\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",
+       "metadata-fields": "এই বার্তায় তালিকাভুক্ত চিত্র মেটাডাটা ক্ষেত্রগুলি ছবির পাতায় প্রদর্শন করা হবে, যখন অধি-উপাত্ত সারণিটি সংকুচিত করা হবে। অন্য ক্ষেত্রগুলি স্বাভাবিক অবস্থায় লুকায়িত থাকবে।\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-bitspersample": "উপাদানপ্রতি বিট",
        "exif-originaltransmissionref": "মূল ট্রান্সমিশনকৃত স্থানের কোড",
        "exif-identifier": "আইডেন্টিফায়ার",
        "exif-lens": "ব্যবহৃত লেন্স",
-       "exif-serialnumber": "à¦\95à§\8dযামà§\87রার à¦¸à¦¿à¦°à¦¿à¦¯à¦¼à¦¾à¦² à¦¨à¦¾à¦®à§\8dবার",
+       "exif-serialnumber": "à¦\95à§\8dযামà§\87রার à¦\95à§\8dরমিà¦\95 à¦¨à¦®à§\8dবর",
        "exif-cameraownername": "ক্যামেরার স্বত্ত্বাধিকারী",
        "exif-label": "লেবেল",
        "exif-datetimemetadata": "মেটাডেটার তারিখ সর্বশেষ পরিবর্তিত হয়েছিলো",
        "version-libraries-authors": "লেখক",
        "redirect": "পাতা, ফাইল, ব্যবহারকরী, সংশোধন বা লগ আইডি দ্বারা পুনঃনির্দেশ করা হয়েছে",
        "redirect-legend": "একটি ফাইল অথবা পাতায় পুনঃনির্দেশ করা হয়েছে",
-       "redirect-summary": "à¦\8fà¦\87 à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\8fà¦\95à¦\9fি à¦«à¦¾à¦\87লà§\87 (ফাà¦\87লà§\87র à¦¨à¦¾à¦®), à¦\8fà¦\95à¦\9fি à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ (সà¦\82সà§\8dà¦\95রণ à¦\86à¦\87ডি à¦¬à¦¾ à¦ªà¦¾à¦¤à¦¾ à¦\86à¦\87ডি), à¦\85থবা à¦\8fà¦\95à¦\9fি à¦¬à§\8dযবহারà¦\95রà§\80 à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ (সà¦\82à¦\96à§\8dযায় à¦²à§\87à¦\96া à¦¬à§\8dযবহারà¦\95ারà§\80 à¦\86à¦\87ডি) à¦ªà§\81নà¦\83নিরà§\8dদà§\87শিত à¦¹à¦¯à¦¼à§\87à¦\9bà§\87। à¦¬à§\8dযবহার:  [[{{#Special:Redirect}}/file/à¦\89দাহরণ.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], à¦\85থবা [[{{#Special:Redirect}}/user/101]]।",
+       "redirect-summary": "à¦\8fà¦\87 à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\8fà¦\95à¦\9fি à¦«à¦¾à¦\87লà§\87 (পà§\8dরদতà§\8dত à¦«à¦¾à¦\87লà§\87র à¦¨à¦¾à¦®), à¦\8fà¦\95à¦\9fি à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ (পà§\8dরদতà§\8dত à¦¸à¦\82সà§\8dà¦\95রণ à¦\86à¦\87ডি à¦¬à¦¾ à¦ªà¦¾à¦¤à¦¾ à¦\86à¦\87ডি), à¦\8fà¦\95à¦\9fি à¦¬à§\8dযবহারà¦\95রà§\80 à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ (পà§\8dরদতà§\8dত à¦¸à¦\82à¦\96à§\8dযায় à¦²à§\87à¦\96া à¦¬à§\8dযবহারà¦\95ারà§\80 à¦\86à¦\87ডি) à¦¬à¦¾ à¦\8fà¦\95à¦\9fি à¦²à¦\97 à¦­à§\81à¦\95à§\8dতিতà§\87 (পà§\8dরদতà§\8dত à¦²à¦\97 à¦­à§\81à¦\95à§\8dতি) à¦ªà§\81নà¦\83নিরà§\8dদà§\87শিত à¦¹à¦¯à¦¼à§\87à¦\9bà§\87। à¦¬à§\8dযবহার:  [[{{#Special:Redirect}}/file/à¦\89দাহরণ.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], à¦¬à¦¾ [[{{#Special:Redirect}}/logid/186]]।",
        "redirect-submit": "যাও",
        "redirect-lookup": "দেখুন:",
        "redirect-value": "মান:",
        "action-pagelang": "পাতার ভাষা পরিবর্তন করুন",
        "log-name-pagelang": "ভাষা পরিবর্তন লগ",
        "log-description-pagelang": "এটি পাতার ভাষা পরিবর্তনের লগ।",
-       "logentry-pagelang-pagelang": "$1 পাতার ভাষা $3 এর জন্য $4 থেকে $5 এ {{GENDER:$2|পরিবর্তন}} করেছেন।",
+       "logentry-pagelang-pagelang": "$1 $3-এর ভাষা $4 থেকে $5-এ {{GENDER:$2|পরিবর্তন}} করেছেন",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (সক্রিয় করা)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''নিষ্ক্রিয় করা''')",
        "mediastatistics": "মিডিয়া পরিসংখ্যান",
index 2e0d73b..c03e20b 100644 (file)
        "emailconfirmlink": "Бакъде хьай электронан поштан адрес",
        "invalidemailaddress": "Электронан поштан адрес тӀелаца йиш яц, цуна формат нийса цахилар бахьнехь.\nДехар до, язъе нийса электронан адрес я и меттиг есса йита.",
        "cannotchangeemail": "ХӀокху декъашхочун дӀаяздарца долу электронан поштан адресаш хуьйцийла дац хӀокху вики чохь",
-       "emaildisabled": "Ð¥Ó\80окÑ\85Ñ\83 Ñ\81айÑ\82ан Ñ\82аÑ\80о Ñ\8fÑ\86 Ñ\8dлекÑ\82Ñ\80онан Ð¿Ð¾Ñ\87те хаамаш бахьийта.",
+       "emaildisabled": "Ð¥Ó\80окÑ\85Ñ\83 Ñ\81айÑ\82ан Ñ\82аÑ\80о Ñ\8fÑ\86 Ñ\8dлекÑ\82Ñ\80онан Ð¿Ð¾Ñ\88те хаамаш бахьийта.",
        "accountcreated": "Декъашхочун дӀаяздар кхоьллина",
        "accountcreatedtext": "Кхоьллина декъашхочун [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|дийцаре.]]) дӀаяздар.",
        "createaccount-title": "{{SITENAME}}: декъашхочун дӀаяздар кхоллар",
        "resetpass-submit-cancel": "Цаоьшу",
        "resetpass-wrong-oldpass": "Нийса йоцу я хана йолу карара пароль. Ахьа кхиамца пароль хийцина я керла хана йолу пароль ехна хила там бу.",
        "resetpass-recycled": "Дехар до, хӀинца йолччул башха пароль хӀотта йе.",
-       "resetpass-temp-emailed": "Ð\90Ñ\85Ñ\8cа Ñ\87Ñ\83гÓ\80оÑ\88 Ñ\8fзйина Ñ\86кÑ\8aаÑ\87Ñ\83нна Ñ\8dлекÑ\82Ñ\80онан Ð¿Ð¾Ñ\87те яийтина пароль. Чудахар чекхдалийта язъян еза керла пароль.",
+       "resetpass-temp-emailed": "Ð\90Ñ\85Ñ\8cа Ñ\87Ñ\83гÓ\80оÑ\88 Ñ\8fзйина Ñ\86кÑ\8aаÑ\87Ñ\83нна Ñ\8dлекÑ\82Ñ\80онан Ð¿Ð¾Ñ\88те яийтина пароль. Чудахар чекхдалийта язъян еза керла пароль.",
        "resetpass-temp-password": "Цхьан хана пароль:",
        "resetpass-abort-generic": "Пароль хийцар дӀахедар",
        "resetpass-expired": "Хьан паролан хан чекхелла. Дехар до керла пароль хӀоттаяр.",
        "emailuser": "Декъашхочун хааман кехат",
        "emailuser-title-target": "{{GENDER:$1|декъашхочунга}} электронан хаам базбар",
        "emailuser-title-notarget": "Декъашхочунга кехат яздар",
-       "emailpagetext": "Ð¥Ó\80окÑ\85Ñ\83 Ð°Ð³Ó\80она Ð³Ó\80оÑ\8cнÑ\86а Ð¹Ð¸Ñ\88 Ñ\8e {{GENDER:$1|декÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н}} Ñ\8dлекÑ\82Ñ\80онан Ð¿Ð¾Ñ\87те хаам бахьийта.\nХьоьга жоп лур ду ахьа [[Special:Preferences|хьайн гӀирса чу]] дӀаяздина долу адрес тӀе.",
+       "emailpagetext": "Ð¥Ó\80окÑ\85Ñ\83 Ð°Ð³Ó\80она Ð³Ó\80оÑ\8cнÑ\86а Ð¹Ð¸Ñ\88 Ñ\8e {{GENDER:$1|декÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н}} Ñ\8dлекÑ\82Ñ\80онан Ð¿Ð¾Ñ\88те хаам бахьийта.\nХьоьга жоп лур ду ахьа [[Special:Preferences|хьайн гӀирса чу]] дӀаяздина долу адрес тӀе.",
        "defemailsubject": "Хаам {{grammar:genitive|{{SITENAME}}}} чура бу",
        "usermaildisabled": "Декъашхочун электронан пошт дӀаяйина ю",
        "noemailtitle": "Электронан поштан адрес дац",
        "notanarticle": "Яззам бац",
        "notvisiblerev": "Верси дӀаяьккхина хила",
        "watchlist-details": "Хьан тергаме могӀанца $1 {{PLURAL:$1|агӀо}} ю, дийцаре агӀонаш йоцуш.",
-       "wlheader-enotif": "ЭлекÑ\82Ñ\80онан Ð¿Ð¾Ñ\87те хаамаш байтар латина ду.",
+       "wlheader-enotif": "ЭлекÑ\82Ñ\80онан Ð¿Ð¾Ñ\88те хаамаш байтар латина ду.",
        "wlheader-showupdated": "Хийцам бина агӀонаш '''Ӏаьржа''' шрифтцан билгальяха ю.",
        "wlnote": "Гойту <strong>$2</strong> {{plural:$2|сахьтчохь}} бина {{PLURAL:$1|тӀеххьара '''$1''' хийцам}}, хан $3 $4",
        "wlshowlast": "Гайта тӀаьххьара $1 сахьт $2 де",
        "exif-gpsdatestamp": "Терахь",
        "exif-jpegfilecomment": "JPEG-файлан билгалдаккхар",
        "exif-keywords": "Коьрта дешнаш",
+       "exif-countrycreated": "Мохк, сурт дин хилла болу",
+       "exif-citycreated": "ГӀала, сурт дина йолу",
        "exif-objectname": "Йоцца цӀе",
        "exif-specialinstructions": "Къаьсттина тӀехьажор",
        "exif-headline": "Корта",
        "logentry-newusers-newusers": "{{GENDER:$2|ДӀавазвелла|ДӀаязелла}} керла декъашхо $1",
        "logentry-newusers-create": "{{GENDER:$2|ДӀавазвелла|ДӀаязелла}} керла декъашхо $1",
        "logentry-newusers-create2": "$1 {{GENDER:$2|кхоьллина}} декъашхочун дӀаяздапр $3",
-       "logentry-newusers-byemail": "$1 {{GENDER:$2|кÑ\85оÑ\8cллина}} Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ð´Ó\80аÑ\8fздаÑ\80 $3 Ð¿Ð°Ñ\80олÑ\8c Ñ\8dлекÑ\82Ñ\80онан Ð¿Ð¾Ñ\87те яхьийтина",
+       "logentry-newusers-byemail": "$1 {{GENDER:$2|кÑ\85оÑ\8cллина}} Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ð´Ó\80аÑ\8fздаÑ\80 $3 Ð¿Ð°Ñ\80олÑ\8c Ñ\8dлекÑ\82Ñ\80онан Ð¿Ð¾Ñ\88те яхьийтина",
        "logentry-newusers-autocreate": "Автоматически кхоьллина {{GENDER:$2|декъашхочун}} $1 дӀаяздар",
        "logentry-rights-rights": "$1 {{GENDER:$2|хийцина}} $3 бакъо $4 → $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|хийцина}} хӏокхуна $3 бакъо",
index e1b08b2..590bcfa 100644 (file)
        "cancel": "ھەڵیوەشێنەوە",
        "moredotdotdot": "زیاتر",
        "morenotlisted": "ئەم لیستەیە تەواو نییە",
-       "mypage": "پەڕه‌",
+       "mypage": "پەڕە",
        "mytalk": "لێدوان",
        "anontalk": "لێدوان بۆ ئەم ئایپییە",
        "navigation": "ڕێدۆزی",
        "and": "&#32;و",
        "qbfind": "بدۆزەرەوە",
-       "qbbrowse": "بگه‌ڕێ",
+       "qbbrowse": "بگەڕێ",
        "qbedit": "دەستکاری",
        "qbpageoptions": "ئەم پەڕەیە",
        "qbmyoptions": "پەڕەکانم",
        "editthispage": "دەستکاری ئەم پەڕەیە بکە‌",
        "create-this-page": "ئەم پەڕەیە دروست بکە",
        "delete": "سڕینەوە",
-       "deletethispage": "سڕینه‌وه‌ی ئه‌م په‌ڕه‌یه‌",
+       "deletethispage": "سڕینەوه‌ی ئەم پەڕەیە",
        "undeletethispage": "ئەم پەڕەیە بھێنەوە",
        "undelete_short": "{{PLURAL:$1|یەک گۆڕانکاریی|$1 گۆڕانکاریی}} سڕاوە بەجێبھێنەرەوە",
        "viewdeleted_short": "{{PLURAL:$1|یەک گۆڕانکاریی سڕاو|$1 گۆڕانکاریی سڕاو}} ببینە",
        "protect": "پاراستن",
        "protect_change": "گۆڕین",
-       "protectthispage": "ئه‌م په‌ڕه‌یه‌ بپارێزه‌",
+       "protectthispage": "ئەم پەڕەیە بپارێزە",
        "unprotect": "پاراستنی بگۆڕە",
        "unprotectthispage": "پاراستنی ئەم پەڕەیە بگۆڕە",
        "newpage": "پەڕەی نوێ",
        "talkpage": "باس لەسەر ئەم پەڕە بکە‌",
        "talkpagelinktext": "لێدوان",
-       "specialpage": "په‌ڕه‌ی تایبه‌ت",
+       "specialpage": "پەڕەی تایبەت",
        "personaltools": "ئامڕازە تاکەکەسییەکان",
        "articlepage": "پەڕەی ناوەرۆک ببینە",
        "talk": "وتووێژ",
        "projectpage": "پەڕەی پرۆژە نیشان بدە",
        "imagepage": "پەڕەی پەڕگە نیشان بدە",
        "mediawikipage": "پەڕەی پەیام نیشان بدە",
-       "templatepage": "په‌ڕه‌ی داڕێژە ببینە‌",
-       "viewhelppage": "په‌ڕه‌ی یارمه‌تی نیشانبده‌",
-       "categorypage": "په‌ڕه‌ی هاوپۆل نیشانبده‌",
+       "templatepage": "پەڕەی داڕێژە ببینە",
+       "viewhelppage": "پەڕەی یارمەتی ببینە",
+       "categorypage": "پەڕەی پۆل ببینە",
        "viewtalkpage": "بینینی لێدوان",
        "otherlanguages": "بە زمانەکانی تر",
        "redirectedfrom": "(ڕەوانەکراوە لە $1ەوە)",
        "confirmable-yes": "بەڵێ",
        "confirmable-no": "نا",
        "thisisdeleted": "$1 نیشان بدە یا بھێنەوە؟",
-       "viewdeleted": "$1 نیشان بده‌؟",
+       "viewdeleted": "بینینی $1؟",
        "restorelink": "{{PLURAL:$1|یەک گۆڕانکاریی سڕاو|$1 گۆڕانکاریی سڕاو}}",
        "feedlinks": "خۆراک:",
        "feed-invalid": "ئەندام بوونی ئەو جۆرە خۆراکە نەناسراوە.",
        "nosuchactiontext": "ئەو چالاکییەی لە لایەن بەستەرەوە دیاریکراوە ناتەواوە.\nلەوانەیە بە هەڵە بەستەرەکەت نووسیبێت، یان بەستەرێکی هەڵەی بە دواوە بێت.\nلەوانەیە ئەمە نیشانەی هەڵەیەک بێت لەو نەرمەکاڵایەی کە بەکاردێت لە لایەن {{SITENAME}}.",
        "nosuchspecialpage": "پەڕەی تایبەتی ئاوا بوونی نییە",
        "nospecialpagetext": "<strong>پەڕەیەکی تایبەت دەخوازیت کە بوونی نیە.</strong>\n\nلیستێکی پەڕە تایبەتە دروستەکان لە [[Special:SpecialPages|{{int:specialpages}}]] لە بەردەست‌دایە.",
-       "error": "هه‌ڵه‌",
+       "error": "ھەڵە",
        "databaseerror": "ھەڵەی بنکەدراوه",
        "databaseerror-function": "کردە: $1",
        "databaseerror-error": "هەڵە: $1",
        "missingarticle-diff": "(جیاوازی: $1، $2)",
        "readonly_lag": "بنكه‌دراوه‌كه‌ به‌شێوه‌ی خۆكار به‌ندكراوه‌، له‌كاتێكدا بنكه‌دراوه‌ی ڕاژه‌كاره‌كه‌ ڕۆڵی له‌خۆگرتن ده‌گێڕێت",
        "internalerror": "ھەڵەی ناوخۆیی",
-       "internalerror_info": "هه‌ڵه‌ی ناوخۆیی: $1",
+       "internalerror_info": "ھەڵەی ناوخۆیی: $1",
        "filecopyerror": "نەکرا پەڕگەی «$1» کۆپی بکرێت بۆ «$2».",
-       "filerenameerror": "ناوی په‌ڕگه‌ی \"$1\" نه‌گۆڕدرا بۆ \"$2\".",
+       "filerenameerror": "ناکرێت ناوی پەڕگەی «$1» بگۆڕرێت بۆ «$2».",
        "filedeleteerror": "نەکرا پەڕگەی «$1» بسڕدرێتەوە.",
        "directorycreateerror": "نەتوانرا بوخچەی \"$1\"دروست بکرێت.",
-       "filenotfound": "په‌ڕگه‌ی \"$1\" نه‌دۆزرایه‌وه‌",
+       "filenotfound": "پەڕگەی «$1» نەدۆزرایەوە",
        "unexpected": "نرخی چاوەڕوان نەکراو: \"$1\"=\"$2\" .",
        "formerror": "هەڵە: فورمەکە نانێردرێت.",
        "badarticleerror": "ئەو ئاماژە لەم لاپەڕەدا پێک‌نایە.",
        "missingcommentheader": "'''بیرهێنانەوە:''' بۆ ئەم بۆچوونەت سەردێڕ\\بابەت ڕاچاو نەکردووە.\nئەگەر دیسان «{{int:savearticle}}» لێبدەی، دەستکاریەکەت بێ سەردێڕ یان بابەت پاشەکەوت دەبێ.",
        "summary-preview": "پێشبینینی کورتە:",
        "subject-preview": "پێشبینینی بابەت/سەردێڕ:",
-       "blockedtitle": "به‌کار هینه‌ر له‌کار خراوه",
+       "blockedtitle": "بەکارھێنەر بەربەست کراوە",
        "blockedtext": "'''ناوی بەکارهێنەری یان ئای‌پی ئەدرەسی تۆ بەربەست‌ کراوە.'''\n\nبەربەست لە لایەن $1 کراوە.\nهۆکاری بەربەست کردن ''$2''ە.\n\n* دەستپێکی بەربەست‌کران: $8\n* کۆتایی هاتنی بەربەست‌کران: $6\n* بابەتی بەربەست: $7\n\nبۆ وتووێژ سەبارەت بە بەربەست‌کرانەکە دەبێ پەیوەندی بکەی بە $1 یان یەکێ دی لە [[{{MediaWiki:Grouppage-sysop}}|بەڕێوبەران]].\nلە بیرت بێ تاکوو ئیمەیل ئەدرەسێکی بڕوا پێ‌کراو لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر]] ڕاچاو نەکەی، نابێت لە هەلی «ئیمەیل ناردن بۆ ئەم بەکارهێنەرە» کەڵک وەر بگری؛ کەڵک وەرگرتن لەوە بەربەست نەکراوە بۆت.\n\nئای‌پی ئەدرەسی ئێستای تۆ $3 و پێناسەی بەربەست‌کراو #$5.\nتکایە لە هەر پرس و داواکاریەکت‌دا هەموو وردەکاریەکانی سەرەوە بگونجێنە.",
        "autoblockedtext": "ناونیشانی IPی تۆ بە شێوەی خۆکارانە بەرگیری لێ کراوە چوونکە بەکارھێنەرێکی دیکە بە خراپی بە کاری ھێناوە و بە دەستی $1 بەرگیری لێ کراوە.\nبەم ھۆکارەوە:\n\n:<em>$2</em>\n\n* دەست پێ کردنی بەرگیری: $8\n* بە سەر چوونی بەرگیری: $6\n* Intended blockee: $7\n\nدەتوانیت پەیوەندی بکەیت بە $1 یان یەکێکی دیکە لە [[{{MediaWiki:Grouppage-sysop}}|بەڕێوەبەران]] بۆ وتووێژ لە سەر بەرگیرییەکە.\n\nتێ بگە کە ناتوانیت ئامرازی «ئیمێل بنێرە بۆ ئەم بەکارھێنەرە» بە کار بھێنیت مەگەر ئەوەی کە پێشتر لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر]]تدا ناونیشانێکی گونجاوی ئیمێلت تۆمار کردبێت و بەرگیریت لێ نەکرابێت لە بەکارھێنانی ئەو ئامرازەش.\n\nناونیشانی IPی ئێستای تۆ $3ـە و پێناسەی یەرگیرییەکە #$5ـە.\nتکایە ھەموو وردەکارییەکانی سەرەوە ھەبێت لە ھەر پرس و داوایک کە دەیکەیت.",
        "blockednoreason": "هیچ هۆکارێک نەدراوە",
        "clearyourcache": "تێبینی:''' لە دوای پاشەکەوت کردن، لەوانەیە  بۆ بینینی گۆڕانکارییەکان پێویست بێ cacheی وێبگەڕەکەت پاکبکەیتەوە.\n* '''Firefox / Safari:''' دوگمەی ''Shift'' بگرە کاتێک لەسەر ''Reload''دا کرتە دەکەی، یان ھەرکام لە ''Ctrl-F5'' یان ''Ctrl-R'' لێبدە (''⌘-R'' لەسەر Mac دا)\n* '''Google Chrome:''' دوگمەکانی ''Ctrl-Shift-R'' لێبدە  (''⌘-Shift-R'' لەسەر Mac دا)\n* '''Internet Explorer:''' دوگمەی ''Ctrl'' بگرە کاتێک لەسەر  ''Refresh''دا کرتە دەکەی، یان ''Ctrl-F5'' لێبدە\n* '''Opera:''' لە ڕێگەی ''Tools → Preferences'' ەوە cacheەکە بسڕەوە.",
        "usercssyoucanpreview": "'''سەرچەشن:''' «{{int:showpreview}}» بەکاربێنە بۆ تاقی‌کردنەوەی CSS نوێ‌کەت، پێش پاشەکەوت‌کردن.",
        "userjsyoucanpreview": "'''سەرچەشن:''' «{{int:showpreview}}» بەکاربێنە بۆ تاقی‌کردنەوەی جاڤاسکریپتە نوێ‌کەت، پێش پاشەکەوت‌کردن.",
-       "usercsspreview": "'''له‌یادت بێ که‌ ئێسته‌ ته‌نها پێشبینینی CSS به‌کارهێنه‌ریه‌که‌ت ده‌که‌ی.'''\n'''هێشتا پاشه‌که‌وت نه‌بووه !'''",
+       "usercsspreview": "<strong>لە بیرت ببێت کە تەنھا خەریکی پێشبینینی CSSـەکەت دەبینیت.\nھێشتا پاشەکەوەت نەکراوە!</strong>",
        "userjspreview": "'''لەیادت بێ کە ئێستە تەنها پێشبینین\\تاقی‌کردنەوەی جاڤاسکریپتی بەکارهێنەریەکەت دەکەی.'''\n'''هێشتا پاشەکەوت نەبووه !'''",
-       "sitecsspreview": "'''له‌یادت بێ که‌ ئێسته‌ ته‌نها پێشبینینی ئەم CSS ده‌که‌ی.'''\n'''هێشتا پاشه‌که‌وت نه‌کراوە !'''",
+       "sitecsspreview": "<strong>لە بیرت ببێت کە تەنھا خەریکی پێشبینینی ئەم CSSـە دەبینیت.\nھێشتا پاشەکەوەت نەکراوە!</strong>",
        "sitejspreview": "'''لە بیرت نەچێت ئەمە تەنیا پێشبینینی ئەم کۆدەی جاڤاسکریپتە.'''\n'''گۆڕانکارییەکانت ھێشتا پاشەکەوت نەکراون!'''",
        "userinvalidcssjstitle": "'''ئاگادارکردنەوە:''' پێست نیە بۆ \"$1\".\nلەیادت بێ کە لاپەڕەکانی‌ .css و .js لە بابەت بە پیتی بچووک کەڵک وەر ئەگرن. وەک {{ns:user}}:Foo/vector.css نە وەک {{ns:user}}:Foo/Vector.css .",
        "updated": "(نوێ‌کراوە)",
        "prefs-reset-intro": "دەتوانی لەم لاپەڕە بۆ گەڕانەوەی هەڵبژاردەکانت بۆ بنچینەیی ماڵپەر کەڵک وەرگریت.\nگەر ئەوە بکەی ئیتر گۆڕانەکەت ناگەڕێتەوە.",
        "prefs-emailconfirm-label": "پشتڕاستکردنەوەی ئیمەیل:",
        "youremail": "ئیمەیل:",
-       "username": "{{GENDER:$1|ناوی به‌کارھێنەر}}:",
+       "username": "{{GENDER:$1|ناوی بەکارھێنەر}}:",
        "prefs-memberingroups": "{{GENDER:$2|ئەندامی}} {{PLURAL:$1|گرووپی|گرووپەکانی}}:",
        "prefs-registration": "کاتی خۆتۆمارکردن:",
        "yourrealname": "ناوی ڕاستی:",
        "yourvariant": "شێوەزاری زمانی ناوەرۆک:",
        "yournick": "واژووی نوێ:",
        "prefs-help-signature": "بۆچوونەکان لە لاپەڕەکانی وتووێژدا دەبێ بە \"<nowiki>~~~~</nowiki>\" دیاری بکرێن، کە دواتر خۆکار دەگۆڕێ بە واژۆکەت و مۆری کاتی.",
-       "badsig": "ئیمزاكه‌ هه‌ڵه‌یه‌، ته‌ماشای كۆدی HTML بكه‌‌",
+       "badsig": "کۆدی ئیمزای ھەڵە.\nبە تاگە HTMLکاندا بچۆرەوە.",
        "badsiglength": "واژووەکەت زۆر درێژە.\nواژوو نابێ لە $1 {{PLURAL:$1|نووسە}} درێژتر بێت.",
        "yourgender": "پێت خۆشە چۆن وەسف بکرێیت؟",
        "gender-unknown": "پێم خۆشە باسی نەکەم",
        "listgrouprights-addgroup-self": "زیادکردنی {{PLURAL:$2|گرووپ|گرووپەکان}} بۆ سەر ھەژماری خۆی: $1",
        "listgrouprights-removegroup-self": "لابردنی {{PLURAL:$2|گرووپ|گرووپەکان}} لە سەر ھەژماری خۆی: $1",
        "listgrouprights-addgroup-self-all": "زیادکردنی ھەموو گرووپەکان بۆ سەر ھەژماری خۆی",
-       "listgrouprights-removegroup-self-all": "لابردنی هەموو گرووپەکان له‌ سه‌ر هه‌ژماری خۆ",
+       "listgrouprights-removegroup-self-all": "لابردنی ھەموو گرووپەکان لە سەر ھەژماری خۆی",
        "listgrouprights-namespaceprotection-header": "سنوورداریی بۆشایی ناو",
        "listgrouprights-namespaceprotection-namespace": "بۆشایی ناو",
        "listgrouprights-namespaceprotection-restrictedto": "مافی رێ‌پێدراوی بەکارھێنەر بۆ دەستکاری",
        "trackingcategories": "پۆلەکانی شوێنکەوتن",
        "trackingcategories-name": "ناوی پەیام",
-       "mailnologin": "ناونیشان بۆ ناردن نییه‌",
+       "mailnologin": "ناونیشان بۆ ناردن نییە",
        "mailnologintext": "ده‌بێ له‌ [[Special:UserLogin|ژووره‌وه‌]] بیت و ناونیشانێکی بڕواپێ‌کراوی ئی‌مه‌یلت له‌ ناو [[Special:Preferences|هه‌ڵبژارده‌کان]] دیاری کردبێت تا بتوانی ئی‌مه‌یل بنێریت بۆ به‌کارهێنه‌رانی دیکه‌.",
        "emailuser": "ئیمەیل بنێرە بۆ ئەم بەکارھێنەرە",
        "emailuser-title-target": "ئیمەیلی ئەم {{GENDER:$1|بەکارھێنەر}}ە",
index d098b02..adc0dbc 100644 (file)
@@ -6,7 +6,8 @@
                        "Don Alessandro",
                        "Urhixidur",
                        "아라",
-                       "Исмаил Садуев"
+                       "Исмаил Садуев",
+                       "Умар"
                ]
        },
        "tog-underline": "Багълантыларнынъ тюбюни сызув:",
        "mytalk": "Музакере",
        "anontalk": "Бу IP-нинъ музакереси",
        "navigation": "Сайтта ёл тапув",
-       "and": "&#32;а",
+       "and": "&#32;ве",
        "qbfind": "Тап",
        "qbbrowse": "Бакъып чыкъ",
        "qbedit": "Денъиштир",
        "watchthisupload": "Бу файлны козет",
        "filewasdeleted": "Бу исимде бир файл бар эди, амма ёкъ этильген эди. Лютфен, текрар юклемеден эвель $1 тешкеринъиз.",
        "filename-bad-prefix": "Сиз юклеген файлнынъ ады '''\"$1\"'''-нен башлана. Бу, адетиндже, ракъамлы фотоаппаратлардан файл адына язылгъан манасыз ишаретлердир. Лютфен, бу файл ичюн анълыджа бир ад сайлап язынъыз.",
-       "upload-success-subj": "Юкленюв беджерильди",
        "upload-proto-error": "Янълыш протокол",
        "upload-proto-error-text": "Интернеттен бир ресим файлы юклемеге истесенъиз адрес <code>http://</code> я да <code>ftp://</code>нен башламалы.",
        "upload-file-error": "Ички хата",
        "wlheader-showupdated": "Сонъки зияретинъизден сонъ денъиштирильген саифелер '''къалын арифлернен''' косьтерильди.",
        "wlnote": "Ашагъыда саат $3, $4 ичюн сонъки {{PLURAL:$2|1=саат|'''$2''' саат}} ичинде япылгъан сонъки {{PLURAL:$1|1=денъиштирме|'''$1''' денъиштирме}} косьтериле.",
        "wlshowlast": "Сонъки $1 саат ичюн, $2 кунь ичюн я да  косьтер",
-       "watchlistall2": "эписини",
        "watchlist-options": "Козетюв джедвели сазламалары",
        "watching": "Козетюв джедвелине кирсетильмекте...",
        "unwatching": "Козетюв джедвелинден ёкъ этильмекте...",
index 86e4381..7d4dd42 100644 (file)
        "faqpage": "Project:Чѧстꙑ въпроси",
        "actions": "дѣиства",
        "namespaces": "имєнъ просторꙑ",
+       "variants": "обраꙁи",
        "navigation-heading": "плаваниѥ",
        "errorpagetitle": "блаꙁна",
        "returnto": "къ страници ⁖ $1 ⁖ въꙁвращєниѥ ⁙",
        "ncategories": "$1 {{PLURAL:$1|катигорїꙗ|катигорїи|катигорїѩ}}",
        "nlinks": "$1 {{PLURAL:$1|съвѧꙁь|съвѧꙁи|съвѧꙁии}}",
        "nmembers": "$1 {{PLURAL:$1|члѣнъ|члѣна|члѣни|члѣнъ}}",
+       "uncategorizedpages": "бєскатигорїинꙑ страницѧ",
+       "uncategorizedcategories": "бєскатигорїинꙑ катигорїѩ",
+       "uncategorizedimages": "бєскатигорїинꙑ дѣла",
+       "uncategorizedtemplates": "бєскатигорїинꙑ обраꙁьци",
+       "wantedcategories": "ноуждьни катигорїѩ",
+       "wantedpages": "ноуждьни страницѧ",
+       "wantedfiles": "ноуждьни дѣла",
+       "wantedtemplates": "ноуждьни обраꙁьци",
        "shortpages": "кратъкꙑ страницѧ",
        "longpages": "дльгꙑ страницѧ",
        "protectedpages-reason": "какъ съмꙑслъ",
index 4f3b094..f88c082 100644 (file)
        "mostcategories": "Чи нумай категорине кĕртнĕ страницăсем",
        "mostimages": "Чи анлă усă куракан ӳкерчĕксем",
        "mostrevisions": "Чи нумай тӳрлетнĕ страницăсем",
-       "prefixindex": "СÄ\83маÑ\85 Ð¿Ñ\83çламÄ\83Ñ\88Ä\95Ñ\81ен ÐºÄ\83Ñ\82аÑ\80Ñ\82мÄ\83Ñ\88Ä\95",
+       "prefixindex": "СÄ\83маÑ\85 Ð¿Ñ\83çламÄ\83Ñ\88Ä\95Ñ\81ен ÐºÄ\83Ñ\82аÑ\80Ñ\82аканни",
        "prefixindex-submit": "Кăтарт",
        "shortpages": "Кĕске статьясем",
        "longpages": "Вăрăм страницăсем",
index f27a94a..17aa7bd 100644 (file)
        "rcshowhidemine": "$1 egne bidrag",
        "rcshowhidemine-show": "Vis",
        "rcshowhidemine-hide": "Skjul",
+       "rcshowhidecategorization": "$1 kategorisering af sider",
        "rcshowhidecategorization-show": "Vis",
        "rcshowhidecategorization-hide": "Skjul",
        "rclinks": "Vis seneste $1 ændringer i de sidste $2 dage<br />$3",
        "recentchangeslinked-summary": "Dette er en liste over de seneste ændringer af sider, der linkes til fra en bestemt side (eller medlemmer af en bestemt kategori).\nSider på [[Special:Watchlist|din overvågningsliste]] er vist med '''fed''' skrift.",
        "recentchangeslinked-page": "Sidenavn:",
        "recentchangeslinked-to": "Vis ændringer i sider der henviser til den angivne side i stedet",
+       "recentchanges-page-added-to-category": "[[:$1]] tilføjet til kategori",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] og {{PLURAL:$2|én side|$2 sider}} tilføjet til kategori",
        "upload": "Læg en fil op",
        "uploadbtn": "Læg en fil op",
        "reuploaddesc": "Tilbage til formularen til at lægge filer op.",
        "wlshowhideanons": "anonyme brugere",
        "wlshowhidepatr": "patruljerede redigeringer",
        "wlshowhidemine": "mine redigeringer",
+       "wlshowhidecategorization": "kategorisering af sider",
        "watchlist-options": "Indstillinger for overvågningslisten",
        "watching": "Tilføjer overvågning …",
        "unwatching": "Fjerner overvågning …",
index bbe7556..4b698e3 100644 (file)
        "search": "Suche",
        "searchbutton": "Suchen",
        "go": "Ausführen",
-       "searcharticle": "Suchen",
+       "searcharticle": "Seite",
        "history": "Versionen",
        "history_short": "Versionsgeschichte",
        "updatedmarker": "Änderung seit deinem letzten Besuch",
        "previewnote": "'''Dies ist nur eine Vorschau.'''\nDie Seite wurde noch nicht gespeichert!",
        "continue-editing": "Zum Bearbeitungsfeld gehen",
        "previewconflict": "Diese Vorschau gibt den Inhalt des oberen Textfeldes wieder. So wird die Seite aussehen, wenn du jetzt speicherst.",
-       "session_fail_preview": "'''Deine Bearbeitung konnte nicht gespeichert werden, da Sitzungsdaten verloren gegangen sind.\nBitte versuche es erneut, indem du unter der folgenden Textvorschau nochmals auf „Seite speichern“ klickst.\nSollte das Problem bestehen bleiben, [[Special:UserLogout|melde dich ab]] und danach wieder an.'''",
-       "session_fail_preview_html": "'''Deine Bearbeitung konnte nicht gespeichert werden, da Sitzungsdaten verloren gegangen sind.'''\n\n''Da in {{SITENAME}} das Speichern von reinem HTML aktiviert ist, wurde die Vorschau ausgeblendet, um JavaScript-Attacken vorzubeugen.''\n\n'''Bitte versuche es erneut, indem du unter der folgenden Textvorschau nochmals auf „Seite speichern“ klickst.\nSollte das Problem bestehen bleiben, [[Special:UserLogout|melde dich ab]] und danach wieder an.'''",
+       "session_fail_preview": "Entschuldigung! Wir konnten deine Bearbeitung nicht verarbeiten, da Sitzungsdaten verloren gegangen sind.\n\nDu wurdest eventuell abgemeldet. <strong>Bitte verifiziere, dass du noch angemeldet bist und versuche es erneut</strong>.\nFalls dies nicht funktioniert, versuche dich [[Special:UserLogout|abzumelden]] und anschließend wieder anzumelden und überprüfe, ob dein Browser Cookies von dieser Website akzeptiert.",
+       "session_fail_preview_html": "Deine Bearbeitung konnte nicht gespeichert werden, da Sitzungsdaten verloren gegangen sind.\n\n<em>Da in {{SITENAME}} das Speichern von reinem HTML aktiviert ist, wurde die Vorschau ausgeblendet, um JavaScript-Attacken vorzubeugen.</em>\n\n<strong>Bitte versuche es erneut, indem du unter der folgenden Textvorschau nochmals auf „Seite speichern“ klickst.</strong>\nSollte das Problem bestehen bleiben, [[Special:UserLogout|melde dich ab]] und danach wieder an. Überprüfe, ob dein Browser Cookies von dieser Website akzeptiert.",
        "token_suffix_mismatch": "'''Deine Bearbeitung wurde zurückgewiesen, da dein Browser Zeichen im Bearbeiten-Token verstümmelt hat.\nEine Speicherung kann den Seiteninhalt zerstören. Dies geschieht bisweilen durch die Benutzung eines anonymen Proxy-Dienstes, der fehlerhaft arbeitet.'''",
        "edit_form_incomplete": "'''Der Inhalt des Bearbeitungsformulars hat den Server nicht vollständig erreicht. Bitte prüfe deine Bearbeitungen auf Vollständigkeit und versuche es erneut.'''",
        "editing": "Bearbeiten von „$1“",
        "mergehistory-empty": "Es können keine Versionen vereinigt werden.",
        "mergehistory-done": "{{PLURAL:$3|Eine Version wurde|$3 Versionen wurden}} von „$1“ nach „[[:$2]]“ vereinigt.",
        "mergehistory-fail": "Versionsvereinigung nicht möglich, bitte prüfe die Seite und die Zeitangaben.",
+       "mergehistory-fail-bad-timestamp": "Ungültiger Zeitstempel.",
+       "mergehistory-fail-invalid-source": "Ungültige Quellseite.",
+       "mergehistory-fail-invalid-dest": "Ungültige Zielseite.",
+       "mergehistory-fail-no-change": "Keine Versionen zusammengeführt. Kontrolliere bitte die Seiten- und Zeitparameter erneut.",
+       "mergehistory-fail-permission": "Keine ausreichenden Berechtigungen, um die Versionsgeschichte zusammenzuführen.",
+       "mergehistory-fail-self-merge": "Quell- und Zielseiten sind identisch.",
+       "mergehistory-fail-timestamps-overlap": "Die Quellversionen überlappen sich oder kommen nach den Ziel-Versionen.",
        "mergehistory-fail-toobig": "Die Versionsgeschichtenzusammenführung konnte nicht ausgeführt werden, da sonst mehr als {{PLURAL:$1|eine Version|$1 Versionen}} verschoben werden {{PLURAL:$1|würde|würden}}.",
        "mergehistory-no-source": "Ursprungsseite „$1“ ist nicht vorhanden.",
        "mergehistory-no-destination": "Zielseite „$1“ ist nicht vorhanden.",
        "import-nonewrevisions": "Es wurden keine Versionen importiert. Entweder waren alle bereits vorhanden oder wurden aufgrund von Fehlern übersprungen.",
        "xml-error-string": "$1 Zeile $2, Spalte $3, (Byte $4): $5",
        "import-upload": "XML-Dateien importieren",
-       "import-token-mismatch": "Verlust der Sessiondaten. Bitte versuche es erneut.",
+       "import-token-mismatch": "Die Sitzungsdaten sind verloren gegangen.\n\nDu wurdest eventuell abgemeldet. <strong>Bitte verifiziere, dass du noch angemeldet bist und versuche es erneut</strong>.\nFalls dies nicht funktioniert, versuche dich [[Special:UserLogout|abzumelden]] und anschließend wieder anzumelden und überprüfe, ob dein Browser Cookies von dieser Website akzeptiert.",
        "import-invalid-interwiki": "Aus dem angegebenen Wiki ist kein Import möglich.",
        "import-error-edit": "Die Seite „$1“ wurde nicht importiert, da du nicht berechtigt bist, sie zu bearbeiten.",
        "import-error-create": "Die Seite „$1“ wurde nicht importiert, da du nicht berechtigt bist, sie zu erstellen.",
        "expand_templates_generate_xml": "XML-Parser-Baum zeigen",
        "expand_templates_generate_rawhtml": "Rohes HTML anzeigen",
        "expand_templates_preview": "Vorschau",
-       "expand_templates_preview_fail_html": "<em>Da {{SITENAME}} rohes HTML aktiviert hat und es einen Verlust deiner Sitzungsdaten gab, ist die Vorschau als Vorsichtsmaßnahme gegen JavaScript-Angriffe versteckt.</em>\n\n<strong>Falls dies ein zulässiger Vorschauversuch ist, versuche es bitte erneut.</strong>\nFalls dieses Problem weiterhin bestehen bleibt, versuche dich [[Special:UserLogout|abzumelden]] und erneut anzumelden.",
+       "expand_templates_preview_fail_html": "<em>Da {{SITENAME}} rohes HTML aktiviert hat und es einen Verlust deiner Sitzungsdaten gab, ist die Vorschau als Vorsichtsmaßnahme gegen JavaScript-Angriffe versteckt.</em>\n\n<strong>Falls dies ein zulässiger Vorschauversuch ist, versuche es bitte erneut.</strong>\nFalls dieses Problem weiterhin bestehen bleibt, versuche dich [[Special:UserLogout|abzumelden]] und erneut anzumelden und überprüfe, ob dein Browser Cookies von dieser Website akzeptiert.",
        "expand_templates_preview_fail_html_anon": "<em>Da {{SITENAME}} rohes HTML aktiviert hat und du nicht angemeldet bist, ist die Vorschau als Vorsichtsmaßnahme gegen JavaScript-Angriffe versteckt.</em>\n\n<strong>Falls dies ein zulässiger Vorschauversuch ist, [[Special:UserLogin|melde dich bitte an]] und versuche es erneut.</strong>",
        "expand_templates_input_missing": "Du musst mindestens einen Eingabetext angeben.",
        "pagelanguage": "Seitensprache ändern",
index db67490..34bf9aa 100644 (file)
        "lockmanager-fail-svr-release": "Δεν ήταν δυνατή η απόκτηση κλειδωμάτων στο διακομιστή $1.",
        "zip-file-open-error": "Παρουσιάστηκε σφάλμα κατά το άνοιγμα του αρχείου για ZIP ελέγχους.",
        "zip-wrong-format": "Το καθορισμένο αρχείο δεν ήταν  αρχείο ZIP.",
-       "zip-bad": "Το Î±Ï\81Ï\87είο ÎµÎ¯Î½Î±Î¹ ÎºÎ±Ï\84εÏ\83Ï\84Ï\81αμμένο Î® Î¼Îµ Î¬Î»Î»Î¿ Ï\84Ï\81Ï\8cÏ\80ο Î¼Î· Î±Î½Î±Î³Î½Ï\8eÏ\83ιμο Î±Ï\81Ï\87είο ZIP.! N! Î\94εν Î¼Ï\80οÏ\81εί Î½Î± ÎµÎ»ÎµÎ³Ï\87θεί  δεόντως ως προς την ασφάλεια.",
+       "zip-bad": "Το Î±Ï\81Ï\87είο ÎµÎ¯Î½Î±Î¹ ÎµÎ¯Ï\84ε ÎºÎ±Ï\84εÏ\83Ï\84Ï\81αμμένο ÎµÎ¯Ï\84ε Î¼Î· Î±Î½Î±Î³Î½Ï\8eÏ\83ιμο Î±Ï\81Ï\87είο ZIP.\nÎ\94εν Î¼Ï\80οÏ\81εί Î½Î± ÎµÎ»ÎµÎ³Ï\87θεί δεόντως ως προς την ασφάλεια.",
        "zip-unsupported": "Το αρχείο είναι ένα αρχείο ZIP που χρησιμοποιεί δυνατότητες ZIP που δεν υποστηρίζονται από το MediaWiki.\nΔεν μπορεί να ελέγχθεί δεόντως για την ασφάλεια.",
        "uploadstash": "Επιφορτώστε το απόθεμα",
        "uploadstash-summary": "Η σελίδα παρέχει πρόσβαση σε αρχεία που είναι  επιφορτωμένα  (ή στη διαδικασία της επιφόρτωσης) αλλά δεν έχει ακόμη δημοσιευθεί για το wiki. Αυτά τα αρχεία δεν είναι ορατά σε  οποιονδήποτε, αλλά στο χρήστη που τα επιφόρτωσε.",
index 2e1df41..f220040 100644 (file)
        "previewnote": "<strong>Remember that this is only a preview.</strong>\nYour changes have not yet been saved!",
        "continue-editing": "Go to editing area",
        "previewconflict": "This preview reflects the text in the upper text editing area as it will appear if you choose to save.",
-       "session_fail_preview": "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>\nPlease try again.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
-       "session_fail_preview_html": "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>\n\n<em>Because {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate edit attempt, please try again.</strong>\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
+       "session_fail_preview": "Sorry! We could not process your edit due to a loss of session data.\n\nYou might have been logged out. <strong>Please verify that you're still logged in and try again</strong>.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site.",
+       "session_fail_preview_html": "Sorry! We could not process your edit due to a loss of session data.\n\n<em>Because {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate edit attempt, please try again.</strong>\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site.",
        "token_suffix_mismatch": "<strong>Your edit has been rejected because your client mangled the punctuation characters in the edit token.</strong>\nThe edit has been rejected to prevent corruption of the page text.\nThis sometimes happens when you are using a buggy web-based anonymous proxy service.",
        "edit_form_incomplete": "<strong>Some parts of the edit form did not reach the server; double-check that your edits are intact and try again.</strong>",
        "editing": "Editing $1",
        "mergehistory-empty": "No revisions can be merged.",
        "mergehistory-done": "$3 {{PLURAL:$3|revision|revisions}} of $1 {{PLURAL:$3|was|were}} merged into [[:$2]].",
        "mergehistory-fail": "Unable to perform history merge, please recheck the page and time parameters.",
-       "mergehistory-fail-toobig" : "Unable to perform history merge as more than the limit of $1 {{PLURAL:$1|revision|revisions}} would be moved.",
+       "mergehistory-fail-bad-timestamp": "Timestamp is invalid.",
+       "mergehistory-fail-invalid-source": "Source page is invalid.",
+       "mergehistory-fail-invalid-dest": "Destination page is invalid.",
+       "mergehistory-fail-no-change": "History merge did not merge any revisions. Please recheck the page and time parameters.",
+       "mergehistory-fail-permission": "Insufficient permissions to merge history.",
+       "mergehistory-fail-self-merge": "Source and destination pages are the same.",
+       "mergehistory-fail-timestamps-overlap": "Source revisions overlap or come after destination revisions.",
+       "mergehistory-fail-toobig": "Unable to perform history merge as more than the limit of $1 {{PLURAL:$1|revision|revisions}} would be moved.",
+       "mergehistory-warning-redirect-not-created": "",
        "mergehistory-no-source": "Source page $1 does not exist.",
        "mergehistory-no-destination": "Destination page $1 does not exist.",
        "mergehistory-invalid-source": "Source page must be a valid title.",
        "mergehistory-same-destination": "Source and destination pages cannot be the same",
        "mergehistory-reason": "Reason:",
        "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
+       "mergehistory-redirect-text": "",
        "mergelog": "Merge log",
        "pagemerge-logentry": "merged [[$1]] into [[$2]] (revisions up to $3)",
        "revertmerge": "Unmerge",
        "undelete-error-long": "Errors were encountered while undeleting the file:\n\n$1",
        "undelete-show-file-confirm": "Are you sure you want to view the deleted revision of the file \"<nowiki>$1</nowiki>\" from $2 at $3?",
        "undelete-show-file-submit": "Yes",
-       "undelete-revision-row": "$1 $2 ($3) $4 . . $5 $6 $7 $8 $9",
+       "undelete-revision-row2": "$1 ($2) $3 . . $4 $5 $6 $7 $8",
        "namespace": "Namespace:",
        "invert": "Invert selection",
        "tooltip-invert": "Check this box to hide changes to pages within the selected namespace (and the associated namespace if checked)",
        "import-nonewrevisions": "No revisions imported (all were either already present, or skipped due to errors).",
        "xml-error-string": "$1 at line $2, col $3 (byte $4): $5",
        "import-upload": "Upload XML data",
-       "import-token-mismatch": "Loss of session data.\nPlease try again.",
+       "import-token-mismatch": "Loss of session data.\n\nYou might have been logged out. <strong>Please verify that you're still logged in and try again</strong>.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site.",
        "import-invalid-interwiki": "Cannot import from the specified wiki.",
        "import-error-edit": "Page \"$1\" was not imported because you are not allowed to edit it.",
        "import-error-create": "Page \"$1\" was not imported because you are not allowed to create it.",
        "expand_templates_generate_xml": "Show XML parse tree",
        "expand_templates_generate_rawhtml": "Show raw HTML",
        "expand_templates_preview": "Preview",
-       "expand_templates_preview_fail_html": "<em>Because {{SITENAME}} has raw HTML enabled and there was a loss of session data, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate preview attempt, please try again.</strong>\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
+       "expand_templates_preview_fail_html": "<em>Because {{SITENAME}} has raw HTML enabled and there was a loss of session data, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate preview attempt, please try again.</strong>\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site.",
        "expand_templates_preview_fail_html_anon": "<em>Because {{SITENAME}} has raw HTML enabled and you are not logged in, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate preview attempt, please [[Special:UserLogin|log in]] and try again.</strong>",
        "expand_templates_input_missing": "You need to provide at least some input text.",
        "pagelanguage": "Change page language",
index 494033b..4ecff59 100644 (file)
                        "Cindie.Capel",
                        "ElGatoSaez",
                        "Joaquin1001",
-                       "YoViajo"
+                       "YoViajo",
+                       "Asierog"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "rcshowhidemine": "$1 mis ediciones",
        "rcshowhidemine-show": "Mostrar",
        "rcshowhidemine-hide": "Ocultar",
-       "rcshowhidecategorization": "$1 categorización de página",
+       "rcshowhidecategorization": "$1 categorización de páginas",
        "rcshowhidecategorization-show": "Mostrar",
        "rcshowhidecategorization-hide": "Ocultar",
        "rclinks": "Ver los últimos $1 cambios en los últimos $2 días.<br />$3",
        "apisandbox-retry": "Reintentar",
        "apisandbox-no-parameters": "Este módulo API no tiene parámetros.",
        "apisandbox-helpurls": "Enlaces de ayuda",
-       "apisandbox-examples": "Ejemplo",
+       "apisandbox-examples": "Ejemplos",
        "apisandbox-dynamic-parameters": "Parámetros adicionales",
        "apisandbox-dynamic-parameters-add-label": "Añadir parámetro:",
        "apisandbox-dynamic-parameters-add-placeholder": "Nombre del parámetro",
        "apisandbox-submit-invalid-fields-title": "Algunos campos no son válidos",
        "apisandbox-results": "Resultados",
        "apisandbox-sending-request": "Enviando pedido API...",
+       "apisandbox-loading-results": "Recibiendo resultados API...",
        "apisandbox-request-url-label": "URL solicitante:",
        "apisandbox-request-time": "Tiempo de solicitud: $1",
        "booksources": "Fuentes de libros",
        "listgrouprights-namespaceprotection-restrictedto": "Derechos de usuario para editar",
        "listgrants": "Subvenciones",
        "listgrants-grant": "Conceder",
-       "listgrants-rights": "Conceder",
+       "listgrants-rights": "Derechos",
        "trackingcategories": "Categorías de seguimiento",
        "trackingcategories-summary": "Esta página lista categorías de seguimiento que han sido generadas automáticamente por el software MediaWiki. Sus nombres pueden cambiarse editando su mensaje correspondiente en el espacio de nombres {{ns:8}}.",
        "trackingcategories-msg": "Categoría de seguimiento",
        "wlshowhideanons": "usuarios anónimos",
        "wlshowhidepatr": "ediciones verificadas",
        "wlshowhidemine": "mis ediciones",
-       "wlshowhidecategorization": "categorización de página",
+       "wlshowhidecategorization": "categorización de páginas",
        "watchlist-options": "Opciones de la lista de seguimiento",
        "watching": "Vigilando...",
        "unwatching": "Eliminando de la lista de seguimiento...",
index 0c3bbe5..7446bfa 100644 (file)
@@ -23,7 +23,8 @@
                        "Arkaitz Barnetik",
                        "Sator",
                        "Macofe",
-                       "Xð"
+                       "Xð",
+                       "Asierog"
                ]
        },
        "tog-underline": "Azpimarratu loturak:",
        "resetpass_submit": "Pasahitza definitu eta saioa hasi",
        "changepassword-success": "Zure pasahitza ondo aldatu da!",
        "changepassword-throttled": "Saioa hasteko saiakera gehiegi egin berri dituzu.\nBerriro saiatu aurretik $1 itxoin, mesedez.",
+       "botpasswords-label-create": "Sortu",
+       "botpasswords-label-update": "Eguneratu",
+       "botpasswords-label-cancel": "Utzi",
+       "botpasswords-label-delete": "Ezabatu",
        "resetpass_forbidden": "Ezin dira pasahitzak aldatu",
        "resetpass-no-info": "Orrialde honetara zuzenean sartzeko izena eman behar duzu.",
        "resetpass-submit-loggedin": "Pasahitza aldatu",
        "userrights": "Erabiltzaile baimenen kudeaketa",
        "userrights-lookup-user": "Erabiltzaile taldeak kudeatu",
        "userrights-user-editname": "Erabiltzaile izena idatzi:",
-       "editusergroup": "Erabiltzaile taldeak editatu",
+       "editusergroup": "{{GENDER:$1|Erabiltzaile}} taldeak editatu",
        "editinguser": "'''[[User:$1|$1]]''' $2 lankidearen erabiltzaile-eskubideak aldatzen",
        "userrights-editusergroup": "Erabiltzaile taldeak editatu",
        "saveusergroups": "Erabiltzaile taldeak gorde",
        "right-override-export-depth": "5eko sakonerararteko loturiko orrialdeak barne esportatu",
        "right-sendemail": "Beste erabiltzaileei e-posta bidali",
        "right-passwordreset": "Ikusi pasahitza berrezartze e-postak",
+       "grant-createaccount": "Kontuak sortu",
+       "grant-editmycssjs": "Zure CSS/JavaScript aldatu",
+       "grant-editmyoptions": "Aldatu zure hobespenak",
+       "grant-editmywatchlist": "Zure jarraipen zerrenda aldatu",
+       "grant-editprotected": "Babestutako orriak aldatu",
+       "grant-patrol": "Orrietako aldaketa patruilatu",
+       "grant-protect": "Orriak babestu eta babesgabetu",
        "grant-uploadfile": "Igotako fitxategi berriak",
+       "grant-basic": "Oinarrizko baimenak",
+       "grant-viewdeleted": "Ikusi ezabatutako fitxategiak eta orriak",
+       "grant-viewmywatchlist": "Zure jarraipen zerrenda ikusi",
        "newuserlogpage": "Erabiltzaile erregistroa",
        "newuserlogpagetext": "Hau azken erabiltzaileen sorreren erregistroa da.",
        "rightslog": "Erabiltzaile eskubideen erregistroa",
        "protectedpages-unknown-performer": "Erabiltzaile ezezaguna",
        "protectedtitles": "Babestutako tituluak",
        "protectedtitlesempty": "Ez dago parametro horiek dituen babesturiko izenbururik oraintxe.",
+       "protectedtitles-submit": "Izenburuak erakutsi",
        "listusers": "Erabiltzaileen zerrenda",
        "listusers-editsonly": "Aldaketak egin dituzten erabiltzaileak soilik erakutsi",
        "listusers-creationsort": "Sorrera dataren arabera sailkatu",
        "querypage-disabled": "Orrialde berezi hau desgaituta dago funtzionamendu arrazoiengatik.",
        "apihelp": "API laguntza",
        "apihelp-no-such-module": "Ez da \"$1\" modulua aurkitu.",
+       "apisandbox": "API proba orria",
+       "apisandbox-unfullscreen": "Erakutsi orria",
+       "apisandbox-submit": "Egin eskaera",
+       "apisandbox-reset": "Garbitu",
+       "apisandbox-retry": "Saiatu berriro",
+       "apisandbox-helpurls": "Laguntza estekak",
+       "apisandbox-examples": "Adibideak",
+       "apisandbox-dynamic-parameters": "Parametro gehigarriak",
+       "apisandbox-results": "Emaitzak",
        "booksources": "Iturri liburuak",
        "booksources-search-legend": "Liburuen bilaketa",
        "booksources-search": "Bilatu",
        "logempty": "Ez dago emaitzarik erregistroan.",
        "log-title-wildcard": "Testu honekin hasten diren izenburuak bilatu",
        "showhideselectedlogentries": "Erakutsi/ezkutatu aukeratutako log sarrerak",
+       "checkbox-all": "Denak",
+       "checkbox-none": "Bat ere ez",
        "allpages": "Orri guztiak",
        "nextpage": "Hurrengo orrialdea ($1)",
        "prevpage": "Aurreko orrialdea ($1)",
        "activeusers-noresult": "Ez da lankiderik aurkitu.",
        "listgrouprights": "Erabiltzaile talde eskumenak",
        "listgrouprights-summary": "Ondorengo zerrendak wikian dauden lankide taldeak agertzen dira, beraien eskubideekin.\nBadago [[{{MediaWiki:Listgrouprights-helppage}}|informazio osagarria]] banakako eskubideei buruz.",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Eskubidea emanda</span>\n* <span class=\"listgrouprights-revoked\">Eskubidea kenduta</span>",
+       "listgrouprights-key": "Legenda\n* <span class=\"listgrouprights-granted\">Eskubidea emanda</span>\n* <span class=\"listgrouprights-revoked\">Eskubidea kenduta</span>",
        "listgrouprights-group": "Taldea",
        "listgrouprights-rights": "Eskumenak",
        "listgrouprights-helppage": "Help:Talde eskumenak",
        "listgrouprights-addgroup-self-all": "Talde guztiak norbere kontura gehitu",
        "listgrouprights-removegroup-self-all": "Talde guztiak norbere kontutik ezabatu",
        "listgrouprights-namespaceprotection-namespace": "Izen-tartea",
+       "listgrants": "Diru-laguntzak",
+       "listgrants-rights": "Eskubideak",
        "trackingcategories-name": "Mezuaren izena",
        "trackingcategories-nodesc": "Ez dago deskribapenik eskuragarri.",
        "trackingcategories-disabled": "Kategoria desgaitua dago",
        "wlshowlast": "Erakutsi azken $1 orduak, azken $2 egunak",
        "watchlist-hide": "Ezkutatu",
        "watchlist-submit": "Erakutsi",
-       "wlshowtime": "Erakutsi azkenak:",
+       "wlshowtime": "Erakusteko denboraldia:",
        "wlshowhideminor": "aldaketa txikiak",
        "wlshowhidebots": "bot-ak",
        "wlshowhideliu": "Erregistratutako erabiltzaileak",
        "whatlinkshere-hidelinks": "$1 loturak",
        "whatlinkshere-hideimages": "$1 irudi loturak",
        "whatlinkshere-filters": "Iragazleak",
+       "whatlinkshere-submit": "Joan",
        "autoblockid": "Blokeo automatikoa #$1",
        "block": "Blokeatu erabiltzailea",
        "unblock": "Erabiltzailea desblokeatu",
        "javascripttest-pagetext-frameworks": "Mesedez, aukera ezazu froga eremu hauetako bat: $1",
        "javascripttest-pagetext-skins": "Aukeratu frogak egiteko itxura bat:",
        "javascripttest-qunit-intro": "Ikusi [$1 frogen dokumentazioa] mediawiki.org orrialdean.",
-       "tooltip-pt-userpage": "Nire lankide orria",
+       "tooltip-pt-userpage": "{{GENDER:|Zure lankide}} orria",
        "tooltip-pt-anonuserpage": "Zure IParen lankide orrialdea",
-       "tooltip-pt-mytalk": "Nire eztabaida orria",
+       "tooltip-pt-mytalk": "{{GENDER:|Zure}} eztabaida orria",
        "tooltip-pt-anontalk": "Zure IParen eztabaida",
-       "tooltip-pt-preferences": "Nire hobespenak",
+       "tooltip-pt-preferences": "{{GENDER:|Zure}} hobespenak",
        "tooltip-pt-watchlist": "Jarraitzen dituzun orrialdeen zerrenda.",
        "tooltip-pt-mycontris": "Nire ekarpenen zerrenda",
        "tooltip-pt-anoncontribs": "IP helbide honetatik egindako aldaketen zerrenda",
        "watchlisttools-edit": "Zerrenda ikusi eta aldatu",
        "watchlisttools-raw": "Zerrenda idatziz aldatu",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|eztabaida]])",
+       "timezone-local": "Lokala",
        "duplicate-defaultsort": "Adi: Berezko \"$2\" antolatzeak aurreko berezko \"$1\" antolatzea gainditzen du.",
        "version": "Bertsioa",
        "version-extensions": "Instalatutako luzapenak",
        "pagelang-language": "Hizkuntza",
        "pagelang-use-default": "Hizkuntza lehenetsia erabili",
        "pagelang-select-lang": "Hizkuntza aukeratu",
+       "pagelang-submit": "Bidali",
        "right-pagelang": "Aldatu orrialdearen hizkuntza",
        "action-pagelang": "orrialdearen hizkuntza aldatu",
        "log-name-pagelang": "Hizkuntza aldatu:",
        "mw-widgets-dateinput-no-date": "Ez duzu datarik aukeratu",
        "mw-widgets-titleinput-description-new-page": "orri hori oraindik ez da existitzen",
        "mw-widgets-titleinput-description-redirect": "$1ra birzuzendu",
-       "api-error-blacklisted": "Aukera ezazu, mesedez, izenburu ezberdin eta deskriptiboago bat."
+       "api-error-blacklisted": "Aukera ezazu, mesedez, izenburu ezberdin eta deskriptiboago bat.",
+       "sessionprovider-generic": "$1 sesio"
 }
index ce5dd2c..6adc790 100644 (file)
@@ -48,7 +48,8 @@
                        "Macofe",
                        "Danialbehzadi",
                        "MRG90",
-                       "Mahdy Saffar"
+                       "Mahdy Saffar",
+                       "Arian Ar"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
@@ -73,7 +74,7 @@
        "tog-enotifwatchlistpages": "اگر صفحه یا پرونده‌ای از فهرست پی‌گیری‌هایم ویرایش شد به من ایمیلی فرستاده شود",
        "tog-enotifusertalkpages": "هنگامی که در صفحهٔ بحث کاربری‌ام تغییری صورت می‌گیرد به من ایمیلی فرستاده شود",
        "tog-enotifminoredits": "برای تغییرات جزئی در صفحه‌ها و پرونده‌ها هم به من ایمیلی فرستاده شود",
-       "tog-enotifrevealaddr": "Ù\86شاÙ\86Û\8c Ù¾Ø³Øª Ø§Ù\84کترÙ\88Ù\86Û\8cÚ©Û\8c Ù\85Ù\86 Ø±Ø§ Ø¯Ø± Ø§Û\8cÙ\85Û\8cÙ\84â\80\8cÙ\87اÛ\8c Ø§Ø·Ù\84اعâ\80\8cرساÙ\86Û\8c Ù\87Ù\88Û\8cدا Ú¯Ø±Ø¯Ø¯",
+       "tog-enotifrevealaddr": "نشانی پست الکترونیکی من در ایمیل‌های اطلاع‌رسانی هویدا گردد",
        "tog-shownumberswatching": "شمار کاربران پی‌گیرندهٔ نمایش یابد",
        "tog-oldsig": "امضای کنونی:",
        "tog-fancysig": "امضا به صورت ویکی‌متن در نظر گرفته شود (بدون درج خودکار پیوند)",
        "create-this-page": "ایجاد این صفحه",
        "delete": "حذف",
        "deletethispage": "حذف این صفحه",
-       "undeletethispage": "بازگرداÙ\86ی این صفحه",
+       "undeletethispage": "احÛ\8cای این صفحه",
        "undelete_short": "احیای {{PLURAL:$1|یک ویرایش|$1 ویرایش}}",
        "viewdeleted_short": "نمایش {{PLURAL:$1|یک ویرایش حذف‌شده|$1 ویرایش حذف‌شده}}",
        "protect": "محافظت",
        "previewnote": "'''به یاد داشته باشید که این فقط پیش‌نمایش است.'''\nتغییرات شما هنوز ذخیره نشده‌است!",
        "continue-editing": "رفتن به قسمت ویرایش",
        "previewconflict": "این پیش‌نمایش منعکس‌کنندهٔ متن ناحیهٔ ویرایش متن بالایی است، به شکلی که اگر متن را ذخیره کنید نمایش خواهد یافت.",
-       "session_fail_preview": "'''شرمنده! به علت از دست رفتن اطلاعات نشست کاربری نمی‌توانیم ویرایش شما را پردازش کنیم.'''\nلطفاً دوباره سعی کنید.\nاگر دوباره به همین پیام برخوردید از سامانه [[Special:UserLogout|خارج شوید]] و دوباره وارد شوید.",
-       "session_fail_preview_html": "'''متأسفانه امکان ثبت ویرایش شما به خاطر از دست رفتن اطلاعات نشست کاربری وجود ندارد.'''\n\n''با توجه به این که در {{SITENAME}} امکان درج اچ‌تی‌ام‌ال خام فعال است، پیش‌نمایش صفحه پنهان شده تا امکان حملات مبتنی بر جاوااسکریپت وجود نداشته باشد.''\n\n'''اگر مطمئن هستید که این پیش‌نمایش یک ویرایش مجاز است، آن را تکرار کنید.'''\nاگر تکرار پیش‌نمایش نتیجه نداد، از سامانه [[Special:UserLogout|خارج شوید]] و دوباره وارد شوید.",
+       "session_fail_preview": "شرمنده! به علت از دست رفتن اطلاعات نشست کاربری نمی‌توانیم ویرایش شما را پردازش کنیم.\nاحتمالا شما از سامانه خارج شده‌اید.'''لطفا از اینکه وارد سامانه شده‌اید اطمینان حاصل کرده و دوباره امتحان کنید'''.\nاگر دوباره به همین پیام برخوردید از سامانه [[Special:UserLogout|خارج شوید]]، دوباره وارد شوید، و از این‌ که مرورگر شما اجازه دریافت کوکی از این وب‌گاه را می‌دهد اطمینان حاصل کنید.",
+       "session_fail_preview_html": "'''متأسفانه امکان ثبت ویرایش شما به خاطر از دست رفتن اطلاعات نشست کاربری وجود ندارد.'''\n\n''با توجه به این که در {{SITENAME}} امکان درج اچ‌تی‌ام‌ال خام فعال است، پیش‌نمایش صفحه پنهان شده تا امکان حملات مبتنی بر جاوااسکریپت وجود نداشته باشد.''\n\n'''اگر مطمئن هستید که این پیش‌نمایش یک ویرایش مجاز است، آن را تکرار کنید.'''\nاگر تکرار پیش‌نمایش نتیجه نداد، از سامانه [[Special:UserLogout|خارج شوید]] و دوباره وارد شوید و از این‌ که مرورگر شما اجازه دریافت کوکی از این وب‌گاه را می‌دهد اطمینان حاصل کنید.",
        "token_suffix_mismatch": "'''ویرایش شما ذخیره نشد، زیرا مرورگر شما نویسه‌های نقطه‌گذاری را در کد امنیتی ویرایش از هم پاشیده‌است.'''\nویرایش شما مردود شد تا از خراب شدن متن صفحه جلوگیری شود.\nگاهی این اشکال زمانی پیش می‌آید که شما از یک پروکسی تحت وب استفاده کنید.",
        "edit_form_incomplete": "'''بعضی قسمت‌های فرم ویرایش به سرور نرسیدند؛ اطمینان حاصل کنید که ویرایش‌های شما کامل است و دوباره تلاش کنید.'''",
        "editing": "در حال ویرایش $1",
        "mergehistory-empty": "هیچ‌یک از نسخه‌ها قابل ادغام نیستند.",
        "mergehistory-done": "$3 نسخه از $1 در [[:$2]] ادغام شد.",
        "mergehistory-fail": "ادغام تاریخچه ممکن نیست، لطفاً گزینه‌های صفحه و زمان را بازبینی کنید.",
+       "mergehistory-fail-bad-timestamp": "برچسب زمانی نامعتبر است.",
+       "mergehistory-fail-invalid-source": "صفحه مبدا نامعتبر است.",
+       "mergehistory-fail-invalid-dest": "صفحه مقصد نامعتبر است.",
+       "mergehistory-fail-no-change": "ادغام تاریخچه هیچ‌ کدام از  نسخه ها را ادغام نکرد. لطفا پارامتر های زمانی و صفحه را مجددا کنترل کنید.",
+       "mergehistory-fail-permission": "مجوزهای ناکافی برای ادغام تاریخچه.",
+       "mergehistory-fail-self-merge": "صفحهٔ مبدأ و مقصد یکی است.",
+       "mergehistory-fail-timestamps-overlap": "نسخه های منبع هم‌پوشانی دارند یا بعد از نسخه های مقصد آمده‌اند.",
        "mergehistory-fail-toobig": "نمی‌توان ادغام تاریخچه را انجام داد که بیشتر از محدودیت $1 {{PLURAL:$1|نسخه}} انتقال داده خواهد شد.",
        "mergehistory-no-source": "صفحهٔ مبدأ $1 وجود ندارد.",
        "mergehistory-no-destination": "صفحهٔ مقصد $1 وجود ندارد.",
        "uploaded-hostile-svg": "سی‌اس‌اس نا امن در عنصر سبک پروندهٔ بارگذاری شدهٔ اس‌وی‌جی یافت شد.",
        "uploaded-event-handler-on-svg": "قرار دادن ویژگی‌های مدیریت رویداد <code>$1=\"$2\"</code> در پرونده‌های اس‌وی‌جی مجاز نیست.",
        "uploaded-href-attribute-svg": "ویژگی‌های href در پرونده‌های SVG فقط برای اهدافhttp:// &lrm; وhttps:// &lrm; مجاز هستند، <code>&lt;$1 $2=\"$3\"&gt;</code> یافت شد.",
-       "uploaded-href-unsafe-target-svg": "در Ù¾Ø±Ù\88Ù\86دÙ\87 SVG Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û\8câ\80\8cشدÙ\87 Ø¨Ø±Ø§Û\8c Ù\87دÙ\81 Ù\86ادرست <code>&lt;$1 $2=\"$3\"&gt;</code> Ø¨Ø±Ú\86سب href یافت شد.",
+       "uploaded-href-unsafe-target-svg": "در Ù¾Ø±Ù\88Ù\86دÙ\87 SVG Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û\8câ\80\8cشدÙ\87 Ø¨Ø±Ø§Û\8c Ù\86شاÙ\86Û\8c Ù\87دÙ\81 <code>&lt;$1 $2=\"$3\"&gt;</code> Ø¨Ø±Ú\86سب href Ø¨Ù\87 Ø§Ø·Ù\84اعات Ù\86ااÙ\85Ù\86 یافت شد.",
        "uploaded-animate-svg": "برچسب  \"animate\" یافت شده ممکن است herf را تغییر دهد. از مشخصه \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> در پرونده SVG بارگذاری‌شده استفاده کنید.",
        "uploaded-setting-event-handler-svg": "تنظیمات مشخصه گرداننده رویداد بسته شده‌است. کد <code>&lt;$1 $2=\"$3\"&gt;</code>  در پرونده بارگذاری‌شده یافت شد.",
        "uploaded-setting-href-svg": "استفاده از برچسب \"set\" برای افزودن مشخصهٔ \"href\" به عنصر والد بسته شده",
        "upload-too-many-redirects": "نشانی اینترتی حاوی تعداد بیش از اندازه‌ای تغییرمسیر است",
        "upload-http-error": "یک خطای اچ‌تی‌تی‌پی رخ داد: $1",
        "upload-copy-upload-invalid-domain": "بارگذاری کپی پرونده‌ها از این دامنه امکان‌پذیر نیست.",
+       "upload-foreign-cant-upload": "این ویکی برای بارگذاری پرونده ها در مخزن پرونده های خارجی درخواست شده پیکربندی نشده است.",
        "upload-dialog-title": "بارگذاری پرونده",
        "upload-dialog-button-cancel": "لغو",
        "upload-dialog-button-done": "انجام شد",
        "apihelp-no-such-module": "پودمان \" $1 \" یافت نشد.",
        "apisandbox": "گودال ماسه‌بازی رابط برنامه‌نویسی",
        "apisandbox-api-disabled": "رابط برنامه‌نویسی در این تارنما غیرفعال شده‌است.",
-       "apisandbox-intro": "از این صفحه برای آزمایش '''خدمات وب API مدیاویکی''' استفاده کنید.\nبرای جزئیات بیشتر دربارهٔ نحوهٔ استفاده از API به [//www.mediawiki.org/wiki/API:Main_page مستندات API] رجوع کنید. مثال: [//www.mediawiki.org/wiki/API#A_simple_example دریافت محتوای صفحهٔ اصلی]. برای دیدن مثال‌های بیشتر عملکردی را انتخاب کنید.",
+       "apisandbox-intro": "از این صفحه برای آزمایش <strong>خدمات وب API مدیاویکی</strong> استفاده کنید.\nبرای جزئیات بیشتر دربارهٔ نحوهٔ استفاده از API به [[mw:API:Main page|مستندات API]] رجوع کنید. مثال: [//www.mediawiki.org/wiki/API#A_simple_example دریافت محتوای صفحهٔ اصلی]. برای دیدن مثال‌های بیشتر عملکردی را انتخاب کنید.",
+       "apisandbox-fullscreen": "گسترش پنل",
+       "apisandbox-unfullscreen": "نمایش صفحه",
        "apisandbox-submit": "ایجاد درخواست",
        "apisandbox-reset": "پاک‌کردن",
-       "apisandbox-examples": "مثال",
-       "apisandbox-results": "نتیجه",
+       "apisandbox-retry": "تلاش مجدد",
+       "apisandbox-helpurls": "پیوندهای راهنمایی",
+       "apisandbox-examples": "مثال‌ها",
+       "apisandbox-dynamic-parameters": "پارامترهای بیشتر",
+       "apisandbox-dynamic-parameters-add-label": "افزودن پارامتر:",
+       "apisandbox-dynamic-parameters-add-placeholder": "نام پارامتر",
+       "apisandbox-deprecated-parameters": "پارامتر های نامناسب",
+       "apisandbox-submit-invalid-fields-message": "لطفا موارد مشخص شده را اصلاح کرده و دوباره امتحان کنید.",
+       "apisandbox-results": "نتیجه‌ها",
+       "apisandbox-sending-request": "ارسال درخواست ای‌پی‌آی...",
+       "apisandbox-loading-results": "دریافت درخواست‌های ای‌پی‌آی...",
        "apisandbox-request-url-label": "درخواست آدرس:",
-       "apisandbox-request-time": "زمان درخواست: $1",
+       "apisandbox-request-time": "زمان درخواست: {{PLURAL:$1|$1 ms}}",
        "booksources": "منابع کتاب",
        "booksources-search-legend": "جستجوی منابع کتاب",
        "booksources-isbn": "شابک:",
        "lockedbyandtime": "(به وسیلهٔ $1 در $2 ساعت $3)",
        "move-page": "انتقال $1",
        "move-page-legend": "انتقال صفحه",
-       "movepagetext": "با استفاده از فرم زیر نام صفحه تغییر خواهد کرد، و تمام تاریخچه‌اش به نام جدید منتقل خواهد شد.\nعنوان قدیمی تبدیل به یک صفحهٔ تغییرمسیر به عنوان جدید خواهد شد.\nشما می‌توانید تغییرمسیرهایی که به عنوان اصلی اشاره دارند را به صورت خودکار به‌روزرسانی کنید.\nپیوندهای که به عنوان صفحهٔ قدیمی وجود دارند، تغییر نخواهند کرد؛ حتماً تغییرمسیرهای [[Special:DoubleRedirects|دوتایی]] یا [[Special:BrokenRedirects|خراب]] را بررسی کنید.\n'''شما''' مسئول اطمینان از این هستید که پیوندها هنوز به همان‌جایی که قرار است بروند.\n\nتوجه کنید که اگر از قبل صفحه‌ای در عنوان جدید وجود داشته باشد صفحه منتقل '''نخواهد شد'''،\nمگر این آخرین ویرایش تغییرمسیر باشد و در  تاریخچهٔ ویرایشی نداشته باشد.\nاین یعنی اگر اشتباه کردید می‌توانید صفحه را به همان جایی که از آن منتقل شده بود برگردانید، و این که نمی‌توانید روی صفحات موجود بنویسید.\n\n'''هشدار!'''\nانتقال صفحات به نام جدید ممکن است تغییر اساسی و غیرمنتظره‌ای برای صفحات محبوب باشد؛\nلطفاً مطمئن شوید که قبل از انتقال دادن صفحه، عواقب این کار را درک می‌کنید.",
-       "movepagetext-noredirectfixer": "استفاده از فرم زیر سبب تغییر نام یک صفحه و انتقال تمام تاریخچهٔ آن به نام جدید می‌شود.\nعنوان پیشین تغییرمسیری به عنوان جدید خواهد شد.\nبه خاطر داشته باشید که [[Special:DoubleRedirects|تغییرمسیرهای دوتایی]] یا [[Special:BrokenRedirects|تغییرمسیرهای خراب]] را بررسی کنید.\nشما مسئولید که مطمئن شوید پس از انتقال، پیوندها به عنوان پیشین به جایی منتهی می‌شوند که باید.\n\nتوجه کنید که اگر صفحه‌ای تحت عنوان جدید از قبل موجود باشد، انتقال انجام '''نخواهد شد'''، مگر اینکه صفحه خالی و یا تغییرمسیر باشد و تاریخچهٔ ویرایشی دیگری نداشته باشد.\nاین یعنی اگر صفحه را به نامی اشتباه منتقل کردید می‌توانید این تغییر را واگردانی کنید، اما نمی‌توانید یک صفحه را به صفحه‌ای که از قبل موجود است انتقال دهید.\n\n'''هشدار!'''\nانتقال صفحه‌های پربیننده ممکن است عملی غیرمنتظره باشد؛\nلطفاً پیش از انتقال مطمئن شوید از نتیجهٔ کار آگاهید.",
+       "movepagetext": "با استفاده از فرم زیر نام صفحه تغییر خواهد کرد، و تمام تاریخچه‌اش به نام جدید منتقل خواهد شد.\nعنوان قدیمی تبدیل به یک صفحهٔ تغییرمسیر به عنوان جدید خواهد شد.\nشما می‌توانید تغییرمسیرهایی که به عنوان اصلی اشاره دارند را به صورت خودکار به‌روزرسانی کنید.\nپیوندهای که به عنوان صفحهٔ قدیمی وجود دارند، تغییر نخواهند کرد؛ حتماً تغییرمسیرهای [[Special:DoubleRedirects|دوتایی]] یا [[Special:BrokenRedirects|خراب]] را بررسی کنید.\n'''شما''' مسئول اطمینان از این هستید که پیوندها هنوز به همان‌جایی که قرار است بروند.\n\nتوجه کنید که اگر از قبل صفحه‌ای در عنوان جدید وجود داشته باشد صفحه منتقل '''نخواهد شد'''،\nمگر این آخرین ویرایش تغییرمسیر باشد و در  تاریخچهٔ ویرایشی نداشته باشد.\nاین یعنی اگر اشتباه کردید می‌توانید صفحه را به همان جایی که از آن منتقل شده بود برگردانید، و این که نمی‌توانید روی صفحات موجود بنویسید.\n\n<strong>توضیح:</strong>\nانتقال صفحات به نام جدید ممکن است تغییر اساسی و غیرمنتظره‌ای برای صفحات محبوب باشد؛\nلطفاً مطمئن شوید که قبل از انتقال دادن صفحه، عواقب این کار را درک می‌کنید.",
+       "movepagetext-noredirectfixer": "استفاده از فرم زیر سبب تغییر نام یک صفحه و انتقال تمام تاریخچهٔ آن به نام جدید می‌شود.\nعنوان پیشین تغییرمسیری به عنوان جدید خواهد شد.\nبه خاطر داشته باشید که [[Special:DoubleRedirects|تغییرمسیرهای دوتایی]] یا [[Special:BrokenRedirects|تغییرمسیرهای خراب]] را بررسی کنید.\nشما مسئولید که مطمئن شوید پس از انتقال، پیوندها به عنوان پیشین به جایی منتهی می‌شوند که باید.\n\nتوجه کنید که اگر صفحه‌ای تحت عنوان جدید از قبل موجود باشد، انتقال انجام '''نخواهد شد'''، مگر اینکه صفحه خالی و یا تغییرمسیر باشد و تاریخچهٔ ویرایشی دیگری نداشته باشد.\nاین یعنی اگر صفحه را به نامی اشتباه منتقل کردید می‌توانید این تغییر را واگردانی کنید، اما نمی‌توانید یک صفحه را به صفحه‌ای که از قبل موجود است انتقال دهید.\n\n<strong>توضیح:</strong>\nانتقال صفحه‌های پربیننده ممکن است عملی غیرمنتظره باشد؛\nلطفاً پیش از انتقال مطمئن شوید از نتیجهٔ کار آگاهید.",
        "movepagetalktext": "اگر این گزینه را انتخاب کنید، صفحهٔ بحث مرتبط به صورت خودکار انتقال داده می‌شود به عنوان جدید و در صورت عدم انتخاب گزینه، صفحهٔ بحث جدید یک صفحهٔ خالی خواهد بود و در این حالت، باید صفحه را بطور دستی انتقال داده و یا محتویات دو صفحه را با ویرایش ادغام کنید.",
        "moveuserpage-warning": "'''هشدار:''' شما در حال انتقال دادن یک صفحهٔ کاربر هستید. توجه داشته باشید که تنها صفحه منتقل می‌شود و نام کاربر تغییر '''نمی‌یابد'''.",
        "movecategorypage-warning": "<strong>هشدار:</strong> شما در حال انتقال صفحه رده هستید. لطفاً توجه داشته باشید که فقط صفحه منتقل خواهد شد و  صفحات در رده قدیمی می‌مانند و به رده جدید <em>نمی‌روند</em>.",
        "movenosubpage": "این صفحه هیچ زیرصفحه‌ای ندارد.",
        "movereason": "دلیل:",
        "revertmove": "واگردانی",
-       "delete_and_move_text": "== نیاز به حذف ==\n\nمقالهٔ مقصد «[[:$1]]» وجود دارد. آیا می‌خواهید آن را حذف کنید تا انتقال ممکن شود؟",
+       "delete_and_move_text": "مقالهٔ مقصد «[[:$1]]» وجود دارد. آیا می‌خواهید آن را حذف کنید تا انتقال ممکن شود؟",
        "delete_and_move_confirm": "بله، صفحه حذف شود",
        "delete_and_move_reason": "حذف برای ممکن‌شدن انتقال  «[[$1]]»",
        "selfmove": "عنوان‌های صفحهٔ مبدأ و مقصد یکی است؛\nانتقال صفحه به خودش ممکن نیست.",
        "move-leave-redirect": "بر جا گذاشتن یک تغییرمسیر",
        "protectedpagemovewarning": "'''هشدار:''' این صفحه قفل شده‌است به طوری که تنها کاربران با دسترسی مدیریت می‌توانند آن را انتقال دهند.\nآخرین موارد سیاهه در زیر آمده است:",
        "semiprotectedpagemovewarning": "'''تذکر:''' این صفحه قفل شده‌است به طوری که تنها کاربران ثبت نام کرده می‌توانند آن را انتقال دهند.\nآخرین موارد سیاهه در زیر آمده است:",
-       "move-over-sharedrepo": "== پرونده موجود است ==\n[[:$1]] در یک مخزن مشترک وجود دارد. انتقال یک پرونده به این نام باعث باطل شدن پرونده مشترک خواهد شد.",
+       "move-over-sharedrepo": "[[:$1]] در یک مخزن مشترک وجود دارد. انتقال یک پرونده به این نام باعث باطل شدن پرونده مشترک خواهد شد.",
        "file-exists-sharedrepo": "نام پرونده انتخاب شده از قبل در یک مخزن مشترک استفاده شده‌است.\nلطفاً یک نام دیگر برگزینید.",
        "export": "برون‌بری صفحات",
        "exporttext": "شما می‌توانید متن و تاریخچهٔ ویرایش یک صفحهٔ مشخص یا مجموعه‌ای از صفحات را به شکل پوشیده در اکس‌ام‌ال برون‌بری کنید.\nاین اطلاعات را می‌توان در ویکی دیگری که نرم‌افزار «مدیاویکی» را اجرا می‌کند از طریق [[Special:Import|صفحهٔ درون‌ریزی]] وارد کرد.\n\nبرای برون‌بری صفحات، عنوان آن‌ها را در جعبهٔ زیر وارد کنید (در هر سطر فقط یک عنوان) و مشخص کنید که آیا نسخهٔ اخیر صفحه را به همراه نسخه‌های قدیمی‌تر و تاریخچهٔ صفحه می‌خواهید، یا تنها نسخهٔ اخیر صفحه و اطلاعات آخرین ویرایش را می‌خواهید.\n\nدر حالت دوم، شما می‌توانید از یک پیوند استفاده کنید، مثلاً [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] برای صفحهٔ «[[{{MediaWiki:Mainpage}}]]».",
        "import-nonewrevisions": "نسخه‌ای درون‌ریزی نشد (همه یا در حال حاضر وجود دارند، یا به دلیل خطا‌ها نادیده گرفته شده‌اند).",
        "xml-error-string": "$1 در سطر $2، ستون $3 (بایت $4): $5",
        "import-upload": "بارگذاری داده اکس‌ام‌ال",
-       "import-token-mismatch": "از دست رفتن اطلاعات نشست کاربری. لطفاً دوباره امتحان کنید.",
+       "import-token-mismatch": "از دست رفتن اطلاعات نشست کاربری.\n\nاحتمالا شما از سامانه خارج شده‌اید.'''لطفا از اینکه وارد سامانه شده‌اید اطمینان حاصل کرده و دوباره امتحان کنید'''.\nاگر دوباره به همین پیام برخوردید از سامانه [[Special:UserLogout|خارج شوید]]، دوباره وارد شوید، و از این‌ که مرورگر شما اجازه دریافت کوکی از این وب‌گاه را می‌دهد اطمینان حاصل کنید.",
        "import-invalid-interwiki": "از ویکی مشخص شده نمی‌توان درون‌ریزی انجام داد.",
        "import-error-edit": "صفحهٔ «$1» وارد نشد، چون شما مجاز به ویرایش آن نیستید.",
        "import-error-create": "صفحهٔ «$1» وارد نشد، چون شما مجاز به ایجاد آن نیستید.",
        "lastmodifiedatby": "این صفحه آخرین بار در $2، $1 به دست $3 تغییر یافته‌است.",
        "othercontribs": "بر اساس اثری از $1",
        "others": "دیگران",
-       "siteusers": "$1، {{PLURAL:$2|کاربر|کاربران}} {{SITENAME}}",
+       "siteusers": "{{SITENAME}}{{PLURAL:$2|{{GENDER:$1|کاربر}}|کاربر}} $1",
        "anonusers": "$1 {{PLURAL:$2|کاربر|کاربران}} ناشناس {{SITENAME}}",
        "creditspage": "اعتبارات این صفحه",
        "nocredits": "اطلاعات سازندگان این صفحه موجود نیست.",
        "expand_templates_generate_xml": "نمایش درخت تجزیهٔ XML",
        "expand_templates_generate_rawhtml": "نمایش اچ‌تی‌ام‌ال خام",
        "expand_templates_preview": "پیش‌نمایش",
-       "expand_templates_preview_fail_html": "<em>زیرا {{SITENAME}} تا به HTML خام فعال و یک دست رفتن اطلاعات نشست وجود دارد، پیش نمایش به عنوان یک اقدام احتیاطی در برابر حملات جاوا اسکریپت پنهان است.</em>\n\n<strong>اگر این تلاش پیشنمایش مشروع است، لطفا دوباره سعی کنید. اگر هنوز کار نمی کند، سعی کنید [[Special:UserLogout|خروج از سیستم]] را کلیک نموده و دوباره وارد شوید.",
+       "expand_templates_preview_fail_html": "<em>زیرا {{SITENAME}} تا به HTML خام فعال و یک دست رفتن اطلاعات نشست وجود دارد، پیش نمایش به عنوان یک اقدام احتیاطی در برابر حملات جاوا اسکریپت پنهان است.</em>\n\n<strong>اگر این تلاش پیش‌نمایش مشروع است، لطفا دوباره سعی کنید. اگر هنوز کار نمی کند، سعی کنید [[Special:UserLogout|خروج از سیستم]] را کلیک نموده و دوباره وارد شوید، و از این‌ که مرورگر شما اجازه دریافت کوکی از این وب‌گاه را می‌دهد اطمینان حاصل کنید.",
        "expand_templates_preview_fail_html_anon": "<em>زیرا {{SITENAME}} تا به HTML خام فعال و یک دست رفتن اطلاعات نشست وجود دارد، پیش نمایش به عنوان یک اقدام احتیاطی در برابر حملات جاوا اسکریپت پنهان است.</em>\n\n<strong>اگر این تلاش پیشنمایش مشروع است، لطفا دوباره سعی کنید. اگر هنوز کار نمی کند، سعی کنید [[Special:UserLogout|خروج از سیستم]] را کلیک نموده و دوباره وارد شوید.",
        "expand_templates_input_missing": "شما نیازمندید که حداقل متن‌هایی را برای وارد کردن تهیه کنید.",
-       "pagelanguage": "صÙ\81Ø­Ù\87 Ø§Ù\86تخاب Ø²Ø¨Ø§Ù\86",
+       "pagelanguage": "تغÛ\8cÛ\8cر Ø²Ø¨Ø§Ù\86 ØµÙ\81Ø­Ù\87",
        "pagelang-name": "صفحه",
        "pagelang-language": "زبان",
        "pagelang-use-default": "استفاده از زبان پیش‌فرض",
        "pagelang-submit": "اعمال",
        "right-pagelang": "تغییر صفحهٔ زبان",
        "action-pagelang": "تغییر زبان صفحه",
-       "log-name-pagelang": "تغÛ\8cÛ\8cر Ø³Û\8cاÙ\87Ù\87Ù\94 زبان",
+       "log-name-pagelang": "سÛ\8cاÙ\87Ù\87Ù\94 ØªØºÛ\8cÛ\8cر زبان",
        "log-description-pagelang": "این سیاههٔ تغییرات صفحهٔ زبان‌ها است.",
-       "logentry-pagelang-pagelang": "$1 {{GENDER:$2| تغییریافت}} زبان صفحه برای  $3  از  $4  به  $5 .",
+       "logentry-pagelang-pagelang": "$1 زبان $3  از  $4  به  $5 {{GENDER:$2| تغییریافت}}",
        "default-skin-not-found": "اوه! پوسته پیش‌فرض برای ویکی شما تعریف‌شده در <code dir=\"ltr\"<$wgDefaultSkin</code> به عنوان <code>$1</code>، در دسترس نیست.\n\nبه نظر می‌آید نصب شما شامل پوسته‌های زیر می‌شود. [https://www.mediawiki.org/wiki/Manual:Skin_configuration راهنما: تنظیمات پوسته] را برای کسب اطلاعات در باره چگونگی فعال‌ساختن آن‌ها و انتخاب پیش‌فرض ببینید.\n\n$2\n\n; اگر اخیراً مدیاویکی را نصب کرده‌اید:\n: احتمالاً از گیت، یا به طور مستقیم از کد مبدأ که از چند متد دیگر استفاده می‌کند نصب کردید. انتظار می‌رود. چند {{PLURAL:$4|پوسته|پوسته}} از [https://www.mediawiki.org/wiki/Category:All_skins فهرست پوسته mediawiki.org] نصب کنید، که همراه چندین پوسته و افزونه هستند. شما می‌توانید شاخه <code>skins/</code> را از آن نسخه‌برداری کرده و بچسبانید.\n\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins استفاده از گیت برای دریافت پوسته‌ها].\n: انجام این کار با مخزن گیت‌تان تداخل نمی‌کند اگر توسعه‌دهنده مدیاویکی هستید.\n\n; اگر اخیراً مدیاویکی را ارتقاء دادید:\n: مدیاویکی ۱٫۲۴ و تازه‌تر دیگر به طور خودکار پوسته‌های نصب‌شده را فعال نمی‌کند ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery راهنما: کشف خودکار پوسته] را ببینید). شما می‌توانید خطوط زیر را به داخل <code>LocalSettings.php</code> بچسبانید تا {{PLURAL:$5|همه|همه}} پوسته‌های نصب‌شده را فعال کنید:\n\n<pre dir=\"ltr\">$3</pre>\n\n; اگر اخیراً <code>LocalSettings.php</code> را تغییر دادید:\n: نام پوسته‌ها را برای غلط املایی دوباره بررسی کنید.",
        "default-skin-not-found-no-skins": "پوستهٔ پیش‌فرض برای ویکی شما تعریف‌شده در<code>$wgDefaultSkin</code> به عنوان <code>$1</code>، هست موجود نیست.\n\nشما پوسته‌ها را نصب نکرده‌اید.\n\n:اگر مدیاویکی را به‌روز یا نصب کرده‌اید:\n:ممکن است از گیت یا از کد منبع با روش‌های دیگر نصب کرده‌اید. انتظار می‌رود MediaWiki 1.24 یا جدیدتر در پوشهٔ اصلی هیچ پوسته‌ای نداشته باشند.\nسعی کنید تعدادی پوسته از [https://www.mediawiki.org/wiki/Category:All_skins پوشهٔ پوسته‌های مدیاویکی]، با:\n:*دریافت [https://www.mediawiki.org/wiki/Download نصب‌کننده تاربال]، که با چندین پوسته و افزونه هست. شما می توانید پوستهٔ <code>skins/</code> را از آن کپی و پیست کنید.\n:*کلون کردن یکی از <code dir=\"ltr\">mediawiki/skins/*</code> از مخزن در پوشهٔ <code>skins/</code> مدیاویکی‌تان.\n:اگر توسعه‌دهندهٔ مدیاویکی هستید، انجام این کار نباید تعارضی با مخزن گیت شما داشته باشد. برای اطلاعات بیشتر و فعال کردن پوسته‌ها و انتخاب آنها به عنوان پیش‌فرض [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: تنظیمات پوسته] را مشاهده کنید.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (فعال)",
index 42f65fa..3e3a3dc 100644 (file)
@@ -85,7 +85,7 @@
        "tog-watchlistreloadautomatically": "Päivitä tarkkailulista automaattisesti aina kun jotakin suodatinta on muutettu (vaatii JavaScriptiä)",
        "tog-watchlisthideanons": "Piilota rekisteröitymättömien käyttäjien muokkaukset tarkkailulistalta",
        "tog-watchlisthidepatrolled": "Piilota muutostentarkastajien hyväksymät muokkaukset tarkkailulistalta",
-       "tog-watchlisthidecategorization": "Piilota muutokset, jotka koskevat sivujeen lisäämistä tai poistamista luokkiin",
+       "tog-watchlisthidecategorization": "Piilota sivujen luokitusmuutokset",
        "tog-ccmeonemails": "Lähetä minulle kopio MediaWikin kautta lähetetyistä sähköposteista",
        "tog-diffonly": "Älä näytä sivun sisältöä eroavaisuusvertailun alapuolella",
        "tog-showhiddencats": "Näytä piilotetut luokat",
        "changepassword-throttled": "Olet tehnyt liian monta äskettäistä kirjautumisyritystä.\nOdota $1 ennen kuin yrität uudelleen.",
        "botpasswords": "Botin salasanat",
        "botpasswords-disabled": "Botin salasanat on poistettu käytöstä.",
+       "botpasswords-label-create": "Luo",
+       "botpasswords-label-update": "Päivitä",
+       "botpasswords-label-cancel": "Peruuta",
+       "botpasswords-label-delete": "Poista",
+       "botpasswords-label-resetpassword": "Uudista salasana",
+       "botpasswords-label-grants": "Valittavissa olevat toimintaoikeudet:",
        "resetpass_forbidden": "Salasanoja ei voi vaihtaa.",
        "resetpass-no-info": "Et voi nähdä tätä sivua kirjautumatta sisään.",
        "resetpass-submit-loggedin": "Muuta salasana",
        "mergehistory-empty": "Mitään versioita ei voida yhdistää.",
        "mergehistory-done": "$3 {{PLURAL:$3|versio|versiota}} sivusta $1 yhdistettiin onnistuneesti sivuun [[:$2]].",
        "mergehistory-fail": "Sivuhistorioiden yhdistämistä ei voida suorittaa. Tarkista lähde- ja kohdesivujen nimet sekä versioiden aikamääritys.",
+       "mergehistory-fail-bad-timestamp": "Aikaleima ei ole kelvollinen.",
+       "mergehistory-fail-invalid-source": "Lähdesivu ei ole kelvollinen.",
+       "mergehistory-fail-invalid-dest": "Kohdesivu ei ole kelvollinen.",
+       "mergehistory-fail-no-change": "Sivuhistorian yhdistämistoiminto ei yhdistänyt mitään versioita. Katso, ovatko sivun ja ajankohdan määritykset oikein.",
+       "mergehistory-fail-permission": "Käyttöoikeutesi eivät riitä sivuhistorioiden yhdistämiseen.",
+       "mergehistory-fail-self-merge": "Lähdesivu ja kohdesivu ovat samat.",
+       "mergehistory-fail-timestamps-overlap": "Lähdesivun versiot menevät päällekkäin tai ovat myöhemmin tehtyjä kuin kohdesivun versiot.",
        "mergehistory-fail-toobig": "Sivuhistorian yhdistämistä ei voi tehdä, koska enemmän kuin sallittu määrä $1 {{PLURAL:$1|versio|versiota}} siirrettäisiin.",
        "mergehistory-no-source": "Lähdesivua $1 ei ole olemassa.",
        "mergehistory-no-destination": "Kohdesivua $1 ei ole olemassa.",
        "apisandbox": "API-hiekkalaatikko",
        "apisandbox-api-disabled": "API on poistettu käytöstä tällä sivustolla.",
        "apisandbox-intro": "Tämä on '''MediaWiki API:n''' hiekkalaatikko.\n[//www.mediawiki.org/wiki/API:Main_page API-dokumentaatio] kertoo lisää API:en käytöstä.",
+       "apisandbox-fullscreen": "Laajenna paneeli",
+       "apisandbox-unfullscreen": "Näytä sivu",
        "apisandbox-submit": "Tee pyyntö",
        "apisandbox-reset": "Tyhjennä",
-       "apisandbox-examples": "Esimerkki",
-       "apisandbox-results": "Tulos",
+       "apisandbox-retry": "Yritä uudestaan",
+       "apisandbox-no-parameters": "Tässä API-moduulissa ei ole parametreja.",
+       "apisandbox-helpurls": "Linkit ohjeisiin",
+       "apisandbox-examples": "Esimerkit",
+       "apisandbox-dynamic-parameters": "Lisäparametrit",
+       "apisandbox-dynamic-parameters-add-label": "Lisää parametri:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Parametrin nimi",
+       "apisandbox-dynamic-error-exists": "Parametri nimellä \"$1\" on ennestään olemassa.",
+       "apisandbox-deprecated-parameters": "Käytöstä poistuneet parametrit",
+       "apisandbox-fetch-token": "Lisää \"token\" automaattisesti",
+       "apisandbox-submit-invalid-fields-title": "Jotkin kentät ovat epäkelpoja",
+       "apisandbox-submit-invalid-fields-message": "Korjaa merkityt kentät ja yritä uudestaan.",
+       "apisandbox-results": "Tulokset",
+       "apisandbox-sending-request": "API-pyyntöä lähetetään...",
+       "apisandbox-loading-results": "API-tuloksia vastaanotetaan...",
        "apisandbox-request-url-label": "Pyynnön URL",
-       "apisandbox-request-time": "Pyyntöaika: $1",
+       "apisandbox-request-time": "Pyyntöön kulunut aika: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-alert-page": "Tällä sivulla olevat kentät eivät ole kelvollisia.",
+       "apisandbox-alert-field": "Tässä kentässä oleva arvo ei ole kelvollinen.",
        "booksources": "Kirjalähteet",
        "booksources-search-legend": "Etsi kirjalähteitä",
        "booksources-isbn": "ISBN",
        "lockedbyandtime": "(lukinnut {{GENDER:$1|$1}} $2 kello $3)",
        "move-page": "Siirrä $1",
        "move-page-legend": "Siirrä sivu",
-       "movepagetext": "Alla olevalla lomakkeella voit nimetä uudelleen sivuja, jolloin niiden koko historia siirtyy uuden nimen alle.\nVanhasta sivusta tulee ohjaussivu, joka osoittaa uuteen sivuun.\nVoit päivittää sivuun viittaavat ohjaukset automaattisesti ohjaamaan uudelle nimelle.\nJos et halua tätä tehtävän automaattisesti, muista tehdä tarkistukset [[Special:DoubleRedirects|kaksinkertaisten]] tai [[Special:BrokenRedirects|rikkinäisten]] ohjausten varalta.\nOlet vastuussa siitä, että linkit osoittavat sinne, mihin niiden on tarkoituskin osoittaa.\n\nHuomaa, että sivua '''ei''' siirretä mikäli uusi otsikko on olemassa olevan sivun käytössä, paitsi jos jälkimmäinen on ohjaus, jolla ei ole muokkaushistoriaa.\nTämä tarkoittaa sitä, että voit siirtää sivun takaisin vanhalle nimelleen mikäli teit virheen, mutta et voi kirjoittaa olemassa olevan sivun päälle.\n\nTämä saattaa olla suuri ja odottamaton muutos suositulle sivulle. Varmista, että tiedät seuraukset ennen kuin siirrät sivun.",
-       "movepagetext-noredirectfixer": "Alla olevalla lomakkeella voit nimetä uudelleen sivuja, jolloin niiden koko historia siirtyy uuden nimen alle. Vanhasta sivusta tulee ohjaussivu, joka osoittaa uuteen sivuun.\n\nTarkasta sivuun viittaavat ohjaukset [[Special:DoubleRedirects|kaksinkertaisten]] tai [[Special:BrokenRedirects|rikkinäisten]] ohjausten varalta. Olet vastuussa siitä, että linkit osoittavat sinne, mihin niiden on tarkoituskin osoittaa.\n\nHuomaa, että sivua '''ei''' siirretä mikäli uusi otsikko on olemassa olevan sivun käytössä, paitsi jos jälkimmäinen on ohjaus, jolla ei ole muokkaushistoriaa.\nTämä tarkoittaa sitä, että voit siirtää sivun takaisin vanhalle nimelleen mikäli teit virheen, mutta et voi kirjoittaa olemassa olevan sivun päälle.\n\nTämä saattaa olla suuri ja odottamaton muutos suositulle sivulle. Varmista, että tiedät seuraukset ennen kuin siirrät sivun.",
+       "movepagetext": "Alla olevalla lomakkeella voit nimetä uudelleen sivuja, jolloin niiden koko historia siirtyy uuden nimen alle.\nVanhasta sivusta tulee ohjaussivu, joka osoittaa uuteen sivuun.\nVoit päivittää sivuun viittaavat ohjaukset automaattisesti ohjaamaan uudelle nimelle.\nJos et halua tätä tehtävän automaattisesti, muista tehdä tarkistukset [[Special:DoubleRedirects|kaksinkertaisten]] tai [[Special:BrokenRedirects|rikkinäisten]] ohjausten varalta.\nOlet vastuussa siitä, että linkit osoittavat sinne, mihin niiden on tarkoituskin osoittaa.\n\nHuomaa, että sivua <strong>ei</strong> siirretä mikäli uusi otsikko on olemassa olevan sivun käytössä, paitsi jos jälkimmäinen on ohjaus, jolla ei ole muokkaushistoriaa.\nTämä tarkoittaa sitä, että voit siirtää sivun takaisin vanhalle nimelleen mikäli teit virheen, mutta et voi kirjoittaa olemassa olevan sivun päälle.\n\n<strong>Ota huomioon:</strong>\n\nTämä saattaa olla suuri ja odottamaton muutos suositulle sivulle. Varmista, että ymmärrät seuraukset ennen kuin siirrät sivun.",
+       "movepagetext-noredirectfixer": "Alla olevalla lomakkeella voit nimetä uudelleen sivuja, jolloin niiden koko historia siirtyy uuden nimen alle. Vanhasta sivusta tulee ohjaussivu, joka osoittaa uuteen sivuun.\n\nTarkasta sivuun viittaavat ohjaukset [[Special:DoubleRedirects|kaksinkertaisten]] tai [[Special:BrokenRedirects|rikkinäisten]] ohjausten varalta. Olet vastuussa siitä, että linkit osoittavat sinne, mihin niiden on tarkoituskin osoittaa.\n\nHuomaa, että sivua <strong>ei</strong> siirretä mikäli uusi otsikko on olemassa olevan sivun käytössä, paitsi jos jälkimmäinen on ohjaus, jolla ei ole muokkaushistoriaa.\nTämä tarkoittaa sitä, että voit siirtää sivun takaisin vanhalle nimelleen mikäli teit virheen, mutta et voi kirjoittaa olemassa olevan sivun päälle.\n\n<strong>Ota huomioon:</strong>\n\nTämä saattaa olla suuri ja odottamaton muutos suositulle sivulle. Varmista, että ymmärrät seuraukset ennen kuin siirrät sivun.",
        "movepagetalktext": "Jos valitset tämän vaihtoehdon, sivuun liittyvä keskustelusivu siirtyy automaattisesti uudelle nimelle, paitsi jos uudella nimellä on jo olemassa keskustelusivu, joka ei ole tyhjä.\n\nTällöin sivu täytyy siirtää tai yhdistää käsin, jos se on tarpeen.",
        "moveuserpage-warning": "'''Varoitus:''' Olet siirtämässä käyttäjäsivua. Huomaa, että vain sivu siirretään ja käyttäjää ''ei'' nimetä uudelleen.",
        "movecategorypage-warning": "<strong>Varoitus:</strong> Olet siirtämässä luokkasivua. Ota huomioon, että ainoastaan luokan oma sivu siirretään ja että tämä toiminto <em>ei</em> luokittele tai itsestään siirrä vanhassa luokassa olevia sivuja uuteen luokkaan.",
        "movenosubpage": "Tällä sivulla ei ole alasivuja.",
        "movereason": "Syy:",
        "revertmove": "kumoa siirto",
-       "delete_and_move_text": "==Poistamista edellyttävä siirto==\nKohdesivu [[:$1]] on jo olemassa. \nHaluatko poistaa sen, jotta nykyinen sivu voitaisiin siirtää?",
+       "delete_and_move_text": "Kohdesivu [[:$1]] on jo olemassa. \nHaluatko poistaa sen, jotta nykyinen sivu voitaisiin siirtää sen tilalle?",
        "delete_and_move_confirm": "Kyllä, poista kohdesivu",
        "delete_and_move_reason": "Sivu on sivun [[$1]] siirron tiellä.",
        "selfmove": "Lähteen ja kohteen nimi on sama.\nSivua ei voi siirtää itsensä päälle.",
        "move-leave-redirect": "Jätä paikalle ohjaus",
        "protectedpagemovewarning": "'''Varoitus:''' Tämä sivu on lukittu siten, että vain ylläpitäjät voivat siirtää sitä.\nAlla on viimeisin lokitapahtuma:",
        "semiprotectedpagemovewarning": "Tämä sivu on lukittu siten, että vain rekisteröityneet käyttäjät voivat siirtää sitä.\nAlla on viimeisin lokitapahtuma:",
-       "move-over-sharedrepo": "== Tiedosto on olemassa ==\n[[:$1]] on olemassa jaetussa tietovarastossa. Tiedoston siirtäminen tälle nimelle ohittaa jaetun tiedoston.",
+       "move-over-sharedrepo": "[[:$1]] on olemassa yhteisessä tietovarastossa. Tiedoston siirtäminen tälle nimelle korvaa yhteisen tiedoston.",
        "file-exists-sharedrepo": "Valittu tiedostonimi on jo käytössä jaetussa varastossa.\nValitse toinen nimi.",
        "export": "Vie sivuja",
        "exporttext": "Voit viedä (''export'') sivun tai usean sivun tekstin ja muokkaushistorian XML-muodossa.\nTämä tieto voidaan tuoda (''import'') toiseen wikiin käyttämällä MediaWikiä [[Special:Import|tuontisivun]] kautta.\n\nKirjoita sivujen nimet, jokainen nimike omalle rivilleen, alla olevaan tietolaatikkoon. Valitse, haluatko viedä sivun uusimman version sekä samalla kaikki vanhat versiot ja sivun historian tietorivit, vai haluatko viedä sivun uusimman version, jossa on tieto viimeisimmästä muokkauksesta.\n\nJälkimmäisessä tapauksessa voit myös käyttää linkkiä. Esimerkiksi sivun [[{{MediaWiki:Mainpage}}]] saa vietyä linkistä [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].",
index 57ac1b5..e7ac70b 100644 (file)
        "previewnote": "'''Rappelez-vous que ce n'est qu'une prévisualisation.'''\nVos modifications n'ont pas encore été enregistrées !",
        "continue-editing": "Aller à la zone de modification",
        "previewconflict": "Cette prévisualisation montre le texte de la boîte supérieure de modification tel qu'il apparaîtra si vous choisissez de le publier.",
-       "session_fail_preview": "'''Nous ne pouvons enregistrer votre modification à cause d'une perte d'informations concernant votre session.'''\nVeuillez réessayer.\nSi cela échoue de nouveau, essayez en vous [[Special:UserLogout|déconnectant]], puis en vous reconnectant.",
-       "session_fail_preview_html": "'''Nous ne pouvons enregistrer votre modification à cause d'une perte d'informations concernant votre session.'''\n\n''Parce que {{SITENAME}} a activé le HTML brut, la prévisualisation a été masquée afin de prévenir les attaques par JavaScript.''\n\n'''Si la tentative de modification était légitime, veuillez réessayer.'''\nSi cela échoue de nouveau, [[Special:UserLogout|déconnectez-vous]], puis reconnectez-vous.",
+       "session_fail_preview": "Désolé, nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.\n\nVous avez peut-être été déconnecté. <strong>Veuillez vérifier que vous êtes toujours connecté et réessayer.</strong>\nSi cela échoue de nouveau, essayez en vous [[Special:UserLogout|déconnectant]], puis en vous reconnectant, et vérifiez que votre navigateur accepte les cookies de ce site.",
+       "session_fail_preview_html": "Désolé, nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.\n\n<em>Parce que {{SITENAME}} a activé le HTML brut, la prévisualisation est masquée afin de prévenir les attaques par JavaScript.</em>\n\n<strong>Si la tentative de modification est légitime, veuillez réessayer.</strong>\nSi cela échoue de nouveau, [[Special:UserLogout|déconnectez-vous]], puis reconnectez-vous, et vérifiez que votre navigateur accepte les cookies de ce site.",
        "token_suffix_mismatch": "'''Votre modification n'a pas été acceptée car votre navigateur a mal codé les caractères de ponctuation dans l'identifiant de modification.'''\nCe rejet est nécessaire pour empêcher la corruption du texte de la page.\nCe problème se produit parfois lorsque vous utilisez un serveur mandataire anonyme problématique basé sur le web.",
        "edit_form_incomplete": "'''Certaines parties du formulaire de modification n'ont pas atteint le serveur, vérifiez que vos modifications sont intactes et essayez à nouveau.'''",
        "editing": "Modification de $1",
        "mergehistory-empty": "Aucune version ne peut être fusionnée.",
        "mergehistory-done": "$3 version{{PLURAL:$3||s}} de $1 {{PLURAL:$3|a été fusionnée|ont été fusionnées}} dans [[:$2]].",
        "mergehistory-fail": "Impossible de procéder à la fusion des historiques. Resélectionner la page ainsi que les paramètres de date.",
+       "mergehistory-fail-bad-timestamp": "L’horodatage n’est pas valide.",
+       "mergehistory-fail-invalid-source": "La page source n’est pas valide.",
+       "mergehistory-fail-invalid-dest": "La page de destination n’est pas valide.",
+       "mergehistory-fail-no-change": "La fusions d’historique n’a fusionné aucune révision. Veuillez vérifier de nouveau la page et les paramètres de temps.",
+       "mergehistory-fail-permission": "Droits insuffisants pour fusionner l’historique.",
+       "mergehistory-fail-self-merge": "Les pages source et destination sont identiques.",
+       "mergehistory-fail-timestamps-overlap": "Les révisions de la source chevauchent ou suivent les révisions de destination.",
        "mergehistory-fail-toobig": "Impossible d’effectuer la fusion de l’historique car un nombre de {{PLURAL:$1|révisions}} supérieur à la limite de $1 devrait être déplacé.",
        "mergehistory-no-source": "La page d'origine $1 n'existe pas.",
        "mergehistory-no-destination": "La page de destination $1 n'existe pas.",
        "undelete-error-long": "Des erreurs ont été rencontrées lors de la restauration du fichier :\n\n$1",
        "undelete-show-file-confirm": "Êtes-vous sûr{{GENDER:||e}} de vouloir consulter une version supprimée du fichier « <nowiki>$1</nowiki> » datant du $2 à $3 ?",
        "undelete-show-file-submit": "Oui",
-       "undelete-revision-row": "$1 $2 ($3) $4 — $5 $6 $7 $8 $9",
        "namespace": "Espace de noms :",
        "invert": "Inverser la sélection",
        "tooltip-invert": "Cochez cette case pour cacher les modifications des pages dans l'espace de noms sélectionné (et l'espace de noms associé si coché)",
        "import-nonewrevisions": "Aucune révision importée (toutes étaient déjà présentes, ou ignorées du fait d’erreurs).",
        "xml-error-string": "$1 à la ligne $2, colonne $3 (octet $4) : $5",
        "import-upload": "Import de données XML",
-       "import-token-mismatch": "Perte des données de session. Veuillez réessayer.",
+       "import-token-mismatch": "Perte des données de session.\n\nVous avez peut-être été déconnecté. <strong>Veuillez vérifier que vous êtes toujours connecté et réessayez</strong>.\nSi cela ne fonctionne toujours pas, essayez de [[Special:UserLogout|vous déconnecter]] et reconnectez-vous, et vérifiez que votre navigateur accepte les cookies de ce site.",
        "import-invalid-interwiki": "Impossible d'importer depuis le wiki spécifié.",
        "import-error-edit": "La page « $1 » n’a pas été importée parce que vous n’êtes pas autorisé à la modifier.",
        "import-error-create": "La page « $1 » n’a pas été importée parce que vous n’êtes pas autorisé à la créer.",
        "expand_templates_generate_xml": "Voir l’arborescence d’analyse XML",
        "expand_templates_generate_rawhtml": "Afficher le HTML brut",
        "expand_templates_preview": "Aperçu du rendu",
-       "expand_templates_preview_fail_html": "<em>Comme {{SITENAME}} a HTML brut activé et qu’il y a eu une perte de données de session, l’aperçu est masqué par précaution contre les attaques JavaScript.</em>\n\n<strong>Si c’est une demande d’aperçu légitime, veuillez réessayer.</strong>\nSi cela ne fonctionne toujours pas, essayez de [[Special:UserLogout|vous déconnecter]] et vous reconnecter.",
+       "expand_templates_preview_fail_html": "<em>Comme {{SITENAME}} a HTML brut activé et qu’il y a eu une perte de données de session, l’aperçu est masqué par précaution contre les attaques JavaScript.</em>\n\n<strong>Si c’est une demande d’aperçu légitime, veuillez réessayer.</strong>\nSi cela ne fonctionne toujours pas, essayez de [[Special:UserLogout|vous déconnecter]] et vous reconnecter, et vérifiez que votre navigateur accepte les cookies de ce site.",
        "expand_templates_preview_fail_html_anon": "<em>Comme {{SITENAME}} a HTML brut activé et que vous n’êtes pas connecté, l’aperçu est masqué par précaution contre les attaques JavaScript.</em>\n\n<strong>Si c’est une demande d’aperçu légitime, veuillez [[Special:UserLogin|vous connecter]] et réessayer.</strong>",
        "expand_templates_input_missing": "Vous devez fournir au moins un texte d’entrée.",
        "pagelanguage": "Modifier la langue de la page",
index 7586ffc..1484ab3 100644 (file)
@@ -45,6 +45,7 @@
        "tog-watchlisthidebots": "Feranrangen faan bots bi a sidjen, diar ik uun't uug behual wal, fersteeg",
        "tog-watchlisthideminor": "Letj feranrangen bi a sidjen, diar ik uun't uug behual wal, fersteeg",
        "tog-watchlisthideliu": "Feranrangen faan uunmeldet brükern bi sidjen, diar ik uun't uug behual wal, fersteeg",
+       "tog-watchlistreloadautomatically": "List mä sidjen, diar dü uun't uug behual wel, nei loose, wan en filter anert wurden as (brükt JavaScript)",
        "tog-watchlisthideanons": "Feranrangen faan anonüüm brükern (IPs) bi sidjen, diar ik uun't uug behual wal, fersteeg",
        "tog-watchlisthidepatrolled": "Kontroliaret feranrangen bi a sidjen, diar ik uun't uug behual wal, fersteeg",
        "tog-watchlisthidecategorization": "Kategorisiarang faan sidjen fersteeg",
        "october-date": "$1. Oktuuber",
        "november-date": "$1. Nofember",
        "december-date": "$1. Detsember",
+       "period-am": "AM (iarmade)",
+       "period-pm": "PM (eftermade)",
        "pagecategories": "{{PLURAL:$1|Kategorii|Kategoriin}}",
        "category_header": "Sidjen uun kategorii \"$1\"",
        "subcategories": "Onerkategoriin",
        "databaseerror-query": "Uunfraag: $1",
        "databaseerror-function": "Funktjuun: $1",
        "databaseerror-error": "Feeler: $1",
+       "transaction-duration-limit-exceeded": "Transaktjuun ütj technisk grünjer ufbreegen. Det skriiwdüür ($1) wiar linger üs $2 {{PLURAL:$2|sekund|sekunden}}.\nWan dü flook objekten anerst, dial det ap tu letjer aktjuunen.",
        "laggedslavemode": "'''Paase üüb:''' Ferlicht wiset detdiar sidj ei a leetst stant.",
        "readonly": "Dootenbeenk speret.",
        "enterlockreason": "Wees so gud an du en grünj uun, huaram det dootenbeenk speret wurd skal, an hü loong det (amanbi) speret wurd skal.",
-       "readonlytext": "Det dootenbeenk as iarst ans speret för nei iindracher an feranrangen, woorskiinelk, auer diar jüst apredet woort. Ferschük det leeder man noch ans.\n\nGrünj för't sperin: $1",
+       "readonlytext": "Det dootenbeenk as iarst ans speret för nei iindracher an feranrangen. Ferschük det leeder man noch ans.\n\nGrünj för't sperin: $1",
        "missing-article": "Di tekst för „$1“ $2 as ei fünjen wurden uun't dootenbeenk.\n\nFerlicht as det sidj stregen of fersköwen wurden.\n\nWan't det ei as, do heest dü ferlicht en feeler uun't software fünjen. Wees so gud an skriiw det tu en [[Special:ListUsers/sysop|administraator]] an fertel ham, am hün URL det gongt.",
        "missingarticle-rev": "(Werjuunsnumer: $1)",
        "missingarticle-diff": "(Ferskeel tesken $1 an $2)",
        "readonly_lag": "Det dootenbeenk as speret wurden, amdat jo ferdiald dootenbeenken (slaves) jo mä di hoodserver (master) ufglik kön.",
+       "nonwrite-api-promise-error": "Di HTTP-header „Promise-Non-Write-API-Action“ as schüürd wurden, man det uunfraag ging tu en API-skriiwmodul.",
        "internalerror": "Süsteemfeeler",
        "internalerror_info": "Süsteemfeeler: $1",
        "internalerror-fatal-exception": "Böös ütjnoomfeeler faan di slach \"$1\"",
        "viewsource": "Kweltekst uunluke",
        "viewsource-title": "Code faan sidj $1 uunluke",
        "actionthrottled": "Taal faan aktjuunen limitiaret",
-       "actionthrottledtext": "Dü heest detdiar aktjuun tufölsis uun en kurten tidjrüm ütjfeerd.\nWees so gud an ferschük det glik noch ans weder.",
+       "actionthrottledtext": "Dü heest detdiar aktjuun tufölsis uun en kurten tidjrüm ütjfeerd. Am masbrük ütjtuslütjen, as din aktjuun ufbreegen wurden.\nWees so gud an ferschük det glik noch ans weder.",
        "protectedpagetext": "Detdiar sidj as seekert wurden, am dat diar näämen wat feranert.",
        "viewsourcetext": "Dü könst di kweltekst faan detdiar sidj uunluke an ham uk kopiare.",
        "viewyourtext": "Dü könst di code faan <strong>din feranrang</strong> faan detdiar sidj uunluke an kopiare.",
        "mypreferencesprotected": "Dü heest ei det brükerrocht, am din iinstelangen tu feranrin.",
        "ns-specialprotected": "Spezial-sidjen kön ei bewerket wurd.",
        "titleprotected": "En sidj mä didiar nööm koon ei uunlaanj wurd.\nDi brüker [[User:$1|$1]] hää det sidj speret, an di grünj as: \"''$2''\".",
-       "filereadonlyerror": "Det datei „$1“ koon ei feranert wurd, auer uun det fertiaknis „$2“ bluas leesen wurd koon.\nDi grünj faan di administraator as: „$3“.",
+       "filereadonlyerror": "Det datei „$1“ koon ei feranert wurd, auer uun det fertiaknis „$2“ bluas leesen wurd koon.\nDi grünj faan di süsteem-administraator as: „$3“.",
        "invalidtitle-knownnamespace": "Ferkiard auerskraft uun di nöömrüm „$2“ an tekst „$3“",
        "invalidtitle-unknownnamespace": "Ferkiard auerskraft uun di ünbekäänd nöömrüm „$1“ an tekst „$2“",
        "exception-nologin": "Ei uunmeldet",
        "createacct-reason": "Grünj",
        "createacct-reason-ph": "Huaram dü en ööder brükerkonto iinrachtst",
        "createacct-submit": "Din brükerkonto iinracht",
-       "createacct-another-submit": "En ööder brükerkonto iinracht",
+       "createacct-another-submit": "Brükerkonto iinracht",
        "createacct-benefit-heading": "{{SITENAME}} woort faan lidj üs di maaget.",
        "createacct-benefit-body1": "{{PLURAL:$1|feranrang|feranrangen}}",
        "createacct-benefit-body2": "{{PLURAL:$1|sidj|sidjen}}",
        "wrongpasswordempty": "Dü heest nian paaswurd iinden.\nFerschük det man noch ans.",
        "passwordtooshort": "Paaswurden skel tumanst {{PLURAL:$1|1 tiaken|$1 tiakens}} lung wees.",
        "passwordtoolong": "Paaswurden kön ei linger üs {{PLURAL:$1|1 tiaken|$1 tiakens}} wees.",
+       "passwordtoopopular": "Flooksis brükt paaswurden san ei tuläät. Wees so gud an schük en ööder, muar aparte paaswurd ütj.",
        "password-name-match": "Dü könst dan brükernööm ei üs paaswurd nem.",
        "password-login-forbidden": "Didiar brükernööm mä detdiar paaswurd as ei tuläät.",
        "mailmypassword": "Paaswurd turagsaat",
        "resetpass_submit": "Paaswurd saat an uunmelde",
        "changepassword-success": "Din paaswurd as feranert wurden!",
        "changepassword-throttled": "Dü heest tufölsis fersoocht, di uuntumeldin.\nWees so gud an teew $1, iar dü det noch ans ferschükst.",
+       "botpasswords": "Bot-paaswurden",
+       "botpasswords-summary": "Mä <em>bot-paaswurden</em> koon üüb en brükerkonto auer't API tugreben wurd. A brükerrochten bi uunmeldang mä en bot-paaswurd san kört.\n\nWan dü ei witjst, huaram dü det du wel, skulst dü det uk ei du. Näämen fraaget di, en paaswurd iinturachten, an det do widjertudun.",
+       "botpasswords-no-central-id": "Am bot-paaswurden tu brüken, skel dü bi en sentralisiaret brükerkonto uunmeldet wees.",
+       "botpasswords-existing": "Bot-paaswurden",
+       "botpasswords-createnew": "En nei bot-paaswurd maage",
+       "botpasswords-editexisting": "En bot-paaswurd feranre",
+       "botpasswords-label-appid": "Bot-nööm:",
+       "botpasswords-label-create": "Maage",
+       "botpasswords-label-update": "Aktualisiare",
+       "botpasswords-label-cancel": "Ufbreeg",
+       "botpasswords-label-delete": "Strik",
+       "botpasswords-label-resetpassword": "Paaswurd turagsaat",
+       "botpasswords-label-grants": "Mögelk brükerrochten:",
+       "botpasswords-help-grants": "Mä arke brükerrocht könst dü üüb ööder brükerrochten faan en brükerkonto tugrip. Luke iin uun det [[Special:ListGrants|tabel]] am muar informatjuun.",
+       "botpasswords-label-restrictions": "Kört brükerrochten:",
+       "botpasswords-label-grants-column": "Tugestenen",
+       "botpasswords-bad-appid": "Di bot-nööm \"$1\" gongt ei.",
+       "botpasswords-insert-failed": "Di bot-nööm \"$1\" küd ei apnimen wurd. Ferlicht as hi al diar?",
+       "botpasswords-update-failed": "Di bot-nööm \"$1\" küd ei apnimen wurd. As hi stregen wurden?",
+       "botpasswords-created-title": "Bot-paaswurd as iinracht wurden.",
+       "botpasswords-created-body": "Det bot-paaswurd \"$1\" as iinracht wurden an uun funktjuun.",
+       "botpasswords-updated-title": "Bot-paaswurd as aktualisiaret wurden.",
+       "botpasswords-updated-body": "Det bot-paaswurd \"$1\" as aktualisiaret wurden an uun funktjuun.",
+       "botpasswords-deleted-title": "Bot-paaswurd as stregen wurden.",
+       "botpasswords-deleted-body": "Det bot-paaswurd \"$1\" as stregen wurden.",
        "resetpass_forbidden": "Det paaswurd koon ei feranert wurd.",
        "resetpass-no-info": "Dü skel di uunmelde, am üüb det sidj tutugripen.",
        "resetpass-submit-loggedin": "Paaswurd feranre",
        "right-blockemail": "Brüker spere för't e-mail schüüren",
        "right-hideuser": "Brükernööm spere an fersteeg",
        "right-ipblock-exempt": "Ütjnoom faan IP-speren, automaatisk speren an range-speren",
-       "right-proxyunbannable": "Ütjnoom faan automaatisk proxy-speren",
        "right-unblockself": "Sper apheew för ään salew",
        "right-protect": "Sidjenseekerhaid feranre an kaskaaden-seekert sidjen bewerke",
        "right-editprotected": "Sidjen bewerke, diar mä „{{int:protect-level-sysop}}“ seekert san.",
        "watchthisupload": "Luke efter detdiar datei",
        "filewasdeleted": "En datei mä didiar nööm as al ans huuchschüürd an leederhen weder stregen wurden. Luke iarst ans iin uun $1, iar dü det datei würelk seekerst.",
        "filename-bad-prefix": "Di dateinööm begant mä '''„$1“'''. Sok nöömer kem miast faan digitaalkameras an sai ei föl ütj.\nNem en beedern nööm för det datei.",
-       "upload-success-subj": "Det huuchschüüren hää loket.",
-       "upload-success-msg": "Det huuchschüüren faan [$2] hää loket an stäänt nü diar: [[:{{ns:file}}:$1]]",
-       "upload-failure-subj": "Bi't huuchschüüren as wat skiaf gingen.",
-       "upload-failure-msg": "Diar as wat skiaf gingen bi't huuchschüüren faan [$2]:\n\n$1",
-       "upload-warning-subj": "Wäärnang",
-       "upload-warning-msg": "Diar as wat skiaf gingen bi't huuchschüüren faan [$2]. Gung turag tu't  [[Special:Upload/stash/$1|sidj för't huuchschüüren]], am det üüb a rä tu fun.",
        "upload-proto-error": "Ferkiard protokol",
        "upload-proto-error-text": "Det URL skal mä <code>http://</code> of <code>ftp://</code> began.",
        "upload-file-error": "Diar as wat skiaf gingen",
        "querypage-disabled": "Detdiar spezial-sidj as ei aktiif, am det süsteem ei tu auerläästin.",
        "apihelp": "Halep för API",
        "apihelp-no-such-module": "Moduul \"$1\" ei fünjen.",
+       "apisandbox": "API spelplaats",
        "booksources": "Schük efter ISBN-numer",
        "booksources-search-legend": "Schük efter bukloodens",
        "booksources-search": "Schük",
        "wlheader-showupdated": "Nei feranert sidjen wurd '''fäät''' uunwiset.",
        "wlnote": "Diar {{PLURAL:$1|stäänt det leetst feranrang|stun a leetst <strong>$1</strong> feranrangen}} faan a leetst {{PLURAL:$2|stünj|<strong>$2</strong> stünjen}}. Stant: $3, klook $4.",
        "wlshowlast": "Wise a feranrangen faan a leetst $1 stünjen, $2 daar.",
-       "watchlistall2": "aaltumaal",
        "watchlist-options": "Iinstelangen för't uunwisin",
        "watching": "Uun't uug behual ...",
        "unwatching": "Ei uun't uug behual ...",
        "special-characters-title-minus": "minus tiaken",
        "mw-widgets-dateinput-no-date": "Nian dootem ütjsoocht",
        "mw-widgets-titleinput-description-new-page": "sidj jaft at noch ei",
-       "mw-widgets-titleinput-description-redirect": "widjerfeerang tu $1"
+       "mw-widgets-titleinput-description-redirect": "widjerfeerang tu $1",
+       "randomrootpage": "Tufelag stamsidj"
 }
index 0d7720c..c66a611 100644 (file)
@@ -40,7 +40,7 @@
        "tog-hideminor": "הסתרת שינויים משניים ברשימת השינויים האחרונים",
        "tog-hidepatrolled": "הסתרת שינויים בדוקים ברשימת השינויים האחרונים",
        "tog-newpageshidepatrolled": "הסתרת דפים בדוקים ברשימת הדפים החדשים",
-       "tog-hidecategorization": "×\94סתרת ×\94×\95ספ×\95ת ×\95×\94סר×\95ת ×©×\9c ×\93פ×\99×\9d ×\9eקטגוריות",
+       "tog-hidecategorization": "×\94סתרת ×¡×\99×\95×\95×\92 ×\93פ×\99×\9d ×\9cקטגוריות",
        "tog-extendwatchlist": "הרחבת רשימת המעקב כך שתציג את כל השינויים, לא רק את השינויים האחרונים בכל דף",
        "tog-usenewrc": "קיבוץ השינויים לפי דף בשינויים האחרונים וברשימת המעקב",
        "tog-numberheadings": "מספור כותרות אוטומטי",
@@ -71,7 +71,7 @@
        "tog-watchlistreloadautomatically": "רענון אוטומטי של רשימת המעקב בכל פעם שמסנן משתנה (נדרש JavaScript)",
        "tog-watchlisthideanons": "הסתרת עריכות של משתמשים אנונימיים ברשימת המעקב",
        "tog-watchlisthidepatrolled": "הסתרת עריכות בדוקות ברשימת המעקב",
-       "tog-watchlisthidecategorization": "×\94סתרת ×\94×\95ספ×\95ת ×\95×\94סר×\95ת ×©×\9c ×\93פ×\99×\9d ×\9eקטגוריות",
+       "tog-watchlisthidecategorization": "×\94סתרת ×¡×\99×\95×\95×\92 ×\93פ×\99×\9d ×\9cקטגוריות",
        "tog-ccmeonemails": "לשלוח אליי העתקים של הודעות דואר אלקטרוני ששלחתי למשתמשים אחרים",
        "tog-diffonly": "ביטול הצגת תוכן הדף מתחת להשוואות הגרסאות",
        "tog-showhiddencats": "הצגת קטגוריות מוסתרות",
        "nowiki_tip": "התעלמות מעיצוב ויקי",
        "image_tip": "קובץ המוצג בתוך הדף",
        "media_tip": "קישור לקובץ מדיה",
-       "sig_tip": "חתימה + שעה",
+       "sig_tip": "×\97ת×\99×\9e×\94 + ×ª×\90ר×\99×\9a ×\95שע×\94",
        "hr_tip": "קו אופקי (השתדלו להימנע משימוש בקו)",
        "summary": "תקציר:",
        "subject": "נושא:",
        "previewnote": "<strong>זִכרו שזו רק תצוגה מקדימה.</strong>\nהשינויים שלכם טרם נשמרו!",
        "continue-editing": "מעבר לאזור העריכה",
        "previewconflict": "תצוגה מקדימה זו מציגה כיצד ייראה הטקסט בחלון העריכה העליון, אם תבחרו לשמור אותו.",
-       "session_fail_preview": "'''לא ניתן לבצע את עריכתכם עקב אובדן מידע הכניסה.'''\nאנא נסו שוב.\nאם זה לא עוזר, נסו [[Special:UserLogout|לצאת מהחשבון]] ולהיכנס אליו שנית.",
-       "session_fail_preview_html": "'''לא ניתן לבצע את עריכתם עקב אובדן מידע הכניסה.'''\n\nכיוון שבאתר זה אפשרות השימוש ב־HTML מאופשרת, התצוגה המקדימה מוסתרת כדי למנוע התקפות JavaScript.\n\n'''אם זהו ניסיון עריכה לגיטימי, אנא נסו שוב.'''\nאם זה לא עוזר, נסו [[Special:UserLogout|לצאת מהחשבון]] ולהיכנס אליו שנית.",
+       "session_fail_preview": "מצטערים! לא ניתן לבצע את עריכתכם עקב אובדן מידע הכניסה.\n\nייתכן שנותקתם מהחשבון. <strong>אנא ודאו שאתם עדיין מחוברים לחשבון ונסו שוב.</strong>\nאם זה עדיין לא עובד, נסו [[Special:UserLogout|לצאת מהחשבון]] ולהיכנס אליו שנית, וודאו שהדפדפן שלכם מאפשר קבלת עוגיות מאתר זה.",
+       "session_fail_preview_html": "מצטערים! לא ניתן לבצע את עריכתם עקב אובדן מידע הכניסה.\n\n<em>כיוון שב{{grammar:תחילית|{{SITENAME}}}} אפשרות השימוש ב־HTML גולמי מופעלת, התצוגה המקדימה מוסתרת כדי למנוע התקפות JavaScript.</em>\n\n<strong>אם זהו ניסיון עריכה לגיטימי, אנא נסו שוב.</strong>\nאם זה עדיין לא עובד, נסו [[Special:UserLogout|לצאת מהחשבון]] ולהיכנס אליו שנית, וודאו שהדפדפן שלכם מאפשר קבלת עוגיות מאתר זה.",
        "token_suffix_mismatch": "'''עריכתך נדחתה כיוון שהדפדפן שלך מחק את תווי הפיסוק באסימון העריכה.'''\nהעריכה נדחתה כדי למנוע בעיות כאלה בטקסט של הדף.\nלעתים התקלה מתרחשת עקב שימוש בשירות פרוקסי אנונימי פגום.",
        "edit_form_incomplete": "'''כמה חלקים מטופס העריכה לא הגיעו לשרת; בדקו היטב שעריכותיכם לא נפגעו ונסו שוב.'''",
        "editing": "עריכת הדף $1",
        "mergehistory-empty": "אין גרסאות למיזוג.",
        "mergehistory-done": "{{PLURAL:$3|גרסה אחת|$3 גרסאות}} של $1 {{PLURAL:$3|מוזגה|מוזגו}} בהצלחה לתוך [[:$2]].",
        "mergehistory-fail": "לא ניתן לבצע את מיזוג הגרסאות, יש לבדוק שנית את הגדרות הדף והזמן.",
+       "mergehistory-fail-bad-timestamp": "התאריך והשעה אינם תקינים.",
+       "mergehistory-fail-invalid-source": "דף המקור אינו תקין.",
+       "mergehistory-fail-invalid-dest": "דף היעד אינו תקין.",
+       "mergehistory-fail-no-change": "מיזוג ההיסטוריה לא מיזג שום גרסה. אנא בדקו שוב את הדף והזמן שציינתם.",
+       "mergehistory-fail-permission": "הרשאות לא מספיקות למיזוג היסטוריה.",
+       "mergehistory-fail-self-merge": "דף המקור זהה לדף היעד.",
+       "mergehistory-fail-timestamps-overlap": "גרסאות המקור חופפות או מגיעות אחרי גרסאות היעד.",
        "mergehistory-fail-toobig": "לא ניתן לבצע את מיזוג הגרסאות כיוון שצריך להעביר יותר גרסאות מהמגבלה, שהיא {{PLURAL:$1|גרסה אחת|‏‏֫$1 גרסאות}}.",
        "mergehistory-no-source": "דף המקור $1 אינו קיים.",
        "mergehistory-no-destination": "דף היעד $1 אינו קיים.",
        "apisandbox-intro": "השתמשו בדף הזה כדי להתנסות בשימוש ב<strong>שירות ה־API המבוסס Web של מדיה־ויקי</strong>.\nעיינו ב[[mw:API:Main page|תיעוד של ה־API]] (באנגלית) למידע נוסף של שימוש ב־API. למשל: [//www.mediawiki.org/wiki/API#A_simple_example איך לקבל את התוכן של העמוד הראשי]. בחרו באחת הפעולות (actions) לדוגמאות נוספות.\n\nשימו לב שאף שמדובר ב\"ארגז חול\", פעולות שנעשות כאן עשויות לשנות את התוכן של אתר הוויקי.",
        "apisandbox-fullscreen": "הרחבת הפאנל",
        "apisandbox-fullscreen-tooltip": "הרחבת הפאנל של ארגז החול כך שימלא את חלון הדפדפן.",
-       "apisandbox-unfullscreen": "הצג את הדף",
+       "apisandbox-unfullscreen": "הצגת הדף",
        "apisandbox-unfullscreen-tooltip": "הקטנת הפאנל של ארגז החול, כך שקישורי הניווט של מדיה־ויקי יהיו זמינים לשימוש.",
        "apisandbox-submit": "ביצוע שאילתה",
        "apisandbox-reset": "ניקוי",
        "apisandbox-retry": "ניסיון נוסף",
-       "apisandbox-loading": "×\94×\9e×\99×\93×¢ ×¢×\91×\95ר ×\9e×\95×\93×\95×\9c ×\94Ö¾APIâ\80\8f \"$1\" × ×\98×¢×\9f...",
+       "apisandbox-loading": "×\94×\9e×\99×\93×¢ ×¢×\91×\95ר ×\9e×\95×\93×\95×\9c ×\94Ö¾APIâ\80\8f \"$1\" ×\91×\98×¢×\99× ×\94...",
        "apisandbox-load-error": "אירעה שגיאה בעת טעינת המידע של מודול ה־API‏ \"$1\"‏: $2",
        "apisandbox-no-parameters": "למודול ה־API אין פרמטרים.",
        "apisandbox-helpurls": "קישורי עזרה",
        "wlshowhideanons": "משתמשים אנונימיים",
        "wlshowhidepatr": "עריכות בדוקות",
        "wlshowhidemine": "עריכות שלי",
-       "wlshowhidecategorization": "×\94×\95ספ×\95ת ×\95×\94סר×\95ת ×©×\9c ×\93פ×\99×\9d ×\9eקטגוריות",
+       "wlshowhidecategorization": "ס×\99×\95×\95×\92 ×\93פ×\99×\9d ×\9cקטגוריות",
        "watchlist-options": "אפשרויות ברשימת המעקב",
        "watching": "בהוספה לרשימת המעקב…",
        "unwatching": "בהסרה מרשימת המעקב…",
        "import-nonewrevisions": "כל הגרסאות יובאו בעבר.",
        "xml-error-string": "$1 בשורה $2, עמודה $3 (בייט מספר $4): $5",
        "import-upload": "העלאת קובץ XML",
-       "import-token-mismatch": "מידע הכניסה אבד.\nנא לנסות שוב.",
+       "import-token-mismatch": "מידע הכניסה אבד.\n\nייתכן שנותקתם מהחשבון. <strong>אנא ודאו שאתם עדיין מחוברים לחשבון ונסו שוב.</strong>\nאם זה עדיין לא עובד, נסו [[Special:UserLogout|לצאת מהחשבון]] ולהיכנס אליו שנית, וודאו שהדפדפן שלכם מאפשר קבלת עוגיות מאתר זה.",
        "import-invalid-interwiki": "לא ניתן לייבא מאתר הוויקי שצוין.",
        "import-error-edit": "לא ניתן לייבא את הדף \"$1\" כיוון שאין לך הרשאה לערוך אותו.",
        "import-error-create": "לא ניתן לייבא את הדף \"$1\" כיוון שאין לך הרשאה ליצור אותו.",
        "expand_templates_generate_xml": "הצגת עץ הפענוח של XML",
        "expand_templates_generate_rawhtml": "הצגת HTML גולמי",
        "expand_templates_preview": "תצוגה מקדימה",
-       "expand_templates_preview_fail_html": "<em>×\9e×\9b×\99×\95×\95×\9f ×©×\91{{GRAMMAR:ת×\97×\99×\9c×\99ת|{{SITENAME}}}} ×\9e×\95פע×\9cת ×\94צ×\92ת HTML ×\92×\95×\9c×\9e×\99ת ×\95×\90×\99רע ×\90×\91×\93×\9f ×\9e×\99×\93×¢ ×\9b× ×\99ס×\94, ×\94תצ×\95×\92×\94 ×\94×\9eק×\93×\99×\9e×\94 ×\9e×\95סתרת, ×\95×\96×\90ת ×\9b×\90×\9eצע×\99 ×\96×\94×\99ר×\95ת ×\9eפנ×\99 ×\94תקפ×\95ת JavaScript.</em>\n\n<strong>×\90×\9d ×\96×\94 × ×\99ס×\99×\95×\9f ×ª×§×\99×\9f ×\9c×\94צ×\99×\92 ×ª×¦×\95×\92×\94 ×\9eק×\93×\99×\9e×\94, ×\99ש ×\9cנס×\95ת ×©×\95×\91.</strong>\n×\90×\9d ×\96×\94 ×¢×\93×\99×\99×\9f ×\9c×\90 ×¢×\95×\91×\93, ×\99ש ×\9cנס×\95ת [[Special:UserLogout|×\9cצ×\90ת ×\9e×\94×\97ש×\91×\95×\9f]] ×\95×\9c×\94×\99×\9bנס ×©×\95×\91.",
+       "expand_templates_preview_fail_html": "<em>×\9b×\99×\95×\95×\9f ×©×\91{{grammar:ת×\97×\99×\9c×\99ת|{{SITENAME}}}} ×\90פשר×\95ת ×\94ש×\99×\9e×\95ש ×\91Ö¾HTML ×\92×\95×\9c×\9e×\99 ×\9e×\95פע×\9cת ×\95×\9b×\99×\95×\95×\9f ×©×\94×\99×\94 ×\90×\95×\91×\93×\9f ×©×\9c ×\9e×\99×\93×¢ ×\94×\9b× ×\99ס×\94, ×\94תצ×\95×\92×\94 ×\94×\9eק×\93×\99×\9e×\94 ×\9e×\95סתרת ×\9b×\93×\99 ×\9c×\9e× ×\95×¢ ×\94תקפ×\95ת JavaScript.</em>\n\n<strong>×\90×\9d ×\96×\94×\95 × ×\99ס×\99×\95×\9f ×\9c×\92×\99×\98×\99×\9e×\99 ×\9c×\94צ×\92ת ×ª×¦×\95×\92×\94 ×\9eק×\93×\99×\9e×\94, ×\90× ×\90 × ×¡×\95 ×©×\95×\91.</strong>\n×\90×\9d ×\96×\94 ×¢×\93×\99×\99×\9f ×\9c×\90 ×¢×\95×\91×\93, × ×¡×\95 [[Special:UserLogout|×\9cצ×\90ת ×\9e×\94×\97ש×\91×\95×\9f]] ×\95×\9c×\94×\99×\9bנס ×\90×\9c×\99×\95 ×©× ×\99ת, ×\95×\95×\93×\90×\95 ×©×\94×\93פ×\93פ×\9f ×©×\9c×\9b×\9d ×\9e×\90פשר ×§×\91×\9cת ×¢×\95×\92×\99×\95ת ×\9e×\90תר ×\96×\94.",
        "expand_templates_preview_fail_html_anon": "<em>מכיוון שב{{GRAMMAR:תחילית|{{SITENAME}}}} מופעלת הצגת HTML גולמית ולא נכנסת לחשבון, התצוגה המקדימה מוסתרת, וזאת כאמצעי זהירות מפני התקפות JavaScript.</em>\n\n<strong>אם זה ניסיון תקין להציג תצוגה מקדימה, יש [[Special:UserLogin|להיכנס לחשבון]] ולנסות שוב.</strong>",
        "expand_templates_input_missing": "יש לכתוב טקסט (לפחות טקסט קצר).",
        "pagelanguage": "שינוי שפת הדף",
index 03a3d81..5f2f664 100644 (file)
        "october-date": "$1 अक्टूबर",
        "november-date": "$1 नवम्बर",
        "december-date": "$1 दिसम्बर",
+       "period-am": "पूर्वाह्न",
+       "period-pm": "अपराह्न",
        "pagecategories": "{{PLURAL:$1|श्रेणी|श्रेणियाँ}}",
        "category_header": "\"$1\" श्रेणी में पृष्ठ",
        "subcategories": "उपश्रेणियाँ",
        "morenotlisted": "यह सूची पूर्ण नहीं है।",
        "mypage": "पृष्ठ",
        "mytalk": "वार्ता",
-       "anontalk": "à¤\87स à¤\86à¤\88॰पà¥\80 à¤\95à¥\87 à¤²à¤¿à¤¯à¥\87 à¤µà¤¾à¤°à¥\8dता",
+       "anontalk": "वार्ता",
        "navigation": "भ्रमण",
        "and": "&#32;और",
        "qbfind": "खोजें",
        "pool-servererror": "पूल काउंटर सेवा उपलब्ध नहीं है ($1)।",
        "poolcounter-usage-error": "उपयोग त्रुटि: $1",
        "aboutsite": "{{SITENAME}} के बारे में",
-       "aboutpage": "परियोजना:परिचय",
+       "aboutpage": "Project:परिचय",
        "copyright": "उपलब्ध सामग्री $1 के अधीन है जब तक अलग से उल्लेख ना किया गया हो।",
        "copyrightpage": "{{ns:project}}:कॉपीराइट",
        "currentevents": "हाल की घटनाएँ",
        "virus-scanfailed": "जाँच विफल (कूट $1)",
        "virus-unknownscanner": "अज्ञात ऐंटीवायरस:",
        "logouttext": "'''अब आप लॉग आउट कर चुके हैं।'''\n\nध्यान दें कि जब तक आप अपनी ब्राउज़र कैशे खाली नहीं करते हैं, कुछ पृष्ठ अब भी ऐसे दिख सकते हैं जैसे कि आप अभी भी लॉगिन हैं।",
+       "cannotlogoutnow-title": "अभी प्रस्थान नहीं हो रहा है",
        "welcomeuser": "आपका स्वागत है, $1!",
        "welcomecreation-msg": "आपका खाता बना दिया गया है।\nअपनी [[Special:Preferences|{{SITENAME}} वरीयताएँ]] बदलना ना भूलियेगा।",
        "yourname": "सदस्यनाम:",
        "remembermypassword": "इस ब्राउज़र पर मेरा लॉगिन याद रखें (अधिकतम $1 {{PLURAL:$1|दिन|दिनों}} के लिए)",
        "userlogin-remembermypassword": "मुझे लॉग्ड इन रखें",
        "userlogin-signwithsecure": "सुरक्षित कनेक्शन का प्रयोग करें",
+       "cannotloginnow-title": "अभी प्रवेश नहीं हो रहा है",
+       "cannotloginnow-text": "$1 का उपयोग करते समय प्रवेश नहीं हो सकता है।",
        "yourdomainname": "आपका डोमेन:",
        "password-change-forbidden": "आप इस विकि पर कूटशब्द नहीं बदल सकते हैं।",
        "externaldberror": "या तो प्रमाणिकरण डाटाबेस में त्रुटि हुई है या फिर आपको अपना बाह्य खाता अपडेट करने की अनुमति नहीं है।",
        "resetpass_submit": "कूटशब्द बनाएँ और लॉग इन करें",
        "changepassword-success": "आपका कूटशब्द बदल दिया गया है!",
        "changepassword-throttled": "आपने हाल ही में कई बार लॉग इन करने के प्रयास किये हैं।\nपुनः प्रयास करने से पहले कृपया $1 प्रतीक्षा करें।",
+       "botpasswords": "बॉट पासवर्ड",
+       "botpasswords-disabled": "बॉट पासवर्ड अभी निष्क्रिय है।",
+       "botpasswords-existing": "वर्तमान बॉट पासवर्ड",
+       "botpasswords-createnew": "बॉट के लिए नया पासवर्ड बनाएँ",
+       "botpasswords-editexisting": "बॉट के वर्तमान पासवर्ड को बदलें",
+       "botpasswords-label-appid": "बॉट नाम:",
+       "botpasswords-label-create": "बनाएँ",
+       "botpasswords-label-update": "अद्यतन",
+       "botpasswords-label-cancel": "रद्द करें",
+       "botpasswords-label-delete": "हटाएँ",
+       "botpasswords-label-resetpassword": "पासवर्ड पुनः तय करें",
+       "botpasswords-created-title": "बॉट पासवर्ड निर्मित हुआ",
+       "botpasswords-created-body": "बॉट पासवर्ड \"$1\" सफलतापूर्वक निर्मित हुआ।",
+       "botpasswords-updated-title": "बॉट पासवर्ड अद्यतन हुआ",
+       "botpasswords-updated-body": "बॉट पासवर्ड \"$1\" सफलतापूर्वक अद्यतन हुआ।",
+       "botpasswords-deleted-title": "बॉट पासवर्ड हट गया",
+       "botpasswords-deleted-body": "बॉट पासवर्ड \"$1\" हट गया।",
        "resetpass_forbidden": "कूटशब्द बदले नहीं जा सकते",
        "resetpass-no-info": "इस पृष्ठ का सीधे प्रयोग करने के लिए आपको लॉग इन करना होगा।",
        "resetpass-submit-loggedin": "कूटशब्द बदलें",
        "passwordreset-emailtext-user": "{{SITENAME}} ($4) पर सदस्य $1 ने आपके {{PLURAL:$3|खाते|खातों}} के कूटशब्द को रीसेट करने का अनुरोध किया है। इस ई-मेल पते से निम्न {{PLURAL:$3|खाता जुड़ा है|खाते जुड़े हैं}}:\n\n$2\n\n{{PLURAL:$3|यह|ये}} अस्थायी कूटशब्द {{PLURAL:$5|एक दिन|$5 दिनों}} के बाद काम नहीं करेंगे।\nआपको लॉग इन करके एक नया कूटशब्द अभी चुन लेना चाहिए। यदि यह अनुरोध किसी और ने किया है, या फिर आपको अपना मूल कूटशब्द याद आ गया है, और आप {{PLURAL:$3|अपना|अपने}} कूटशब्द नहीं बदलना चाहते, आप इस संदेश को अनदेखा कर के अपने पुराने कूटशब्द का प्रयोग जारी रख सकते हैं।",
        "passwordreset-emailelement": "सदस्यनाम: \n$1\n\nअस्थायी कूटशब्द: \n$2",
        "passwordreset-emailsentemail": "एक कूटशब्द रीसेट ई-मेल भेज दिया गया है।",
+       "passwordreset-emailsentusername": "यदि कोई ईमेल इस खाते से जुड़ी है तो पासवर्ड आपके ईमेल में भेज दिया जाएगा।",
        "passwordreset-emailsent-capture": "नीचे दिखाया गया कूटशब्द रीसेट ई-मेल भेज दिया गया है।",
        "passwordreset-emailerror-capture": "नीचे दृष्टित कूटशब्द रीसेट ई-मेल उत्पन्न किया गया था, परंतु उसे {{GENDER:$2|सदस्य}} को भेजना असफल रहा।\nत्रुटि: $1",
        "changeemail": "ई-मेल पता परिवर्तित करें",
        "mergehistory-empty": "कोई भी अवतरण एकत्रित नहीं कर सकते।",
        "mergehistory-done": "$1 {{PLURAL:$3|का|के}} $3 अवतरण [[:$2]] में एकत्रित कर {{PLURAL:$3|दिया गया है|दिये गए हैं}}।",
        "mergehistory-fail": "इतिहास एकत्रित नहीं कर सकते, कृपया पृष्ठ और समय की पुनः जाँच करें।",
+       "mergehistory-fail-invalid-source": "अमान्य स्रोत पृष्ठ",
+       "mergehistory-fail-invalid-dest": "अमान्य लक्ष्य पृष्ठ",
        "mergehistory-fail-toobig": "इतिहास विलय करना संभव नहीं है क्योंकि अवतरण सीमा $1 से अधिक {{PLURAL:$1|अवतरण|अवतरणों}} को स्थानांतरित करना होगा।",
        "mergehistory-no-source": "स्रोत पृष्ठ $1 मौजूद नहीं है।",
        "mergehistory-no-destination": "लक्ष्य पृष्ठ $1 मौजूद नहीं है।",
        "right-managechangetags": "डेटाबेस से [[Special:Tags|चिप्पियाँ]] बनायें और हटायें",
        "right-applychangetags": "प्रयोग में लाइये [[Special:Tags|tags]] किसी के बदलाव के साथ।",
        "right-changetags": "जमा करो और हटाओ स्वतंत्र [[Special:Tags|टैग]] व्यक्तिगत अवतरणों और लॉग प्रविक्तियों पर",
+       "grant-group-email": "ई-मेल भेजें",
+       "grant-createaccount": "खाता बनाएँ",
+       "grant-editmywatchlist": "ध्यानसूची संपादित करें",
+       "grant-basic": "सामान्य अधिकार",
+       "grant-viewmywatchlist": "अपनी ध्यानसूची देखें",
        "newuserlogpage": "सदस्य खाता निर्माण लॉग",
        "newuserlogpagetext": "यह सदस्य खातों के निर्माण का लॉग है।",
        "rightslog": "सदस्य अधिकार लॉग",
        "foreign-structured-upload-form-label-own-work-message-shared": "कम से कम इस फ़ाइल का प्रतिकृति अधिकार मेरे पास है और यह [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] के अंतर्गत है, व [https://wikimediafoundation.org/wiki/Terms_of_Use विकि उपयोग की शर्तों] का भी पालन करता है।",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "यदि आपके पास इस फ़ाइल का प्रतिकृति अधिकार नहीं है और आप इसे किसी और अधिकार के तहत प्रदर्शित करना चाहते हैं तो आप [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard] का उपयोग करें।",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "यदि आप चाहें तो आप [[Special:Upload|{{SITENAME}} के पृष्ठ]] पर फ़ाइल डाल सकते हैं, यदि यह फ़ाइल वहाँ के नियम के अंतर्गत हो तो।",
+       "foreign-structured-upload-form-3-label-question-website": "क्या आपने यह छवि किसी जालस्थल (वेबसाइट) से ली है, या छवि खोज के द्वारा प्राप्त की है?",
+       "foreign-structured-upload-form-3-label-question-ownwork": "क्या आपने इस छवि का निर्माण (आपके द्वारा खिचा हुआ, चित्रकारी, आदि) किया है?",
        "foreign-structured-upload-form-3-label-yes": "हाँ",
        "foreign-structured-upload-form-3-label-no": "नहीं",
        "backend-fail-stream": "फ़ाइल $1 स्ट्रीम नहीं हो पाई।",
        "usereditcount": "$1 {{PLURAL:$1|सम्पादन}}",
        "usercreated": "$1 को $2 बजे बनाया गया, सदस्यनाम $3 है",
        "newpages": "नए पृष्ठ",
+       "newpages-submit": "दिखाएँ",
        "newpages-username": "सदस्यनाम:",
        "ancientpages": "सबसे पुराने पृष्ठ",
        "move": "स्थानान्तरण",
        "specialloguserlabel": "कर्ता:",
        "speciallogtitlelabel": "प्रयोजन (शीर्षक अथवा सदस्यनाम):",
        "log": "लॉग",
+       "logeventslist-submit": "दिखाएँ",
        "all-logs-page": "सभी सार्वजनिक लॉग",
        "alllogstext": "{{SITENAME}} की सभी उपलब्ध लॉगों की प्रविष्टियों का मिला-जुला प्रदर्शन।\nआप और बारीकी के लिए लॉग का प्रकार, सदस्य नाम (लघु-दीर्घ-अक्षर संवेदी), या प्रभावित पृष्ठ (लघु-दीर्घ-अक्षर संवेदी) चुन सकते हैं।",
        "logempty": "लॉग में ऐसी प्रविष्टि नहीं है।",
        "cachedspecial-viewing-cached-ts": "आप इस पृष्ठ का कैश किया हुआ अवतरण देख रहे हैं, जो कि संभवतः वर्तमान अवस्था से भिन्न हो।",
        "cachedspecial-refresh-now": "नवीनतम देखें।",
        "categories": "श्रेणियाँ",
+       "categories-submit": "दिखाएँ",
        "categoriespagetext": "निम्नोक्त {{PLURAL:$1|श्रेणी|श्रेणियों}} में पृष्ठ या मीडिया है।\nजिन श्रेणियों का [[Special:UnusedCategories|अप्रयुक्त श्रेणियाँ]] यहाँ नहीं दिखाई गई हैं।\n[[Special:WantedCategories|वांछित श्रेणियाँ]] भी देखें।",
        "categoriesfrom": "इस अक्षर से शुरू होने वाली श्रेणीयाँ दर्शायें:",
        "special-categories-sort-count": "संख्यानुसार शक्रमांकित करें",
        "wlheader-showupdated": "पृष्ठ जो आपके द्वारा देखे जाने के बाद बदले गये हैं '''बोल्ड''' दिखेंगे।",
        "wlnote": "$3 को $4 बजे तक पिछले <strong>$2</strong> {{PLURAL:$2|घंटे|घंटों}} में {{PLURAL:$1|हुआ एक|हुए <strong>$1</strong>}} परिवर्तन निम्न {{PLURAL:$1|है|हैं}}।",
        "wlshowlast": "पिछले $1 घंटे $2 दिन  देखें",
+       "watchlist-hide": "छुपाएँ",
+       "watchlist-submit": "दिखाएँ",
        "wlshowtime": "अंतिम दिखाएँ:",
        "wlshowhideminor": "छोटा संपादन",
        "wlshowhidebots": "बॉट",
        "delete-confirm": "\"$1\" को हटाएँ",
        "delete-legend": "हटाएँ",
        "historywarning": "<strong>चेतावनी:<strong> आप जो पृष्ठ हटाने जा रहे हैं उसके इतिहास में $1 {{PLURAL:$1|अवतरण}} हैं:",
+       "historyaction-submit": "दिखाएँ",
        "confirmdeletetext": "आप एक पृष्ठ को उसके सभी अवतरणों सहित हटाने जा रहे हैं।\nजाँच लें कि आप ये करना चाहते हैं, आप इसके पर्निआमों से अवगत हैं, और आप ये [[{{MediaWiki:Policy-url}}|नीति]] के अनुसार कर रहे हैं।",
        "actioncomplete": "कार्य पूर्ण",
        "actionfailed": "क्रिया विफल",
index 01b0a23..b4a6817 100644 (file)
        "readonly": "Az adatbázis le van zárva",
        "enterlockreason": "Add meg a lezárás okát, valamint egy becslést, hogy mikor lesz a lezárásnak vége",
        "readonlytext": "A wiki adatbázisa ideiglenesen le van zárva (valószínűleg adatbázis-karbantartás miatt). A lezárás időtartama alatt a lapok nem szerkeszthetők, és új szócikkek sem hozhatók létre, az oldalakat azonban lehet böngészni.\n\nAz rendszeradminisztrátor, aki lezárta az adatbázist, az alábbi indoklást adta: $1",
-       "missing-article": "Az adatbázisban nem található meg a(z) „$1” című lap szövege $2.\n\nEnnek az oka általában az, hogy egy olyan lapra vonatkozó linket követtél, amit már töröltek.\n\nHa ez nem így van, lehet, hogy hibát találtál a szoftverben.\nJelezd ezt egy [[Special:ListUsers/sysop|adminiszttrátornak]] az URL megadásával.",
+       "missing-article": "Az adatbázisban nem található meg a(z) „$1” című lap szövege $2.\n\nEnnek az oka általában az, hogy egy olyan lapra vonatkozó linket követtél, amelyet már töröltek.\n\nHa ez nem így van, lehet, hogy hibát találtál a szoftverben.\nJelezd ezt egy [[Special:ListUsers/sysop|adminiszttrátornak]] az URL megadásával.",
        "missingarticle-rev": "(változat azonosítója: $1)",
        "missingarticle-diff": "(eltérés: $1, $2)",
        "readonly_lag": "Az adatbázis automatikusan le lett zárva, amíg a mellékkiszolgálók utolérik a főkiszolgálót.",
        "badtitle": "Hibás cím",
        "badtitletext": "A kért oldal címe érvénytelen, üres, vagy rosszul hivatkozott nyelvközi vagy wikiközi cím volt. Olyan karaktereket is tartalmazhatott, melyek címekben nem használhatók.",
        "title-invalid-empty": "A kért lapcím üres vagy csak egy névtér nevét tartalmazza.",
-       "title-invalid-utf8": "A kért oldal címe tartalmazza érvénytelen UTF-8 karaktert tartalmaz.",
+       "title-invalid-utf8": "A kért oldal címe érvénytelen UTF-8 szekvenciát tartalmaz.",
        "title-invalid-interwiki": "A cím interwiki-hivatkozást tartalmaz, amelyet nem lehet címben használni.",
-       "title-invalid-talk-namespace": "A kért lapcím egy olyan vitalapra hivatkozik, ami nem létezhet.",
+       "title-invalid-talk-namespace": "A kért lapcím olyan vitalapra hivatkozik, amely nem létezhet.",
        "title-invalid-characters": "A kért lapcím érvénytelen karaktereket tartalmaz: „$1”",
        "title-invalid-relative": "A cím relatív útvonalat tartalmaz. A relatív lapcímek (./, ../) érvénytelenek, mert gyakran elérhetetlenné válnak, amikor a felhasználó böngészője feldolgozza őket.",
        "title-invalid-magic-tilde": "A kért oldal címe érvénytelen mágikus tilde sorozatot (<nowiki>~~~</nowiki>) tartalmaz.",
        "viewsource-title": "$1 forrásának megtekintése",
        "actionthrottled": "Művelet megszakítva",
        "actionthrottledtext": "A visszaélések elleni védekezés miatt nem végezheted el a műveletet túl sokszor egy adott időn belül, és te átlépted a megengedett határt. Próbálkozz újra néhány perc múlva.",
-       "protectedpagetext": "Ez egy védett lap, így nem végezhető rajta szerkesztés és más tevékenység.",
+       "protectedpagetext": "Ez egy védett lap, így nem végezhető rajta szerkesztés és más művelet.",
        "viewsourcetext": "Megtekintheted és másolhatod a lap forrását.",
        "viewyourtext": "Megtekintheted és kimásolhatod a <strong>saját szerkesztéseidet</strong> az alábbi lapra.",
        "protectedinterface": "Ez a lap a szoftver felületéhez szolgáltat szöveget, és a visszaélések elkerülése miatt le van zárva.",
        "ns-specialprotected": "A speciális lapok nem szerkeszthetők.",
        "titleprotected": "Ilyen címmel nem lehet szócikket készíteni, [[User:$1|$1]] letiltotta.\nAz indoklás: „''$2''”.",
        "filereadonlyerror": "A(z) „$1” fájl nem módosítható, mert a(z) „$2” fájltároló csak olvasható módban üzemel.\n\nA lezárást végrehajtó rendszeradminisztrátor az alábbi indoklást adta meg: „$3”.",
-       "invalidtitle-knownnamespace": "Érvénytelen cím \"$2\" névtérrel és \"$3\" szöveggel",
-       "invalidtitle-unknownnamespace": "Érvénytelen cím az ismeretlen $1 névtérszámmal és \"$2\" szöveggel",
+       "invalidtitle-knownnamespace": "Érvénytelen cím „$2” névtérrel és „$3” szöveggel",
+       "invalidtitle-unknownnamespace": "Érvénytelen cím az ismeretlen $1 névtérszámmal és „$2” szöveggel",
        "exception-nologin": "Nem vagy bejelentkezve.",
        "exception-nologin-text": "Ezen lap vagy művelet eléréséhez kérlek [[Special:Userlogin|jelentkezz be]].",
        "exception-nologin-text-manual": "Ezen lap vagy művelet eléréséhez $1.",
        "number_of_watching_users_pageview": "[Jelenleg {{PLURAL:$1|egy|$1}} felhasználó figyeli]",
        "rc_categories": "Szűkítés kategóriákra („|” jellel válaszd el őket)",
        "rc_categories_any": "Választottak közül bármelyik",
-       "rc-change-size-new": "$1 {{PLURAL:$1|byte}} módosítás után",
+       "rc-change-size-new": "$1 bájt módosítás után",
        "newsectionsummary": "/* $1 */ (új szakasz)",
        "rc-enhanced-expand": "Részletek megjelenítése",
        "rc-enhanced-hide": "Részletek elrejtése",
        "wlshowhideliu": "bejelentkezett felhasználók",
        "wlshowhideanons": "névtelen felhasználók",
        "wlshowhidemine": "saját szerkesztéseim",
+       "wlshowhidecategorization": "kategóriaváltozások",
        "watchlist-options": "A figyelőlista beállításai",
        "watching": "Figyelés...",
        "unwatching": "Figyelés befejezése...",
index 3c734c9..4128cc0 100644 (file)
        "wlnote": "Ստորև բերված {{PLURAL:$1|է վերջին փոփոխությունը|են վերջին '''$1''' փոփոխությունները}} վերջին <strong>$2</strong> ժամվա ընթացքում։",
        "wlshowlast": "Ցուցադրել վերջին $1 ժամերը $2 օրերը",
        "watchlist-submit": "Ցույց տալ",
+       "wlshowhideliu": "գրանցված մասնակիցներ",
+       "wlshowhidemine": "իմ խմբագրումները",
        "watchlist-options": "Հսկացանկի նախընտրություններ",
        "watching": "Հսկվում է...",
        "unwatching": "Հանվում է հսկումից...",
index 0aefcf4..7f3277f 100644 (file)
@@ -51,6 +51,7 @@
        "tog-hideminor": "Sembunyikan suntingan kecil di perubahan terbaru",
        "tog-hidepatrolled": "Sembunyikan suntingan terpatroli di perubahan terbaru",
        "tog-newpageshidepatrolled": "Sembunyikan halaman terpatroli dari daftar halaman baru",
+       "tog-hidecategorization": "Sembunyikan pengategorian halaman",
        "tog-extendwatchlist": "Kembangkan daftar pantauan untuk menunjukkan semua perubahan, tidak hanya yang terbaru",
        "tog-usenewrc": "Kelompokkan suntingan di tampilan perubahan terbaru dan daftar pantauan berdasarkan halaman",
        "tog-numberheadings": "Beri nomor judul secara otomatis",
        "tog-watchlisthidebots": "Sembunyikan suntingan bot di daftar pantauan",
        "tog-watchlisthideminor": "Sembunyikan suntingan kecil di daftar pantauan",
        "tog-watchlisthideliu": "Sembunyikan suntingan pengguna masuk log di daftar pantauan",
+       "tog-watchlistreloadautomatically": "Muat ulang daftar pantauan secara otomatis ketika sebuah penyaring berubah (JavaScript diperlukan)",
        "tog-watchlisthideanons": "Sembunyikan suntingan pengguna anonim di daftar pantauan",
        "tog-watchlisthidepatrolled": "Sembunyikan suntingan terpatroli di daftar pantauan",
+       "tog-watchlisthidecategorization": "Sembunyikan pengategorian halaman",
        "tog-ccmeonemails": "Kirimkan saya salinan surel yang saya kirimkan ke orang lain",
        "tog-diffonly": "Jangan tampilkan isi halaman di bawah perbedaan suntingan",
        "tog-showhiddencats": "Tampilkan kategori tersembunyi",
        "october-date": "$1 Oktober",
        "november-date": "$1 November",
        "december-date": "$1 Desember",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategori}}",
        "category_header": "Halaman dalam kategori \"$1\"",
        "subcategories": "Subkategori",
        "morenotlisted": "Daftar ini belum lengkap.",
        "mypage": "Halaman",
        "mytalk": "Pembicaraan",
-       "anontalk": "Pembicaraan IP ini",
+       "anontalk": "Pembicaraan",
        "navigation": "Navigasi",
        "and": "&#32;dan",
        "qbfind": "Pencarian",
        "laggedslavemode": "Peringatan: Halaman mungkin tidak berisi perubahan terbaru.",
        "readonly": "Basis data dikunci",
        "enterlockreason": "Masukkan alasan penguncian, termasuk perkiraan kapan kunci akan dibuka",
-       "readonlytext": "Basis data sedang dikunci terhadap masukan baru. Pengurus yang melakukan penguncian memberikan penjelasan sebagai berikut: <p>$1",
+       "readonlytext": "Basis data sedang dikunci terhadap masukan dan perubahan baru, mungkin dalam pembenahan basis data, setelah selesai keadaan akan normal sedia kala. \n\nPengurus yang melakukan penguncian memberikan penjelasan sebagai berikut: $1",
        "missing-article": "Basis data tidak dapat menemukan teks dari halaman yang seharusnya ada, yaitu \"$1\" $2.\n\nHal ini biasanya disebabkan oleh pranala usang ke revisi terdahulu halaman yang telah dihapuskan.\n\nJika bukan ini penyebabnya, Anda mungkin telah menemukan sebuah bug dalam perangkat lunak.\nSilakan laporkan hal ini kepada salah seorang [[Special:ListUsers/sysop|Pengurus]], dengan menyebutkan alamat URL yang dituju.",
        "missingarticle-rev": "(revisi#: $1)",
        "missingarticle-diff": "(Beda: $1, $2)",
        "readonly_lag": "Basis data telah dikunci otomatis selagi basis data sekunder melakukan sinkronisasi dengan basis data utama",
+       "nonwrite-api-promise-error": "Kepala HTTP 'Promise-Non-Write-API-Action' telah dikirim tetapi permintaan dibuat kepada modul menulis API.",
        "internalerror": "Kesalahan internal",
        "internalerror_info": "Kesalahan internal: $1",
        "internalerror-fatal-exception": "Kekecualian fatal mengetik \"$1\"",
        "badtitle": "Judul tidak sah",
        "badtitletext": "Judul halaman yang diminta tidak sah, kosong, atau judul antarbahasa atau antarwiki yang salah sambung.",
        "title-invalid-empty": "Judul halaman yang diminta kosong atau berisi hanya nama sebuah ruang nama.",
+       "title-invalid-utf8": "Judul halaman yang diminta mengandung rangkaian UTF-8 yang tidak sah.",
+       "title-invalid-interwiki": "Judul mengandung pranala antarwiki yang tidak bisa digunakan dalam judul.",
+       "title-invalid-talk-namespace": "Judul situs yang diminta merujuk kepada halaman pembicaraan yang tidak dapat tersedia.",
+       "title-invalid-characters": "Judul halaman yang diminta mengandung karakter tak sah: \"$1\".",
+       "title-invalid-relative": "Judul mengandung alamat relatif. Judul halaman relatif (./, ../) tidaklah sah, karena dapat mengalami kegagalan ketika ditangani oleh peramban pengguna.",
+       "title-invalid-magic-tilde": "Judul halaman mengandung rangkaian tilda yang tidak sah (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Judul halaman yang diminta terlalu panjang. Ia harus dikodekan dengan UTF-8 dan tidak melebihi $1 bita.",
+       "title-invalid-leading-colon": "Judul halaman yang diminta dimulai dengan tanda titik dua yang tidak sah.",
        "perfcached": "Data berikut ini diambil dari singgahan dan mungkin bukan data mutakhir. {{PLURAL:$1|Hasil}} maksimal ada di singgahan.",
        "perfcachedts": "Data berikut ini diambil dari singgahan dan terakhir diperbarui pada $1. {{PLURAL:$4|Hasil}} maksimal ada di singgahan.",
        "querypage-no-updates": "Pemutakhiran dari halaman ini sedang dimatikan. Data yang ada di sini saat ini tidak akan dimuat ulang.",
        "viewsource": "Lihat sumber",
        "viewsource-title": "Lihat sumber untuk $1",
        "actionthrottled": "Tindakan dibatasi",
-       "actionthrottledtext": "Anda dibatasi untuk melakukan tindakan ini terlalu banyak dalam waktu pendek. Silakan mencoba lagi setelah beberapa menit.",
+       "actionthrottledtext": "Anda dibatasi untuk melakukan tindakan ini terlalu banyak dalam waktu pendek, dan Anda telah melebihi batas yang diberikan. Silakan mencoba lagi setelah beberapa menit.",
        "protectedpagetext": "Halaman ini telah dikunci untuk menghindari penyuntingan atau tindakan lain.",
-       "viewsourcetext": "Anda dapat melihat atau menyalin sumber halaman ini:",
-       "viewyourtext": "Anda dapat melihat atau menyalin sumber dari '''suntingan Anda''' ke halaman ini:",
+       "viewsourcetext": "Anda dapat melihat atau menyalin sumber halaman ini.",
+       "viewyourtext": "Anda dapat melihat dan menyalin sumber dari '''suntingan Anda''' ke halaman ini.",
        "protectedinterface": "Halaman ini memuat teks antarmuka untuk perangkat lunak pada wiki ini, dan dilindungi terhadap penyalahgunaan. Untuk menambah atau mengubah terjemahan pada semua wiki, harap gunakan [//translatewiki.net/ translatewiki.net], proyek pelokalan MediaWiki.",
        "editinginterface": "<strong>Peringatan:</strong> Anda menyunting suatu halaman yang digunakan untuk menyediakan teks antarmuka bagi perangkat lunak.\nPerubahan pada halaman ini akan memengaruhi tampilan pada antarmuka pengguna untuk pengguna lain pada wiki ini.",
        "translateinterface": "Untuk menambah atau mengubah terjemahan semua wiki, mohon gunakan [//translatewiki.net/ translatewiki.net], proyek pelokalan MediaWiki.",
        "mypreferencesprotected": "Anda tidak memiliki izin untuk menyunting preferensi Anda.",
        "ns-specialprotected": "Halaman pada ruang nama {{ns:special}} tidak dapat disunting.",
        "titleprotected": "Judul ini dilindungi dari pembuatan oleh [[User:$1|$1]].\nAlasan yang diberikan adalah ''$2''.",
-       "filereadonlyerror": "Tidak dapat memodifikasi file \" $1 \" karena file repositori \" $2 \" adalah pada mode baca-saja.\n\nAdministrator yang terkunci menawarkan penjelasan ini: \" $3 \".",
+       "filereadonlyerror": "Tidak dapat memodifikasi berkas \"$1\" karena file repositori \"$2\" adalah pada mode baca-saja.\n\nPengurus yang menguncinya memberikan alasan: \"$3\".",
        "invalidtitle-knownnamespace": "Judul yang tidak sah dengan ruangnama \"$2\" dan teks \"$3\"",
        "invalidtitle-unknownnamespace": "Judul yang tidak sah dengan nomor ruang nama tidak diketahui $1 dan teks \"$2\"",
        "exception-nologin": "Belum masuk log",
        "virus-scanfailed": "Pemindaian gagal (kode $1)",
        "virus-unknownscanner": "Antivirus tidak dikenal:",
        "logouttext": "'''Anda telah keluar log dari sistem.'''\n\nIngatlah bahwa beberapa halaman mungkin masih menampilkan anda seperti masih masuk log, sampai Anda membersihkan singgahan penjelajah web Anda.",
+       "cannotlogoutnow-title": "Tidak dapat keluar log saat ini",
+       "cannotlogoutnow-text": "Keluar log tidak memungkinkan ketika menggunakan $1.",
        "welcomeuser": "Selamat datang,  $1 !",
        "welcomecreation-msg": "Akun Anda telah dibuat. Jangan lupa mengatur konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] Anda.",
        "yourname": "Nama pengguna:",
        "remembermypassword": "Ingat kata sandi saya di komputer ini (selama $1 {{PLURAL:$1|hari|hari}})",
        "userlogin-remembermypassword": "Biarkan saya tetap masuk",
        "userlogin-signwithsecure": "Gunakan server aman",
+       "cannotloginnow-title": "Tidak dapat masuk log saat ini",
+       "cannotloginnow-text": "Masuk log tidak memungkinkan ketika menggunakan $1.",
        "yourdomainname": "Domain Anda:",
        "password-change-forbidden": "Anda tidak dapat mengubah kata sandi pada wiki ini.",
        "externaldberror": "Telah terjadi kesalahan otentikasi basis data eksternal atau Anda tidak diizinkan melakukan kemaskini terhadap akun eksternal Anda.",
        "createacct-benefit-body2": "{{PLURAL:$1|halaman}}",
        "createacct-benefit-body3": "{{PLURAL:$1|kontributor}} terakhir",
        "badretype": "Kata sandi yang Anda masukkan salah.",
+       "usernameinprogress": "Pembuatan akun untuk nama pengguna ini sedang dijalankan. Silahkan tunggu.",
        "userexists": "Nama pengguna yang dimasukkan telah digunakan.\nSilakan tentukan nama yang lain.",
        "loginerror": "Kesalahan masuk log",
        "createacct-error": "Pembuatan akun gagal",
        "wrongpasswordempty": "Anda tidak memasukkan kata sandi. Silakan coba lagi.",
        "passwordtooshort": "Kata sandi paling tidak harus terdiri dari {{PLURAL:$1|1 karakter|$1 karakter}}.",
        "passwordtoolong": "Passwords tidak boleh lebih dari {{PLURAL:$1|1 karakter|$1 karakter}}.",
+       "passwordtoopopular": "Kata sandi yang umum tidak dapat digunakan. Silakan pilih kata sandi yang berbeda.",
        "password-name-match": "Kata sandi Anda harus berbeda dari nama pengguna Anda.",
        "password-login-forbidden": "Penggunaan nama pengguna dan sandi ini telah dilarang.",
        "mailmypassword": "Setel ulang kata sandi",
        "noemail": "Tidak ada alamat surel yang tercatat untuk pengguna \"$1\".",
        "noemailcreate": "Anda perlu menyediakan alamat surel yang sah",
        "passwordsent": "Kata sandi baru telah dikirimkan ke alamat surel yang didaftarkan untuk \"$1\".\nSilakan masuk log kembali setelah menerima surel tersebut.",
-       "blocked-mailpassword": "Alamat IP Anda diblokir dari penyuntingan dan karenanya tidak diizinkan menggunakan fungsi pengingat kata sandi untuk mencegah penyalahgunaan.",
+       "blocked-mailpassword": "Alamat IP Anda diblokir dari penyuntingan sehingga tidak diizinkan menggunakan fungsi pengingat kata sandi untuk mencegah penyalahgunaan.",
        "eauthentsent": "Sebuah surel untuk konfirmasi telah dikirim ke alamat surel. Sebelum surel lainnya dikirim ke akun tersebut, Anda harus mengikuti instruksi di dalam surel tersebut, untuk melakukan konfirmasi bahwa alamat tersebut adalah benar kepunyaan Anda.",
        "throttled-mailpassword": "Suatu pengingat kata sandi telah dikirimkan dalam {{PLURAL:$1|$1 jam}} terakhir.\nUntuk menghindari penyalahgunaan, hanya satu kata sandi yang akan dikirimkan setiap {{PLURAL:$1|$1 jam}}.",
        "mailerror": "Kesalahan dalam mengirimkan surel: $1",
        "resetpass_submit": "Atur kata sandi dan masuk log",
        "changepassword-success": "Kata sandi Anda telah berhasil diubah!",
        "changepassword-throttled": "Anda terlalu sering mencoba masuk log.\nMohon tunggu $1 sebelum mencoba lagi.",
+       "botpasswords": "Kata sandi bot",
+       "botpasswords-disabled": "Kata sandi bot dinonaktifkan.",
+       "botpasswords-no-central-id": "Untuk menggunakan kata sandi bot, Anda harus masuk log ke akun yang telah tersentralisasi.",
+       "botpasswords-existing": "Kata sandi bot tersedia",
+       "botpasswords-createnew": "Buat kata sandi bot baru",
+       "botpasswords-editexisting": "Ubah kata sandi bot yang sudah ada",
+       "botpasswords-label-appid": "Nama bot:",
+       "botpasswords-label-create": "Buat",
+       "botpasswords-label-update": "Perbarui",
+       "botpasswords-label-cancel": "Batalkan",
+       "botpasswords-label-delete": "Hapus",
+       "botpasswords-label-resetpassword": "Setel ulang kata sandi",
+       "botpasswords-label-grants": "Akses yang dapat diberikan:",
        "resetpass_forbidden": "Kata sandi tidak dapat diubah",
        "resetpass-no-info": "Anda harus masuk log untuk mengakses halaman ini secara langsung.",
        "resetpass-submit-loggedin": "Ganti kata sandi",
        "missing-revision": "Revisi #$1 halaman berjudul \"{{FULLPAGENAME}}\" tidak eksis.\n\nHal ini biasanya disebabkan oleh tautan versi terdahulu menuju halaman yang sudah dihapus.\nRinciannya dapat ditemukan di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].",
        "userpage-userdoesnotexist": "Akun pengguna \"<nowiki>$1</nowiki>\" tidak terdaftar.",
        "userpage-userdoesnotexist-view": "Pengguna \"$1\" tidak terdaftar.",
-       "blocked-notice-logextract": "Pengguna ini sedang diblokir.\nEntri log pemblokiran terakhir tersedia di bawah ini sebagai rujukan.",
+       "blocked-notice-logextract": "Pengguna ini sedang diblokir.\nEntri log pemblokiran terakhir tersedia di bawah ini sebagai rujukan:",
        "clearyourcache": "'''Catatan:''' Setelah menyimpan, Anda mungkin harus memintas singgahan peramban Anda untuk melihat perubahan.\n* '''Firefox / Safari:''' Tahan ''Shift'' sambil mengeklik ''Reload'', atau tekan ''Ctrl-F5'' atau ''Ctrl-R'' (''⌘-R'' di Mac)\n* '''Google Chrome:''' Tekan ''Ctrl-Shift-R'' (''⌘-Shift-R'' di Mac)\n* '''Internet Explorer:''' Tahan ''Ctrl'' sambl mengeklik ''Refresh'', atau tekan ''Ctrl-F5''\n* '''Opera:''' Bersihkan tembolok di ''Tools → Preferences''",
        "usercssyoucanpreview": "'''Tips:''' Gunakan tombol \"{{int:showpreview}}\" untuk menguji CSS baru Anda sebelum menyimpannya.",
        "userjsyoucanpreview": "'''Tips:''' Gunakan tombol \"{{int:showpreview}}\" untuk menguji JS baru Anda sebelum menyimpannya.",
        "revdelete-edit-reasonlist": "Alasan penghapusan suntingan",
        "revdelete-offender": "Revisi penulis:",
        "suppressionlog": "Log penyembunyian",
-       "suppressionlogtext": "Berikut adalah daftar penghapusan dan pemblokiran, termasuk konten yang disembunyikan dari para pengurus.\nLihat [[Special:BlockList|daftar pemblokiran]] untuk daftar terkininya.",
+       "suppressionlogtext": "Berikut adalah daftar penghapusan dan pemblokiran, termasuk isi yang disembunyikan dari para pengurus.\nLihat [[Special:BlockList|daftar pemblokiran]] untuk daftar terkininya.",
        "mergehistory": "Riwayat penggabungan sejarah halaman",
        "mergehistory-header": "Halaman ini memperbolehkan Anda untuk menggabungkan revisi-revisi dari satu halaman sumber ke halaman yang lebih baru.\nPastikan bahwa perubahan ini tetap mempertahankan kontinuitas versi terdahulu halaman.",
        "mergehistory-box": "Gabung revisi-revisi dari dua halaman:",
        "action-undelete": "membatalkan penghapusan halaman ini",
        "action-suppressrevision": "meninjau dan mengembalikan revisi yang disembunyikan ini",
        "action-suppressionlog": "melihat log privat ini",
-       "action-block": "memblokir pengguna ini dari menyunting",
+       "action-block": "memblokir pengguna ini dari penyuntingan",
        "action-protect": "mengganti tingkat pelindungan halaman ini",
        "action-rollback": "mengembalikan dengan cepat suntingan-suntingan pengguna terakhir yang menyunting halaman tertentu",
        "action-import": "mengimpor halaman ini dari wiki lain",
        "filewasdeleted": "Suatu berkas dengan nama ini pernah dimuat dan selanjutnya dihapus. Harap cek $1 sebelum memuat lagi berkas tersebut.",
        "filename-bad-prefix": "Nama berkas yang Anda muat diawali dengan '''\"$1\"''', yang merupakan nama non-deskriptif yang biasanya diberikan secara otomatis oleh kamera digital. Harap pilih nama lain yang lebih deskriptif untuk berkas Anda.",
        "filename-prefix-blacklist": " #<!-- biarkan baris ini seperti adanya --> <pre>\n# Contohnya sebagai berikut:\n#   * Semuanya dari karekter \"#\" sampai akhir baris ini adalah komentar\n#   * Setiap garis \"_\" adalah awalan untuk nama file khas yang diberikan secara otomatis oleh kamera digital\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # beberapa model telpon seluler\nIMG # generik\nJD # Jenoptik\nMGP # Pentax\nPICT # lainnya.\n #</pre> <!-- biarkan baris ini seperti adanya -->",
-       "upload-success-subj": "Berhasil dimuat",
-       "upload-success-msg": "Pengunggahan Anda dari [$2] berhasil. Hasilnya tersedia di sini: [[:{{ns:file}}:$1]]",
-       "upload-failure-subj": "Masalah pengunggahan",
-       "upload-failure-msg": "Ada masalah dengan unggahan Anda dari [$2]:\n\n$1",
-       "upload-warning-subj": "Peringatan pemuatan",
-       "upload-warning-msg": "Terjadi masalah dengan unggahan Anda dari [$2]. Anda dapat kembali ke [[Special:Upload/stash/$1|formulir pengunggahan]] untuk memerbaiki masalah ini.",
        "upload-proto-error": "Protokol tak tepat",
        "upload-proto-error-text": "Pemuatan jarak jauh membutuhkan URL yang diawali dengan <code>http://</code> atau <code>ftp://</code>.",
        "upload-file-error": "Kesalahan internal",
        "querypage-disabled": "Halaman istimewa ini dinonaktifkan demi alasan kinerja.",
        "apihelp": "Bantuan API",
        "apihelp-no-such-module": "Modul \"$1\" tidak ditemukan.",
+       "apisandbox": "Bak pasir API",
+       "apisandbox-api-disabled": "API dinonaktifkan pada situs ini.",
+       "apisandbox-intro": "Gunakan halaman ini untuk bereksperimen dengan '''API layanan web MediaWiki'''.\nLihat [//www.mediawiki.org/wiki/API:Main_page dokumentasi API] untuk perincian lanjut penggunaan API. Contoh: [//www.mediawiki.org/wiki/API#A_simple_example dapatkan konten Halaman Utama]. Pilih tindakan untuk melihat contoh lain.\n\nPerhatikan bahwa, meskipun ini adalah bak pasir, tindakan yang Anda lakukan pada halaman ini dapat mengubah wiki.",
+       "apisandbox-submit": "Kirim permintaan",
+       "apisandbox-reset": "Kosongkan",
+       "apisandbox-examples": "Contoh",
+       "apisandbox-results": "Hasil",
+       "apisandbox-request-url-label": "URL Permintaan:",
+       "apisandbox-request-time": "Lama permintaan: $1",
        "booksources": "Sumber buku",
        "booksources-search-legend": "Cari di sumber buku",
        "booksources-isbn": "ISBN:",
        "wlheader-showupdated": "Halaman-halaman yang telah berubah sejak kunjungan terakhir Anda ditampilkan dengan '''huruf tebal'''.",
        "wlnote": "Di bawah ini adalah {{PLURAL:$1|perubahan|<strong>$1</strong> perubahan}} terakhir dalam {{PLURAL:$2|jam|<strong>$2</strong> jam}}, per $3, $4.",
        "wlshowlast": "Tampilkan $1 jam $2 hari terakhir",
-       "watchlistall2": "semua",
        "wlshowtime": "Tampilkan hingga:",
        "wlshowhideminor": "suntingan kecil",
        "wlshowhidebots": "bot",
        "protect_expiry_old": "Waktu kedaluwarsa adalah pada masa lampau.",
        "protect-unchain-permissions": "Aktifkan opsi pelindungan lanjutan",
        "protect-text": "Anda dapat melihat atau mengganti tingkatan pelindungan untuk halaman '''$1''' di sini.",
-       "protect-locked-blocked": "Anda tak dapat mengganti tingkat pelindungan selagi diblokir. Berikut adalah konfigurasi saat ini untuk halaman '''$1''':",
+       "protect-locked-blocked": "Anda tak dapat mengganti tingkat pelindungan selagi diblokir. Berikut adalah konfigurasi saat ini untuk halaman <strong>$1</strong>:",
        "protect-locked-dblock": "Tingkat pelindungan tak dapat diganti karena aktifnya penguncian basis data. Berikut adalah konfigurasi saat ini untuk halaman '''$1''':",
        "protect-locked-access": "Akun Anda tidak dapat memiliki hak untuk mengganti tingkat pelindungan halaman. Berikut adalah konfigurasi saat ini untuk halaman '''$1''':",
        "protect-cascadeon": "Halaman ini sedang dilindungi karena disertakan dalam {{PLURAL:$1|halaman|halaman-halaman}} berikut yang telah dilindungi dengan pilihan pelindungan runtun diaktifkan.\nPenggantian tingkat pelindungan untuk halaman ini tidak akan mempengaruhi pelindungan runtun.",
        "sp-contributions-logs": "log",
        "sp-contributions-talk": "bicara",
        "sp-contributions-userrights": "pengelolaan hak pengguna",
-       "sp-contributions-blocked-notice": "Pengguna ini sedang diblokLog pemblokiran terakhir ditampilkan berikut untuk referensi:",
-       "sp-contributions-blocked-notice-anon": "Alamat IP ini diblokir pada saat ini.\nCatatan log pemblokiran terakhir tersedia di bawah ini sebagai rujukan:",
+       "sp-contributions-blocked-notice": "Pengguna ini sedang diblokir.\nLog pemblokiran terakhir ditampilkan berikut untuk referensi:",
+       "sp-contributions-blocked-notice-anon": "Alamat IP ini sedang diblokir saat ini.\nEntri log pemblokiran terakhir tersedia di bawah ini sebagai rujukan:",
        "sp-contributions-search": "Cari kontribusi",
        "sp-contributions-username": "Alamat IP atau nama pengguna:",
        "sp-contributions-toponly": "Tampilkan hanya revisi teratas",
        "ipb-unblock": "Hilangkan blokir seorang pengguna atau suatu alamat IP",
        "ipb-blocklist": "Lihat blokir yang diterapkan",
        "ipb-blocklist-contribs": "Kontribusi untuk {{GENDER:$1|$1}}",
-       "unblockip": "Hilangkan blokir terhadap alamat IP atau pengguna",
+       "unblockip": "Buka blokir pengguna",
        "unblockiptext": "Gunakan formulir di bawah untuk mengembalikan kemampuan menulis sebuah alamat IP atau pengguna yang sebelumnya telah diblokir.",
        "ipusubmit": "Hilangkan blokir ini",
-       "unblocked": "Blokir terhadap [[User:$1|$1]] telah dicabut",
+       "unblocked": "Blokir terhadap [[User:$1|$1]] telah dicabut.",
        "unblocked-range": "$1 telah diblokir",
-       "unblocked-id": "Blokir $1 telah dicabut",
-       "unblocked-ip": "[[Special:Contributions/$1|$1]] telah dibuka blokirnya.",
-       "blocklist": "Daftar pemblokiran pengguna",
+       "unblocked-id": "Blokir $1 telah dicabut.",
+       "unblocked-ip": "Pemblokiran [[Special:Contributions/$1|$1]] telah dicabut.",
+       "blocklist": "Daftar pengguna yang diblokir",
        "ipblocklist": "Daftar pemblokiran pengguna",
        "ipblocklist-legend": "Cari pengguna yang diblokir",
        "blocklist-userblocks": "Sembunyikan pemblokiran akun",
        "blocklist-timestamp": "Stempel waktu",
        "blocklist-target": "Target",
        "blocklist-expiry": "Kedaluwarsa",
-       "blocklist-by": "Admin pemblokir",
+       "blocklist-by": "Pengurus yang memblokir",
        "blocklist-params": "Parameter pemblokiran",
        "blocklist-reason": "Alasan",
        "ipblocklist-submit": "Cari",
-       "ipblocklist-localblock": "Blok lokal",
+       "ipblocklist-localblock": "Blokir lokal",
        "ipblocklist-otherblocks": "{{PLURAL:$1|pemblokiran|pemblokiran}} lain",
        "infiniteblock": "tak terbatas",
        "expiringblock": "kedaluwarsa pada $1 $2",
        "emailblock": "surel diblokir",
        "blocklist-nousertalk": "tidak dapat menyunting halaman pembicaraan sendiri",
        "ipblocklist-empty": "Daftar pemblokiran kosong.",
-       "ipblocklist-no-results": "alamat IP atau pengguna yang diminta tidak diblokir.",
+       "ipblocklist-no-results": "Alamat IP atau pengguna yang diminta tidak diblokir.",
        "blocklink": "blokir",
        "unblocklink": "hilangkan blokir",
-       "change-blocklink": "ubah blokir",
+       "change-blocklink": "ubah pemblokiran",
        "contribslink": "kontrib",
        "emaillink": "kirim surel",
        "autoblocker": "Diblokir secara otomatis karena alamat IP Anda digunakan oleh \"[[User:$1|$1]]\".\nAlasan yang diberikan untuk pemblokiran $1 adalah: \"$2\"",
        "blocklogpage": "Log pemblokiran",
-       "blocklog-showlog": "Pengguna ini telah diblokir sebelumnya. Log pemblokiran disediakan di bawah untuk referensi:",
+       "blocklog-showlog": "Pengguna ini telah diblokir sebelumnya.\nLog pemblokiran disediakan di bawah untuk referensi:",
        "blocklog-showsuppresslog": "Pengguna ini telah diblokir dan disembunyikan sebelumnya. Log supresi disediakan di bawah untuk referensi:",
        "blocklogentry": "memblokir [[$1]] dengan waktu kedaluwarsa $2 $3",
        "reblock-logentry": "mengubah pemblokiran [[$1]] dengan waktu kedaluwarsa $2 $3",
-       "blocklogtext": "Di bawah ini adalah log pemblokiran dan pembukaan blokir terhadap pengguna.\nAlamat IP yang diblokir secara otomatis tidak terdapat di dalam daftar ini.\nLihat [[Special:BlockList|daftar pemblokiran]] untuk semua pengguna yang saat ini diblokir.",
+       "blocklogtext": "Berikut adalah log tindakan pemblokiran dan pembukaan blokir terhadap pengguna.\nAlamat IP yang diblokir secara otomatis tidak terdapat di dalam daftar ini.\nLihat [[Special:BlockList|daftar pemblokiran]] untuk semua pengguna yang saat ini diblokir.",
        "unblocklogentry": "menghilangkan blokir \"$1\"",
        "block-log-flags-anononly": "hanya pengguna anonim",
        "block-log-flags-nocreate": "pembuatan akun dimatikan",
        "ipb_expiry_invalid": "Waktu kedaluwarsa tidak sah.",
        "ipb_expiry_temp": "Pemblokiran atas nama pengguna yang disembunyikan harus permanen.",
        "ipb_hide_invalid": "Tak dapat menutup akun ini; akun tersebut memiliki {{PLURAL:$1|satu suntingan|$1 suntingan}}.",
-       "ipb_already_blocked": "\"$1\" telah diblokir",
+       "ipb_already_blocked": "\"$1\" telah diblokir.",
        "ipb-needreblock": "$1 sudah diblokir. Apakah Anda ingin mengubah set pemblokiran yang bersangkutan?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Blok|Blok}} lain",
        "unblock-hideuser": "Anda tidak dapat membuka blokir pengguna ini karena nama pengguna mereka telah disembunyikan.",
        "ipb_cant_unblock": "Kesalahan: Blokir dengan ID $1 tidak ditemukan. Blokir tersebut kemungkinan telah dibuka.",
-       "ipb_blocked_as_range": "Kesalahan: IP $1 tidak diblok secara langsung dan tidak dapat dilepaskan. IP $1 diblok sebagai bagian dari pemblokiran kelompok IP $2, yang dapat dilepaskan.",
+       "ipb_blocked_as_range": "Kesalahan: IP $1 tidak diblokir secara langsung dan tidak dapat dilepaskan. IP $1 diblok sebagai bagian dari pemblokiran kelompok IP $2, yang dapat dilepaskan.",
        "ip_range_invalid": "Blok IP tidak sah.",
        "ip_range_toolarge": "Rentang blok lebih besar dari /$1 tidak diperbolehkan.",
        "proxyblocker": "Pemblokir proxy",
-       "proxyblockreason": "Alamat IP Anda telah diblokir karena alamat IP Anda adalah proxy terbuka. Silakan hubungi penyedia jasa internet Anda atau dukungan teknis dan beritahukan mereka masalah keamanan serius ini.",
+       "proxyblockreason": "Alamat IP Anda telah diblokir karena alamat IP Anda adalah ''proxy'' terbuka. Silakan hubungi penyedia jasa internet Anda atau dukungan teknis dan beritahukan mereka masalah keamanan serius ini.",
        "sorbs": "DNSBL",
        "sorbsreason": "Alamat IP anda terdaftar sebagai proxy terbuka di DNSBL.",
        "sorbs_create_account_reason": "Alamat IP anda terdaftar sebagai proxy terbuka di DNSBL. Anda tidak dapat membuat akun.",
-       "xffblockreason": "Sebuah alamat IP di kepala X-Forwarded-For, entah milik Anda atau server proxy yang Anda pakai, telah diblokir. Alasan pemblokirannya adalah: $1",
-       "cant-see-hidden-user": "Pengguna yang anda coba blokir telah di blokir dan di sembunyikan. Selama anda tidak memiliki hak sembunyikan pengguna, anda tidak dapat melihat atau menyunting pemblokiran pengguna ini.",
-       "ipbblocked": "Anda tidak dapat memblokir atau membuka blokir pengguna lain, karena anda sendiri diblokir",
+       "xffblockreason": "Sebuah alamat IP terdapat di kepala X-Forwarded-For, entah milik Anda atau peladen ''proxy'' yang Anda gunakan, telah diblokir. Alasan pemblokirannya adalah: $1",
+       "cant-see-hidden-user": "Pengguna yang Anda coba blokir telah diblokir dan disembunyikan. Selama Anda tidak memiliki hak sembunyikan pengguna, Anda tidak dapat melihat atau menyunting pemblokiran pengguna ini.",
+       "ipbblocked": "Anda tidak dapat memblokir atau membuka blokir pengguna lain, karena Anda sendiri diblokir.",
        "ipbnounblockself": "Anda tidak diizinkan untuk membuka blokir sendiri",
        "lockdb": "Kunci basis data",
        "unlockdb": "Buka kunci basis data",
        "creditspage": "Penghargaan halaman",
        "nocredits": "Tidak ada informasi penghargaan yang tersedia untuk halaman ini.",
        "spamprotectiontitle": "Filter pencegah spam",
-       "spamprotectiontext": "Halaman yang ingin Anda simpan telah diblokir oleh filter spam.\nIni mungkin disebabkan oleh pranala ke situs luar yang termasuk dalam daftar hitam.",
+       "spamprotectiontext": "Halaman yang ingin Anda simpan telah diblokir oleh penyaring spam.\nHal ini mungkin disebabkan oleh pranala ke situs luar yang termasuk dalam daftar hitam.",
        "spamprotectionmatch": "Teks berikut ini memancing filter spam kami: $1",
        "spambot_username": "Pembersihan span MediaWiki",
        "spam_reverting": "Membatalkan ke versi terakhir yang tak memiliki pranala ke $1",
        "version-hook-subscribedby": "Dilanggani oleh",
        "version-version": "($1)",
        "version-no-ext-name": "[tanpa nama]",
-       "version-svn-revision": "(r$2)",
        "version-license": "Lisensi MediaWiki",
        "version-ext-license": "Lisensi",
        "version-ext-colheader-name": "Ekstensi",
        "tags-activate": "aktifkan",
        "tags-deactivate": "nonaktifkan",
        "tags-hitcount": "$1 {{PLURAL:$1|perubahan}}",
+       "tags-manage-blocked": "Anda tidak dapat mengganti tag ketika sedang diblokir.",
        "tags-create-heading": "Buat sebuah tag baru",
        "tags-create-reason": "Alasan:",
        "tags-create-submit": "Buat",
        "tags-activate-submit": "Aktifkan",
        "tags-deactivate-reason": "Alasan:",
        "tags-deactivate-submit": "Matikan",
+       "tags-apply-blocked": "Anda tidak dapat menerapkan perubahan tag dan perubahan lainnya ketika sedang diblokir.",
+       "tags-update-blocked": "Anda tidak dapat menambah atau menghapus tag ketika sedang diblokir.",
        "tags-edit-reason": "Alasan:",
        "comparepages": "Bandingkan halaman",
        "compare-page1": "Halaman 1",
        "revdelete-restricted": "akses telah dibatasi untuk opsis",
        "revdelete-unrestricted": "pembatasan akses opsis dihapuskan",
        "logentry-block-block": "$1 {{GENDER:$2|memblokir}} {{GENDER:$4|$3}} dengan waktu kedaluwarsa $5 $6",
+       "logentry-block-unblock": "$1 telah {{GENDER:$2|mencabut pemblokiran}} atas {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|mengubah}} pemblokiran {{GENDER:$4|$3}} dengan waktu kedaluwarsa $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|memblokir}} {{GENDER:$4|$3}} dengan waktu kedaluwarsa $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|mengubah}} pemblokiran {{GENDER:$4|$3}} dengan waktu kedaluwarsa $5 $6",
index bf1c630..56f8168 100644 (file)
        "logentry-newusers-create2": "$1 {{GENDER:$2|stofnaði}} notandaaðganginn $3",
        "logentry-newusers-byemail": "Notandaaðgangurinn $3 var {{GENDER:$2|búinn til}} af $1 og lykilorðið var sent með tölvupósti",
        "logentry-newusers-autocreate": "Aðgangurinn $1 var {{GENDER:$2|stofnaður}} sjálfvirkt",
+       "logentry-protect-protect": "$1 {{GENDER:$2|verndaði}} $3 $4",
        "logentry-rights-rights": "$1 {{GENDER:$2|breytti}} réttindum $3 frá $4 í $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|breytti}} réttindum $3",
        "logentry-rights-autopromote": "$1 fékk sjálfvirkt {{GENDER:$2|aukin}} réttindi frá $4 til $5",
index 21d22d5..1b4419f 100644 (file)
        "previewnote": "'''Ricorda che questa è solo un'anteprima.'''\nLe tue modifiche NON sono ancora state salvate!",
        "continue-editing": "Vai all'area di modifica",
        "previewconflict": "L'anteprima corrisponde al testo presente nella casella di modifica superiore e rappresenta la pagina come apparirà se si sceglie di salvarla in questo momento.",
-       "session_fail_preview": "'''Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.\nRiprovare.\nSe il problema persiste, si può tentare di [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso.'''",
-       "session_fail_preview_html": "'''Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.'''\n\n''Poiché in {{SITENAME}} è abilitato l'uso di HTML senza limitazioni, l'anteprima non viene visualizzata; si tratta di una misura di sicurezza contro gli attacchi JavaScript.''\n\n'''Se questo è un legittimo tentativo di modifica, riprovare. Se il problema persiste, si può provare a [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso.'''",
+       "session_fail_preview": "Spiacenti! Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.\n\nPotresti essere stato disconnesso. <strong>Verifica che sei ancora collegato e riprova</strong>.\nSe il problema persiste, si può tentare di [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso, e controllare che il tuo browser accetti i cookie da questo sito.",
+       "session_fail_preview_html": "Spiacenti! Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.\n\n<em>Poiché {{SITENAME}} ha dell'HTML grezzo attivato e c'è stata una perdita dei dati della sessione, l'anteprima è nascosta come precauzione contro gli attacchi JavaScript.</em>\n\n<strong>Se si tratta di un normale tentativo d'anteprima, riprova.</strong> \nSe il problema persiste, si può tentare di [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso, e controllare che il tuo browser accetti i cookie da questo sito.",
        "token_suffix_mismatch": "'''La modifica non è stata salvata perché il client ha mostrato di gestire in modo errato i caratteri di punteggiatura nel token associato alla stessa. Per evitare una possibile corruzione del testo della pagina, è stata rifiutata l'intera modifica. Questa situazione può verificarsi, talvolta, quando vengono usati alcuni servizi di proxy anonimi via web che presentano dei bug.'''",
        "edit_form_incomplete": "'''Alcune parti del modulo di modifica non hanno raggiunto il server; controllare che le modifiche siano intatte e riprovare.'''",
        "editing": "Modifica di $1",
        "mergehistory-empty": "Nessuna versione da unire.",
        "mergehistory-done": "{{PLURAL:$3|Una versione di $1 è stata unita|$3 versioni di $1 sono state unite}} alla cronologia di [[:$2]].",
        "mergehistory-fail": "Impossibile unire le cronologie. Verificare la pagina e i parametri temporali.",
+       "mergehistory-fail-bad-timestamp": "Il timestamp non è valido.",
+       "mergehistory-fail-invalid-source": "La pagina di origine non è valida.",
+       "mergehistory-fail-invalid-dest": "La pagina di destinazione non è valida.",
+       "mergehistory-fail-no-change": "L'unione delle cronologie non ha unito alcuna versione. Ricontrolla le pagine ed i parametri temporali.",
+       "mergehistory-fail-permission": "Autorizzazioni insufficienti per unire cronologie.",
+       "mergehistory-fail-self-merge": "Le pagine di origine e di destinazione sono le stesse.",
+       "mergehistory-fail-timestamps-overlap": "Le versioni di origine si sovrappongono o vengono dopo le versioni di destinazione.",
        "mergehistory-fail-toobig": "Impossibile eseguire l'unione della cronologia essendoci oltre $1 {{PLURAL:$1|versione|versioni}} da spostare.",
        "mergehistory-no-source": "La pagina di origine $1 non esiste.",
        "mergehistory-no-destination": "La pagina di destinazione $1 non esiste.",
        "import-nonewrevisions": "Nessuna versione importata (erano già tutte presenti, o saltate a causa di errori)",
        "xml-error-string": "$1 a riga $2, colonna $3 (byte $4): $5",
        "import-upload": "Carica dati XML",
-       "import-token-mismatch": "I dati relativi alla sessione sono andati persi. Riprovare.",
+       "import-token-mismatch": "I dati relativi alla sessione sono andati persi. Riprovare.\n\nPotresti essere stato disconnesso. <strong>Verifica che sei ancora collegato e riprova</strong>.\nSe il problema persiste, si può tentare di [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso, e controllare che il tuo browser accetti i cookie da questo sito.",
        "import-invalid-interwiki": "Impossibile importare dal progetto wiki indicato.",
        "import-error-edit": "La pagina \"$1\" non è stata importata poiché non sei autorizzato a modificarla.",
        "import-error-create": "La pagina \"$1\" non è stata importata poiché non sei autorizzato a crearla.",
        "expand_templates_generate_xml": "Mostra albero sintattico XML",
        "expand_templates_generate_rawhtml": "Mostra HTML",
        "expand_templates_preview": "Anteprima",
-       "expand_templates_preview_fail_html": "<em>Poiché {{SITENAME}} ha dell'HTML grezzo attivato e c'è stata una perdita dei dati della sessione, l'anteprima è nascosta come precauzione contro gli attacchi JavaScript.</em>\n\n<strong>Se si tratta di un normale tentativo d'anteprima, riprova.</strong> \nSe comunque non dovesse funzionare, prova ad [[Special:UserLogout|uscire]] ed a rientrare.",
+       "expand_templates_preview_fail_html": "<em>Poiché {{SITENAME}} ha dell'HTML grezzo attivato e c'è stata una perdita dei dati della sessione, l'anteprima è nascosta come precauzione contro gli attacchi JavaScript.</em>\n\n<strong>Se si tratta di un normale tentativo d'anteprima, riprova.</strong> \nSe il problema persiste, si può tentare di [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso, e controllare che il tuo browser accetti i cookie da questo sito.",
        "expand_templates_preview_fail_html_anon": "<em>Poiché {{SITENAME}} ha dell'HTML grezzo attivato e non hai effettuato l'accesso, l'anteprima è nascosta come precauzione contro gli attacchi JavaScript.</em>\n\n<strong>Se si tratta di un normale tentativo d'anteprima, [[Special:UserLogin|entra]] e riprova.</strong>",
        "expand_templates_input_missing": "Devi inserire del testo come input.",
        "pagelanguage": "Modifica lingua della pagina",
index c657eec..7a93646 100644 (file)
@@ -76,7 +76,7 @@
        "tog-hideminor": "最近の更新に細部の編集を表示しない",
        "tog-hidepatrolled": "最近の更新に巡回済みの編集を表示しない",
        "tog-newpageshidepatrolled": "新しいページの一覧に、巡回済みのページを表示しない",
-       "tog-hidecategorization": "ページのカテゴリ化を隠す",
+       "tog-hidecategorization": "ページのカテゴリを表示しない",
        "tog-extendwatchlist": "ウォッチリストを拡張し、最新のものだけではなくすべての変更を表示",
        "tog-usenewrc": "最近の更新とウォッチリストで、複数の変更をページごとにまとめる",
        "tog-numberheadings": "見出しに番号を自動的に振る",
@@ -87,7 +87,7 @@
        "tog-watchdefault": "自分が編集したページやファイルをウォッチリストに追加",
        "tog-watchmoves": "自分が移動したページやファイルをウォッチリストに追加",
        "tog-watchdeletion": "自分が削除したページやファイルをウォッチリストに追加",
-       "tog-watchrollback": "è\87ªå\88\86ã\81\8cå·»ã\81\8dæ\88»ã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\82\92ã\80\81ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¿½å\8a ",
+       "tog-watchrollback": "自分が巻き戻したページをウォッチリストに追加",
        "tog-minordefault": "編集をすべて既定で細部の編集とする",
        "tog-previewontop": "プレビューを編集ボックスの前に配置",
        "tog-previewonfirst": "編集開始時にもプレビューを表示",
        "tog-oldsig": "既存の署名:",
        "tog-fancysig": "署名をウィキ文として扱う (自動リンクなし)",
        "tog-uselivepreview": "ライブプレビューを使用",
-       "tog-forceeditsummary": "要約欄が空欄の場合に確認をうながす",
+       "tog-forceeditsummary": "要約欄が空欄の場合に確認をす",
        "tog-watchlisthideown": "自分の編集をウォッチリストに表示しない",
        "tog-watchlisthidebots": "ボットによる編集をウォッチリストに表示しない",
        "tog-watchlisthideminor": "細部の編集をウォッチリストに表示しない",
        "tog-watchlisthideliu": "ログイン利用者による編集をウォッチリストに表示しない",
-       "tog-watchlistreloadautomatically": "フィルタが変更されるたびに、ウォッチリストを自動的に再読み込みする(JavaScript が必要)",
+       "tog-watchlistreloadautomatically": "フィルタが変更されるたびに、ウォッチリストを自動的に再読み込みする (JavaScript が必要)",
        "tog-watchlisthideanons": "匿名利用者による編集をウォッチリストに表示しない",
        "tog-watchlisthidepatrolled": "巡回済みの編集をウォッチリストに表示しない",
-       "tog-watchlisthidecategorization": "ページのカテゴリ化を隠す",
+       "tog-watchlisthidecategorization": "ページのカテゴリを表示しない",
        "tog-ccmeonemails": "他の利用者に送信したメールの控えを自分にも送信",
        "tog-diffonly": "差分の下にページ内容を表示しない",
        "tog-showhiddencats": "隠しカテゴリを表示",
        "morenotlisted": "この一覧は完全ではありません。",
        "mypage": "ページ",
        "mytalk": "トーク",
-       "anontalk": "議論",
+       "anontalk": "トーク",
        "navigation": "案内",
        "and": "&#32;と",
        "qbfind": "検索",
        "cannotdelete-title": "「$1」というページを削除できません",
        "delete-hook-aborted": "フックによって削除が中止されました。\n理由は不明です。",
        "no-null-revision": "ページ「$1」に新しい空編集の版を作成できませんでした。",
-       "badtitle": "正しくないページ名",
+       "badtitle": "不適切なページ名",
        "badtitletext": "無効または空のページ名が指定されたか、言語間/ウィキ間リンクの方法に誤りがあります。\nページ名に使用できない文字が含まれている可能性があります。",
        "title-invalid-empty": "指定されたページ名は空であるか、もしくは名前空間しか含んでいません。",
        "title-invalid-utf8": "指定されたページ名が無効なUTF-8シーケンスを含んでいます。",
        "hr_tip": "水平線を挿入 (利用は控えめに)",
        "summary": "編集内容の要約:",
        "subject": "題名:",
-       "minoredit": "これは細部の編集です",
+       "minoredit": "細部の編集",
        "watchthis": "このページをウォッチ",
        "savearticle": "ページを保存",
        "preview": "プレビュー",
        "newarticletext": "まだ存在しないページへのリンクをたどりました。\nこのページを新規作成するには、ページの内容を以下のボックスに記入してください (詳しくは[$1 ヘルプページ]を参照してください)。\n誤ってこのページにたどり着いた場合には、ブラウザーの<strong>戻る</strong>ボタンで前のページに戻ってください。",
        "anontalkpagetext": "----\n<em>このページはアカウントをまだ作成していないか使用していない匿名利用者のための議論ページです。</em>\n\n匿名利用者を識別するために、利用者名の代わりにIPアドレスが使用されています。IP アドレスは複数の利用者で共有されている場合があります。もし、あなたが匿名利用者であり、自分に関係のないコメントが寄せられていると考えられる場合は、[[Special:UserLogin/signup|アカウントを作成する]]か[[Special:UserLogin|ログインして]]他の匿名利用者と間違えられないようにしてください。",
        "noarticletext": "現在このページには内容がありません。\n他のページ内で[[Special:Search/{{PAGENAME}}|このページ名を検索]]、\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 関連する記録を検索]、\nまたは[{{fullurl:{{FULLPAGENAME}}|action=edit}} このページを編集]</span>できます。",
-       "noarticletext-nopermission": "ç\8f¾å\9c¨ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«ã\81¯å\86\85容ã\81\8cã\81\82ã\82\8aã\81¾ã\81\9bã\82\93ã\80\82\nä»\96ã\81®ã\83\9aã\83¼ã\82¸å\86\85ã\81§[[Special:Search/{{PAGENAME}}|ã\81\93ã\81®ã\83\9aã\83¼ã\82¸å\90\8dã\82\92æ¤\9cç´¢]]ã\80\81ã\81¾ã\81\9fã\81¯<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} é\96¢é\80£ã\81\99ã\82\8bè¨\98é\8c²ã\82\92æ¤\9cç´¢]</span>ã\81§ã\81\8dã\81¾ã\81\99ã\81\8cã\80\81ã\81\82ã\81ªã\81\9fã\81«ã\81¯ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92ä½\9cæ\88\90ã\81\99ã\82\8b権é\99\90ã\81¯ありません。",
+       "noarticletext-nopermission": "ç\8f¾å\9c¨ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«ã\81¯å\86\85容ã\81\8cã\81\82ã\82\8aã\81¾ã\81\9bã\82\93ã\80\82\nä»\96ã\81®ã\83\9aã\83¼ã\82¸å\86\85ã\81§[[Special:Search/{{PAGENAME}}|ã\81\93ã\81®ã\83\9aã\83¼ã\82¸å\90\8dã\82\92æ¤\9cç´¢]]ã\80\81ã\81¾ã\81\9fã\81¯<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} é\96¢é\80£ã\81\99ã\82\8bè¨\98é\8c²ã\82\92æ¤\9cç´¢]</span>ã\81§ã\81\8dã\81¾ã\81\99ã\81\8cã\80\81ã\81\82ã\81ªã\81\9fã\81«ã\81¯ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92ä½\9cæ\88\90ã\81\99ã\82\8b権é\99\90ã\81\8cありません。",
        "missing-revision": "「{{FULLPAGENAME}}」というページの版番号 $1 の版は存在しません。\n\n通常、削除されたページの版への古い差分表示や固定リンクをたどった際に、このようなことが起きます。 \n詳細は[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]を参照してください。",
        "userpage-userdoesnotexist": "「$1」という利用者アカウントは登録されていません。\nこのページの作成/編集が適切かご確認ください。",
        "userpage-userdoesnotexist-view": "利用者アカウント「$1」は登録されていません。",
        "previewnote": "<strong>これはプレビューです。</strong>\n変更内容はまだ保存されていません!",
        "continue-editing": "編集を続行",
        "previewconflict": "これは、上の編集エリアの文章を保存した場合にどう表示されるかを示すプレビューです。",
-       "session_fail_preview": "<strong>申し訳ありません! セッションデータが消失したため編集を処理できませんでした。</strong>\nもう一度やり直してください。\nそれでも失敗する場合、[[Special:UserLogout|ログアウト]]してからログインし直してください。",
-       "session_fail_preview_html": "<strong>申し訳ありません! セッション データが消失したため編集を処理できませんでした。</strong>\n\n<em>{{SITENAME}}では生のHTMLが有効であり、JavaScriptでの攻撃を予防するためにプレビューを表示していません。</em>\n\n<strong>この編集が問題ない場合はもう一度保存してください。</strong>\nそれでもうまくいかない場合は一度[[Special:UserLogout|ログアウト]]して、ログインし直してみてください。",
+       "session_fail_preview": "申し訳ありません! セッションデータが消失したため編集を処理できませんでした。\n\nアカウントがログアウトされている可能性があります。<strong>アカウントにログインしていることを確認して、もう一度やり直してください</strong>。\nそれでも失敗する場合、[[Special:UserLogout|ログアウト]]してからログインし直し、現在使用しているブラウザでこのサイトからのクッキーが許可されていることを確認してください。",
+       "session_fail_preview_html": "申し訳ありません! セッション データが消失したため編集を処理できませんでした。\n\n<em>{{SITENAME}}では生のHTMLが有効であり、JavaScriptでの攻撃を予防するためにプレビューを表示していません。</em>\n\n<strong>この編集が問題ない場合はもう一度保存してください。</strong>\nそれでも失敗する場合、[[Special:UserLogout|ログアウト]]してからログインし直し、現在使用しているブラウザでこのサイトからのクッキーが許可されていることを確認してください。",
        "token_suffix_mismatch": "<strong>ご使用中のクライアントが編集トークン内の句読点を正しく処理していないため、編集を受け付けられません。</strong>\nページ本文の破損を防ぐため、編集は反映されません。\n問題のある匿名プロキシ サービスを使用していると、これが発生する場合があります。",
        "edit_form_incomplete": "<strong>編集フォームの一部がサーバーに届きませんでした。ご確認の上、そのまま再度投稿してください。</strong>",
        "editing": "「$1」を編集中",
        "sectioneditnotsupported-title": "節単位編集はサポートされていません",
        "sectioneditnotsupported-text": "このページでは節単位編集はサポートされません。",
        "permissionserrors": "権限エラー",
-       "permissionserrorstext": "ã\81\82ã\81ªã\81\9fã\81«ã\81¯ã\81\93ã\81®æ\93\8dä½\9cã\82\92è¡\8cã\81\86権é\99\90ã\81¯ありません。{{PLURAL:$1|理由}}は以下の通りです:",
-       "permissionserrorstext-withaction": "ã\81\82ã\81ªã\81\9fã\81«ã\81¯ã\80\8c$2ã\80\8dã\82\92è¡\8cã\81\86権é\99\90ã\81¯ありません。{{PLURAL:$1|理由}}は以下の通りです:",
+       "permissionserrorstext": "ã\81\82ã\81ªã\81\9fã\81«ã\81¯ã\81\93ã\81®æ\93\8dä½\9cã\82\92è¡\8cã\81\86権é\99\90ã\81\8cありません。{{PLURAL:$1|理由}}は以下の通りです:",
+       "permissionserrorstext-withaction": "ã\81\82ã\81ªã\81\9fã\81«ã\81¯ã\80\8c$2ã\80\8dã\82\92è¡\8cã\81\86権é\99\90ã\81\8cありません。{{PLURAL:$1|理由}}は以下の通りです:",
        "contentmodelediterror": "コンテンツモデルが <code>$1</code> であるため、この版を編集することができません。ページの現在のコンテンツモデルは <code>$2</code> です。",
        "recreate-moveddeleted-warn": "<strong>警告: 以前削除されたページを再作成しようとしています。</strong>\n\nこのページの編集を続行するのが適切かどうかご確認ください。\n参考までに、このページの削除と移動の記録を以下に示します:",
        "moveddeleted-notice": "このページは削除されています。\n参考のため、このページの削除と移動の記録を以下に表示します。",
        "mergehistory-empty": "統合できる版がありません。",
        "mergehistory-done": "$1の $3 {{PLURAL:$3|版}}は[[:$2]]に統合されました。",
        "mergehistory-fail": "履歴の統合を実行できません。ページと時刻の引数を再確認してください。",
+       "mergehistory-fail-bad-timestamp": "タイムスタンプが無効です。",
+       "mergehistory-fail-invalid-source": "統合元のページが無効です。",
+       "mergehistory-fail-invalid-dest": "統合先のページが無効です。",
+       "mergehistory-fail-no-change": "履歴の統合はどの版でも実行されませんでした。ページと時間のパラメーターを再度確認してください。",
+       "mergehistory-fail-permission": "履歴の統合を実行するのに十分な権限がありません。",
+       "mergehistory-fail-self-merge": "統合元と統合先のページを同じにすることはできません。",
+       "mergehistory-fail-timestamps-overlap": "統合元の版を同じにしたり、統合先の版よりも後にすることはできません。",
        "mergehistory-fail-toobig": "移動させた{{PLURAL:$1|版}}の数が上限を超えているため、履歴の統合を実行できません。",
        "mergehistory-no-source": "統合元ページ $1 が存在しません。",
        "mergehistory-no-destination": "統合先ページ $1 が存在しません。",
        "right-bot": "自動処理と認識させる",
        "right-nominornewtalk": "議論ページの細部の編集をした際に、新着メッセージとして通知しない",
        "right-apihighlimits": "API要求でより高い制限値を使用",
-       "right-writeapi": "書き込みAPIを使用",
+       "right-writeapi": "書き込み API を使用",
        "right-delete": "ページを削除",
        "right-bigdelete": "大きな履歴があるページを削除",
        "right-deletelogentry": "特定の記録項目を削除/復元",
        "recentchanges-label-minor": "細部の編集",
        "recentchanges-label-bot": "ボットによる編集",
        "recentchanges-label-unpatrolled": "巡回されていない編集",
-       "recentchanges-label-plusminus": "ページ サイズの増減 (バイト単位)",
+       "recentchanges-label-plusminus": "ページサイズの増減 (バイト単位)",
        "recentchanges-legend-heading": "'''凡例:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|新しいページ一覧]]も参照)",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcshowhidemine": "自分の編集を$1",
        "rcshowhidemine-show": "表示",
        "rcshowhidemine-hide": "非表示",
-       "rcshowhidecategorization": "ページ カテゴリ化を$1",
+       "rcshowhidecategorization": "ページのカテゴライズを$1",
        "rcshowhidecategorization-show": "表示",
        "rcshowhidecategorization-hide": "非表示",
        "rclinks": "最近 $2 日間の更新を最大 $1 件表示<br />$3",
        "recentchangeslinked-summary": "これは指定したページからリンクされている (または指定したカテゴリに含まれている) ページの最近の変更の一覧です。\n[[Special:Watchlist|自分のウォッチリスト]]にあるページは<strong>太字</strong>で表示されます。",
        "recentchangeslinked-page": "ページ名:",
        "recentchangeslinked-to": "このページへのリンク元での変更の表示に切り替え",
-       "recentchanges-page-added-to-category": "[[:$1]] カテゴリに追加",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]]と他{{PLURAL:$2|1ページ|$2ページ}}をカテゴリに追加しました",
-       "recentchanges-page-removed-from-category": "[[:$1]] カテゴリから削除",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]]と他{{PLURAL:$2|1ページ|$2ページ}}をカテゴリから削除しました",
+       "recentchanges-page-added-to-category": "[[:$1]]カテゴリに追加",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]]と他{{PLURAL:$2|1ページ|$2ページ}}をカテゴリに追加",
+       "recentchanges-page-removed-from-category": "[[:$1]]をカテゴリから除外",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]]と他{{PLURAL:$2|1ページ|$2ページ}}をカテゴリから除外",
        "autochange-username": "メディアウィキ自動変更",
        "upload": "ファイルをアップロード",
        "uploadbtn": "ファイルをアップロード",
        "shared-repo": "共有リポジトリ",
        "shared-repo-name-wikimediacommons": "ウィキメディア・コモンズ",
        "filepage.css": "/* ここに記述したCSSはファイル解説ページにて読み込まれます。また外部のクライアントウィキにも影響します */",
-       "upload-disallowed-here": "ã\81\82ã\81ªã\81\9fã\81¯ã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\82\92上書きできません。",
+       "upload-disallowed-here": "ã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81¯上書きできません。",
        "filerevert": "$1を差し戻す",
        "filerevert-legend": "ファイルを差し戻す",
        "filerevert-intro": "ファイル<strong>[[Media:$1|$1]]</strong>を[$4 $2$3版]に差し戻そうとしています。",
        "apisandbox-submit": "リクエストする",
        "apisandbox-reset": "消去",
        "apisandbox-retry": "再試行",
+       "apisandbox-no-parameters": "この API モジュールにはパラメーターがありません。",
+       "apisandbox-helpurls": "ヘルプリンク",
        "apisandbox-examples": "例",
        "apisandbox-dynamic-parameters-add-placeholder": "引数名",
        "apisandbox-results": "結果",
        "wlshowhideanons": "IP利用者",
        "wlshowhidepatr": "巡回された編集",
        "wlshowhidemine": "自分の編集",
-       "wlshowhidecategorization": "ã\83\9aã\83¼ã\82¸ã\81®ã\82«ã\83\86ã\82´ã\83ªå\8c\96",
+       "wlshowhidecategorization": "ã\83\9aã\83¼ã\82¸ã\81®ã\82«ã\83\86ã\82´ã\83©ã\82¤ã\82º",
        "watchlist-options": "ウォッチリストのオプション",
        "watching": "ウォッチリストに追加中...",
        "unwatching": "ウォッチリストから除去中...",
        "import-nonewrevisions": "版のインポートはされませんでした(すべての版が以前に取り込み済みだったか、エラーにより飛ばされたため)。",
        "xml-error-string": "$1、$2 行の $3 文字目 ($4バイト目): $5",
        "import-upload": "XMLデータをアップロード",
-       "import-token-mismatch": "セッションデータを損失しました。\nもう一度試してください。",
+       "import-token-mismatch": "セッションデータを損失しました。\n\nアカウントがログアウトされている可能性があります。<strong>アカウントにログインしていることを確認して、もう一度やり直してください</strong>。\nそれでも失敗する場合、[[Special:UserLogout|ログアウト]]してからログインし直し、現在使用しているブラウザでこのサイトからのクッキーが許可されていることを確認してください。",
        "import-invalid-interwiki": "指定されたウィキから取り込めませんでした。",
        "import-error-edit": "あなたにそのページを編集する許可がないため、ページ「$1」は取り込まれませんでした。",
        "import-error-create": "あなたにそのページを作成する許可がないため、ページ「$1」は取り込まれませんでした。",
        "tooltip-ca-nstab-category": "カテゴリページを閲覧",
        "tooltip-minoredit": "この編集に細部の変更の印を付ける",
        "tooltip-save": "変更を保存する",
-       "tooltip-preview": "変更内容をプレビューで確認できます。保存前に使用してください!",
+       "tooltip-preview": "変更内容をプレビューで確認できます。保存前に使用してください",
        "tooltip-diff": "文章への変更箇所を表示する",
        "tooltip-compareselectedversions": "選択した2つの版の差分を表示する",
        "tooltip-watch": "このページをウォッチリストに追加する",
        "filedelete-old-unregistered": "指定されたファイルの版「$1」はデータベース内にありません。",
        "filedelete-current-unregistered": "指定されたファイル「$1」はデータベース内にありません。",
        "filedelete-archive-read-only": "保存版ディレクトリ「$1」は、ウェブサーバーから書き込み不可になっています。",
-       "previousdiff": "←古い編集",
-       "nextdiff": "新しい編集→",
+       "previousdiff": "← 古い編集",
+       "nextdiff": "新しい編集 →",
        "mediawarning": "<strong>警告:</strong> この種類のファイルは、悪意があるコードを含んでいる可能性があります。\n実行するとシステムが危険にさらされるおそれがあります。",
        "imagemaxsize": "画像のサイズ制限: <br /><em>(ファイルページに対する)</em>",
        "thumbsize": "サムネイルの大きさ:",
        "tags-deactivate-reason": "理由:",
        "tags-deactivate-not-allowed": "タグ「$1」は無効化できません。",
        "tags-deactivate-submit": "無効化",
-       "tags-apply-no-permission": "あなたは変更と同時に変更タグを適応する権限がありません。",
+       "tags-apply-no-permission": "ã\81\82ã\81ªã\81\9fã\81«ã\81¯å¤\89æ\9b´ã\81¨å\90\8cæ\99\82ã\81«å¤\89æ\9b´ã\82¿ã\82°ã\82\92é\81©å¿\9cã\81\99ã\82\8b権é\99\90ã\81\8cã\81\82ã\82\8aã\81¾ã\81\9bã\82\93ã\80\82",
        "tags-apply-not-allowed-one": "タグ \"$1\" の手動適用は認められていません。",
        "tags-apply-not-allowed-multi": "以下の {{PLURAL:$2|タグ}} は手動適用が認められていません: $1",
-       "tags-update-no-permission": "ã\81\82ã\81ªã\81\9fã\81«ã\81¯å\80\8bã\80\85ã\81®ç\89\88ã\81¾ã\81\9fã\81¯è¨\98é\8c²é \85ç\9b®ã\81®ã\82¿ã\82°ã\81®è¿½å\8a ã\81¾ã\81\9fã\81¯é\99¤å\8e»ã\82\92è¡\8cã\81\86権é\99\90ã\81¯ありません。",
+       "tags-update-no-permission": "ã\81\82ã\81ªã\81\9fã\81«ã\81¯å\80\8bã\80\85ã\81®ç\89\88ã\81¾ã\81\9fã\81¯è¨\98é\8c²é \85ç\9b®ã\81®ã\82¿ã\82°ã\81®è¿½å\8a ã\81¾ã\81\9fã\81¯é\99¤å\8e»ã\82\92è¡\8cã\81\86権é\99\90ã\81\8cありません。",
        "tags-update-add-not-allowed-one": "タグ \"$1\" の手動追加は認められていません。",
        "tags-update-add-not-allowed-multi": "以下の {{PLURAL:$2|タグ}} は手動追加が認められていません: $1",
        "tags-update-remove-not-allowed-one": "タグ \"$1\" の除去は認められていません。",
        "logentry-suppress-block": "$1 が {{GENDER:$4|$3}} を$5で{{GENDER:$2|ブロックしました}} $6",
        "logentry-suppress-reblock": "$1 が {{GENDER:$4|$3}} のブロックの期限を$5に{{GENDER:$2|変更しました}} $6",
        "logentry-import-upload": "$1 がファイルをアップロードして $3 を{{GENDER:$2|インポートしました}}",
+       "logentry-import-upload-details": "$1 がファイルのアップロードにより、$3 を{{GENDER:$2|インポートしました}} ({{PLURAL:$4|版}} $4)",
        "logentry-import-interwiki": "$1 が他のウィキから $3 を{{GENDER:$2|インポートしました}}",
        "logentry-import-interwiki-details": "$1 が $3 を $5 から{{GENDER:$2|取り込み}}ました ($4 {{PLURAL:$4|版}})",
        "logentry-merge-merge": "$1{{GENDER:$2|統合元}} と$3を$4に統合(改訂版を$5に掲載)",
        "expand_templates_generate_xml": "XML 構文解析ツリーを表示",
        "expand_templates_generate_rawhtml": "HTML ソースを表示",
        "expand_templates_preview": "プレビュー",
-       "expand_templates_preview_fail_html": "<em>{{SITENAME}} ではHTMLソースが有効になっており、セッションデータの損失が生じているので、JavaScript の攻撃に対する予防措置としてプレビューは表示されません。</em>\n\n<strong>これが合法的なプレビューの試みである場合には、もう一度試してください。</strong>\nそれでも動作しない場合は、[[Special:UserLogout|ログアウト]]して再度ログインしてみてください。",
+       "expand_templates_preview_fail_html": "<em>{{SITENAME}} ではHTMLソースが有効になっており、セッションデータの損失が生じているので、JavaScript の攻撃に対する予防措置としてプレビューは表示されません。</em>\n\n<strong>これが合法的なプレビューの試みである場合には、もう一度試してください。</strong>\nそれでも動作しない場合は、[[Special:UserLogout|ログアウト]]してからログインし直し、現在使用しているブラウザでこのサイトからのクッキーが許可されていることを確認してください。",
        "expand_templates_preview_fail_html_anon": "<em>{{SITENAME}} ではHTMLソースが有効になっており、ログインしていないため、JavaScript の攻撃に対する予防措置としてプレビューは表示されません。</em>\n\n<strong>これが合法的なプレビューの試みである場合には、[[Special:UserLogin|ログイン]]してもう一度試してください。</strong>",
        "expand_templates_input_missing": "文章を入力してください。",
        "pagelanguage": "ページ言語の変更",
index a5ca575..8cab5c3 100644 (file)
        "permalink": "Poermanint lingk",
        "print": "Print",
        "view": "Riid",
+       "view-foreign": "Vyuu pah $1",
        "edit": "Edit",
        "create": "Kriet",
+       "create-local": "Ad luokal diskripshan‎",
        "editthispage": "Edit dis piej",
        "create-this-page": "Kriet dis piej",
        "delete": "Diliit",
        "pool-queuefull": "Puul kyuu fulop",
        "pool-errorunknown": "Anuon era",
        "aboutsite": "Habowt {{SITENAME}}",
-       "aboutpage": "Project:About",
+       "aboutpage": "Project:Bout‎",
        "copyright": "Kantent avielobl anda $1.",
        "copyrightpage": "{{ns:project}}:Kapirait",
        "currentevents": "Korant ivent",
        "userlogin-yourname-ph": "Enta yu yuuzaniem",
        "yourpassword": "Paaswod:",
        "userlogin-yourpassword": "Paaswod",
+       "userlogin-yourpassword-ph": "Enta yu paaswod‎",
        "createacct-yourpassword-ph": "Enta paaswod",
        "yourpasswordagain": "Ritaip paaswod:",
        "createacct-yourpasswordagain": "Kanfoerm paaswod",
        "createacct-yourpasswordagain-ph": "Enta paaswod agen",
        "remembermypassword": "Memba mi lagiin pan dis brouza (fi a maximom a $1 {{PLURAL:$1|die|die}})",
+       "userlogin-remembermypassword": "Kip mi lagiin‎",
        "yourdomainname": "Yu domien:",
        "externaldberror": "Aida aatentikieshan dietabies era okor ar yu no lou fi opdiet yu extoernal akount.",
        "login": "Lag iin",
        "logout": "Lag out",
        "userlogout": "Lag out",
        "notloggedin": "No lag iin",
+       "userlogin-noaccount": "No gat no akount?‎",
+       "userlogin-joinproject": "Jain {{SITENAME}}‎",
        "nologin": "Naa no akount? $1.",
        "nologinlink": "Kriet a akount",
        "createaccount": "Kriet akount",
        "gotaccount": "Aredi gat akount? $1.",
        "gotaccountlink": "Lag iin",
        "userlogin-resetlink": "Figet yu lagin detail dem?",
+       "userlogin-resetpassword-link": "Figat yu paaswod?‎",
+       "userlogin-helplink2": "Elp wid lagiin‎",
        "createacct-emailoptional": "Iimiel ajres (apshanal)",
        "createacct-email-ph": "Enta yu iimiel ajres",
        "createaccountmail": "Bai e-miel",
        "createacct-benefit-heading": "{{SITENAME}} mek bai smadi laka yu.",
        "createacct-benefit-body1": "{{PLURAL:$1|edit|edits}}",
        "createacct-benefit-body2": "{{PLURAL:$1|page|pages}}",
-       "createacct-benefit-body3": "riisent\n{{PLUURAL:$1|kanchribiuta|kanchribiutadem}}",
+       "createacct-benefit-body3": "riisent {{PLURAL:$1|kanchribiuta|kanchribiutadem}}",
        "badretype": "Di paaswod yu enta no mach.",
        "userexists": "Yuuza niem enta aredi a yuuz.\nBegyu chuuz wahn difrahn niem.",
        "loginerror": "Lagiin era",
        "resetpass-submit-cancel": "Kiansl",
        "resetpass-wrong-oldpass": "Invalid ar tempareri paaswod.\nYu maita chienj yu paaswod soksesfuli aredi ar rikwes wahn nyuu tempareri paaswod.",
        "resetpass-temp-password": "Tempareri paaswod",
+       "passwordreset": "Riiset paaswod‎",
        "passwordreset-username": "Yuuzaniem:",
        "passwordreset-domain": "Domien:",
        "bold_sample": "Buol tex",
        "preview": "Priivyuu",
        "showpreview": "Shuo priivyuu",
        "showdiff": "Shuo chienjdem",
-       "anoneditwarning": "'''Waanin:''' Yu no lag iin.\nYu IP ajres wi rikaad ina dis piej edit ischri.",
+       "anoneditwarning": "<strong>Waanin:</strong> Yu no lagiin. Yu IP ajres wi vizibl tu poblik ef yu mek eni edit. Ef yu <strong>[$1 lagiin]</strong> ar <strong>[$2 kriet akount]</strong>, yu editdem wi get achribiut tu yu yuuzaniem, wid adaels benifit.‎",
        "anonpreviewwarning": "''Yu no lag iin. Sievin wi rikaad yu IP ajres ina dis piej edit ischri.''",
        "missingsummary": "'''Rimainda:''' Yu no provaid no edit somari.\nEf yu klik \"{{int:savearticle}}\" agen, yu edit wi siev widoutn wan.",
        "missingcommenttext": "Begyu enta a kament biluo.",
        "newarticletext": "Yu fala lingk tu piej we no egzis yet.\nFi kriet di piej, taat taip ina di bax biluo (si di [$1 elp piej] fi muo infamieshan).\nEf yu de ya by mistiek, klik yu brouza '''bak''' botn.",
        "anontalkpagetext": "----''Dis a di diskoshan piej fi ananimos yuuza uu no kriet no akount yet, ar uu no yuuzi.\nWi dierfuor afi yuuz di nyuumerikal IP ajres fi aidentifai im/ar.\nSoch a IP ajres kiahn shier bai sebral yuuza.\nEf yu a ananimos yuuza ahn fiil se irelivant kament dairek tu yu, begyu [[Special:UserLogin/signup|kriet a akount]] ar [[Special:UserLogin|lag iin]] fi avaid fyuucha kanfyuujan wid ada ananimos yuuza.''",
        "noarticletext": "Korentli no tex no de ina dis piej.\nYu kiahn [[Special:Search/{{PAGENAME}}|saach fi dis piej taikl]] ina ada piej,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} saach di rilietid lagdem],\nar [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit dis piej]</span>.",
+       "noarticletext-nopermission": "Korantli no tex no de ina dis piej.\nYu kiah [[Special:Search/{{PAGENAME}}|saach fi dis piej taikl]] ina ada piej, ar <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} saach di rilietid lagdem]</span>, bot yu not ab pomishan fi kriet dis piej.‎",
        "userpage-userdoesnotexist": "Yuuza akount \"<nowiki>$1</nowiki>\" no rejista.\nBegyu chek ef yu waahn fi kriet/edit dis piej.",
        "userpage-userdoesnotexist-view": "Yuuza akount \"$1\" no rejista.",
        "blocked-notice-logextract": "Dis yuuza korantli blak.\nDi lietis blak lag enchri provaid biluo fi refrans:",
        "hiddencategories": "Dis piej a memb a {{PLURAL:$1|1 idn kiatigari|$1 idn kiatigari}}:",
        "permissionserrors": "Permishan herro",
        "permissionserrorstext-withaction": "Yu no ab no poermishan fi $2, fi di falarin {{PLURAL:$1|riizn|riizndem}}:",
+       "moveddeleted-notice": "Dis piej eh diliit.\nDi diliishan ah muuv lag fi di piej provaid biluo fi refrans.‎",
        "edit-conflict": "Hedit kanflik: $1",
        "cantcreateaccounttitle": "Cyannat mek di hakkount",
        "viewpagelogs": "Vyuu lagdem fi dis piej",
        "currentrev-asof": "Lietis rivijan az av $1",
        "revisionasof": "Rivijan az av $1",
+       "revision-info": "Rivijan optel $1 by {{GENDER:$6|$2}}$7‎",
        "previousrevision": "← Uola rivijan",
        "nextrevision": "Nyuwa rivijan",
        "currentrevisionlink": "Lietis rivijan",
        "lineno": "Lain $1:",
        "compareselectedversions": "Kompier silektid rivijan",
        "editundo": "andu",
-       "diff-multi-sameuser": "({{PLUURAL:$1|Wan intamidiet rivijan|$1 intamidiet rivijandem}} bai di siem yuuza we no shuo)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Wan intamidiet rivijan|$1 intamidiet rivijandem}} bai di siem yuuza we no shuo)",
        "searchresults": "Saach rizolt",
        "searchresults-title": "Saach rizolt fi \"$1\"",
        "notextmatches": "No piej tex mach",
        "prevn": "priivos {{PLURAL:$1|$1}}",
        "nextn": "nex {{PLURAL:$1|$1}}",
+       "nextn-title": "Nex $1 {{PLURAL:$1|rizolt|rizoltdem}}‎",
        "shown-title": "Shuo $1 {{PLURAL:$1|result|results}} po piej",
        "viewprevnext": "Vyuu ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>Kriet di piej \"[[:$1]]\" pah dis wiki!</strong> {{PLURAL:$2|0=|Si azwel di piej we fain wid yu saach.|Si azwel di saach rizolt wa fain.}}‎",
        "searchprofile-articles": "Kantent piej",
        "searchprofile-images": "Moltimidia",
        "searchprofile-everything": "Ebriting",
        "search-interwiki-default": "$1 rizoltdem:",
        "search-interwiki-more": "(muo)",
        "searchall": "aal",
+       "search-showingresults": "{{PLURAL:$4|Rizolt <strong>$1</strong> a <strong>$3</strong>|Rizoltdem <strong>$1 - $2</strong> a <strong>$3</strong>}}‎",
+       "search-nonefound": "No rizolt no de we mach di kweiri.",
        "powersearch-legend": "Advans saach",
        "powersearch-ns": "Saach ina niemspies:",
        "preferences": "Prefrens",
        "prefs-help-realname": "Riil niem apshanal. Ef yu giit, imaita yuuz az achribyuushan fi yu wok.",
        "group-sysop": "Adminischrieta",
        "grouppage-sysop": "{{ns:project}}:Adminischrieta",
+       "right-writeapi": "Yuus a di rait API",
        "newuserlogpage": "Yuuza krieshan lag",
        "rightslog": "Yuuza raits lag",
        "action-edit": "edit dis piej",
        "enhancedrc-history": "ischri",
        "recentchanges": "Riisant chienjdem",
        "recentchanges-legend": "Riisant chienj apshan",
+       "recentchanges-summary": "Chrak di muos riisent chienj tu di wiki pah dis piej.‎",
        "recentchanges-feed-description": "Chrak di muos riisant chienjdem tu di wiki ina dis fiid.",
        "recentchanges-label-newpage": "Dis edit kriet nyuu piej",
        "recentchanges-label-minor": "Dis a maina edit",
        "recentchanges-label-bot": "Dis edit pofaam bai bot",
+       "recentchanges-label-unpatrolled": "Dis edit no get pachuol yet",
+       "recentchanges-label-plusminus": "Di piej saiz chienj bai dis nomba a bait",
+       "recentchanges-legend-heading": "'''Lejen:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (azwel si [[Special:NewPages|lis a nyuu piej]])",
        "rclistfrom": "Shuo nyuu chienjdem we taat frahn $3 $2",
        "rcshowhideminor": "$1 maina editdem",
        "rcshowhideminor-show": "Shuo",
+       "rcshowhideminor-hide": "Aid",
        "rcshowhidebots": "$1 batdem",
        "rcshowhidebots-show": "Shuo",
-       "rcshowhideliu": "$1 lag-iin yuuzadem",
+       "rcshowhidebots-hide": "Aid",
+       "rcshowhideliu": "$1 rejista yuuzadem",
+       "rcshowhideliu-hide": "Aid",
        "rcshowhideanons": "$1 ananimos yuuzadem",
        "rcshowhideanons-show": "Shuo",
+       "rcshowhideanons-hide": "Aid",
        "rcshowhidemine": "$1 mi editdem",
        "rcshowhidemine-show": "Shuo",
+       "rcshowhidemine-hide": "Aid",
        "rclinks": "Shuo laas $1 chienj ina laas $2 die<br />$3",
        "diff": "dif",
        "hist": "isch",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bait|baitdem}} afta chienj‎",
        "rc-enhanced-expand": "Shuo ditiel (rikwaya JavaScript)",
        "rc-enhanced-hide": "Aid ditiel",
        "recentchangeslinked": "Rilietid chienj",
        "recentchangeslinked-to": "Shuo chienjdem tu piej wa lingk tu di gibn piej insted",
        "upload": "Opluod fail",
        "uploadlogpage": "Opluod lag",
+       "filedesc": "Somari‎",
+       "license-header": "Laisnsin‎",
        "imgfile": "fail",
        "file-anchor-link": "Fail",
        "filehist": "Fail ischri",
        "linkstoimage": "Di falarin {{PLURAL:$1|piej lingk|$1 piejdem lingk}}",
        "nolinkstoimage": "No piej no de we lingk dis fail.",
        "sharedupload": "Dis fail kom frahn $1 ahn kiahn yuuz bai ada prajek.",
+       "sharedupload-desc-here": "Dis fail koh frah $1 ah kiah yuuz pah adaels prajek. Di diskripshan fiit [$2 fail diskripshan piej] shuo biluo.‎",
        "uploadnewversion-linktext": "Opluod nyuu voerjan a dis fail",
+       "upload-disallowed-here": "Yu kyaah uobarait dis fail.",
        "randompage": "Random piej",
        "statistics": "Tatistik",
        "nbytes": "$1 {{PLURAL:$1|bait|bait}}",
        "allpagesto": "Displie piej en a:",
        "allarticles": "Aal piej",
        "allpagessubmit": "Gwaan",
+       "categories": "Kiatigaridem‎",
        "linksearch": "Extoernal lingk",
        "listgrouprights-members": "(lis a memba)",
        "emailuser": "E-miel dis yuuza",
        "deleteotherreason": "Ada/adishanal riizn:",
        "deletereasonotherlist": "Ada riizn",
        "rollbacklink": "ruolbak",
+       "rollbacklinkcount": "roulbak $1 {{PLURAL:$1|edit|editdem}}‎",
        "protectlogpage": "Protekshan lag",
        "protectedarticle": "don protek \"[[$1]]\"",
        "modifiedarticleprotection": "don chienj protekshan lebl fi \"[[$1]]\"",
        "undeletelink": "vyuu/ristuor",
        "namespace": "Niemspies",
        "invert": "Invoert silekshan",
+       "tooltip-invert": "Chek dis bax fi aid chienj tu piej widin di silek niemspies (ah di asuosietid niemspies ef ichek)",
+       "namespace_association": "Asuosietid niemspies",
+       "tooltip-namespace_association": "Chek dis bax fi azwel ingkluud di taak ar sobjek niemspies asuosiet wid di silek niemspies",
        "blanknamespace": "(Mien)",
        "contributions": "{{GENDER:$1|Yuuza}} kanchribyuushan",
        "contributions-title": "Yuuza kanchribiushan fi $1",
        "linkshere": "Di falarin piejdem lingk tu '''[[:$1]]''':",
        "isredirect": "riidirek piej",
        "istemplate": "chranskluujan",
-       "isimage": "imij lingk",
+       "isimage": "fail lingk",
        "whatlinkshere-prev": "{{PLURAL:$1|priivos|priivos $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|nex|nex $1}}",
        "whatlinkshere-links": "← lingkdem",
        "import": "Himpuot piejdem",
        "import-comment": "Kament:",
        "tooltip-pt-userpage": "{{GENDER:|Yu yuuza}} piej",
-       "tooltip-pt-mytalk": "Yu taak piej",
+       "tooltip-pt-mytalk": "{{GENDER:|Fiyu}} taak piej‎",
        "tooltip-pt-preferences": "{{GENDER:|Yu}} prefrans",
        "tooltip-pt-watchlist": "Di lis a piej yu a manita fi chienj",
-       "tooltip-pt-mycontris": "Lis a yu kanchribyuushan",
+       "tooltip-pt-mycontris": "Lis a {{GENDER:|Fiyu}} kanchribyuushan‎",
        "tooltip-pt-login": "Yu inkorij fi lag iin; ousomeba, ino mos ahn boun",
        "tooltip-pt-logout": "Lag out",
        "tooltip-pt-createaccount": "Yu inkorij fi kriet wah akount ah lagiin; ousomeba, a no mos",
        "tooltip-t-recentchangeslinked": "Riisant chienj ina piej wa lingk frahn dis piej",
        "tooltip-feed-rss": "RSS fiid fi dis piej",
        "tooltip-feed-atom": "Atom fiid fi dis piej",
-       "tooltip-t-contributions": "Vyuu di lis a kanchribyuushan a dis yuuza",
+       "tooltip-t-contributions": "Lis a kanchribyuushan bai {{GENDER:$1|dis yuuza}}‎",
        "tooltip-t-emailuser": "Sen e-miel tu dis yuuza",
        "tooltip-t-info": "Muo infamieshan bout da piej ya",
        "tooltip-t-upload": "Opluod fail",
        "tooltip-watch": "Ad dis piej tu yu wachlis",
        "tooltip-rollback": "\"Ruolbak\" rivoert edit(dem) tu dis piej a di laas kanchribiuta ina wan klik",
        "tooltip-undo": "\"Andu\" rivoert dis edit ahn opin di edit faam ina priivyuu muod. Ilou yu fi ad riizn ina di somari.",
+       "tooltip-summary": "Enta shaat somari",
+       "simpleantispam-label": "Anti-spam chek.\n<strong>No</strong> fuliin dis!‎",
        "pageinfo-toolboxlink": "Piej infamieshan",
        "previousdiff": "← Uola edit",
        "nextdiff": "Nyuwa edit",
        "file-info-size": "$1 × $2 pixl, fail saiz: $3, MIME taip: $4",
        "file-nohires": "No aya rezaluushan no avielobl.",
        "svg-long-desc": "SVG fail, naminali $1 × $2 pixl, fail saiz: $3",
-       "show-big-image": "Ful rezaluushan",
+       "show-big-image": "Orijinal fail",
+       "show-big-image-preview": "Saiz a dis priivyuu: $1.",
+       "show-big-image-other": "Adaels {{PLURAL:$2|rezaluushan|rezaluushandem}}: $1.",
+       "show-big-image-size": "$1 × $2 pixels",
        "bad_image_list": "Di faamat go so:\n\nOnggl lis aitem (lain taat wid *) wi kansida.\nDi fos lingk pan a lain mos bi a lingk tu a bad fail.\nEni sobsikwent lingk pahn di siem lain kansida fi bi eksepshan, i.e. piej we di fail maita okor inlain.",
        "metadata": "Metadieta",
        "metadata-help": "Dis fail kantien adishanal infamieshan, prabli wa ad frahn di dijital kiamara ar skiana yuuz fi kriet ar dijitaizi.\nEf di fail madifai frahn iarijinal stiet, som ditiel maita no fuli riflek di madifai fail.",
        "metadata-expand": "Shuo extendid ditiel",
        "metadata-collapse": "Aid extendid ditiel",
        "metadata-fields": "EXIF metadieta fiil wa lis ina dis mechiz wi inkluud pahn imij piej displie wen di metadieta tiebl get kalaps.\nAda wandem wi aid bai difaalt.\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": "Orientieshan‎",
+       "exif-xresolution": "Arizantal rezaluushan‎",
+       "exif-yresolution": "Voertikal rezaluushan‎",
+       "exif-datetime": "Fail chienj diet ah taim‎",
+       "exif-make": "Kiamara maniufakchra‎",
+       "exif-model": "Kiamara magl‎",
+       "exif-software": "Saafwier yuuz‎",
+       "exif-exifversion": "Exif voerjan",
+       "exif-colorspace": "Kola spies‎",
+       "exif-datetimeoriginal": "Diet ah taim a dieta jinarieshan‎",
+       "exif-datetimedigitized": "Diet ah taim a dijitaizin‎",
+       "exif-orientation-1": "Naamal‎",
        "namespacesall": "aal",
        "monthsall": "aal",
        "watchlisttools-view": "Vyuu rilivant chienjdem",
        "watchlisttools-edit": "Vyuu ahn edit wachlis",
        "watchlisttools-raw": "Edit raa wachlis",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1| talk]])‎",
        "specialpages": "Peshal piej",
+       "tag-filter": "[[Special:Tags|Tag]] filta:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
+       "logentry-delete-delete": "$1 {{GENDER:$2|diliitid}} piej $3‎",
+       "logentry-move-move": "$1 {{GENDER:$2|muuv}} piej $3 tu $4‎",
+       "logentry-newusers-create": "Yuuza akount $1 eh {{GENDER:$2|krietid}}‎",
        "logentry-upload-upload": "$1 {{GENDER:$2|uploaded}} $3",
        "searchsuggest-search": "Saach‎"
 }
index 95e3d0e..45a62d6 100644 (file)
        "rcshowhidemine": "내 편집을 $1",
        "rcshowhidemine-show": "보이기",
        "rcshowhidemine-hide": "숨기기",
+       "rcshowhidecategorization": "$1 문서 분류",
        "rcshowhidecategorization-show": "보이기",
        "rcshowhidecategorization-hide": "숨기기",
        "rclinks": "최근 $2일간의 $1개 바뀐 문서 보기<br />$3",
index bc6c06b..092734f 100644 (file)
        "retypenew": "Şîfreya nû careke din binîvîse",
        "resetpass_submit": "Şîfreyê pêkbîne û têkeve",
        "changepassword-success": "Guhertine şîfreya te serkeftî bû!",
+       "botpasswords-label-update": "Rojane bike",
+       "botpasswords-label-cancel": "Betal bike",
        "resetpass_forbidden": "Şîfre nikarin werin guhertin",
        "resetpass-submit-loggedin": "Şîfreyê biguherîne",
        "resetpass-submit-cancel": "Betal bike",
        "sig_tip": "Îmze û demxeya wext ya te",
        "hr_tip": "Rastexêza berwarî (kêm bi kar bîne)",
        "summary": "Kurte (Te çi kir?):",
-       "subject": "Mijar/sernivîs:",
+       "subject": "Mijar:",
        "minoredit": "Ev guhertineke biçûk e",
        "watchthis": "Vê gotarê bişopîne",
        "savearticle": "Rûpelê tomar bike",
        "preview": "Pêşdîtin",
        "showpreview": "Pêşdîtinê nîşan bide",
        "showdiff": "Guherandinan nîşan bide",
-       "anoneditwarning": "<strong>Hişyarî:<strong> Tu netêketî yî! Navnîşana IP'ya te wê di dîroka guherandina vê rûpelê de bê tomarkirin. Heke tu <strong>[$1 têkevî]</strong>, li gel sûdên te yên din guhertinên ku tu bikî jî wê ji nasnavê te re bê atfkirin.",
+       "anoneditwarning": "<strong>Hişyarî:<strong> Tu netêketî yî! Navnîşana IP'ya te wê di dîroka guherandina vê rûpelê de bê tomarkirin. Heke tu <strong>[$1 têkevî]</strong> an jî  <strong>[$2 hesabekî çêbikî]</strong>, li gel sûdên te yên din guhertinên ku tu bikî jî wê ji nasnavê te re bê atfkirin.",
        "anonpreviewwarning": "''Tu ne têketî yî. Tomarkirin wê navnîşana IP'ya te di dîroka guhertinan de nîşan bide.''",
        "missingsummary": "<span style=\"color:#990000;\">'''Zanibe:'''</span> Te nivîsekî kurt ji bo guherandinê ra nenivîsand. Eger tu niha carekî din li Tomar xê, guherandinê te vê nivîsekî kurt yê were tomarkirin.",
        "missingcommenttext": "Ji kerema xwe kurteya naverokê li jêr binivisîne.",
        "editusergroup": "Komên bikarhêneran biguherîne",
        "editinguser": "Mafên bikarhêner '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) tên guhertin",
        "userrights-editusergroup": "Komên bikarhêneran biguherîne",
-       "saveusergroups": "Komên bikarhêneran tomar bike",
+       "saveusergroups": "Komên {{GENDER:$1|bikarhêneran}} tomar bike",
        "userrights-groupsmember": "Endamê/a:",
        "userrights-groups-help": "Tu dikarî komên bikarhêneran ên vê/vî bikarhênerê/î biguherînî:\n* Qutiyeke nîşankirî dibêje ku ev bikarhêner di wê komê de ye.\n* Qutiyeke nenîşankirî dibêje ku ev bikarhêner ne di wê komê de ye.\n* Stêrkek (*) nîşan dide ku tu nikarî wê komê jêbibî, heke te berê ew lê zêde kiribe.",
        "userrights-reason": "Sedem:",
        "right-userrights-interwiki": "Mafên bikarhênerên li ser wîkiyên din biguherîne",
        "right-sendemail": "Ji bikarhênerên di re ename bişîne",
        "newuserlogpage": "Çêkirina hesabê nû",
+       "newuserlogpagetext": "Ev têketina hesabên bikarhêneriyê ye ên ku nû hatine afirandin.",
        "rightslog": "Guhertina mafê bikarhêneriyê",
        "rightslogtext": "Ev guhertineke ji bo mafên bikarhêneriyê ye.",
        "action-read": "vê rûpelê bixwîne",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|bikarhênerek|$1 bikarhêner}} vê rûpelê {{PLURAL:$1|dişopîne|dişopînin}}.]",
        "rc_categories_any": "Qet",
+       "rc-change-size-new": "Piştî guhertinê $1 {{PLURAL:$1|bayt}}",
        "newsectionsummary": "/* $1 */ beşeke nû",
        "rc-enhanced-expand": "Hûragahiyan nîşan bide",
        "rc-enhanced-hide": "Kitûmatan veşêre",
        "watchthisupload": "Vê rûpelê bişopîne",
        "filewasdeleted": "Data'yek bi vê navê hatibû barkirin û jêbirin. Xêra xwe li $1 seke ku barkirina te hêja ye ya na.",
        "filename-bad-prefix": "Nava wê data'yê, yê tu niha bardikê, bi '''\"$1\"''' destpêdike. Kamêrayên dîjîtal wan navan didin wêneyên xwe. Ji kerema xwe navekî baştir binivisîne ji bo mirov zûtir zanibin ku şayeşê vê wêneyê çî ye.",
-       "upload-success-subj": "Barkirina serkeftî",
-       "upload-failure-subj": "Pirsgirêka barkirinê",
-       "upload-warning-subj": "Hişyariya barkirinê",
        "upload-file-error": "Çewtiya navxweyî",
        "upload-dialog-button-cancel": "Betal bike",
        "upload-dialog-button-done": "Çêbû",
        "notargettitle": "Armanc tune",
        "pager-newer-n": "{{PLURAL:$1|nûtir 1|nûtir $1}}",
        "pager-older-n": "{{PLURAL:$1|kevintir 1|kevintir $1}}",
+       "apisandbox-unfullscreen": "Rûpelê nîşan bide",
+       "apisandbox-helpurls": "Girêdanên alîkariyê",
+       "apisandbox-examples": "Mînak",
+       "apisandbox-results": "Encam",
        "booksources": "Çavkaniyên pirtûkan",
        "booksources-search-legend": "Li çavkanîyên pirtûkan bigere",
        "booksources-search": "Lêgerîn",
        "wlheader-showupdated": "Ev rûpela hatî guhertin dema te lê meyzand bi '''nivîsa stûr''' tê xuyakirin.",
        "wlnote": "Niha {{PLURAL:$1|xeyrandinê|'''$1''' xeyrandinên}} dawî yê {{PLURAL:$2|seetê|'''$2''' seetên}} dawî {{PLURAL:$1|tê|tên}} dîtin.",
        "wlshowlast": "Guhertinên berî $1 saetan, $2 rojan, ya  nîşan bide",
-       "watchlistall2": "hemû",
        "watchlist-hide": "Veşêre",
        "watchlist-submit": "Nîşan bide",
        "wlshowhideliu": "bikarhênerên tomarkirî",
        "import-upload": "Daneyên XMLê bar bike",
        "importlogpage": "Têketina tevlîkirinê",
        "javascripttest": "JavaScript tê testkirin",
-       "tooltip-pt-userpage": "Rûpela min",
+       "tooltip-pt-userpage": "Rûpela {{GENDER:|Te}}",
        "tooltip-pt-anonuserpage": "Rûpela bikarhênerê ji bo navnîşana ÎP ku tu sererast dikî wekî",
-       "tooltip-pt-mytalk": "Gotûbêja min",
-       "tooltip-pt-preferences": "Hevyazên min",
+       "tooltip-pt-mytalk": "Gotûbêja {{GENDER:|Te}}",
+       "tooltip-pt-preferences": "Tercîhên {{GENDER:|te}}",
        "tooltip-pt-watchlist": "The list of pages you",
-       "tooltip-pt-mycontris": "Lîsteya beşdariyên min",
+       "tooltip-pt-mycontris": "Lîsteyekê beşdariyên {{GENDER:|te}}",
+       "tooltip-pt-login": "Têketina we tê teşwîqkirin; lêbelê, en ne elzem e",
        "tooltip-pt-logout": "Derkeve",
        "tooltip-ca-talk": "Gotûbêj li ser rûpela naverokê",
        "tooltip-ca-edit": "Vê rûpelê biguherîne",
        "tooltip-t-recentchangeslinked": "Recent changes in pages linking to this page",
        "tooltip-feed-rss": "RSS feed'ên ji bo rûpelê",
        "tooltip-feed-atom": "Atom feed'ên ji bo vê rûpelê",
-       "tooltip-t-contributions": "Lîsteya beşdariyên bikarhêner bibîne",
+       "tooltip-t-contributions": "Lîsteyekî beşdariyên {{GENDER:$1|vê bikarhênerê}} bibîne",
        "tooltip-t-emailuser": "Jê re name bişîne",
        "tooltip-t-info": "Bêhtir agahî di derbarê vê rûpelê de",
        "tooltip-t-upload": "Dosyeyan bar bike",
        "expand_templates_output": "Encam",
        "expand_templates_ok": "Baş e",
        "expand_templates_preview": "Pêşdîtin",
+       "pagelanguage": "Zimanê rûpelê biguherîne",
        "pagelang-language": "Ziman",
        "pagelang-select-lang": "Zimanekî hilbijêre",
        "pagelang-submit": "Tomar bike",
        "right-pagelang": "Zimanê rûpelê biguherîne",
        "action-pagelang": "zimanê rûpelê biguherîne",
-       "log-name-pagelang": "Têketina ziman biguherîne",
+       "log-name-pagelang": "Têketina guherandina ziman",
        "mediastatistics-header-total": "Hemû dosye",
        "special-characters-group-latin": "Latînî",
        "special-characters-group-latinextended": "Latînî berfirehkirî",
index aabcdc1..5bb32c1 100644 (file)
        "otherlanguages": "In aliis linguis",
        "redirectedfrom": "(Redirectum de $1)",
        "redirectpagesub": "Pagina redirectionis",
-       "lastmodifiedat": "Novissima mutatio die $2 hora $1 facta.",
+       "lastmodifiedat": "Novissima mutatio die $1 hora $2 facta.",
        "viewcount": "Haec pagina iam vista est {{PLURAL:$1|semel|$1 vices}}.",
        "protectedpage": "Pagina protecta",
        "jumpto": "Salire ad:",
index 416eafc..af139f6 100644 (file)
        "apisandbox-unfullscreen": "Säit weisen",
        "apisandbox-submit": "Ufro maachen",
        "apisandbox-reset": "Eidel maachen",
+       "apisandbox-retry": "Nach eng Kéier probéieren",
+       "apisandbox-helpurls": "Hëllef-Linken",
        "apisandbox-examples": "Beispiller",
        "apisandbox-dynamic-parameters": "Zousätzlech Parameteren",
        "apisandbox-dynamic-parameters-add-label": "Parameter derbäisetzen:",
        "movenosubpage": "Dës Säit huet keng Ënnersäiten.",
        "movereason": "Grond:",
        "revertmove": "zréck réckelen",
-       "delete_and_move_text": "== Läsche vun der Destinatiounssäit néideg ==\nD'Säit \"[[:$1]]\" existéiert schonn. \nWëll Dir se läsche fir d'Réckelen ze erméiglechen?",
+       "delete_and_move_text": "D'Zilsäit \"[[:$1]]\" gëtt et schonn. \nWëll Dir se läsche fir d'Réckelen ze erméiglechen?",
        "delete_and_move_confirm": "Jo, läsch d'Säit",
        "delete_and_move_reason": "Geläscht fir Plaz ze maache fir \"[[$1]]\" heihin ze réckelen",
        "selfmove": "Source- an Destinatiounsnumm sinn dselwecht; eng Säit kann net op sech selwer geréckelt ginn.",
index 280a99c..3fca0eb 100644 (file)
        "rcshowhidemine": "$1 हमर सम्पादन सभ",
        "rcshowhidemine-show": "देखाउ",
        "rcshowhidemine-hide": "नुकाऊ",
-       "rcshowhidecategorization-show": "दà¥\87à¤\96ाà¤\8a",
-       "rcshowhidecategorization-hide": "नà¥\81à¤\95ाà¤\8a",
+       "rcshowhidecategorization-show": "दà¥\87à¤\96ाबà¥\80",
+       "rcshowhidecategorization-hide": "नà¥\81à¤\95ाबà¥\80",
        "rclinks": "देखाऊ अंतिम $1 परिवर्त्तन अंतिम $2 दिनमे<br />$3",
        "diff": "अन्तर",
        "hist": "इति.",
        "querypage-disabled": "ई विशिष्ट पन्ना कार्य दक्षता लेल अशक्त कएल गेल अछि।",
        "apihelp": "API मद्दत",
        "apihelp-no-such-module": "मोड्युल \"$1\" नै भेटल।",
+       "apisandbox": "ए॰पी॰आइ प्रयोगपृष्ठ",
+       "apisandbox-submit": "अनुरोध करु",
+       "apisandbox-reset": "स्पष्ट",
+       "apisandbox-examples": "उदाहरण",
+       "apisandbox-results": "परिणाम",
+       "apisandbox-request-url-label": "अनुरोध URL:",
+       "apisandbox-request-time": "अनुरोध समय: $1",
        "booksources": "किताबक सन्दर्भ सभ",
        "booksources-search-legend": "किताबक सन्दर्भक लेल ताकू",
        "booksources-isbn": "आइ.एस.बी.एन.:",
        "contributions": "प्रयोक्ताक योगदान सभ",
        "contributions-title": "$1 लेल प्रयोक्ताक अवदान",
        "mycontris": "योगदान",
+       "anoncontribs": "योगदानसभ",
        "contribsub2": "$1 ($2) लेल",
        "contributions-userdoesnotexist": "प्रयोक्ता खाता \"$1\" पंजीकृत नै अछि।",
        "nocontribs": "कोनो परिवर्तन ऐ सँ मेल नै खाइए।",
        "javascripttest-pagetext-frameworks": "कृपया निम्न परीक्षण ढाँचा सभ में सँ एक चुनु: $1",
        "javascripttest-pagetext-skins": "परीक्षण करए के लेल त्वचा चुनु:",
        "javascripttest-qunit-intro": "mediawiki.org पर [$1 परीक्षण के प्रलेखन] देखु।",
-       "tooltip-pt-userpage": "अहाँक खेसरा पन्ना",
+       "tooltip-pt-userpage": "{{GENDER:|अहाँक प्रयोगकर्ता}} पृष्ठ",
        "tooltip-pt-anonuserpage": "सम्पाद्न कएल जा रहल स्थानक  अनिकेतक प्रयोक्ता पन्ना",
-       "tooltip-pt-mytalk": "अहाँक वार्त्ता पृष्ठ",
+       "tooltip-pt-mytalk": "{{GENDER:|अहाँक}} वार्ता पृष्ठ",
        "tooltip-pt-anontalk": "ऐ अनिकेतसँ भेल सम्पादनक वार्ता",
-       "tooltip-pt-preferences": "हमर मोनपसंद",
+       "tooltip-pt-preferences": "{{GENDER:|अहाँक}} अभिरुचीसभ",
        "tooltip-pt-watchlist": "पन्ना सभ जकर परिवर्त्तन पर अहाँक नजरि अछि",
-       "tooltip-pt-mycontris": "अहाँक योगदानक सूची",
+       "tooltip-pt-mycontris": "{{GENDER:|अहाँक}} योगदानक सूची",
        "tooltip-pt-login": "अहाँक खाता खोलक लेल प्रोत्साहित केल जाएत अछि; मुदा ई अनिवार्य नै अछि",
        "tooltip-pt-logout": "फेर आयब",
        "tooltip-pt-createaccount": "अहाँक खाता खोलक लेल प्रोत्साहित केल जाएत अछि; मुदा ई अनिवार्य नै छै",
index 311adf4..9bfd0f7 100644 (file)
        "password-login-forbidden": "ဤအသုံးပြုသူအမည်နှင့် စကားဝှက်အား အသုံးပြုခြင်းကို တားမြစ်ထားသည်။",
        "mailmypassword": "စကားဝှက်ကို ပြန်ချိန်ရန်",
        "passwordremindertitle": "{{SITENAME}} အတွက် ယာယီစကားဝှက်အသစ်",
+       "passwordremindertext": "တစ်စုံတစ်ယောက် ($1 အိုင်ပီလိပ်စာမှ သင်လည်းဖြစ်နိုင်) သည် {{SITENAME}} ($4) အတွက် စကားဝှက်အသစ်ကို တောင်းဆိုခဲ့သည်။ \nအသုံးပြုသူ \"$2\" အတွက် ယာယီစကားဝှက်အသစ်ကို ဖန်တီးပြီး \"$3\" အဖြစ် သတ်မှတ်လိုက်သည်။ \nဤအရာကို သင်ရည်ရွယ်သည်ဆိုပါက လော့ဂ်အင်ဝင်ရန်ပြီး စကားဝှက်အသစ် ရွေးချယ်ရန် လိုအပ်ပါသည်။ \nသင်၏ ယာယီစကားဝှက်သည် {{PLURAL:$5|တစ်ရက်|$5 ရက်}}အတွင်း သက်တမ်းကုန်ပါလိမ့်မည်။\n\nအကယ်၍ တစ်စုံတစ်ယောက်က ဤတောင်းဆိုမှုကို ပြုလုပ်ခဲ့ပါက၊ သို့မဟုတ် သင်သည် သင့်စကားဝှက်အား မှတ်မိပြီး \nပြောင်းလဲရန် ဆန္ဒမရှိပါ ဤစာလွှာကို မျက်ကွယ်ပြုပြီး စကားဝှက်အဟောင်းဖြင့် ဆက်လက်သုံးစွဲနိုင်ပါသည်။",
        "noemail": "အသုံးပြုသူ \"$1\" အတွက် မည်သည့်အီးမေးလိပ်စာမှ မှတ်သားထားခြင်း မရှိပါ။",
        "noemailcreate": "တရာဝင်အီးမေးလိပ်စာ ပေးရန် လိုအပ်သည်",
        "mailerror": "မေးပို့ခြင်း အမှား - $1",
        "right-createtalk": "ဆွေးနွေးချက်စာမျက်နှာများ စတင်ရေးသားရန်",
        "right-createaccount": "အသုံးပြုသူအကောင့်အသစ်ကို ဖန်တီးရန်",
        "right-minoredit": "တည်းဖြတ်မှုများကို အရေးမကြီးဟု မှတ်သားရန်",
-       "right-move": "á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\80á\80­á\80¯ရွှေ့ပြောင်းပါ",
+       "right-move": "á\80\85á\80¬á\80\99á\80»á\80\80á\80ºá\80\94á\80¾á\80¬á\80\99á\80»á\80¬á\80¸á\80\80á\80­á\80¯ ရွှေ့ပြောင်းပါ",
        "right-move-subpages": "စာမျက်နှာများကို ယင်းတို့၏စာမျက်နှာအခွဲတို့နှင့်တကွ ရွှေ့ရန်",
        "right-movefile": "ဖိုင်များရွှေ့ရန်",
        "right-suppressredirect": "စာမျက်နှာများကို ရွှေ့သောအခါ မူရင်းစာမျက်နှာတို့မှ ပြန်ညွှန်းများ မဖန်တီးရန်",
        "right-autoconfirmed": "အိုင်ပီအခြေပြု ကန့်သတ်ချက်များကို အကျိုးမသက်ရောက်ပါ",
        "right-bot": "အလိုအလျောက်ပြုမူသော ဖြစ်စဉ်အဖြစ်ဆောင်ရွက်ရန်",
        "right-writeapi": "ရေးသားမှု API ကို သုံးရန်",
-       "right-delete": "စာမျက်နှာများကိုဖျက်ပါ။",
+       "right-delete": "စာမျက်နှာများကို ဖျက်ပါ",
        "right-bigdelete": "လွန်စွာများပြားသော ရာဇဝင်များရှိသည့် စာမျက်နှာများကို ဖျက်ရန်",
        "right-browsearchive": "ဖျက်ပစ်လိုက်သော စာမျက်နှာများကို ရှာရန်",
        "right-undelete": "စာမျက်နှာတစ်ခုကို မဖျက်တော့ရန်",
        "removedwatchtext": "\"[[:$1]]\" နှင့် ၎င်း၏ ဆွေးနွေးချက်စာမျက်နှာကို သင်၏ [[Special:Watchlist|စောင့်ကြည့်စာရင်း]] မှ ဖယ်ထုတ်ပြီး ဖြစ်သည်။",
        "watch": "စောင့်ကြည့်ရန်",
        "watchthispage": "ဤစာမျက်နှာကို စောင့်ကြည့်ရန်",
-       "unwatch": "á\80\86á\80\80á\80ºá\80\9cá\80\80á\80º á\80\85á\80±á\80¬á\80\84á\80·á\80ºá\80\99á\80\80á\80¼á\80\8aá\80·á\80ºá\80\90á\80±á\80¬á\80·á\80\9bá\80\94်",
+       "unwatch": "á\80\85á\80±á\80¬á\80\84á\80·á\80ºá\80\99á\80\80á\80¼á\80\8aá\80·á\80ºá\80\95á\80«á\80\94á\80¾á\80\84á\80·်",
        "unwatchthispage": "စောင့်ကြည့်ခြင်းကို ရပ်တန့်ရန်",
        "notanarticle": "မာတိကာစာမျက်နှာတစ်ခု မဟုတ်",
        "watchlist-details": "{{PLURAL:$1|စာမျက်နှာ $1 ခု|စာမျက်နှာ $1 ခု}} သည် သင့်စောင့်ကြည့်စာရင်းတွင် ရှိပြီး ဆွေးနွေးချက်စာမျက်နှာများကို ထည့်တွက် မထားပါ။",
index b54249d..c37fdd5 100644 (file)
        "apisandbox-fullscreen": "Spanne pannello",
        "apisandbox-fullscreen-tooltip": "Spanne 'o pannello 'e casciulella 'e pprove pe' puté ghienchere tuttaquanta 'a fenestella d' 'o navigatóre.",
        "apisandbox-unfullscreen": "Mmusta paggena",
+       "apisandbox-unfullscreen-tooltip": "Reduce 'o pannello sandbox, accussì facenno ch' 'e cullegamente 'e navigazione 'e MediaWiki fossero a disposizione.",
        "apisandbox-submit": "Fà 'na richiesta",
        "apisandbox-reset": "Pulezza",
        "apisandbox-retry": "Riprova",
        "apisandbox-submit-invalid-fields-message": "Pe' piacere curriggite 'e campe nzegnàte e tentate n'ata vota.",
        "apisandbox-results": "Rezurtate",
        "apisandbox-sending-request": "Mannanno na richiesta 'API..",
+       "apisandbox-loading-results": "Ricezione d' 'e risultate 'e ll'API 'ncurzo...",
+       "apisandbox-results-error": "N'errore cumparette pe' tramente ca se steva carrecanno na risposta 'e query API: $1.",
+       "apisandbox-request-url-label": "URL addimannata:",
+       "apisandbox-request-time": "Tiempo addimannato: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "Curregge 'e token e manna n'ata vota",
+       "apisandbox-results-fixtoken-fail": "Scassaje a se piglià 'o token \"$1\".",
+       "apisandbox-alert-page": "'E campe int'a sta paggene nun so' valide.",
+       "apisandbox-alert-field": "'O valore int'a stu campo nun è valido.",
        "booksources": "Funte libbrarie",
        "booksources-search-legend": "Ascìa 'e fonte ncopp' 'e libbre",
        "booksources-search": "Ascìa",
index a1c830d..6dab70f 100644 (file)
        "passwordreset-emailtext-ip": "Noen (sannsynligvis deg fra IP-adressen $1) ba om en tilbakestilling av ditt passord for {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brukerkontoen|De følgende brukerkontoene}} er\ntilknyttet denne e-postadressen:\n\n$2\n\n{{PLURAL:$3|Dette midlertidige passordet|Disse midlertidige passordene}} utløper om {{PLURAL:$5|én dag|$5 dager}}.\nDu bør logge på og velge et nytt passord nå. Dersom noen andre kom med denne\nforespørselen, eller du har kommet på ditt opprinnelige passord, og ikke lenger\nønsker å endre det, kan du ignorere denne meldingen og fortsette å bruke ditt gamle\npassord.",
        "passwordreset-emailtext-user": "Brukeren $1 på {{SITENAME}} ba om en tilbakestilling av passordet ditt for {{SITENAME}}\n($4). {{PLURAL:$3|Den følgende brukerkontoen|De følgende brukerkontoene}} er tilknyttet denne e-postadressen:\n\n$2\n\n{{PLURAL:$3|Dette midlertidige passordet|Disse midlertidige passordene}} utløper om {{én dag|$5 dager}}.\nDu bør logge på og velge et nytt passord nå. Dersom noen andre kom med denne\nforespørselen, eller du har kommet på ditt opprinnelige passord, og ikke lenger\nønsker å endre det, kan du ignorere denne meldingen og fortsette å bruke ditt gamle\npassord.",
        "passwordreset-emailelement": "Brukernavn: \n$1\n\nMidlertidig passord: \n$2",
-       "passwordreset-emailsentemail": "Hvis denne epostadressen er koblet til din konto, så vil det bli sendt en epost om tilabakestilling av passord.",
+       "passwordreset-emailsentemail": "Hvis denne epostadressen er koblet til din konto, så vil det bli sendt en epost om tilbakestilling av passord.",
        "passwordreset-emailsentusername": "Hvis det finnes en epostadresse knyttet til dette brukernavnet, vil en epost med informasjon om tilbakestilling av passord bli sendt.",
        "passwordreset-emailsent-capture": "Passordtilbakestillingseposten vist under har blitt sendt ut.",
        "passwordreset-emailerror-capture": "En passordtilbakestillingsepost ble laget, men det lyktes ikke å sende denne til {{GENDER:$2|brukeren}}: $1",
        "previewnote": "'''Husk at dette bare er en forhåndsvisning.'''\nEndringene dine har ikke blitt lagret ennå!",
        "continue-editing": "Gå til redigeringsfeltet",
        "previewconflict": "Slik vil teksten i redigeringsvinduet se ut dersom du lagrer den.",
-       "session_fail_preview": "'''Beklager! Klarte ikke å lagre redigeringen din på grunn av tap av øktdata.'''\nPrøv igjen.\nOm det fortsetter å gå galt, prøv å [[Special:UserLogout|logge ut]] og så inn igjen.'''",
+       "session_fail_preview": "'''Beklager! Klarte ikke å lagre redigeringen din på grunn av tap av øktdata.'''\n\nDu kan ha blitt logget ut. <strong>Sjekk at du fortsatt er innlogget og prøv igjen.</strong>\nOm det fortsetter å gå galt, prøv å [[Special:UserLogout|logge ut]] og så inn igjen, og sjekk at nettleseren din godtar informasjonskapsler fra denne siden.",
        "session_fail_preview_html": "'''Beklager! Klarte ikke å lagre redigeringen din på grunn av tap av øktdata.'''\n\n''Fordi {{SITENAME}} har rå HTML slått på, er forhåndsvisningen skjult for å forhindre JavaScript-angrep.''\n\n'''Om dette er et legitimt redigeringsforsøk, prøv igjen. Om det da ikke fungerer, prøv å [[Special:UserLogout|logge ut]] og logge inn igjen.'''",
        "token_suffix_mismatch": "'''Redigeringen din har blitt avvist fordi klienten din ikke hadde punktasjonstegn i redigeringsteksten. Redigeringen har blitt avvist for å hindre ødeleggelse av artikkelteksten. Dette forekommer av og til når man bruker vevbaserte anonyme proxytjenester.'''",
        "edit_form_incomplete": "'''Deler av redigeringsskjemaet nådde ikke tjeneren; dobbelsjekk at redigeringen er korrekt og prøv igjen.'''",
        "mergehistory-empty": "Ingen revisjoner kan flettes.",
        "mergehistory-done": "{{PLURAL:$3|Én revisjon|$3 revisjoner}} av $1 ble flettet til [[:$2]].",
        "mergehistory-fail": "Klarte ikke å utføre historikkfletting; sjekk siden og tidsparameterne igjen.",
+       "mergehistory-fail-bad-timestamp": "Tidsangivelsen er ugyldig.",
+       "mergehistory-fail-invalid-source": "Kildesiden er ugyldig.",
+       "mergehistory-fail-invalid-dest": "Målsiden er ugyldig.",
+       "mergehistory-fail-permission": "Utilstrekkelige tillatelser for å flette historikk.",
+       "mergehistory-fail-self-merge": "Kilde- og målsiden er den samme.",
+       "mergehistory-fail-timestamps-overlap": "Kilderevisjoner overlapper eller kommer etter målrevisjoner.",
        "mergehistory-fail-toobig": "Det er ikke mulig å utføre historikk-fletting fordi flere enn tillatte $1 {{PLURAL:$1|revisjon|revisjoner}} ville blitt flyttet.",
        "mergehistory-no-source": "Kildesiden $1 finnes ikke.",
        "mergehistory-no-destination": "Målsiden $1 finnes ikke.",
        "searchprofile-images-tooltip": "Søk etter filer",
        "searchprofile-everything-tooltip": "Søk i alt innhold (inkldert diskusjonssider)",
        "searchprofile-advanced-tooltip": "Søk i visse navnerom",
-       "search-result-size": "$1 ({{PLURAL:$2|ett|$2}} ord)",
+       "search-result-size": "$1 ({{PLURAL:$2|ett ord|$2 ord}})",
        "search-result-category-size": "{{PLURAL:$1|1 medlem|$1 medlemmer}} ({{PLURAL:$2|1 underkategori|$2 underkategorier}}, {{PLURAL:$3|1 fil|$3 filer}})",
        "search-redirect": "(omdirigering $1)",
        "search-section": "(avsnitt $1)",
        "prefs-help-prefershttps": "Denne preferansen vil virke etter neste innlogging.",
        "prefswarning-warning": "Du har gjort endringer i dine innstillinger som ikke er lagret ennå.\nDersom du forlater denne siden utenk å klikke på \"$1\" blir ikke innstillingene dine oppdatert.",
        "prefs-tabs-navigation-hint": "Tips: Du kan bruke venstre- og høyrepiltastene for å navigere mellom fanene i fanelisten",
-       "userrights": "Brukerrettighetskontroll",
+       "userrights": "Bruker&shy;rettighets&shy;kontroll",
        "userrights-lookup-user": "Ordne brukergrupper",
        "userrights-user-editname": "Fyll inn et brukernavn:",
        "editusergroup": "Endre {{GENDER:$1|brukergrupper}}",
        "grant-createeditmovepage": "Opprette, redigere eller flytte sider",
        "grant-delete": "Slette sider, revisjoner og logginnlegg",
        "grant-editinterface": "Redigere i MediaWiki-navnerommet og CSS/JavaScript i brukernavnerommet",
-       "grant-editmycssjs": "Redigere din bruker-CSS/JavaScript",
+       "grant-editmycssjs": "Redigere din bruker-CSS/-JavaScript",
        "grant-editmyoptions": "Rediger dine brukerinnstillinger",
        "grant-editmywatchlist": "Redigere overvåkningslisten din",
        "grant-editpage": "Redigere eksisterende sider",
        "grant-editprotected": "Redigere beskyttede sider",
-       "grant-highvolume": "Høyvolumredigering",
+       "grant-highvolume": "Høy&shy;volum&shy;redigering",
        "grant-oversight": "Skjule brukere og undertrykke revisjoner",
        "grant-patrol": "Patruljere sideendringer",
        "grant-protect": "Beskytte og avbeskytte sider",
-       "grant-rollback": "Tilbakestille sideendringer",
+       "grant-rollback": "Tilbakestille side&shy;endringer",
        "grant-sendemail": "Sende e-post til andre brukere",
        "grant-uploadeditmovefile": "Laste opp, erstatte, og flytte filer",
        "grant-uploadfile": "Laste opp nye filer",
+       "grant-basic": "Grunnleggende rettigheter",
        "grant-viewdeleted": "Vise slettede filer og sider",
        "grant-viewmywatchlist": "Vise overvåkningslisten din",
        "newuserlogpage": "Brukeropprettelseslogg",
        "number_of_watching_users_pageview": "[$1 overvåkende {{PLURAL:$1|bruker|brukere}}]",
        "rc_categories": "Begrens til kategorier (skilletegn: «|»)",
        "rc_categories_any": "Alle",
-       "rc-change-size-new": "$1 {{PLURAL:$1|byte}} etter endring",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} etter endring",
        "newsectionsummary": "/* $1 */ ny seksjon",
        "rc-enhanced-expand": "Vis detaljer",
        "rc-enhanced-hide": "Skjul detaljer",
        "upload-scripted-pi-callback": "Det er ikke tillatt å laste opp en fil som inneholder et kjørbart XML-stilark.",
        "uploaded-script-svg": "Fant et skriptelement \"$1\" i den opplastede SVG-koden.",
        "uploaded-hostile-svg": "Fant usikker CSS i stilelementet til opplastet SVG-fil",
+       "uploaded-href-attribute-svg": "href-attributter i SVG-filer tillates kun for http://- eller https://-mål; fant <code>&lt;$1 $2=\"$3\"%gt;</code>.",
+       "uploaded-href-unsafe-target-svg": "Fant href til usikre data: URI-mål <code>&lt;$1 $2=\"$3\"&gt;</code> i den opplastede SVG-filen.",
        "uploadscriptednamespace": "Denne SVG-filen inneholder et ulovlig navnerom \"$1\"",
        "uploadinvalidxml": "XML-en i den opplastede filen kunne ikke tolkes.",
        "uploadvirus": "Denne filen inneholder virus! Detaljer: $1",
        "log-title-wildcard": "Søk i titler som starter med denne teksten",
        "showhideselectedlogentries": "Vis/skjul de valgte logghendelsene",
        "log-edit-tags": "Rediger merker til valgte loggposter",
+       "checkbox-select": "Velg: $1",
+       "checkbox-all": "Alle",
+       "checkbox-none": "Ingen",
+       "checkbox-invert": "Inverter",
        "allpages": "Alle sider",
        "nextpage": "Neste side ($1)",
        "prevpage": "Forrige side ($1)",
        "listgrouprights-namespaceprotection-namespace": "Navnerom",
        "listgrouprights-namespaceprotection-restrictedto": "Rettighet(er) som tillater at brukeren redigerer",
        "listgrants-summary": "Følgende er en liste over OAuth-tildelinger og hvilke brukerrettigheter de gir tilgang til. Brukere kan autorisere applikasjoner til å bruke kontoen deres, med rettigheter begrenset til de gitt av tildelingene brukeren har godkjent. En applikasjon som handler på vegne av en bruker kan imidlertid aldri benytte seg av rettigheter brukeren ikke selv har.\nDet kan finnes [[{{MediaWiki:Listgrouprights-helppage}}|ytterligere informasjon]] om de ulike rettighetene.",
-       "listgrants-rights": "Tildeling",
+       "listgrants-rights": "Rettigheter",
        "trackingcategories": "Sporingskategori",
        "trackingcategories-summary": "Denne siden lister sporingskategorier som er automatisk befolket av Mediawiki-programvaren. Navnene deres kan endres ved å redigere de tilhørende systembeskjedene i {{ns:8}}-navnerommet.",
        "trackingcategories-msg": "Sporingskategori",
        "sp-contributions-toponly": "Vis kun endringer som er gjeldende revisjoner",
        "sp-contributions-newonly": "Bare vis bidrag som er sideopprettinger",
        "sp-contributions-submit": "Søk",
-       "whatlinkshere": "Lenker hit",
+       "whatlinkshere": "Hva lenker hit",
        "whatlinkshere-title": "Sider som lenker til «$1»",
        "whatlinkshere-page": "Side:",
        "linkshere": "Følgende sider lenker til '''[[:$1]]''':",
        "javascripttest-pagetext-frameworks": "Vennligst velg en av følgende testerammeverk: $1",
        "javascripttest-pagetext-skins": "Velg et utseende for testene:",
        "javascripttest-qunit-intro": "Se [$1 testedokumentasjonen] på mediawiki.org.",
-       "tooltip-pt-userpage": "Din brukerside",
+       "tooltip-pt-userpage": "{{GENDER:|Din brukerside}}",
        "tooltip-pt-anonuserpage": "Brukersiden for IP-adressen du redigerer fra",
-       "tooltip-pt-mytalk": "Din diskusjonsside",
+       "tooltip-pt-mytalk": "{{GENDER:|Din}} diskusjonsside",
        "tooltip-pt-anontalk": "Diskusjon om redigeringer fra denne IP-adressen",
-       "tooltip-pt-preferences": "Dine innstillinger",
+       "tooltip-pt-preferences": "{{GENDER:|Dine}} innstillinger",
        "tooltip-pt-watchlist": "Liste over sider du overvåker for endringer.",
-       "tooltip-pt-mycontris": "Liste over dine bidrag",
+       "tooltip-pt-mycontris": "En liste over {{GENDER:|dine}} bidrag",
        "tooltip-pt-anoncontribs": "En liste over redigeringer gjort fra denne IP-adressen",
        "tooltip-pt-login": "Du oppfordres til å logge inn, men det er ikke obligatorisk",
        "tooltip-pt-logout": "Logg ut",
        "tooltip-search-fulltext": "Søk etter sider som innholder denne teksten",
        "tooltip-p-logo": "Gå til hovedsiden",
        "tooltip-n-mainpage": "Gå til hovedsiden",
-       "tooltip-n-mainpage-description": "Gå til hovedsiden",
+       "tooltip-n-mainpage-description": "Besøk hovedsiden",
        "tooltip-n-portal": "Om prosjektet, hva du kan gjøre, hvor du kan finne ting",
        "tooltip-n-currentevents": "Finn bakgrunnsinformasjon om aktuelle hendelser",
        "tooltip-n-recentchanges": "Liste over siste endringer på wikien.",
        "tooltip-t-recentchangeslinked": "Siste endringer i sider som blir lenket fra denne siden",
        "tooltip-feed-rss": "RSS-mating for denne siden",
        "tooltip-feed-atom": "Atom-mating for denne siden",
-       "tooltip-t-contributions": "Vis liste over bidrag fra denne brukeren",
+       "tooltip-t-contributions": "En liste over bidrag fra {{GENDER:$1|denne brukeren}}",
        "tooltip-t-emailuser": "Send en e-post til denne brukeren",
        "tooltip-t-info": "Mer informasjon om denne siden",
        "tooltip-t-upload": "Last opp filer",
        "metadata-help": "Denne filen inneholder tilleggsinformasjon, antagligvis lagt til av digitalkameraet eller skanneren brukt til å lage eller digitalisere det.\nHvis filen har blitt forandret fra utgangspunktet, kan enkelte detaljer være unøyaktige.",
        "metadata-expand": "Vis utvidede detaljer",
        "metadata-collapse": "Skjul utvidede detaljer",
-       "metadata-fields": "Bildemetadatafelt listet i denne meldingen inkluderes på bildesiden når metadatatabellen er slått sammen.\nAndre vil skjules som standard.\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",
+       "metadata-fields": "Bildemetadatafelt listet i denne meldingen inkluderes på bildesiden når metadatatabellen har kollapset.\nAndre vil skjules som standard.\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": "Bredde",
        "exif-imagelength": "Høyde",
        "exif-bitspersample": "Bits per komponent",
        "mw-widgets-titleinput-description-new-page": "siden eksisterer ikke ennå",
        "mw-widgets-titleinput-description-redirect": "omdiriger til $1",
        "api-error-blacklisted": "Vennligst velg en annen beskrivende tittel.",
+       "sessionprovider-generic": "$1 sesjoner",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "informasjons&shy;kapsel-baserte sesjoner",
        "randomrootpage": "Tilfeldig rotside"
 }
index 3519bdb..e4f75f9 100644 (file)
        "apisandbox-intro": "Gebruik deze pagina om te experimenteren met de '''MediaWiki-API'''.\nZie de [//www.mediawiki.org/wiki/API:Main_page API-documentatie] voor verdere details over het gebruik van de API. Voorbeeld: [//www.mediawiki.org/wiki/API#A_simple_example hoe de inhoud van een Hoofdpagina ophalen]. Selecteer een handeling om meer voorbeelden te zien.\n\nHoewel dit een testfunctie is, kunnen sommige handelingen toch wijzigingen in de wiki maken.",
        "apisandbox-submit": "Verzoek uitvoeren",
        "apisandbox-reset": "Wissen",
-       "apisandbox-examples": "Voorbeeld",
-       "apisandbox-results": "Resultaat",
+       "apisandbox-retry": "Opnieuw proberen",
+       "apisandbox-examples": "Voorbeelden",
+       "apisandbox-results": "Resultaten",
        "apisandbox-request-url-label": "Verzoek-URL:",
        "apisandbox-request-time": "Doorlooptijd verzoek: $1",
        "booksources": "Boekinformatie",
index 303dbeb..dc2e686 100644 (file)
        "upload-too-many-redirects": "URL-en inneheldt for mange omdirigeringar",
        "upload-http-error": "Ein HTTP-feil oppstod: $1",
        "upload-copy-upload-invalid-domain": "Kopiopplastingar er ikkje tilgjengelege frå dette domenet.",
+       "upload-form-label-select-file": "Vel fil",
        "backend-fail-stream": "Kunne ikkje strøyma fila «$1».",
        "backend-fail-backup": "Kunne ikkje tryggingskopiera fila «$1».",
        "backend-fail-notexists": "Fila $1 finst ikkje.",
        "logempty": "Ingen element i loggen passar.",
        "log-title-wildcard": "Søk i titlar som byrjar med denne teksten",
        "showhideselectedlogentries": "Vis/gøym valde loggoppføringar",
+       "checkbox-all": "Alle",
+       "checkbox-none": "Ingen",
+       "checkbox-invert": "Vreng",
        "allpages": "Alle sider",
        "nextpage": "Neste side ($1)",
        "prevpage": "Førre sida ($1)",
        "wlshowhideanons": "anonyme brukarar",
        "wlshowhidepatr": "patruljerte endringar",
        "wlshowhidemine": "mine endringar",
+       "wlshowhidecategorization": "kategorisering av sider",
        "watchlist-options": "Alternativ for overvakingslista",
        "watching": "Overvakar...",
        "unwatching": "Fjernar frå overvakinglista...",
        "patrol-log-page": "Patruljeringslogg",
        "patrol-log-header": "Dette er ein logg over patruljerte sideversjonar.",
        "log-show-hide-patrol": "$1 patruljeringslogg",
+       "log-show-hide-tag": "$1 merkelogg",
        "deletedrevision": "Slett gammal versjon $1",
        "filedeleteerror-short": "Feil ved sletting av fila: $1",
        "filedeleteerror-long": "Det vart ein feil under filslettinga av:\n\n$1",
        "tags-create-reason": "Årsak:",
        "tags-create-submit": "Opprett",
        "tags-create-no-name": "Du må oppgje eit merkenamn.",
+       "tags-edit-existing-tags-none": "«Ingen»",
+       "tags-edit-chosen-placeholder": "Vel nokre merke",
        "comparepages": "Samanlikna sider",
        "compare-page1": "Side 1",
        "compare-page2": "Side 2",
index 1ba2a1f..fa6584b 100644 (file)
        "copyrightwarning2": "Wszelki wkład na {{SITENAME}} może być edytowany, zmieniany lub usunięty przez innych użytkowników.\nJeśli nie chcesz, żeby Twój tekst był dowolnie zmieniany przez każdego i rozpowszechniany bez ograniczeń, nie umieszczaj go tutaj.<br />\nZapisując swoją edycję, oświadczasz, że ten tekst jest Twoim dziełem lub pochodzi z materiałów dostępnych na warunkach ''domeny publicznej'' lub kompatybilnych (zobacz także $1).\n'''PROSZĘ NIE WPROWADZAĆ MATERIAŁÓW CHRONIONYCH PRAWEM AUTORSKIM BEZ POZWOLENIA WŁAŚCICIELA!'''",
        "editpage-cannot-use-custom-model": "Model zawartości tej strony nie może być zmieniony.",
        "longpageerror": "'''Błąd! Wprowadzony przez Ciebie tekst ma {{PLURAL:$1|1 kilobajt|$1 kilobajty|$1 kilobajtów}}. Długość tekstu nie może przekraczać {{PLURAL:$2|1 kilobajt|$2 kilobajty|$2 kilobajtów}}. Tekst nie może być zapisany.'''",
-       "readonlywarning": "<strong>Uwaga! Baza danych została zablokowana do celów administracyjnych. W tej chwili nie można zapisać nowej wersji strony. Jeśli chcesz, może skopiować ją do pliku, aby móc zapisać ją później.<strong>\n\nAdministrator systemu, który zablokował bazę, podał następujący powód: $1",
+       "readonlywarning": "<strong>Uwaga! Baza danych została zablokowana do celów administracyjnych. W tej chwili nie można zapisać nowej wersji strony. Jeśli chcesz, może skopiować ją do pliku, aby móc zapisać ją później.</strong>\n\nAdministrator systemu, który zablokował bazę, podał następujący powód: $1",
        "protectedpagewarning": "'''Uwaga! Możliwość modyfikacji tej strony została zabezpieczona. Mogą ją edytować jedynie użytkownicy z uprawnieniami administratora.'''\nOstatni wpis z rejestru jest pokazany poniżej.",
        "semiprotectedpagewarning": "'''Uwaga!''' Ta strona została zabezpieczona i tylko zarejestrowani użytkownicy mogą ją edytować.\nOstatni wpis z rejestru jest pokazany poniżej.",
        "cascadeprotectedwarning": "<strong>Uwaga:</strong> Ta strona została zabezpieczona i tylko użytkownicy z uprawnieniami administratora mogą ją edytować. Została ona osadzona w {{PLURAL:$1|następującej stronie, która została zabezpieczona|następujących stronach, które zostały zabezpieczone}} z włączoną opcją dziedziczenia:",
        "mergehistory-empty": "Brak historii zmian do scalenia.",
        "mergehistory-done": "$3 {{PLURAL:$3|zmiana|zmiany|zmian}} w $1 {{PLURAL:$3|została scalona|zostały scalone|zostało scalonych}} z [[:$2]].",
        "mergehistory-fail": "Scalenie historii zmian jest niewykonalne. Zmień ustawienia parametrów.",
+       "mergehistory-fail-bad-timestamp": "Znacznik czasu jest nieprawidłowy.",
+       "mergehistory-fail-invalid-source": "Strona źródłowa jest nieprawidłowa.",
+       "mergehistory-fail-invalid-dest": "Strona docelowa jest nieprawidłowa.",
+       "mergehistory-fail-self-merge": "Strona źródłowa i docelowa są takie same.",
        "mergehistory-fail-toobig": "Nie można połączyć historii, gdyż wymagałoby to przeniesienia więcej niż maksymalnej dopuszczalnej liczby $1 {{PLURAL:$1|wersji}}.",
        "mergehistory-no-source": "Strona źródłowa $1 nie istnieje.",
        "mergehistory-no-destination": "Strona docelowa $1 nie istnieje.",
        "apisandbox-dynamic-parameters": "Parametry dodatkowe",
        "apisandbox-dynamic-parameters-add-label": "Dodaj parametr:",
        "apisandbox-dynamic-parameters-add-placeholder": "Nazwa parametru",
+       "apisandbox-dynamic-error-exists": "Parametr o nazwie „$1” już istnieje.",
        "apisandbox-submit-invalid-fields-title": "Niektóre pola są nieprawidłowe",
        "apisandbox-submit-invalid-fields-message": "Popraw zaznaczone pola i spróbuj ponownie.",
        "apisandbox-results": "Wyniki",
        "apisandbox-loading-results": "Pobieranie wyników API...",
        "apisandbox-request-url-label": "URL zapytania:",
-       "apisandbox-request-time": "Czas przetwarzania zapytania: $1",
+       "apisandbox-request-time": "Czas przetwarzania zapytania: {{PLURAL:$1|$1 ms}}",
        "apisandbox-alert-page": "Pola na tej stronie są nieprawidłowe.",
        "apisandbox-alert-field": "Wartość tego pola jest nieprawidłowa.",
        "booksources": "Książki",
        "expand_templates_generate_rawhtml": "Pokaż surowy HTML",
        "expand_templates_preview": "Podgląd",
        "expand_templates_preview_fail_html": "<em>Ponieważ {{SITENAME}} ma włączony surowy kod HTML i zaistniała strata danych z sesji, podgląd jest ukryty jako zabezpieczenie przed atakiem JavaScript.</em>\n\n<strong>Jeśli to jest próba słusznego podglądu, proszę spróbować ponownie.</strong>\nJeśli to nadal nie działa, spróbuj [[Special:UserLogout|wylogować się]] i zalogować się z powrotem.",
-       "pagelanguage": "Wybór języka strony",
+       "pagelanguage": "Zmiana języka strony",
        "pagelang-name": "Strona",
        "pagelang-language": "Język",
        "pagelang-use-default": "Użyj domyślnego języka",
index 212f335..bb460fd 100644 (file)
        "mergehistory-go": "اخږلو وړ سمونونه ښکاره کول",
        "mergehistory-submit": "بڼې سره يوځای کول",
        "mergehistory-done": "د $1 $3 {{PLURAL:$3|بڼه|بڼې}} په برياليتوب سره و [[:$2]] کې {{PLURAL:$3|واخږل شو|واخږل شول}}.",
+       "mergehistory-fail-bad-timestamp": "وخت ټاپه ناسمه ده.",
        "mergehistory-no-source": "د سرچينې مخ $1 نشته.",
        "mergehistory-no-destination": "د $1 موخنيز مخ نشته.",
        "mergehistory-invalid-source": "د سرچينې مخ بايد يو سم سرليک وي.",
        "apisandbox-submit": "غوښته کول",
        "apisandbox-reset": "سپينول",
        "apisandbox-retry": "بيا هڅه کول",
+       "apisandbox-helpurls": "لارښود تړنې",
        "apisandbox-examples": "بېلگې",
        "apisandbox-dynamic-parameters-add-label": "پاراميټرونه ورگډول",
        "apisandbox-results": "پايلې",
index 3230f75..8c22fae 100644 (file)
@@ -88,7 +88,8 @@
                        "Claudio Emanuel Weiler",
                        "Almondega",
                        "Eduardo Addad de Oliveira",
-                       "Raphaelras"
+                       "Raphaelras",
+                       "Arthurteb303"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "previewnote": "'''Lembre-se de que isto é apenas uma previsão.'''\nSuas alterações ainda não foram salvas!",
        "continue-editing": "Ir para a área de edição",
        "previewconflict": "Esta previsão reflete o texto que está na área de edição acima e como ele aparecerá se você escolher salvar.",
-       "session_fail_preview": "'''Pedimos desculpas, mas não foi possível processar a sua edição devido à perda de dados da sua sessão.\nPor favor tente novamente.\nCaso continue não funcionando, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta.'''",
+       "session_fail_preview": "Pedimos desculpas, mas não foi possível processar a sua edição devido à perda de dados da sua sessão.\n'''Por favor, verifique se você ainda está autenticado e tente novamente.'''\nCaso continue não funcionando, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta, e cheque se seu navegador permite cookies desse site.",
        "session_fail_preview_html": "'''Desculpe-nos! Não foi possível processar a sua edição devido a uma perda de dados de sessão.'''\n\n''Como o projeto {{SITENAME}} possui HTML bruto ativo, a previsão não será exibida, como uma precaução contra ataques por JavaScript.''\n\n'''Se esta é uma tentativa de edição legítima, por favor tente novamente.\nCaso continue não funcionando, tente [[Special:UserLogout|desautenticar-se]] e voltar a entrar na sua conta.'''",
        "token_suffix_mismatch": "'''A sua edição foi rejeitada uma vez que seu software de navegação mutilou os sinais de pontuação do sinal de edição. A edição foi rejeitada para evitar perdas no texto da página.\nIsso acontece ocasionalmente quando se usa um serviço de proxy anonimizador mal configurado.'''",
        "edit_form_incomplete": "'''Algumas partes do formulário de edição não chegaram ao servidor; verifique que a sua edição continua intacta e tente novamente, por favor.'''",
        "querypage-disabled": "Esta página especial está desativada para não prejudicar o desempenho.",
        "apihelp": "Ajuda de API",
        "apihelp-no-such-module": "Modulo \"$1\" não foram achados.",
+       "apisandbox": "Caixa de areia da API",
+       "apisandbox-api-disabled": "A API está desabilitada neste site.",
+       "apisandbox-intro": "Use esta página para realizar testes com o '''serviço web de API do MediaWiki'''.\nConsulte a [//www.mediawiki.org/wiki/API:Main_page a documentação API] para obter mais detalhes de uso da API.  Exemplo: [//www.mediawiki.org/wiki/API#A_simple_example obter o conteúdo de uma Página principal].  Selecione uma ação para mais exemplos.\n\nNote que, embora esta seja uma área de testes, as operações que executar nesta página podem modificar a wiki.",
+       "apisandbox-submit": "Fazer requisição",
+       "apisandbox-reset": "Limpar",
+       "apisandbox-examples": "Exemplo",
+       "apisandbox-results": "Resultado",
+       "apisandbox-request-url-label": "URL solicitante:",
+       "apisandbox-request-time": "Tempo do pedido: $1",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Pesquisar referências bibliográficas",
        "booksources-search": "Pesquisar",
index 74b16e5..caa6b58 100644 (file)
        "previewnote": "'''Lembre-se que esta é apenas uma antevisão do resultado.'''\nAs modificações ainda não foram gravadas!",
        "continue-editing": "Ir para a área de edição",
        "previewconflict": "Esta antevisão do resultado apresenta o texto da caixa de edição acima tal como este aparecerá se escolher gravá-lo.",
-       "session_fail_preview": "'''Não foi possível processar a edição devido à perda dos dados da sua sessão.\nTente novamente, por favor.\nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta.'''",
-       "session_fail_preview_html": "'''Não foi possível processar a edição devido à perda dos dados da sua sessão.'''\n\n''Como a wiki {{SITENAME}} possibilita o uso de HTML bruto, a antevisão está oculta por precaução contra ataques com JavaScript.''\n\n'''Se esta é uma tentativa legítima de edição tente novamente, por favor.'''\nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta.",
+       "session_fail_preview": "Desculpe! Não foi possível processar a edição devido à perda dos dados da sua sessão.\n\nA sua sessão poderá ter sido encerrada. <strong>Por favor, verifique se ainda está autenticado e tente novamente</strong>. \nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta, e verifique se o seu navegador permite a utilização de ''cookies'' deste sítio.",
+       "session_fail_preview_html": "Desculpe! Não foi possível processar a edição devido à perda de dados da sua sessão.\n\n<em>Como a wiki {{SITENAME}} possibilita o uso de HTML puro, a antevisão está oculta por precaução contra ataques com JavaScript.</em>\n\n<strong>Se esta é uma tentativa legítima de edição tente novamente, por favor</strong>. \nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta, e verifique se o seu navegador permite a utilização de ''cookies'' deste sítio.",
        "token_suffix_mismatch": "'''A edição foi rejeitada porque o seu navegador alterou os sinais de pontuação no editor.'''\nA edição foi rejeitada para evitar perdas no texto da página.\nIsso acontece ocasionalmente quando se usa um serviço de proxy anonimizador mal configurado.'''",
        "edit_form_incomplete": "'''Algumas partes do formulário de edição não chegaram ao servidor; verifique que a sua edição continua intacta e tente novamente, por favor.'''",
        "editing": "A editar $1",
        "mergehistory-empty": "Não existem revisões fundíveis.",
        "mergehistory-done": "Foram fundidas $3 {{PLURAL:$3|edição|edições}} de $1 {{PLURAL:$3|em}} [[:$2]].",
        "mergehistory-fail": "Não foi possível fundir os históricos; verifique a página e os parâmetros de tempo, por favor.",
+       "mergehistory-fail-invalid-source": "Página de origem inválida.",
+       "mergehistory-fail-invalid-dest": "Página de destino inválida.",
+       "mergehistory-fail-self-merge": "As páginas de origem e de destino não podem ser a mesma.",
        "mergehistory-fail-toobig": "Não é possível fundir o histórico, já que um número de revisão(ões) acima do limite ($1 {{PLURAL:$1|revisão|revisões}}) seriam movidos.",
        "mergehistory-no-source": "A página de origem $1 não existe.",
        "mergehistory-no-destination": "A página de destino $1 não existe.",
        "apisandbox-submit": "Fazer o pedido",
        "apisandbox-reset": "Limpar",
        "apisandbox-examples": "Exemplos",
-       "apisandbox-results": "Resultado",
+       "apisandbox-results": "Resultados",
        "apisandbox-request-url-label": "URL do pedido:",
        "apisandbox-request-time": "Tempo de processamento: $1",
        "booksources": "Fontes bibliográficas",
        "import-nonewrevisions": "Nenhuma revisão foi importada (já estavam todas presentes ou foram ignoradas devido a erros).",
        "xml-error-string": "$1 na linha $2, coluna $3 (byte $4): $5",
        "import-upload": "Enviar dados em XML",
-       "import-token-mismatch": "Perda dos dados da sessão. Tente novamente, por favor.",
+       "import-token-mismatch": "Perda de dados da sessão.\n\nA sua sessão poderá ter sido encerrada. <strong>Por favor, verifique se ainda está autenticado e tente novamente</strong>. \nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta, e verifique se o seu navegador permite a utilização de ''cookies'' deste sítio.",
        "import-invalid-interwiki": "Não é possível importar da wiki especificada.",
        "import-error-edit": "A página \"$1\" não foi importada porque não tem permissão para editá-la.",
        "import-error-create": "A página \"$1\" não foi importada porque não tem permissão para criá-la.",
        "expand_templates_generate_xml": "Mostrar a árvore de análise sintáctica do XML",
        "expand_templates_generate_rawhtml": "Mostrar o HTML puro",
        "expand_templates_preview": "Antevisão do resultado",
-       "expand_templates_preview_fail_html": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de ter havido perda de dados da sessão, a pré-visualização ficará oculta como precaução contra ataques por JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor tente novamente.</strong> Se ainda não funcionar, experimente [[Special:UserLogout|sair]] e iniciar sessão de novo.",
+       "expand_templates_preview_fail_html": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de ter havido perda de dados da sessão, a pré-visualização ficará oculta como precaução contra ataques por JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor tente novamente.</strong>\nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta, e verifique se o seu navegador permite a utilização de ''cookies'' deste sítio.",
        "expand_templates_preview_fail_html_anon": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de não ter sessão iniciada, a pré-visualização ficará oculta como precaução contra ataques do JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor [[Especial:UserLogin|inicie sessão]] e tente novamente.</strong>",
        "pagelanguage": "Alterar idioma da página",
        "pagelang-name": "Página",
index fec3079..7cd96cc 100644 (file)
        "previewnote": "Note displayed when clicking on Show preview",
        "continue-editing": "{{doc-actionlink}}\nA link to the beginning of the editing textarea on the same page.\n\nDisplayed after {{msg-mw|previewnote}}.",
        "previewconflict": "Used in Preview page.",
-       "session_fail_preview": "Error message in Preview page.\n\nSee also:\n* {{msg-mw|Token suffix mismatch}}\n* {{msg-mw|Session fail preview}}\n* {{msg-mw|Edit form incomplete}}",
-       "session_fail_preview_html": "Used as error message in Preview page.",
+       "session_fail_preview": "Error message in Preview page.\n\nSee also:\n* {{msg-mw|Token suffix mismatch}}\n* {{msg-mw|Session fail preview}}\n* {{msg-mw|Edit form incomplete}}\n\n{{Identical|Loss of session data}}",
+       "session_fail_preview_html": "Used as error message in Preview page.\n\n{{Identical|Loss of session data}}",
        "token_suffix_mismatch": "Error message in Preview page.\n\nSee also:\n* {{msg-mw|Token suffix mismatch}}\n* {{msg-mw|Session fail preview}}\n* {{msg-mw|Edit form incomplete}}",
        "edit_form_incomplete": "Error message in Preview page.\n\nSee also:\n* {{msg-mw|Token suffix mismatch}}\n* {{msg-mw|Session fail preview}}\n* {{msg-mw|Edit form incomplete}}",
        "editing": "Shown as page title when editing a page. Parameters:\n* $1 - the name of the page that is being edited. e.g. \"Editing Main Page\"\n{{Related|Editing}}\n{{Identical|Editing}}",
        "mergehistory-empty": "Used in [[Special:MergeHistory]].",
        "mergehistory-done": "Success message shown on [[Special:MergeHistory]].\n* $1 - link to target page\n* $2 - destination page title\n* $3 - number of revisions which succeeded to merge",
        "mergehistory-fail": "Used as error message in [[Special:MergeHistory]].",
-       "mergehistory-fail-toobig": "Used as error message in [[Special:MergeHistory]].\n* $1 - maximum allowed number of revisions that can be moved",
+       "mergehistory-fail-bad-timestamp": "Used as error message in [[Special:MergeHistory]] API.",
+       "mergehistory-fail-invalid-source": "Used as error message in [[Special:MergeHistory]] API.",
+       "mergehistory-fail-invalid-dest": "Used as error message in [[Special:MergeHistory]] API.",
+       "mergehistory-fail-no-change": "Used as error message in [[Special:MergeHistory]] API.",
+       "mergehistory-fail-permission": "Used as error message in [[Special:MergeHistory]] API.",
+       "mergehistory-fail-self-merge": "Used as error message in [[Special:MergeHistory]] API.",
+       "mergehistory-fail-timestamps-overlap": "Used as error message in [[Special:MergeHistory]] API.",
+       "mergehistory-fail-toobig": "Used as error message in [[Special:MergeHistory]] and API.\n* $1 - maximum allowed number of revisions that can be moved",
+       "mergehistory-warning-redirect-not-created": "Used as warning message in [[Special:MergeHistory]] API.",
        "mergehistory-no-source": "Used as error message in [[Special:MergeHistory]].\n* $1 - source page title\nSee also:\n* {{msg-mw|mergehistory-invalid-source}}\n* {{msg-mw|mergehistory-invalid-destination}}\n* {{msg-mw|mergehistory-no-destination}}\n* {{msg-mw|mergehistory-same-destination}}",
        "mergehistory-no-destination": "Used as error message in [[Special:MergeHistory]].\n* $1 - destination page title\nSee also:\n* {{msg-mw|mergehistory-invalid-source}}\n* {{msg-mw|mergehistory-no-source}}\n* {{msg-mw|mergehistory-invalid-destination}}\n* {{msg-mw|mergehistory-same-destination}}",
        "mergehistory-invalid-source": "Used as error message in [[Special:MergeHistory]].\n\nSee also:\n* {{msg-mw|mergehistory-no-source}}\n* {{msg-mw|mergehistory-invalid-destination}}\n* {{msg-mw|mergehistory-no-destination}}\n* {{msg-mw|mergehistory-same-destination}}",
        "mergehistory-same-destination": "Error message shown on [[Special:MergeHistory]] when the user entered the same page title to both source and destination\n\nSee also:\n* {{msg-mw|mergehistory-invalid-source}}\n* {{msg-mw|mergehistory-no-source}}\n* {{msg-mw|mergehistory-invalid-destination}}\n* {{msg-mw|mergehistory-no-destination}}",
        "mergehistory-reason": "{{Identical|Reason}}",
        "mergehistory-revisionrow": "{{Optional}}\nA revision row in the merge history page. Parameters:\n* $1 - a radio button to indicate a merge point\n* $2 - a link to the last revision of a page ({{msg-mw|Last}})\n* $3 - a page link\n* $4 - a user link\n* $5 - a revision size\n* $6 - a revision comment",
+       "mergehistory-redirect-text": "{{ignored}}The text that's added to a redirected page when that redirect is created as part of a history merge.",
        "mergelog": "{{doc-logpage}}\n\nThis is the name of a log of merge actions done on [[Special:MergeHistory]]. This special page and this log is not enabled by default.",
        "pagemerge-logentry": "{{ignored}}This is a ''logentry'' message only used on IRC.\n\nParameters:\n* $1 - the page name of the source of the content to be merged\n* $2 - the page into which the content is merged\n* $3 - a timestamp of limit\n\nThe log and its associated special page 'MergeHistory' is not enabled by default.\n\nPlease note that the parameters in a log entry will appear in the log only in the default language of the wiki. View [[Special:Log]] for examples on translatewiki.net with English default language.",
        "revertmerge": "Used as link text",
        "undelete-error-long": "Used as error message. Parameters:\n* $1 - ...\nSee also:\n* {{msg-mw|Undelete-error-short}}",
        "undelete-show-file-confirm": "A confirmation message shown on [[Special:Undelete]] when the request does not contain a valid token (e.g. when a user clicks a link received in mail).\n\nParameters:\n* $1 - the name of the file being undeleted\n* $2 - the date of the displayed revision\n* $3 - the time of the displayed revision\n{{Identical|Are you sure you want to view the deleted revision of the file...}}",
        "undelete-show-file-submit": "{{Identical|Yes}}",
-       "undelete-revision-row": "{{Optional}}\nA revision row in the undelete page. Parameters:\n* $1 is a checkBox to indicate whether to restore this specific revision\n* $2 is a link to the revision\n* $3 is a link to the last revision of a page ({{msg-mw|last}})\n* $4 is a link to the page\n* $5 is a link to the revision's user\n* $6 is the revision's minor edit identifier\n* $7 is the revision size\n* $8 is the revision comment\n* $9 is the revision's tags",
+       "undelete-revision-row2": "{{Optional}}\nA revision row in the undelete page. Parameters:\n* $1 is a checkBox to indicate whether to restore this specific revision\n* $2 is a link to the last revision of a page ({{msg-mw|last}})\n* $3 is a link to the page\n* $4 is a link to the revision's user\n* $5 is the revision's minor edit identifier\n* $6 is the revision size\n* $7 is the revision comment\n* $8 is the revision's tags",
        "namespace": "This message is located at [[Special:Contributions]].\n{{Identical|Namespace}}",
        "invert": "Displayed in [[Special:RecentChanges|RecentChanges]], [[Special:RecentChangesLinked|RecentChangesLinked]] and [[Special:Watchlist|Watchlist]].\n\nThis message means \"Invert selection of namespace\".\n\nThis message has a tooltip {{msg-mw|tooltip-invert}}\n{{Identical|Invert selection}}",
        "tooltip-invert": "Used in [[Special:Recentchanges]] as a tooltip for the invert checkbox. See also the message {{msg-mw|invert}}",
        "import-nonewrevisions": "Used in [[Special:Import]].",
        "xml-error-string": "Parameters:\n* $1 - Some kind of message, perhaps name of the error?\n* $2 - line number\n* $3 - column number\n* $4 - ?? $this->mByte . $this->mContext\n* $5 - error description\nExample:\n* Import failed: XML import parse failure at line 1, col 1 (byte 3; \"- <mediawiki xml\"): Empty document",
        "import-upload": "Used on [[Special:Import]].\n\nRelated messages:\n* {{msg-mw|right-importupload}} (the user right for this)",
-       "import-token-mismatch": "Used as error message in [[Special:Import]].\n\nSee also:\n* {{msg-mw|import-token-mismatch}}\n* {{msg-mw|import-invalid-interwiki}}\n* {{msg-mw|Importunknownsource}}",
+       "import-token-mismatch": "Used as error message in [[Special:Import]].\n\nSee also:\n* {{msg-mw|import-token-mismatch}}\n* {{msg-mw|import-invalid-interwiki}}\n* {{msg-mw|Importunknownsource}}\n\n{{Identical|Loss of session data}}",
        "import-invalid-interwiki": "Used as error message in [[Special:Import]].\n\nSee also:\n* {{msg-mw|import-token-mismatch}}\n* {{msg-mw|import-invalid-interwiki}}\n* {{msg-mw|Importunknownsource}}",
        "import-error-edit": "Import error message displayed when importing user has no edit rights for a page.\n\nParameters:\n* $1 - a page name\n{{Related|Import-error}}",
        "import-error-create": "Import error message displayed when importing user has no create rights for a page.\n\nParameters:\n* $1 - a page name\n{{Related|Import-error}}",
        "expand_templates_generate_xml": "Used as checkbox label.",
        "expand_templates_generate_rawhtml": "Used as checkbox label.",
        "expand_templates_preview": "{{Identical|Preview}}",
-       "expand_templates_preview_fail_html": "Used as error message in Preview section of [[Special:ExpandTemplates]] page.",
+       "expand_templates_preview_fail_html": "Used as error message in Preview section of [[Special:ExpandTemplates]] page.\n\n{{Identical|Loss of session data}}",
        "expand_templates_preview_fail_html_anon": "Used as error message in Preview section of [[Special:ExpandTemplates]] page.",
        "expand_templates_input_missing": "Used on [[Special:ExpandTemplates]] as an error message, if no input text was provided.",
        "pagelanguage": "Title for page Special:PageLanguage",
index 1a8753d..45d2d2d 100644 (file)
@@ -99,7 +99,7 @@
        "tog-extendwatchlist": "Расширенный список наблюдения, включающий все изменения, а не только последние",
        "tog-usenewrc": "Группировать изменения в свежих правках и списке наблюдения",
        "tog-numberheadings": "Автоматически нумеровать заголовки",
-       "tog-showtoolbar": "Ð\9fоказÑ\8bваÑ\82Ñ\8c Ð²ÐµÑ\80Ñ\85нÑ\8eÑ\8e Ð¿Ð°Ð½ÐµÐ»Ñ\8c Ð¸Ð½Ñ\81Ñ\82Ñ\80Ñ\83менÑ\82ов Ð¿Ñ\80и Ñ\80едакÑ\82иÑ\80овании",
+       "tog-showtoolbar": "Показывать панель инструментов при редактировании",
        "tog-editondblclick": "Править страницы по двойному щелчку",
        "tog-editsectiononrightclick": "Править секции при правом щелчке мышью на заголовке",
        "tog-watchcreations": "Добавлять в список наблюдения созданные мной страницы и загруженные мной файлы",
        "mergehistory-empty": "Не найдены правки для объединения.",
        "mergehistory-done": "$3 {{PLURAL:$3|правка|правки|правок}} из $1 {{PLURAL:$3|была перенесена|были перенесены}} в [[:$2]].",
        "mergehistory-fail": "Не удалось произвести объединение историй страниц, пожалуйста, проверьте параметры страницы и времени.",
+       "mergehistory-fail-bad-timestamp": "Метка времени неверна.",
+       "mergehistory-fail-invalid-source": "Страница-источник неверна.",
+       "mergehistory-fail-invalid-dest": "Целевая страница неверна.",
        "mergehistory-fail-toobig": "Не удаётся выполнить слияние истории, так как необходимо перенести больше допустимого лимита в $1 {{PLURAL:$1|версию|версии|версий}}.",
        "mergehistory-no-source": "Исходная страница «$1» не существует.",
        "mergehistory-no-destination": "Целевая страница «$1» не существует.",
        "apihelp": "Справка по API",
        "apihelp-no-such-module": "Модуль «$1» не найден.",
        "apisandbox": "Песочница API",
+       "apisandbox-jsonly": "Для использования API-песочницы требуется JavaScript.",
        "apisandbox-api-disabled": "API отключен на этом сайте.",
        "apisandbox-intro": "Используйте эту страницу для экспериментов с <strong>MediaWiki API</strong>.\nОбратитесь к [[mw:API:Main page|документации API]] для получения дополнительной информации об использовании API. Например, о том, [//www.mediawiki.org/wiki/API#A_simple_example как получить содержание Заглавной страницы]. Выберите действие, чтобы увидеть другие примеры.\nОбратите внимание, что, хотя это и песочница, действия, выполненные на этой странице, могут внести изменения в вики.",
+       "apisandbox-fullscreen": "Развернуть панель",
+       "apisandbox-fullscreen-tooltip": "Развернуть панель песочницы, чтобы заполнить окно браузера.",
        "apisandbox-unfullscreen": "Показать страницу",
+       "apisandbox-unfullscreen-tooltip": "Уменьшить панель песочницы, чтоб стали доступны навигационные ссылки MediaWiki.",
        "apisandbox-submit": "Сделать запрос",
        "apisandbox-reset": "Очистить",
        "apisandbox-retry": "Повторить",
+       "apisandbox-loading": "Загрузка информации для API-модуля «$1»…",
+       "apisandbox-load-error": "Произошла ошибка при загрузке информации для API-модуля «$1»: $2",
+       "apisandbox-no-parameters": "У этого API-модуля нет параметров.",
+       "apisandbox-helpurls": "Ссылки на справочные материалы",
        "apisandbox-examples": "Примеры",
        "apisandbox-dynamic-parameters": "Дополнительные параметры",
        "apisandbox-dynamic-parameters-add-label": "Добавить параметр:",
        "apisandbox-dynamic-parameters-add-placeholder": "Имя параметра",
        "apisandbox-dynamic-error-exists": "Параметр с именем «$1» уже существует.",
        "apisandbox-deprecated-parameters": "Устаревшие параметры",
+       "apisandbox-fetch-token": "Автозаполнение токена",
+       "apisandbox-submit-invalid-fields-title": "Некоторые поля некорректны",
+       "apisandbox-submit-invalid-fields-message": "Пожалуйста, исправьте отмеченные поля и попробуйте снова.",
        "apisandbox-results": "Результаты",
+       "apisandbox-sending-request": "Отправка API-запроса…",
+       "apisandbox-loading-results": "Получение API-результатов…",
+       "apisandbox-results-error": "Произошла ошибка при загрузке API-ответа на запрос: $1.",
        "apisandbox-request-url-label": "URL-адрес запроса:",
        "apisandbox-request-time": "Время запроса: {{PLURAL:$1|$1 мс}}",
+       "apisandbox-results-fixtoken": "Исправьте токен и повторите отправку",
+       "apisandbox-results-fixtoken-fail": "Не удалось вызвать токен «$1».",
+       "apisandbox-alert-page": "Поля на этой странице некорректны.",
+       "apisandbox-alert-field": "Значение этого поля является недопустимым.",
        "booksources": "Источники книг",
        "booksources-search-legend": "Поиск информации о книге",
        "booksources-isbn": "ISBN:",
index 4d790fe..8a20bc4 100644 (file)
        "botpasswords-label-grants-column": "Көҥүллэннэ",
        "botpasswords-bad-appid": "Маннык аат «$1» сатаммат.",
        "botpasswords-insert-failed": "«$1» диэн ааттаах оруобаты эбэр табыллыбата. Баҕар хайыы-үйэ эбиллибитэ буолаарай?",
+       "botpasswords-created-title": "Оруобат аһарыга оҥоһулунна",
+       "botpasswords-created-body": "«$1» оруобат аһарыга бигэргэтилиннэ.",
+       "botpasswords-updated-title": "Оруобат аһарыга саҥардылынна",
+       "botpasswords-updated-body": "«$1» оруобат аһарыга уларытылынна.",
+       "botpasswords-deleted-title": "Оруобат аһарыга сотулунна",
+       "botpasswords-deleted-body": "«$1» оруобат аһарыга сотулунна.",
        "resetpass_forbidden": "Киирии тылы уларытар сатаммат",
        "resetpass-no-info": "Ааккын билиһиннэрдэххинэ эрэ бу сирэйгэ быһа тиийиэххин сөп.",
        "resetpass-submit-loggedin": "Киирии тылы уларытыы",
        "passwordreset-emailtext-ip": "Ким эрэ (баҕар эн буолуо, бу IP-ттан $1)  {{SITENAME}} ($4) бырайыакка киирии тылы уларытар туһунан ыйытык биэрбит.\nБу электрон аадырыһы кытта бу {{PLURAL:$3|аат ситимнээх|ааттар ситимнээхтэр}}:\n\n$2\n\nБу быстах кэмҥэ аналлаах {{PLURAL:$3|киирии тыл|кирии тыллар}} {{PLURAL:$5|биир күн үлэлиэҕэ|$5 күн үлэлиэхтэрэ}}.\nЭн тиһиликкэ ааккын этэн саҥа киирии тылы киллэриэхтээххин.\nӨскө бу ыйытыгы ыыппатах буоллаххына, эбэтэр урукку киирии тылгын өйдөөн кэлбит буоллаххына \nбу биллэриини ааххайыа суоххун сөп.\nОччоҕо урукку киирии тылыҥ оннунан хаалыа.",
        "passwordreset-emailtext-user": "$1 диэн кыттааччы  {{SITENAME}} ($4) бырайыакка киирии тылгын уларытар туһунан ыйытык ыыппыт.\nБу электрон аадырыһы кытта бу {{PLURAL:$3|аат ситимнээх|ааттар ситимнээхтэр}}\n\n$2\n\nБу быстах кэмҥэ аналлаах {{PLURAL:$3|киирии тыл|кирии тыллар}} {{PLURAL:$5|биир күн үлэлиэҕэ|$5 күн үлэлиэхтэрэ}}.\nЭн тиһиликкэ ааккын этэн саҥа киирии тылы киллэриэхтээххин.\nӨскө бу ыйытыгы ыыппатах буоллаххына, эбэтэр урукку киирии тылгын өйдөөн кэлбит буоллаххына \nбу биллэриини ааххайыа суоххун сөп.\nОччоҕо урукку киирии тылыҥ оннунан хаалыа.",
        "passwordreset-emailelement": "Кыттааччы: \n$1\n\nБыстах киирии тыл: \n$2",
-       "passwordreset-emailsentemail": "Өскө ааккар баайыллыбыт аадырыһы суруйбут буоллаххына, аһарык тылы уларытар туһунан сурук онно барыа.",
+       "passwordreset-emailsentemail": "Өскө бу Эн ааккар баайыллыбыт аадырыс буоллаҕына, аһарык тылы уларытар туһунан сурук барыа.",
+       "passwordreset-emailsentusername": "Өскө бу аакка баайыллыбыт аадырыс баар буоллаҕына, аһарык тылы уларытар туһунан сурук онно барыа.",
        "passwordreset-emailsent-capture": "Киирии тылы уларытар туһунан сурук аллара эмиэ көрдөрүлүннэ.",
        "passwordreset-emailerror-capture": "Манна киирии тылы уларытар туһунан сурук көрдөрүлүннэ. Ол эрэн сурук бу төрүөттэн $2 кыттааччыга сатаан барбата: $1",
        "changeemail": "Аадырыһы уларытыы уонна сотуу",
        "copyrightwarning2": "Болҕой, эн суруйбут матырыйаалгын ким баҕарар уларытар уонна суох гынар бырааптаах. Суруйбуккун уларыталларын сөбүлээбэт буоллаххына манна суруйума.<br />\nЭбиитин манна суруйдаххына, уларытыы ааптара мин буолабын, эбэтэр көҥүл туһанары уонна уларытары көҥүллүүр сиртэн ыллым диэн бигэргэтэҕин (маны көр $1).<br /> '''КИМ ЭРЭ БАС БИЛИИТИН МАННА КИНИТТЭН КӨҤҮЛЭ СУОХ УГУМА!'''",
        "editpage-cannot-use-custom-model": "Бу сирэй иһинээҕитин тутула уларыйар кыаҕа суох.",
        "longpageerror": "'''Алҕас: Суруйар кэрчиккит {{PLURAL:$1|биир килобаайт|$1 килобаайт}} ыйааһыннаах, онтуккут көҥүллэммит {{PLURAL:$2|биир килобаайты|$2 килобайты}} килобаайты куоһарар. Онон сирэй бигэргэтиллэр кыаҕа суох.'''",
-       "readonlywarning": "'''Сэрэтии: Сиэрбэргэ техническай үлэ бара турар, онон киллэрбит уларытыыларыҥ тута бигэргэнэр кыахтара суох.'''\nОнон уларытыыгын тиэкистээх билэҕэ уган баран, кэлин манна киллэриэххин сөп.\n\nХааччаҕы туруорбут дьаһабыл маннык быһаарыыны хаалларбыт: $1",
+       "readonlywarning": "<strong>Сэрэтии: Сиэрбэргэ техническай үлэ бара турар, онон киллэрбит уларытыыларыҥ тута бигэргэнэр кыахтара суох.</strong>\nОнон уларытыыгын тиэкистээх билэҕэ уган хаалларан баран, манна кэлин угуоххун сөп.\n\nХааччаҕы туруорбут дьаһабыл маннык быһаарыыны хаалларбыт: $1",
        "protectedpagewarning": "'''Сэрэтии:  Бу сирэй хатанан турар, администратор бырааптаах эрэ кыттааччылар уларытар кыахтаахтар.'''\nАллара сурунаал бүтэһик суруга көрдөрүлүннэ:",
        "semiprotectedpagewarning": "'''Биллэрии:''' Бу сирэй хатанан турар; ааттарын билиһиннэрбит эрэ кыттааччылар уларытар кыахтаахтар.\nАллара сурунаал бүтэһик суруга көрдөрүлүннэ:",
        "cascadeprotectedwarning": "<strong>Сэрэтии:</strong> Бу сирэйи дьаһабыллар эрэ уларытар кыахтаахтар, тоҕо диэтэххэ сирэй каскаднай көмүскэллээх {{PLURAL:$1|сирэй бөлөҕөр|сирэйдэр бөлөхтөрүгэр}} киирэр:",
        "permissionserrors": "Киирии алҕаһа",
        "permissionserrorstext": "Маны оҥорор кыаҕыҥ суох, {{PLURAL:$1|төрүтэ|төрүттэрэ}}:",
        "permissionserrorstext-withaction": "Бу дьайыыны ($2) оҥорор кыаҕыҥ суох.  {{PLURAL:$1|Биричиинэтэ|Биричиинэлэрэ}}:",
-       "contentmodelediterror": "Ð\91Ñ\83 Ñ\82оÑ\80Ñ\83мÑ\83 Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 ÐºÑ\8bаÒ\95Ñ\8bÒ¥ Ñ\81Ñ\83оÑ\85 Ñ\8dбиÑ\82, Ñ\82оÒ\95о Ð´Ð¸Ñ\8dÑ\82Ñ\8dÑ\85Ñ\85Ñ\8d Ð¸Ò»Ð¸Ð½Ñ\8dÑ\8dÒ\95иÑ\82ин Ð¼Ð°Ð´Ñ\8cÑ\8bала Ð¼Ð°Ð½Ð½Ñ\8bк <code>$1</code>, Ð¾Ñ\82Ñ\82он Ñ\81иÑ\80Ñ\8dй Ð¸Ò»Ð¸Ð½Ñ\8dÑ\8dÒ\95иÑ\82ин Ð±Ð¸Ð»Ð¸Ò¥Ò¥Ð¸Ñ\82Ñ\8d Ð¼Ð°Ð½Ð½Ñ\8bк — <code>$2</code>.",
+       "contentmodelediterror": "Ð\91Ñ\83 Ñ\82оÑ\80Ñ\83мÑ\83 Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 ÐºÑ\8bаÒ\95Ñ\8bÒ¥ Ñ\81Ñ\83оÑ\85 Ñ\8dбиÑ\82, Ñ\82оÒ\95о Ð´Ð¸Ñ\8dÑ\82Ñ\8dÑ\85Ñ\85Ñ\8d Ð¸Ò»Ð¸Ð½Ñ\8dÑ\8dÒ\95иÑ\82ин Ð¼Ð°Ð´Ñ\8cÑ\8bала Ð¼Ð°Ð½Ð½Ñ\8bк <code>$1</code>, Ð¾Ñ\82Ñ\82он Ñ\81иÑ\80Ñ\8dй Ð¸Ò»Ð¸Ð½Ñ\8dÑ\8dÒ\95иÑ\82ин Ð¼Ð°Ð´Ñ\8cÑ\8bала Ð±Ð¸Ð»Ð¸Ò¥Ò¥Ð¸Ñ\82Ñ\8d Ñ\83Ñ\80аÑ\82Ñ\8bлааÑ\85 — <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Болҕой: сотулубут сирэйи төттөрү оҥорон эрэҕин.'''\n\nТолкуйдаан көр, кырдьык бу сирэйи оҥорор туһалаах дуо.\nАллара сотуулар уонна аат уларыйыытын сурунааллара көрдөрүлүннэ.",
        "moveddeleted-notice": "Бу сирэй сотуллубут.\nАллара сотуу уонна аат уларытыытын сурунаалларыгар онно сыһыаннаах туох суруллубута көстөр.",
        "moveddeleted-notice-recent": "Бу сирэй соторутааҕыта (тиһэх 24 чаас иһигэр) сотуллубут эбит.\nАллара сотуу уонна көһөрүү сурунаалларыгар сигэлэр көстөллөр.",
        "userrights": "Кыттааччылар бырааптарын салайыы",
        "userrights-lookup-user": "Кыттаачылар бөлөхтөрүн салайыы",
        "userrights-user-editname": "Кыттааччы аата:",
-       "editusergroup": "Кыттааччылар бөлөхтөрүн уларытарга",
+       "editusergroup": "{{GENDER:$1|Кыттааччы}} бөлөхтөрүн уларытарга",
        "editinguser": "<strong>[[User:$1|$1]]</strong> кыттааччы $2 быраабын уларытыы",
        "userrights-editusergroup": "Кыттааччы бөлөхтөрүн уларытарга",
-       "saveusergroups": "Кыттааччы бөлөхтөрүн бигэргэт",
+       "saveusergroups": "{{GENDER:$1|Кыттааччы}} бөлөхтөрүн бигэргэт",
        "userrights-groupsmember": "Бу бөлөхтөргө киирэр:",
        "userrights-groupsmember-auto": "Көстүбэт чилиэн:",
        "userrights-groups-help": "Бу киһи киирэр бөлөхтөрүн уларытыаххын сөп:\n* Бөлөх аатын таһыгар бэлиэ турар буоллаҕына бу кыттааччы бу бөлөххө киирэр.\n* Бэлиэ суох буоллаҕына - кыттааччы бөлөххө киирбэт\n* Маннык бэлиэ * кыттааччы бөлөххө киирэрин/киирбэтин уларытар кыаҕыҥ суоҕун көрдөрөр.",
        "right-createpage": "Сирэйдэри оҥоруу (ырытыы сирэйдэриттэн ураты)",
        "right-createtalk": "Ырытыы сирэйдэрин оҥоруу",
        "right-createaccount": "Саҥа кыттааччыны бэлиэтээһин",
+       "right-autocreateaccount": "Тас бэлиэ-аатынан киирии",
        "right-minoredit": "Уларытыыны кыра суолталаах курдук бэлиэтээ",
        "right-move": "Сирэйдэр ааттарын уларытыы",
        "right-move-subpages": "Сирэйдэр ааттарын иһигэр киирэр сирэйдэри кытта уларытыы",
        "right-managechangetags": "[[Special:Tags|Бэлиэлэри]] билии олоҕуттан ылыы уонна сотуу",
        "right-applychangetags": "Улартыыларгын кытта [[Special:Tags|тиэктэри]] тутун",
        "right-changetags": "Ханнык баҕарар [[Special:Tags|тиэктэри]] биирдиилээн уларытыыларга уонна сурунаал суруйууларыгар эбэри уонна сотору көҥүллээ",
+       "grant-generic": "Быраап «$1» нобуора",
+       "grant-group-page-interaction": "Сирэйдиин алтыһыы",
+       "grant-group-file-interaction": "Миэдьийэлиин алтыһыы",
+       "grant-group-watchlist-interaction": "Кэтиир тиһиликкин кытта алтыһыы",
        "grant-group-email": "Сурук ыытыы",
        "grant-group-high-volume": "Кылгас кэм иһигэр элбэҕи оҥоруу",
        "grant-group-customization": "Нарылааһын уонна туруоруулар",
        "grant-highvolume": "Түргэнник элбэҕи уларытыы",
        "grant-oversight": "Кыттааччылар уларытыыларын уонна сирэйдэр барылларын кистээһин",
        "grant-patrol": "Сирэй уларыйыытын ботурууллааһын",
+       "grant-protect": "Көмүскээһин уонна көмүскэли суох гыныы",
+       "grant-rollback": "Сирэй уларыйыытын төннөрүү",
+       "grant-sendemail": "Атын кыттааччыларга эл. суругу ыытыы",
+       "grant-uploadeditmovefile": "Билэни хачайдааһын, солбуйан биэрии уонна аатын уларытыы",
+       "grant-uploadfile": "Саҥа билэни киллэрии",
+       "grant-basic": "Сүрүн быраап",
+       "grant-viewdeleted": "Сотуллубут билэлэри уонна сирэйдэри көрүү",
+       "grant-viewmywatchlist": "Кэтиир тиһиликкин көрүү",
        "newuserlogpage": "Кыттааччылары бэлиэтиир сурунаал",
        "newuserlogpagetext": "Соторутааҕыта бэлиэтэммит кыттааччылар.",
        "rightslog": "Кыттаачы бырааптарын сурунаала",
        "action-createpage": "сирэйдэри оҥоруу",
        "action-createtalk": "ырытыы сирэйдэрин оҥоруу",
        "action-createaccount": "кыттааччы бу бэлиэтэнэр аатын оҥоруу",
+       "action-autocreateaccount": "тас бэлиэ-аатынан аптамаатынан киирии",
        "action-history": "сирэй устуоруйатын көрүү",
        "action-minoredit": "бу уларытыыны суолтата суох курдук бэлиэтээ",
        "action-move": "бу сирэй аатын уларытыы",
        "recentchanges-label-plusminus": "Сирэй кээмэйэ бачча баайтынан уларыйбыт",
        "recentchanges-legend-heading": "'''Легендата:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (өссө көр: [[Special:NewPages|Саҥа сирэйдэр тиһиктэрэ]])",
+       "recentchanges-submit": "Көрдөр",
        "rcnotefrom": "Манна {{PLURAL:$5|уларытыы көрдөрүлүннэ|уларытыылар көһүннүлэр}} баччаттан <strong>$3, $4</strong> (баччаттан элбэх көстүбэт <strong>$1</strong>).",
        "rclistfrom": "Бу кэм $3 $2 кэнниттэн оҥоһуллубуттары көрдөр",
        "rcshowhideminor": "$1 кыра уларыйыылары",
        "rcshowhidemine": "Мин уларытыыларбын $1",
        "rcshowhidemine-show": "Көрдөр",
        "rcshowhidemine-hide": "Кистээ",
+       "rcshowhidecategorization": "$1 сирэй категориялааһынын",
        "rcshowhidecategorization-show": "Көрдөр",
        "rcshowhidecategorization-hide": "Кистээ",
        "rclinks": "$2 күҥҥэ бүтэһик $1 уларытыыны көрдөр;<br />$3.",
        "foreign-structured-upload-form-label-own-work-message-shared": "Бу билэни бас билэрбин уонна Биики Ыскылаакка төнүннэрбэттии [https://creativecommons.org/licenses/by-sa/4.0/deed.ru Creative Commons Attribution-ShareAlike 4.0] лиссиэнсийэннэн угары бигэргэтэбин. Ону тэҥэ [https://wikimediafoundation.org/wiki/Условия_использования Туһаныы усулуобуйатын кытта] сөбүлэһэбин.",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Өскөтө билэни бас билбэт буоллаххына, биитэр атын лиссиэнсийэннэн угуоххун баҕарар буоллаххына, манна баар ньыманы туһаныаххын сөп: [https://commons.wikimedia.org/wiki/Special:UploadWizard Биики Ыскылаакка угуу маастара].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Өскө, {{SITENAME}} быраабылатынан угар сатанар буоллаҕына, кини [[Special:Upload|киллэрии тэрилин]] туһаныаххын эмиэ сөп.",
+       "foreign-structured-upload-form-3-label-question-website": "Ойууну ханнык эрэ саайтан хачайдаан ыллыҥ дуо?",
+       "foreign-structured-upload-form-3-label-question-ownwork": "Бэйэҥ уруһуйдаабыт ойууҥ (эскииһиҥ, чертеһүҥ), түһэрбит хаартыскаҥ дуо?",
+       "foreign-structured-upload-form-3-label-question-noderiv": "Үлэҥ иһигэр ким эрэ бас билэр үлэтэ баар дуо, холобур, логотип?",
+       "foreign-structured-upload-form-3-label-yes": "Оннук",
+       "foreign-structured-upload-form-3-label-no": "Суох",
+       "foreign-structured-upload-form-3-label-alternative": "Оннук буоллаҕына, бу тэрил көмөтүнэн хачайдыыр сатаммат. Ол эрээри, өскөтө көҥүл лиссиэнсийэлээх буоллаҕына, син биир [https://commons.wikimedia.org/wiki/Special:UploadWizard Биики-ыскылаат маастарын] көмөтүнэн угуохха сөп.",
        "backend-fail-stream": "$1 билэни ыытар табыллыбата.",
        "backend-fail-backup": "Бу билэ $1 резервнэй куопуйатын оҥорор табыллыбата.",
        "backend-fail-notexists": "Маннык $1 билэ суох эбит.",
        "cachedspecial-viewing-cached-ts": "Сирэй кээскэ киирбит барылын көрөҕүн, дьиҥнээх сирэй чыҥха атын буолуон сөп.",
        "cachedspecial-refresh-now": "Бүтэһик барылы көр.",
        "categories": "Категориялар",
+       "categories-submit": "Көрдөр",
        "categoriespagetext": "Бу {{PLURAL:$1|категория иһигэр|категориялар истэригэр}} сирэйдэр эбэтэр медиа-билэлэр бааллар.\n[[Special:UnusedCategories|Туттуллубат категориялар]] манна көстүбэттэр.\nӨссө маны көр: [[Special:WantedCategories|Баар буолуохтаах категориялар тиһиктэрэ]].",
        "categoriesfrom": "Мантан саҕаланар категориялары көрдөр:",
        "special-categories-sort-count": "ахсаанынан бэрээдэктээһин",
        "activeusers-hidebots": "Руобаттары көрдөрүмэ",
        "activeusers-hidesysops": "Дьаһабыллары көрдөрүмэ",
        "activeusers-noresult": "Кыттааччылар көстүбэтилэр.",
+       "activeusers-submit": "Көхтөөх кыттааччылары көрдөр",
        "listgrouprights": "Кыттааччылар бөлөхтөрүн бырааптара",
        "listgrouprights-summary": "Манна бу биикигэ баар бөлөхтөр уонна кинилэр киирэр бырааптара көстөллөр.\nБаҕар дьон туспа бырааптарын  туһунан [[{{MediaWiki:Listgrouprights-helppage}}|эбии информация]] баара буолуо.",
        "listgrouprights-key": "Суруга: * <span class=\"listgrouprights-granted\">Биэриллибит бырааптар</span>\n* <span class=\"listgrouprights-revoked\">Быһыллыбыт бырааптар</span>",
        "listgrouprights-namespaceprotection-header": "Аат далын хааччахтара",
        "listgrouprights-namespaceprotection-namespace": "Аат дала",
        "listgrouprights-namespaceprotection-restrictedto": "Кыттааччы көннөрөр бырааба",
+       "listgrants": "Көҥүл",
+       "listgrants-grant": "Көҥүл",
+       "listgrants-rights": "Быраап",
        "trackingcategories": "Кэтиир категориялар",
        "trackingcategories-summary": "Манна MediaWiki аптамаатынан толорор кэтиир категориялара көстөллөр.  Бу аат далыгар {{ns:8}} систиэмэ биллэриилэрин уларытан ааттарын уларытыахха сөп.",
        "trackingcategories-msg": "Кэтиир категория",
        "wlheader-showupdated": "Бүтэһик киирииҥ кэннэ уларыйбыт сирэйдэр '''модьу''' бичигинэн бэлиэтэннилэр.",
        "wlnote": "Манна кэлиҥҥи {{PLURAL:$2|чаас|<strong>$2</strong> чаас}} иһигэр оҥоһуллубут бүтэһик <strong>$1</strong> уларытыы көрдөрүлүннэ, бу кэминээҕи туругунан $3, $4.",
        "wlshowlast": "Бүтэһик $2 күҥҥэ $1 чааска көрдөр",
-       "wlshowtime": "Тиһэҕи көрдөр:",
+       "watchlist-hide": "Кистээ",
+       "watchlist-submit": "Көрдөр",
+       "wlshowtime": "Бу ыккардыгар буолбуту көрдөр:",
        "wlshowhideminor": "кыра суолталаах уларытыы",
        "wlshowhidebots": "оруобат",
        "wlshowhideliu": "бэлиэтэммит кыттааччы",
        "wlshowhideanons": "ааттарын эппэтэх кыттааччы",
        "wlshowhidepatr": "тургутуллубут уларытыы",
        "wlshowhidemine": "бэйэм уларытыым",
+       "wlshowhidecategorization": "сирэй категоризациятын",
        "watchlist-options": "Кэтээн көрүү туруоруутун уларытыы",
        "watching": "Кэтээ...",
        "unwatching": "Кэтээмэ...",
        "delete-confirm": "Маны \"$1\" соторго",
        "delete-legend": "Сотуу",
        "historywarning": "<strong>Сэрэтии</strong>: Сотоору турар сирэйиҥ $1 {{PLURAL:$1|соҕотох барыллаах|барыллаах}} устуоруйалаах:",
+       "historyaction-submit": "Көрдөр",
        "confirmdeletetext": "Эн сирэйи (ойууну) уонна кини устуоруйатын букатын сотоору гынаҕын.\nБука диэн, кырдьык инньэ гынаары гынаргын,\nбу дьайыы туох содуллаах буоларын толору билэргин\nуонна [[{{MediaWiki:Policy-url}}]] сиэрин кэспэккин бигэргэт.",
        "actioncomplete": "Дьайыы оҥоһулунна",
        "actionfailed": "Дьайыы оҥоһуллубата",
        "whatlinkshere-hidelinks": "$1 сигэ (ыйынньык)",
        "whatlinkshere-hideimages": "$1 билэ сигэтэ",
        "whatlinkshere-filters": "Фильтрдар",
+       "whatlinkshere-submit": "Толор",
        "autoblockid": "Аптамаатынан хааччахтааһын #$1",
        "block": "Кыттааччыны хааччахтааһын",
        "unblock": "Кытааччы хааччаҕын устуу",
        "watchlisttools-edit": "Кэтэбил испииһэгин көрүү/уларытыы",
        "watchlisttools-raw": "\"Сиикэй\" испииһэги уларытыы",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ырытыы]])",
+       "timezone-local": "Олохтоох",
        "duplicate-defaultsort": "Болҕой: Наардааһын «$2» күлүүһэ урукку «$1» күлүүһү сабар (Ключ сортировки переопределяет прежний ключ).",
        "duplicate-displaytitle": "<strong>Болҕой:</strong> Көрдөрүллүбүт «$2» аат урут көрдөрүллүбүт «$1» ааты уларытар.",
        "invalid-indicator-name": "<strong>Алҕас:Сирэй туругун көрдөрөр индикатор </strong> атрибута <code>name</code> кураанах буолуо суохтаах.",
        "redirect-page": "Сирэй нүөмэрэ",
        "redirect-revision": "Сирэй барыла",
        "redirect-file": "Билэ аата",
+       "redirect-logid": "Сурунаал ID нүөмэрэ",
        "redirect-not-exists": "Суолта көстүбэтэ",
        "fileduplicatesearch": "Хос билэлэри көрдөөһүн",
        "fileduplicatesearch-summary": "Тэҥ билэлэри хэш-куодтарынан көрдөөһүн.",
        "tags-deactivate": "араар",
        "tags-hitcount": "$1 {{PLURAL:$1|уларытыы|уларытыылар}}",
        "tags-manage-no-permission": "Тиэктэри уларытар кыаҕыҥ суох эбит.",
+       "tags-manage-blocked": "Хааччахтаммыт буолаҥҥын уларытыы бэлиэлэрин уларытар кыаҕыҥ суох.",
        "tags-create-heading": "Саҥа тиэги оҥоруу",
        "tags-create-explanation": "Саҥа оҥоһуллубут тиэктэри кыттааччылар уонна буоттар уларытар кыахтаах буолуохтара.",
        "tags-create-tag-name": "Бэлиэ аата:",
index 31f5eac..8dbeb71 100644 (file)
@@ -11,7 +11,8 @@
                        "Macofe",
                        "KWiki",
                        "Matma Rex",
-                       "Srdjan m"
+                       "Srdjan m",
+                       "Conquistador"
                ]
        },
        "tog-underline": "Podvuci linkove:",
        "thu": "чет-čet",
        "fri": "pet-пет",
        "sat": "sub-суб",
-       "january": "januar-сијечањ",
-       "february": "februar-вељача",
-       "march": "mart-ожујак",
-       "april": "april-травањ",
-       "may_long": "maj-свибањ",
-       "june": "jun-липањ",
-       "july": "jul-српањ",
-       "august": "avgust-коловоз",
-       "september": "septembar-рујан",
-       "october": "oktobar-листопад",
-       "november": "студени-novembar",
-       "december": "decembar-просинац",
-       "january-gen": "januara-сијечња",
-       "february-gen": "februara-вељаче",
-       "march-gen": "marta-ожујка",
-       "april-gen": "aprila-травња",
-       "may-gen": "маја-свибња",
-       "june-gen": "junа-липња",
-       "july-gen": "jula-српња",
-       "august-gen": "augusta-коловоза",
-       "september-gen": "septembra-рујна",
-       "october-gen": "oktobra-листопада",
-       "november-gen": "студенога-novembra",
-       "december-gen": "decembra-просинца",
-       "jan": "jan-сиј",
-       "feb": "feb-вељ",
-       "mar": "mar-ожу",
-       "apr": "apr-тра",
-       "may": "maj-сви",
-       "jun": "jun-лип",
-       "jul": "jul-срп",
-       "aug": "aug-кол",
-       "sep": "sep-руј",
-       "oct": "okt-лис",
-       "nov": "сту-nov",
-       "dec": "dec-про",
-       "january-date": "$1. januar",
-       "february-date": "$1. februar",
-       "march-date": "$1. mart",
-       "april-date": "$1. april",
-       "may-date": "$1. maj",
-       "june-date": "$1. jun",
-       "july-date": "$1. jul",
-       "august-date": "$1. august",
-       "september-date": "$1. septembar",
-       "october-date": "$1. oktobar",
-       "november-date": "$1. novembar",
-       "december-date": "$1. decembar",
+       "january": "januar",
+       "february": "februar",
+       "march": "mart",
+       "april": "april",
+       "may_long": "maj",
+       "june": "juni",
+       "july": "juli",
+       "august": "august",
+       "september": "septembar",
+       "october": "oktobar",
+       "november": "novembar",
+       "december": "decembar",
+       "january-gen": "januara",
+       "february-gen": "februara",
+       "march-gen": "marta",
+       "april-gen": "aprila",
+       "may-gen": "maja",
+       "june-gen": "juna",
+       "july-gen": "jula",
+       "august-gen": "augusta",
+       "september-gen": "septembra",
+       "october-gen": "oktobra",
+       "november-gen": "novembra",
+       "december-gen": "decembra",
+       "jan": "jan.",
+       "feb": "feb.",
+       "mar": "mar.",
+       "apr": "apr.",
+       "may": "maj",
+       "jun": "jun.",
+       "jul": "jul.",
+       "aug": "aug.",
+       "sep": "sep.",
+       "oct": "okt.",
+       "nov": "nov.",
+       "dec": "dec.",
+       "january-date": "$1. januara",
+       "february-date": "$1. februara",
+       "march-date": "$1. marta",
+       "april-date": "$1. aprila",
+       "may-date": "$1. maja",
+       "june-date": "$1. juna",
+       "july-date": "$1. jula",
+       "august-date": "$1. augusta",
+       "september-date": "$1. septembra",
+       "october-date": "$1. oktobra",
+       "november-date": "$1. novembra",
+       "december-date": "$1. decembra",
        "pagecategories": "{{PLURAL:$1|Kategorija|Kategorije}}",
        "category_header": "Stranice u kategoriji \"$1\"",
        "subcategories": "Potkategorije",
        "noindex-category": "Neindeksirane stranice",
        "broken-file-category": "Stranice sa neispravnim linkovima do datoteka",
        "about": "O...",
-       "article": "Stranica sadržaja (članak)",
+       "article": "Stranica sa sadržajem",
        "newwindow": "(otvara se u novom prozoru)",
-       "cancel": "Odustani - Одустани",
+       "cancel": "Otkaži",
        "moredotdotdot": "Još...",
        "morenotlisted": "Ovaj spisak nije kompletan.",
        "mypage": "Moja stranica",
-       "mytalk": "Razgovor / Разговор",
+       "mytalk": "Razgovor",
        "anontalk": "Razgovor za ovu IP adresu",
        "navigation": "Navigacija - Навигација",
        "and": "&#32;i",
        "navigation-heading": "Navigacijski meni",
        "errorpagetitle": "Greška - Грешка",
        "returnto": "Povratak na $1.",
-       "tagline": "Izvor: {{SITENAME}}",
-       "help": "Pomoć / Помоћ",
+       "tagline": "Iz {{SITENAME}}",
+       "help": "Pomoć",
        "search": "Traži / Тражи",
        "searchbutton": "Traži",
        "go": "Idi / Иди",
        "history": "Historija stranice",
        "history_short": "Historija",
        "updatedmarker": "promjene od moje zadnje posjete",
-       "printableversion": "Za štampanje / За штампање",
+       "printableversion": "Verzija za ispis",
        "permalink": "Trajni link",
        "print": "Štampa",
        "view": "Vidi",
        "talkpagelinktext": "Razgovor",
        "specialpage": "Posebna stranica",
        "personaltools": "Lični alati",
-       "articlepage": "Pogledaj stranicu sa sadržajem (članak)",
-       "talk": "Razgovor / Разговор",
+       "articlepage": "Vidi stranicu sa sadržajem",
+       "talk": "Razgovor",
        "views": "Pregledi",
-       "toolbox": "Alatke / Алатке",
+       "toolbox": "Alati",
        "userpage": "Pogledaj korisničku stranicu - Погледај корисничку страницу",
        "projectpage": "Pogledajte stranicu projekta",
        "imagepage": "Vidi stranicu datoteke/fajla",
        "viewhelppage": "Pogledajte stranicu za pomoć",
        "categorypage": "Pogledaj stranicu kategorije",
        "viewtalkpage": "Pogledajte raspravu",
-       "otherlanguages": "Drugi jezici / Други језици",
+       "otherlanguages": "Na drugim jezicima",
        "redirectedfrom": "(Preusmjereno sa $1)",
        "redirectpagesub": "Preusmjeri stranicu",
        "redirectto": "Preusmjerenje na:",
        "copyrightpage": "{{ns:project}}:Autorska_prava",
        "currentevents": "Trenutni događaji",
        "currentevents-url": "Project:Novosti",
-       "disclaimers": "Odricanje odgovornosti",
-       "disclaimerpage": "Project:Uslovi korištenja, pravne napomene i odricanje odgovornosti",
+       "disclaimers": "Odricanje od odgovornosti",
+       "disclaimerpage": "Project:Opće odricanje od odgovornosti",
        "edithelp": "Pomoć pri uređivanju",
        "helppage-top-gethelp": "Pomoć",
-       "mainpage": "Glavna stranica / Главна страница",
-       "mainpage-description": "Glavna stranica / Главна страница",
+       "mainpage": "Glavna stranica",
+       "mainpage-description": "Glavna stranica",
        "policy-url": "Project:Pravila",
        "portal": "Portal zajednice",
        "portal-url": "Project:Portal_zajednice",
-       "privacy": "Politika privatnosti - Политика приватности",
+       "privacy": "Politika privatnosti",
        "privacypage": "Project:Pravila o anonimnosti",
        "badaccess": "Greška pri odobrenju",
        "badaccess-group0": "Nije vam dozvoljeno izvršiti akciju koju ste zahtjevali.",
        "sort-descending": "Poredaj opadajuće",
        "sort-ascending": "Poredaj rastuće",
        "nstab-main": "Članak / Чланак",
-       "nstab-user": "Korisnik / Корисник",
+       "nstab-user": "Stranica korisnika",
        "nstab-media": "Mediji",
        "nstab-special": "Posebna stranica",
        "nstab-project": "Stranica projekta",
        "nstab-image": "Datoteka",
        "nstab-mediawiki": "Poruka / Порука",
        "nstab-template": "Šablon / Шаблон",
-       "nstab-help": "Pomoć / Помоћ",
+       "nstab-help": "Pomoć",
        "nstab-category": "Kategorija / Категорија",
-       "mainpage-nstab": "Glavna stranica / Главна страница",
+       "mainpage-nstab": "Glavna stranica",
        "nosuchaction": "Nema takve akcije",
        "nosuchactiontext": "Akcija navedena u URL-u nije valjana.\nMožda ste pogriješili pri unosu URL-a ili ste slijedili pokvaren link.\nMoguće je i da je ovo greška u softveru koji koristi {{SITENAME}}.",
        "nosuchspecialpage": "Nema takve posebne stranice",
        "userlogin-yourname": "Korisničko ime",
        "userlogin-yourname-ph": "Unesite svoje korisničko ime",
        "createacct-another-username-ph": "Unesi korisničko ime",
-       "yourpassword": "Vaša šifra / Ваша шифра:",
-       "userlogin-yourpassword": "Lozinka/zaporka",
-       "userlogin-yourpassword-ph": "Unesite svoju lozinku/zaporku",
+       "yourpassword": "Lozinka:",
+       "userlogin-yourpassword": "Lozinka",
+       "userlogin-yourpassword-ph": "Unesite svoju lozinku",
        "createacct-yourpassword-ph": "Unesite lozinku/zaporku",
        "yourpasswordagain": "Ponovo upišite šifru / Поново упишите шифру",
        "createacct-yourpasswordagain": "Potvrdite lozinku/zaporku",
        "createacct-yourpasswordagain-ph": "Unesite lozinku/zaporku ponovno",
        "remembermypassword": "Upamti moju lozinku na ovom kompjuteru (za maksimum od $1 {{PLURAL:$1|dan|dana}})",
-       "userlogin-remembermypassword": "Držite me ulogiranog/u",
+       "userlogin-remembermypassword": "Zapamti prijavu",
        "userlogin-signwithsecure": "Koristite sigurnu vezu",
        "yourdomainname": "Vaš domen:",
        "password-change-forbidden": "Ne možete da promenite lozinku na ovom vikiju.",
        "nav-login-createaccount": "Prijavi se / Registruj se",
        "userlogin": "Prijavi se / Пријави се",
        "userloginnocreate": "Prijavi se",
-       "logout": "Odjavi se / Одјави се",
+       "logout": "Odjava",
        "userlogout": "Odjavi se / Одјави се",
        "notloggedin": "Niste prijavljeni",
        "userlogin-noaccount": "Nemate račun?",
        "userlogin-joinproject": "Pridružite se {{SITENAME}}",
        "nologin": "Nemate korisničko ime? '''$1'''.",
-       "nologinlink": "Otvorite račun",
-       "createaccount": "Napraviti novi nalog / Направити нови налог",
+       "nologinlink": "Izradi račun",
+       "createaccount": "Izradi račun",
        "gotaccount": "Imate račun? '''$1'''.",
        "gotaccountlink": "Prijavite se / Пријавите се",
        "userlogin-resetlink": "Zaboravili ste detalje vaše prijave?",
-       "userlogin-resetpassword-link": "Zaboravili ste lozinku/zaporku?",
+       "userlogin-resetpassword-link": "Zaboravili ste lozinku?",
        "userlogin-helplink2": "Pomoć pri prijavljivanju",
        "userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nKoristite donji obrazac da biste se prijavili kao drugi korisnik.",
-       "userlogin-createanother": "Stvori još jedan račun",
+       "userlogin-createanother": "Izradi drugi račun",
        "createacct-emailrequired": "E-mail adresa",
        "createacct-emailoptional": "E-mail adresa (opcionalno)",
        "createacct-email-ph": "Unesite svoju E-mail adresu",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto stvarate novi račun",
        "createacct-submit": "Stvorite svoj račun",
-       "createacct-another-submit": "Napravi korisnički račun",
+       "createacct-another-submit": "Izradi račun",
        "createacct-benefit-heading": "{{SITENAME}} se stvara od ljudi poput vas.",
        "createacct-benefit-body1": "$1 {{PLURAL:$1|izmjena|izmjene}}",
        "createacct-benefit-body2": "$1 {{PLURAL:$1|stranica|stranice|stranica}}",
        "loginlanguagelabel": "Jezik: $1",
        "suspicious-userlogout": "Vaš zahtjev za odjavu je odbijen jer je poslan preko pokvarenog preglednika ili keširanog proksija.",
        "createacct-another-realname-tip": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje za vaš rad.",
-       "pt-login": "Prijavi me / Пријави ме",
+       "pt-login": "Prijava",
        "pt-login-button": "Prijavi me / Пријави ме",
-       "pt-createaccount": "Napraviti novi nalog / Направити нови налог",
-       "pt-userlogout": "Odjavi se / Одјави се",
+       "pt-createaccount": "Izradi račun",
+       "pt-userlogout": "Odjava",
        "php-mail-error-unknown": "Nepoznata greška u PHP funkciji mail()",
        "user-mail-no-addy": "Pokušaj slanja e-maila bez e-mail adrese.",
        "user-mail-no-body": "Pokušano slanje e-maila s praznim ili nerazumno kratkim sadržajem.",
        "resetpass_submit": "Odredi lozinku i prijavi se",
        "changepassword-success": "Vaša šifra je uspiješno promjenjena! Prijava u toku...",
        "changepassword-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
+       "botpasswords-label-cancel": "Otkaži",
        "resetpass_forbidden": "Šifre ne mogu biti promjenjene",
        "resetpass-no-info": "Morate biti prijavljeni da bi ste pristupili ovoj stranici direktno.",
        "resetpass-submit-loggedin": "Promijeni lozinku",
-       "resetpass-submit-cancel": "Odustani",
+       "resetpass-submit-cancel": "Otkaži",
        "resetpass-wrong-oldpass": "Privremena ili trenutna lozinka nije valjana.\nMožda ste već uspješno promijenili Vašu lozinku ili ste tražili novu privremenu lozinku.",
        "resetpass-recycled": "Molimo resetirajte vašu lozinku/zaporku u nešto drugo od vaše trenutne lozinke/zaporke.",
        "resetpass-temp-emailed": "Prijavili ste se sa privremenim kodom iz e-pošte.\nDa biste završili prijavljivanje morate postaviti novu lozinku ovde:",
        "hr_tip": "Horizontalna linija (koristite rijetko)",
        "summary": "Sažetak:",
        "subject": "Tema:",
-       "minoredit": "Mala izmjena - Мала измена",
-       "watchthis": "Prati / Прати",
-       "savearticle": "Sačuvaj - Сачувај",
-       "preview": "Pretpregled / Претпреглед",
-       "showpreview": "Pretpregled - Претпреглед",
-       "showdiff": "Prikaži izmjene - Прикажи измене",
+       "minoredit": "Ovo je manje uređenje",
+       "watchthis": "Prati ovu stranicu",
+       "savearticle": "Spremi stranicu",
+       "preview": "Pregled",
+       "showpreview": "Prikaži pregled",
+       "showdiff": "Prikaži izmjene",
        "blankarticle": "<strong>Upozorenje:</strong> Napravili ste praznu stranicu.\nAko ponovno kliknete \"{{int:savearticle}}\", napravit ćete praznu stranicu bez sadržaja.",
        "anoneditwarning": "<strong>Upozorenje:</strong> Niste prijavljeni. \nVaša IP adresa će biti javno vidljiva ako napravite neku izmjenu. Ako se <strong>[$1 prijavite]</strong> ili <strong>[$2 napravite račun]</strong>, vaše izmjene će biti pripisane vašem korisničkom imenu, zajedno sa drugim pogodnostima.",
        "anonpreviewwarning": "''Niste prijavljeni. Vaša IP adresa će biti zabilježena u historiji ove stranice.''",
        "viewprevnext": "Pogledaj ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Postoji stranica pod nazivom \"[[:$1]]\" na ovoj wiki'''",
        "searchmenu-new": "<strong>Napravi stranicu \"[[:$1]]\" na ovoj wiki!</strong> {{PLURAL:$2|0=|Pogledajte također straniu pronađenu vašom pretragom.|Pogledajte također i vaše rezultate pretrage.}}",
-       "searchprofile-articles": "Stranice sadržaja",
+       "searchprofile-articles": "Stranice sa sadržajem",
        "searchprofile-images": "Multimedija",
        "searchprofile-everything": "Sve",
        "searchprofile-advanced": "Napredno",
        "search-external": "Vanjska/spoljna pretraga",
        "searchdisabled": "Pretraga teksta na ovoj Wiki je trenutno onemogućena.\nU međuvremenu možete pretraživati preko Googlea.\nUzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.",
        "search-error": "Dogodila se pogreška prilikom pretraživanja: $1",
-       "preferences": "Postavke / Подешавања",
-       "mypreferences": "Postavke / Подешавања",
+       "preferences": "Postavke",
+       "mypreferences": "Postavke",
        "prefs-edits": "Broj izmjena:",
        "prefsnologintext2": "Molimo Vas prijavite se da biste promijenili postavke.",
        "prefs-skin": "Izgled (skin)",
-       "skin-preview": "Pretpregled",
+       "skin-preview": "Pregled",
        "datedefault": "Bez preferenci",
        "prefs-labs": "Eksperimentalne mogućnosti",
        "prefs-user-pages": "Korisničke stranice",
        "prefs-personal": "Korisnički profil",
        "prefs-rc": "Podešavanje nedavnih izmjena",
-       "prefs-watchlist": "Praćene stranice / Списак надгледања",
+       "prefs-watchlist": "Lista praćenja",
        "prefs-editwatchlist": "Uredi popis praćenja",
        "prefs-editwatchlist-label": "Uredi unose na popisu praćenja:",
        "prefs-editwatchlist-edit": "Vidite i uklonite naslove na vašem popisu praćenja",
        "prefs-timeoffset": "Vremenska razlika",
        "prefs-advancedediting": "Opće opcije",
        "prefs-editor": "Uređivač",
-       "prefs-preview": "Pretpregled",
+       "prefs-preview": "Pregled",
        "prefs-advancedrc": "Napredne opcije",
        "prefs-advancedrendering": "Napredne opcije",
        "prefs-advancedsearchoptions": "Napredne opcije",
        "right-createtalk": "Pravljenje stranica za razgovor",
        "right-createaccount": "Pravljenje korisničkog računa",
        "right-minoredit": "Označavanje izmjena kao malih",
-       "right-move": "Preusmjeravanje stranica",
+       "right-move": "Premještanje stranica",
        "right-move-subpages": "Preusmjeravanje stranica sa svim podstranicama",
        "right-move-rootuserpages": "Premještanje stranica osnovnih korisnika",
        "right-move-categorypages": "Pomakni stranice kategorije",
        "rc-enhanced-hide": "Sakrij detalje",
        "rc-old-title": "prvobitno kreirano kao \"$1\"",
        "recentchangeslinked": "Srodne izmjene / Сродне измене",
-       "recentchangeslinked-feed": "Srodne izmjene",
-       "recentchangeslinked-toolbox": "Srodne izmjene",
-       "recentchangeslinked-title": "Srodne promjene sa \"$1\"",
+       "recentchangeslinked-feed": "Vezane izmjene",
+       "recentchangeslinked-toolbox": "Vezane izmjene",
+       "recentchangeslinked-title": "Izmjene vezane s \"$1\"",
        "recentchangeslinked-summary": "Ova posebna stranica prikazuje promjene na povezanim stranicama.\nStranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podebljane'''.",
        "recentchangeslinked-page": "Naslov stranice:",
        "recentchangeslinked-to": "Pokaži promjene stranica koji su povezane sa datom stranicom",
        "upload-http-error": "Desila se HTTP greška: $1",
        "upload-copy-upload-invalid-domain": "Kopije postavljanja nisu dostupni na ovom domenu.",
        "upload-dialog-title": "Postavi datoteku",
-       "upload-dialog-button-cancel": "Odustani",
+       "upload-dialog-button-cancel": "Otkaži",
        "upload-dialog-button-done": "Urađeno",
        "upload-dialog-button-save": "Snimi",
        "upload-dialog-button-upload": "Postavi",
        "statistics-header-edits": "Statistike izmjena",
        "statistics-header-users": "Statistike korisnika",
        "statistics-header-hooks": "Ostale statistike",
-       "statistics-articles": "Stranice sadržaja",
+       "statistics-articles": "Stranice sa sadržajem",
        "statistics-pages": "Stranice",
        "statistics-pages-desc": "Sve stranice na wikiju, uključujući stranice za razgovor, preusmjerenja itd.",
        "statistics-files": "Broj postavljenih datoteka",
        "trackingcategories-disabled": "Kategorija je onemogućena",
        "mailnologin": "Nema adrese za slanje",
        "mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]] i imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]] da biste slali e-poštu drugim korisnicima.",
-       "emailuser": "Pošalji E-mail ovom korisniku",
+       "emailuser": "Pošalji e-mail ovom korisniku",
        "emailuser-title-target": "Slanje e-maila {{GENDER:$1|korisniku|korisnici|korisniku}}",
        "emailuser-title-notarget": "Slanje e-maila korisniku",
        "emailpagetext": "Možete da koristite donji obrazac da pošaljete e-mail {{GENDER:$1|ovom korisniku|ovoj korisnici|ovom korisniku|}}.\nE-mail koju ste uneli u vašim [[Special:Preferences|postavkama]] će se prikazati u polju \"Od:\", tako da će primalac moći da vam odgovori direktno.",
        "emailuserfooter": "Ovu e-poruku {{GENDER:$1|poslao|poslala}} je $1 {{GENDER:$2|korisniku|korisnici}} $2 pomoću funkcije \"{{int:emailuser}}\" s projekta {{SITENAME}}.",
        "usermessage-summary": "Ostavljanje sistemske poruke.",
        "usermessage-editor": "Sistem za poruke",
-       "watchlist": "Spisak praćenja / Списак праћења",
-       "mywatchlist": "Popis praćenja / Списак надгледања",
+       "watchlist": "Lista praćenja",
+       "mywatchlist": "Lista praćenja",
        "watchlistfor2": "Za $1 $2",
        "nowatchlist": "Nemate ništa na svom spisku praćenih članaka.",
        "watchlistanontext": "Morate biti prijavljeni kako biste vidjeli ili uređivali svoj spisak praćenih članaka.",
        "removewatch": "Ukloni sa spiska praćenja",
        "removedwatchtext": "Stranica „[[:$1]]“ i njena stranica za razgovor je uklonjena s vašeg [[Special:Watchlist|spiska nadgledanja]].",
        "removedwatchtext-short": "Stranica \"$1\" je uklonjena sa vašeg spiska praćenja.",
-       "watch": "Prati / Прати",
-       "watchthispage": "Prati / Прати",
+       "watch": "Prati",
+       "watchthispage": "Prati ovu stranicu",
        "unwatch": "Prekini praćenje",
-       "unwatchthispage": "Ukinite praćenje",
-       "notanarticle": "Nije članak",
+       "unwatchthispage": "Prestani pratiti",
+       "notanarticle": "Nije stranica sa sadržajem",
        "notvisiblerev": "Posljednja izmjena drugog korisnika je bila izbrisana",
        "watchlist-details": "{{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica }} na vašem spisku praćenja, ne računajući posebno stranice za razgovor.",
        "wlheader-enotif": "* Obavještavanje e-poštom je omogućeno.",
        "blanknamespace": "(Glavno)",
        "contributions": "Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}}",
        "contributions-title": "Korisnički doprinosi od $1",
-       "mycontris": "Doprinosi / Доприноси",
+       "mycontris": "Doprinosi",
+       "anoncontribs": "Doprinosi",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Korisnički račun \"$1\" nije registrovan.",
        "nocontribs": "Nisu nađene promjene koje zadovoljavaju ove uslove.",
        "sp-contributions-toponly": "Prikaži samo izmjene koje su posljednje revizije",
        "sp-contributions-newonly": "Prikaži samo izmjene kojima su napravljene nove stranice",
        "sp-contributions-submit": "Traži",
-       "whatlinkshere": "Što vodi ovdje / Шта води овде",
+       "whatlinkshere": "Što upućuje ovamo",
        "whatlinkshere-title": "Stranice koje vode / Странице које воде до $1",
        "whatlinkshere-page": "Stranica:",
        "linkshere": "Sljedeće stranice vode na '''[[:$1]]''':",
        "databasenotlocked": "Baza podataka nije zaključana.",
        "lockedbyandtime": "(od $1 dana $2 u $3)",
        "move-page": "Preusmjeravanje $1",
-       "move-page-legend": "Premjestite stranicu",
+       "move-page-legend": "Premjesti stranicu",
        "movepagetext": "Korištenjem ovog formulara možete preimenovati stranicu, premještajući cijelu historiju na novo ime.\nČlanak pod starim imenom će postati stranica koja preusmjerava na članak pod novim imenom. \nMožete automatski izmjeniti preusmjerenje do izvornog naslova.\nAko se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].\nDužni ste provjeriti da svi linkovi i dalje nastave voditi na prave stranice.\n\nImajte na umu da članak '''neće''' biti preusmjeren ukoliko već postoji članak pod imenom na koje namjeravate da preusmjerite osim u slučaju stranice za preusmjeravanje koja nema nikakvih starih izmjena.\nTo znači da možete vratiti stranicu na prethodno mjesto ako pogriješite, ali ne možete zamijeniti postojeću stranicu.\n\n'''Pažnja!'''\nOvo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice;\nMolimo dobro razmislite prije nego što preimenujete stranicu.",
        "movepagetext-noredirectfixer": "Koristeći obrazac ispod ćete preimenovati stranicu i premjestiti cijelu njenu historiju na novi naziv.\nStari naziv će postati preusmjerenje na novi naziv.\nMolimo provjerite da li postoje [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].\nVi ste za to odgovorni te morate provjeriti da li su linkovi ispravni i da li vode tamo gdje bi trebali.\n\nImajte na umu da stranica '''neće''' biti premještena ako već postoji stranica s tim imenom, osim ako je prazna ili je preusmjerenje ili nema ranije historije.\nOvo znali da možete preimenovati stranicu nazad gdje je ranije bila preimenovana ako ste pogriješili a ne možete ponovo preimenovati postojeću stranicu.\n\n'''Pažnja!'''\nImajte na umu da preusmjeravanje popularnog članka može biti\ndrastična i neočekivana promjena za korisnike; molimo budite sigurni da ste shvatili posljedice prije nego što nastavite.",
        "movepagetalktext": "Ako označite ovu kutijucu, pridružena stranica za razgovor će se automatski premjestiti na novi naslov, ukoliko ne-prazna stranica razgovor sa istim imenom već postoji. U tom slučaju ćete morati, ako želite, ručno premjestiti ili spojiti stranicu.",
        "cant-move-category-page": "Nemate dopuštene da premještate stranice kategorija.",
        "cant-move-to-category-page": "Nemate dopuštenje da premjestite stranicu na stranicu kategorije.",
        "newtitle": "Novi naslov:",
-       "move-watch": "Prati ovu stranicu - Прати ову страницу",
-       "movepagebtn": "Premjesti stranicu – Премјести страницу",
+       "move-watch": "Prati izvornu i ciljnu stranicu",
+       "movepagebtn": "Premjesti stranicu",
        "pagemovedsub": "Premještanje uspjelo",
        "movepage-moved": "'''\"$1\" je premještena na \"$2\"'''",
        "movepage-moved-redirect": "Preusmjerenje je napravljeno.",
        "movepage-moved-noredirect": "Pravljenje preusmjerenja je onemogućeno.",
        "articleexists": "Stranica pod tim imenom već postoji, ili je ime koje ste izabrali neispravno.\nMolimo Vas da izaberete drugo ime.",
        "cantmove-titleprotected": "Ne možete premjestiti stranicu na ovu lokaciju, jer je novi naslov zaštićen od pravljenja",
-       "movetalk": "Premjesti i stranicu za diskusiju zajedno sa člankom (ako nije prazna).",
-       "move-subpages": "Premjesti sve podstranice (do $1)",
-       "move-talk-subpages": "Premjesti podstranice stranica za razgovor (do $1)",
+       "movetalk": "Premjesti pridruženu stranicu za razgovor",
+       "move-subpages": "Premjesti podstranice (sve do $1)",
+       "move-talk-subpages": "Premjesti podstranice stranice za razgovor (sve do $1)",
        "movepage-page-exists": "Stranica $1 već postoji i ne može biti automatski zamijenjena.",
        "movepage-page-moved": "Stranica $1 je premještena na $2.",
        "movepage-page-unmoved": "Stranica $1 ne može biti premještena na $2.",
        "nonfile-cannot-move-to-file": "Ne mogu se premjestiti podaci u datotečni imenski prostor",
        "imagetypemismatch": "Ekstenzija nove datoteke ne odgovara njenom tipu",
        "imageinvalidfilename": "Ciljno ime datoteke nije valjano",
-       "fix-double-redirects": "Ažuriraj sva preusmjerenja koja vode ka originalnom naslovu",
+       "fix-double-redirects": "Ažuriraj sva preusmjerenja koja vode na originalni naslov",
        "move-leave-redirect": "Ostavi preusmjerenje",
        "protectedpagemovewarning": "'''Upozorenje:''' Ova stranica je zaključana tako da je mogu premještati samo korisnici sa ovlastima administratora.\nPosljednja stavka evidencije je prikazana ispod kao referenca:",
        "semiprotectedpagemovewarning": "'''Napomena:''' Ova stranica je zaključana tako da je mogu uređivati samo registrovani korisnici.\nPosljednja stavka evidencije je prikazana ispod kao referenca:",
        "javascripttest-pagetext-frameworks": "Izaberite jedan od sledećih radnih okvira: $1",
        "javascripttest-pagetext-skins": "Izaberite s kojim skinom (interfejsom) želite da pokrenete probu:",
        "javascripttest-qunit-intro": "Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.",
-       "tooltip-pt-userpage": "Vaša korisnička stranica",
+       "tooltip-pt-userpage": "{{GENDER:|Vaša korisnička}} stranica",
        "tooltip-pt-anonuserpage": "Korisnička stranica za ip koju Vi uređujete kao",
-       "tooltip-pt-mytalk": "Vaša stranica za razgovor",
+       "tooltip-pt-mytalk": "{{GENDER:|Vaša}} stranica za razgovor",
        "tooltip-pt-anontalk": "Razgovor o doprinosu sa ove IP adrese",
-       "tooltip-pt-preferences": "Vaše postavke",
-       "tooltip-pt-watchlist": "Spisak stranica koje pratite radi izmjena",
-       "tooltip-pt-mycontris": "Spisak vaših doprinosa",
+       "tooltip-pt-preferences": "{{GENDER:|Vaše}} postavke",
+       "tooltip-pt-watchlist": "Lista stranica čije izmjene pratite",
+       "tooltip-pt-mycontris": "Lista {{GENDER:|vaših}} doprinosa",
+       "tooltip-pt-anoncontribs": "Lista uređenja napravljenih s ove IP adrese",
        "tooltip-pt-login": "Predlažem da se prijavite; međutim, to nije obavezno",
        "tooltip-pt-logout": "Odjava sa projekta {{SITENAME}}",
        "tooltip-pt-createaccount": "Ohrabrujemo vas da otvorite račun i prijavite se; to, međutim, nije obavezno",
-       "tooltip-ca-talk": "Razgovor o sadržaju stranice",
+       "tooltip-ca-talk": "Rasprava o stranici sa sadržajem",
        "tooltip-ca-edit": "Uredi ovu stranicu",
        "tooltip-ca-addsection": "Započnite novu sekciju.",
        "tooltip-ca-viewsource": "Ova stranica je zaštićena.\nMožete vidjeti njen izvor",
        "tooltip-ca-delete": "Izbriši ovu stranicu",
        "tooltip-ca-undelete": "Vratite izmjene koje su načinjene prije brisanja stranice",
        "tooltip-ca-move": "Premjesti ovu stranicu",
-       "tooltip-ca-watch": "Dodajte ovu stranicu na Vaš spisak praćenja",
+       "tooltip-ca-watch": "Dodaj ovu stranicu na svoju listu praćenja",
        "tooltip-ca-unwatch": "Izbrišite ovu stranicu sa spiska praćenja",
        "tooltip-search": "Traži ovaj Wiki / Тражи овај Вики [alt-f]",
        "tooltip-search-go": "Idi na stranicu s upravo ovakvim imenom ako postoji",
        "tooltip-search-fulltext": "Pretraga stranica sa ovim tekstom",
        "tooltip-p-logo": "Posjetite glavnu stranicu",
-       "tooltip-n-mainpage": "Posjetite glavnu stranu",
+       "tooltip-n-mainpage": "Posjetite glavnu stranicu",
        "tooltip-n-mainpage-description": "Posjetite glavnu stranicu",
        "tooltip-n-portal": "O projektu, što možete učiniti, gdje možete naći stvari",
        "tooltip-n-currentevents": "Pronađi dodatne informacije o trenutnim događajima",
        "tooltip-n-recentchanges": "Spisak nedavnih izmjena na wikiju.",
        "tooltip-n-randompage": "Otvorite slučajnu stranicu",
-       "tooltip-n-help": "Mjesto gdje možete nešto da naučite",
-       "tooltip-t-whatlinkshere": "Spisak svih stranica povezanih sa ovim",
+       "tooltip-n-help": "Mjesto za saznavanje",
+       "tooltip-t-whatlinkshere": "Lista svih wiki stranica koje upućuju ovamo",
        "tooltip-t-recentchangeslinked": "Nedavne izmjene ovdje povezanih stranica",
        "tooltip-feed-rss": "RSS feed za ovu stranicu",
        "tooltip-feed-atom": "Atom feed za ovu stranicu",
-       "tooltip-t-contributions": "Pogledajte listu doprinosa ovog korisnika",
+       "tooltip-t-contributions": "Lista doprinosa {{GENDER:$1|ovog korisnika}}",
        "tooltip-t-emailuser": "Pošaljite e-mail ovom korisniku",
        "tooltip-t-upload": "Postavi datoteke",
-       "tooltip-t-specialpages": "Popis svih posebnih stranica",
-       "tooltip-t-print": "Verzija ove stranice za štampanje",
+       "tooltip-t-specialpages": "Lista svih posebnih stranica",
+       "tooltip-t-print": "Verzija ove stranice za ispis",
        "tooltip-t-permalink": "Stalni link ove verzije stranice",
-       "tooltip-ca-nstab-main": "Pogledajte sadržaj stranice",
+       "tooltip-ca-nstab-main": "Vidi stranicu sa sadržajem",
        "tooltip-ca-nstab-user": "Pogledajte korisničku stranicu",
        "tooltip-ca-nstab-media": "Pogledajte medijski fajl",
        "tooltip-ca-nstab-special": "Ovo je posebna stranica, te se ne može zasebno uređivati",
        "tooltip-ca-nstab-image": "Vidi stranicu datoteke/fajla",
        "tooltip-ca-nstab-mediawiki": "Pogledajte sistemsku poruku",
        "tooltip-ca-nstab-template": "Pogledajte šablon",
-       "tooltip-ca-nstab-help": "Pogledajte stranicu za pomoć",
+       "tooltip-ca-nstab-help": "Vidi stranicu pomoći",
        "tooltip-ca-nstab-category": "Pogledajte stranicu kategorije",
-       "tooltip-minoredit": "Označite ovo kao manju izmjenu",
-       "tooltip-save": "Snimi izmjene - Сними измјене [alt-s]",
-       "tooltip-preview": "Prethodni pregled stranice, molimo koristiti prije snimanja!",
+       "tooltip-minoredit": "Označi ovo kao manje uređenje",
+       "tooltip-save": "Spremite svoje izmjene",
+       "tooltip-preview": "Pregledajte svoje izmjene. Molimo vas da ovo koristite prije spremanja.",
        "tooltip-diff": "Prikaz izmjena koje ste napravili u tekstu",
        "tooltip-compareselectedversions": "Pogledajte pazlike između dvije selektovane verzije ove stranice.",
-       "tooltip-watch": "Postavite ovu stranicu na Vaš spisak praćenja / Поставите ову страницу на Ваш списак праћења [alt-w]",
+       "tooltip-watch": "Dodaj ovu stranicu na svoju listu praćenja",
        "tooltip-watchlistedit-normal-submit": "Ukloni naslove",
        "tooltip-watchlistedit-raw-submit": "Ažuriraj spisak praćenja",
        "tooltip-recreate": "Ponovno pravljenje stranice iako je već brisana",
        "exif-attributionurl": "Kada ponovno koristite ovaj rad, molimo povežite ga na",
        "exif-preferredattributionname": "Kada ponovno koristite ovaj rad, molimo pripišite ga na",
        "exif-pngfilecomment": "PNG komentar datoteke",
-       "exif-disclaimer": "Odricanje odgovornosti",
+       "exif-disclaimer": "Odricanje od odgovornosti",
        "exif-contentwarning": "Upozorenje o sadržaju",
        "exif-giffilecomment": "GIF komentar datoteke",
        "exif-intellectualgenre": "Tip predmeta",
        "fileduplicatesearch-result-1": "Datoteka \"$1\" nema identičnih dvojnika.",
        "fileduplicatesearch-result-n": "Datoteka \"$1\" ima {{PLURAL:$2|1 identičnog|$2 identična|$2 identičnih}} dvojnika.",
        "fileduplicatesearch-noresults": "Nije pronađena datoteka sa imenom \"$1\".",
-       "specialpages": "Posebno / Посебно",
+       "specialpages": "Posebne stranice",
        "specialpages-note": "* Normalne posebne stranice.\n* <span class=\"mw-specialpagerestricted\">Ograničene posebne stranice.</span>\n* <span class=\"mw-specialpagecached\">Keširane posebne stranice (mogu biti zastarjele).</span>",
        "specialpages-group-maintenance": "Izvještaji o održavanju / Извјештаји о одржавању",
        "specialpages-group-other": "Ostale posebne stranice - Остале посебне странице",
        "feedback-bugcheck": "Izvrsno! Molimo provjerite da se ne radi o nekom [$1 poznatom \"bugu\"].",
        "feedback-bugnew": "Provereno. Prijavi novu grešku",
        "feedback-bugornote": "Ako ste spremni da detaljno opišete tehnički problem, onda [$1 prijavite grešku].\nU suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajati na stranici „[$3 $2]“, zajedno s korisničkim imenom i pregledačem koji koristite.",
-       "feedback-cancel": "Odustani",
+       "feedback-cancel": "Otkaži",
        "feedback-close": "Gotovo",
        "feedback-error1": "Greška: neprepoznat rezultat od API-ja",
        "feedback-error2": "Greška: Uređivanje nije uspjelo",
        "duration-centuries": "$1 {{PLURAL:$1|vijek|vijekova}}",
        "duration-millennia": "$1 {{PLURAL:$1|milenijum|milenijuma}}",
        "rotate-comment": "Slika rotirana za $1 {{PLURAL:$1|stepeni}} u smjeru kazaljke na satu",
-       "expand_templates_input": "Unos - Унос"
+       "expand_templates_input": "Unos - Унос",
+       "expand_templates_preview": "Pregled"
 }
index 180b534..cfdee95 100644 (file)
        "previewnote": "'''Vedite, da stran le predogledujete.'''\nVaših sprememb še nismo shranili!",
        "continue-editing": "Pojdi na urejevalno območje",
        "previewconflict": "V prikazanem predogledu je v zgornjem predelu urejanja navedeno besedilo, kakor se bo prikazalo, če ga boste shranili.",
-       "session_fail_preview": "'''Oprostite! Zaradi izgube podatkov o seji nam vašega urejanja žal ni uspelo obdelati.'''\nProsimo, poskusite znova.\nČe bo spet prišlo do napake, se [[Special:UserLogout|odjavite]] in ponovno prijavite.",
-       "session_fail_preview_html": "'''Oprostite! Zaradi izgube podatkov o seji nam vašega urejanja ni uspelo obdelati.'''\n\n''Ker ima {{SITENAME}} omogočen surovi HTML, je predogled zaradi preprečevanja napadov z JavaScriptom skrit.''\n\n'''Če gre za dobronameren poskus urejanja, vas prosimo, da poskusite znova.'''\nČe bo spet prišlo do napake, se [[Special:UserLogout|odjavite]] in ponovno prijavite.",
+       "session_fail_preview": "Oprostite! Zaradi izgube podatkov o seji nam vašega urejanja žal ni uspelo obdelati.\n\nMorda ste bili odjavljeni. <strong>Prosimo, preverite, da ste še vedno prijavljeni, in poskusite znova.</strong>\nČe še vedno ne deluje, se poskusite [[Special:UserLogout|odjaviti]] in znova prijaviti; prav tako preverite, da vaš brskalnik dovoljuje piškotke s te strani.",
+       "session_fail_preview_html": "Oprostite! Zaradi izgube podatkov o seji nam vašega urejanja ni uspelo obdelati.\n\n<em>Ker ima {{SITENAME}} omogočen surov HTML, smo predogled skrili kot previdnostni ukrep pred napadi z JavaScriptom.</em>\n\n<strong>Če gre za dobronameren poskus urejanja, vas prosimo, da poskusite znova.</strong>\nČe še vedno ne deluje, se poskusite [[Special:UserLogout|odjaviti]] in znova prijaviti; prav tako preverite, da vaš brskalnik dovoljuje piškotke s te strani.",
        "token_suffix_mismatch": "'''Vaše urejanje je bilo zavrnjeno, ker je vaš odjemalec pokvaril ločila v urejevalnem zahtevku.'''\nUrejanje je bilo zavrnjeno z namenom preprečitve okvare v besedilu strani.\nNajvečkrat je razlog uporaba hroščato spletno anonimizacijsko storitev.",
        "edit_form_incomplete": "'''Nekateri deli urejevalnega obrazca niso dosegli strežnika; prepričajte se, da so vaša urejanja neokrnjena in poskusite znova.'''",
        "editing": "Urejanje $1",
        "mergehistory-empty": "Redakcij ni moč združiti.",
        "mergehistory-done": "$3 {{PLURAL:$3|redakcija|redakciji|redakcije|redakcij}} $1 {{PLURAL:$3|smo}} spojili v [[:$2]].",
        "mergehistory-fail": "Ne morem izvesti združitev zgodovine, prosimo, ponovno preverite strani in parametre časa.",
+       "mergehistory-fail-bad-timestamp": "Časovni žig je neveljaven.",
+       "mergehistory-fail-invalid-source": "Izvorna strani je neveljavna.",
+       "mergehistory-fail-invalid-dest": "Ciljna stran je neveljavna.",
+       "mergehistory-fail-no-change": "Združevanje zgodovine ni združilo nobene redakcije. Prosimo, ponovno preverite parametre strani in časa.",
+       "mergehistory-fail-permission": "Nezadostna dovoljenja za združevanje zgodovine.",
+       "mergehistory-fail-self-merge": "Izvorna in ciljna stran sta enaki.",
+       "mergehistory-fail-timestamps-overlap": "Izvorne redakcije se prekrivajo ali pridejo po ciljnh redakcijah.",
        "mergehistory-fail-toobig": "Ne morem izvesti združitve zgodovine, saj bi moral premakniti več kot $1 {{PLURAL:$1|redakcijo|redakciji|redakcije|redakcij}}, kar je omejitev.",
        "mergehistory-no-source": "Izvirna stran $1 ne obstaja.",
        "mergehistory-no-destination": "Ciljna stran $1 ne obstaja.",
        "import-nonewrevisions": "Uvozil nisem nobene redakcije (vse so bile že prisotne ali pa sem jih preskočil zaradi napak).",
        "xml-error-string": "$1 v vrstici $2, znak $3 (zlog $4): $5",
        "import-upload": "Naložite podatke XML",
-       "import-token-mismatch": "Izguba podatkov o seji.\nProsimo, poskusite znova.",
+       "import-token-mismatch": "Izguba podatkov o seji.\n\nMorda ste bili odjavljeni. <strong>Prosimo, preverite, da ste še vedno prijavljeni, in poskusite znova.</strong>\nČe še vedno ne deluje, se poskusite [[Special:UserLogout|odjaviti]] in znova prijaviti; prav tako preverite, da vaš brskalnik dovoljuje piškotke s te strani.",
        "import-invalid-interwiki": "Uvoz iz navedenega wikija ni možen.",
        "import-error-edit": "Strani »$1« nismo uvozili, ker vam ni dovoljeno, da jo urejate.",
        "import-error-create": "Strani »$1« nismo uvozili, ker vam ni dovoljeno, da jo ustvarite.",
        "expand_templates_generate_xml": "Pokaži razčlenitveno drevo XML",
        "expand_templates_generate_rawhtml": "Prikaži surovi HTML",
        "expand_templates_preview": "Predogled",
-       "expand_templates_preview_fail_html": "<em>Ker ima {{SITENAME}} omogočen surov HTML in je prišlo do izgube podatkov o seji, smo predogled skrili kot previdnostni ukrep pred napadi z JavaScriptom.</em>\n\n<strong>Če je to veljaven poskus predogleda, poskusite znova.</strong>\nČe še vedno ne deluje, se poskusite [[Special:UserLogout|odjaviti]] in znova prijaviti.",
+       "expand_templates_preview_fail_html": "<em>Ker ima {{SITENAME}} omogočen surov HTML in je prišlo do izgube podatkov o seji, smo predogled skrili kot previdnostni ukrep pred napadi z JavaScriptom.</em>\n\n<strong>Če je to veljaven poskus predogleda, poskusite znova.</strong>\nČe še vedno ne deluje, se poskusite [[Special:UserLogout|odjaviti]] in znova prijaviti; prav tako preverite, da vaš brskalnik dovoljuje piškotke s te strani.",
        "expand_templates_preview_fail_html_anon": "<em>Ker ima {{SITENAME}} omogočen surov HTML in niste prijavljeni, smo predogled skrili kot previdnostni ukrep pred napadi z JavaScriptom.</em>\n\n<strong>Če je to veljaven poskus predogleda, se [[Special:UserLogin|prijavite]] in poskusite znova.</strong>",
        "expand_templates_input_missing": "Navesti boste morali vsaj nekaj vhodnega besedila.",
        "pagelanguage": "Spremeni jezik strani",
index 63401ba..51bb686 100644 (file)
        "apisandbox-api-disabled": "АПИ је онемогућен на овом сајту.",
        "apisandbox-submit": "Постави захтев",
        "apisandbox-reset": "Очисти",
-       "apisandbox-results": "Резултат",
+       "apisandbox-results": "Резултати",
        "apisandbox-request-url-label": "Адреса захтева:",
        "booksources": "Штампани извори",
        "booksources-search-legend": "Тражи књижевне изворе",
        "wlshowhideanons": "анонимне кориснике",
        "wlshowhidepatr": "патролиране измене",
        "wlshowhidemine": "моје измене",
+       "wlshowhidecategorization": "категоризацију страница",
        "watchlist-options": "Поставке списка надгледања",
        "watching": "Надгледање…",
        "unwatching": "Прекидање надгледања…",
index 79893cc..7bae3ac 100644 (file)
        "apisandbox": "API pesak",
        "apisandbox-api-disabled": "API je onemogućen na ovom sajtu.",
        "apisandbox-submit": "Postavi zahtev",
-       "apisandbox-results": "Rezultat",
+       "apisandbox-results": "Rezultati",
        "apisandbox-request-url-label": "Adresa zahteva:",
        "booksources": "Štampani izvori",
        "booksources-search-legend": "Traži književne izvore",
        "wlshowhideanons": "anonimne korisnike",
        "wlshowhidepatr": "patrolirane izmene",
        "wlshowhidemine": "moje izmene",
+       "wlshowhidecategorization": "kategorizaciju stranica",
        "watchlist-options": "Postavke spiska nadgledanja",
        "watching": "Nadgledanje…",
        "unwatching": "Prekidanje nadgledanja…",
index 84a9a33..b4fda80 100644 (file)
        "uploaded-script-svg": "Hittade skriptelementet \"$1\" i den uppladdade SVG-filen.",
        "uploaded-hostile-svg": "Hittade osäker CSS i den uppladdade filens stilelement.",
        "uploaded-event-handler-on-svg": "Att ange event-handler-attribut <code>$1=\"$2\"</code> är inte tillåtet i SVG-filer.",
-       "uploaded-href-unsafe-target-svg": "Hittade href till ett osäkert mål <code>&lt;$1 $2=\"$3\"&gt;</code> i den uppladdade SVG-filen.",
+       "uploaded-href-attribute-svg": "href-attribut i SVG-filer tillåts endast att länka till http:// eller https:// som återfinns <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-href-unsafe-target-svg": "Hittade href till osäker data: URI-mål <code>&lt;$1 $2=\"$3\"&gt;</code> i den uppladdade SVG-filen.",
        "uploaded-animate-svg": "Hittades taggen \"animate\" som kan ändra href med hjälp av attributen \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> i den uppladdade SVG-filen.",
        "uploaded-setting-event-handler-svg": "Att ange event-handler-attribut är blockerat. Hittade <code>&lt;$1 $2=\"$3\"&gt;</code> i den uppladdade SVG-filen.",
        "uploaded-setting-href-svg": "Användning av taggen \"set\" för att lägga till attributen \"href\" till överordnade element blockeras.",
        "apihelp": "API-hjälp",
        "apihelp-no-such-module": "Modulen ”$1” hittades inte",
        "apisandbox": "API-sandlåda",
+       "apisandbox-jsonly": "JavaScript krävs för att använda API-sandlådan.",
        "apisandbox-api-disabled": "API är inaktiverat på denna webbplats.",
-       "apisandbox-intro": "Använd den här sidan för att experimentera med '''MediaWikis API för webbtjänster''.\nSe [//www.mediawiki.org/wiki/API:Main_page API-dokumentationen] för ytterligare detaljer kring API-användningen. Exempel: [//www.mediawiki.org/wiki/API#A_simple_example få innehållet från en huvudsida]. Välj en handling för att se fler exempel.\n\nObservera att även om detta är en sandlåda kan handlingar du utför på denna sida påverka wikin.",
+       "apisandbox-intro": "Använd den här sidan för att experimentera med <strong>MediaWikis API för webbtjänster</strong>.\nSe [[mw:API:Main page|API-dokumentationen]] för ytterligare detaljer kring API-användningen. Exempel: [//www.mediawiki.org/wiki/API#A_simple_example få innehållet från en huvudsida]. Välj en handling för att se fler exempel.\n\nObservera att även om detta är en sandlåda kan handlingar du utför på denna sida påverka wikin.",
+       "apisandbox-fullscreen": "Utvidga panel",
+       "apisandbox-fullscreen-tooltip": "Utvidga sandlådspanelen för att fylla webbläsarens fönster.",
+       "apisandbox-unfullscreen": "Visa sida",
+       "apisandbox-unfullscreen-tooltip": "Förminska sandlådspanelen så MediaWikis navigeringslänkar syns.",
        "apisandbox-submit": "Utför begäran",
        "apisandbox-reset": "Rensa",
+       "apisandbox-retry": "Försök igen",
+       "apisandbox-loading": "Läser in information för API-modulen \"$1\"...",
+       "apisandbox-load-error": "Ett fel uppstod när information för API-modulen \"$1\" lästes in: $2",
+       "apisandbox-no-parameters": "Denna API-modul har inga parametrar.",
+       "apisandbox-helpurls": "Hjälplänkar",
        "apisandbox-examples": "Exempel",
+       "apisandbox-dynamic-parameters": "Ytterligare parametrar",
+       "apisandbox-dynamic-parameters-add-label": "Lägg till parameter:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Parameternamn",
+       "apisandbox-dynamic-error-exists": "En parameter som heter \"$1\" finns redan.",
+       "apisandbox-deprecated-parameters": "Föråldrade parametrar",
+       "apisandbox-submit-invalid-fields-title": "En del fält är ogiltiga",
+       "apisandbox-submit-invalid-fields-message": "Korrigera de markerade fälten och försök igen.",
        "apisandbox-results": "Resultat",
+       "apisandbox-sending-request": "Skickar API-begäran...",
+       "apisandbox-loading-results": "Hämtar API-resultat...",
        "apisandbox-request-url-label": "Begärd URL:",
-       "apisandbox-request-time": "Tid för begäran: $1",
+       "apisandbox-request-time": "Tid för begäran: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-alert-page": "Fälten på denna sida är inte giltiga.",
+       "apisandbox-alert-field": "Värdet i detta fält är inte giltigt.",
        "booksources": "Bokkällor",
        "booksources-search-legend": "Sök efter bokkällor",
        "booksources-search": "Sök",
index 24b1699..e713b2d 100644 (file)
                        "Ianlopez1115",
                        "Leeheonjin",
                        "Macofe",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Stranger195"
                ]
        },
        "tog-underline": "Pagsasalungguhit ng link:",
        "tog-hideminor": "Itago ang mga maliliit na pagbabago mula sa mga huling binago",
        "tog-hidepatrolled": "Ikubli ang napatrolyang mga pagbabagong nasa kamakailang mga pagbabago",
        "tog-newpageshidepatrolled": "Itago ang napatrolyang mga pahina mula talaan ng bagong pahina",
+       "tog-hidecategorization": "Itago ang kategorisasyon ng mga pahina",
        "tog-extendwatchlist": "Palawigin ang talaan ng mga binabantayan upang maipakita ang lahat ng mga pagbabago, hindi lamang ang pinakakamakailan lamang",
-       "tog-usenewrc": "Mga pagbabago ng pangkat ayon sa pahina sa kamakailang mga pagbabago at bantayan (nangangailangan ng JavaScript)",
+       "tog-usenewrc": "Mga pagbabago ng pangkat ayon sa pahina sa kamakailang mga pagbabago at bantayan",
        "tog-numberheadings": "Automatikong bilangin ang mga pamagat",
-       "tog-showtoolbar": "Ipakita ang ''toolbar'' ng pagbabago (JavaScript)",
-       "tog-editondblclick": "Magbago ng mga pahina sa dalawahang pagpindot (JavaScript)",
-       "tog-editsectiononrightclick": "Payagan ang mga pagbabagong panseksyon sa pakanang pagpindot ng mga panseksyong pamagat (JavaScript)",
+       "tog-showtoolbar": "Ipakita ang ''toolbar'' ng pagbabago",
+       "tog-editondblclick": "Magbago ng mga pahina sa dalawahang pagpindot",
+       "tog-editsectiononrightclick": "Payagan ang mga pagbabagong panseksyon sa pakanang pagpindot ng mga panseksyong pamagat",
        "tog-watchcreations": "Idagdag sa aking tala ng mga binabantayan ang mga pahinang nilikha ko at mga talaksang ikinarga kong paitaas",
        "tog-watchdefault": "Idagdag sa aking tala ng mga binabantayan ang mga pahina at mga talaksang binago ko",
        "tog-watchmoves": "Idagdag sa aking tala ng mga binabantayan ang mga pahina at mga talaksang inilipat ko",
        "tog-watchdeletion": "Idagdag sa aking tala ng mga binabantayan ang mga pahina at mga talaksang binura ko",
+       "tog-watchrollback": "Magdagdag ng mga pahina kung saan ako nag-rollback sa aking bantayan",
        "tog-minordefault": "Markahan ang lahat ng pagbabago bilang maliit nang nakatakda",
        "tog-previewontop": "Ipakita ang paunang tingin bago ang kahon ng pagbabago",
        "tog-previewonfirst": "Ipakita ang paunang tingin sa unang pagbabago",
        "tog-shownumberswatching": "Ipakita ang bilang ng mga nagbabantay na tagagamit",
        "tog-oldsig": "Umiiral na lagda:",
        "tog-fancysig": "Ituring ang lagda bilang teksto ng wiki (walang automatikong pagkawing)",
-       "tog-uselivepreview": "Gamitin ang buhay na paunang tingin (JavaScript) (Eksperimental)",
+       "tog-uselivepreview": "Gamitin ang buhay na paunang tingin",
        "tog-forceeditsummary": "Pagsabihan ako kapag nagpapasok ng walang-lamang buod ng pagbabago",
        "tog-watchlisthideown": "Itago ang aking mga pagbabago mula sa tala ng mga binabantayan",
        "tog-watchlisthidebots": "Itago ang mga pagbabago ng mga bot mula sa tala ng mga binabantayan",
        "tog-watchlisthideminor": "Itago ang mga maliliit na pagbabago mula sa tala ng mga binabantayan",
        "tog-watchlisthideliu": "Itago ang mga pagbabago ng mga nakalagdang tagagamit mula sa tala ng mga binabantayan",
+       "tog-watchlistreloadautomatically": "I-karga muli ang bantayan ng awtomatiko kung kailan man nabago ang isang filter (kinakailangan ang JavaScript)",
        "tog-watchlisthideanons": "Itago ang mga pagbabago ng hindi nakikilalang mga tagagamit mula sa tala ng mga binabantayan",
        "tog-watchlisthidepatrolled": "Itago ang napatrolyang mga pagbabago mula sa tala ng mga binabantayan",
+       "tog-watchlisthidecategorization": "Itago ang kategorisasyon ng mga pahina",
        "tog-ccmeonemails": "Padalahan ako ng mga kopya ng mga ipinadala kong e-liham sa ibang mga tagagamit",
        "tog-diffonly": "Huwag ipakita ang nilalaman ng pahinang nasa ilalim ng mga pagkakaiba",
        "tog-showhiddencats": "Ipakita ang mga nakatagong kategorya",
        "october-date": "$1 Oktubre",
        "november-date": "$1 Nobyembre",
        "december-date": "$1 Disyembre",
+       "period-am": "ng umaga",
+       "period-pm": "ng gabi",
        "pagecategories": "{{PLURAL:$1|Kategorya|Mga kategorya}}",
        "category_header": "Mga pahina sa kategoryang \"$1\"",
        "subcategories": "Mga subkategorya",
        "morenotlisted": "Hindi kumpleto ang talang ito.",
        "mypage": "Pahina ko",
        "mytalk": "Usapan",
-       "anontalk": "Usapan para sa IP na ito",
+       "anontalk": "Usapan",
        "navigation": "Paglilibot (nabigasyon)",
        "and": ",&#32;at",
        "qbfind": "Hanapin",
        "view": "Tingnan",
        "view-foreign": "Tingnan sa $1",
        "edit": "Baguhin",
+       "edit-local": "Baguhin ang lokal na paglalarawan",
        "create": "Likhain",
+       "create-local": "Magdagdag ng lokal na paglalarawan",
        "editthispage": "Baguhin ang pahinang ito",
        "create-this-page": "Likhain ang pahinang ito",
        "delete": "Burahin",
        "deletethispage": "Burahin itong pahina",
        "undeletethispage": "Ibalik mula sa pagkakabura ang pahinang ito",
        "undelete_short": "Baligtarin ang pagbura ng {{PLURAL:$1|isang pagbabago|$1 pagbabago}}",
-       "viewdeleted_short": "Tingnan ang {{PLURAL:$1|isang binurang pagbabagp|$1 binurang pagbabago}}",
+       "viewdeleted_short": "Tingnan ang {{PLURAL:$1|isang binurang pagbabago|$1 binurang pagbabago}}",
        "protect": "Ipagsanggalang",
        "protect_change": "baguhin",
        "protectthispage": "Ipagsanggalang itong pahina",
        "otherlanguages": "Sa ibang wika",
        "redirectedfrom": "(Ikinarga mula sa $1)",
        "redirectpagesub": "Pahina ng pagkarga",
+       "redirectto": "Papuntahin sa:",
        "lastmodifiedat": "Huling binago ang pahinang ito noong $2, noong $1.",
-       "viewcount": "Namataan na pahinang ito nang {{PLURAL:$1|isang|$1}} beses.",
+       "viewcount": "Namataan ang pahinang ito nang {{PLURAL:$1|isang|$1}} beses.",
        "protectedpage": "Pahinang nakasanggalang",
        "jumpto": "Tumalon sa:",
        "jumptonavigation": "paglilibot",
        "jumptosearch": "paghahanap",
        "view-pool-error": "Paumanhin, ngunit masyado pong abala ang mga serbidor sa sandaling ito.\nMasyadong maraming tagagamit ay sinusubukang tingnan ang pahinang ito.\nMangyari lamang na maghintay po nang sandali bago niyo pong subukang mataanin muli ang pahinang ito.\n\n$1",
+       "generic-pool-error": "Paumanhin, ngunit masyado pong abala ang mga serbidor sa sandaling ito.\nMasyadong maraming tagagamit ay sinusubukang tingnan ang pahinang ito.\nMangyari lamang na maghintay po nang sandali bago niyo pong subukang mataanin muli ang pahinang ito.",
        "pool-timeout": "Ang pagpapahinga ay naghihintay ng kandado",
        "pool-queuefull": "Puno na ang pisan ng mga pila",
        "pool-errorunknown": "Hindi nalalamang kamalian",
+       "pool-servererror": "Hindi magagamit ang serbisyo ng pool counter ($1).",
+       "poolcounter-usage-error": "Pagkakamali sa paggamit: $1",
        "aboutsite": "Tungkol sa {{SITENAME}}",
        "aboutpage": "Project:Patungkol",
        "copyright": "Maaaring gamitin ang nilalaman sa ilalim ng $1 maliban kung nabanggit.",
        "backlinksubtitle": "← $1",
        "retrievedfrom": "Ikinuha mula sa \"$1\"",
        "youhavenewmessages": "Mayroon kang $1 ($2).",
-       "youhavenewmessagesfromusers": "Mayroon kang $1 magmula sa {{PLURAL:$3|ibang tagagamit|$3 mga tagagamit}} ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Mayroon kang}} $1 magmula sa {{PLURAL:$3|ibang tagagamit|$3 mga tagagamit}} ($2).",
        "youhavenewmessagesmanyusers": "Mayroon kang $1 magmula sa maraming mga tagagamit ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|isang bagong mensahe|bagong mga mensahe}}",
-       "newmessagesdifflinkplural": "huling {{PLURAL:$1|pagbabago|mga pagbabago}}",
+       "newmessageslinkplural": "{{PLURAL:$1|isang bagong mensahe|999=bagong mensahe}}",
+       "newmessagesdifflinkplural": "huling {{PLURAL:$1|pagbabago|999=mga pagbabago}}",
        "youhavenewmessagesmulti": "Mayroon kang mga bagong mensahe sa $1",
        "editsection": "baguhin",
        "editold": "baguhin",
        "hidetoc": "itago",
        "collapsible-collapse": "Ibagsak",
        "collapsible-expand": "Ibuka",
+       "confirmable-confirm": "Sigurado {{GENDER:$1|ka}} ba?",
+       "confirmable-yes": "Oo",
+       "confirmable-no": "Hindi",
        "thisisdeleted": "Tingnan o ibalik ang $1?",
        "viewdeleted": "Tingnan ang $1?",
        "restorelink": "{{PLURAL:$1|isang binurang pagbabago|$1 binurang pagbabago}}",
        "nstab-template": "Padron",
        "nstab-help": "Pahina ng tulong",
        "nstab-category": "Kategorya",
+       "mainpage-nstab": "Unang pahina",
        "nosuchaction": "Walang ganitong kilos",
        "nosuchactiontext": "Hindi tanggap ang galaw na tinukoy ng URL.\nMaaaring nagkamali ka sa pagmamakinilya ng URL, o sumunod sa isang maling kawing.\nMaaari rin itong magpahiwatig ng isang depektong nasa loob ng {{SITENAME}}.",
        "nosuchspecialpage": "Walang ganyang natatanging pahina",
        "databaseerror": "Kamalian sa kalipunan ng datos",
        "databaseerror-text": "Mayroong kamalian sa pagtanong o pag-query sa database.\nMaaring ipinapahiwatig nito ang depekto o bug sa software.",
        "databaseerror-textcl": "May nangyaring depekto sa pag-query ng database.",
+       "databaseerror-query": "Tanong: $1",
+       "databaseerror-function": "Tungkulin: $1",
        "databaseerror-error": "Depekto: $1",
        "laggedslavemode": "'''Babala:''' Maaaring hindi naglalaman ang pahina ng mga huling dagdag.",
        "readonly": "Nakakandado ang kalipunan ng datos",
        "right-blockemail": "Harangin sa pagpapadala ng e-liham ang isang tagagamit",
        "right-hideuser": "Harangin ang isang tagagamit, na itinatago mula sa publiko",
        "right-ipblock-exempt": "Laktawan ang mga pagharang/paghadlang na pang-IP, kusang pagharang/paghadlang at mga saklaw ng pagharang/paghadlang",
-       "right-proxyunbannable": "Laktawan ang mga kusang pagharang ng mga kahalili",
        "right-unblockself": "Tanggalin ang pagkakaharang ng kanilang mga sarili",
        "right-protect": "Baguhin ang mga antas ng panananggalang at baguhin ang mga pahinang nakasanggalang",
        "right-editprotected": "Baguhin ang mga pahinang nakasanggalang (walang baita-baitang na panananggalang)",
        "filewasdeleted": "Isang talaksan na may ganitong pangalan ay naikarga dati at nabura. Kailangan mong tingnan ang $1 bago magpatuloy sa pagkarga nito muli.",
        "filename-bad-prefix": "Ang talaksan na ikakarga mo ay nagsisimula sa '''\"$1\"''', na isang hindi naglalarawang pangalan na karaniwang tinatakda ng mga kamerang digital. Paki pili ang isang mas naglalarawang pangalan para sa iyong talaksan.",
        "filename-prefix-blacklist": " #<!-- leave this line exactly as it is --> <pre>\n# Ang palaugnayan ay ang sumusunod:\n#   * Ang lahat ng mga bagay mula sa isang panitik na \"#\" hanggang sa katapusan ng isang guhit ay isang puna\n#   * Bawat isang guhit na mayroong laman ay isang unlapi para sa tipikal na mga pangalan ng talaksan na kusang itinalaga ng mga kamerang dihital\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # ilang mga teleponong mobilo\nIMG # heneriko\nJD # Jenoptik\nMGP # Pentax\nPICT # samu't sari\n #</pre> <!-- leave this line exactly as it is -->",
-       "upload-success-subj": "Matagumpay na pagkakarga",
-       "upload-success-msg": "Matagumpay ang ikinarga mo mula sa [$2].  Makukuha ito mula rito: [[:{{ns:file}}:$1]]",
-       "upload-failure-subj": "Problema sa pagkarga",
-       "upload-failure-msg": "May suliranin sa iyong pagkakarga mula sa [$2]:\n\n$1",
-       "upload-warning-subj": "Babala sa pagkakarga",
-       "upload-warning-msg": "May suliranin sa iyong pagkakarga mula sa [$2]. Maaari kang magbalik sa [[Special:Upload/stash/$1|upload form]] upang itama ang suliraning ito.",
        "upload-proto-error": "Maling protokolo",
        "upload-proto-error-text": "Nangangailangan ang malayong pagkarga ng mga URL na nagsisimula sa <code>http://</code> o <code>ftp://</code>.",
        "upload-file-error": "Panloob na kamalian",
        "pager-older-n": "{{PLURAL:$1|mas lumang 1|mas lumang $1}}",
        "suppress": "Tagapagingat-tago",
        "querypage-disabled": "Hindi pinagagana ang natatanging pahinang ito para sa mga dahilan ng pagganap.",
+       "apisandbox": "Kahong buhanginan ng API",
+       "apisandbox-api-disabled": "Hindi pinagagana ang API sa sityong ito.",
+       "apisandbox-intro": "Gamitin ang pahinang ito upang mag-eksperimento sa pamamagitan ng '''Paglilingkod na pangsangkasaputan ng API ng MediaWiki'''.\nSumangguni sa [//www.mediawiki.org/wiki/API:Main_page dokumentasyon ng API] para sa karagdagan pang mga detalye sa paggamit ng API. Halimbawa: [//www.mediawiki.org/wiki/API#A_simple_example kuhanin ang nilalaman ng isang Pangunahing Pahina]. Pumili ng isang galaw upang makakita ng mas marami pang mga halimbawa.",
+       "apisandbox-submit": "Gumawa ng kahilingan",
+       "apisandbox-reset": "Hawiin",
+       "apisandbox-examples": "Halimbawa",
+       "apisandbox-results": "Kinalabasan",
+       "apisandbox-request-url-label": "Hilingin ang URL:",
+       "apisandbox-request-time": "Oras ng paghiling: $1",
        "booksources": "Mga mapagkukunang aklat",
        "booksources-search-legend": "Maghanap ng mapagkukunang aklat",
        "booksources-isbn": "ISBN:",
        "wlheader-showupdated": "Ipinapakitang may '''makakapal na mga panitik''' ang nabagong/binagong mga pahina mula pa noong huli mong pagdalaw sa kanila",
        "wlnote": "Nasa ibaba ang {{PLURAL:$1|pinakahuling pagbabago|pinakahuling '''$1''' mga pagbabago}} sa loob ng huling {{PLURAL:$2|oras|'''$2''' mga oras}}, magmula noong $3 sa ganap na ika-$4.",
        "wlshowlast": "Ipakita ang huling $1 mga oras $2 mga araw",
-       "watchlistall2": "lahat",
        "watchlist-hide": "Itago",
        "wlshowhideminor": "mga maliliit na edit",
        "wlshowhidebots": "mga bot",
        "version-hook-name": "Pangalan ng pangkawit",
        "version-hook-subscribedby": "Sinuskribi ng/ni/nina",
        "version-version": "($1)",
-       "version-svn-revision": "(r$2)",
        "version-license": "Lisensiya",
        "version-poweredby-credits": "Ang wiking ito ay pinapatakbo ng '''[https://www.mediawiki.org/ MediaWiki]''', karapatang-ari © 2001-$1 $2.",
        "version-poweredby-others": "iba pa",
        "special-characters-group-khmer": "Khmer",
        "mw-widgets-dateinput-placeholder-day": "TTTT-BB-AA",
        "mw-widgets-dateinput-placeholder-month": "TTTT-BB",
-       "api-error-blacklisted": "Paki pumili ng isang naiibang mapaglarawang pamagat."
+       "api-error-blacklisted": "Paki pumili ng isang naiibang mapaglarawang pamagat.",
+       "randomrootpage": "Alin mang pinag-ugatang/pinagmulang pahina"
 }
index 3c6634b..6732d32 100644 (file)
@@ -82,7 +82,8 @@
                        "Diyapazon",
                        "Matma Rex",
                        "HakanIST",
-                       "Imabadplayer"
+                       "Imabadplayer",
+                       "İnternion"
                ]
        },
        "tog-underline": "Bağlantıların altını çiz:",
        "may": "May",
        "jun": "Haz",
        "jul": "Tem",
-       "aug": "Ağu",
+       "aug": "Agu",
        "sep": "Eyl",
        "oct": "Eki",
        "nov": "Kas",
        "right-applychangetags": "Değişiklikleriyle beraber [[Special:Tags|etiketleri]] uygula",
        "right-changetags": "Tekil sürümler ve günlük kayıtlarına rastgele [[Special:Tags|etiket]] ekleme veya çıkarma",
        "grant-group-email": "E-posta gönder",
+       "grant-createeditmovepage": "Sayfaları oluşturma, düzenleme ve taşıma",
+       "grant-editmycssjs": "Kullanıcı CSS/JavaScript'ini düzenle",
+       "grant-editmywatchlist": "İzleme listeni düzenle",
+       "grant-editprotected": "Korumalı sayfaları Düzenle",
+       "grant-patrol": "Sayfadaki değişiklikleri incele",
+       "grant-uploadfile": "Dosya yükle",
        "grant-basic": "Basit haklar",
+       "grant-viewdeleted": "Silinen dosya ve sayfaları görüntüle",
+       "grant-viewmywatchlist": "İzleme listeni gör",
        "newuserlogpage": "Yeni kullanıcı kayıtları",
        "newuserlogpagetext": "En son kaydolan kullanıcı kayıtları.",
        "rightslog": "Kullanıcı hakları kayıtları",
        "upload-too-many-redirects": "URL çok fazla yönlendirme içeriyor",
        "upload-http-error": "Bir HTTP hatası oluştu: $1",
        "upload-copy-upload-invalid-domain": "Kopya yüklemeler bu etki alanında mevcut değil.",
+       "upload-dialog-title": "Dosya Yükle",
        "upload-dialog-button-cancel": "İptal",
+       "upload-dialog-button-done": "Yapıldı",
        "upload-dialog-button-save": "Kaydet",
        "upload-dialog-button-upload": "Yükle",
        "upload-form-label-select-file": "Dosya seç",
        "mostrevisions": "En çok değişikliğe uğramış sayfalar",
        "prefixindex": "Önek ile tüm sayfalar",
        "prefixindex-namespace": "Önek ile tüm sayfalar ($1 ad alanında)",
+       "prefixindex-submit": "Göster",
        "prefixindex-strip": "Listede öneki kırp",
        "shortpages": "Kısa sayfalar",
        "longpages": "Uzun sayfalar",
        "usereditcount": "$1 {{PLURAL:$1|değişiklik|değişiklik}}",
        "usercreated": "$1 tarihinde $2'de {{GENDER:$3|oluşturuldu}}.",
        "newpages": "Yeni sayfalar",
+       "newpages-submit": "Göster",
        "newpages-username": "Kullanıcı adı:",
        "ancientpages": "En son değişiklik tarihi en eski olan maddeler",
        "move": "Taşı",
        "querypage-disabled": "Bu özel sayfa, performansa dayalı nedenlerle devre dışı bırakılır.",
        "apihelp": "API yardımı",
        "apihelp-no-such-module": "\"$1\" modülü bulunamadı.",
+       "apisandbox-unfullscreen": "Sayfayı göster",
        "apisandbox-submit": "İstek yap",
        "apisandbox-reset": "Temizle",
-       "apisandbox-examples": "Örnek",
+       "apisandbox-retry": "Tekrar dene",
+       "apisandbox-examples": "Örnekler",
        "apisandbox-results": "Sonuç",
        "apisandbox-request-url-label": "İstek URL:",
        "apisandbox-request-time": "İstek zamanı: $1",
        "log-title-wildcard": "Bu metinle başlayan başlıklar ara",
        "showhideselectedlogentries": "Seçili günlük girdilerinin görünürlüğünü değiştir",
        "log-edit-tags": "Seçili kayıtların etiketlerini düzenle",
+       "checkbox-all": "Tüm",
+       "checkbox-none": "Hiçbiri",
        "allpages": "Tüm sayfalar",
        "nextpage": "Sonraki sayfa ($1)",
        "prevpage": "Önceki sayfa ($1)",
        "listgrouprights-namespaceprotection-header": "Ad kısıtlamaları",
        "listgrouprights-namespaceprotection-namespace": "Ad alanı",
        "listgrouprights-namespaceprotection-restrictedto": "Kullanıcının değişiklik yapmasına izin veren hak(lar)",
+       "listgrants-rights": "Haklar",
        "trackingcategories": "Eşleşen kategoriler",
        "trackingcategories-summary": "Bu sayfa MediaWiki yazılımı tarafından otomatik olarak doldurulan takip kategorilerini listelemektedir. {{ns:8}} ad alanındaki ilgili sistem mesajları değiştirilerek isimleri düzenlenebilir.",
        "trackingcategories-msg": "İzleme kategorisi",
        "delete-confirm": "\"$1\" sil",
        "delete-legend": "sil",
        "historywarning": "<strong>Uyarı:</strong> Silmek üzere olduğunuz sayfanın yaklaşık olarak $1 sürüme sahip bir geçmişi var:",
+       "historyaction-submit": "Göster",
        "confirmdeletetext": "Bu sayfayı veya dosyayı tüm geçmişi ile birlikte veritabanından kalıcı olarak silmek üzeresiniz.\nBu işlemden kaynaklı doğabilecek sonuçların farkında iseniz ve işlemin [[{{MediaWiki:Policy-url}}|Silme kurallarına]] uygun olduğuna eminseniz, işlemi onaylayın.",
        "actioncomplete": "İşlem tamamlandı",
        "actionfailed": "İşlem başarısız oldu",
index fd39a51..dadedcc 100644 (file)
        "qbfind": "Эзләү",
        "qbbrowse": "Карау",
        "qbedit": "Үзгәртү",
-       "qbpageoptions": "Ð\90гÓ\80онан Ñ\82одаÑ\80Ñ\88",
+       "qbpageoptions": "Ð\91Ñ\83 Ð±Ð¸Ñ\82",
        "qbmyoptions": "Битләрем",
        "faq": "ЕБС",
        "faqpage": "Project:ЕБС",
        "rcshowhidemine": "минем үзгәртүләремне $1",
        "rcshowhidemine-show": "Күрсәтү",
        "rcshowhidemine-hide": "Яшер",
+       "rcshowhidecategorization": "битләрне төркемләүне $1",
        "rcshowhidecategorization-show": "Күрсәт",
        "rcshowhidecategorization-hide": "Яшер",
        "rclinks": "Соңгы $2 көн эчендә ясалган $1 үзгәртүне күрсәт<br />$3",
        "wlshowhideanons": "аноним кулланучыларныкын",
        "wlshowhidepatr": "тикшерелгән үзгәртүләр",
        "wlshowhidemine": "үзгәртүләрем",
+       "wlshowhidecategorization": "битләрне төркемләүне",
        "watchlist-options": "Күзәтү исемлеге көйләүләре",
        "watching": "Күзәтү исемлегемә өстәүе…",
        "unwatching": "Күзәтү исемлегемнән чыгаруы…",
index cf5e812..73e5754 100644 (file)
        "watchthis": "Бо арынны хайгаараар",
        "savearticle": "Арынны шыгжаар",
        "preview": "Чижеглей көөрү",
-       "showpreview": "Чижек ÐºÓ©Ñ\80үлде",
+       "showpreview": "Ð¥Ñ\8bнап ÐºÓ©Ñ\80",
        "showdiff": "Кииртинген эдилгелер",
        "anoneditwarning": "<strong> Кичээңгейлиг! </strong> Сайтта бүрүткеттинмээн-дир силер. Кандыг-даа бол эдилгелер киирер болзуңарза, IP-адрезиңер хөйге көскү болур. Сайтче <strong>[$1 кире бээр азы]</strong> азы <strong>[$2 бүрүткеттинип алыр] болзуңарза, эдилгелер силерниң адыңар-биле холбаалыг апаар, силерге өске-даа эптиг аргаларлыг тыптып кээр.",
        "missingcommenttext": "Тайылбырни адаанда чогаадыңар.",
        "tooltip-ca-nstab-category": "Аңгылал арны",
        "tooltip-minoredit": "Бо өскертилгени \"биче\" деп демдеглээр",
        "tooltip-save": "Эдилгелериңерни шыгжап арттырар",
-       "tooltip-preview": "Арынның чижек көрүлдези: шыгжаар бетинде ону ажыглаар силер!",
+       "tooltip-preview": "Арынны шыгжаарының бетинде: бижээн чүүлүң хынап көр.",
        "tooltip-diff": "Үндезин сөзүглелге хамаарыштыр кылдынган өскерлиишкиннерни көргүзер.",
        "tooltip-compareselectedversions": "Бо арынның шилиттинген ийи хевиринниң ылгалын көөр.",
        "tooltip-watch": "Силерниң хайгаарал даңзызынга бо арынны немерелээри",
index 1331a8f..110c281 100644 (file)
        "createacct-reason-ph": "Чому ви створюєте інший обліковий запис",
        "createacct-submit": "Створіть ваш обліковий запис",
        "createacct-another-submit": "Створити обліковий запис",
-       "createacct-benefit-heading": "{{SITENAME}} Ñ\81Ñ\82воÑ\80Ñ\8eÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ñ\82акими Ñ\81амими Ð»Ñ\8eдÑ\8cми, Ñ\8fк Ñ\96 Ð²и.",
+       "createacct-benefit-heading": "{{SITENAME}} Ñ\81Ñ\82воÑ\80Ñ\8eÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ñ\82акими Ñ\81амими Ð»Ñ\8eдÑ\8cми, Ñ\8fк Ñ\96 Ð\92и.",
        "createacct-benefit-body1": "{{PLURAL:$1|редагування|редагування|редагувань}}",
        "createacct-benefit-body2": "{{PLURAL:$1|сторінка|сторінки|сторінок}}",
        "createacct-benefit-body3": "{{PLURAL:$1|дописувач|дописувачі|дописувачів}} цього місяця",
        "log-title-wildcard": "Знайти заголовки, що починаються з цих символів",
        "showhideselectedlogentries": "Показати/приховати виділені записи журналу",
        "log-edit-tags": "Змінити мітки для вибраних записів журналів",
+       "checkbox-select": "Виберіть: $1",
        "checkbox-all": "Всі",
        "checkbox-none": "Нічого",
        "checkbox-invert": "Інвертувати",
index 13edba7..104dbeb 100644 (file)
        "virus-scanfailed": "Pakyas an pag-scan (kodigo $1)",
        "virus-unknownscanner": "diri-nasasabtan nga antivirus:",
        "logouttext": "'''Nakalog-out kana.'''\n\nGinpapasabot ka la nga an iba nga pakli in magpapadayon nga magpakita komo nga ikaw naka-log-in pa, tubtob imo ginlimpyo an imo browser cache.",
+       "cannotlogoutnow-title": "Diri nakakalog-out yana",
+       "cannotlogoutnow-text": "Iton pag-log-out in imposible samtang nagamit hin $1.",
        "welcomeuser": "¡Uswag ngan Dayon, $1!",
        "welcomecreation-msg": "An im akawnt in nahimo na.\nAyaw kalimti pagbalyo han imo [[Special:Preferences|{{SITENAME}} preperensya]].",
        "yourname": "Agnay hit gumaramit:",
        "remembermypassword": "Hinumdumi an akon pan-sakob dinhi nga panngaykay ''(browser)'' (para ha pinakamaiha $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}})",
        "userlogin-remembermypassword": "I-log-in la ako",
        "userlogin-signwithsecure": "Gamit hin koneksyon nga nakakasegurado",
+       "cannotloginnow-title": "Diri nakakalog-in yana",
+       "cannotloginnow-text": "Iton paglog-in in diri posible samtang nagamit hin $1.",
        "yourdomainname": "Imo dominyo:",
        "password-change-forbidden": "Diri ka makakabalyo hin pulong-pagsulod ha dinhi nga wiki.",
        "externaldberror": "Mayda authenticaton database error o diri ka tinutugotan pag-update an imo akwant ha gawas.",
        "wrongpasswordempty": "An tigaman-pagsulod nga ginbutang in waray sulod.\nAlayon pagutro pagbutang.",
        "passwordtooshort": "An tigaman-pagsulod dapat diri maubos hit {{PLURAL:$1|1 nga agi|$1 nga agi}}.",
        "passwordtoolong": "It mga password in diri puydi mas huruhilaba hin {{PLURAL:$1|1 ka karakter|$1 ka mga karakter}}.",
+       "passwordtoopopular": "Iton agsob pinipili nga mga password in diri puydi gamiton. Alayon pagpili hin mas kakaiba nga password.",
        "password-name-match": "An imo tigaman-pagsulod in kinahanglan iba ha imo agnay-hiton-gumaramit.",
        "password-login-forbidden": "An paggamit hini nga agnay-hit-gumaramit ngan tigaman-pagsulod in diri gintutugotan.",
        "mailmypassword": "Ig-reset an tigaman-pagsulod",
        "resetpass_submit": "Igbutang an password ngan log in",
        "changepassword-success": "Malinamposon an pagbal-iw hit imo tigaman-panakob!",
        "changepassword-throttled": "Damo na nga mga paningkamot hin pagsakob an imo ginhimò.\nAlayon paghulat hin $1 san-o ka umutro.",
+       "botpasswords": "Mga bot password",
+       "botpasswords-disabled": "Ginparong an mga bot password.",
+       "botpasswords-no-central-id": "Para han paggamit hin mga bot password, kinahanglan ka maglog-in ha centralized account.",
+       "botpasswords-existing": "Aada nga mga bot password.",
+       "botpasswords-createnew": "Pahimo hin bag-o nga bot password",
+       "botpasswords-editexisting": "Igliwat an aada nga bot password",
+       "botpasswords-label-appid": "Ngaran han bot:",
+       "botpasswords-label-create": "Paghimo",
+       "botpasswords-label-update": "Ig-update",
+       "botpasswords-label-cancel": "Pasagda",
+       "botpasswords-label-delete": "Paraa",
+       "botpasswords-label-resetpassword": "Igreset an password",
+       "botpasswords-label-grants": "Mga applicable grant",
+       "botpasswords-label-restrictions": "Mga gindidiri ha paggamit:",
+       "botpasswords-label-grants-column": "Ginhatag",
+       "botpasswords-bad-appid": "An ngaran han bot nga \"$1\" in diri puydi gamiton.",
+       "botpasswords-insert-failed": "Pakyas han pagdugang han ngaran han bot nga \"$1\". Naidugang na ini?",
+       "botpasswords-update-failed": "Pakyas han pag-update han bot nga ngaran nga \"$1\". Ginpara na ini?",
+       "botpasswords-created-title": "Nahimo an bot password",
+       "botpasswords-created-body": "An bot password nga \"$1\" in malinamposon nga nahimo.",
+       "botpasswords-updated-title": "Gin-update an bot password",
+       "botpasswords-updated-body": "An bot password nga \"$1\" in malinamposon nga na-update.",
+       "botpasswords-deleted-title": "Ginpara an bot password",
+       "botpasswords-deleted-body": "An bot password nga \"$1\" in ginpara.",
+       "botpasswords-newpassword": "An bag-o nga password para han pag log-in han <strong>$1</strong> in <strong>$2</strong>. <em>Alayon igrecord ini para han future reference.</em>",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider in waray dinhi.",
+       "botpasswords-restriction-failed": "An mga restriction han bot password in nagpupugong han pag-login hinin.",
+       "botpasswords-not-exist": "An gumaramit nga \"$1\" in waray bot password nga nakangaran hin \"$2\".",
        "resetpass_forbidden": "Diri mababalyoan an mga tigaman-pagsulod",
        "resetpass-no-info": "Kinahanglan mo paglog-in para direkta ka makasakob dinhi nga pakli.",
        "resetpass-submit-loggedin": "Igbal-iw an tigaman-pagsulod",
        "resetpass-temp-password": "Temporaryo nga tigaman-pagsakob:",
        "resetpass-abort-generic": "Ginpugong an pagbal-iw hin tigaman-panakob hin uska ekstensyon.",
        "resetpass-expired": "Naubosan na hin panahon an im tigaman-pansakob.  Alayon paghimo hin bag-o nga tigaman-pansakob basi ka makasakob.",
+       "resetpass-expired-soft": "An imo password in nag-expire ngan kinahanglan ig-reset. Alayon pagpili hin bag-o nga password yana, kun diri pidlita an \"{{int:resetpass-submit-cancel}}\" para ig-reset nuruniyan.",
+       "resetpass-validity-soft": "Diri puydi gamiton an imo password nga: $1\n\nAlayon pagpili hin bag-o nga password yana, kun diri pidlita an \"{{int:resetpass-submit-cancel}}\" para ig-reset nuruniyan.",
        "passwordreset": "igreset an tigaman-hit-pagsulod",
        "passwordreset-text-one": "Kompletoha ini nga porma paramakareset hin imo tigaman-panakob.",
        "passwordreset-text-many": "{{PLURAL:$1|Butanga it usa nga mga surodlan basi makakarawat ko hin temporaryo nga tigaman-pansulod pinaagi ha email.}}",
        "changeemail-password": "An imo {{SITENAME}} password:",
        "changeemail-submit": "Igbalyo an e-mail",
        "changeemail-throttled": "Nakadamo kada pag-log-in. Alayon paghulat hin $1 ugsa ka umutro.",
+       "changeemail-nochange": "Alayon pagbutang hin lain nga bag-o nga email address.",
        "resettokens": "Igrest an mga token",
        "resettokens-text": "Puydi nimo mareset an mga token para makahatag hin pipira nga pribado nga datos nga may pakahisumpay ha imo akawnt dinhi.\nKinahanglan mo ini buhaton kun aksidenti nim nasaro hira ha iba nga tawo o an imo akawnt in nakompromiso.",
        "resettokens-no-tokens": "Waray token nga marereset.",
        "sig_tip": "Imo pirma nga may-ada marka hin oras",
        "hr_tip": "Patumba nga bagis (hinay-hinay la it paggamit)",
        "summary": "Halipotay nga masisiring:",
-       "subject": "Katukiban:",
+       "subject": "Himangrawan:",
        "minoredit": "Gutiay ini nga pagliwat",
        "watchthis": "Bantayi ini nga pakli",
        "savearticle": "Igtipig an pakli",
        "missingcommenttext": "Alayon pagbutang hin komento ha ilarom.",
        "missingcommentheader": "'''Pahinumdom:''' Waray ka humatag hin subject/headline para hini nga komento.  Kun pinduton mo an \"{{int:savearticle}}\" utro, an imo pagliwat in matitipig bisan waray hini.",
        "summary-preview": "Pahiuna nga pagawas han dalikyat nga pulong:",
-       "subject-preview": "Pahiuna nga pagawas hit himangrawon:",
+       "subject-preview": "Pahiuna nga pagawas hit himangrawan:",
        "blockedtitle": "Ginpugngan ini nga gumaramit",
        "blockedtext": "'''An imo agnay-gumaramit o IP address in ginpugngan.'''\n\nAn pagpugong in ginhimo ni $1.\nAn rason nga ginhatag in ''$2''.\n\n* Pagtikang han pagpugong: $8\n* Paghuman han pagpugong: $6\n* Ginpupugngan: $7\n\nPuydi nimo bilngon hi $1 o iba liwat nga [[{{MediaWiki:Grouppage-sysop}}|magdudumara]] para makipaghimangraw hiunong hini nga pagpugong.\nDiri nimo magagamit an \"ig-email ini nga gumaramit\" nga feature antes may-ada balido nga email address nga nakabutang ha imo  [[Special:Preferences|mga preperensya han akawnt]] ngan waray ka pugngi paggamit hini.\nAn imo IP address yana in $3, ngan an imo pagpugong nga ID in #$5.  Alayon la paglakip han ngatanan nga aada ha igbaw nga mga detalye ha bisan ano nga mga pakiana nga karuyag mo buhaton.",
        "autoblockedtext": "An imo IP address in automatiko nga ginpugngan mahitungod nga ini in gingamit hin iba nga gumaramit, nga ginpugngan ni $1.\n\nAn rason nga ginhatag in ''$2''.\n\n* Pagtikang han pagpugong: $8\n* Paghuman han pagpugong: $6\n* Ginpupugngan: $7\n\nPuydi nimo bilngon hi $1 o iba liwat nga [[{{MediaWiki:Grouppage-sysop}}|magdudumara]] para makipaghimangraw hiunong hini nga pagpugong.\n\nGinpapasabot ka nga diri nimo magagamitan an \"ig-email ini nga gumaramit\" nga feature antes may-ada nimo balido nga email address nga nakarehistro ha imo  [[Special:Preferences|mga preperensya han gumaramit]] ngan waray ka pugngi hit paggamit hini.\n\nAn imo IP address yana in $3, ngan an imo pagpugong nga ID in #$5.  Alayon la paglakip han ngatanan nga aada ha igbaw nga mga detalye ha bisan ano nga mga pakiana nga karuyag mo buhaton.",
        "content-model-text": "yano nga teksto",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Empty object",
+       "content-json-empty-array": "Empty array",
        "post-expand-template-inclusion-warning": "'''Pahimatngon:''' An batakan nga ginlakip in sobra kadako.\nAn iba nga mga batakan in diri mauupod.",
        "post-expand-template-inclusion-category": "Mga pakli kun diin an mga nahilalakip nga kadako han batakan in nalabaw.",
        "post-expand-template-argument-warning": "'''Pahimatngaon:''' Ini nga pakli in nagsusulod hin pinakaguti usa nga argumento hin batakan nga may-ada sobra nga dako it padako nga kadako.\nIni nga mga argumento in ginlaktawan.",
        "history-feed-empty": "An imo ginpaalayon nga pakli in waray dida.\nBangin ini napara tikang ha wiki, o ginngaranan hin iba.\n\n[[Special:Search|pamilnga ha wiki]] para han may pagkahisumpay nga bag-o nga pakli.",
        "rev-deleted-comment": "(gintanggal an halipotay nga masisiring hiton pagliwat)",
        "rev-deleted-user": "(gintanggal an agnay hiton gumaramit)",
-       "rev-deleted-event": "(gintanggal an talaan han mga buhat)",
+       "rev-deleted-event": "(gintanggal an mga detalye han log)",
        "rev-deleted-user-contribs": "[gintanggal an agnay-hit-gumaramit o IP address - an pagliwat in gintago tikang han mga amot]",
        "rev-deleted-text-permission": "Ini nga rebisyon han pakli in '''ginpara'''.\nAn mga detalye in mabibilngan ha [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
        "rev-suppressed-no-diff": "Diri mo makikita ini nga kaibhan tungod nga usa ha mga rebisyon in '''ginpara'''.",
        "revdelete-show-file-submit": "Oo",
        "revdelete-hide-text": "Rebisyon nga sinurat",
        "revdelete-hide-image": "Tagoon an sulod han paypay",
-       "revdelete-hide-name": "Tagoon an buhat ngan kakadtoan",
+       "revdelete-hide-name": "Tagoon an target ngan mga parameter",
        "revdelete-hide-comment": "Halipotay nga masisiring hiton pagliwat",
+       "revdelete-hide-user": "An kanan magliliwat ngaran-gumaramit/IP address",
        "revdelete-radio-same": "(ayaw balyu-e)",
        "revdelete-radio-set": "Tinago",
        "revdelete-radio-unset": "Nakikit-an",
        "rows": "Mga rumbay pahigda:",
        "columns": "Mga rumbay patindog:",
        "searchresultshead": "Bilnga",
+       "stub-threshold-sample-link": "pananglitan",
        "stub-threshold-disabled": "Waray ginpagana",
        "recentchangesdays": "Kadamo hin adlaw nga igpapakita an mga kabag-ohan:",
        "recentchangesdays-max": "Pinakadamo $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}}",
        "prefs-i18n": "Internasyonalisasyon",
        "prefs-signature": "Pirma",
        "prefs-dateformat": "Batakan han petsa",
+       "prefs-timeoffset": "Time offset",
        "prefs-advancedediting": "Mga kasahiran nga pagpipilian",
+       "prefs-editor": "Editor",
        "prefs-preview": "Pahiuna nga pakita",
        "prefs-advancedrc": "Abansado nga mga pagpipilian",
        "prefs-advancedrendering": "Abansado nga mga pagpipilian",
        "right-userrights-interwiki": "Igliwat an mga katungod han gumaramit han mga gumaramit ha iba nga mga wiki",
        "right-siteadmin": "Igtrangka ngan igrangka an database",
        "right-sendemail": "Padad-i hin e-mail ngada ha iba nga mga gumaramit",
+       "grant-group-email": "Padangat hin email",
+       "grant-createaccount": "Pahimo hin mga account",
+       "grant-createeditmovepage": "Paghimo, pagliwat, ngan pagbalhin hin mga pakli",
+       "grant-delete": "Pagpara hin mga pakli, mga rebisyon, ngan mga iginsulod ha log",
        "newuserlogpage": "Talaan han paghimo hin gumaramit",
        "newuserlogpagetext": "Ini an talaan han mga nagkahihimo nga mga gumaramit.",
        "rightslog": "Talaan hin mga katungod han gumaramit",
        "uploadbtn": "Igkarga an file",
        "reuploaddesc": "Undanga an pagkarga-pasaka ngan balik ngadto ha porma han pagkarga-pasaka",
        "uploadnologin": "Diri nakalog-in",
+       "uploadnologintext": "Alayon $1 para han pag-upload han mga file.",
        "uploaderror": "Sayop hit pagkarga-pasaka",
        "upload-recreate-warning": "'''Pahimatngon:  An fayl nga may-ada hiton nga ngaran in ginpara o ginbalhin.'''\n\nAn taramdan han pagpara ngan pagbalhin para hini nga pakli in ginhahatag para han imo kamurayaw:",
        "upload-permitted": "Gintutugotan nga mga klase han paypay: $1.",
        "upload-description": "Pangilal-an han paypay",
        "upload-options": "Mga pirilion han pagkarga paigbaw",
        "watchthisupload": "Bantayi ini nga paypay",
-       "upload-success-subj": "Malinamposan an imo pagkarga-paigbaw.",
-       "upload-success-msg": "An imo pagkarga-paigbaw tikang ha [$2] in malinamposon.  Ini in aada dinhi: [[:{{ns:file}}:$1]]",
-       "upload-failure-subj": "May-ada problema an pagkarga-paigbaw",
-       "upload-failure-msg": "May-ada problema an imo pagkarga-paigbaw tikang ha [$2]:\n\n$1",
-       "upload-warning-subj": "Pahimatngon han pagkarga paigbaw",
        "upload-proto-error": "Sayop nga protocol",
        "upload-file-error": "Sayop ha sulod",
        "upload-misc-error": "Waray kasasabti nga sayop hin pagkarga-paigbaw",
        "foreign-structured-upload-form-label-own-work": "Buhat ko ini",
        "foreign-structured-upload-form-label-infoform-categories": "Mga kategorya",
        "foreign-structured-upload-form-label-infoform-date": "Petsa",
+       "foreign-structured-upload-form-2-label-intro": "Salamat hit pagdonar hin imahe nga gagamiton ha {{SITENAME}}. Dapat mo la igpadayon kun may ada ini hin pipira nga kondisyones:",
+       "foreign-structured-upload-form-2-label-ownwork": "Dapat an kabug-osan in  <strong>imo hinimo</strong>, diri la kinuha ha Internet",
+       "foreign-structured-upload-form-2-label-noderiv": "Dapat nagsusulod ini hin <strong>waray binuhat hit iba nga tawo</strong>, o inspirado tikang ha ira",
+       "foreign-structured-upload-form-2-label-useful": "Dapat ini <strong>educational nga mahihigamitan</strong> hit pagtudlo ha iba",
+       "foreign-structured-upload-form-2-label-ccbysa": "Dapat ini <strong>OK mahipatik hin kanunay</strong> ha Internet ha ilarom han [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] nga lisensya",
+       "foreign-structured-upload-form-2-label-alternative": "Kun diri ngatanan nga aada ha igbaw tinuod, puydi ka la gihapon maka-upload hini nga file nga nagamit han[https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard], basta la ini mapapailarom han free license.",
+       "foreign-structured-upload-form-3-label-yes": "Oo",
+       "foreign-structured-upload-form-3-label-no": "Diri",
        "backend-fail-notexists": "Waray ngada an paypay nga $1.",
        "backend-fail-delete": "Diri nakakapara han paypay nga \"$1\".",
        "backend-fail-alreadyexists": "May-ada na paypay nga \"$1\".",
        "license": "Palilisensya:",
        "license-header": "Palilisensya:",
        "nolicense": "Waray napili",
+       "listfiles-delete": "igpara",
+       "listfiles-summary": "Ini nga pinaurog nga pakli in nagpapakita han ngatanan nga pinan-upload nga mga file.",
+       "listfiles_search_for": "Pamiling hin media nga ngaran:",
        "imgfile": "paypay",
        "listfiles": "Listahan han fayl",
        "listfiles_date": "Pitsa",
        "listfiles_user": "Nagamit",
        "listfiles_size": "Kadako",
        "listfiles_count": "Mga bersyon",
+       "listfiles-latestversion": "Bersyon yana",
        "listfiles-latestversion-yes": "Oo",
        "listfiles-latestversion-no": "Diri",
        "file-anchor-link": "Paypay",
        "unusedtemplates": "Waray kagamiti nga mga batakan",
        "unusedtemplateswlh": "iba nga mga sumpay",
        "randompage": "Bisan ano nga pakli",
+       "randomincategory-submit": "Kadto-a",
        "randomredirect": "Bisan ano la nga redirect",
        "randomredirect-nopages": "Waray mga redirecta ha ngaran-lat'ang nga \"$1\".",
        "statistics": "Mga estadistika",
        "usereditcount": "$1 {{PLURAL:$1|ka pagliwat|ka mga pagliwat}}",
        "usercreated": "{{GENDER:$3|Ginhimo}} han $1 ha $2",
        "newpages": "Bag-o nga mga pakli",
+       "newpages-submit": "Igpakita",
        "newpages-username": "Agnay hiton gumaramit:",
        "ancientpages": "Mga gidaani nga pakli",
        "move": "Balhina",
        "nopagetitle": "Waray sugad hito nga kakadtoan nga pakli",
        "pager-newer-n": "{{PLURAL:$1|burubag-o 1|burubag-o $1}}",
        "pager-older-n": "{{PLURAL:$1|durudaan 1|durudaan $1}}",
+       "apisandbox-unfullscreen": "Igpakita an pakli",
+       "apisandbox-submit": "Paghimo hin request",
+       "apisandbox-reset": "Hawana",
+       "apisandbox-retry": "Utroha",
+       "apisandbox-helpurls": "Mga sumpay hit pabulig",
+       "apisandbox-examples": "Mga pananglitan",
+       "apisandbox-dynamic-parameters": "Dugang nga mga parameter",
+       "apisandbox-dynamic-parameters-add-label": "Dugngi hin parameter:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Ngaran hit parameter",
+       "apisandbox-dynamic-error-exists": "May-ada na nakangaran nga \"$1\" nga parameter.",
+       "apisandbox-results": "Mga resulta",
        "booksources": "Mga libro nga tinikangan",
        "booksources-search-legend": "Pamilnga an mga libro nga gintikangan",
        "booksources-search": "Bilnga",
        "notvisiblerev": "An urhi nga pagliwat han iba nga gumaramit in ginpara",
        "watchlist-details": "{{PLURAL:$1|$1 nga pakli|$1 nga mga pakli}} nga aada ha imo talaan nga binabantayan, diri bulag nga paglakip han mga hiruhimangraw-nga-pakli.",
        "wlshowlast": "Igpakita an katapusan nga $1 nga mga oras $2 nga mga adlaw",
-       "watchlistall2": "ngatanan",
+       "watchlist-hide": "Tago-a",
+       "watchlist-submit": "Pakit-a",
+       "wlshowhideminor": "gudti nga mga pagliwat",
+       "wlshowhidebots": "Mga bot",
+       "wlshowhideliu": "Mga nakarehistro nga gumaramit",
+       "wlshowhideanons": "Mga waray magpakilala nga gumaramit",
+       "wlshowhidepatr": "Nakapatrolya na nga mga pagliwat",
+       "wlshowhidemine": "ako mga pagliwat",
        "watchlist-options": "Mga pirilian han talaan han binabantayan",
        "watching": "Ginbabantay...",
        "unwatching": "Diri na ginbabantay...",
        "protect-othertime-op": "lain nga oras",
        "protect-otherreason": "Lain/dugang nga katadongan:",
        "protect-otherreason-op": "Lain nga katadongan",
+       "protect-expiry-options": "1 ka oras:1 hour,1 ka adlaw:1 day,1 ka semana:1 week,2 ka mga semana:2 weeks,1 ka bulan:1 month,3 ka mga bulan:3 months,6 ka mga bulan:6 months,1 ka tuig:1 year, waray kataposan:infinite",
        "restriction-type": "Pagtugot:",
        "minimum-size": "Pinakaguti nga kadako",
        "maximum-size": "Pinakadako nga kadako:",
        "whatlinkshere-hidelinks": "$1 an mga sumpay",
        "whatlinkshere-hideimages": "$1 an mga sumpay han paypay",
        "whatlinkshere-filters": "Mga panara",
+       "whatlinkshere-submit": "Kadto-a",
        "block": "Pugngi an gumaramit",
        "blockip": "Pugngi an gumaramit",
        "blockip-legend": "Pugngi an gumaramit",
        "allmessages-filter-all": "Ngatanan",
        "allmessages-language": "Yinaknan:",
        "allmessages-filter-submit": "Kadto-a",
+       "allmessages-filter-translate": "Ighubad",
        "thumbnail-more": "Padako-a",
        "filemissing": "Nawawara an fayl",
        "thumbnail_error": "Sayo han paghihimo hin thumbnail: $1",
+       "thumbnail_error_remote": "Sayop nga mensahe tikang $1:\n$2",
        "thumbnail_image-type": "An klase han hulagway in diri suportado",
        "import": "Naangbit hit mga pakli",
        "import-interwiki-templates": "Lakip an ngatanan nga mga batakan",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|gumaramit|mga gumaramit}} $1",
        "simpleantispam-label": "Anti-spam check.\n<strong>Ayaw</strong> pagbinutangi dinhi!",
        "pageinfo-title": "Impormasyon para \"$1\"",
+       "pageinfo-not-current": "Pasaylo-a, imposible makahatag hin impormasyon hiunong han mga daan nga rebisyon.",
        "pageinfo-header-basic": "Panguna nga pananabotan",
        "pageinfo-header-edits": "Kaagi han pagliwat",
        "pageinfo-header-restrictions": "Panalipod han pakli",
        "pageinfo-edits": "Ngatanan nga ihap han mga pakli",
        "pageinfo-toolboxlink": "Impormasyon han pakli",
        "pageinfo-redirectsto": "Igredirect ngadto ha",
+       "pageinfo-redirectsto-info": "info",
        "pageinfo-contentpage": "Ginlakip komo uska unod nga pakli",
        "pageinfo-contentpage-yes": "Oo",
        "pageinfo-protect-cascading-yes": "Oo",
        "pageinfo-category-info": "Impormasyon han kaarangay",
+       "pageinfo-category-total": "Ngatanan nga mga naka-api.",
        "pageinfo-category-pages": "Ihap han mga pakli",
        "pageinfo-category-subcats": "Ihap han mga ubos-kaarangay",
        "pageinfo-category-files": "Ihap han mga paypay",
        "bydate": "pinaagi han petsa",
        "ago": "$1 an nakalabay",
        "just-now": "yana pala",
+       "monday-at": "Lunes ha $1",
+       "tuesday-at": "Martes ha $1",
+       "wednesday-at": "Miyerkules ha $1",
+       "thursday-at": "Huybes ha $1",
+       "friday-at": "Biyernes ha $1",
+       "saturday-at": "Sabado ha $1",
+       "sunday-at": "Dominggo ha $1",
+       "yesterday-at": "Kakulop ha $1",
        "bad_image_list": "An kabutangan in masunod:\n\nAn nakatalala la nga mga butang (mga bagis nga nagtitikang hin *) in mahiuupod paglabot.\nAn syahan nga sumpay ha uska bagis in dapat may-ada sumpay ngadto ha maraot nga fayl.\nAn bisan ano nga masunod nga mga sumpay ha kapareho nga bagis in igtratrato nga eksepsyon, sugad hin, mga pakli kun diin an mga fayl in puydi mabubutang ha sulod han bagis.",
        "metadata": "Metadata",
        "metadata-help": "Iní nga paypay mayda dugang nga pagpasabot, nga bangin gindugáng tikang han digital nga camera o iskaner nga gin-gamit paghimo o pag-digitar hini.\nKon an paypay ginliwat tikang han orihinal nga kamutangan, mayda mga detalye nga bangin diri magpakita han ginliwat nga paypay",
        "exif-model": "Modelo han kamera",
        "exif-software": "Software nga gingamit",
        "exif-artist": "Tag-iya",
+       "exif-copyright": "May katungod han copyright",
        "exif-exifversion": "Version han Exif",
        "exif-colorspace": "Kolor lat-ang",
        "exif-datetimeoriginal": "Petsa ngan oras han data generation",
        "exif-datetimereleased": "Ginpagawas han",
        "exif-lens": "Mga lente nga gingamit",
        "exif-cameraownername": "Tag-iya han kamera",
+       "exif-copyrighted": "Kahimtang han copyright",
+       "exif-copyrightowner": "Tag-iya han copyright",
        "exif-usageterms": "Mga termino hit paggamit",
        "exif-copyrighted-false": "Status hin katungod-hin-panag-iya waray mahabutang",
        "exif-unknowndate": "Waray kasabti an petsa",
index ed1b46a..ac7f944 100644 (file)
        "badarticleerror": "呒处垃拉箇只页面进行箇只操作。",
        "cannotdelete": "无处删除页面或图像 \"$1\"。\n渠作兴已经拨别人家删除脱哉。",
        "cannotdelete-title": "\"$1\"箇页删弗爻",
-       "delete-hook-aborted": "删除畀钩子取消。\n渠弗曾畀出解释。",
+       "delete-hook-aborted": "删除畀扩展钩子中止。渠弗曾畀出解释。",
        "no-null-revision": "\"$1\"页呒处建新个修改",
        "badtitle": "坏标题",
        "badtitletext": "所请求页面个标题是无效个、弗存在,跨语言或跨wiki链接个标题错误。渠作兴包含一只或多只弗好用拉标题里向字符。",
        "virus-unknownscanner": "未知个反病毒扫描器:",
        "logouttext": "<strong>侬已经登出哉。</strong>\n\n请注意有星页面作兴还是会得搭侬登出前头一样显示,一脚到侬个浏览器缓存清脱为止。",
        "welcomeuser": "走来赞,$1!",
-       "welcomecreation-msg": "你个账号建起来哉。\n覅忘记哉走去改你个[[Special:Preferences|{{SITENAME}}个私人偏好]]。",
+       "welcomecreation-msg": "倷个账号建立好哉。倷可以更改自家个{{SITENAME}}[[Special:Preferences|偏好设定]]。",
        "yourname": "用户名:",
        "userlogin-yourname": "用户名",
        "userlogin-yourname-ph": "打进侬个用户名",
        "noemailcreate": "侬要提供只有效个电子邮件地址",
        "passwordsent": "用户\"$1\"个新密码已经寄往登记个电子邮件地址。\n请收着仔再登录。",
        "blocked-mailpassword": "侬个IP地址处于查封状态,弗允许编辑,为仔安全起见,密码恢复功能已经禁用。",
-       "eauthentsent": "一封确认信已经发送到指定个电子邮箱地址。\nå\9e\83æ\8b\89å\85¶å®\83é\82®ä»¶å\8f\91é\80\81å\88°ç®\87å\8fªè´¦æ\88·ä¹\8bå\89\8dï¼\8c侬å¿\85é¡»é¦\96å\85\88æ\8c\89ç\85§ç®\87å°\81ä¿¡é\87\8cå\90\91个æ\8c\87示ï¼\8c确认ç®\87å\8fªé\82®ç®±ç\9c\9få®\9eæ\9c\89æ\95\88ã\80\82",
+       "eauthentsent": "一封确认信已经发送到指定个电子邮箱地址。å\9e\83æ\8b\89å\85¶ä»\96é\82®ä»¶å\8f\91é\80\81å\88°æ\9c¬è´¦å\8f·ä¹\8bå\89\8dï¼\8c侬å¿\85é¡»é¦\96å\85\88æ\8c\89ç\85§ç®\87å°\81ä¿¡é\87\8cå\90\91个æ\8c\87示ï¼\8c确认ç®\87å\8fªé\82®ç®±ç\9c\9få®\9eæ\9c\89æ\95\88ã\80\82",
        "throttled-mailpassword": "密码转设电子信徕最近$1个钟头里发畀你侬哉。保险点,密码转设电子信$1个钟头只一垡好发。",
        "mailerror": "发送邮件错误:$1",
        "acct_creation_throttle_hit": "弗好意思,使用箇只IP个访客已经创建仔$1只账号,迭个是箇段辰光里向所允许个最大值。箇咾使用箇只IP个地址个访客暂时弗好再创建账户。",
        "accmailtitle": "密码已发送哉。",
        "accmailtext": "已经为[[User talk:$1|$1]]产生只随机密码,并且已经发送到$2。登录之后,侬可以垃拉<em>[[Special:ChangePassword|箇只页面]]</em>更改密码。",
        "newarticle": "(新)",
-       "newarticletext": "倷跟仔链接来着一个还弗勒里个页面。\n要创建该页面呢,就勒下底个框框里向开始写([$1 帮助页面]浪有更加多个信息)。\n要是倷是弗用心到该搭个说话,只要点击倷浏览器个'''返回'''揿钮。",
+       "newarticletext": "倷跟著链接来着一个还弗勒里个页面。要创建该页面呢,就勒下底个框里向开始写([$1 帮助页面]浪有更加多个信息)。要是倷是弗用心到该𡍲个说话,请点击浏览器个<strong>返回</strong>揿钮。",
        "anontalkpagetext": "---- ''箇是一个还弗曾建立账户个匿名用户个讨论页, 箇咾我伲只好用IP地址来搭渠联络。该IP地址可能由几名用户共享。如果侬是一名匿名用户并认为箇只页面高头个评语搭侬弗搭界,请 [[Special:UserLogin/signup|创建新账户]]或[[Special:UserLogin|登录]]来避免垃拉将来搭其他匿名用户混淆。''",
        "noarticletext": "箇只页面目前呒没文本。侬可以垃拉其他页面高头[[Special:Search/{{PAGENAME}}|寻该只标题]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 寻相关日志]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 编辑此页]</span>。",
        "noarticletext-nopermission": "箇只页面目前还呒不文本。侬好来别个页面[[Special:Search/{{PAGENAME}}|寻箇页标题]],或者<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 寻相关日志]</span>,但必过侬呒不权限建立箇只页面。",
        "previewconflict": "箇个预览显示了上头文字编辑区里向个内容。渠会得垃拉侬保存之后出现。",
        "session_fail_preview": "'''弗好意思!由于会话数据落失,我伲弗好处理侬个编辑。'''请重试。如果再次失败,请尝试[[Special:UserLogout|登出]]之后重新登录。",
        "session_fail_preview_html": "'''弗好意思!我伲弗好处理侬垃拉进程数据落失辰光个编辑。'''\n\n''由于{{SITENAME}}允许使用原始个 HTML,为著防范 JavaScript 攻击,预览已畀隐藏。''\n\n'''如果这是一次合法的编辑,请重新进行尝试。'''如果还不行,请 [[Special:UserLogout|退出]]并重新登录。",
-       "token_suffix_mismatch": "'''由于侬用户端里向个编辑令牌毁损仔一些标点符号字元,为防止编辑个文字损坏,侬个编辑已经畀回头。'''\n箇种情况通常出现垃拉使用含有交关bug、以网络为主个匿名代理服务个辰光。",
+       "token_suffix_mismatch": "<strong>由于侬用户端里向个编辑令牌毁损仔一些标点符号字元,为防止编辑个文字损坏,侬个编辑已经畀回头。</strong>箇种情况通常出现垃拉使用含有交关bug、以网络为主个匿名代理服务个辰光。",
        "editing": "来里编写$1",
        "creating": "创建“$1”",
        "editingsection": "来里编辑$1(段落)",
        "edit-no-change": "侬个编辑畀忽略,因为文本弗曾有改动。",
        "postedit-confirmation-created": "页面已创建。",
        "postedit-confirmation-restored": "页面已恢复。",
-       "postedit-confirmation-saved": "侬个编辑已保存。",
+       "postedit-confirmation-saved": "倷个编辑已经保存哉。",
        "edit-already-exists": "弗好创建新页面。\n已经有垃许。",
        "defaultmessagetext": "默认消息文本",
        "invalid-content-data": "无效内容数据",
        "grant-createaccount": "建立账号",
        "grant-createeditmovepage": "建立、编辑搭著捅荡页面",
        "grant-rollback": "畀修改擂轉到頁面",
-       "grant-sendemail": "發電子信畀各許用戶",
+       "grant-sendemail": "发电子邮件畀其他用户",
        "newuserlogpage": "用户创建日志",
        "newuserlogpagetext": "箇是用户创建个记录。",
        "rightslog": "用户权限日志",
        "filestatus": "版权状态:",
        "filesource": "来源:",
        "ignorewarning": "弗管警告,随便哪亨要保存文件。",
-       "ignorewarnings": "任何警告都弗管",
+       "ignorewarnings": "忽略所有警告",
        "minlength1": "文件名至少一個字。",
        "illegalfilename": "“$1”文件名裏有嘸處當頁題目個字。文件名轉改再傳上來試試相。",
        "filename-toolong": "文件名嘸處比240字節長。",
        "nolinkstoimage": "呒不页面链接到该只文件。",
        "linkstoimage-redirect": "$1(文件轉戳到)$2",
        "sharedupload": "箇只文件来源于$1,渠作兴垃拉其它项目当中拨应用。",
-       "sharedupload-desc-here": "箇文件$1里个,作兴会畀别个项目使用。\n渠个[$2 描述页]里个说明显示如下。",
+       "sharedupload-desc-here": "箇文件$1里个,作兴会畀别个项目使用。渠个[$2 描述页]里个说明显示如下。",
        "uploadnewversion-linktext": "上载该文件个新版",
        "upload-disallowed-here": "你弗可以覆盖伊只文件。",
        "filerevert": "恢复$1",
        "newpages": "新页",
        "newpages-username": "用户名:",
        "ancientpages": "顶顶老个页面",
-       "move": "移å\88°",
+       "move": "移å\8a¨",
        "movethispage": "捅该只页面",
        "pager-newer-n": "新$1次",
        "pager-older-n": "旧$1次",
        "rollbackfailed": "恢复失败",
        "cantrollback": "弗好恢复编辑;阿末个贡献人是本页唯一个作者。",
        "alreadyrolled": "恢复弗落[[User:$2|$2]]([[User talk:$2|讲张]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])对[[:$1]]个编辑,其他人已经编辑歇或恢复过该个页面。\n\n最后编辑者是[[User:$3|$3]]([[User talk:$3|讲张]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])。",
-       "revertpage": "取消[[Special:Contributions/$2|$2]]([[User talk:$2|讲张]])个改动;恢复到[[Special:Contributions/$1|$1]]个阿末只版本",
+       "revertpage": "取消[[Special:Contributions/$2|$2]]([[User talk:$2|讲张]])个改动;恢复到[[User:$1|$1]]个阿末只版本",
        "protectlogpage": "保护日志",
        "protectedarticle": "保护“[[$1]]”",
        "modifiedarticleprotection": "“[[$1]]”个保护等级改好哉",
        "unlockbtn": "數據庫開鎖",
        "databasenotlocked": "數據庫朆鎖牢。",
        "move-page-legend": "页面捅荡",
-       "movepagetext": "用下底个表会重命名一只页面,全部历史侪移到新名字里。老个名字会变成戳到新名字个重定向页。注意检查[[Special:DoubleRedirects|双重重定向]]或者[[Special:BrokenRedirects|坏脱个重定向]]。倷有实概个责任,让链接仍旧链到俚笃应该链到个场化去。\n\n注意,如果新名字归面搭已经有页面个说话,老名字个页面'''弗'''会畀移动,除非归个是只空页面或者是只重定向并且呒不编辑历史。箇也就是讲,假使倷犯错误个说话,倷好拿一只重命名过个页面还原到原来个名字,但倷弗好覆盖一只已经来上个页面。\n\n<strong>警告!</strong>箇呒数会引起对一只热门页面剧烈个、想弗着个改变。来操作前头请倷确定倷已经充分了解行为个后果。",
+       "movepagetext": "用下底个表会重命名一只页面,全部历史侪移到新名字里。老个名字会变成戳到新名字个重定向页。注意检查[[Special:DoubleRedirects|双重重定向]]或者[[Special:BrokenRedirects|坏脱个重定向]]。倷有实概个责任,让链接仍旧链到俚笃应该链到个场化去。\n\n注意,如果新名字归面𡍲已经有页面个说话,老名字个页面<strong>弗会</strong>畀移动,除非归个是只空页面或者是只重定向并且呒不编辑历史。箇也就是讲,假使倷犯错误个说话,倷好拿一只重命名过个页面还原到原来个名字,但倷弗好覆盖一只已经来上个页面。\n\n<strong>注意:</strong>箇呒数会引起对一只热门页面剧烈个、想弗着个改变。来操作前头请倷确定倷已经充分了解行为个后果。",
        "movepagetalktext": "如果侬勾选此框,相关讨论页会自动移动到新标题,除非箇𡍲已经有著一只非空个讨论页。\n\n来箇种情况下底,如果有需要,侬必须手工移动或合并页面。",
        "movenologintext": "倷板定要是注册用户并且[[Special:UserLogin|登录]]著才好拿页面捅荡。",
        "newtitle": "新标题:",
        "filemissing": "文件寻弗着哉",
        "tooltip-pt-userpage": "{{GENDER:|侬个用户}}页",
        "tooltip-pt-mytalk": "{{GENDER:|侬}}个讨论页",
+       "tooltip-pt-anontalk": "有关箇只IP地址编辑个讨论",
        "tooltip-pt-preferences": "{{GENDER:|侬}}个设置",
        "tooltip-pt-watchlist": "监控修改页面列表",
        "tooltip-pt-mycontris": "{{GENDER:|侬}}个贡献列表",
+       "tooltip-pt-anoncontribs": "箇只IP地址个编辑清单",
        "tooltip-pt-login": "鼓励大家登录进来,不过也弗是板定要求",
        "tooltip-pt-logout": "登出",
        "tooltip-pt-createaccount": "建议你建立一个账号并登录,但必过箇弗是板要个",
        "tooltip-ca-nstab-category": "望分类页",
        "tooltip-minoredit": "标作小编写",
        "tooltip-save": "保存侬个修改",
-       "tooltip-preview": "预览侬个改变。保存前头请检查一遍。",
+       "tooltip-preview": "预览倷个更改。请勒拉保存前头用用俚。",
        "tooltip-diff": "显示侬对文本个修改",
        "tooltip-compareselectedversions": "查看本页面两只选定个修订版个差异。",
        "tooltip-watch": "拿箇页加到侬个关注表里",
        "tooltip-summary": "打进短摘要",
        "interlanguage-link-title": "̩$1 - $2",
        "anonymous": "{{SITENAME}}上个匿名{{PLURAL:$1|用户}}",
-       "simpleantispam-label": "反垃圾检查。\n<strong>覅</strong>加进伊个!",
+       "simpleantispam-label": "反垃圾检查。<strong>弗要</strong>填伊个!",
        "pageinfo-toolboxlink": "页面信息",
        "deletedrevision": "拨删脱个旧修订 $1",
        "previousdiff": "←老版",
        "logentry-newusers-create": "用户账号$1畀{{GENDER:$2|创建}}",
        "logentry-newusers-create2": "用户账号$3畀$1{{GENDER:$2|创建}}",
        "logentry-newusers-autocreate": "用户账号$1畀自动{{GENDER:$2|创建}}",
+       "logentry-rights-rights": "$1{{GENDER:$2|更改}}$3个用户组从$4到$5",
        "logentry-upload-upload": "$1{{GENDER:$2|上传}}$3",
        "rightsnone": "(呒)",
        "revdelete-summary": "编辑摘要",
index f2d5814..9df5f5e 100644 (file)
        "previewnote": "<strong>请记住这只是预览。</strong>\n您的更改还没有保存!",
        "continue-editing": "前往编辑区",
        "previewconflict": "该预览反映了上面文字编辑区中的文字在你保存后的显示状况。",
-       "session_fail_preview": "<strong>对不起!由于会话数据丢失,我们无法处理您的编辑。</strong>\n请重试。如果仍然失败,请尝试[[Special:UserLogout|退出登录]]后重新登录。",
-       "session_fail_preview_html": "<strong>对不起!由于会话数据丢失,我们无法处理您的编辑。</strong>\n\n<em>因为{{SITENAME}}已启用原始HTML,为了预防JavaScript攻击,预览被隐藏。</em>\n\n<strong>如果该编辑尝试合法,请重试。</strong>如果仍然失败,请尝试[[Special:UserLogout|退出登录]]后重新登录。",
+       "session_fail_preview": "对不起!由于会话数据丢失,我们无法处理您的编辑。\n\n您可能已经退出。<strong>请核实您是否仍在登录,并重试</strong>。\n如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
+       "session_fail_preview_html": "对不起!由于会话数据丢失,我们无法处理您的编辑,\n\n<em>因为{{SITENAME}}已启用原始HTML,为了预防JavaScript攻击,预览被隐藏。</em>\n\n<strong>如果该编辑尝试合法,请重试。</strong>\n如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
        "token_suffix_mismatch": "<strong>由于您客户端中的编辑令牌毁损了一些标点符号字符,您的编辑已经被拒绝。</strong>\n此次编辑被拒绝以防止页面文本损坏。\n这种情况通常在您使用含有故障的网页式匿名代理服务的时候出现。",
        "edit_form_incomplete": "<strong>编辑表格的某些部分没有到达服务器,请检查您的编辑是否完整并重试。</strong>",
        "editing": "编辑“$1”",
        "sectioneditnotsupported-title": "段落编辑不支持",
        "sectioneditnotsupported-text": "本页面不支持段落编辑。",
        "permissionserrors": "权限错误",
-       "permissionserrorstext": "å\9b ä¸ºä»¥ä¸\8b{{PLURAL:$1|å\8e\9få\9b }}ï¼\8cæ\82¨æ²¡æ\9c\89æ\9d\83é\99\90è¿\9bè¡\8c该æ\93\8dä½\9c:",
+       "permissionserrorstext": "å\9b ä¸ºä»¥ä¸\8b{{PLURAL:$1|å\8e\9få\9b }}ï¼\8cæ\82¨æ²¡æ\9c\89æ\9d\83é\99\90è¿\99æ ·å\81\9a:",
        "permissionserrorstext-withaction": "因为以下{{PLURAL:$1|原因}},您没有权限$2:",
        "contentmodelediterror": "您不能编辑此修订版本,因为它的内容模型是<code>$1</code>,这与当前页面<code>$2</code>的内容模型不同。",
        "recreate-moveddeleted-warn": "<strong>警告:您正在重新创建曾经被删除的页面。</strong>\n\n您应该考虑继续编辑本页是否合适。这里提供本页的删除和移动日志以供参考:",
        "mergehistory-empty": "没有可以合并的版本。",
        "mergehistory-done": "$1的$3个{{PLURAL:$3|版本}}{{PLURAL:$3|已}}成功合并至[[:$2]]。",
        "mergehistory-fail": "不可以进行历史合并,请重新检查该页面以及时间参数。",
+       "mergehistory-fail-bad-timestamp": "时间戳无效。",
+       "mergehistory-fail-invalid-source": "来源页面无效。",
+       "mergehistory-fail-invalid-dest": "目标页面无效。",
+       "mergehistory-fail-no-change": "历史合并未合并任何修订版本。请重新检查页面和时间参数。",
+       "mergehistory-fail-permission": "没有足够权限合并历史。",
+       "mergehistory-fail-self-merge": "来源页面与目标页面相同。",
+       "mergehistory-fail-timestamps-overlap": "来源修订版本重复,或在目标修订版本之后出现。",
        "mergehistory-fail-toobig": "由于超出$1的限制而无法执行历史合并,$1个版本将被移动。",
        "mergehistory-no-source": "来源页面$1不存在。",
        "mergehistory-no-destination": "目的页面$1不存在。",
        "import-nonewrevisions": "没有导入版本(所有都已存在或因错误跳过)。",
        "xml-error-string": "$1于行$2,列$3($4字节):$5",
        "import-upload": "上传XML数据",
-       "import-token-mismatch": "会话数据遗失。请重试。",
+       "import-token-mismatch": "会话数据丢失。\n\n您可能已经退出。<strong>请核实您是否仍在登录,并重试</strong>。\n如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
        "import-invalid-interwiki": "不能从指定的wiki导入。",
        "import-error-edit": "页面“$1”未导入,因为您不被允许编辑它。",
        "import-error-create": "页面“$1”未导入,因为您不被允许创建它。",
        "expand_templates_generate_xml": "显示XML语法树",
        "expand_templates_generate_rawhtml": "显示原始HTML",
        "expand_templates_preview": "预览",
-       "expand_templates_preview_fail_html": "<em>因为{{SITENAME}}启用了Raw HTML并且丢失了会话数据,预览被隐藏以防止JavaScript攻击。</em>\n\n<strong>如果这是合法的预览尝试,请再次重试。</strong>\n如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录。",
+       "expand_templates_preview_fail_html": "<em>因为{{SITENAME}}启用了Raw HTML并且丢失了会话数据,预览被隐藏以防止JavaScript攻击。</em>\n\n<strong>如果这是合法的预览尝试,请再次重试。</strong>\n如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
        "expand_templates_preview_fail_html_anon": "<em>因为{{SITENAME}}启用了Raw HTML并且丢失了会话数据,预览被隐藏以防止JavaScript攻击。</em>\n\n<strong>如果这是合法的预览尝试,请尝试[[Special:UserLogin|登录]]并重试。</strong>",
        "expand_templates_input_missing": "您需要提供至少一些输入文本。",
        "pagelanguage": "更改页面语言",
index 8c9a580..f2f92c9 100644 (file)
@@ -67,7 +67,8 @@
                        "Matma Rex",
                        "范",
                        "Jasonzhuocn",
-                       "Bowleerin"
+                       "Bowleerin",
+                       "飞舞回堂前"
                ]
        },
        "tog-underline": "底線標示連結:",
        "badaccess": "權限錯誤",
        "badaccess-group0": "系統不允許您執行這項操作。",
        "badaccess-groups": "您請求的操作只有{{PLURAL:$2|這個|這些}}群組的使用者能使用:$1",
-       "versionrequired": "需使用 MediaWiki $1 版",
+       "versionrequired": "需要 $1 版本的 MediaWiki",
        "versionrequiredtext": "需使用 $1 版本的 MediaWiki 才能使用此頁面。\n請參考 [[Special:Version|版本]]。",
        "ok": "確定",
        "retrievedfrom": "取自 \"$1\"",
        "apisandbox": "API 沙盒",
        "apisandbox-api-disabled": "此網站已關閉 API 使用。",
        "apisandbox-intro": "使用此頁面可測試 '''MediaWiki Web Service API'''。\n請參考 [//www.mediawiki.org/wiki/API:Main_page API 說明文件] 以取得詳細資訊。例:[//www.mediawiki.org/wiki/API#A_simple_example 取得主頁的內容]。 請選擇動作以取得更多範例。\n\n請注意,雖然此為沙盒,您在此頁所執行的動作仍有可能會修改到 Wiki。",
+       "apisandbox-fullscreen": "展開面板",
+       "apisandbox-fullscreen-tooltip": "展開沙盒面板來填滿瀏覽器視窗。",
+       "apisandbox-unfullscreen": "顯示頁面",
+       "apisandbox-unfullscreen-tooltip": "減少沙盒面板大小,以讓 MediaWiki 導覽連結可使用。",
        "apisandbox-submit": "發出請求",
        "apisandbox-reset": "清除",
+       "apisandbox-retry": "重試",
+       "apisandbox-loading": "讀取 API 模組 \"$1\" 的資訊...",
+       "apisandbox-load-error": "在讀取 API 模組 \"$1\" 的資訊時發生錯誤:$2",
+       "apisandbox-no-parameters": "此 API 模組沒有參數。",
+       "apisandbox-helpurls": "說明連結",
        "apisandbox-examples": "範例",
+       "apisandbox-dynamic-parameters": "其他參數",
+       "apisandbox-dynamic-parameters-add-label": "加入參數:",
+       "apisandbox-dynamic-parameters-add-placeholder": "參數名稱",
+       "apisandbox-dynamic-error-exists": "命名的參數 \"$1\" 已經存在。",
+       "apisandbox-deprecated-parameters": "停用的參數",
+       "apisandbox-fetch-token": "自動填寫密鑰",
+       "apisandbox-submit-invalid-fields-title": "部份欄位無效",
+       "apisandbox-submit-invalid-fields-message": "請更正已標註的欄位,然後再試一次。",
        "apisandbox-results": "結果",
+       "apisandbox-sending-request": "傳送 API 請求中...",
+       "apisandbox-loading-results": "接收 API 結果中...",
        "apisandbox-request-url-label": "請求 URL:",
-       "apisandbox-request-time": "請求時間:$1",
+       "apisandbox-request-time": "請求時間:{{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "更正密鑰並重新送出",
        "booksources": "圖書資源",
        "booksources-search-legend": "尋找圖書資源",
        "booksources-isbn": "國際標準書號:",
        "lockedbyandtime": "(由 {{GENDER:$1|$1}} 於 $2 的 $3)",
        "move-page": "移動 $1",
        "move-page-legend": "移動頁面",
-       "movepagetext": "以下表單可以用來重新命名一個頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。\n舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。\n您可以選擇自動更新所有指向舊頁面的重新導向,讓它們改為指向新頁面。\n若您選擇不自動更新,請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。\n您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯歷史。\n即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>注音:</strong>\n這個動作對受歡迎的頁面來說可能是重大而唐突的變更;\n在行動前請先確認您了解移動可能帶來的後果。",
+       "movepagetext": "以下表單可以用來重新命名一個頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。您可以選擇自動更新所有指向舊頁面的重新導向,讓它們改為指向新頁面。若您選擇不自動更新,請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯歷史。即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>注意:</strong>這個動作對受歡迎的頁面來說可能是重大而唐突的變更;在行動前請先確認您了解移動可能帶來的後果。",
        "movepagetext-noredirectfixer": "以下表單可以用來重新命名一個頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。\n舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。\n請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。\n您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯歷史。\n即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>注意:</strong>\n這個動作對受歡迎的頁面來說可能是重大而唐突的變更;\n在行動前請先確認您了解移動可能帶來的後果。",
        "movepagetalktext": "若勾選此方塊,相關的對話頁面會自動與此頁面一起移動至新的位置,除非新的名稱已有一個存在的對話頁面。\n在此情況下,若有必要您必須手動移動或合併已存在的頁面。",
        "moveuserpage-warning": "<strong>警告:</strong>您正要移動使用者頁面,請注意只有使用者頁面會變更名稱,並<em>不會</em>重新命名使用者。",
index 4adf154..fb26675 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Goan Konkani (à¤\97à¥\8bवा à¤\95à¥\8bà¤\82à¤\95णà¥\80 / Gova Konknni)
+/** Goan Konkani (à¤\97à¥\8bà¤\82यà¤\9aà¥\80 à¤\95à¥\8bà¤\82à¤\95णà¥\80 / Gõychi Konknni)
  *
  * To improve a translation please visit https://translatewiki.net
  *
index b5cc343..190bc4d 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Goan Konkani - Devanagari script (à¤\97à¥\8bवा कोंकणी)
+/** Goan Konkani - Devanagari script (à¤\97à¥\8bà¤\82यà¤\9aà¥\80 कोंकणी)
  *
  * To improve a translation please visit https://translatewiki.net
  *
diff --git a/languages/messages/MessagesLki.php b/languages/messages/MessagesLki.php
new file mode 100644 (file)
index 0000000..10d06e5
--- /dev/null
@@ -0,0 +1,13 @@
+<?php
+/** Laki
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'fa';
+
+$rtl = true;
index cc8069d..33008d1 100644 (file)
@@ -1,6 +1,5 @@
 # Custom tags for JSDuck 5.x
 # See also:
-# - https://github.com/senchalabs/jsduck/wiki/Tags
 # - https://github.com/senchalabs/jsduck/wiki/Custom-tags
 # - https://github.com/senchalabs/jsduck/wiki/Custom-tags/7f5c32e568eab9edc8e3365e935bcb836cb11f1d
 require 'jsduck/tag/tag'
index b59f4a9..21e31ed 100644 (file)
@@ -484,19 +484,19 @@ class NamespaceConflictChecker extends Maintenance {
         * Get an alternative title to move a page to. This is used if the
         * preferred destination title already exists.
         *
-        * @param Title $title
+        * @param LinkTarget $linkTarget
         * @param array $options Associative array of validated command-line options
         * @return Title|bool
         */
-       private function getAlternateTitle( $title, $options ) {
+       private function getAlternateTitle( LinkTarget $linkTarget, $options ) {
                $prefix = $options['add-prefix'];
                $suffix = $options['add-suffix'];
                if ( $prefix == '' && $suffix == '' ) {
                        return false;
                }
                while ( true ) {
-                       $dbk = $prefix . $title->getDBkey() . $suffix;
-                       $title = Title::makeTitleSafe( $title->getNamespace(), $dbk );
+                       $dbk = $prefix . $linkTarget->getDBkey() . $suffix;
+                       $title = Title::makeTitleSafe( $linkTarget->getNamespace(), $dbk );
                        if ( !$title ) {
                                return false;
                        }
@@ -510,14 +510,14 @@ class NamespaceConflictChecker extends Maintenance {
         * Move a page
         *
         * @param integer $id The page_id
-        * @param Title $newTitle The new title
+        * @param LinkTarget $newLinkTarget The new title link target
         * @return bool
         */
-       private function movePage( $id, Title $newTitle ) {
+       private function movePage( $id, LinkTarget $newLinkTarget ) {
                $this->db->update( 'page',
                        array(
-                               "page_namespace" => $newTitle->getNamespace(),
-                               "page_title" => $newTitle->getDBkey(),
+                               "page_namespace" => $newLinkTarget->getNamespace(),
+                               "page_title" => $newLinkTarget->getDBkey(),
                        ),
                        array(
                                "page_id" => $id,
@@ -533,7 +533,7 @@ class NamespaceConflictChecker extends Maintenance {
                        list( $table, $fieldPrefix ) = $tableInfo;
                        $this->db->update( $table,
                                // SET
-                               array( "{$fieldPrefix}_from_namespace" => $newTitle->getNamespace() ),
+                               array( "{$fieldPrefix}_from_namespace" => $newLinkTarget->getNamespace() ),
                                // WHERE
                                array( "{$fieldPrefix}_from" => $id ),
                                __METHOD__ );
@@ -550,12 +550,12 @@ class NamespaceConflictChecker extends Maintenance {
         * recentchanges review, etc.
         *
         * @param integer $id The page_id
-        * @param Title $newTitle The new title
+        * @param LinkTarget $linkTarget The new link target
         * @param string $logStatus This is set to the log status message on failure
         * @return bool
         */
-       private function canMerge( $id, Title $newTitle, &$logStatus ) {
-               $latestDest = Revision::newFromTitle( $newTitle, 0, Revision::READ_LATEST );
+       private function canMerge( $id, LinkTarget $linkTarget, &$logStatus ) {
+               $latestDest = Revision::newFromTitle( $linkTarget, 0, Revision::READ_LATEST );
                $latestSource = Revision::newFromPageId( $id, 0, Revision::READ_LATEST );
                if ( $latestSource->getTimestamp() > $latestDest->getTimestamp() ) {
                        $logStatus = 'cannot merge since source is later';
index b2f2577..756de27 100644 (file)
@@ -39,7 +39,7 @@ class UpdateSearchIndex extends Maintenance {
 
        public function __construct() {
                parent::__construct();
-               $this->setDescription( 'Script for periodic off-peak updating of the search index' );
+               $this->addDescription( 'Script for periodic off-peak updating of the search index' );
                $this->addOption( 's', 'starting timestamp', false, true );
                $this->addOption( 'e', 'Ending timestamp', false, true );
                $this->addOption(
index 31b201c..75a93a3 100644 (file)
@@ -71,6 +71,7 @@ function wfInstallerMain() {
                $langCode = 'en';
        }
        $wgLang = Language::factory( $langCode );
+       RequestContext::getMain()->setLanguage( $wgLang );
 
        $installer->setParserLanguage( $wgLang );
 
index 5a8257c..33a2039 100644 (file)
@@ -9,16 +9,16 @@
     "grunt": "0.4.5",
     "grunt-cli": "0.1.13",
     "grunt-banana-checker": "0.4.0",
-    "grunt-contrib-copy": "0.8.1",
-    "grunt-contrib-jshint": "0.11.3",
+    "grunt-contrib-copy": "0.8.2",
+    "grunt-contrib-jshint": "0.12.0",
     "grunt-contrib-watch": "0.6.1",
-    "grunt-jscs": "2.6.0",
+    "grunt-jscs": "2.7.0",
     "grunt-jsonlint": "1.0.7",
     "grunt-karma": "0.12.1",
     "karma": "0.13.19",
     "karma-chrome-launcher": "0.2.2",
     "karma-firefox-launcher": "0.1.7",
-    "karma-qunit": "0.1.5",
+    "karma-qunit": "0.1.9",
     "qunitjs": "1.18.0"
   }
 }
index 647efa2..851b1c7 100644 (file)
@@ -68,9 +68,6 @@ return call_user_func( function () {
                        'es5-shim',
                        'oojs',
                        'oojs-ui.styles',
-                       'oojs-ui.styles.icons',
-                       'oojs-ui.styles.indicators',
-                       'oojs-ui.styles.textures',
                        'mediawiki.language',
                ),
                'targets' => array( 'desktop', 'mobile' ),
@@ -81,6 +78,14 @@ return call_user_func( function () {
                'styles' => 'resources/src/oojs-ui-local.css', // HACK, see inside the file
                'skinStyles' => $getSkinSpecific( 'core' ),
                'targets' => array( 'desktop', 'mobile' ),
+               // ResourceLoaderImageModule doesn't support 'skipFunction', so instead we set this up so that
+               // this module is skipped together with its dependencies. Nothing else depends on these modules.
+               'dependencies' => array(
+                       'oojs-ui.styles.icons',
+                       'oojs-ui.styles.indicators',
+                       'oojs-ui.styles.textures',
+               ),
+               'skipFunction' => 'resources/src/oojs-ui-styles-skip.js',
        );
 
        // Deprecated old name for the module 'oojs-ui-core.styles'.
index e789565..ff2a2b3 100644 (file)
@@ -5,7 +5,8 @@
                        "KuboF",
                        "Shirayuki",
                        "Yekrats",
-                       "Kvardek du"
+                       "Kvardek du",
+                       "Psychoslave"
                ]
        },
        "ooui-outline-control-move-down": "Movi eron suben",
@@ -22,5 +23,6 @@
        "ooui-dialog-process-continue": "Daŭrigi",
        "ooui-selectfile-button-select": "Elekti dosieron",
        "ooui-selectfile-not-supported": "Dosieroselekto ne estas subtenata.",
-       "ooui-selectfile-placeholder": "Vi ne selektis dosieron"
+       "ooui-selectfile-placeholder": "Vi ne selektis dosieron",
+       "ooui-selectfile-dragdrop-placeholder": "Ĵetu dosieron ĉi tie."
 }
index a61083b..31344be 100644 (file)
@@ -17,6 +17,8 @@
        "ooui-dialog-process-dismiss": "Didi",
        "ooui-dialog-process-retry": "Itti deebi'ii yaali",
        "ooui-dialog-process-continue": "Itti fufi",
+       "ooui-selectfile-button-select": "Faayilii filadhu",
        "ooui-selectfile-not-supported": "Faayilii filachuun hin danda'amu.",
-       "ooui-selectfile-placeholder": "Faayiliin wayiiyyuu hin filatamne"
+       "ooui-selectfile-placeholder": "Faayiliin wayiiyyuu hin filatamne",
+       "ooui-selectfile-dragdrop-placeholder": "Faayilii as kaa'i"
 }
index 12c77e0..dc14339 100644 (file)
@@ -17,6 +17,7 @@
        "ooui-dialog-process-retry": "ٻيهر ڪوشش ڪريو",
        "ooui-dialog-process-continue": "جاري رکو",
        "ooui-selectfile-button-select": "ڪو فائيل چونڊِو",
+       "ooui-selectfile-not-supported": "فائيل جي چونڊ سپورٽ نٿي ڪئي وڃي",
        "ooui-selectfile-placeholder": "ڪوبه فائيل چونڊيو نه ويو آهي",
        "ooui-selectfile-dragdrop-placeholder": "فائيل کي هتي ڪيرايو"
 }
index 704a186..bdf6a64 100644 (file)
@@ -15,5 +15,7 @@
        "ooui-dialog-process-error": "Nešto je pošlo naopako",
        "ooui-dialog-process-dismiss": "Odbaci",
        "ooui-dialog-process-retry": "Pokušaj ponovo",
-       "ooui-dialog-process-continue": "Nastavi"
+       "ooui-dialog-process-continue": "Nastavi",
+       "ooui-selectfile-button-select": "Izaberi datoteku",
+       "ooui-selectfile-placeholder": "Nije izabrana nijedna datoteka"
 }
index 83ffbd7..3637818 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:00Z
+ * Date: 2016-02-09T21:21:16Z
  */
 ( function ( OO ) {
 
index 168ab71..734ff71 100644 (file)
@@ -1,53 +1,13 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:06Z
+ * Date: 2016-02-09T21:21:21Z
  */
-@-webkit-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-moz-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-ms-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-o-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
 .oo-ui-element-hidden {
        display: none !important;
 }
index fe0d45b..51abc2d 100644 (file)
@@ -1,37 +1,13 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:06Z
+ * Date: 2016-02-09T21:21:21Z
  */
-@-webkit-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-moz-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
 .oo-ui-element-hidden {
        display: none !important;
 }
        left: 0.2em;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-       background: #dddddd;
+       background-color: #dddddd;
        color: #ffffff;
        border: 1px solid #dddddd;
 }
index 2d5ed3a..5a43228 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:00Z
+ * Date: 2016-02-09T21:21:16Z
  */
 ( function ( OO ) {
 
@@ -586,7 +586,7 @@ OO.ui.Element.static.infuse = function ( idOrNode ) {
  */
 OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
        // look for a cached result of a previous infusion.
-       var id, $elem, data, cls, parts, parent, obj, top, state;
+       var id, $elem, data, cls, parts, parent, obj, top, state, infusedChildren;
        if ( typeof idOrNode === 'string' ) {
                id = idOrNode;
                $elem = $( document.getElementById( id ) );
@@ -597,12 +597,28 @@ OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
        if ( !$elem.length ) {
                throw new Error( 'Widget not found: ' + id );
        }
-       data = $elem.data( 'ooui-infused' ) || $elem[ 0 ].oouiInfused;
+       if ( $elem[ 0 ].oouiInfused ) {
+               $elem = $elem[ 0 ].oouiInfused;
+       }
+       data = $elem.data( 'ooui-infused' );
        if ( data ) {
                // cached!
                if ( data === true ) {
                        throw new Error( 'Circular dependency! ' + id );
                }
+               if ( domPromise ) {
+                       // pick up dynamic state, like focus, value of form inputs, scroll position, etc.
+                       state = data.gatherPreInfuseState( $elem );
+                       // restore dynamic state after the new element is re-inserted into DOM under infused parent
+                       domPromise.done( data.restorePreInfuseState.bind( data, state ) );
+                       infusedChildren = $elem.data( 'ooui-infused-children' );
+                       if ( infusedChildren && infusedChildren.length ) {
+                               infusedChildren.forEach( function ( data ) {
+                                       var state = data.gatherPreInfuseState( $elem );
+                                       domPromise.done( data.restorePreInfuseState.bind( data, state ) );
+                               } );
+                       }
+               }
                return data;
        }
        data = $elem.attr( 'data-ooui' );
@@ -654,10 +670,17 @@ OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
        }
        $elem.data( 'ooui-infused', true ); // prevent loops
        data.id = id; // implicit
+       infusedChildren = [];
        data = OO.copy( data, null, function deserialize( value ) {
+               var infused;
                if ( OO.isPlainObject( value ) ) {
                        if ( value.tag ) {
-                               return OO.ui.Element.static.unsafeInfuse( value.tag, domPromise );
+                               infused = OO.ui.Element.static.unsafeInfuse( value.tag, domPromise );
+                               infusedChildren.push( infused );
+                               // Flatten the structure
+                               infusedChildren.push.apply( infusedChildren, infused.$element.data( 'ooui-infused-children' ) || [] );
+                               infused.$element.removeData( 'ooui-infused-children' );
+                               return infused;
                        }
                        if ( value.html ) {
                                return new OO.ui.HtmlSnippet( value.html );
@@ -681,11 +704,12 @@ OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
                        // This element is now gone from the DOM, but if anyone is holding a reference to it,
                        // let's allow them to OO.ui.infuse() it and do what they expect (T105828).
                        // Do not use jQuery.data(), as using it on detached nodes leaks memory in 1.x line by design.
-                       $elem[ 0 ].oouiInfused = obj;
+                       $elem[ 0 ].oouiInfused = obj.$element;
                }
                top.resolve();
        }
        obj.$element.data( 'ooui-infused', obj );
+       obj.$element.data( 'ooui-infused-children', infusedChildren );
        // set the 'data-ooui' attribute so we can identify infused widgets
        obj.$element.attr( 'data-ooui', '' );
        // restore dynamic state after the new element is inserted into DOM
@@ -1084,7 +1108,7 @@ OO.ui.Element.static.scrollIntoView = function ( el, config ) {
                }
        }
        if ( !$.isEmptyObject( anim ) ) {
-               $sc.stop( true ).animate( anim, config.duration || 'fast' );
+               $sc.stop( true ).animate( anim, config.duration === undefined ? 'fast' : config.duration );
                if ( callback ) {
                        $sc.queue( function ( next ) {
                                callback();
@@ -1808,7 +1832,7 @@ OO.ui.mixin.ButtonElement.prototype.onMouseDown = function ( e ) {
  * Handles mouse up events.
  *
  * @protected
- * @param {jQuery.Event} e Mouse up event
+ * @param {MouseEvent} e Mouse up event
  */
 OO.ui.mixin.ButtonElement.prototype.onMouseUp = function ( e ) {
        if ( this.isDisabled() || e.which !== OO.ui.MouseButtons.LEFT ) {
@@ -1854,7 +1878,7 @@ OO.ui.mixin.ButtonElement.prototype.onKeyDown = function ( e ) {
  * Handles key up events.
  *
  * @protected
- * @param {jQuery.Event} e Key up event
+ * @param {KeyboardEvent} e Key up event
  */
 OO.ui.mixin.ButtonElement.prototype.onKeyUp = function ( e ) {
        if ( this.isDisabled() || ( e.which !== OO.ui.Keys.SPACE && e.which !== OO.ui.Keys.ENTER ) ) {
@@ -4967,7 +4991,7 @@ OO.ui.SelectWidget.prototype.onMouseDown = function ( e ) {
  * Handle mouse up events.
  *
  * @private
- * @param {jQuery.Event} e Mouse up event
+ * @param {MouseEvent} e Mouse up event
  */
 OO.ui.SelectWidget.prototype.onMouseUp = function ( e ) {
        var item;
@@ -4995,7 +5019,7 @@ OO.ui.SelectWidget.prototype.onMouseUp = function ( e ) {
  * Handle mouse move events.
  *
  * @private
- * @param {jQuery.Event} e Mouse move event
+ * @param {MouseEvent} e Mouse move event
  */
 OO.ui.SelectWidget.prototype.onMouseMove = function ( e ) {
        var item;
@@ -5007,7 +5031,6 @@ OO.ui.SelectWidget.prototype.onMouseMove = function ( e ) {
                        this.selecting = item;
                }
        }
-       return false;
 };
 
 /**
@@ -5043,7 +5066,7 @@ OO.ui.SelectWidget.prototype.onMouseLeave = function () {
  * Handle key down events.
  *
  * @protected
- * @param {jQuery.Event} e Key down event
+ * @param {KeyboardEvent} e Key down event
  */
 OO.ui.SelectWidget.prototype.onKeyDown = function ( e ) {
        var nextItem,
@@ -5093,7 +5116,6 @@ OO.ui.SelectWidget.prototype.onKeyDown = function ( e ) {
                }
 
                if ( handled ) {
-                       // Can't just return false, because e is not always a jQuery event
                        e.preventDefault();
                        e.stopPropagation();
                }
@@ -5135,7 +5157,7 @@ OO.ui.SelectWidget.prototype.clearKeyPressBuffer = function () {
  * Handle key press events.
  *
  * @protected
- * @param {jQuery.Event} e Key press event
+ * @param {KeyboardEvent} e Key press event
  */
 OO.ui.SelectWidget.prototype.onKeyPress = function ( e ) {
        var c, filter, item;
@@ -5183,7 +5205,8 @@ OO.ui.SelectWidget.prototype.onKeyPress = function ( e ) {
                item.scrollElementIntoView();
        }
 
-       return false;
+       e.preventDefault();
+       e.stopPropagation();
 };
 
 /**
@@ -5846,7 +5869,7 @@ OO.mixinClass( OO.ui.MenuSelectWidget, OO.ui.mixin.ClippableElement );
  * Handles document mouse down events.
  *
  * @protected
- * @param {jQuery.Event} e Key down event
+ * @param {MouseEvent} e Mouse down event
  */
 OO.ui.MenuSelectWidget.prototype.onDocumentMouseDown = function ( e ) {
        if (
@@ -6058,6 +6081,10 @@ OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
                        }
                        this.toggleClipping( true );
 
+                       if ( this.getSelectedItem() ) {
+                               this.getSelectedItem().scrollElementIntoView( { duration: 0 } );
+                       }
+
                        // Auto-hide
                        if ( this.autoHide ) {
                                this.getElementDocument().addEventListener( 'mousedown', this.onDocumentMouseDownHandler, true );
@@ -6155,7 +6182,7 @@ OO.ui.DropdownWidget = function OoUiDropdownWidget( config ) {
        // Events
        this.$handle.on( {
                click: this.onClick.bind( this ),
-               keypress: this.onKeyPress.bind( this )
+               keydown: this.onKeyDown.bind( this )
        } );
        this.menu.connect( this, { select: 'onMenuSelect' } );
 
@@ -6227,14 +6254,25 @@ OO.ui.DropdownWidget.prototype.onClick = function ( e ) {
 };
 
 /**
- * Handle key press events.
+ * Handle key down events.
  *
  * @private
- * @param {jQuery.Event} e Key press event
+ * @param {jQuery.Event} e Key down event
  */
-OO.ui.DropdownWidget.prototype.onKeyPress = function ( e ) {
-       if ( !this.isDisabled() &&
-               ( ( e.which === OO.ui.Keys.SPACE && !this.menu.isVisible() ) || e.which === OO.ui.Keys.ENTER )
+OO.ui.DropdownWidget.prototype.onKeyDown = function ( e ) {
+       if (
+               !this.isDisabled() &&
+               (
+                       e.which === OO.ui.Keys.ENTER ||
+                       (
+                               !this.menu.isVisible() &&
+                               (
+                                       e.which === OO.ui.Keys.SPACE ||
+                                       e.which === OO.ui.Keys.UP ||
+                                       e.which === OO.ui.Keys.DOWN
+                               )
+                       )
+               )
        ) {
                this.menu.toggle();
                return false;
@@ -6684,7 +6722,6 @@ OO.ui.InputWidget = function OoUiInputWidget( config ) {
                .addClass( 'oo-ui-inputWidget' )
                .append( this.$input );
        this.setValue( config.value );
-       this.setAccessKey( config.accessKey );
        if ( config.dir ) {
                this.setDir( config.dir );
        }
@@ -6827,30 +6864,6 @@ OO.ui.InputWidget.prototype.setValue = function ( value ) {
        return this;
 };
 
-/**
- * Set the input's access key.
- * FIXME: This is the same code as in OO.ui.mixin.ButtonElement, maybe find a better place for it?
- *
- * @param {string} accessKey Input's access key, use empty string to remove
- * @chainable
- */
-OO.ui.InputWidget.prototype.setAccessKey = function ( accessKey ) {
-       accessKey = typeof accessKey === 'string' && accessKey.length ? accessKey : null;
-
-       if ( this.accessKey !== accessKey ) {
-               if ( this.$input ) {
-                       if ( accessKey !== null ) {
-                               this.$input.attr( 'accesskey', accessKey );
-                       } else {
-                               this.$input.removeAttr( 'accesskey' );
-                       }
-               }
-               this.accessKey = accessKey;
-       }
-
-       return this;
-};
-
 /**
  * Clean up incoming value.
  *
index e20b956..27a4657 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:00Z
+ * Date: 2016-02-09T21:21:16Z
  */
 ( function ( OO ) {
 
index f433b15..0021721 100644 (file)
@@ -1,53 +1,13 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:06Z
+ * Date: 2016-02-09T21:21:21Z
  */
-@-webkit-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-moz-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-ms-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-o-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
        z-index: 4;
index 1f4262c..7b1e5b7 100644 (file)
@@ -1,37 +1,13 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:06Z
+ * Date: 2016-02-09T21:21:21Z
  */
-@-webkit-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-moz-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
        z-index: 4;
index a88984a..1d1ed87 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:00Z
+ * Date: 2016-02-09T21:21:16Z
  */
 ( function ( OO ) {
 
@@ -1030,7 +1030,7 @@ OO.ui.ToolGroup.prototype.onMouseKeyDown = function ( e ) {
  * Handle captured mouse up and key up events.
  *
  * @protected
- * @param {Event} e Mouse up or key up event
+ * @param {MouseEvent|KeyboardEvent} e Mouse up or key up event
  */
 OO.ui.ToolGroup.prototype.onCapturedMouseKeyUp = function ( e ) {
        this.getElementDocument().removeEventListener( 'mouseup', this.onCapturedMouseKeyUpHandler, true );
@@ -1044,7 +1044,7 @@ OO.ui.ToolGroup.prototype.onCapturedMouseKeyUp = function ( e ) {
  * Handle mouse up and key up events.
  *
  * @protected
- * @param {jQuery.Event} e Mouse up or key up event
+ * @param {MouseEvent|KeyboardEvent} e Mouse up or key up event
  */
 OO.ui.ToolGroup.prototype.onMouseKeyUp = function ( e ) {
        var tool = this.getTargetTool( e );
@@ -1055,7 +1055,8 @@ OO.ui.ToolGroup.prototype.onMouseKeyUp = function ( e ) {
        ) {
                this.pressed.onSelect();
                this.pressed = null;
-               return false;
+               e.preventDefault();
+               e.stopPropagation();
        }
 
        this.pressed = null;
@@ -1831,7 +1832,7 @@ OO.ui.PopupToolGroup.prototype.setDisabled = function () {
  * The event is actually generated from a mouseup/keyup, so it is not a normal blur event object.
  *
  * @protected
- * @param {jQuery.Event} e Mouse up or key up event
+ * @param {MouseEvent|KeyboardEvent} e Mouse up or key up event
  */
 OO.ui.PopupToolGroup.prototype.onBlur = function ( e ) {
        // Only deactivate when clicking outside the dropdown element
index 252e402..071e33b 100644 (file)
@@ -1,53 +1,13 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:06Z
+ * Date: 2016-02-09T21:21:21Z
  */
-@-webkit-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-moz-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-ms-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-o-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
 .oo-ui-draggableElement {
        cursor: -webkit-grab -moz-grab, url(images/grab.cur), move;
 }
 .oo-ui-progressBarWidget.oo-ui-widget-disabled {
        opacity: 0.6;
 }
+@-webkit-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@-moz-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
 .oo-ui-selectFileWidget {
        display: inline-block;
        vertical-align: middle;
 }
 .oo-ui-selectFileWidget-dropTarget {
        cursor: default;
+       height: 5.5em;
+       text-align: left;
+       padding: 0;
 }
-.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled .oo-ui-selectFileWidget-dropTarget {
-       cursor: pointer;
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel,
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton {
+       display: none;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail {
+       height: 5.5em;
+       width: 5.5em;
+       position: absolute;
+       background-size: cover;
+       background-position: center center;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail.oo-ui-pendingElement-pending {
+       background-size: auto;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail > .oo-ui-selectFileWidget-noThumbnail-icon {
+       opacity: 0.4;
+       background-color: #cccccc;
+       height: 5.5em;
+       width: 5.5em;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
+       border: none;
+       background: none;
+       display: block;
+       height: 100%;
+       width: auto;
+       margin-left: 5.5em;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
+       position: relative;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileName {
+       display: block;
+       float: none;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+       display: block;
+       float: none;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
+       position: absolute;
+       right: 0.5em;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget {
+       text-align: center;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel {
+       display: block;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail,
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
+       display: none;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton {
+       display: block;
+       margin: 0.7em;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
+       text-align: center;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
+       margin: 0;
 }
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-clearButton,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-clearButton {
 .oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
        right: 2em;
 }
-.oo-ui-selectFileWidget-dropTarget {
-       line-height: 3.5em;
-       background-color: #ffffff;
-       border: 1px dashed #aaaaaa;
-       padding: 0.5em 1em;
-       margin-bottom: 0.5em;
-       text-align: center;
-       vertical-align: middle;
-}
-.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled .oo-ui-selectFileWidget-dropTarget:hover,
-.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop oo-ui-selectfilewidget-droptarget {
+.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop .oo-ui-selectFileWidget-dropTarget {
        background-color: #e1f3ff;
 }
-.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-selectFileWidget-dropTarget {
+       background-color: #ffffff;
+       border: 1px solid #aaaaaa;
+       margin-bottom: 0.5em;
+       vertical-align: middle;
+       border-radius: 0.25em;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget {
+       border-style: dashed;
+}
 .oo-ui-outlineOptionWidget {
        position: relative;
        cursor: pointer;
        color: #555555;
        border-radius: 0.25em;
 }
-.oo-ui-capsuleItemWidget > .oo-ui-iconElement-icon {
-       cursor: pointer;
-}
-.oo-ui-capsuleItemWidget.oo-ui-widget-disabled > .oo-ui-iconElement-icon {
-       cursor: default;
-}
 .oo-ui-capsuleItemWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-       display: block;
+       display: inline-block;
        text-overflow: ellipsis;
        overflow: hidden;
 }
+.oo-ui-capsuleItemWidget .oo-ui-buttonElement {
+       margin-top: -1.6em;
+       padding-left: 0.3em;
+}
+.oo-ui-capsuleItemWidget:focus {
+       outline: none;
+       border-color: #087ecc;
+}
 .oo-ui-capsuleItemWidget.oo-ui-indicatorElement > .oo-ui-labelElement-label {
        padding-right: 1.3375em;
 }
index d5f8298..8475dd1 100644 (file)
@@ -1,37 +1,13 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:06Z
+ * Date: 2016-02-09T21:21:21Z
  */
-@-webkit-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-moz-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
 .oo-ui-draggableElement {
        cursor: -webkit-grab -moz-grab, url(images/grab.cur), move;
 }
 .oo-ui-progressBarWidget.oo-ui-widget-disabled {
        opacity: 0.6;
 }
+@-webkit-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@-moz-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
 .oo-ui-selectFileWidget {
        display: inline-block;
        vertical-align: middle;
 }
 .oo-ui-selectFileWidget-dropTarget {
        cursor: default;
+       height: 5.5em;
+       text-align: left;
+       padding: 0;
 }
-.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled .oo-ui-selectFileWidget-dropTarget {
-       cursor: pointer;
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel,
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton {
+       display: none;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail {
+       height: 5.5em;
+       width: 5.5em;
+       position: absolute;
+       background-size: cover;
+       background-position: center center;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail.oo-ui-pendingElement-pending {
+       background-size: auto;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail > .oo-ui-selectFileWidget-noThumbnail-icon {
+       opacity: 0.4;
+       background-color: #cccccc;
+       height: 5.5em;
+       width: 5.5em;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
+       border: none;
+       background: none;
+       display: block;
+       height: 100%;
+       width: auto;
+       margin-left: 5.5em;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
+       position: relative;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileName {
+       display: block;
+       float: none;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+       display: block;
+       float: none;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
+       position: absolute;
+       right: 0.5em;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget {
+       text-align: center;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel {
+       display: block;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail,
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
+       display: none;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton {
+       display: block;
+       margin: 0.7em;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
+       text-align: center;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
+       margin: 0;
 }
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-clearButton,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-clearButton {
 .oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
        right: 2em;
 }
-.oo-ui-selectFileWidget-dropTarget {
-       line-height: 3.5em;
-       background-color: #ffffff;
-       border: 1px dashed #cccccc;
-       padding: 0.5em 1em;
-       margin-bottom: 0.5em;
-       text-align: center;
-       vertical-align: middle;
-}
-.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled .oo-ui-selectFileWidget-dropTarget:hover {
-       background-color: #eeeeee;
-}
 .oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop .oo-ui-selectFileWidget-dropTarget {
        background: rgba(52, 123, 255, 0.1);
 }
-.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
-       color: #cccccc;
-       text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info,
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel {
+       color: #cccccc;
+       text-shadow: 0 1px 1px #ffffff;
+}
+.oo-ui-selectFileWidget-dropTarget {
+       background-color: #ffffff;
+       border: 1px solid #cccccc;
+       margin-bottom: 0.5em;
+       vertical-align: middle;
+       overflow: hidden;
+       border-radius: 2px;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget {
+       background-color: #eeeeee;
+       border-style: dashed;
+}
 .oo-ui-outlineOptionWidget {
        position: relative;
        cursor: pointer;
        color: #555555;
        border-radius: 2px;
 }
-.oo-ui-capsuleItemWidget > .oo-ui-iconElement-icon {
-       cursor: pointer;
-}
-.oo-ui-capsuleItemWidget.oo-ui-widget-disabled > .oo-ui-iconElement-icon {
-       cursor: default;
-}
 .oo-ui-capsuleItemWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-       display: block;
+       display: inline-block;
        text-overflow: ellipsis;
        overflow: hidden;
 }
+.oo-ui-capsuleItemWidget .oo-ui-buttonElement {
+       margin-top: -1.6em;
+       padding-left: 0.3em;
+}
+.oo-ui-capsuleItemWidget:focus {
+       outline: none;
+       border-color: #347bff;
+}
 .oo-ui-capsuleItemWidget.oo-ui-indicatorElement > .oo-ui-labelElement-label {
        padding-right: 1.3375em;
 }
index 5dbca20..521dfbb 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:00Z
+ * Date: 2016-02-09T21:21:16Z
  */
 ( function ( OO ) {
 
@@ -3393,7 +3393,6 @@ OO.mixinClass( OO.ui.TabSelectWidget, OO.ui.mixin.TabIndexedElement );
  * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.mixin.ItemWidget
- * @mixins OO.ui.mixin.IndicatorElement
  * @mixins OO.ui.mixin.LabelElement
  * @mixins OO.ui.mixin.FlaggedElement
  * @mixins OO.ui.mixin.TabIndexedElement
@@ -3408,33 +3407,37 @@ OO.ui.CapsuleItemWidget = function OoUiCapsuleItemWidget( config ) {
        // Parent constructor
        OO.ui.CapsuleItemWidget.parent.call( this, config );
 
-       // Properties (must be set before mixin constructor calls)
-       this.$indicator = $( '<span>' );
-
        // Mixin constructors
        OO.ui.mixin.ItemWidget.call( this );
-       OO.ui.mixin.IndicatorElement.call( this, $.extend( {}, config, { $indicator: this.$indicator, indicator: 'clear' } ) );
        OO.ui.mixin.LabelElement.call( this, config );
        OO.ui.mixin.FlaggedElement.call( this, config );
-       OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$indicator } ) );
+       OO.ui.mixin.TabIndexedElement.call( this, config );
 
        // Events
-       this.$indicator.on( {
-               keydown: this.onCloseKeyDown.bind( this ),
-               click: this.onCloseClick.bind( this )
-       } );
+       this.closeButton = new OO.ui.ButtonWidget( {
+               framed: false,
+               indicator: 'clear',
+               tabIndex: -1
+       } ).on( 'click', this.onCloseClick.bind( this ) );
+
+       this.on( 'disable', function ( disabled ) {
+               this.closeButton.setDisabled( disabled );
+       }.bind( this ) );
 
        // Initialization
        this.$element
+               .on( {
+                       click: this.onClick.bind( this ),
+                       keydown: this.onKeyDown.bind( this )
+               } )
                .addClass( 'oo-ui-capsuleItemWidget' )
-               .append( this.$indicator, this.$label );
+               .append( this.$label, this.closeButton.$element );
 };
 
 /* Setup */
 
 OO.inheritClass( OO.ui.CapsuleItemWidget, OO.ui.Widget );
 OO.mixinClass( OO.ui.CapsuleItemWidget, OO.ui.mixin.ItemWidget );
-OO.mixinClass( OO.ui.CapsuleItemWidget, OO.ui.mixin.IndicatorElement );
 OO.mixinClass( OO.ui.CapsuleItemWidget, OO.ui.mixin.LabelElement );
 OO.mixinClass( OO.ui.CapsuleItemWidget, OO.ui.mixin.FlaggedElement );
 OO.mixinClass( OO.ui.CapsuleItemWidget, OO.ui.mixin.TabIndexedElement );
@@ -3443,33 +3446,54 @@ OO.mixinClass( OO.ui.CapsuleItemWidget, OO.ui.mixin.TabIndexedElement );
 
 /**
  * Handle close icon clicks
- * @param {jQuery.Event} event
  */
 OO.ui.CapsuleItemWidget.prototype.onCloseClick = function () {
        var element = this.getElementGroup();
 
-       if ( !this.isDisabled() && element && $.isFunction( element.removeItems ) ) {
+       if ( element && $.isFunction( element.removeItems ) ) {
                element.removeItems( [ this ] );
                element.focus();
        }
 };
 
 /**
- * Handle close keyboard events
- * @param {jQuery.Event} event Key down event
+ * Handle click event for the entire capsule
  */
-OO.ui.CapsuleItemWidget.prototype.onCloseKeyDown = function ( e ) {
-       if ( !this.isDisabled() && $.isFunction( this.getElementGroup().removeItems ) ) {
-               switch ( e.which ) {
-                       case OO.ui.Keys.ENTER:
-                       case OO.ui.Keys.BACKSPACE:
-                       case OO.ui.Keys.SPACE:
-                               this.getElementGroup().removeItems( [ this ] );
-                               return false;
-               }
+OO.ui.CapsuleItemWidget.prototype.onClick = function () {
+       var element = this.getElementGroup();
+
+       if ( !this.isDisabled() && element && $.isFunction( element.editItem ) ) {
+               element.editItem( this );
        }
 };
 
+/**
+ * Handle keyDown event for the entire capsule
+ */
+OO.ui.CapsuleItemWidget.prototype.onKeyDown = function ( e ) {
+       var element = this.getElementGroup();
+
+       if ( e.keyCode === OO.ui.Keys.BACKSPACE || e.keyCode === OO.ui.Keys.DELETE ) {
+               element.removeItems( [ this ] );
+               element.focus();
+               return false;
+       } else if ( e.keyCode === OO.ui.Keys.ENTER ) {
+               element.editItem( this );
+               return false;
+       } else if ( e.keyCode === OO.ui.Keys.LEFT ) {
+               element.getPreviousItem( this ).focus();
+       } else if ( e.keyCode === OO.ui.Keys.RIGHT ) {
+               element.getNextItem( this ).focus();
+       }
+};
+
+/**
+ * Focuses the capsule
+ */
+OO.ui.CapsuleItemWidget.prototype.focus = function () {
+       this.$element.focus();
+};
+
 /**
  * CapsuleMultiSelectWidgets are something like a {@link OO.ui.ComboBoxInputWidget combo box widget}
  * that allows for selecting multiple values.
@@ -3514,16 +3538,19 @@ OO.ui.CapsuleItemWidget.prototype.onCloseKeyDown = function ( e ) {
  * @extends OO.ui.Widget
  * @mixins OO.ui.mixin.TabIndexedElement
  * @mixins OO.ui.mixin.GroupElement
+ * @uses OO.ui.CapsuleItemWidget
+ * @uses OO.ui.FloatingMenuSelectWidget
  *
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {boolean} [allowArbitrary=false] Allow data items to be added even if not present in the menu.
- * @cfg {Object} [menu] Configuration options to pass to the {@link OO.ui.MenuSelectWidget menu select widget}.
+ * @cfg {Object} [menu] (required) Configuration options to pass to the
+ *  {@link OO.ui.MenuSelectWidget menu select widget}.
  * @cfg {Object} [popup] Configuration options to pass to the {@link OO.ui.PopupWidget popup widget}.
  *  If specified, this popup will be shown instead of the menu (but the menu
  *  will still be used for item labels and allowArbitrary=false). The widgets
- *  in the popup should use this.addItemsFromData() or this.addItems() as necessary.
- * @cfg {jQuery} [$overlay] Render the menu or popup into a separate layer.
+ *  in the popup should use {@link #addItemsFromData} or {@link #addItems} as necessary.
+ * @cfg {jQuery} [$overlay=this.$element] Render the menu or popup into a separate layer.
  *  This configuration is useful in cases where the expanded menu is larger than
  *  its containing `<div>`. The specified overlay layer is usually on top of
  *  the containing `<div>` and has a larger area. By default, the menu uses
@@ -3532,12 +3559,15 @@ OO.ui.CapsuleItemWidget.prototype.onCloseKeyDown = function ( e ) {
 OO.ui.CapsuleMultiSelectWidget = function OoUiCapsuleMultiSelectWidget( config ) {
        var $tabFocus;
 
-       // Configuration initialization
-       config = config || {};
-
        // Parent constructor
        OO.ui.CapsuleMultiSelectWidget.parent.call( this, config );
 
+       // Configuration initialization
+       config = $.extend( {
+               allowArbitrary: false,
+               $overlay: this.$element
+       }, config );
+
        // Properties (must be set before mixin constructor calls)
        this.$input = config.popup ? null : $( '<input>' );
        this.$handle = $( '<div>' );
@@ -3562,8 +3592,8 @@ OO.ui.CapsuleMultiSelectWidget = function OoUiCapsuleMultiSelectWidget( config )
 
        // Properties
        this.$content = $( '<div>' );
-       this.allowArbitrary = !!config.allowArbitrary;
-       this.$overlay = config.$overlay || this.$element;
+       this.allowArbitrary = config.allowArbitrary;
+       this.$overlay = config.$overlay;
        this.menu = new OO.ui.FloatingMenuSelectWidget( $.extend(
                {
                        widget: this,
@@ -3753,6 +3783,23 @@ OO.ui.CapsuleMultiSelectWidget.prototype.addItemsFromData = function ( datas ) {
        return this;
 };
 
+/**
+ * Add items to the capsule by providing a label
+ * @param {string} label
+ * @return {boolean} Whether the item was added or not
+ */
+OO.ui.CapsuleMultiSelectWidget.prototype.addItemFromLabel = function ( label ) {
+       var item = this.menu.getItemFromLabel( label, true );
+       if ( item ) {
+               this.addItemsFromData( [ item.data ] );
+               return true;
+       } else if ( this.allowArbitrary && this.$input.val().trim() !== '' ) {
+               this.addItemsFromData( [ label ] );
+               return true;
+       }
+       return false;
+};
+
 /**
  * Remove items by data
  * @chainable
@@ -3802,6 +3849,18 @@ OO.ui.CapsuleMultiSelectWidget.prototype.addItems = function ( items ) {
        return this;
 };
 
+/**
+ * Removes the item from the list and copies its label to `this.$input`.
+ *
+ * @param {Object} item
+ */
+OO.ui.CapsuleMultiSelectWidget.prototype.editItem = function ( item ) {
+       this.$input.val( item.label );
+       this.updateInputSize();
+       this.focus();
+       this.removeItems( [ item ] );
+};
+
 /**
  * @inheritdoc
  */
@@ -3839,6 +3898,56 @@ OO.ui.CapsuleMultiSelectWidget.prototype.clearItems = function () {
        return this;
 };
 
+/**
+ * Given an item, returns the item after it. If its the last item,
+ * returns `this.$input`. If no item is passed, returns the very first
+ * item.
+ *
+ * @param {OO.ui.CapsuleItemWidget} [item]
+ * @return {OO.ui.CapsuleItemWidget|jQuery|boolean}
+ */
+OO.ui.CapsuleMultiSelectWidget.prototype.getNextItem = function ( item ) {
+       var itemIndex;
+
+       if ( item === undefined ) {
+               return this.items[ 0 ];
+       }
+
+       itemIndex = this.items.indexOf( item );
+       if ( itemIndex < 0 ) { // Item not in list
+               return false;
+       } else if ( itemIndex === this.items.length - 1 ) { // Last item
+               return this.$input;
+       } else {
+               return this.items[ itemIndex + 1 ];
+       }
+};
+
+/**
+ * Given an item, returns the item before it. If its the first item,
+ * returns `this.$input`. If no item is passed, returns the very last
+ * item.
+ *
+ * @param {OO.ui.CapsuleItemWidget} [item]
+ * @return {OO.ui.CapsuleItemWidget|jQuery|boolean}
+ */
+OO.ui.CapsuleMultiSelectWidget.prototype.getPreviousItem = function ( item ) {
+       var itemIndex;
+
+       if ( item === undefined ) {
+               return this.items[ this.items.length - 1 ];
+       }
+
+       itemIndex = this.items.indexOf( item );
+       if ( itemIndex < 0 ) { // Item not in list
+               return false;
+       } else if ( itemIndex === 0 ) { // First item
+               return this.$input;
+       } else {
+               return this.items[ itemIndex - 1 ];
+       }
+};
+
 /**
  * Get the capsule widget's menu.
  * @return {OO.ui.MenuSelectWidget} Menu widget
@@ -3866,9 +3975,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onInputFocus = function () {
  * @param {jQuery.Event} event
  */
 OO.ui.CapsuleMultiSelectWidget.prototype.onInputBlur = function () {
-       if ( this.allowArbitrary && this.$input.val().trim() !== '' ) {
-               this.addItemsFromData( [ this.$input.val() ] );
-       }
+       this.addItemFromLabel( this.$input.val() );
        this.clearInput();
 };
 
@@ -3893,7 +4000,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onFocusForPopup = function () {
  * Handles popup focus out events.
  *
  * @private
- * @param {Event} e Focus out event
+ * @param {jQuery.Event} e Focus out event
  */
 OO.ui.CapsuleMultiSelectWidget.prototype.onPopupFocusOut = function () {
        var widget = this.popup;
@@ -3931,8 +4038,6 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onMouseDown = function ( e ) {
  * @param {jQuery.Event} e Key press event
  */
 OO.ui.CapsuleMultiSelectWidget.prototype.onKeyPress = function ( e ) {
-       var item;
-
        if ( !this.isDisabled() ) {
                if ( e.which === OO.ui.Keys.ESCAPE ) {
                        this.clearInput();
@@ -3942,12 +4047,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onKeyPress = function ( e ) {
                if ( !this.popup ) {
                        this.menu.toggle( true );
                        if ( e.which === OO.ui.Keys.ENTER ) {
-                               item = this.menu.getItemFromLabel( this.$input.val(), true );
-                               if ( item ) {
-                                       this.addItemsFromData( [ item.data ] );
-                                       this.clearInput();
-                               } else if ( this.allowArbitrary && this.$input.val().trim() !== '' ) {
-                                       this.addItemsFromData( [ this.$input.val() ] );
+                               if ( this.addItemFromLabel( this.$input.val() ) ) {
                                        this.clearInput();
                                }
                                return false;
@@ -3966,13 +4066,23 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onKeyPress = function ( e ) {
  * @param {jQuery.Event} e Key down event
  */
 OO.ui.CapsuleMultiSelectWidget.prototype.onKeyDown = function ( e ) {
-       if ( !this.isDisabled() ) {
+       if (
+               !this.isDisabled() &&
+               this.$input.val() === '' &&
+               this.items.length
+       ) {
                // 'keypress' event is not triggered for Backspace
-               if ( e.keyCode === OO.ui.Keys.BACKSPACE && this.$input.val() === '' ) {
-                       if ( this.items.length ) {
+               if ( e.keyCode === OO.ui.Keys.BACKSPACE ) {
+                       if ( e.metaKey || e.ctrlKey ) {
                                this.removeItems( this.items.slice( -1 ) );
+                       } else {
+                               this.editItem( this.items[ this.items.length - 1 ] );
                        }
                        return false;
+               } else if ( e.keyCode === OO.ui.Keys.LEFT ) {
+                       this.getPreviousItem().focus();
+               } else if ( e.keyCode === OO.ui.Keys.RIGHT ) {
+                       this.getNextItem().focus();
                }
        }
 };
@@ -4136,6 +4246,8 @@ OO.ui.CapsuleMultiSelectWidget.prototype.focus = function () {
  * @cfg {boolean} [droppable=true] Whether to accept files by drag and drop.
  * @cfg {boolean} [showDropTarget=false] Whether to show a drop target. Requires droppable to be true.
  * @cfg {boolean} [dragDropUI=false] Deprecated alias for showDropTarget
+ * @cfg {Number} [thumbnailSizeLimit=20] File size limit in MiB above which to not try and show a
+ *  preview (for performance)
  */
 OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
        var dragHandler;
@@ -4151,7 +4263,8 @@ OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
                placeholder: OO.ui.msg( 'ooui-selectfile-placeholder' ),
                notsupported: OO.ui.msg( 'ooui-selectfile-not-supported' ),
                droppable: true,
-               showDropTarget: false
+               showDropTarget: false,
+               thumbnailSizeLimit: 20
        }, config );
 
        // Parent constructor
@@ -4165,9 +4278,8 @@ OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
 
        // Properties
        this.$info = $( '<span>' );
-
-       // Properties
        this.showDropTarget = config.showDropTarget;
+       this.thumbnailSizeLimit = config.thumbnailSizeLimit;
        this.isSupported = this.constructor.static.isSupported();
        this.currentFile = null;
        if ( Array.isArray( config.accept ) ) {
@@ -4188,7 +4300,7 @@ OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
        this.clearButton = new OO.ui.ButtonWidget( {
                classes: [ 'oo-ui-selectFileWidget-clearButton' ],
                framed: false,
-               icon: 'remove',
+               icon: 'close',
                disabled: this.disabled
        } );
 
@@ -4211,23 +4323,35 @@ OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
 
        // Initialization
        this.addInput();
-       this.updateUI();
        this.$label.addClass( 'oo-ui-selectFileWidget-label' );
        this.$info
                .addClass( 'oo-ui-selectFileWidget-info' )
                .append( this.$icon, this.$label, this.clearButton.$element, this.$indicator );
-       this.$element
-               .addClass( 'oo-ui-selectFileWidget' )
-               .append( this.$info, this.selectButton.$element );
+
        if ( config.droppable && config.showDropTarget ) {
+               this.selectButton.setIcon( 'upload' );
+               this.$thumbnail = $( '<div>' ).addClass( 'oo-ui-selectFileWidget-thumbnail' );
+               this.setPendingElement( this.$thumbnail );
                this.$dropTarget = $( '<div>' )
                        .addClass( 'oo-ui-selectFileWidget-dropTarget' )
-                       .text( OO.ui.msg( 'ooui-selectfile-dragdrop-placeholder' ) )
                        .on( {
                                click: this.onDropTargetClick.bind( this )
-                       } );
-               this.$element.prepend( this.$dropTarget );
+                       } )
+                       .append(
+                               this.$thumbnail,
+                               this.$info,
+                               this.selectButton.$element,
+                               $( '<span>' )
+                                       .addClass( 'oo-ui-selectFileWidget-dropLabel' )
+                                       .text( OO.ui.msg( 'ooui-selectfile-dragdrop-placeholder' ) )
+                       );
+               this.$element.append( this.$dropTarget );
+       } else {
+               this.$element
+                       .addClass( 'oo-ui-selectFileWidget' )
+                       .append( this.$info, this.selectButton.$element );
        }
+       this.updateUI();
 };
 
 /* Setup */
@@ -4332,13 +4456,77 @@ OO.ui.SelectFileWidget.prototype.updateUI = function () {
                                );
                        }
                        this.setLabel( $label );
+
+                       if ( this.showDropTarget ) {
+                               this.pushPending();
+                               this.loadAndGetImageUrl().done( function ( url ) {
+                                       this.$thumbnail.css( 'background-image', 'url( ' + url + ' )' );
+                               }.bind( this ) ).fail( function () {
+                                       this.$thumbnail.append(
+                                               new OO.ui.IconWidget( {
+                                                       icon: 'attachment',
+                                                       classes: [ 'oo-ui-selectFileWidget-noThumbnail-icon' ]
+                                               } ).$element
+                                       );
+                               }.bind( this ) ).always( function () {
+                                       this.popPending();
+                               }.bind( this ) );
+                               this.$dropTarget.off( 'click' );
+                       }
                } else {
+                       if ( this.showDropTarget ) {
+                               this.$dropTarget.off( 'click' );
+                               this.$dropTarget.on( {
+                                       click: this.onDropTargetClick.bind( this )
+                               } );
+                               this.$thumbnail
+                                       .empty()
+                                       .css( 'background-image', '' );
+                       }
                        this.$element.addClass( 'oo-ui-selectFileWidget-empty' );
                        this.setLabel( this.placeholder );
                }
        }
 };
 
+/**
+ * If the selected file is an image, get its URL and load it.
+ *
+ * @return {jQuery.Promise} Promise resolves with the image URL after it has loaded
+ */
+OO.ui.SelectFileWidget.prototype.loadAndGetImageUrl = function () {
+       var deferred = $.Deferred(),
+               file = this.currentFile,
+               reader = new FileReader();
+
+       if (
+               file &&
+               ( OO.getProp( file, 'type' ) || '' ).indexOf( 'image/' ) === 0 &&
+               file.size < this.thumbnailSizeLimit * 1024 * 1024
+       ) {
+               reader.onload = function ( event ) {
+                       var img = document.createElement( 'img' );
+                       img.addEventListener( 'load', function () {
+                               if (
+                                       img.naturalWidth === 0 ||
+                                       img.naturalHeight === 0 ||
+                                       img.complete === false
+                               ) {
+                                       deferred.reject();
+                               } else {
+                                       deferred.resolve( event.target.result );
+                               }
+                       } );
+                       img.src = event.target.result;
+               };
+               reader.readAsDataURL( file );
+       } else {
+               deferred.reject();
+       }
+
+       return deferred.promise();
+};
+
 /**
  * Add the input to the widget
  *
@@ -4356,6 +4544,11 @@ OO.ui.SelectFileWidget.prototype.addInput = function () {
 
        this.$input = $( '<input type="file">' );
        this.$input.on( 'change', this.onFileSelectedHandler );
+       this.$input.on( 'click', function ( e ) {
+               // Prevents dropTarget to get clicked which calls
+               // a click on this input
+               e.stopPropagation();
+       } );
        this.$input.attr( {
                tabindex: -1
        } );
index 788b70d..adf3bfd 100644 (file)
@@ -1,53 +1,13 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:06Z
+ * Date: 2016-02-09T21:21:21Z
  */
-@-webkit-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-moz-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-ms-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-o-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
 .oo-ui-actionWidget.oo-ui-pendingElement-pending {
        background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
 }
index ead41ca..101673c 100644 (file)
@@ -1,37 +1,13 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:06Z
+ * Date: 2016-02-09T21:21:21Z
  */
-@-webkit-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-moz-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
 .oo-ui-window {
        background: transparent;
 }
index 1ccd433..1a56945 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:00Z
+ * Date: 2016-02-09T21:21:16Z
  */
 ( function ( OO ) {
 
index 0886fa6..c565256 100644 (file)
@@ -5,6 +5,10 @@
                "articleRedirect": { "file": {
                        "ltr": "images/icons/articleRedirect-ltr.svg",
                        "rtl": "images/icons/articleRedirect-rtl.svg"
+               } },
+               "upload": { "file": {
+                       "ltr": "images/icons/upload-ltr.svg",
+                       "rtl": "images/icons/upload-rtl.svg"
                } }
        }
 }
index ab04d36..aae5201 100644 (file)
@@ -5,6 +5,10 @@
                "alignCentre": { "file": "images/icons/align-center.svg" },
                "alignLeft": { "file": "images/icons/align-float-left.svg" },
                "alignRight": { "file": "images/icons/align-float-right.svg" },
+               "attachment": { "file": {
+                       "ltr": "images/icons/attachment-ltr.svg",
+                       "rtl": "images/icons/attachment-rtl.svg"
+               } },
                "calendar": { "file": {
                        "ltr": "images/icons/calendar-ltr.svg",
                        "rtl": "images/icons/calendar-rtl.svg"
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/attachment-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/attachment-ltr.png
new file mode 100644 (file)
index 0000000..cbcd675
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/attachment-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/attachment-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/attachment-ltr.svg
new file mode 100644 (file)
index 0000000..74a4d64
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-293 385 24 24">
+    <path d="M-274.3 390.9c-1.6-1.6-4.3-1.5-5.8.1l.2.2c.5.5 1.3.7 2.1.4.8-.3 1.7-.1 2.4.6 1 .9.9 2.4 0 3.4l-7.1 7.1c-.9 1-2.4.9-3.4 0s-.9-2.4 0-3.4l4.4-4.4c.3-.3.9-.5 1.3-.1s.2 1-.1 1.3l-3.4 3.4c-.6.6-.6 1.7.1 2.3l4.3-4.3c.8-.8 1.1-1.8.9-2.7-.2-.9-.9-1.6-1.7-1.9-.9-.2-1.9 0-2.6.7l-4.4 4.4c-1.6 1.6-1.6 4.3.1 5.8 1.5 1.6 4.3 1.5 5.8-.1l7-7c.8-.8 1.2-1.9 1.2-3s-.5-2.1-1.3-2.8c-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-1.5-1.6.8.7 0 0z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/attachment-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/attachment-rtl.png
new file mode 100644 (file)
index 0000000..43a0161
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/attachment-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/attachment-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/attachment-rtl.svg
new file mode 100644 (file)
index 0000000..f53f5a4
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-119 70 24 24">
+    <path d="M-113.3 75.6c-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7-1.3 1.7-1.3 2.8 0 1.1.4 2.2 1.2 3l7 7c1.5 1.6 4.3 1.7 5.8.1 1.7-1.5 1.7-4.2.1-5.8l-4.4-4.4c-.7-.7-1.7-.9-2.6-.7-.8.3-1.5 1-1.7 1.9-.2.9.1 1.9.9 2.7l4.3 4.3c.7-.6.7-1.7.1-2.3l-3.4-3.4c-.3-.3-.5-.9-.1-1.3s1-.2 1.3.1l4.4 4.4c.9 1 1 2.5 0 3.4s-2.5 1-3.4 0l-7.1-7.1c-.9-1-1-2.5 0-3.4.7-.7 1.6-.9 2.4-.6.8.3 1.6.1 2.1-.4l.2-.2c-1.5-1.6-4.2-1.8-5.8-.1-.8.7 1.5-1.7 0 0z"/>
+</svg>
index bdd9abe..e27be3c 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/language-ltr.png and b/resources/lib/oojs-ui/themes/apex/images/icons/language-ltr.png differ
index 4f1fc10..d64b734 100644 (file)
@@ -1,7 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="translation">
-        <path id="english" d="M14.34 9l-3.53 10h2.064l.72-2.406h3.624l.72 2.406H20L16.465 9h-2.12zm1.065 1.53L16.75 15h-2.69z"/>
-        <path id="chinese" d="M8.97 4.22c-.43.29-.88.616-1.25.874l.186.312c.14.194.275.393.407.594H4.47v1.47h1.593c.43 1.41 1.11 2.624 2.03 3.624-1.008.664-2.192 1.248-3.624 1.75L4 13c.317.487.714.976 1.03 1.375l.25-.094c1.593-.59 2.91-1.263 4.032-2.06.818.63 1.71 1.16 2.657 1.595l.56-1.624a13.21 13.21 0 0 1-1.908-1.063c.284-.28.59-.634.906-1.156.46-.716.776-1.57 1-2.5h1.657V6h-4.063c-.283-.552-.596-1.083-.97-1.53l-.186-.25zM7.72 7.47h3.186c-.32 1.075-.83 1.937-1.53 2.624-.713-.705-1.26-1.568-1.657-2.625zm6.31 5.31l-.467 1.658c.292-.514.577-1.075.812-1.532l-.344-.125z"/>
+    <g id="A">
+        <path d="M18.738 15.673l1.137 3.15h1.575L17.775 7.448h-2.188l-3.85 11.375h1.575l1.05-3.15h4.375zM16.55 8.76l1.837 5.427h-3.675l1.838-5.425z"/>
+    </g>
+    <g id="文">
+        <path d="M8.325 6.573h.787l-.875-1.75h-1.75l.438.875a1.56 1.56 0 0 0 1.4.875z"/>
+        <path d="m 9.202,12.874 c 0.7,0.525 1.486,0.963 2.45,1.225 l -0.438,1.31 A 9.17,9.17 0 0 1 8.151,13.835 c -1.49,1.137 -3.063,1.837 -4.813,2.363 L 2.9,14.885 C 4.386,14.36 5.874,13.835 7.1,12.872 5.962,11.648 5.174,10.335 4.65,8.758 l -1.663,0 0,-1.31 10.85,0 -0.438,1.312 -1.75,0 c -0.308,1.33 -1.255,2.957 -2.45,4.114 z m 1.05,-4.114 -4.114,0 c 0.35,1.226 1.138,2.363 2.013,3.238 0.926,-1 1.617,-1.957 2.1,-3.237 z"/>
     </g>
 </svg>
index ed64644..a7fd0cd 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/language-rtl.png and b/resources/lib/oojs-ui/themes/apex/images/icons/language-rtl.png differ
index 081252e..cf6c1d5 100644 (file)
@@ -1,7 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="translation">
-        <path id="english" d="M7.53 9L4 19h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 9H7.53zm1.064 1.53L9.938 15H7.25z"/>
-        <path id="chinese" d="M14.594 4.22c-.43.29-.88.616-1.25.874l.187.312c.14.194.28.393.41.594h-3.843v1.47h1.594c.43 1.41 1.11 2.624 2.03 3.624-.662.437-1.413.82-2.25 1.187l.563 1.567a15.882 15.882 0 0 0 2.908-1.625 13.82 13.82 0 0 0 3.97 2.125l.28.094c.293-.514.578-1.075.813-1.532l-.375-.125c-1.38-.49-2.49-1.05-3.375-1.654.284-.28.59-.635.906-1.157.46-.717.775-1.572 1-2.5h1.656V6H15.75c-.283-.552-.596-1.083-.97-1.53l-.186-.25zm-1.25 3.25h3.187c-.315 1.075-.825 1.937-1.53 2.624-.71-.705-1.26-1.568-1.653-2.625zM9.97 12.874L9.624 13c.196.3.406.594.625.875l-.28-1z"/>
+    <g id="A">
+        <path d="M5.612 15.673l-1.137 3.15H2.9L6.575 7.448h2.188l3.85 11.375h-1.575l-1.05-3.15H5.613zM7.8 8.76l-1.837 5.427h3.675L7.8 8.762z" id="path5"/>
+    </g>
+    <g id="文">
+        <path d="M16.384 6.573h.787l-.873-1.75h-1.75l.438.875c.26.535.805.874 1.4.875z" id="path7"/>
+        <path d="M15.15 12.874c-.7.525-1.486.963-2.45 1.225l.438 1.31a9.17 9.17 0 0 0 3.063-1.575c1.49 1.137 3.064 1.837 4.814 2.363l.438-1.313c-1.486-.525-2.974-1.05-4.2-2.013 1.138-1.224 1.926-2.537 2.45-4.114h1.663v-1.31h-10.85l.438 1.312h1.75c.308 1.33 1.255 2.957 2.45 4.114zM14.1 8.76h4.114c-.35 1.226-1.138 2.363-2.013 3.238-.925-1-1.616-1.957-2.1-3.237z" id="path11-7"/>
     </g>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/upload-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/upload-ltr.png
new file mode 100644 (file)
index 0000000..fa2da24
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/upload-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/upload-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/upload-ltr.svg
new file mode 100644 (file)
index 0000000..dc4676f
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M10 13c0 1.7 1.3 3 3 3V9h3l-4.5-5L7 9h3v4zm7 0v5H7c-.6 0-1-.4-1-1v-4H4v4c0 1.9 1.3 3 3 3h12v-7h-2z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/upload-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/upload-rtl.png
new file mode 100644 (file)
index 0000000..1ac6106
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/upload-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/upload-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/upload-rtl.svg
new file mode 100644 (file)
index 0000000..ed3fe77
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M13 13c0 1.7-1.3 3-3 3V9H7l4.5-5L16 9h-3v4zm-7 0v5h10c.6 0 1-.4 1-1v-4h2v4c0 1.9-1.3 3-3 3H4v-7h2z"/>
+</svg>
index 54f8aef..b03950c 100644 (file)
                "alignCentre": { "file": "images/icons/align-center.svg" },
                "alignLeft": { "file": "images/icons/align-float-left.svg" },
                "alignRight": { "file": "images/icons/align-float-right.svg" },
+               "attachment": { "file": {
+                       "ltr": "images/icons/attachment-ltr.svg",
+                       "rtl": "images/icons/attachment-rtl.svg"
+               } },
                "calendar": { "file": {
                        "ltr": "images/icons/calendar-ltr.svg",
                        "rtl": "images/icons/calendar-rtl.svg"
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr-invert.png
new file mode 100644 (file)
index 0000000..a77a23e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr-invert.svg
new file mode 100644 (file)
index 0000000..67c3ae9
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-293 385 24 24"><style>* { fill: #ffffff }</style>
+    <path d="M-274.3 390.9c-1.6-1.6-4.3-1.5-5.8.1l.2.2c.5.5 1.3.7 2.1.4.8-.3 1.7-.1 2.4.6 1 .9.9 2.4 0 3.4l-7.1 7.1c-.9 1-2.4.9-3.4 0s-.9-2.4 0-3.4l4.4-4.4c.3-.3.9-.5 1.3-.1s.2 1-.1 1.3l-3.4 3.4c-.6.6-.6 1.7.1 2.3l4.3-4.3c.8-.8 1.1-1.8.9-2.7-.2-.9-.9-1.6-1.7-1.9-.9-.2-1.9 0-2.6.7l-4.4 4.4c-1.6 1.6-1.6 4.3.1 5.8 1.5 1.6 4.3 1.5 5.8-.1l7-7c.8-.8 1.2-1.9 1.2-3s-.5-2.1-1.3-2.8c-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-1.5-1.6.8.7 0 0z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr.png
new file mode 100644 (file)
index 0000000..cbcd675
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr.svg
new file mode 100644 (file)
index 0000000..74a4d64
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-293 385 24 24">
+    <path d="M-274.3 390.9c-1.6-1.6-4.3-1.5-5.8.1l.2.2c.5.5 1.3.7 2.1.4.8-.3 1.7-.1 2.4.6 1 .9.9 2.4 0 3.4l-7.1 7.1c-.9 1-2.4.9-3.4 0s-.9-2.4 0-3.4l4.4-4.4c.3-.3.9-.5 1.3-.1s.2 1-.1 1.3l-3.4 3.4c-.6.6-.6 1.7.1 2.3l4.3-4.3c.8-.8 1.1-1.8.9-2.7-.2-.9-.9-1.6-1.7-1.9-.9-.2-1.9 0-2.6.7l-4.4 4.4c-1.6 1.6-1.6 4.3.1 5.8 1.5 1.6 4.3 1.5 5.8-.1l7-7c.8-.8 1.2-1.9 1.2-3s-.5-2.1-1.3-2.8c-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-1.5-1.6.8.7 0 0z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl-invert.png
new file mode 100644 (file)
index 0000000..e2e2e02
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl-invert.svg
new file mode 100644 (file)
index 0000000..61e11d0
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-119 70 24 24"><style>* { fill: #ffffff }</style>
+    <path d="M-113.3 75.6c-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7-1.3 1.7-1.3 2.8 0 1.1.4 2.2 1.2 3l7 7c1.5 1.6 4.3 1.7 5.8.1 1.7-1.5 1.7-4.2.1-5.8l-4.4-4.4c-.7-.7-1.7-.9-2.6-.7-.8.3-1.5 1-1.7 1.9-.2.9.1 1.9.9 2.7l4.3 4.3c.7-.6.7-1.7.1-2.3l-3.4-3.4c-.3-.3-.5-.9-.1-1.3s1-.2 1.3.1l4.4 4.4c.9 1 1 2.5 0 3.4s-2.5 1-3.4 0l-7.1-7.1c-.9-1-1-2.5 0-3.4.7-.7 1.6-.9 2.4-.6.8.3 1.6.1 2.1-.4l.2-.2c-1.5-1.6-4.2-1.8-5.8-.1-.8.7 1.5-1.7 0 0z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl.png
new file mode 100644 (file)
index 0000000..43a0161
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl.svg
new file mode 100644 (file)
index 0000000..f53f5a4
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-119 70 24 24">
+    <path d="M-113.3 75.6c-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7-1.3 1.7-1.3 2.8 0 1.1.4 2.2 1.2 3l7 7c1.5 1.6 4.3 1.7 5.8.1 1.7-1.5 1.7-4.2.1-5.8l-4.4-4.4c-.7-.7-1.7-.9-2.6-.7-.8.3-1.5 1-1.7 1.9-.2.9.1 1.9.9 2.7l4.3 4.3c.7-.6.7-1.7.1-2.3l-3.4-3.4c-.3-.3-.5-.9-.1-1.3s1-.2 1.3.1l4.4 4.4c.9 1 1 2.5 0 3.4s-2.5 1-3.4 0l-7.1-7.1c-.9-1-1-2.5 0-3.4.7-.7 1.6-.9 2.4-.6.8.3 1.6.1 2.1-.4l.2-.2c-1.5-1.6-4.2-1.8-5.8-.1-.8.7 1.5-1.7 0 0z"/>
+</svg>
index c75d14b..9de74f2 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr-invert.png differ
index 19e1e9f..429ee29 100644 (file)
@@ -1,7 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
-    <g id="translation">
-        <path id="english" d="M14.34 9l-3.53 10h2.064l.72-2.406h3.624l.72 2.406H20L16.465 9h-2.12zm1.065 1.53L16.75 15h-2.69z"/>
-        <path id="chinese" d="M8.97 4.22c-.43.29-.88.616-1.25.874l.186.312c.14.194.275.393.407.594H4.47v1.47h1.593c.43 1.41 1.11 2.624 2.03 3.624-1.008.664-2.192 1.248-3.624 1.75L4 13c.317.487.714.976 1.03 1.375l.25-.094c1.593-.59 2.91-1.263 4.032-2.06.818.63 1.71 1.16 2.657 1.595l.56-1.624a13.21 13.21 0 0 1-1.908-1.063c.284-.28.59-.634.906-1.156.46-.716.776-1.57 1-2.5h1.657V6h-4.063c-.283-.552-.596-1.083-.97-1.53l-.186-.25zM7.72 7.47h3.186c-.32 1.075-.83 1.937-1.53 2.624-.713-.705-1.26-1.568-1.657-2.625zm6.31 5.31l-.467 1.658c.292-.514.577-1.075.812-1.532l-.344-.125z"/>
+    <g id="A">
+        <path d="M18.738 15.673l1.137 3.15h1.575L17.775 7.448h-2.188l-3.85 11.375h1.575l1.05-3.15h4.375zM16.55 8.76l1.837 5.427h-3.675l1.838-5.425z"/>
+    </g>
+    <g id="文">
+        <path d="M8.325 6.573h.787l-.875-1.75h-1.75l.438.875a1.56 1.56 0 0 0 1.4.875z"/>
+        <path d="m 9.202,12.874 c 0.7,0.525 1.486,0.963 2.45,1.225 l -0.438,1.31 A 9.17,9.17 0 0 1 8.151,13.835 c -1.49,1.137 -3.063,1.837 -4.813,2.363 L 2.9,14.885 C 4.386,14.36 5.874,13.835 7.1,12.872 5.962,11.648 5.174,10.335 4.65,8.758 l -1.663,0 0,-1.31 10.85,0 -0.438,1.312 -1.75,0 c -0.308,1.33 -1.255,2.957 -2.45,4.114 z m 1.05,-4.114 -4.114,0 c 0.35,1.226 1.138,2.363 2.013,3.238 0.926,-1 1.617,-1.957 2.1,-3.237 z"/>
     </g>
 </svg>
index bdd9abe..e27be3c 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr.png differ
index 4f1fc10..d64b734 100644 (file)
@@ -1,7 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="translation">
-        <path id="english" d="M14.34 9l-3.53 10h2.064l.72-2.406h3.624l.72 2.406H20L16.465 9h-2.12zm1.065 1.53L16.75 15h-2.69z"/>
-        <path id="chinese" d="M8.97 4.22c-.43.29-.88.616-1.25.874l.186.312c.14.194.275.393.407.594H4.47v1.47h1.593c.43 1.41 1.11 2.624 2.03 3.624-1.008.664-2.192 1.248-3.624 1.75L4 13c.317.487.714.976 1.03 1.375l.25-.094c1.593-.59 2.91-1.263 4.032-2.06.818.63 1.71 1.16 2.657 1.595l.56-1.624a13.21 13.21 0 0 1-1.908-1.063c.284-.28.59-.634.906-1.156.46-.716.776-1.57 1-2.5h1.657V6h-4.063c-.283-.552-.596-1.083-.97-1.53l-.186-.25zM7.72 7.47h3.186c-.32 1.075-.83 1.937-1.53 2.624-.713-.705-1.26-1.568-1.657-2.625zm6.31 5.31l-.467 1.658c.292-.514.577-1.075.812-1.532l-.344-.125z"/>
+    <g id="A">
+        <path d="M18.738 15.673l1.137 3.15h1.575L17.775 7.448h-2.188l-3.85 11.375h1.575l1.05-3.15h4.375zM16.55 8.76l1.837 5.427h-3.675l1.838-5.425z"/>
+    </g>
+    <g id="文">
+        <path d="M8.325 6.573h.787l-.875-1.75h-1.75l.438.875a1.56 1.56 0 0 0 1.4.875z"/>
+        <path d="m 9.202,12.874 c 0.7,0.525 1.486,0.963 2.45,1.225 l -0.438,1.31 A 9.17,9.17 0 0 1 8.151,13.835 c -1.49,1.137 -3.063,1.837 -4.813,2.363 L 2.9,14.885 C 4.386,14.36 5.874,13.835 7.1,12.872 5.962,11.648 5.174,10.335 4.65,8.758 l -1.663,0 0,-1.31 10.85,0 -0.438,1.312 -1.75,0 c -0.308,1.33 -1.255,2.957 -2.45,4.114 z m 1.05,-4.114 -4.114,0 c 0.35,1.226 1.138,2.363 2.013,3.238 0.926,-1 1.617,-1.957 2.1,-3.237 z"/>
     </g>
 </svg>
index 680d726..97c0c09 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl-invert.png differ
index 123053c..f3c32eb 100644 (file)
@@ -1,7 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
-    <g id="translation">
-        <path id="english" d="M7.53 9L4 19h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 9H7.53zm1.064 1.53L9.938 15H7.25z"/>
-        <path id="chinese" d="M14.594 4.22c-.43.29-.88.616-1.25.874l.187.312c.14.194.28.393.41.594h-3.843v1.47h1.594c.43 1.41 1.11 2.624 2.03 3.624-.662.437-1.413.82-2.25 1.187l.563 1.567a15.882 15.882 0 0 0 2.908-1.625 13.82 13.82 0 0 0 3.97 2.125l.28.094c.293-.514.578-1.075.813-1.532l-.375-.125c-1.38-.49-2.49-1.05-3.375-1.654.284-.28.59-.635.906-1.157.46-.717.775-1.572 1-2.5h1.656V6H15.75c-.283-.552-.596-1.083-.97-1.53l-.186-.25zm-1.25 3.25h3.187c-.315 1.075-.825 1.937-1.53 2.624-.71-.705-1.26-1.568-1.653-2.625zM9.97 12.874L9.624 13c.196.3.406.594.625.875l-.28-1z"/>
+    <g id="A">
+        <path d="M5.612 15.673l-1.137 3.15H2.9L6.575 7.448h2.188l3.85 11.375h-1.575l-1.05-3.15H5.613zM7.8 8.76l-1.837 5.427h3.675L7.8 8.762z" id="path5"/>
+    </g>
+    <g id="文">
+        <path d="M16.384 6.573h.787l-.873-1.75h-1.75l.438.875c.26.535.805.874 1.4.875z" id="path7"/>
+        <path d="M15.15 12.874c-.7.525-1.486.963-2.45 1.225l.438 1.31a9.17 9.17 0 0 0 3.063-1.575c1.49 1.137 3.064 1.837 4.814 2.363l.438-1.313c-1.486-.525-2.974-1.05-4.2-2.013 1.138-1.224 1.926-2.537 2.45-4.114h1.663v-1.31h-10.85l.438 1.312h1.75c.308 1.33 1.255 2.957 2.45 4.114zM14.1 8.76h4.114c-.35 1.226-1.138 2.363-2.013 3.238-.925-1-1.616-1.957-2.1-3.237z" id="path11-7"/>
     </g>
 </svg>
index ed64644..a7fd0cd 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl.png differ
index 081252e..cf6c1d5 100644 (file)
@@ -1,7 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="translation">
-        <path id="english" d="M7.53 9L4 19h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 9H7.53zm1.064 1.53L9.938 15H7.25z"/>
-        <path id="chinese" d="M14.594 4.22c-.43.29-.88.616-1.25.874l.187.312c.14.194.28.393.41.594h-3.843v1.47h1.594c.43 1.41 1.11 2.624 2.03 3.624-.662.437-1.413.82-2.25 1.187l.563 1.567a15.882 15.882 0 0 0 2.908-1.625 13.82 13.82 0 0 0 3.97 2.125l.28.094c.293-.514.578-1.075.813-1.532l-.375-.125c-1.38-.49-2.49-1.05-3.375-1.654.284-.28.59-.635.906-1.157.46-.717.775-1.572 1-2.5h1.656V6H15.75c-.283-.552-.596-1.083-.97-1.53l-.186-.25zm-1.25 3.25h3.187c-.315 1.075-.825 1.937-1.53 2.624-.71-.705-1.26-1.568-1.653-2.625zM9.97 12.874L9.624 13c.196.3.406.594.625.875l-.28-1z"/>
+    <g id="A">
+        <path d="M5.612 15.673l-1.137 3.15H2.9L6.575 7.448h2.188l3.85 11.375h-1.575l-1.05-3.15H5.613zM7.8 8.76l-1.837 5.427h3.675L7.8 8.762z" id="path5"/>
+    </g>
+    <g id="文">
+        <path d="M16.384 6.573h.787l-.873-1.75h-1.75l.438.875c.26.535.805.874 1.4.875z" id="path7"/>
+        <path d="M15.15 12.874c-.7.525-1.486.963-2.45 1.225l.438 1.31a9.17 9.17 0 0 0 3.063-1.575c1.49 1.137 3.064 1.837 4.814 2.363l.438-1.313c-1.486-.525-2.974-1.05-4.2-2.013 1.138-1.224 1.926-2.537 2.45-4.114h1.663v-1.31h-10.85l.438 1.312h1.75c.308 1.33 1.255 2.957 2.45 4.114zM14.1 8.76h4.114c-.35 1.226-1.138 2.363-2.013 3.238-.925-1-1.616-1.957-2.1-3.237z" id="path11-7"/>
     </g>
 </svg>
index 85c58d7..f4ef540 100644 (file)
@@ -1,20 +1,19 @@
 @import "mediawiki.mixins";
 
-// Table Sorting
+/* Table Sorting */
 
-.client-js table.jquery-tablesorter th.headerSort {
+table.jquery-tablesorter th.headerSort {
        .background-image-svg( 'images/sort_both.svg', 'images/sort_both.png' );
        cursor: pointer;
-       // Keep synchronized with mediawiki.skinning.content styles
        background-repeat: no-repeat;
        background-position: center right;
        padding-right: 21px;
 }
 
-.client-js table.jquery-tablesorter th.headerSortUp {
+table.jquery-tablesorter th.headerSortUp {
        .background-image-svg( 'images/sort_up.svg', 'images/sort_up.png' );
 }
 
-.client-js table.jquery-tablesorter th.headerSortDown {
+table.jquery-tablesorter th.headerSortDown {
        .background-image-svg( 'images/sort_down.svg', 'images/sort_down.png' );
 }
index 1d4d0e9..3b19b35 100644 (file)
@@ -75,6 +75,7 @@
 
                api = new mw.Api();
                postData = {
+                       formatversion: 2,
                        action: 'parse',
                        title: mw.config.get( 'wgPageName' ),
                        summary: $summary.textSelection( 'getContents' ),
@@ -89,8 +90,8 @@
                        }
 
                        diffRequest = api.post( {
+                               formatversion: 2,
                                action: 'query',
-                               indexpageids: true,
                                prop: 'revisions',
                                titles: mw.config.get( 'wgPageName' ),
                                rvdifftotext: $textbox.textSelection( 'getContents' ),
 
                        // Wait for the summary before showing the diff so the page doesn't jump twice
                        $.when( diffRequest, parseRequest ).done( function ( response ) {
-                               var diffHtml,
-                                       query = response[ 0 ].query;
+                               var diffHtml;
                                try {
-                                       diffHtml = query.pages[ query.pageids[ 0 ] ]
-                                               .revisions[ 0 ].diff[ '*' ];
+                                       diffHtml = response[ 0 ].query.pages[ 0 ]
+                                               .revisions[ 0 ].diff.body;
                                        $wikiDiff.find( 'table.diff tbody' ).html( diffHtml );
                                        mw.hook( 'wikipage.diff' ).fire( $wikiDiff.find( 'table.diff' ) );
                                } catch ( e ) {
                                }
 
                                newList = [];
-                               $.each( response.parse.indicators, function ( i, indicator ) {
+                               $.each( response.parse.indicators, function ( name, indicator ) {
                                        newList.push(
                                                $( '<div>' )
                                                        .addClass( 'mw-indicator' )
-                                                       .attr( 'id', mw.util.escapeId( 'mw-indicator-' + indicator.name ) )
-                                                       .html( indicator[ '*' ] )
+                                                       .attr( 'id', mw.util.escapeId( 'mw-indicator-' + name ) )
+                                                       .html( indicator )
                                                        .get( 0 ),
                                                // Add a whitespace between the <div>s because
                                                // they get displayed with display: inline-block
                                        );
                                }
                                if ( response.parse.categorieshtml ) {
-                                       $content = $( $.parseHTML( response.parse.categorieshtml[ '*' ] ) );
+                                       $content = $( $.parseHTML( response.parse.categorieshtml ) );
                                        mw.hook( 'wikipage.categories' ).fire( $content );
                                        $( '.catlinks[data-mw="interface"]' ).replaceWith( $content );
                                }
                                                li = $( '<li>' )
                                                        .append( $( '<a>' )
                                                                .attr( {
-                                                                       href: mw.util.getUrl( template[ '*' ] ),
-                                                                       'class': ( template.exists !== undefined ? '' : 'new' )
+                                                                       href: mw.util.getUrl( template.title ),
+                                                                       'class': ( template.exists ? '' : 'new' )
                                                                } )
-                                                               .text( template[ '*' ] )
+                                                               .text( template.title )
                                                        );
                                                newList.push( li );
                                        } );
                                        $editform.find( '.templatesUsed .mw-editfooter-list' ).detach().empty().append( newList ).appendTo( '.templatesUsed' );
                                }
                                if ( response.parse.limitreporthtml ) {
-                                       $( '.limitreport' ).html( response.parse.limitreporthtml[ '*' ] );
+                                       $( '.limitreport' ).html( response.parse.limitreporthtml );
                                }
                                if ( response.parse.langlinks && mw.config.get( 'skin' ) === 'vector' ) {
                                        newList = [];
                                                        .append( $( '<a>' )
                                                                .attr( {
                                                                        href: langlink.url,
-                                                                       title: langlink[ '*' ] + ' - ' + langlink.langname,
+                                                                       title: langlink.title + ' - ' + langlink.langname,
                                                                        lang: langlink.lang,
                                                                        hreflang: langlink.lang
                                                                } )
                                        $list.detach().empty().append( newList ).prependTo( $parent );
                                }
 
-                               if ( response.parse.text[ '*' ] ) {
+                               if ( response.parse.text ) {
                                        $content = $wikiPreview.children( '.mw-content-ltr,.mw-content-rtl' );
                                        $content
                                                .detach()
-                                               .html( response.parse.text[ '*' ] );
+                                               .html( response.parse.text );
 
                                        mw.hook( 'wikipage.content' ).fire( $content );
 
                                isSubject = ( section === 'new' ),
                                summaryMsg = isSubject ? 'subject-preview' : 'summary-preview',
                                $summaryPreview = $editform.find( '.mw-summary-preview' ).empty();
-                       if ( parse && parse.parsedsummary && parse.parsedsummary[ '*' ] !== '' ) {
+                       if ( parse && parse.parsedsummary ) {
                                $summaryPreview.append(
                                        mw.message( summaryMsg ).parse(),
                                        ' ',
                                        $( '<span>' ).addClass( 'comment' ).html(
                                                // There is no equivalent to rawParams
                                                mw.message( 'parentheses' ).escaped()
-                                                       .replace( '$1', parse.parsedsummary[ '*' ] )
+                                                       .replace( '$1', parse.parsedsummary )
                                        )
                                );
                        }
index a873cdf..c88d00d 100644 (file)
@@ -241,16 +241,3 @@ div.tright {
 div.tleft {
        margin: .5em 1.4em 1.3em 0;
 }
-
-/* Make space for the jquery.tablesorter icon and display a placeholder if JavaScript is loaded, while
-   tablesorter is still loading and setting up the tables for sorting. This avoids a flash of
-   unstyled content during page load (FOUC). The styles can also be used by WYSIWYG editors. */
-.client-js table.sortable th:not(.unsortable) {
-       background-image: url(images/sort_both_readonly.png);
-       /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/sort_both_readonly.svg);
-       /* Keep synchronised with jquery.tablesorter styles */
-       background-repeat: no-repeat;
-       background-position: center right;
-       padding-right: 21px;
-}
diff --git a/resources/src/mediawiki.skinning/images/sort_both_readonly.png b/resources/src/mediawiki.skinning/images/sort_both_readonly.png
deleted file mode 100644 (file)
index bdb09e3..0000000
Binary files a/resources/src/mediawiki.skinning/images/sort_both_readonly.png and /dev/null differ
diff --git a/resources/src/mediawiki.skinning/images/sort_both_readonly.svg b/resources/src/mediawiki.skinning/images/sort_both_readonly.svg
deleted file mode 100644 (file)
index 3b97000..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 21 9" height="9" width="21">
-    <path d="M14.5 5l-4 4-4-4zM14.5 4l-4-4-4 4z" style="fill-opacity: 0.5;"/>
-</svg>
index 32ccdcd..10664fa 100644 (file)
        ApiSandbox.PageLayout.prototype.loadParamInfo = function () {
                var dynamicFieldset, dynamicParamNameWidget,
                        that = this,
+                       removeDynamicParamWidget = function ( name, layout ) {
+                               dynamicFieldset.removeItems( [ layout ] );
+                               delete that.widgets[ name ];
+                       },
                        addDynamicParamWidget = function () {
                                var name, layout, widget, button;
 
                                widget.focus();
 
                                dynamicParamNameWidget.setValue( '' );
-                       },
-                       removeDynamicParamWidget = function ( name, layout ) {
-                               dynamicFieldset.removeItems( [ layout ] );
-                               delete that.widgets[ name ];
                        };
 
                this.$element.empty()
index ec2a4b1..ffb3041 100644 (file)
@@ -6,17 +6,15 @@
 ( function ( mw, $ ) {
        /*jshint latedef:false */
 
-       // jscs:disable jsDoc
        /**
-        * @class mw.Title
-        *
         * Parse titles into an object structure. Note that when using the constructor
         * directly, passing invalid titles will result in an exception. Use #newFromText to use the
         * logic directly and get null for invalid titles which is easier to work with.
         *
-        * @constructor
-        *
-        * Note that in the constructor amd #newFromText method, `namespace` is the **default** namespace
+        * @class mw.Title
+        */
+       /**
+        * Note that in the constructor and #newFromText method, `namespace` is the **default** namespace
         * only, and can be overridden by a namespace prefix in `title`. If you do not want this behavior,
         * use #makeTitle. Compare:
         *
@@ -32,6 +30,7 @@
         *     mw.Title.newFromText( 'Template:Foo', NS_TEMPLATE ).getPrefixedText(); // => 'Template:Foo'
         *     mw.Title.makeTitle( NS_TEMPLATE, 'Template:Foo' ).getPrefixedText();   // => 'Template:Template:Foo'
         *
+        * @method constructor
         * @param {string} title Title of the page. If no second argument given,
         *  this will be searched for a namespace
         * @param {number} [namespace=NS_MAIN] If given, will used as default namespace for the given title
@@ -50,7 +49,6 @@
 
                return this;
        }
-       // jscs:enable jsDoc
 
        /* Private members */
 
index 4be4a8d..a2386b3 100644 (file)
                $checkboxes.prop( 'checked', check );
        }
 
-       $( '#checkbox-all' ).click( function ( e ) {
+       $( '.mw-checkbox-all' ).click( function ( e ) {
                selectAll( true );
                e.preventDefault();
        } );
-       $( '#checkbox-none' ).click( function ( e ) {
+       $( '.mw-checkbox-none' ).click( function ( e ) {
                selectAll( false );
                e.preventDefault();
        } );
-       $( '#checkbox-invert' ).click( function ( e ) {
+       $( '.mw-checkbox-invert' ).click( function ( e ) {
                $checkboxes.each( function () {
                        $( this ).prop( 'checked', !$( this ).is( ':checked' ) );
                } );
index 97a94b8..8a3784c 100644 (file)
@@ -6,7 +6,7 @@
  * @author Moriel Schottlender, 2015
  * @since 1.19
  */
-/*jshint es3:false */
+/*jshint esversion:5 */
 /*global OO*/
 ( function ( mw, $ ) {
        /**
index 90b93dc..2aada9e 100644 (file)
                                        // Whether the store is in use on this page.
                                        enabled: null,
 
-                                       // Modules whose string representation exceeds 100 kB (30 kB on FF) are
-                                       // ineligible for storage due to bug T66721. The quota is stricter on
-                                       // Firefox due to <https://bugzilla.mozilla.org/show_bug.cgi?id=1064466>.
-                                       MODULE_SIZE_MAX: ( /Firefox/.test( navigator.userAgent ) ? 30 : 100 ) * 1000,
+                                       MODULE_SIZE_MAX: 100 * 1000,
 
                                        // The contents of the store, mapping '[module name]@[version]' keys
                                        // to module implementations.
                                                        return;
                                                }
 
-                                               if ( !mw.config.get( 'wgResourceLoaderStorageEnabled' ) ) {
+                                               if (
+                                                       // Disabled because localStorage quotas are tight and (in Firefox's case)
+                                                       // shared by multiple origins.
+                                                       // See T66721, and <https://bugzilla.mozilla.org/show_bug.cgi?id=1064466>.
+                                                       /Firefox|Opera/.test( navigator.userAgent ) ||
+
                                                        // Disabled by configuration.
+                                                       !mw.config.get( 'wgResourceLoaderStorageEnabled' )
+                                               ) {
                                                        // Clear any previous store to free up space. (T66721)
                                                        mw.loader.store.clear();
                                                        mw.loader.store.enabled = false;
diff --git a/resources/src/oojs-ui-styles-skip.js b/resources/src/oojs-ui-styles-skip.js
new file mode 100644 (file)
index 0000000..57c905a
--- /dev/null
@@ -0,0 +1,9 @@
+/*!
+ * Skip function for OOjs UI PHP style modules.
+ *
+ * The `<meta name="X-OOUI-PHP" />` is added to pages by OutputPage::enableOOUI().
+ *
+ * Looking for elements in the DOM might be expensive, but it's probably better than double-loading
+ * 200 KB of CSS with embedded images because of bug T87871.
+ */
+return !!jQuery( 'meta[name="X-OOUI-PHP"]' ).length;
index 0c2d6d6..e53e5f3 100644 (file)
@@ -4,7 +4,7 @@
  * even the most ancient of browsers, so be very careful when editing.
  */
 /*jshint unused: false, evil: true */
-/*globals mw, RLQ: true, $VARS, $CODE, performance */
+/*globals mw, RLQ: true, NORLQ: true, $VARS, $CODE, performance */
 
 var mediaWikiLoadStart = ( new Date() ).getTime(),
 
@@ -67,11 +67,29 @@ function isCompatible( ua ) {
 
 // Conditional script injection
 ( function () {
+       var NORLQ, script;
        if ( !isCompatible() ) {
                // Undo class swapping in case of an unsupported browser.
                // See OutputPage::getHeadScripts().
                document.documentElement.className = document.documentElement.className
                        .replace( /(^|\s)client-js(\s|$)/, '$1client-nojs$2' );
+
+               NORLQ = window.NORLQ || [];
+               while ( NORLQ.length ) {
+                       NORLQ.shift()();
+               }
+               window.NORLQ = {
+                       push: function ( fn ) {
+                               fn();
+                       }
+               };
+
+               // Clear and disable the other queue
+               window.RLQ = {
+                       // No-op
+                       push: function () {}
+               };
+
                return;
        }
 
@@ -96,9 +114,15 @@ function isCompatible( ua ) {
                                fn();
                        }
                };
+
+               // Clear and disable the other queue
+               window.NORLQ = {
+                       // No-op
+                       push: function () {}
+               };
        }
 
-       var script = document.createElement( 'script' );
+       script = document.createElement( 'script' );
        script.src = $VARS.baseModulesUri;
        script.onload = script.onreadystatechange = function () {
                if ( !script.readyState || /loaded|complete/.test( script.readyState ) ) {
index 90ee1bb..ce9e1d6 100644 (file)
@@ -364,6 +364,25 @@ class EditPageTest extends MediaWikiLangTestCase {
        }
 
        public function testUpdatePage() {
+               $checkIds = array();
+
+               $this->setMwGlobals( 'wgHooks', array(
+                       'PageContentInsertComplete' => array( function (
+                               WikiPage &$page, User &$user, Content $content,
+                               $summary, $minor, $u1, $u2, &$flags, Revision $revision
+                       ) {
+                               // types/refs checked
+                       } ),
+                       'PageContentSaveComplete' => array( function (
+                               WikiPage &$page, User &$user, Content $content,
+                               $summary, $minor, $u1, $u2, &$flags, Revision $revision,
+                               Status &$status, $baseRevId
+                       ) use ( &$checkIds ) {
+                               $checkIds[] = $status->value['revision']->getId();
+                               // types/refs checked
+                       } ),
+               ) );
+
                $text = "one";
                $edit = array(
                        'wpTextbox1' => $text,
@@ -373,6 +392,7 @@ class EditPageTest extends MediaWikiLangTestCase {
                $page = $this->assertEdit( 'EditPageTest_testUpdatePage', "zero", null, $edit,
                        EditPage::AS_SUCCESS_UPDATE, $text,
                        "expected successfull update with given text" );
+               $this->assertGreaterThan( 0, $checkIds[0], "First event rev ID set" );
 
                $this->forceRevisionDate( $page, '20120101000000' );
 
@@ -385,6 +405,62 @@ class EditPageTest extends MediaWikiLangTestCase {
                $this->assertEdit( 'EditPageTest_testUpdatePage', null, null, $edit,
                        EditPage::AS_SUCCESS_UPDATE, $text,
                        "expected successfull update with given text" );
+               $this->assertGreaterThan( 0, $checkIds[1], "Second edit hook rev ID set" );
+               $this->assertGreaterThan( $checkIds[0], $checkIds[1], "Second event rev ID is higher" );
+       }
+
+       public function testUpdatePageTrx() {
+               $text = "one";
+               $edit = array(
+                       'wpTextbox1' => $text,
+                       'wpSummary' => 'first update',
+               );
+
+               $page = $this->assertEdit( 'EditPageTest_testTrxUpdatePage', "zero", null, $edit,
+                       EditPage::AS_SUCCESS_UPDATE, $text,
+                       "expected successfull update with given text" );
+
+               $this->forceRevisionDate( $page, '20120101000000' );
+
+               $checkIds = array();
+               $this->setMwGlobals( 'wgHooks', array(
+                       'PageContentSaveComplete' => array( function (
+                               WikiPage &$page, User &$user, Content $content,
+                               $summary, $minor, $u1, $u2, &$flags, Revision $revision,
+                               Status &$status, $baseRevId
+                       ) use ( &$checkIds ) {
+                               $checkIds[] = $status->value['revision']->getId();
+                               // types/refs checked
+                       } ),
+               ) );
+
+               wfGetDB( DB_MASTER )->begin( __METHOD__ );
+
+               $text = "two";
+               $edit = array(
+                       'wpTextbox1' => $text,
+                       'wpSummary' => 'second update',
+               );
+
+               $this->assertEdit( 'EditPageTest_testTrxUpdatePage', null, null, $edit,
+                       EditPage::AS_SUCCESS_UPDATE, $text,
+                       "expected successfull update with given text" );
+
+               $text = "three";
+               $edit = array(
+                       'wpTextbox1' => $text,
+                       'wpSummary' => 'third update',
+               );
+
+               $this->assertEdit( 'EditPageTest_testTrxUpdatePage', null, null, $edit,
+                       EditPage::AS_SUCCESS_UPDATE, $text,
+                       "expected successfull update with given text" );
+
+               wfGetDB( DB_MASTER )->commit( __METHOD__ );
+
+               $this->assertGreaterThan( 0, $checkIds[0], "First event rev ID set" );
+               $this->assertGreaterThan( 0, $checkIds[1], "Second edit hook rev ID set" );
+               $this->assertGreaterThan( $checkIds[0], $checkIds[1], "Second event rev ID is higher" );
        }
 
        public static function provideSectionEdit() {
index 830a7be..a4ef950 100644 (file)
@@ -99,7 +99,7 @@ class HtmlTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers HTML::expandAttributes
+        * @covers Html::expandAttributes
         */
        public function testExpandAttributesSkipsNullAndFalse() {
 
@@ -120,7 +120,7 @@ class HtmlTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers HTML::expandAttributes
+        * @covers Html::expandAttributes
         */
        public function testExpandAttributesForBooleans() {
                $this->assertEquals(
@@ -155,7 +155,7 @@ class HtmlTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers HTML::expandAttributes
+        * @covers Html::expandAttributes
         */
        public function testExpandAttributesForNumbers() {
                $this->assertEquals(
@@ -171,7 +171,7 @@ class HtmlTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers HTML::expandAttributes
+        * @covers Html::expandAttributes
         */
        public function testExpandAttributesForObjects() {
                $this->assertEquals(
@@ -481,7 +481,7 @@ class HtmlTest extends MediaWikiTestCase {
                $this->assertEquals(
                        '<input type=' . $HTML5InputType . '>',
                        Html::element( 'input', array( 'type' => $HTML5InputType ) ),
-                       'In HTML5, HTML::element() should accept type="' . $HTML5InputType . '"'
+                       'In HTML5, Html::element() should accept type="' . $HTML5InputType . '"'
                );
        }
 
diff --git a/tests/phpunit/includes/MergeHistoryTest.php b/tests/phpunit/includes/MergeHistoryTest.php
new file mode 100644 (file)
index 0000000..0c1a7a8
--- /dev/null
@@ -0,0 +1,124 @@
+<?php
+
+/**
+ * @group Database
+ */
+class MergeHistoryTest extends MediaWikiTestCase {
+
+       /**
+        * Make some pages to work with
+        */
+       public function addDBData() {
+               // Pages that won't actually be merged
+               $this->insertPage( 'Test' );
+               $this->insertPage( 'Test2' );
+
+               // Pages that will be merged
+               $this->insertPage( 'Merge1' );
+               $this->insertPage( 'Merge2' );
+       }
+
+       /**
+        * @dataProvider provideIsValidMerge
+        * @covers MergeHistory::isValidMerge
+        * @param $source string Source page
+        * @param $dest string Destination page
+        * @param $timestamp string|bool Timestamp up to which revisions are merged (or false for all)
+        * @param $error string|bool Expected error for test (or true for no error)
+        */
+       public function testIsValidMerge( $source, $dest, $timestamp, $error ) {
+               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
+               $mh = new MergeHistory(
+                       Title::newFromText( $source ),
+                       Title::newFromText( $dest ),
+                       $timestamp
+               );
+               $status = $mh->isValidMerge();
+               if ( $error === true ) {
+                       $this->assertTrue( $status->isGood() );
+               } else {
+                       $this->assertTrue( $status->hasMessage( $error ) );
+               }
+       }
+
+       public static function provideIsValidMerge() {
+               return array(
+                       // for MergeHistory::isValidMerge
+                       array( 'Test', 'Test2', false, true ),
+                       // Although this timestamp is after the latest timestamp of both pages,
+                       // MergeHistory should select the latest source timestamp up to this which should
+                       // still work for the merge.
+                       array( 'Test', 'Test2', strtotime( 'tomorrow' ), true ),
+                       array( 'Test', 'Test', false, 'mergehistory-fail-self-merge' ),
+                       array( 'Nonexistant', 'Test2', false, 'mergehistory-fail-invalid-source' ),
+                       array( 'Test', 'Nonexistant', false, 'mergehistory-fail-invalid-dest' ),
+                       array(
+                               'Test',
+                               'Test2',
+                               'This is obviously an invalid timestamp',
+                               'mergehistory-fail-bad-timestamp'
+                       ),
+               );
+       }
+
+       /**
+        * Test merge revision limit checking
+        * @covers MergeHistory::isValidMerge
+        */
+       public function testIsValidMergeRevisionLimit() {
+               $limit = MergeHistory::REVISION_LIMIT;
+
+               $mh = $this->getMockBuilder( 'MergeHistory' )
+                       ->setMethods( array( 'getRevisionCount' ) )
+                       ->setConstructorArgs( array(
+                               Title::newFromText( 'Test' ),
+                               Title::newFromText( 'Test2' ),
+                       ) )
+                       ->getMock();
+               $mh->expects( $this->once() )
+                       ->method( 'getRevisionCount' )
+                       ->will( $this->returnValue( $limit + 1 ) );
+
+               $status = $mh->isValidMerge();
+               $this->assertTrue( $status->hasMessage( 'mergehistory-fail-toobig' ) );
+               $errors = $status->getErrorsByType( 'error' );
+               $params = $errors[0]['params'];
+               $this->assertEquals( $params[0], Message::numParam( $limit ) );
+       }
+
+       /**
+        * Test user permission checking
+        * @covers MergeHistory::checkPermissions
+        */
+       public function testCheckPermissions() {
+               $mh = new MergeHistory(
+                       Title::newFromText( 'Test' ),
+                       Title::newFromText( 'Test2' )
+               );
+
+               // Sysop with mergehistory permission
+               $sysop = User::newFromName( 'UTSysop' );
+               $status = $mh->checkPermissions( $sysop, '' );
+               $this->assertTrue( $status->isOK() );
+
+               // Normal user
+               $notSysop = User::newFromName( 'UTNotSysop' );
+               $notSysop->addToDatabase();
+               $status = $mh->checkPermissions( $notSysop, '' );
+               $this->assertTrue( $status->hasMessage( 'mergehistory-fail-permission' ) );
+       }
+
+       /**
+        * Test merged revision count
+        * @covers MergeHistory::getMergedRevisionCount
+        */
+       public function testGetMergedRevisionCount() {
+               $mh = new MergeHistory(
+                       Title::newFromText( 'Merge1' ),
+                       Title::newFromText( 'Merge2' )
+               );
+
+               $mh->merge( User::newFromName( 'UTSysop' ) );
+               $this->assertEquals( $mh->getMergedRevisionCount(), 1 );
+       }
+}
index 08a984e..56bbd06 100644 (file)
@@ -25,6 +25,7 @@ class ApiMessageTest extends MediaWikiTestCase {
 
        /**
         * @covers ApiMessage
+        * @covers ApiMessageTrait
         */
        public function testApiMessage() {
                $msg = new Message( array( 'foo', 'bar' ), array( 'baz' ) );
@@ -63,6 +64,7 @@ class ApiMessageTest extends MediaWikiTestCase {
 
        /**
         * @covers ApiRawMessage
+        * @covers ApiMessageTrait
         */
        public function testApiRawMessage() {
                $msg = new RawMessage( 'foo', array( 'baz' ) );
index 8178c12..a72247b 100644 (file)
@@ -26,6 +26,9 @@ class ContentHandlerTest extends MediaWikiTestCase {
                                CONTENT_MODEL_CSS => 'CssContentHandler',
                                CONTENT_MODEL_TEXT => 'TextContentHandler',
                                'testing' => 'DummyContentHandlerForTesting',
+                               'testing-callbacks' => function( $modelId ) {
+                                       return new DummyContentHandlerForTesting( $modelId );
+                               }
                        ),
                ) );
 
@@ -378,4 +381,26 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
                return true;
        }
+
+       public function provideGetModelForID() {
+               return array(
+                       array( CONTENT_MODEL_WIKITEXT, 'WikitextContentHandler' ),
+                       array( CONTENT_MODEL_JAVASCRIPT, 'JavaScriptContentHandler' ),
+                       array( CONTENT_MODEL_JSON, 'JsonContentHandler' ),
+                       array( CONTENT_MODEL_CSS, 'CssContentHandler' ),
+                       array( CONTENT_MODEL_TEXT, 'TextContentHandler' ),
+                       array( 'testing', 'DummyContentHandlerForTesting' ),
+                       array( 'testing-callbacks', 'DummyContentHandlerForTesting' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetModelForID
+        */
+       public function testGetModelForID( $modelId, $handlerClass ) {
+               $handler = ContentHandler::getForModelID( $modelId );
+
+               $this->assertInstanceOf( $handlerClass, $handler );
+       }
+
 }
index 32b150c..3efc4c3 100644 (file)
@@ -23,11 +23,10 @@ class ArrayUtilsTest extends PHPUnit_Framework_TestCase {
        }
 
        function provideFindLowerBound() {
-               $that = $this;
-               $indexValueCallback = function ( $size ) use ( $that ) {
-                       return function ( $val ) use ( $that, $size ) {
-                               $that->assertTrue( $val >= 0 );
-                               $that->assertTrue( $val < $size );
+               $indexValueCallback = function ( $size ) {
+                       return function ( $val ) use ( $size ) {
+                               $this->assertTrue( $val >= 0 );
+                               $this->assertTrue( $val < $size );
                                return $val;
                        };
                };
index 6556186..4630b48 100644 (file)
@@ -44,7 +44,11 @@ class IPTCTest extends MediaWikiTestCase {
         * @covers IPTC::Parse
         */
        public function testIPTCParseForcedUTFButInvalid() {
-               if ( version_compare( PHP_VERSION, '5.5.26', '<' ) ) {
+               if ( version_compare( PHP_VERSION, '5.5.26', '<' )
+                       || ( version_compare( PHP_VERSION, '5.6.0', '>' )
+                               && version_compare( PHP_VERSION, '5.6.10', '<' )
+                       )
+               ) {
                        $this->markTestSkipped( 'Test fails on pre-PHP 5.5.25. See T124574/T39665 for details.' );
                }
                $iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x11\x1c\x02\x19\x00\x04\xC3\xC3\xC3\xB8"
index b683885..9ef2588 100644 (file)
@@ -206,7 +206,6 @@ mw.example();
                                'styles' => array(),
                                'messages' => new XmlJsCode( '{}' ),
                                'templates' => array(),
-                               'title' => 'scripts, styles and messags',
 
                                'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery ) {
 mw.example();
index 52872a4..e1ba0ba 100644 (file)
@@ -207,11 +207,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
        }
 
        public function testCheckSessionInfo() {
-               $logger = new \TestLogger( true, function ( $m ) {
-                       return preg_replace(
-                               '/^Session \[\d+\][a-zA-Z0-9_\\\\]+<(?:null|anon|[+-]:\d+:\w+)>\w+: /', 'Session X: ', $m
-                       );
-               } );
+               $logger = new \TestLogger( true );
                $provider = $this->getProvider();
                $provider->setLogger( $logger );
 
@@ -242,7 +238,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
 
                        $this->assertFalse( $provider->refreshSessionInfo( $info, $request, $metadata ) );
                        $this->assertSame( array(
-                               array( LogLevel::INFO, "Session X: Missing metadata: $key" )
+                               array( LogLevel::INFO, 'Session "{session}": Missing metadata: {missing}' )
                        ), $logger->getBuffer() );
                        $logger->clearBuffer();
                }
@@ -253,7 +249,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
                $metadata = $info->getProviderMetadata();
                $this->assertFalse( $provider->refreshSessionInfo( $info, $request, $metadata ) );
                $this->assertSame( array(
-                       array( LogLevel::INFO, "Session X: No BotPassword for {$bp->getUserCentralId()} Foobar" ),
+                       array( LogLevel::INFO, 'Session "{session}": No BotPassword for {centralId} {appId}' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
@@ -263,7 +259,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
                $metadata = $info->getProviderMetadata();
                $this->assertFalse( $provider->refreshSessionInfo( $info, $request, $metadata ) );
                $this->assertSame( array(
-                       array( LogLevel::INFO, 'Session X: BotPassword token check failed' ),
+                       array( LogLevel::INFO, 'Session "{session}": BotPassword token check failed' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
@@ -275,7 +271,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
                $metadata = $info->getProviderMetadata();
                $this->assertFalse( $provider->refreshSessionInfo( $info, $request2, $metadata ) );
                $this->assertSame( array(
-                       array( LogLevel::INFO, 'Session X: Restrictions check failed' ),
+                       array( LogLevel::INFO, 'Session "{session}": Restrictions check failed' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
index 9ba67df..659826f 100644 (file)
@@ -4,6 +4,7 @@ namespace MediaWiki\Session;
 
 use MediaWikiTestCase;
 use User;
+use Psr\Log\LogLevel;
 
 /**
  * @group Session
@@ -159,7 +160,8 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                        'cookieOptions' => array( 'prefix' => 'x' ),
                );
                $provider = new CookieSessionProvider( $params );
-               $provider->setLogger( new \TestLogger() );
+               $logger = new \TestLogger( true );
+               $provider->setLogger( $logger );
                $provider->setConfig( $this->getConfig() );
                $provider->setManager( new SessionManager() );
 
@@ -174,6 +176,8 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                $request = new \FauxRequest();
                $info = $provider->provideSessionInfo( $request );
                $this->assertNull( $info );
+               $this->assertSame( array(), $logger->getBuffer() );
+               $logger->clearBuffer();
 
                // Session key only
                $request = new \FauxRequest();
@@ -188,6 +192,13 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                $this->assertSame( 0, $info->getUserInfo()->getId() );
                $this->assertNull( $info->getUserInfo()->getName() );
                $this->assertFalse( $info->forceHTTPS() );
+               $this->assertSame( array(
+                       array(
+                               LogLevel::DEBUG,
+                               'Session "{session}" requested without UserID cookie',
+                       ),
+               ), $logger->getBuffer() );
+               $logger->clearBuffer();
 
                // User, no session key
                $request = new \FauxRequest();
@@ -203,6 +214,8 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                $this->assertSame( $id, $info->getUserInfo()->getId() );
                $this->assertSame( $name, $info->getUserInfo()->getName() );
                $this->assertFalse( $info->forceHTTPS() );
+               $this->assertSame( array(), $logger->getBuffer() );
+               $logger->clearBuffer();
 
                // User and session key
                $request = new \FauxRequest();
@@ -219,6 +232,8 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                $this->assertSame( $id, $info->getUserInfo()->getId() );
                $this->assertSame( $name, $info->getUserInfo()->getName() );
                $this->assertFalse( $info->forceHTTPS() );
+               $this->assertSame( array(), $logger->getBuffer() );
+               $logger->clearBuffer();
 
                // User with bad token
                $request = new \FauxRequest();
@@ -229,6 +244,13 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                ), '' );
                $info = $provider->provideSessionInfo( $request );
                $this->assertNull( $info );
+               $this->assertSame( array(
+                       array(
+                               LogLevel::WARNING,
+                               'Session "{session}" requested with invalid Token cookie.'
+                       ),
+               ), $logger->getBuffer() );
+               $logger->clearBuffer();
 
                // User id with no token
                $request = new \FauxRequest();
@@ -245,6 +267,8 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                $this->assertSame( $id, $info->getUserInfo()->getId() );
                $this->assertSame( $name, $info->getUserInfo()->getName() );
                $this->assertFalse( $info->forceHTTPS() );
+               $this->assertSame( array(), $logger->getBuffer() );
+               $logger->clearBuffer();
 
                $request = new \FauxRequest();
                $request->setCookies( array(
@@ -252,6 +276,8 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                ), '' );
                $info = $provider->provideSessionInfo( $request );
                $this->assertNull( $info );
+               $this->assertSame( array(), $logger->getBuffer() );
+               $logger->clearBuffer();
 
                // User and session key, with forceHTTPS flag
                $request = new \FauxRequest();
@@ -269,6 +295,8 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                $this->assertSame( $id, $info->getUserInfo()->getId() );
                $this->assertSame( $name, $info->getUserInfo()->getName() );
                $this->assertTrue( $info->forceHTTPS() );
+               $this->assertSame( array(), $logger->getBuffer() );
+               $logger->clearBuffer();
 
                // Invalid user id
                $request = new \FauxRequest();
@@ -278,6 +306,8 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                ), '' );
                $info = $provider->provideSessionInfo( $request );
                $this->assertNull( $info );
+               $this->assertSame( array(), $logger->getBuffer() );
+               $logger->clearBuffer();
 
                // User id with matching name
                $request = new \FauxRequest();
@@ -295,6 +325,8 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                $this->assertSame( $id, $info->getUserInfo()->getId() );
                $this->assertSame( $name, $info->getUserInfo()->getName() );
                $this->assertFalse( $info->forceHTTPS() );
+               $this->assertSame( array(), $logger->getBuffer() );
+               $logger->clearBuffer();
 
                // User id with wrong name
                $request = new \FauxRequest();
@@ -305,6 +337,13 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                ), '' );
                $info = $provider->provideSessionInfo( $request );
                $this->assertNull( $info );
+               $this->assertSame( array(
+                       array(
+                               LogLevel::WARNING,
+                               'Session "{session}" requested with mismatched UserID and UserName cookies.',
+                       ),
+               ), $logger->getBuffer() );
+               $logger->clearBuffer();
        }
 
        public function testGetVaryCookies() {
@@ -529,8 +568,6 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
        }
 
        public function testPersistSessionWithHook() {
-               $that = $this;
-
                $provider = new CookieSessionProvider( array(
                        'priority' => 1,
                        'sessionName' => 'MySessionName',
@@ -581,14 +618,14 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                // Logged-in user, no remember
                $mock = $this->getMock( __CLASS__, array( 'onUserSetCookies' ) );
                $mock->expects( $this->once() )->method( 'onUserSetCookies' )
-                       ->will( $this->returnCallback( function ( $u, &$sessionData, &$cookies ) use ( $that, $user ) {
-                               $that->assertSame( $user, $u );
-                               $that->assertEquals( array(
+                       ->will( $this->returnCallback( function ( $u, &$sessionData, &$cookies ) use ( $user ) {
+                               $this->assertSame( $user, $u );
+                               $this->assertEquals( array(
                                        'wsUserID' => $user->getId(),
                                        'wsUserName' => $user->getName(),
                                        'wsToken' => $user->getToken(),
                                ), $sessionData );
-                               $that->assertEquals( array(
+                               $this->assertEquals( array(
                                        'UserID' => $user->getId(),
                                        'UserName' => $user->getName(),
                                        'Token' => false,
@@ -624,14 +661,14 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                // Logged-in user, remember
                $mock = $this->getMock( __CLASS__, array( 'onUserSetCookies' ) );
                $mock->expects( $this->once() )->method( 'onUserSetCookies' )
-                       ->will( $this->returnCallback( function ( $u, &$sessionData, &$cookies ) use ( $that, $user ) {
-                               $that->assertSame( $user, $u );
-                               $that->assertEquals( array(
+                       ->will( $this->returnCallback( function ( $u, &$sessionData, &$cookies ) use ( $user ) {
+                               $this->assertSame( $user, $u );
+                               $this->assertEquals( array(
                                        'wsUserID' => $user->getId(),
                                        'wsUserName' => $user->getName(),
                                        'wsToken' => $user->getToken(),
                                ), $sessionData );
-                               $that->assertEquals( array(
+                               $this->assertEquals( array(
                                        'UserID' => $user->getId(),
                                        'UserName' => $user->getName(),
                                        'Token' => $user->getToken(),
index 3044aa7..e071132 100644 (file)
@@ -114,7 +114,8 @@ class PHPSessionHandlerTest extends MediaWikiTestCase {
 
                $store = new TestBagOStuff();
                $logger = new \TestLogger( true, function ( $m ) {
-                       return preg_match( '/^SessionBackend a{32} /', $m ) ? null : $m;
+                       // Discard all log events starting with expected prefix
+                       return preg_match( '/^SessionBackend "\{session\}" /', $m ) ? null : $m;
                } );
                $manager = new SessionManager( array(
                        'store' => $store,
index b411f3c..f9c9b8e 100644 (file)
@@ -2,7 +2,6 @@
 
 namespace MediaWiki\Session;
 
-use Psr\Log\LogLevel;
 use MediaWikiTestCase;
 
 /**
index d8d5b4b..16beb72 100644 (file)
@@ -2,8 +2,9 @@
 
 namespace MediaWiki\Session;
 
-use Psr\Log\LogLevel;
+use AuthPlugin;
 use MediaWikiTestCase;
+use Psr\Log\LogLevel;
 use User;
 
 /**
@@ -596,7 +597,6 @@ class SessionManagerTest extends MediaWikiTestCase {
                        'Bar' => array( 'X', 'Bar1', 3 => 'Bar2' ),
                        'Quux' => array( 'Quux' ),
                        'Baz' => array(),
-                       'Quux' => array( 'Quux' ),
                );
 
                $this->assertEquals( $expect, $manager->getVaryHeaders() );
@@ -760,10 +760,11 @@ class SessionManagerTest extends MediaWikiTestCase {
        public function testAutoCreateUser() {
                global $wgGroupPermissions;
 
-               $that = $this;
-
                \ObjectCache::$instances[__METHOD__] = new TestBagOStuff();
                $this->setMwGlobals( array( 'wgMainCacheType' => __METHOD__ ) );
+               $this->setMWGlobals( array(
+                       'wgAuth' => new AuthPlugin,
+               ) );
 
                $this->stashMwGlobals( array( 'wgGroupPermissions' ) );
                $wgGroupPermissions['*']['createaccount'] = true;
@@ -779,7 +780,6 @@ class SessionManagerTest extends MediaWikiTestCase {
                                return null;
                        }
                        $m = str_replace( 'MediaWiki\Session\SessionManager::autoCreateUser: ', '', $m );
-                       $m = preg_replace( '/ - from: .*$/', ' - from: XXX', $m );
                        return $m;
                } );
                $manager->setLogger( $logger );
@@ -805,7 +805,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                        $user->getId(), User::idFromName( 'UTSessionAutoCreate1', User::READ_LATEST )
                );
                $this->assertSame( array(
-                       array( LogLevel::INFO, 'creating new user (UTSessionAutoCreate1) - from: XXX' ),
+                       array( LogLevel::INFO, 'creating new user ({username}) - from: {url}' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
@@ -819,7 +819,10 @@ class SessionManagerTest extends MediaWikiTestCase {
                $this->assertEquals( 0, User::idFromName( 'UTDoesNotExist', User::READ_LATEST ) );
                $session->clear();
                $this->assertSame( array(
-                       array( LogLevel::DEBUG, 'user is blocked from this wiki, blacklisting' ),
+                       array(
+                               LogLevel::DEBUG,
+                               'user is blocked from this wiki, blacklisting',
+                       ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
@@ -835,7 +838,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                        $user->getId(), User::idFromName( 'UTSessionAutoCreate2', User::READ_LATEST )
                );
                $this->assertSame( array(
-                       array( LogLevel::INFO, 'creating new user (UTSessionAutoCreate2) - from: XXX' ),
+                       array( LogLevel::INFO, 'creating new user ({username}) - from: {url}' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
@@ -873,7 +876,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                        $user->getId(), User::idFromName( 'UTSessionAutoCreate3', User::READ_LATEST )
                );
                $this->assertSame( array(
-                       array( LogLevel::INFO, 'creating new user (UTSessionAutoCreate3) - from: XXX' ),
+                       array( LogLevel::INFO, 'creating new user ({username}) - from: {url}' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
@@ -1007,10 +1010,10 @@ class SessionManagerTest extends MediaWikiTestCase {
                $logger->clearBuffer();
 
                // Sanity check that creation still works, and test completion hook
-               $cb = $this->callback( function ( User $user ) use ( $that ) {
-                       $that->assertNotEquals( 0, $user->getId() );
-                       $that->assertSame( 'UTSessionAutoCreate4', $user->getName() );
-                       $that->assertEquals(
+               $cb = $this->callback( function ( User $user ) {
+                       $this->assertNotEquals( 0, $user->getId() );
+                       $this->assertSame( 'UTSessionAutoCreate4', $user->getName() );
+                       $this->assertEquals(
                                $user->getId(), User::idFromName( 'UTSessionAutoCreate4', User::READ_LATEST )
                        );
                        return true;
@@ -1039,7 +1042,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                        'LocalUserCreated' => array(),
                ) );
                $this->assertSame( array(
-                       array( LogLevel::INFO, 'creating new user (UTSessionAutoCreate4) - from: XXX' ),
+                       array( LogLevel::INFO, 'creating new user ({username}) - from: {url}' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
        }
@@ -1063,22 +1066,14 @@ class SessionManagerTest extends MediaWikiTestCase {
                        $this->objectCacheDef( $provider1 ),
                ) );
 
-               $user = User::newFromName( 'UTSysop' );
-               $token = $user->getToken( true );
-
                $this->assertFalse( $manager->isUserSessionPrevented( 'UTSysop' ) );
                $manager->preventSessionsForUser( 'UTSysop' );
-               $this->assertNotEquals( $token, User::newFromName( 'UTSysop' )->getToken() );
                $this->assertTrue( $manager->isUserSessionPrevented( 'UTSysop' ) );
        }
 
        public function testLoadSessionInfoFromStore() {
                $manager = $this->getManager();
-               $logger = new \TestLogger( true, function ( $m ) {
-                       return preg_replace(
-                               '/^Session \[\d+\]\w+<(?:null|anon|[+-]:\d+:\w+)>\w+: /', 'Session X: ', $m
-                       );
-               } );
+               $logger = new \TestLogger( true );
                $manager->setLogger( $logger );
                $request = new \FauxRequest();
 
@@ -1192,7 +1187,10 @@ class SessionManagerTest extends MediaWikiTestCase {
                $this->assertSame( $unverifiedUserInfo, $info->getUserInfo() );
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( array(
-                       array( LogLevel::WARNING, 'Session X: Unverified user provided and no metadata to auth it' )
+                       array(
+                               LogLevel::WARNING,
+                               'Session "{session}": Unverified user provided and no metadata to auth it',
+                       )
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
@@ -1203,7 +1201,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                ) );
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( array(
-                       array( LogLevel::WARNING, 'Session X: Null provider and no metadata' ),
+                       array( LogLevel::WARNING, 'Session "{session}": Null provider and no metadata' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
@@ -1226,7 +1224,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                $this->assertFalse( $info->isIdSafe(), 'sanity check' );
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( array(
-                       array( LogLevel::INFO, 'Session X: No user provided and provider cannot set user' )
+                       array( LogLevel::INFO, 'Session "{session}": No user provided and provider cannot set user' )
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
@@ -1234,14 +1232,14 @@ class SessionManagerTest extends MediaWikiTestCase {
                $this->store->setRawSession( $id, true );
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( array(
-                       array( LogLevel::WARNING, 'Session X: Bad data' ),
+                       array( LogLevel::WARNING, 'Session "{session}": Bad data' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
                $this->store->setRawSession( $id, array( 'data' => array() ) );
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( array(
-                       array( LogLevel::WARNING, 'Session X: Bad data structure' ),
+                       array( LogLevel::WARNING, 'Session "{session}": Bad data structure' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
@@ -1249,21 +1247,21 @@ class SessionManagerTest extends MediaWikiTestCase {
                $this->store->setRawSession( $id, array( 'metadata' => $metadata ) );
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( array(
-                       array( LogLevel::WARNING, 'Session X: Bad data structure' ),
+                       array( LogLevel::WARNING, 'Session "{session}": Bad data structure' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
                $this->store->setRawSession( $id, array( 'metadata' => $metadata, 'data' => true ) );
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( array(
-                       array( LogLevel::WARNING, 'Session X: Bad data structure' ),
+                       array( LogLevel::WARNING, 'Session "{session}": Bad data structure' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
                $this->store->setRawSession( $id, array( 'metadata' => true, 'data' => array() ) );
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( array(
-                       array( LogLevel::WARNING, 'Session X: Bad data structure' ),
+                       array( LogLevel::WARNING, 'Session "{session}": Bad data structure' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
@@ -1273,7 +1271,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                        $this->store->setRawSession( $id, array( 'metadata' => $tmp, 'data' => array() ) );
                        $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                        $this->assertSame( array(
-                               array( LogLevel::WARNING, 'Session X: Bad metadata' ),
+                               array( LogLevel::WARNING, 'Session "{session}": Bad metadata' ),
                        ), $logger->getBuffer() );
                        $logger->clearBuffer();
                }
@@ -1299,7 +1297,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                ) );
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( array(
-                       array( LogLevel::WARNING, 'Session X: Wrong provider, Bad !== Mock' ),
+                       array( LogLevel::WARNING, 'Session "{session}": Wrong provider Bad !== Mock' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
@@ -1311,7 +1309,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                ) );
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( array(
-                       array( LogLevel::WARNING, 'Session X: Unknown provider, Bad' ),
+                       array( LogLevel::WARNING, 'Session "{session}": Unknown provider Bad' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
@@ -1334,7 +1332,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                ) );
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( array(
-                       array( LogLevel::ERROR, 'Session X: Invalid ID' ),
+                       array( LogLevel::ERROR, 'Session "{session}": {exception}' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
@@ -1347,7 +1345,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                ) );
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( array(
-                       array( LogLevel::ERROR, 'Session X: Invalid user name' ),
+                       array( LogLevel::ERROR, 'Session "{session}": {exception}', ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
@@ -1362,7 +1360,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                ) );
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( array(
-                       array( LogLevel::WARNING, 'Session X: User ID mismatch, 2 !== 1' ),
+                       array( LogLevel::WARNING, 'Session "{session}": User ID mismatch, {uid_a} !== {uid_b}' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
@@ -1377,7 +1375,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                ) );
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( array(
-                       array( LogLevel::WARNING, 'Session X: User name mismatch, X !== UTSysop' ),
+                       array( LogLevel::WARNING, 'Session "{session}": User name mismatch, {uname_a} !== {uname_b}' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
@@ -1393,7 +1391,8 @@ class SessionManagerTest extends MediaWikiTestCase {
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( array(
                        array(
-                               LogLevel::WARNING, 'Session X: User ID matched but name didn\'t (rename?), X !== UTSysop'
+                               LogLevel::WARNING,
+                               'Session "{session}": User ID matched but name didn\'t (rename?), {uname_a} !== {uname_b}'
                        ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
@@ -1410,7 +1409,9 @@ class SessionManagerTest extends MediaWikiTestCase {
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( array(
                        array(
-                               LogLevel::WARNING, 'Session X: Metadata has an anonymous user, but a non-anon user was provided'
+                               LogLevel::WARNING,
+                               'Session "{session}": Metadata has an anonymous user, ' .
+                               'but a non-anon user was provided',
                        ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
@@ -1494,7 +1495,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                ) );
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( array(
-                       array( LogLevel::WARNING, 'Session X: User token mismatch' ),
+                       array( LogLevel::WARNING, 'Session "{session}": User token mismatch' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
@@ -1538,7 +1539,10 @@ class SessionManagerTest extends MediaWikiTestCase {
                ) );
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertSame( array(
-                       array( LogLevel::WARNING, 'Session X: Metadata merge failed: no merge!' ),
+                       array(
+                               LogLevel::WARNING,
+                               'Session "{session}": Metadata merge failed: {exception}',
+                       ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
 
@@ -1643,7 +1647,6 @@ class SessionManagerTest extends MediaWikiTestCase {
                $this->assertSame( array(), $logger->getBuffer() );
 
                // Hook
-               $that = $this;
                $called = false;
                $data = array( 'foo' => 1 );
                $this->store->setSession( $id, array( 'metadata' => $metadata, 'data' => $data ) );
@@ -1654,14 +1657,14 @@ class SessionManagerTest extends MediaWikiTestCase {
                ) );
                $this->mergeMwGlobalArrayValue( 'wgHooks', array(
                        'SessionCheckInfo' => array( function ( &$reason, $i, $r, $m, $d ) use (
-                               $that, $info, $metadata, $data, $request, &$called
+                               $info, $metadata, $data, $request, &$called
                        ) {
-                               $that->assertSame( $info->getId(), $i->getId() );
-                               $that->assertSame( $info->getProvider(), $i->getProvider() );
-                               $that->assertSame( $info->getUserInfo(), $i->getUserInfo() );
-                               $that->assertSame( $request, $r );
-                               $that->assertEquals( $metadata, $m );
-                               $that->assertEquals( $data, $d );
+                               $this->assertSame( $info->getId(), $i->getId() );
+                               $this->assertSame( $info->getProvider(), $i->getProvider() );
+                               $this->assertSame( $info->getUserInfo(), $i->getUserInfo() );
+                               $this->assertSame( $request, $r );
+                               $this->assertEquals( $metadata, $m );
+                               $this->assertEquals( $data, $d );
                                $called = true;
                                return false;
                        } )
@@ -1669,7 +1672,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                $this->assertFalse( $loadSessionInfoFromStore( $info ) );
                $this->assertTrue( $called );
                $this->assertSame( array(
-                       array( LogLevel::WARNING, 'Session X: Hook aborted' ),
+                       array( LogLevel::WARNING, 'Session "{session}": Hook aborted' ),
                ), $logger->getBuffer() );
                $logger->clearBuffer();
        }
index 4305ceb..dd62074 100644 (file)
@@ -95,18 +95,15 @@ class CachingSiteStoreTest extends MediaWikiTestCase {
                        ->disableOriginalConstructor()
                        ->getMock();
 
-               // php 5.3 compatibility!
-               $that = $this;
-
                $dbSiteStore->expects( $this->any() )
                        ->method( 'getSite' )
-                       ->will( $this->returnValue( $that->getTestSite() ) );
+                       ->will( $this->returnValue( $this->getTestSite() ) );
 
                $dbSiteStore->expects( $this->any() )
                        ->method( 'getSites' )
-                       ->will( $this->returnCallback( function() use ( $that ) {
+                       ->will( $this->returnCallback( function() {
                                $siteList = new SiteList();
-                               $siteList->setSite( $that->getTestSite() );
+                               $siteList->setSite( $this->getTestSite() );
 
                                return $siteList;
                        } ) );
index b11b1a9..a49f06c 100644 (file)
@@ -34,11 +34,10 @@ class SiteImporterTest extends PHPUnit_Framework_TestCase {
        private function newSiteImporter( array $expectedSites, $errorCount ) {
                $store = $this->getMock( 'SiteStore' );
 
-               $that = $this;
                $store->expects( $this->once() )
                        ->method( 'saveSites' )
-                       ->will( $this->returnCallback( function ( $sites ) use ( $expectedSites, $that ) {
-                               $that->assertSitesEqual( $expectedSites, $sites );
+                       ->will( $this->returnCallback( function ( $sites ) use ( $expectedSites ) {
+                               $this->assertSitesEqual( $expectedSites, $sites );
                        } ) );
 
                $store->expects( $this->any() )
diff --git a/tests/phpunit/languages/classes/LanguageGanTest.php b/tests/phpunit/languages/classes/LanguageGanTest.php
new file mode 100644 (file)
index 0000000..d548380
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+class LanguageGanTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider provideAutoConvertToAllVariants
+        * @covers Language::autoConvertToAllVariants
+        */
+       public function testAutoConvertToAllVariants( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->autoConvertToAllVariants( $value ) );
+       }
+
+       public static function provideAutoConvertToAllVariants() {
+               return array(
+                       // zh2Hans
+                       array(
+                               array(
+                                       'gan' => '㑯',
+                                       'gan-hans' => '㑔',
+                                       'gan-hant' => '㑯',
+                               ),
+                               '㑯'
+                       ),
+                       // zh2Hant
+                       array(
+                               array(
+                                       'gan' => '㐷',
+                                       'gan-hans' => '㐷',
+                                       'gan-hant' => '傌',
+                               ),
+                               '㐷'
+                       ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageIuTest.php b/tests/phpunit/languages/classes/LanguageIuTest.php
new file mode 100644 (file)
index 0000000..4599e7a
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+class LanguageIuTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider provideAutoConvertToAllVariants
+        * @covers Language::autoConvertToAllVariants
+        */
+       public function testAutoConvertToAllVariants( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->autoConvertToAllVariants( $value ) );
+       }
+
+       public static function provideAutoConvertToAllVariants() {
+               return array(
+                       // ike-cans
+                       array(
+                               array(
+                                       'ike-cans' => 'ᐴ',
+                                       'ike-latn' => 'PUU',
+                                       'iu' => 'PUU',
+                               ),
+                               'PUU'
+                       ),
+                       // ike-latn
+                       array(
+                               array(
+                                       'ike-cans' => 'ᐴ',
+                                       'ike-latn' => 'puu',
+                                       'iu' => 'ᐴ',
+                               ),
+                               'ᐴ'
+                       ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageKkTest.php b/tests/phpunit/languages/classes/LanguageKkTest.php
new file mode 100644 (file)
index 0000000..33968d9
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+
+class LanguageKkTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider provideAutoConvertToAllVariants
+        * @covers Language::autoConvertToAllVariants
+        */
+       public function testAutoConvertToAllVariants( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->autoConvertToAllVariants( $value ) );
+       }
+
+       public static function provideAutoConvertToAllVariants() {
+               return array(
+                       array(
+                               array(
+                                       'kk'      => 'Адамдарға ақыл-парасат, ар-ождан берілген',
+                                       'kk-cyrl' => 'Адамдарға ақыл-парасат, ар-ождан берілген',
+                                       'kk-latn' => 'Adamdarğa aqıl-parasat, ar-ojdan berilgen',
+                                       'kk-arab' => 'ادامدارعا اقىل-پاراسات، ار-وجدان بەرىلگەن',
+                                       'kk-kz'   => 'Адамдарға ақыл-парасат, ар-ождан берілген',
+                                       'kk-tr'   => 'Adamdarğa aqıl-parasat, ar-ojdan berilgen',
+                                       'kk-cn'   => 'ادامدارعا اقىل-پاراسات، ار-وجدان بەرىلگەن'
+                               ),
+                               'Адамдарға ақыл-парасат, ар-ождан берілген'
+                       ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageKuTest.php b/tests/phpunit/languages/classes/LanguageKuTest.php
new file mode 100644 (file)
index 0000000..a87fae7
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+
+class LanguageKuTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider provideAutoConvertToAllVariants
+        * @covers Language::autoConvertToAllVariants
+        */
+       public function testAutoConvertToAllVariants( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->autoConvertToAllVariants( $value ) );
+       }
+
+       public static function provideAutoConvertToAllVariants() {
+               return array(
+                       array(
+                               array(
+                                       'ku'      => '١',
+                                       'ku-arab' => '١',
+                                       'ku-latn' => '1',
+                               ),
+                               '١'
+                       ),
+                       array(
+                               array(
+                                       'ku'      => 'Wîkîpediya ensîklopediyeke azad bi rengê wîkî ye.',
+                                       'ku-arab' => 'ویکیپەدیائە نسیکلۆپەدیەکەئا زاد ب رەنگێ ویکی یە.',
+                                       'ku-latn' => 'Wîkîpediya ensîklopediyeke azad bi rengê wîkî ye.',
+                               ),
+                               'Wîkîpediya ensîklopediyeke azad bi rengê wîkî ye.'
+                       ),
+                       array(
+                               array(
+                                       'ku'      => 'ویکیپەدیا ەنسیکلۆپەدیەکەئا زاد ب رەنگێ ویکی یە.',
+                                       'ku-arab' => 'ویکیپەدیا ەنسیکلۆپەدیەکەئا زاد ب رەنگێ ویکی یە.',
+                                       'ku-latn' => 'wîkîpedîa ensîklopedîekea zad b rengê wîkî îe.',
+                               ),
+                               'ویکیپەدیا ەنسیکلۆپەدیەکەئا زاد ب رەنگێ ویکی یە.'
+                       ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageShiTest.php b/tests/phpunit/languages/classes/LanguageShiTest.php
new file mode 100644 (file)
index 0000000..90843c1
--- /dev/null
@@ -0,0 +1,32 @@
+<?php
+
+class LanguageShiTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider provideAutoConvertToAllVariants
+        * @covers Language::autoConvertToAllVariants
+        */
+       public function testAutoConvertToAllVariants( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->autoConvertToAllVariants( $value ) );
+       }
+
+       public static function provideAutoConvertToAllVariants() {
+               return array(
+                       array(
+                               array(
+                                       'shi'      => 'AƔ',
+                                       'shi-tfng' => 'ⴰⵖ',
+                                       'shi-latn' => 'AƔ',
+                               ),
+                               'AƔ'
+                       ),
+                       array(
+                               array(
+                                       'shi'      => 'ⴰⵖ',
+                                       'shi-tfng' => 'ⴰⵖ',
+                                       'shi-latn' => 'aɣ',
+                               ),
+                               'ⴰⵖ'
+                       ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageTgTest.php b/tests/phpunit/languages/classes/LanguageTgTest.php
new file mode 100644 (file)
index 0000000..ff3a7a4
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+
+class LanguageTgTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider provideAutoConvertToAllVariants
+        * @covers Language::autoConvertToAllVariants
+        */
+       public function testAutoConvertToAllVariants( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->autoConvertToAllVariants( $value ) );
+       }
+
+       public static function provideAutoConvertToAllVariants() {
+               return array(
+                       array(
+                               array(
+                                       'tg'      => 'г',
+                                       'tg-latn' => 'g',
+                               ),
+                               'г'
+                       ),
+                       array(
+                               array(
+                                       'tg'      => 'g',
+                                       'tg-latn' => 'g',
+                               ),
+                               'g'
+                       ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageZhTest.php b/tests/phpunit/languages/classes/LanguageZhTest.php
new file mode 100644 (file)
index 0000000..f19d967
--- /dev/null
@@ -0,0 +1,121 @@
+<?php
+
+class LanguageZhTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider provideAutoConvertToAllVariants
+        * @covers Language::autoConvertToAllVariants
+        */
+       public function testAutoConvertToAllVariants( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->autoConvertToAllVariants( $value ) );
+       }
+
+       public static function provideAutoConvertToAllVariants() {
+               return array(
+                       // Plain hant -> hans
+                       array(
+                               array(
+                                       'zh'      => '㑯',
+                                       'zh-hans' => '㑔',
+                                       'zh-hant' => '㑯',
+                                       'zh-cn'   => '㑔',
+                                       'zh-hk'   => '㑯',
+                                       'zh-mo'   => '㑯',
+                                       'zh-my'   => '㑔',
+                                       'zh-sg'   => '㑔',
+                                       'zh-tw'   => '㑯',
+                               ),
+                               '㑯'
+                       ),
+                       // Plain hans -> hant
+                       array(
+                               array(
+                                       'zh'      => '㐷',
+                                       'zh-hans' => '㐷',
+                                       'zh-hant' => '傌',
+                                       'zh-cn'   => '㐷',
+                                       'zh-hk'   => '傌',
+                                       'zh-mo'   => '傌',
+                                       'zh-my'   => '㐷',
+                                       'zh-sg'   => '㐷',
+                                       'zh-tw'   => '傌',
+                               ),
+                               '㐷'
+                       ),
+                       // zh-cn specific
+                       array(
+                               array(
+                                       'zh'      => '仲介',
+                                       'zh-hans' => '仲介',
+                                       'zh-hant' => '仲介',
+                                       'zh-cn'   => '中介',
+                                       'zh-hk'   => '仲介',
+                                       'zh-mo'   => '仲介',
+                                       'zh-my'   => '中介',
+                                       'zh-sg'   => '中介',
+                                       'zh-tw'   => '仲介',
+                               ),
+                               '仲介'
+                       ),
+                       // zh-hk specific
+                       array(
+                               array(
+                                       'zh'      => '中文里',
+                                       'zh-hans' => '中文里',
+                                       'zh-hant' => '中文裡',
+                                       'zh-cn'   => '中文里',
+                                       'zh-hk'   => '中文裏',
+                                       'zh-mo'   => '中文裏',
+                                       'zh-my'   => '中文里',
+                                       'zh-sg'   => '中文里',
+                                       'zh-tw'   => '中文裡',
+                               ),
+                               '中文里'
+                       ),
+                       // zh-tw specific
+                       array(
+                               array(
+                                       'zh'      => '甲肝',
+                                       'zh-hans' => '甲肝',
+                                       'zh-hant' => '甲肝',
+                                       'zh-cn'   => '甲肝',
+                                       'zh-hk'   => '甲肝',
+                                       'zh-mo'   => '甲肝',
+                                       'zh-my'   => '甲肝',
+                                       'zh-sg'   => '甲肝',
+                                       'zh-tw'   => 'A肝',
+                               ),
+                               '甲肝'
+                       ),
+                       // zh-tw overrides zh-hant
+                       array(
+                               array(
+                                       'zh'      => '账',
+                                       'zh-hans' => '账',
+                                       'zh-hant' => '賬',
+                                       'zh-cn'   => '账',
+                                       'zh-hk'   => '賬',
+                                       'zh-mo'   => '賬',
+                                       'zh-my'   => '账',
+                                       'zh-sg'   => '账',
+                                       'zh-tw'   => '帳',
+                               ),
+                               '账'
+                       ),
+                       // zh-hk overrides zh-hant
+                       array(
+                               array(
+                                       'zh'      => '一地里',
+                                       'zh-hans' => '一地里',
+                                       'zh-hant' => '一地裡',
+                                       'zh-cn'   => '一地里',
+                                       'zh-hk'   => '一地裏',
+                                       'zh-mo'   => '一地裏',
+                                       'zh-my'   => '一地里',
+                                       'zh-sg'   => '一地里',
+                                       'zh-tw'   => '一地裡',
+                               ),
+                               '一地里'
+                       ),
+               );
+       }
+}
index 0ae0b21..81dc412 100755 (executable)
@@ -254,14 +254,6 @@ class PHPUnitMaintClass extends Maintenance {
 $maintClass = 'PHPUnitMaintClass';
 require RUN_MAINTENANCE_IF_MAIN;
 
-// Prevent segfault when we have lots of unit tests (bug 62623)
-if ( version_compare( PHP_VERSION, '5.4.0', '<' ) ) {
-       register_shutdown_function( function () {
-               gc_collect_cycles();
-               gc_disable();
-       } );
-}
-
 $ok = false;
 
 if ( class_exists( 'PHPUnit_TextUI_Command' ) ) {
@@ -302,4 +294,8 @@ if ( $puVersion !== '@package_version@' && version_compare( $puVersion, '3.7.0',
        exit( 1 );
 }
 
+echo defined( 'HHVM_VERSION' ) ?
+       'Using HHVM ' . HHVM_VERSION . ' (' . PHP_VERSION . ")\n" :
+       'Using PHP ' . PHP_VERSION . "\n";
+
 PHPUnit_TextUI_Command::main();