Merge "Check result of preg_match_all in Parser.php"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 2 Jun 2015 22:08:42 +0000 (22:08 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 2 Jun 2015 22:08:42 +0000 (22:08 +0000)
162 files changed:
.jshintrc
.mailmap
CREDITS
Gemfile
Gemfile.lock
RELEASE-NOTES-1.26
api.php
autoload.php
composer.json
docs/extension.schema.json
img_auth.php
includes/Html.php
includes/MWTimestamp.php
includes/MediaWiki.php
includes/User.php
includes/api/ApiBase.php
includes/api/ApiCreateAccount.php
includes/api/ApiEditPage.php
includes/api/ApiEmailUser.php
includes/api/ApiExpandTemplates.php
includes/api/ApiHelp.php
includes/api/ApiLogin.php
includes/api/ApiOpenSearch.php
includes/api/ApiPageSet.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiStashEdit.php
includes/api/ApiUpload.php
includes/api/i18n/en.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/ko.json
includes/api/i18n/qqq.json
includes/api/i18n/zh-hans.json
includes/changes/RecentChange.php
includes/db/LBFactory.php
includes/db/LoadBalancer.php
includes/deferred/DeferredUpdates.php
includes/deferred/SiteStatsUpdate.php
includes/exception/HttpError.php
includes/installer/i18n/es.json
includes/installer/i18n/fa.json
includes/installer/i18n/he.json
includes/installer/i18n/ksh.json
includes/installer/i18n/ne.json
includes/installer/i18n/nl.json
includes/installer/i18n/nn.json
includes/installer/i18n/ps.json
includes/installer/i18n/sd.json [new file with mode: 0644]
includes/installer/i18n/su.json
includes/installer/i18n/wuu.json
includes/installer/i18n/yi.json
includes/jobqueue/Job.php
includes/jobqueue/JobQueueRedis.php
includes/jobqueue/JobRunner.php
includes/jobqueue/jobs/ActivityUpdateJob.php
includes/jobqueue/jobs/AssembleUploadChunksJob.php
includes/jobqueue/jobs/DoubleRedirectJob.php
includes/jobqueue/jobs/DuplicateJob.php
includes/jobqueue/jobs/EmaillingJob.php
includes/jobqueue/jobs/EnotifNotifyJob.php
includes/jobqueue/jobs/EnqueueJob.php
includes/jobqueue/jobs/HTMLCacheUpdateJob.php
includes/jobqueue/jobs/NullJob.php
includes/jobqueue/jobs/PublishStashedFileJob.php
includes/jobqueue/jobs/RecentChangesUpdateJob.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/jobqueue/jobs/ThumbnailRenderJob.php
includes/jobqueue/jobs/UploadFromUrlJob.php
includes/libs/CSSMin.php
includes/mail/UserMailer.php
includes/media/XMP.php
includes/page/WikiPage.php
includes/parser/MWTidy.php
includes/parser/Parser.php
includes/parser/ParserDiffTest.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/parser/StripState.php
includes/profiler/Profiler.php
includes/profiler/ProfilerStub.php
includes/registration/ExtensionRegistry.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderImageModule.php
includes/resourceloader/ResourceLoaderOOUIImageModule.php [new file with mode: 0644]
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevDelItem.php
includes/revisiondelete/RevDelList.php
includes/revisiondelete/RevDelLogItem.php
includes/revisiondelete/RevisionDeleter.php
includes/specials/SpecialContributions.php
includes/specials/SpecialExport.php
includes/specials/SpecialImport.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialMediaStatistics.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRecentchangeslinked.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/upload/UploadBase.php
includes/utils/MWFunction.php [deleted file]
jsduck.json
languages/Language.php
languages/LanguageConverter.php
languages/classes/LanguageEt.php
languages/i18n/arq.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bho.json
languages/i18n/bo.json
languages/i18n/br.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/dty.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/gl.json
languages/i18n/gom-deva.json
languages/i18n/hi.json
languages/i18n/ko.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/mai.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/nap.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/ru.json
languages/i18n/sa.json
languages/i18n/scn.json
languages/i18n/sd.json
languages/i18n/su.json
languages/i18n/tr.json
languages/i18n/uk.json
languages/i18n/wuu.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
load.php
maintenance/jsduck/categories.json
resources/Resources.php
resources/ResourcesOOUI.php [new file with mode: 0644]
resources/src/mediawiki.skinning/elements.css
resources/src/mediawiki.ui/components/checkbox.less
resources/src/mediawiki.ui/components/icons.less
resources/src/mediawiki.widgets/AUTHORS.txt [new file with mode: 0644]
resources/src/mediawiki.widgets/LICENSE.txt [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.css [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.Title.js
resources/src/mediawiki/mediawiki.js
tests/phpunit/includes/exception/HttpErrorTest.php [new file with mode: 0644]
tests/phpunit/includes/utils/MWFunctionTest.php [deleted file]
tests/phpunit/languages/LanguageTest.php
thumb.php

index 4bb2440..d72c31d 100644 (file)
--- a/.jshintrc
+++ b/.jshintrc
@@ -21,6 +21,7 @@
        "globals": {
                "mediaWiki": true,
                "JSON": true,
+               "OO": true,
                "jQuery": false,
                "QUnit": false,
                "sinon": false
index a1f0054..12ff31d 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -22,6 +22,7 @@ ayush_garg <ayush.ce13@iitp.ac.in>
 Bahodir Mansurov <bmansurov@wikimedia.org>
 Bartosz Dziewoński <matma.rex@gmail.com>
 Bartosz Dziewoński <matma.rex@gmail.com> <matmarex@wikimedia.org>
+Bartosz Dziewoński <matma.rex@gmail.com> <bdziewonski@wikimedia.org>
 Bene <benestar.wikimedia@gmail.com>
 Brad Jorsch <bjorsch@wikimedia.org>
 Brian Wolff <bawolff+wn@gmail.com>
diff --git a/CREDITS b/CREDITS
index 7725034..22dee7b 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -240,6 +240,7 @@ following names for their contribution to the product.
 * Van de Bugger
 * Ville Stadista
 * Vitaliy Filippov
+* Vivek Ghaisas
 * Waldir Pimenta
 * William Demchick
 * Yusuke Matsubara
diff --git a/Gemfile b/Gemfile
index 6f9c053..a67be6b 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -3,5 +3,5 @@
 
 source 'https://rubygems.org'
 
-gem 'mediawiki_selenium', '~> 1.0.1'
+gem 'mediawiki_selenium', '~> 1.2.0'
 gem 'rubocop', require: false
index 0b360ae..0d0a5c2 100644 (file)
@@ -5,7 +5,7 @@ GEM
     astrolabe (1.3.0)
       parser (>= 2.2.0.pre.3, < 3.0)
     builder (3.2.2)
-    childprocess (0.5.5)
+    childprocess (0.5.6)
       ffi (~> 1.0, >= 1.0.11)
     cucumber (1.3.19)
       builder (>= 2.1.2)
@@ -13,11 +13,11 @@ GEM
       gherkin (~> 2.12)
       multi_json (>= 1.7.5, < 2.0)
       multi_test (>= 0.1.2)
-    data_magic (0.20)
+    data_magic (0.21)
       faker (>= 1.1.2)
       yml_reader (>= 0.4)
     diff-lcs (1.2.5)
-    domain_name (0.5.23)
+    domain_name (0.5.24)
       unf (>= 0.0.5, < 1.0.0)
     faker (1.4.3)
       i18n (~> 0.5)
@@ -26,7 +26,7 @@ GEM
     faraday-cookie_jar (0.0.6)
       faraday (>= 0.7.4)
       http-cookie (~> 1.0.0)
-    ffi (1.9.6)
+    ffi (1.9.8)
     gherkin (2.12.2)
       multi_json (~> 1.3)
     headless (1.0.2)
@@ -37,7 +37,7 @@ GEM
     mediawiki_api (0.3.1)
       faraday (~> 0.9, >= 0.9.0)
       faraday-cookie_jar (~> 0.0, >= 0.0.6)
-    mediawiki_selenium (1.0.1)
+    mediawiki_selenium (1.2.0)
       cucumber (~> 1.3, >= 1.3.10)
       headless (~> 1.0, >= 1.0.1)
       json (~> 1.8, >= 1.8.1)
@@ -47,12 +47,12 @@ GEM
       rspec-expectations (~> 2.14, >= 2.14.4)
       syntax (~> 1.2, >= 1.2.0)
       thor (~> 0.19, >= 0.19.1)
-    mime-types (2.4.3)
+    mime-types (2.6.1)
     multi_json (1.11.0)
     multi_test (0.1.2)
     multipart-post (2.0.0)
     netrc (0.10.3)
-    page-object (1.0.3)
+    page-object (1.1.0)
       page_navigation (>= 0.9)
       selenium-webdriver (>= 2.44.0)
       watir-webdriver (>= 0.6.11)
@@ -62,7 +62,8 @@ GEM
       ast (>= 1.1, < 3.0)
     powerpack (0.1.0)
     rainbow (2.0.0)
-    rest-client (1.7.3)
+    rest-client (1.8.0)
+      http-cookie (>= 1.0.2, < 2.0)
       mime-types (>= 1.16, < 3.0)
       netrc (~> 0.7)
     rspec-expectations (2.99.2)
@@ -84,15 +85,15 @@ GEM
     thor (0.19.1)
     unf (0.1.4)
       unf_ext
-    unf_ext (0.0.6)
+    unf_ext (0.0.7.1)
     watir-webdriver (0.7.0)
       selenium-webdriver (>= 2.45)
-    websocket (1.2.1)
+    websocket (1.2.2)
     yml_reader (0.5)
 
 PLATFORMS
   ruby
 
 DEPENDENCIES
-  mediawiki_selenium (~> 1.0.1)
+  mediawiki_selenium (~> 1.2.0)
   rubocop
index 588dc56..af9e9d2 100644 (file)
@@ -44,16 +44,29 @@ changes to languages because of Bugzilla reports.
 * Added PageHistoryPager::doBatchLookups hook.
 * Added ParserCacheSaveComplete to ParserCache
 * supportsDirectEditing and supportsDirectApiEditing methods added to
-ContentHandler, to provide a way for ApiEditPage and EditPage to check
-if direct editing of content is allowed. These methods return false,
-by default for the ContentHandler base class and true for TextContentHandler
-and it's derivative classes (everything in core). For Content types that
-do not support direct editing, an alternative mechanism should be provided
-for editing, such as action overrides or specific api modules.
+  ContentHandler, to provide a way for ApiEditPage and EditPage to check
+  if direct editing of content is allowed. These methods return false,
+  by default for the ContentHandler base class and true for TextContentHandler
+  and it's derivative classes (everything in core). For Content types that
+  do not support direct editing, an alternative mechanism should be provided
+  for editing, such as action overrides or specific api modules.
 * mediaWiki.confirmCloseWindow now returns an object of functions, instead of
-one function. The callback can't be called directly any more. The callback function
-is replaced with confirmCloseWindow.release().
+  one function. The callback can't be called directly any more. The callback
+  function is replaced with confirmCloseWindow.release().
 * Removed maintenance script deleteImageMemcached.php.
+* MWFunction::newObj() was removed (deprecated in 1.25).
+  ObjectFactory::getObjectFromSpec() should be used instead.
+* The parser will no longer randomize the string it uses to mark the place of
+  items that were stripped during parsing. It will use a fixed string instead.
+  This causes the parser to re-use the regular expressions it uses to search
+  and replace markers rather than generate novel expressions on each parse.
+  Re-using regular expressions will improve performance on HHVM and the
+  forthcoming PHP 7. The interfaces changes accompanying this change are:
+  - Parser::getRandomString() and Parser::uniqPrefix() have been deprecated.
+  - The $uniq_prefix argument for Parser::extractTagsAndParams() and the
+    $prefix argument for StripState::_construct() are deprecated and their
+    value is ignored.
+
 
 == Compatibility ==
 
diff --git a/api.php b/api.php
index a9e5683..af7c452 100644 (file)
--- a/api.php
+++ b/api.php
@@ -88,20 +88,9 @@ if ( $processor ) {
        $processor->execute();
 }
 
-if ( function_exists( 'fastcgi_finish_request' ) ) {
-       fastcgi_finish_request();
-}
-
-JobQueueGroup::pushLazyJobs();
-
-// Execute any deferred updates
-DeferredUpdates::doUpdates();
-
 // Log what the user did, for book-keeping purposes.
 $endtime = microtime( true );
 
-wfLogProfilingData();
-
 // Log the request
 if ( $wgAPIRequestLog ) {
        $items = array(
@@ -130,7 +119,5 @@ if ( $wgAPIRequestLog ) {
        wfDebug( "Logged API request to $wgAPIRequestLog\n" );
 }
 
-// Shut down the database.  foo()->bar() syntax is not supported in PHP4: we won't ever actually
-// get here to worry about whether this should be = or =&, but the file has to parse properly.
-$lb = wfGetLBFactory();
-$lb->shutdown();
+$mediawiki = new MediaWiki();
+$mediawiki->doPostOutputShutdown( 'fast' );
index 8749310..460d874 100644 (file)
@@ -708,7 +708,6 @@ $wgAutoloadLocalClasses = array(
        'MWDocGen' => __DIR__ . '/maintenance/mwdocgen.php',
        'MWException' => __DIR__ . '/includes/exception/MWException.php',
        'MWExceptionHandler' => __DIR__ . '/includes/exception/MWExceptionHandler.php',
-       'MWFunction' => __DIR__ . '/includes/utils/MWFunction.php',
        'MWHookException' => __DIR__ . '/includes/Hooks.php',
        'MWHttpRequest' => __DIR__ . '/includes/HttpFunctions.php',
        'MWMemcached' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
@@ -997,6 +996,7 @@ $wgAutoloadLocalClasses = array(
        'ResourceLoaderImage' => __DIR__ . '/includes/resourceloader/ResourceLoaderImage.php',
        'ResourceLoaderImageModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderImageModule.php',
        'ResourceLoaderJqueryMsgDataModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderJqueryMsgDataModule.php',
+       'ResourceLoaderOOUIImageModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderOOUIImageModule.php',
        'ResourceLoaderLanguageDataModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderLanguageDataModule.php',
        'ResourceLoaderLanguageNamesModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderLanguageNamesModule.php',
        'ResourceLoaderModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderModule.php',
index 8210236..9222aa4 100644 (file)
@@ -32,7 +32,7 @@
        "require-dev": {
                "jakub-onderka/php-parallel-lint": "~0.8",
                "justinrainbow/json-schema": "~1.3",
-               "phpunit/phpunit": "~4.5",
+               "phpunit/phpunit": "3.7.37",
                "mediawiki/mediawiki-codesniffer": "0.1.0"
        },
        "suggest": {
index a2ff64e..d7d9e47 100644 (file)
                "type": {
                        "type": "string",
                        "description": "The extension's type, as an index to $wgExtensionCredits.",
-                       "default": "other",
-                       "enum": [
-                               "api",
-                               "antispam",
-                               "datavalues",
-                               "media",
-                               "parserhook",
-                               "semantic",
-                               "skin",
-                               "specialpage",
-                               "variable",
-                               "other"
-                       ]
+                       "default": "other"
                },
                "author": {
                        "type": [
@@ -42,8 +30,7 @@
                        "description": "Extension's authors.",
                        "items": {
                                "type": "string"
-                       },
-                       "additionalItems": false
+                       }
                },
                "version": {
                        "type": "string",
                        "description": "ResourceLoader modules to register",
                        "additionalProperties": false,
                        "patternProperties": {
-                               "^[a-zA-Z0-9\\.]+$": {
+                               "^[a-zA-Z0-9-\\.]+$": {
                                        "type": "object",
                                        "description": "A single ResourceLoader module descriptor",
                                        "properties": {
                                                        }
                                                },
                                                "debugScripts": {
-                                                       "type": "array",
+                                                       "type": ["string", "array"],
                                                        "description": "Scripts to include in debug contexts",
                                                        "items": {
                                                                "type": "string"
                                                        }
                                                },
                                                "loaderScripts": {
-                                                       "type": "array",
+                                                       "type": ["string", "array"],
                                                        "description": "Scripts to include in the startup module",
                                                        "items": {
                                                                "type": "string"
                                                        }
                                                },
                                                "dependencies": {
-                                                       "type": "array",
+                                                       "type": ["string", "array"],
                                                        "description": "Modules which must be loaded before this module",
                                                        "items": {
                                                                "type": "string"
                                                        }
                                                },
                                                "messages": {
-                                                       "type": "array",
+                                                       "type": ["string", "array"],
                                                        "description": "Messages to always load",
                                                        "items": {
                                                                "type": "string"
                "ValidSkinNames": {
                        "type": "object"
                },
+               "SkinOOUIThemes": {
+                       "type": "object"
+               },
                "callback": {
                        "type": [
                                "array",
index 22fd401..b26e6a5 100644 (file)
@@ -46,11 +46,9 @@ $wgArticlePath = false; # Don't let a "/*" article path clober our action path
 $wgActionPaths = array( "$wgUploadPath/" );
 
 wfImageAuthMain();
-wfLogProfilingData();
-// Commit and close up!
-$factory = wfGetLBFactory();
-$factory->commitMasterChanges();
-$factory->shutdown();
+
+$mediawiki = new MediaWiki();
+$mediawiki->doPostOutputShutdown( 'fast' );
 
 function wfImageAuthMain() {
        global $wgImgAuthUrlPathMap;
index 6907245..6da70b1 100644 (file)
@@ -104,8 +104,8 @@ class Html {
        /**
         * Modifies a set of attributes meant for button elements
         * and apply a set of default attributes when $wgUseMediaWikiUIEverywhere enabled.
-        * @param array $attrs
-        * @param string[] $modifiers to add to the button
+        * @param array $attrs HTML attributes in an associative array
+        * @param string[] $modifiers classes to add to the button
         * @see https://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
         * @return array $attrs A modified attribute array
         */
@@ -115,16 +115,15 @@ class Html {
                        if ( isset( $attrs['class'] ) ) {
                                if ( is_array( $attrs['class'] ) ) {
                                        $attrs['class'][] = 'mw-ui-button';
-                                       $attrs = array_merge( $attrs, $modifiers );
+                                       $attrs['class'] = array_merge( $attrs['class'], $modifiers );
                                        // ensure compatibility with Xml
                                        $attrs['class'] = implode( ' ', $attrs['class'] );
                                } else {
                                        $attrs['class'] .= ' mw-ui-button ' . implode( ' ', $modifiers );
                                }
                        } else {
-                               $attrs['class'] = array( 'mw-ui-button' );
                                // ensure compatibility with Xml
-                               $attrs['class'] = implode( ' ', array_merge( $attrs['class'], $modifiers ) );
+                               $attrs['class'] = 'mw-ui-button ' . implode( ' ', $modifiers );
                        }
                }
                return $attrs;
@@ -162,7 +161,7 @@ class Html {
         * @param array $attrs Associative array of attributes, e.g., array(
         *   'href' => 'http://www.mediawiki.org/' ). See expandAttributes() for
         *   further documentation.
-        * @param string[] $modifiers to add to the button
+        * @param string[] $modifiers classes to add to the button
         * @see http://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
         * @return string Raw HTML
         */
@@ -182,7 +181,7 @@ class Html {
         * @param array $attrs Associative array of attributes, e.g., array(
         *   'href' => 'http://www.mediawiki.org/' ). See expandAttributes() for
         *   further documentation.
-        * @param string[] $modifiers to add to the button
+        * @param string[] $modifiers classes to add to the button
         * @see http://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
         * @return string Raw HTML
         */
index ea91470..f2bd6ba 100644 (file)
@@ -199,42 +199,19 @@ class MWTimestamp {
         *
         * @since 1.20
         * @since 1.22 Uses Language::getHumanTimestamp to produce the timestamp
+        * @deprecated since 1.26 Use Language::getHumanTimestamp directly
         *
-        * @param MWTimestamp|null $relativeTo The base timestamp to compare to
-        *   (defaults to now).
-        * @param User|null $user User the timestamp is being generated for (or null
-        *   to use main context's user).
-        * @param Language|null $lang Language to use to make the human timestamp
-        *   (or null to use main context's language).
+        * @param MWTimestamp|null $relativeTo The base timestamp to compare to (defaults to now)
+        * @param User|null $user User the timestamp is being generated for (or null to use main context's user)
+        * @param Language|null $lang Language to use to make the human timestamp (or null to use main context's language)
         * @return string Formatted timestamp
         */
-       public function getHumanTimestamp( MWTimestamp $relativeTo = null,
-               User $user = null, Language $lang = null
-       ) {
-               if ( $relativeTo === null ) {
-                       $relativeTo = new self();
-               }
-               if ( $user === null ) {
-                       $user = RequestContext::getMain()->getUser();
-               }
+       public function getHumanTimestamp( MWTimestamp $relativeTo = null, User $user = null, Language $lang = null ) {
                if ( $lang === null ) {
                        $lang = RequestContext::getMain()->getLanguage();
                }
 
-               // Adjust for the user's timezone.
-               $offsetThis = $this->offsetForUser( $user );
-               $offsetRel = $relativeTo->offsetForUser( $user );
-
-               $ts = '';
-               if ( Hooks::run( 'GetHumanTimestamp', array( &$ts, $this, $relativeTo, $user, $lang ) ) ) {
-                       $ts = $lang->getHumanTimestamp( $this, $relativeTo, $user );
-               }
-
-               // Reset the timezone on the objects.
-               $this->timestamp->sub( $offsetThis );
-               $relativeTo->timestamp->sub( $offsetRel );
-
-               return $ts;
+               return $lang->getHumanTimestamp( $this, $relativeTo, $user );
        }
 
        /**
index 58c49f4..d03b76a 100644 (file)
@@ -433,37 +433,68 @@ class MediaWiki {
                                // Bug 62091: while exceptions are convenient to bubble up GUI errors,
                                // they are not internal application faults. As with normal requests, this
                                // should commit, print the output, do deferred updates, jobs, and profiling.
-                               wfGetLBFactory()->commitMasterChanges();
+                               $this->doPreOutputCommit();
                                $e->report(); // display the GUI error
                        }
                } catch ( Exception $e ) {
                        MWExceptionHandler::handleException( $e );
                }
 
-               if ( function_exists( 'register_postsend_function' ) ) {
-                       // https://github.com/facebook/hhvm/issues/1230
-                       register_postsend_function( array( $this, 'postSendUpdates' ) );
-               } elseif ( function_exists( 'fastcgi_finish_request' ) ) {
-                       fastcgi_finish_request();
-                       $this->postSendUpdates();
-               } else {
-                       $this->postSendUpdates();
-               }
+               $this->doPostOutputShutdown( 'normal' );
+       }
+
+       /**
+        * This function commits all DB changes as needed before
+        * the user can receive a response (in case commit fails)
+        *
+        * @since 1.26
+        */
+       public function doPreOutputCommit() {
+               // Either all DBs should commit or none
+               ignore_user_abort( true );
+               wfGetLBFactory()->commitMasterChanges();
        }
 
        /**
         * This function does work that can be done *after* the
         * user gets the HTTP response so they don't block on it
         *
+        * @param string $mode Use 'fast' to always skip job running
         * @since 1.26
         */
-       public function postSendUpdates() {
-               try {
-                       JobQueueGroup::pushLazyJobs();
-                       $this->triggerJobs();
-                       $this->restInPeace();
-               } catch ( Exception $e ) {
-                       MWExceptionHandler::handleException( $e );
+       public function doPostOutputShutdown( $mode = 'normal' ) {
+               // Show profiling data if enabled
+               Profiler::instance()->logDataPageOutputOnly();
+
+               $that = $this;
+               $callback = function () use ( $that, $mode ) {
+                       try {
+                               // Assure deferred updates are not in the main transaction
+                               wfGetLBFactory()->commitMasterChanges();
+                               // Run jobs occasionally, if enabled
+                               if ( $mode === 'normal' ) {
+                                       $that->triggerJobs();
+                               }
+                               // Do deferred updates and job insertion and final commit
+                               $that->restInPeace();
+                       } catch ( Exception $e ) {
+                               MWExceptionHandler::handleException( $e );
+                       }
+               };
+
+               if ( function_exists( 'register_postsend_function' ) ) {
+                       // https://github.com/facebook/hhvm/issues/1230
+                       register_postsend_function( $callback );
+               } else {
+                       if ( function_exists( 'fastcgi_finish_request' ) ) {
+                               fastcgi_finish_request();
+                       } else {
+                               // Either all DB and deferred updates should happen or none.
+                               // The later should not be cancelled due to client disconnect.
+                               ignore_user_abort( true );
+                       }
+
+                       $callback();
                }
        }
 
@@ -602,16 +633,13 @@ class MediaWiki {
                // Actually do the work of the request and build up any output
                $this->performRequest();
 
-               // Either all DB and deferred updates should happen or none.
-               // The later should not be cancelled due to client disconnect.
-               ignore_user_abort( true );
                // Now commit any transactions, so that unreported errors after
-               // output() don't roll back the whole DB transaction
-               wfGetLBFactory()->commitMasterChanges();
+               // output() don't roll back the whole DB transaction and so that
+               // we avoid having both success and error text in the response
+               $this->doPreOutputCommit();
 
                // Output everything!
                $this->context->getOutput()->output();
-
        }
 
        /**
@@ -644,7 +672,7 @@ class MediaWiki {
         * to run a specified number of jobs. This registers a callback to cleanup
         * the socket once it's done.
         */
-       protected function triggerJobs() {
+       public function triggerJobs() {
                $jobRunRate = $this->config->get( 'JobRunRate' );
                if ( $jobRunRate <= 0 || wfReadOnly() ) {
                        return;
index eb2a2dc..828c9b1 100644 (file)
@@ -1229,7 +1229,7 @@ class User implements IDBAccessObject {
                        self::selectFields(),
                        array( 'user_id' => $this->mId ),
                        __METHOD__,
-                       ( $flags & self::READ_LOCKING == self::READ_LOCKING )
+                       ( ( $flags & self::READ_LOCKING ) == self::READ_LOCKING )
                                ? array( 'LOCK IN SHARE MODE' )
                                : array()
                );
@@ -2383,7 +2383,7 @@ class User implements IDBAccessObject {
         * @return string TS_MW Timestamp
         * @since 1.26
         */
-       protected function getDBTouched() {
+       public function getDBTouched() {
                $this->load();
 
                return $this->mTouched;
index 4870167..55f9677 100644 (file)
@@ -85,6 +85,15 @@ abstract class ApiBase extends ContextSource {
        // $msg for ApiBase::makeMessage(). Any value not having a mapping will use
        // apihelp-{$path}-paramvalue-{$param}-{$value} is used.
        const PARAM_HELP_MSG_PER_VALUE = 14;
+       /// @since 1.26
+       // When PARAM_TYPE is 'submodule', map parameter values to submodule paths.
+       // Default is to use all modules in $this->getModuleManager() in the group
+       // matching the parameter name.
+       const PARAM_SUBMODULE_MAP = 15;
+       /// @since 1.26
+       // When PARAM_TYPE is 'submodule', used to indicate the 'g' prefix added by
+       // ApiQueryGeneratorBase (and similar if anything else ever does that).
+       const PARAM_SUBMODULE_PARAM_PREFIX = 16;
 
        const LIMIT_BIG1 = 500; // Fast query, std user limit
        const LIMIT_BIG2 = 5000; // Fast query, bot/sysop limit
@@ -838,7 +847,11 @@ abstract class ApiBase extends ContextSource {
                                $type = MWNamespace::getValidNamespaces();
                        }
                        if ( isset( $value ) && $type == 'submodule' ) {
-                               $type = $this->getModuleManager()->getNames( $paramName );
+                               if ( isset( $paramSettings[self::PARAM_SUBMODULE_MAP] ) ) {
+                                       $type = array_keys( $paramSettings[self::PARAM_SUBMODULE_MAP] );
+                               } else {
+                                       $type = $this->getModuleManager()->getNames( $paramName );
+                               }
                        }
                }
 
@@ -859,6 +872,8 @@ abstract class ApiBase extends ContextSource {
                                        case 'NULL': // nothing to do
                                                break;
                                        case 'string':
+                                       case 'text':
+                                       case 'password':
                                                if ( $required && $value === '' ) {
                                                        $this->dieUsageMsg( array( 'missingparam', $paramName ) );
                                                }
@@ -1078,6 +1093,24 @@ abstract class ApiBase extends ContextSource {
         * @return string Validated and normalized parameter
         */
        protected function validateTimestamp( $value, $encParamName ) {
+               // Confusing synonyms for the current time accepted by wfTimestamp()
+               // (wfTimestamp() also accepts various non-strings and the string of 14
+               // ASCII NUL bytes, but those can't get here)
+               if ( !$value ) {
+                       $this->logFeatureUsage( 'unclear-"now"-timestamp' );
+                       $this->setWarning(
+                               "Passing '$value' for timestamp parameter $encParamName has been deprecated." .
+                                       ' If for some reason you need to explicitly specify the current time without' .
+                                       ' calculating it client-side, use "now".'
+                       );
+                       return wfTimestamp( TS_MW );
+               }
+
+               // Explicit synonym for the current time
+               if ( $value === 'now' ) {
+                       return wfTimestamp( TS_MW );
+               }
+
                $unixTimestamp = wfTimestamp( TS_UNIX, $value );
                if ( $unixTimestamp === false ) {
                        $this->dieUsage(
@@ -2672,7 +2705,11 @@ abstract class ApiBase extends ContextSource {
                                        }
 
                                        if ( $type === 'submodule' ) {
-                                               $type = $this->getModuleManager()->getNames( $paramName );
+                                               if ( isset( $paramSettings[self::PARAM_SUBMODULE_MAP] ) ) {
+                                                       $type = array_keys( $paramSettings[self::PARAM_SUBMODULE_MAP] );
+                                               } else {
+                                                       $type = $this->getModuleManager()->getNames( $paramName );
+                                               }
                                                sort( $type );
                                        }
                                        if ( is_array( $type ) ) {
index 455540b..57f96c6 100644 (file)
@@ -186,7 +186,9 @@ class ApiCreateAccount extends ApiBase {
                                ApiBase::PARAM_TYPE => 'user',
                                ApiBase::PARAM_REQUIRED => true
                        ),
-                       'password' => null,
+                       'password' => array(
+                               ApiBase::PARAM_TYPE => 'password',
+                       ),
                        'domain' => null,
                        'token' => null,
                        'email' => array(
index 6ab8483..aad71b9 100644 (file)
@@ -281,16 +281,16 @@ class ApiEditPage extends ApiBase {
                        $requestArray['wpUndidRevision'] = $params['undo'];
                }
 
-               // Watch out for basetimestamp == ''
-               // wfTimestamp() treats it as NOW, almost certainly causing an edit conflict
-               if ( !is_null( $params['basetimestamp'] ) && $params['basetimestamp'] != '' ) {
-                       $requestArray['wpEdittime'] = wfTimestamp( TS_MW, $params['basetimestamp'] );
+               // Watch out for basetimestamp == '' or '0'
+               // It gets treated as NOW, almost certainly causing an edit conflict
+               if ( $params['basetimestamp'] !== null && (bool)$this->getMain()->getVal( 'basetimestamp' ) ) {
+                       $requestArray['wpEdittime'] = $params['basetimestamp'];
                } else {
                        $requestArray['wpEdittime'] = $pageObj->getTimestamp();
                }
 
-               if ( !is_null( $params['starttimestamp'] ) && $params['starttimestamp'] != '' ) {
-                       $requestArray['wpStarttime'] = wfTimestamp( TS_MW, $params['starttimestamp'] );
+               if ( $params['starttimestamp'] !== null ) {
+                       $requestArray['wpStarttime'] = $params['starttimestamp'];
                } else {
                        $requestArray['wpStarttime'] = wfTimestampNow(); // Fake wpStartime
                }
@@ -543,7 +543,9 @@ class ApiEditPage extends ApiBase {
                        'sectiontitle' => array(
                                ApiBase::PARAM_TYPE => 'string',
                        ),
-                       'text' => null,
+                       'text' => array(
+                               ApiBase::PARAM_TYPE => 'text',
+                       ),
                        'summary' => null,
                        'tags' => array(
                                ApiBase::PARAM_TYPE => ChangeTags::listExplicitlyDefinedTags(),
@@ -552,8 +554,12 @@ class ApiEditPage extends ApiBase {
                        'minor' => false,
                        'notminor' => false,
                        'bot' => false,
-                       'basetimestamp' => null,
-                       'starttimestamp' => null,
+                       'basetimestamp' => array(
+                               ApiBase::PARAM_TYPE => 'timestamp',
+                       ),
+                       'starttimestamp' => array(
+                               ApiBase::PARAM_TYPE => 'timestamp',
+                       ),
                        'recreate' => false,
                        'createonly' => false,
                        'nocreate' => false,
@@ -575,8 +581,12 @@ class ApiEditPage extends ApiBase {
                                ),
                        ),
                        'md5' => null,
-                       'prependtext' => null,
-                       'appendtext' => null,
+                       'prependtext' => array(
+                               ApiBase::PARAM_TYPE => 'text',
+                       ),
+                       'appendtext' => array(
+                               ApiBase::PARAM_TYPE => 'text',
+                       ),
                        'undo' => array(
                                ApiBase::PARAM_TYPE => 'integer'
                        ),
index 15eb475..efb9769 100644 (file)
@@ -95,7 +95,7 @@ class ApiEmailUser extends ApiBase {
                        ),
                        'subject' => null,
                        'text' => array(
-                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_TYPE => 'text',
                                ApiBase::PARAM_REQUIRED => true
                        ),
                        'ccme' => false,
index 6d064eb..be1a695 100644 (file)
@@ -154,7 +154,7 @@ class ApiExpandTemplates extends ApiBase {
                                ApiBase::PARAM_DFLT => 'API',
                        ),
                        'text' => array(
-                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_TYPE => 'text',
                                ApiBase::PARAM_REQUIRED => true,
                        ),
                        'revid' => array(
index 27fc378..a81ae3f 100644 (file)
@@ -490,14 +490,23 @@ class ApiHelp extends ApiBase {
                                                        switch ( $type ) {
                                                                case 'submodule':
                                                                        $groups[] = $name;
-                                                                       $submodules = $module->getModuleManager()->getNames( $name );
+                                                                       if ( isset( $settings[ApiBase::PARAM_SUBMODULE_MAP] ) ) {
+                                                                               $map = $settings[ApiBase::PARAM_SUBMODULE_MAP];
+                                                                               ksort( $map );
+                                                                               $submodules = array();
+                                                                               foreach ( $map as $v => $m ) {
+                                                                                       $submodules[] = "[[Special:ApiHelp/{$m}|{$v}]]";
+                                                                               }
+                                                                       } else {
+                                                                               $submodules = $module->getModuleManager()->getNames( $name );
+                                                                               sort( $submodules );
+                                                                               $prefix = $module->isMain()
+                                                                                       ? '' : ( $module->getModulePath() . '+' );
+                                                                               $submodules = array_map( function ( $name ) use ( $prefix ) {
+                                                                                       return "[[Special:ApiHelp/{$prefix}{$name}|{$name}]]";
+                                                                               }, $submodules );
+                                                                       }
                                                                        $count = count( $submodules );
-                                                                       sort( $submodules );
-                                                                       $prefix = $module->isMain()
-                                                                               ? '' : ( $module->getModulePath() . '+' );
-                                                                       $submodules = array_map( function ( $name ) use ( $prefix ) {
-                                                                               return "[[Special:ApiHelp/{$prefix}{$name}|{$name}]]";
-                                                                       }, $submodules );
                                                                        $info[] = $context->msg( 'api-help-param-list' )
                                                                                ->params( $multi ? 2 : 1 )
                                                                                ->params( $context->getLanguage()->commaList( $submodules ) )
@@ -564,6 +573,7 @@ class ApiHelp extends ApiBase {
                                                                        break;
 
                                                                case 'string':
+                                                               case 'text':
                                                                        // Displaying a type message here would be useless.
                                                                        $type = null;
                                                                        break;
@@ -573,6 +583,7 @@ class ApiHelp extends ApiBase {
                                                // Add type. Messages for grep: api-help-param-type-limit
                                                // api-help-param-type-integer api-help-param-type-boolean
                                                // api-help-param-type-timestamp api-help-param-type-user
+                                               // api-help-param-type-password
                                                if ( is_string( $type ) ) {
                                                        $msg = $context->msg( "api-help-param-type-$type" );
                                                        if ( !$msg->isDisabled() ) {
index 5480d94..d8b390c 100644 (file)
@@ -179,7 +179,9 @@ class ApiLogin extends ApiBase {
        public function getAllowedParams() {
                return array(
                        'name' => null,
-                       'password' => null,
+                       'password' => array(
+                               ApiBase::PARAM_TYPE => 'password',
+                       ),
                        'domain' => null,
                        'token' => null,
                );
index a93b7cc..0adb464 100644 (file)
@@ -384,13 +384,25 @@ class ApiOpenSearchFormatJson extends ApiFormatJson {
 
        public function execute() {
                if ( !$this->getResult()->getResultData( 'error' ) ) {
-                       $warnings = $this->getResult()->removeValue( 'warnings', null );
+                       $result = $this->getResult();
+
+                       // Ignore warnings or treat as errors, as requested
+                       $warnings = $result->removeValue( 'warnings', null );
                        if ( $this->warningsAsError && $warnings ) {
                                $this->dieUsage(
                                        'Warnings cannot be represented in OpenSearch JSON format', 'warnings', 0,
                                        array( 'warnings' => $warnings )
                                );
                        }
+
+                       // Ignore any other unexpected keys (e.g. from $wgDebugToolbar)
+                       $remove = array_keys( array_diff_key(
+                               $result->getResultData(),
+                               array( 0 => 'search', 1 => 'terms', 2 => 'descriptions', 3 => 'urls' )
+                       ) );
+                       foreach ( $remove as $key ) {
+                               $result->removeValue( $key, null );
+                       }
                }
 
                parent::execute();
index 5efe788..d67b184 100644 (file)
@@ -1304,8 +1304,8 @@ class ApiPageSet extends ApiBase {
                        ),
                        'generator' => array(
                                ApiBase::PARAM_TYPE => null,
-                               ApiBase::PARAM_VALUE_LINKS => array(),
                                ApiBase::PARAM_HELP_MSG => 'api-pageset-param-generator',
+                               ApiBase::PARAM_SUBMODULE_PARAM_PREFIX => 'g',
                        ),
                        'redirects' => array(
                                ApiBase::PARAM_DFLT => false,
@@ -1331,10 +1331,8 @@ class ApiPageSet extends ApiBase {
                if ( !$this->mAllowGenerator ) {
                        unset( $result['generator'] );
                } elseif ( $flags & ApiBase::GET_VALUES_FOR_HELP ) {
-                       foreach ( $this->getGenerators() as $g ) {
-                               $result['generator'][ApiBase::PARAM_TYPE][] = $g;
-                               $result['generator'][ApiBase::PARAM_VALUE_LINKS][$g] = "Special:ApiHelp/query+$g";
-                       }
+                       $result['generator'][ApiBase::PARAM_TYPE] = 'submodule';
+                       $result['generator'][ApiBase::PARAM_SUBMODULE_MAP] = $this->getGenerators();
                }
 
                return $result;
@@ -1355,13 +1353,14 @@ class ApiPageSet extends ApiBase {
                                $query = $this->getMain()->getModuleManager()->getModule( 'query' );
                        }
                        $gens = array();
+                       $prefix = $query->getModulePath() . '+';
                        $mgr = $query->getModuleManager();
                        foreach ( $mgr->getNamesWithClasses() as $name => $class ) {
                                if ( is_subclass_of( $class, 'ApiQueryGeneratorBase' ) ) {
-                                       $gens[] = $name;
+                                       $gens[$name] = $prefix . $name;
                                }
                        }
-                       sort( $gens );
+                       ksort( $gens );
                        self::$generators = $gens;
                }
 
index 25069d9..8a4ef49 100644 (file)
@@ -291,14 +291,20 @@ class ApiParamInfo extends ApiBase {
                        if ( isset( $settings[ApiBase::PARAM_DFLT] ) ) {
                                switch ( $settings[ApiBase::PARAM_TYPE] ) {
                                        case 'boolean':
-                                               $item['default'] = ( $settings[ApiBase::PARAM_DFLT] ? 'true' : 'false' );
+                                               $item['default'] = (bool)$settings[ApiBase::PARAM_DFLT];
                                                break;
                                        case 'string':
+                                       case 'text':
+                                       case 'password':
                                                $item['default'] = strval( $settings[ApiBase::PARAM_DFLT] );
                                                break;
                                        case 'integer':
+                                       case 'limit':
                                                $item['default'] = intval( $settings[ApiBase::PARAM_DFLT] );
                                                break;
+                                       case 'timestamp':
+                                               $item['default'] = wfTimestamp( TS_ISO_8601, $settings[ApiBase::PARAM_DFLT] );
+                                               break;
                                        default:
                                                $item['default'] = $settings[ApiBase::PARAM_DFLT];
                                                break;
@@ -320,9 +326,23 @@ class ApiParamInfo extends ApiBase {
 
                        if ( isset( $settings[ApiBase::PARAM_TYPE] ) ) {
                                if ( $settings[ApiBase::PARAM_TYPE] === 'submodule' ) {
-                                       $item['type'] = $module->getModuleManager()->getNames( $name );
-                                       sort( $item['type'] );
-                                       $item['submodules'] = true;
+                                       if ( isset( $settings[ApiBase::PARAM_SUBMODULE_MAP] ) ) {
+                                               ksort( $settings[ApiBase::PARAM_SUBMODULE_MAP] );
+                                               $item['type'] = array_keys( $settings[ApiBase::PARAM_SUBMODULE_MAP] );
+                                               $item['submodules'] = $settings[ApiBase::PARAM_SUBMODULE_MAP];
+                                       } else {
+                                               $item['type'] = $module->getModuleManager()->getNames( $name );
+                                               sort( $item['type'] );
+                                               $prefix = $module->isMain()
+                                                       ? '' : ( $module->getModulePath() . '+' );
+                                               $item['submodules'] = array();
+                                               foreach ( $item['type'] as $v ) {
+                                                       $item['submodules'][$v] = $prefix.$v;
+                                               }
+                                       }
+                                       if ( isset( $settings[ApiBase::PARAM_SUBMODULE_PARAM_PREFIX] ) ) {
+                                               $item['submoduleparamprefix'] = $settings[ApiBase::PARAM_SUBMODULE_PARAM_PREFIX];
+                                       }
                                } else {
                                        $item['type'] = $settings[ApiBase::PARAM_TYPE];
                                }
@@ -341,6 +361,9 @@ class ApiParamInfo extends ApiBase {
                        if ( isset( $settings[ApiBase::PARAM_MIN] ) ) {
                                $item['min'] = $settings[ApiBase::PARAM_MIN];
                        }
+                       if ( !empty( $settings[ApiBase::PARAM_RANGE_ENFORCE] ) ) {
+                               $item['enforcerange'] = true;
+                       }
 
                        if ( !empty( $settings[ApiBase::PARAM_HELP_MSG_INFO] ) ) {
                                $item['info'] = array();
index cc8ca97..36be777 100644 (file)
@@ -739,7 +739,9 @@ class ApiParse extends ApiBase {
        public function getAllowedParams() {
                return array(
                        'title' => null,
-                       'text' => null,
+                       'text' => array(
+                               ApiBase::PARAM_TYPE => 'text',
+                       ),
                        'summary' => null,
                        'page' => null,
                        'pageid' => array(
index ec0c1d1..4042bd7 100644 (file)
@@ -158,7 +158,9 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                        }
                                        $startsortkey = pack( 'H*', $params['starthexsortkey'] );
                                } else {
-                                       $this->logFeatureUsage( 'list=categorymembers&cmstartsortkey' );
+                                       if ( $params['startsortkey'] !== null ) {
+                                               $this->logFeatureUsage( 'list=categorymembers&cmstartsortkey' );
+                                       }
                                        $startsortkey = $params['startsortkey'];
                                }
                                if ( $params['endsortkeyprefix'] !== null ) {
@@ -169,7 +171,9 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                        }
                                        $endsortkey = pack( 'H*', $params['endhexsortkey'] );
                                } else {
-                                       $this->logFeatureUsage( 'list=categorymembers&cmendsortkey' );
+                                       if ( $params['endsortkey'] !== null ) {
+                                               $this->logFeatureUsage( 'list=categorymembers&cmendsortkey' );
+                                       }
                                        $endsortkey = $params['endsortkey'];
                                }
 
index c4b717c..1f469b8 100644 (file)
@@ -331,7 +331,7 @@ class ApiStashEdit extends ApiBase {
                        $content->getDefaultFormat(),
                        sha1( $content->serialize( $content->getDefaultFormat() ) ),
                        $user->getId() ?: md5( $user->getName() ), // account for user parser options
-                       $user->getId() ? $user->getTouched() : '-' // handle preference change races
+                       $user->getId() ? $user->getDBTouched() : '-' // handle preference change races
                ) ) );
 
                return wfMemcKey( 'prepared-edit', md5( $title->getPrefixedDBkey() ), $hash );
@@ -380,7 +380,7 @@ class ApiStashEdit extends ApiBase {
                                ApiBase::PARAM_TYPE => 'string'
                        ),
                        'text' => array(
-                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_TYPE => 'text',
                                ApiBase::PARAM_REQUIRED => true
                        ),
                        'contentmodel' => array(
index 74ae05a..54294c9 100644 (file)
@@ -735,7 +735,9 @@ class ApiUpload extends ApiBase {
                        'comment' => array(
                                ApiBase::PARAM_DFLT => ''
                        ),
-                       'text' => null,
+                       'text' => array(
+                               ApiBase::PARAM_TYPE => 'text',
+                       ),
                        'watch' => array(
                                ApiBase::PARAM_DFLT => false,
                                ApiBase::PARAM_DEPRECATED => true,
index 9411207..f3faf48 100644 (file)
@@ -10,8 +10,8 @@
        "apihelp-main-param-action": "Which action to perform.",
        "apihelp-main-param-format": "The format of the output.",
        "apihelp-main-param-maxlag": "Maximum lag can be used when MediaWiki is installed on a database replicated cluster. To save actions causing any more site replication lag, this parameter can make the client wait until the replication lag is less than the specified value. In case of excessive lag, error code <samp>maxlag</samp> is returned with a message like <samp>Waiting for $host: $lag seconds lagged</samp>.<br />See [[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]] for more information.",
-       "apihelp-main-param-smaxage": "Set the <code>s-maxage</code> header to this many seconds. Errors are never cached.",
-       "apihelp-main-param-maxage": "Set the <code>max-age</code> header to this many seconds. Errors are never cached.",
+       "apihelp-main-param-smaxage": "Set the <code>s-maxage</code> HTTP cache control header to this many seconds. Errors are never cached.",
+       "apihelp-main-param-maxage": "Set the <code>max-age</code> HTTP cache control header to this many seconds. Errors are never cached.",
        "apihelp-main-param-assert": "Verify the user is logged in if set to <kbd>user</kbd>, or has the bot userright if <kbd>bot</kbd>.",
        "apihelp-main-param-requestid": "Any value given here will be included in the response. May be used to distinguish requests.",
        "apihelp-main-param-servedby": "Include the hostname that served the request in the results.",
        "api-help-param-deprecated": "Deprecated.",
        "api-help-param-required": "This parameter is required.",
        "api-help-datatypes-header": "Data types",
-       "api-help-datatypes": "Some parameter types in API requests need further explanation:\n;boolean\n:Boolean parameters work like HTML checkboxes: if the parameter is specified, regardless of value, it is considered true. For a false value, omit the parameter entirely.\n;timestamp\n:Timestamps may be specified in several formats. ISO 8601 date and time is recommended. All times are in UTC, any included timezone is ignored.\n:* ISO 8601 date and time, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (punctuation and <kbd>Z</kbd> are optional)\n:* ISO 8601 date and time with (ignored) fractional seconds, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (dashes, colons, and <kbd>Z</kbd> are optional)\n:* MediaWiki format, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Generic numeric format, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (optional timezone of <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, or <kbd>-<var>##</var></kbd> is ignored)\n:* EXIF format, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:*RFC 2822 format (timezone may be omitted), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 850 format (timezone may be omitted), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime format, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* Seconds since 1970-01-01T00:00:00Z as a 1 to 13 digit integer",
+       "api-help-datatypes": "Some parameter types in API requests need further explanation:\n;boolean\n:Boolean parameters work like HTML checkboxes: if the parameter is specified, regardless of value, it is considered true. For a false value, omit the parameter entirely.\n;timestamp\n:Timestamps may be specified in several formats. ISO 8601 date and time is recommended. All times are in UTC, any included timezone is ignored.\n:* ISO 8601 date and time, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (punctuation and <kbd>Z</kbd> are optional)\n:* ISO 8601 date and time with (ignored) fractional seconds, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (dashes, colons, and <kbd>Z</kbd> are optional)\n:* MediaWiki format, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Generic numeric format, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (optional timezone of <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, or <kbd>-<var>##</var></kbd> is ignored)\n:* EXIF format, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:*RFC 2822 format (timezone may be omitted), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 850 format (timezone may be omitted), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime format, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* Seconds since 1970-01-01T00:00:00Z as a 1 to 13 digit integer (excluding <kbd>0</kbd>)\n:* The string <kbd>now</kbd>",
        "api-help-param-type-limit": "Type: integer or <kbd>max</kbd>",
        "api-help-param-type-integer": "Type: {{PLURAL:$1|1=integer|2=list of integers}}",
        "api-help-param-type-boolean": "Type: boolean ([[Special:ApiHelp/main#main/datatypes|details]])",
+       "api-help-param-type-password": "",
        "api-help-param-type-timestamp": "Type: {{PLURAL:$1|1=timestamp|2=list of timestamps}} ([[Special:ApiHelp/main#main/datatypes|allowed formats]])",
        "api-help-param-type-user": "Type: {{PLURAL:$1|1=user name|2=list of user names}}",
        "api-help-param-list": "{{PLURAL:$1|1=One value|2=Values (separate with <kbd>{{!}}</kbd>)}}: $2",
index b17057d..7ab9adb 100644 (file)
        "api-help-param-deprecated": "Obsoleto.",
        "api-help-param-required": "Este parámetro é obrigatorio.",
        "api-help-datatypes-header": "Tipos de datos",
-       "api-help-datatypes": "Algúns tipos de parámetros nas solicitudes de API necesitan máis explicación:\n;boolean\n:Os parámetros booleanos traballan como caixas de verificación HTML: se o parámetro se especifica, independentemente do seu valor, considérase verdadeiro. Para un valor falso, omíta o parámetro completo.\n;timestamp\n:Os selos de tempo poden especificarse en varios formatos. Recoméndase o ISO 8601 coa data e a hora. Todas as horas están en UTC, a inclusión da zona horaria é ignorada.\n:* ISO 8601 con data e hora, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (signos de puntuación e <kbd>Z</kbd> son opcionais)\n:* ISO 8601 data e hora (omítense) fraccións de segundo, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (guións, dous puntos e, <kbd>Z</kbd> son opcionais)\n:* Formato MediaWiki, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Formato numérico xenérico, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (opcional na zona horaria <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, o <kbd>-<var>##</var></kbd> omítese)\n:* Formato EXIF, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:*Formato RFC 2822 (a zona horaria pódese omitir), <kbd><var>Mon</var>, <var>15</var> <var>Xan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato RFC 850 (a zona horaria pódese omitir), <kbd><var>luns</var>, <var>15</var>-<var>xaneiro</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato C ctime, <kbd><var>luns</var> <var>xaneiro</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>de 2001</var></kbd>\n:* Segundos desde 1970-01-01T00:00:00Z como de 1 a 13, díxitos enteiros",
+       "api-help-datatypes": "Algúns tipos de parámetros nas solicitudes de API necesitan máis explicación:\n;boolean\n:Os parámetros booleanos traballan como caixas de verificación HTML: se o parámetro se especifica, independentemente do seu valor, considérase verdadeiro. Para un valor falso, omíta o parámetro completo.\n;timestamp\n:Os selos de tempo poden especificarse en varios formatos. Recoméndase o ISO 8601 coa data e a hora. Todas as horas están en UTC, a inclusión da zona horaria é ignorada.\n:* ISO 8601 con data e hora, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (signos de puntuación e <kbd>Z</kbd> son opcionais)\n:* ISO 8601 data e hora (omítense) fraccións de segundo, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (guións, dous puntos e, <kbd>Z</kbd> son opcionais)\n:* Formato MediaWiki, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Formato numérico xenérico, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (opcional na zona horaria <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, o <kbd>-<var>##</var></kbd> omítese)\n:* Formato EXIF, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:*Formato RFC 2822 (a zona horaria pódese omitir), <kbd><var>Mon</var>, <var>15</var> <var>Xan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato RFC 850 (a zona horaria pódese omitir), <kbd><var>luns</var>, <var>15</var>-<var>xaneiro</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato C ctime, <kbd><var>luns</var> <var>xaneiro</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>de 2001</var></kbd>\n:* Segundos desde 1970-01-01T00:00:00Z como de 1 a 13, díxitos enteiros (excluíndo o <kbd>0</kbd>)\n:* O texto <kbd>now</kbd> (agora)",
        "api-help-param-type-limit": "Tipo: enteiro ou <kbd>max</kbd>",
        "api-help-param-type-integer": "Tipo: {{PLURAL:$1|1=enteiro|2=lista de enteiros}}",
        "api-help-param-type-boolean": "Tipo: booleano ([[Special:ApiHelp/main#main/datatypes|detalles]])",
index 4002e54..e3b20f3 100644 (file)
@@ -16,6 +16,8 @@
        "apihelp-block-description": "חסימת משתמש.",
        "apihelp-block-param-user": "שם משתמש, כתובת IP, או טווח IP שהנך רוצה לחסום.",
        "apihelp-block-param-reason": "סיבה לחסימה.",
+       "apihelp-block-param-nocreate": "מניעת יצירת חשבונות",
+       "apihelp-block-param-autoblock": "חסימה אוטומטית גם של כתובת ה־IP האחרונה שהשתמש בה ושל כל כתובת IP שינסה להשתמש בה בעתיד.",
        "apihelp-compare-param-fromtitle": "כותרת ראשונה להשוואה.",
        "apihelp-compare-param-fromid": "מס׳ זיהוי של העמוד הראשון להשוואה.",
        "apihelp-compare-param-fromrev": "גרסה ראשונה להשוואה.",
        "apihelp-delete-param-reason": "סיבת המחיקה. אם לא הוגדרה, תתווסף סיבה שנוצרה אוטומטית.",
        "apihelp-delete-param-watch": "הוספת העמוד לרשימת המעקב של המשתמש הנוכחי.",
        "apihelp-delete-param-unwatch": "הסרת הדף מרשימת המעקב של של המשתמש הנוכחי.",
-       "apihelp-delete-example-simple": "מחיקת הדף הראשי",
+       "apihelp-delete-example-simple": "מחיקת <kbd>עמוד ראשי</kbd>.",
+       "apihelp-delete-example-reason": "מחיקת <kbd>עמוד ראשי</kbd>. סיבה: <kbd>הכנה להעברה</kbd>.",
+       "apihelp-edit-description": "יצירת ועריכת דפים.",
+       "apihelp-edit-param-title": "שם הדף לעריכה. לא לשימוש עם Delete <kbd>Main Page</kbd>.",
+       "apihelp-edit-param-pageid": "מזהה הדף לעריכה. לא לשימוש עם <var>$1title</var>.",
        "apihelp-edit-param-text": "תוכן הדף.",
        "apihelp-edit-param-tags": "אילו תגי שינוי להחיל על הגרסה.",
        "apihelp-edit-param-minor": "עריכה משנית.",
+       "apihelp-edit-param-notminor": "שינוי לא משני.",
+       "apihelp-edit-param-bot": "סימון עריכה זו כבוט.",
        "apihelp-edit-example-edit": "עריכת דף",
        "apihelp-emailuser-description": "שליחת דוא\"ל למשתמש.",
        "apihelp-expandtemplates-param-title": "כותרת הדף.",
index a9bdf2b..3ff138d 100644 (file)
        "apihelp-edit-param-bot": "이 편집을 봇으로 표시.",
        "apihelp-edit-example-edit": "문서 편집",
        "apihelp-expandtemplates-param-title": "문서 제목",
+       "apihelp-login-param-name": "계정 이름.",
+       "apihelp-login-param-password": "비밀번호.",
+       "apihelp-login-example-login": "로그인.",
+       "apihelp-move-description": "문서 이동하기.",
+       "api-help-title": "미디어위키 API 도움말",
+       "api-help-lead": "이 페이지는 자동으로 생성된 미디어위키 API 도움말 문서입니다.\n\n설명 문서 및 예시: https://www.mediawiki.org/wiki/API",
+       "api-help-main-header": "메인 모듈",
+       "api-help-flag-deprecated": "이 모듈은 사용되지 않습니다.",
+       "api-help-flag-readrights": "이 모듈은 read 권한을 요구합니다.",
+       "api-help-flag-writerights": "이 모듈은 write 권한을 요구합니다.",
+       "api-help-flag-mustbeposted": "이 모듈은 POST 요청만을 허용합니다.",
+       "api-help-source": "출처: $1",
+       "api-help-license": "라이선스: [[$1|$2]]",
+       "api-help-license-noname": "라이선스: [[$1|링크 참조]]",
+       "api-help-license-unknown": "라이선스: <span class=\"apihelp-unknown\">알 수 없음</span>",
+       "api-help-parameters": "{{PLURAL:$1|변수}}:",
+       "api-help-param-deprecated": "사용 중지됨.",
+       "api-help-param-required": "이 변수는 필수 입력 사항입니다.",
+       "api-help-datatypes-header": "데이터 유형",
        "api-help-datatypes": "API 요청 내 몇몇 매개변수형에 대해 더 자세히 설명해보겠습니다:\n;boolean\n:Boolean 매개변수들은 HTML 체크박스처럼 동작합니다: 만약 매개변수가 지저오딨다면, 값에 상관없이 참의 값으로 여겨집니다. 거짓값은 매개변수 전체를 생략하여 표현해보세요.\n;timestamp\n:타임스팸프들은 여러 형식으로 표현될 수 있으나 ISO 8601 날짜와 시간이 추천됩니다. 모든 시간은 UTC이어야 하며, 포함된 시간대는 모두 무시됩니다.\n:* ISO 8601 날짜와 시간, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (구두점과 <kbd>Z</kbd>는 선택입니다.)\n:* ISO 8601 날짜와 시간과 (무시되는) 소수 초, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (대시, 콜론과 <kbd>Z</kbd> 는 선택입니다.)\n:* 미디어위키 형식, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* 일반적인 수 형식 <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (<kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, 또는 <kbd>-<var>##</var></kbd>와 같은 선택적 시간대는 무시됩니다)\n:*RFC 2822 형식 (시간대는 생략될 수 있음), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 850 형식 (시간대는 생략될 수 있음), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime 형식, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* 1부터 13자리까지의 숫자로 표현된 1970-01-01T00:00:00Z 부터 흐른 시간(초)",
+       "api-help-param-type-integer": "유형: {{PLURAL:$1|1=정수|2=정수 목록}}",
+       "api-help-param-type-boolean": "유형: 부울 ([[Special:ApiHelp/main#main/datatypes|자세한 정보]])",
        "api-help-param-list": "{{PLURAL:$1|1=하나의 값|2=값 (\"{{!}}\"로 구분)}}: $2",
-       "api-help-param-default": "기본값: $1"
+       "api-help-param-default": "기본값: $1",
+       "api-help-param-default-empty": "기본값: <span class=\"apihelp-empty\">(비어 있음)</span>",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(설명 없음)</span>",
+       "api-help-examples": "{{PLURAL:$1|예시}}:",
+       "api-help-permissions": "{{PLURAL:$1|권한}}:",
+       "api-help-permissions-granted-to": "{{PLURAL:$1|다음 그룹에 부여됨}}: $2",
+       "api-credits": "API 개발자:\n* Roan Kattouw (선임 개발자, 2007년 9월–2009년)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (초기 개발자, 선임 개발자 2006년 9월~2007년 9월)\n* Brad Jorsch (선임 개발자 2013년–현재)\n\n당신의 의견이나 제안, 질문은 mediawiki-api@lists.wikimedia.org 로 보내주시거나,\nhttps://phabricator.wikimedia.org/ 에 버그 신고를 해 주시기 바랍니다.."
 }
index 82b169e..c6ac8fd 100644 (file)
        "api-help-param-type-limit": "{{technical}} {{doc-important|Do not translate text inside &lt;kbd%gt; tags}} Used to indicate that a parameter is a \"limit\" type. Parameters:\n* $1 - Always 1.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-integer": "{{technical}} Used to indicate that a parameter is an integer or list of integers. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-boolean": "{{technical}} {{doc-important|Do not translate <code>Special:ApiHelp</code> in this message.}} Used to indicate that a parameter is a boolean. Parameters:\n* $1 - Always 1.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
+       "api-help-param-type-password": "{{optional}}{{technical}} Used to indicate that a parameter is a password or list of passwords. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-timestamp": "{{technical}} {{doc-important|Do not translate <code>Special:ApiHelp</code> in this message.}} Used to indicate that a parameter is a timestamp or list of timestamps. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-user": "{{technical}} Used to indicate that a parameter is a username or list of usernames. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-list": "Used to display the possible values for a parameter taking a list of values\n\nParameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes any number of values\n* $2 - Comma-separated list of values, possibly formatted using {{msg-mw|api-help-param-list-can-be-empty}}\n{{Identical|Value}}",
index 6849b27..e576f6d 100644 (file)
        "api-help-param-deprecated": "不推荐使用。",
        "api-help-param-required": "这个参数是必须的。",
        "api-help-datatypes-header": "数据类型",
-       "api-help-datatypes": "一些在API请求中的参数类型需要更进一步解释:\n;boolean\n:布尔参数就像HTML复选框一样工作:如果指定参数,无论何值都被认为是真。如果要假值,则可完全忽略参数。\n;timestamp\n:时间戳可被指定为很多格式。推荐使用ISO 8601日期和时间标准。所有时间为UTC时间,包含的任何时区会被忽略。\n:* ISO 8601日期和时间,<kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd>(标点和<kbd>Z</kbd>是可选项)\n:* 带小数秒(会被忽略)的ISO 8601日期和时间,<kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd>(破折号、括号和<kbd>Z</kbd>是可选的)\n:* MediaWiki格式,<kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* 一般数字格式,<kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>(<kbd>GMT</kbd>、<kbd>+<var>##</var></kbd>或<kbd>-<var>##</var></kbd>的可选时区会被忽略)\n:* EXIF格式,<kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 2822格式(时区可能会被省略),<kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 850格式(时区可能会被省略),<kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime格式,<kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* 秒数是从1970-01-01T00:00:00Z开始,作为1到13位数的整数",
+       "api-help-datatypes": "一些在API请求中的参数类型需要更进一步解释:\n;boolean\n:布尔参数就像HTML复选框一样工作:如果指定参数,无论何值都被认为是真。如果要假值,则可完全忽略参数。\n;timestamp\n:时间戳可被指定为很多格式。推荐使用ISO 8601日期和时间标准。所有时间为UTC时间,包含的任何时区会被忽略。\n:* ISO 8601日期和时间,<kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd>(标点和<kbd>Z</kbd>是可选项)\n:* 带小数秒(会被忽略)的ISO 8601日期和时间,<kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd>(破折号、括号和<kbd>Z</kbd>是可选的)\n:* MediaWiki格式,<kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* 一般数字格式,<kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>(<kbd>GMT</kbd>、<kbd>+<var>##</var></kbd>或<kbd>-<var>##</var></kbd>的可选时区会被忽略)\n:* EXIF格式,<kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 2822格式(时区可能会被省略),<kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 850格式(时区可能会被省略),<kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime格式,<kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* 秒数是从1970-01-01T00:00:00Z开始,作为1到13位数的整数(除了<kbd>0</kbd>)\n:* 字符串<kbd>now</kbd>",
        "api-help-param-type-limit": "类型:整数或<kbd>max</kbd>",
        "api-help-param-type-integer": "类型:{{PLURAL:$1|1=整数|2=整数列表}}",
        "api-help-param-type-boolean": "类型:布尔值([[Special:ApiHelp/main#main/datatypes|详细信息]])",
index 7ea6777..13e94db 100644 (file)
@@ -164,7 +164,7 @@ class RecentChange {
         * Obtain the recent change with a given rc_id value
         *
         * @param int $rcid The rc_id value to retrieve
-        * @return RecentChange
+        * @return RecentChange|null
         */
        public static function newFromId( $rcid ) {
                return self::newFromConds( array( 'rc_id' => $rcid ), __METHOD__ );
@@ -176,7 +176,7 @@ class RecentChange {
         * @param array $conds Array of conditions
         * @param mixed $fname Override the method name in profiling/logs
         * @param array $options Query options
-        * @return RecentChange
+        * @return RecentChange|null
         */
        public static function newFromConds( $conds, $fname = __METHOD__, $options = array() ) {
                $dbr = wfGetDB( DB_SLAVE );
index 4551e2d..0742df2 100644 (file)
@@ -177,6 +177,15 @@ abstract class LBFactory {
                }, array( $methodName, $args ) );
        }
 
+       /**
+        * Commit on all connections. Done for two reasons:
+        * 1. To commit changes to the masters.
+        * 2. To release the snapshot on all connections, master and slave.
+        */
+       public function commitAll() {
+               $this->forEachLBCallMethod( 'commitAll' );
+       }
+
        /**
         * Commit changes on all master connections
         */
index 2ea2487..99c9a14 100644 (file)
@@ -291,8 +291,8 @@ class LoadBalancer {
                                return false;
                        }
 
-                       wfDebugLog( 'connect', __METHOD__ .
-                               ": Using reader #$i: {$this->mServers[$i]['host']}..." );
+                       $serverName = $this->getServerName( $i );
+                       wfDebugLog( 'connect', __METHOD__ . ": Using reader #$i: $serverName..." );
 
                        $conn = $this->openConnection( $i, $wiki );
                        if ( !$conn ) {
@@ -462,7 +462,7 @@ class LoadBalancer {
 
                if ( $result == -1 || is_null( $result ) ) {
                        # Timed out waiting for slave, use master instead
-                       $server = $this->mServers[$index]['host'];
+                       $server = $server = $this->getServerName( $index );
                        $msg = __METHOD__ . ": Timed out waiting on $server pos {$this->mWaitForPos}";
                        wfDebug( "$msg\n" );
                        wfDebugLog( 'DBPerformance', "$msg:\n" . wfBacktrace( true ) );
@@ -660,11 +660,12 @@ class LoadBalancer {
                        $server = $this->mServers[$i];
                        $server['serverIndex'] = $i;
                        $conn = $this->reallyOpenConnection( $server, false );
+                       $serverName = $this->getServerName( $i );
                        if ( $conn->isOpen() ) {
-                               wfDebug( "Connected to database $i at {$this->mServers[$i]['host']}\n" );
+                               wfDebug( "Connected to database $i at $serverName\n" );
                                $this->mConns['local'][$i][0] = $conn;
                        } else {
-                               wfDebug( "Failed to connect to database $i at {$this->mServers[$i]['host']}\n" );
+                               wfDebug( "Failed to connect to database $i at $serverName\n" );
                                $this->mErrorConnection = $conn;
                                $conn = false;
                        }
@@ -888,12 +889,14 @@ class LoadBalancer {
         */
        public function getServerName( $i ) {
                if ( isset( $this->mServers[$i]['hostName'] ) ) {
-                       return $this->mServers[$i]['hostName'];
+                       $name = $this->mServers[$i]['hostName'];
                } elseif ( isset( $this->mServers[$i]['host'] ) ) {
-                       return $this->mServers[$i]['host'];
+                       $name = $this->mServers[$i]['host'];
                } else {
-                       return '';
+                       $name = '';
                }
+
+               return ( $name != '' ) ? $name : 'localhost';
        }
 
        /**
index 082d435..b7e5b0a 100644 (file)
@@ -39,6 +39,7 @@ interface DeferrableUpdate {
  * Deferred updates can be run at the end of the request,
  * after the HTTP response has been sent. In CLI mode, updates
  * are only deferred until there is no local master DB transaction.
+ * When updates are deferred, they go into a simple FIFO queue.
  *
  * @since 1.19
  */
index 3c77238..ae75a75 100644 (file)
@@ -65,6 +65,8 @@ class SiteStatsUpdate implements DeferrableUpdate {
        public function doUpdate() {
                global $wgSiteStatsAsyncFactor;
 
+               $this->doUpdateContextStats();
+
                $rate = $wgSiteStatsAsyncFactor; // convenience
                // If set to do so, only do actual DB updates 1 every $rate times.
                // The other times, just update "pending delta" values in memcached.
@@ -153,6 +155,16 @@ class SiteStatsUpdate implements DeferrableUpdate {
                return $activeUsers;
        }
 
+       protected function doUpdateContextStats() {
+               $stats = RequestContext::getMain()->getStats();
+               foreach ( array( 'edits', 'articles', 'pages', 'users', 'images' ) as $type ) {
+                       $delta = $this->$type;
+                       if ( $delta !== 0 ) {
+                               $stats->updateCount( "site.$type", $delta );
+                       }
+               }
+       }
+
        protected function doUpdatePendingDeltas() {
                $this->adjustPending( 'ss_total_edits', $this->edits );
                $this->adjustPending( 'ss_good_articles', $this->articles );
index b81c573..d3ee9b9 100644 (file)
@@ -35,7 +35,7 @@ class HttpError extends MWException {
         *
         * @param int $httpCode HTTP status code to send to the client
         * @param string|Message $content Content of the message
-        * @param string|Message $header Content of the header (\<title\> and \<h1\>)
+        * @param string|Message|null $header Content of the header (\<title\> and \<h1\>)
         */
        public function __construct( $httpCode, $content, $header = null ) {
                parent::__construct( $content );
@@ -113,21 +113,21 @@ class HttpError extends MWException {
         */
        public function getHTML() {
                if ( $this->header === null ) {
-                       $header = HttpStatus::getMessage( $this->httpCode );
+                       $titleHtml = htmlspecialchars( HttpStatus::getMessage( $this->httpCode ) );
                } elseif ( $this->header instanceof Message ) {
-                       $header = $this->header->escaped();
+                       $titleHtml = $this->header->escaped();
                } else {
-                       $header = htmlspecialchars( $this->header );
+                       $titleHtml = htmlspecialchars( $this->header );
                }
 
                if ( $this->content instanceof Message ) {
-                       $content = $this->content->escaped();
+                       $contentHtml = $this->content->escaped();
                } else {
-                       $content = htmlspecialchars( $this->content );
+                       $contentHtml = htmlspecialchars( $this->content );
                }
 
                return "<!DOCTYPE html>\n" .
-               "<html><head><title>$header</title></head>\n" .
-               "<body><h1>$header</h1><p>$content</p></body></html>\n";
+               "<html><head><title>$titleHtml</title></head>\n" .
+               "<body><h1>$titleHtml</h1><p>$contentHtml</p></body></html>\n";
        }
 }
index fd929be..995d576 100644 (file)
        "config-install-begin": "Al pulsar en «{{int:config-continue}}» comenzará el proceso de instalación de MediaWiki.\nSi quieres realizar algún cambio, pulsa en «{{int:config-back}}».",
        "config-install-step-done": "hecho",
        "config-install-step-failed": "falló",
-       "config-install-extensions": "Extensiones inclusive",
+       "config-install-extensions": "Incluyendo extensiones",
        "config-install-database": "Configurando la base de datos",
        "config-install-schema": "Creando el esquema",
        "config-install-pg-schema-not-exist": "El esquema PostgreSQL no existe.",
index 6452fc6..2d06d42 100644 (file)
        "config-oracle-temp-ts": "جدول موقت:",
        "config-type-mysql": "مای‌اس‌کیو‌ال (یا سازگار)",
        "config-type-mssql": "سرور مایکروسافت اس‌کیو‌ال",
-       "config-support-info": "مدیاویکی سامانه‌های پایگاه اطلاعاتی زیر را حمایت می‌کند:\n$1\nاگر متوجه سامانه پایگاه اطلاعاتی که سعی دارید از فهرست زیر استفاده کنید، نمی‌شوید، بنابراین دستورالعمل‌های مرتبط در بالا را برای فعالکردن پشتیبانی دنبال کنید.",
+       "config-support-info": "مدیاویکی سامانه‌های پایگاه اطلاعاتی زیر را حمایت می‌کند:\n$1\nاگر متوجه سامانه پایگاه اطلاعاتی که سعی دارید از فهرست زیر استفاده کنید، نمی‌شوید، بنابراین دستورالعمل‌های مرتبط در بالا را برای فعال کردن پشتیبانی دنبال کنید.",
        "config-dbsupport-mysql": "*[{{int:version-db-mysql-url}} MySQL] مهم‌ترین هدف برای مدیاویکی است و بهترین پشتیبانی. مدیاویکی همچنین کار می‌کند با [{{int:version-db-mariadb-url}} MariaDB] و [{{int:version-db-percona-url}} Percona Server] که با MySQL سازگار هستند.([http://www.php.net/manual/en/mysqli.installation.php چگونه php را با MySQL کامپایل کنیم])",
        "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] یک منبع آزاد پر‌طرفدار دستگاه پایگاه اطلاعاتی به عنوان یک غیرمتعارف برای مای‌اس‌کیوال است.ممکن است عیوب بارز مختصری باشد، و برای استفاده در یک محیط تولیدی توصیه نمی‌شود.([http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support])",
        "config-dbsupport-sqlite": "*[{{int:version-db-sqlite-url}} اس‌کیولایت] یک سامانه پایگاه اطلاعاتی کم حجمی است که بسیار خوب پشتیبانی شده‌است.\n([http://www.php.net/manual/en/pdo.installation.php چگونگی کامپایل پی‌اچ‌پی با اس‌کیولایت]، از PDO استفاده می‌کند)",
        "config-email-settings": "تنظیمات ایمیل",
        "config-enable-email": "فعال‌سازی ایمیل خروجی",
        "config-enable-email-help": "اگر می‌خواهید ارسال ایمیل کار کند، [http://www.php.net/manual/en/mail.configuration.php PHP's mail settings] نیازمند پیکربندی صحیح است.\nاگر هیچ قابلیت ایمیلی نمی‌خواهید، می‌توانید آنها را اینجا غیر‌فعال کنید.",
-       "config-email-user": "فعالکردن ایمیل کاربر به کاربر",
+       "config-email-user": "فعال کردن ایمیل کاربر به کاربر",
        "config-email-user-help": "به همهٔ کاربرانی که ارسال ایمیل را در ترجیحات خود فعال کرده‌اند، اجازه داده خواهد شد که به یکدیگر ایمیل ارسال کنند.",
-       "config-email-usertalk": "فعالکردن اطلاع‌رسانی صفحهٔ بحث کاربر",
+       "config-email-usertalk": "فعال کردن اطلاع‌رسانی صفحهٔ بحث کاربر",
        "config-email-usertalk-help": "به همهٔ کاربرانی که دریافت اطلاعیه را در اولویت‌های خود فعال کرده‌اند،اجازه خواهد داده‌شد که اطلاعیه‌ها را در صفحهٔ تغییر گفت‌وگوی کاربر دریافت کنند.",
-       "config-email-watchlist": "فعالکردن اطلاع‌رسانی فهرست پیگیری‌ها",
+       "config-email-watchlist": "فعال کردن اطلاع‌رسانی فهرست پیگیری‌ها",
        "config-email-watchlist-help": "به همهٔ کاربرانی که مشاهدهٔ صفحه را در اولویت‌های خود فعال کرده‌اند،اجازه خواهد داده‌شد که اطلاعیه‌های در رابطه با صفحات مشاهده شده را دریافت کنند.",
        "config-email-auth": "فعال کردن احراز هویت توسط ایمیل",
-       "config-email-auth-help": "اگر این گزینه را فعال کنید، کاربران باید ایمیل خود را با استفاده از پیوند تأیید که به ایمیلشان ارسال می‌شود، تأیید کنند. \nدر این صورت تنها ایمیل‌هایی که تأیید شده باشند، می‌توانند از سیستم در هنگام تغییرات، ایمیل دریافت کنند.\nبرای ویکی‌هایی که به صورت عمومی استفاده می‌شوند، فعالکردن این گزینه پیشنهاد می‌شود.",
+       "config-email-auth-help": "اگر این گزینه را فعال کنید، کاربران باید ایمیل خود را با استفاده از پیوند تأیید که به ایمیلشان ارسال می‌شود، تأیید کنند. \nدر این صورت تنها ایمیل‌هایی که تأیید شده باشند، می‌توانند از سیستم در هنگام تغییرات، ایمیل دریافت کنند.\nبرای ویکی‌هایی که به صورت عمومی استفاده می‌شوند، فعال کردن این گزینه پیشنهاد می‌شود.",
        "config-email-sender": "آدرس ایمیل بازگشت:",
        "config-email-sender-help": "آدرس ایمیلی را وارد کنید که هنگام ارسال ایمیل خارج از محدوده از آن به عنوان ایمیل بازگشت استفاده شود.\nبه جایی که پیام‌ها برگشت داده می‌شوند، فرستاده خواهد شد.\nبسیاری از سرورهای پستی حداقل به بخش نام عمومی معتبر نیاز دارند.",
        "config-upload-settings": "بارگذاری‌های پرونده و تصویر",
        "config-upload-deleted-help": "فهرستی برای بایگانی کردن پوشه‌های حذف شده انتخاب کنید.\nبه طور مطلوب،از شبکه نباید در دسترس باشد.",
        "config-logo": "نشانی نامواره:",
        "config-logo-help": "پوستهٔ پیش‌فرض مدیاویکی شامل مکانی برای یک آرم ۱۳۵x۱۶۰ پیکسلی بالای منوی نوارکناری است.\nیک عکس با اندازهٔ مناسب ارسال کنید، و یوآرال را اینجا وارد کنید.\nاگر آرم شما با آن راه‌ها مزتبط است،می‌توانید از <code>$wgStylePath</code> یا <code>$wgScriptPath</code> استفاده کنید.\nاگر آرم نمی‌خواهید، این جعبه را خالی رها کنید.",
-       "config-instantcommons": "فعال‌کردن فوری کامنز",
+       "config-instantcommons": "فعال کردن فوری ویکی‌انبار",
        "config-instantcommons-help": "[//www.mediawiki.org/ ویکی و InstantCommons ویکی‌انبار فوری] یک ویژگی‌است که به شما اجازه می‌دهد تا تصاویر، صداها یا سایر رسانه‌های یافته شده بر روی [//commons.wikimedia.org/ انبار ویکی مدیا] را استفاده کنید.\n\nبرای استفاده از این ویژگی مدیاویکی نیازمند دسترسی به اینترنت است.\n\nبرای کسب اطلاعات بیشتر درباره این ویژگی٬ شامل دستورالعمل‌های برای چگونگی نصب آن برای سایر ویکی‌های بجز ویکی‌انبار لطفاً از  [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos the نصب دستی] استفاده کنید.",
        "config-cc-error": "مجوز چوزر عوام سازنده بی‌نتیجه ماند.\nنام مجوز را دستی وارد کنید.",
        "config-cc-again": "انتخاب دوباره...",
index 3419089..9b5a322 100644 (file)
@@ -52,7 +52,6 @@
        "config-env-bad": "הסביבה שלכם נבדקה.\nאי־אפשר להתקין מדיה־ויקי.",
        "config-env-php": "מותקנת <span dir=\"ltr\">PHP $1</span>.",
        "config-env-hhvm": "מותקנת <span dir=\"ltr\">HHVM $1</span>.",
-       "config-unicode-using-utf8": "משתמש ב־utf8_normalize.so של בריון ויבר לנרמול יוניקוד.",
        "config-unicode-using-intl": "משתמש ב[http://pecl.php.net/intl הרחבת intl PECL] לנרמול יוניקוד.",
        "config-unicode-pure-php-warning": "'''אזהרה''': [http://pecl.php.net/intl הרחבת intl PECL] אינה זמינה לטיפול בנרמול יוניקוד. משתמש ביישום PHP טהור ואטי יותר.\nאם זהו אתר בעל תעבורה גבוהה, כדאי לקרוא את המסמך הבא: [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].",
        "config-unicode-update-warning": "'''אזהרה''': הגרסה המותקנת של מעטפת נרמול יוניקוד משתמשת בגרסה ישנה של הספרייה של [http://site.icu-project.org/ פרויקט ICU].\nכדאי [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations לעדכן] אם הטיפול ביוניקוד חשוב לך.",
@@ -65,7 +64,7 @@
        "config-magic-quotes-sybase": "'''שגיאה סופנית''': האפשרות [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] פעילה!'''\nהאפשרות הזאת מעוותת את נתוני הקלט באופן בלתי־צפוי.\nלא ניתן להתקין את מדיה־ויקי או להשתמש בה אלא אם האפשרות הזאת תכובה.",
        "config-mbstring": "'''שגיאה סופנית''': האפשרות [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] פעילה!'''\nהאפשרות הזאת גורמת לשגיאות ומעוותת את נתוני הקלט באופן בלתי־צפוי.\nלא ניתן להתקין את מדיה־ויקי או להשתמש בה אלא אם האפשרות הזאת תכובה.",
        "config-safe-mode": "'''אזהרה:''' האפשרות [http://www.php.net/features.safe-mode safe mode] של PHP פעילה.\nהיא יכולה לגרום לבעיות, במיוחד אם אתם משתמשים בהעלאת קבצים או ב־<code>math</code>.",
-       "config-xml-bad": "×\9e×\95×\93×\95×\9c XML ×©×\9c PHP ×\97סר.\n×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×\93×\95רשת ×¤×\95נקצ×\99×\95ת ×©×\9c ×\94×\9e×\95×\93×\95×\9c ×\95×\9c×\90 ×ª×¢×\91×\95×\93 ×¢×\9d ×\94×\92×\93ר×\95ת ×\9b×\90×\9c×\95.\n×\90×\9d ×\9eער×\9bת ×\94×\94פע×\9c×\94 ×©×\9c×\94×\9d ×\94×\99×\90 Mandrake, ×\94תק×\99× ×\95 ×\90ת ×\94×\97×\91×\99×\9c×\94 php-xml.",
+       "config-xml-bad": "×\9e×\95×\93×\95×\9c XML ×©×\9c PHP ×\97סר.\n×\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×\93×\95רשת ×¤×\95נקצ×\99×\95ת ×©×\9c ×\94×\9e×\95×\93×\95×\9c ×\95×\9c×\90 ×ª×¢×\91×\95×\93 ×¢×\9d ×\94×\92×\93ר×\95ת ×\9b×\90×\9c×\95.\n×\99×\99ת×\9b×\9f ×©×¦×¨×\99×\9a ×\9c×\94תק×\99×\9f ×\91×\90×\9eצע×\95ת RPM ×\90ת ×\97×\91×\99×\9cת php-xml.",
        "config-pcre-old": "<strong>שגיאה סופנית:</strong> חובה להתקין PCRE מגרסה $1 או גרסה חדשה יותר.\nקובץ הרצת ה־PHP שלך מקושר עם PCRE מגרסה $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE מידע נוסף].",
        "config-pcre-no-utf8": "'''שגיאה סופנית''': נראה שמודול PCRE של PHP מקומפל ללא תמיכה ב־PCRE_UTF8.\nמדיה־ויקי דורשת תמיכה ב־UTF-8 לפעילות נכונה.",
        "config-memory-raised": "ערך האפשרות <code>memory_limit</code> של PHP הוא $1, הועלה ל־$2.",
index ed81805..fbb7fd9 100644 (file)
@@ -33,7 +33,7 @@
        "config-page-name": "Nahme",
        "config-page-options": "Ennställunge",
        "config-page-install": "Opsäzze",
-       "config-page-complete": "Fäädesch!",
+       "config-page-complete": "Fähdesch!",
        "config-page-restart": "Et Opsäze norr_ens neu aanfange",
        "config-page-readme": "Donn mesch lässe! (<i lang=\"en\">read me</i>)",
        "config-page-releasenotes": "Henwies för heh di Version vum Projramm (<i lang=\"en\">Release notes</i>)",
        "config-subscribe": "Donn de [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce \n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Leß met de Aanköndijonge vum MehdijaWikki] abonnehre.",
        "config-subscribe-help": "Do kumme bloß winnish Meddeilunge un di jonn övver neu Versiohne vom MediaWiki un weeshtejje Saache vun däm sing Sesherheit.\nDo sullts se abbonneere, un Ding MediWiki_Projramme op der neue Shtand bränge, wann neu Version eruß kumme.",
        "config-subscribe-noemail": "Do has versöhk, der ohne en Addräß för Ding <i lang=\"en\">e-mail<i> aanzejävve, de Aanköndijonge för Aanköndijunge för neue Versione ze abboneere. Jivv en Addräß aan, wann De di Aanköndijonge hann wells.",
-       "config-almost-done": "Do bes beinah dorsh!\nDo künnts jez der Räß vun de einzel Enshtellunge övverjonn, un et Wiki tiräktemang fäädesch opsäze.",
+       "config-almost-done": "Do bes beinah dorsch!\nDo künnts jez der Räß vun de einzel Enschtällonge övverjonn, un et Wiki tiräktemang fähdesch opsäze.",
        "config-optional-continue": "De wells noch mih Frohre jeschtallt krijje un noch mih Enschtällonge maache?",
        "config-optional-skip": "Nä, lohß dä Ömshtand, donn eifarr_et Wiki opsäze.",
        "config-profile": "Enshtällunge för de Metmaacher ier Rääschte:",
index afc78d2..f602ffe 100644 (file)
@@ -21,6 +21,7 @@
        "config-page-language": "भाषा",
        "config-page-welcome": "मिडीयाविकिमा तपाईंलाई स्वागत छ!",
        "config-page-dbconnect": "डेटाबेससँग सम्बन्ध बनाउने",
+       "config-page-dbsettings": "डेटावेस सेटिङ",
        "config-page-name": "नाम",
        "config-page-options": "विकल्पहरु",
        "config-page-install": "स्थापना गर्ने",
        "config-env-php": "PHP $1 स्थापना गरिएको छ ।",
        "config-env-hhvm": "HHVM $1 स्थापना गरिएको छ ।",
        "config-db-type": "डाटाबेस प्रकारः",
+       "config-db-host": "डेटाबेस होस्ट:",
+       "config-db-host-oracle": "डेटाबेस TNS:",
        "config-db-name": "डाटाबेस नामः",
+       "config-db-name-oracle": "डेटाबेस स्केमा:",
        "config-db-username": "डाटाबेस प्रयोगकर्ता नामः",
        "config-db-password": "डाटाबेस पासबर्डः",
+       "config-db-port": "डेटाबेस पोर्ट:",
+       "config-header-mysql": "MySQL सेटिङ",
+       "config-header-postgres": "PostgreSQL सेटिङहरू",
+       "config-header-sqlite": "SQLite सेटिङ्हरू",
+       "config-header-oracle": "ओरेकल सेटिङहरू",
+       "config-mysql-binary": "बाइनरी",
+       "config-mysql-utf8": "UTF-8",
+       "config-site-name": "विकीको नाम:",
+       "config-site-name-blank": "साइटको नाम लेख्नुहोस।",
+       "config-project-namespace": "आयोजना नेमस्पेस:",
+       "config-ns-generic": "परियोजना",
+       "config-ns-other": "अन्य(खुलाउनुहोस)",
+       "config-ns-other-default": "MyWiki",
+       "config-admin-box": "प्रवन्धक खाता",
+       "config-admin-name": "तपाईँको प्रयोगकर्ता नाम:",
+       "config-admin-password": "पासवर्ड:",
+       "config-admin-email": "इमेल ठेगाना:",
+       "config-optional-continue": "मलाई थप प्रश्नहरू सोध्नुहोस् ।",
+       "config-profile": "प्रयोगकर्ता अधिकार प्रोफाइल:",
        "config-profile-wiki": "खुल्ला विकि",
+       "config-profile-no-anon": "खाता बनाउन नै पर्ने",
+       "config-profile-fishbowl": "अधिकार प्राप्त प्रयोगकर्ताहरू मात्र",
        "config-profile-private": "निजी विकि",
+       "config-license": "प्रतिलिपी अधिकार र इजाजतपत्र:",
+       "config-license-none": "इजाजतपत्र फूटर नभएको",
+       "config-license-cc-by-sa": "क्रियटिभ कमन्स एट्रिव्युसन- सेयर अलाइक",
+       "config-license-cc-by": "क्रियटिभ कमन्स एट्रिव्युसन",
        "config-email-settings": "इमेल सेटिंग",
+       "config-extensions": "एक्सटेन्सनहरू",
+       "config-skins": "स्किनहरू",
        "config-install-step-done": "सम्पन्न",
        "config-install-step-failed": "असफल",
        "config-install-tables": "टेबल बनाउदै",
index a2ab5d2..1fd98ff 100644 (file)
@@ -13,7 +13,8 @@
                        "Southparkfan",
                        "Seb35",
                        "Mar(c)",
-                       "Sjoerddebruin"
+                       "Sjoerddebruin",
+                       "Esketti"
                ]
        },
        "config-desc": "Het installatieprogramma voor MediaWiki",
@@ -71,7 +72,7 @@
        "config-magic-quotes-sybase": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase] is actief!'''\nDeze instelling zorgt voor onvoorspelbare gegevenscorruptie.\nU kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
        "config-mbstring": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is actief!'''\nDeze instelling zorgt voor onvoorspelbare gegevenscorruptie.\nU kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
        "config-safe-mode": "'''Waarschuwing:'''\n'''PHP's [http://www.php.net/features.safe-mode veilige modus] is actief.'''\nDit kan problemen veroorzaken, vooral bij het uploaden van bestanden en ondersteuning van <code>math</code>.",
-       "config-xml-bad": "De XML-module van PHP ontbreekt.\nMediaWiki heeft de functies van deze module nodig en werkt niet zonder deze module.\nAls u gebruik maakt van Mandrake, installeer dan het package php-xml.",
+       "config-xml-bad": "PHP-XML-module ontbreekt.\nMediaWiki is vereist functies in deze module en zal niet werken in deze configuratie.\nMoet u de php-xml-RPM pakket.",
        "config-pcre-old": "'''Onherstelbare fout:''' PCRE $1 of een latere versie is vereist.\nUw uitvoerbare versie van PHP is gekoppeld met PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Meer informatie].",
        "config-pcre-no-utf8": "'''Fataal:''' de module PRCE van PHP lijkt te zijn gecompileerd zonder ondersteuning voor PCRE_UTF8.\nMediaWiki heeft ondersteuning voor UTF-8 nodig om correct te kunnen werken.",
        "config-memory-raised": "PHP's <code>memory_limit</code> is $1 en is verhoogd tot $2.",
index 5d75be7..06c1469 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Harald Khan",
-                       "Nghtwlkr"
+                       "Nghtwlkr",
+                       "Njardarlogar"
                ]
        },
        "config-your-language": "Språket ditt:",
@@ -36,6 +37,7 @@
        "config-postgres-old": "PostgreSQL $1 eller seinare krevst, du har $2.",
        "config-email-settings": "E-postinnstillingar",
        "config-logo": "Logo-URL:",
+       "config-help": "hjelp",
        "mainpagetext": "'''MediaWiki er no installert.'''",
        "mainpagedocfooter": "Sjå [//meta.wikimedia.org/wiki/Help:Contents brukarmanualen] for informasjon om bruk og oppsettshjelp for wikiprogramvara.\n\n==Kome i gang==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste over oppsettsinnstillingar]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Spørsmål og svar om MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postliste med informasjon om nye MediaWiki-versjonar]"
 }
index 2275a0b..795bacd 100644 (file)
        "config-page-options": "خوښنې",
        "config-page-install": "لگول",
        "config-page-complete": "بشپړ!",
+       "config-page-restart": "نصبېدنه بياپيلول",
        "config-page-readme": "ما ولوله",
+       "config-page-releasenotes": "خپاره شوي يادښتونه",
        "config-page-copying": "لمېسنه",
        "config-page-upgradedoc": "نومهالېدنه",
        "config-page-existingwiki": "شته ويکي",
        "config-restart": "هو، سر له نوي يې پيل کړه",
        "config-env-php": "د $1 PHP نصب شو.",
+       "config-env-hhvm": "HHVM $1 نصب شو.",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] نصب شو",
+       "config-apc": "[http://www.php.net/apc APC] نصب شو",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] نصب شو",
        "config-db-type": "د توکبنسټ ډول:",
        "config-db-host": "د توکبنسټ کوربه:",
        "config-db-host-oracle": "د توکبنسټ TNS:",
        "config-db-name": "د توکبنسټ نوم:",
        "config-db-username": "د توکبنسټ کارن-نوم:",
        "config-db-password": "د توکبنسټ پټنوم:",
+       "config-type-mssql": "مايکروسافټ SQL پالنگر",
        "config-header-mysql": "د MySQL امستنې",
        "config-header-postgres": "د PostgreSQL امستنې",
        "config-header-sqlite": "د SQLite امستنې",
        "config-header-oracle": "د اورېکل امستنې",
+       "config-header-mssql": "د مايکروسافټ SQL پالنگر امستنې",
        "config-sqlite-readonly": "د <code>$1</code> دوتنه د ليکلو وړ نه ده.",
        "config-sqlite-cant-create-db": "د توکبنسټ دوتنه <code>$1</code> جوړه نه شوه.",
+       "config-mysql-utf8": "UTF-8",
        "config-site-name": "د ويکي نوم:",
        "config-site-name-blank": "د وېبځي نوم وليکۍ.",
        "config-project-namespace": "د پروژې نوم-تشيال:",
        "config-ns-generic": "پروژه",
+       "config-ns-other": "بل (ځانگړی کړئ)",
        "config-ns-other-default": "زما ويکي",
        "config-admin-box": "د پازوال گڼون",
        "config-admin-name": "ستاسې کارن نوم:",
        "config-license-pd": "ټولگړی شپول",
        "config-email-settings": "د برېښليک امستنې",
        "config-email-user": "کارن تر کارن برېښليک چارنول",
+       "config-extensions": "شاتاړي",
+       "config-skins": "پوښۍ",
+       "config-skins-use-as-default": "همدا پوښۍ په تلواليزه توگه کارول",
        "config-install-step-done": "ترسره شو",
+       "config-install-step-failed": "نابريال شو",
        "config-install-user-alreadyexists": "د \"$1\" کارن له پخوا څخه شته",
        "config-install-tables": "لښتيالونه جوړول",
        "config-download-localsettings": "ښکته کول <code>LocalSettings.php</code>",
diff --git a/includes/installer/i18n/sd.json b/includes/installer/i18n/sd.json
new file mode 100644 (file)
index 0000000..02e9797
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Sindhu"
+               ]
+       },
+       "config-xml-bad": "PHP جو XML ماڊيول کٽل آهي. ميڊيا وڪيءَ کي هن فنڪشن ۾ ماڊيول گھربل آهن ۽ ترتيب يا ڪنفيگيوريشن ۾ ڪم نه ڪندي. \nتوهان کي گھرجي ته php-xml RPM پيڪيج انسٽال ڪريو."
+}
index b8f131e..ca4a5ef 100644 (file)
@@ -4,6 +4,13 @@
                        "Kandar"
                ]
        },
+       "config-desc": "Panginstal MediaWiki",
+       "config-title": "Instalasi MediaWiki $1",
+       "config-information": "Émbaran",
+       "config-localsettings-upgrade": "Hiji berkas <code>LocalSettings.php</code> kapanggih.\nPikeun apgréd ngamutahirkeun ieu instalasi, mangga asupkeun sandi <code>$wgUpgradeKey</code> kana kotak di handap.\nAnjeun bisa manggihan sandina di <code>LocalSettings.php</code>.",
+       "config-localsettings-cli-upgrade": "Hiji berkas <code>LocalSettings.php</code> geus kabaca.\nPikeun apgréd ieu instalasi, mangga jalankeun <code>update.php</code>",
+       "config-localsettings-key": "Sandi apgréd:",
+       "config-localsettings-badkey": "Sandi anu diasupkeun salah.",
        "mainpagetext": "<strong>MediaWiki geus réngsé diinstal.</strong>",
        "mainpagedocfooter": "Mangga tingal ''[//meta.wikimedia.org/wiki/MediaWiki_localisation documentation on customizing the interface]'' jeung [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Tungtunan Pamaké] pikeun pitulung maké jeung konfigurasi."
 }
index 01052d3..283ad3c 100644 (file)
@@ -1,9 +1,11 @@
 {
        "@metadata": {
                "authors": [
-                       "Wu-chinese.com"
+                       "Wu-chinese.com",
+                       "Poiuyt"
                ]
        },
+       "config-information": "信息",
        "mainpagetext": "'''MediaWiki安装成功哉!'''",
        "mainpagedocfooter": "请访问[//meta.wikimedia.org/wiki/Help:Contents 用户手册]以获得使用此维基软件个信息!\n\n== 入门 ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki 配置设置列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki 常见问题解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布邮件列表]"
 }
index e1d2226..300540f 100644 (file)
        "config-page-existingwiki": "עקזיסטירנדע וויקי",
        "config-help-restart": "צי ווילט איר אפראמען די גארע געשפייכלערטע דאטן וואס איר האט אײַנגעגעבן און ווידער אנהייבן דעם אינסטאלאציע־פראצעס?",
        "config-restart": "יא, ווידעראמאל אנהייבן",
+       "config-env-good": "מ'האט קאנטראלירט די סביבה.\nאיר קענט אינסטאלירן מעדיעוויקי.",
+       "config-env-bad": "מ'האט קאנטראלירט די סביבה.\nאיר קענט נישט אינסטאלירן מעדיעוויקי.",
        "config-env-php": "PHP $1 איז אינצטאלירט.",
+       "config-env-hhvm": "HHVM $1 איז אינסטאלירט.",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] איז אינסטאלירט",
        "config-apc": "[http://www.php.net/apc APC] איז אינסטאלירט",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] איז אינסטאלירט",
        "config-diff3-bad": "GNU diff3 נישט געטראפן.",
        "config-db-type": "דאטנבאזע טיפ:",
        "config-db-host-oracle": "דאטנבאזע־TNS:",
+       "config-db-wiki-settings": "אידענטיפיצירן די דאזיקע וויקי",
        "config-db-name": "דאטנבאזע נאָמען:",
        "config-db-username": "דאטנבאזע באניצער־נאָמען:",
+       "config-db-password": "דאטנבאזע־פאסווארט:",
        "config-project-namespace": "פראיעקט נאָמענטייל:",
        "config-ns-generic": "פראיעקט",
        "config-admin-name": "אײַער באַניצער־נאָמען:",
index f8de0b5..87bd836 100644 (file)
@@ -32,7 +32,7 @@ abstract class Job implements IJobSpecification {
        /** @var string */
        public $command;
 
-       /** @var array|bool Array of job parameters or false if none */
+       /** @var array Array of job parameters */
        public $params;
 
        /** @var array Additional queue metadata */
@@ -58,11 +58,11 @@ abstract class Job implements IJobSpecification {
         *
         * @param string $command Job command
         * @param Title $title Associated title
-        * @param array|bool $params Job parameters
+        * @param array $params Job parameters
         * @throws MWException
         * @return Job
         */
-       public static function factory( $command, Title $title, $params = false ) {
+       public static function factory( $command, Title $title, $params = array() ) {
                global $wgJobClasses;
                if ( isset( $wgJobClasses[$command] ) ) {
                        $class = $wgJobClasses[$command];
@@ -80,7 +80,7 @@ abstract class Job implements IJobSpecification {
        public function __construct( $command, $title, $params = false ) {
                $this->command = $command;
                $this->title = $title;
-               $this->params = $params;
+               $this->params = is_array( $params ) ? $params : array(); // sanity
 
                // expensive jobs may set this to true
                $this->removeDuplicates = false;
index 7edb6ad..2e20660 100644 (file)
@@ -81,6 +81,7 @@ class JobQueueRedis extends JobQueue {
         *   - daemonized  : Set to true if the redisJobRunnerService runs in the background.
         *                   This will disable job recycling/undelaying from the MediaWiki side
         *                   to avoid redundance and out-of-sync configuration.
+        * @throws InvalidArgumentException
         */
        public function __construct( array $params ) {
                parent::__construct( $params );
@@ -89,7 +90,7 @@ class JobQueueRedis extends JobQueue {
                $this->compression = isset( $params['compression'] ) ? $params['compression'] : 'none';
                $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
                if ( empty( $params['daemonized'] ) ) {
-                       throw new Exception(
+                       throw new InvalidArgumentException(
                                "Non-daemonized mode is no longer supported. Please install the " .
                                "mediawiki/services/jobrunner service and update \$wgJobTypeConf as needed." );
                }
@@ -110,7 +111,7 @@ class JobQueueRedis extends JobQueue {
        /**
         * @see JobQueue::doIsEmpty()
         * @return bool
-        * @throws MWException
+        * @throws JobQueueError
         */
        protected function doIsEmpty() {
                return $this->doGetSize() == 0;
@@ -119,7 +120,7 @@ class JobQueueRedis extends JobQueue {
        /**
         * @see JobQueue::doGetSize()
         * @return int
-        * @throws MWException
+        * @throws JobQueueError
         */
        protected function doGetSize() {
                $conn = $this->getConnection();
@@ -356,11 +357,12 @@ LUA;
         * @see JobQueue::doAck()
         * @param Job $job
         * @return Job|bool
-        * @throws MWException|JobQueueError
+        * @throws UnexpectedValueException
+        * @throws JobQueueError
         */
        protected function doAck( Job $job ) {
                if ( !isset( $job->metadata['uuid'] ) ) {
-                       throw new MWException( "Job of type '{$job->getType()}' has no UUID." );
+                       throw new UnexpectedValueException( "Job of type '{$job->getType()}' has no UUID." );
                }
 
                $conn = $this->getConnection();
@@ -402,11 +404,12 @@ LUA;
         * @see JobQueue::doDeduplicateRootJob()
         * @param Job $job
         * @return bool
-        * @throws MWException|JobQueueError
+        * @throws JobQueueError
+        * @throws LogicException
         */
        protected function doDeduplicateRootJob( Job $job ) {
                if ( !$job->hasRootJobParams() ) {
-                       throw new MWException( "Cannot register root job; missing parameters." );
+                       throw new LogicException( "Cannot register root job; missing parameters." );
                }
                $params = $job->getRootJobParams();
 
@@ -591,7 +594,8 @@ LUA;
         * @param string $uid
         * @param RedisConnRef $conn
         * @return Job|bool Returns false if the job does not exist
-        * @throws MWException|JobQueueError
+        * @throws JobQueueError
+        * @throws UnexpectedValueException
         */
        public function getJobFromUidInternal( $uid, RedisConnRef $conn ) {
                try {
@@ -601,7 +605,7 @@ LUA;
                        }
                        $item = $this->unserialize( $data );
                        if ( !is_array( $item ) ) { // this shouldn't happen
-                               throw new MWException( "Could not find job with ID '$uid'." );
+                               throw new UnexpectedValueException( "Could not find job with ID '$uid'." );
                        }
                        $title = Title::makeTitle( $item['namespace'], $item['title'] );
                        $job = Job::factory( $item['type'], $title, $item['params'] );
index b04ab28..bb12298 100644 (file)
@@ -128,7 +128,7 @@ class JobRunner implements LoggerAwareInterface {
                $group = JobQueueGroup::singleton();
                
                // Flush any pending DB writes for sanity
-               wfGetLBFactory()->commitMasterChanges();
+               wfGetLBFactory()->commitAll();
 
                // Some jobs types should not run until a certain timestamp
                $backoffs = array(); // map of (type => UNIX expiry)
@@ -190,6 +190,14 @@ class JobRunner implements LoggerAwareInterface {
                                        $error = get_class( $e ) . ': ' . $e->getMessage();
                                        MWExceptionHandler::logException( $e );
                                }
+                               // Commit all outstanding connections that are in a transaction
+                               // to get a fresh repeatable read snapshot on every connection.
+                               // This is important because if you have an old snapshot on the
+                               // database you could run the job incorrectly. Its possible, for
+                               // example, to pick up a RefreshLinksJob for a new page that isn't
+                               // even visible to the snapshot. The snapshot could have been
+                               // created before the page. Fresh snapshots will see the page.
+                               wfGetLBFactory()->commitAll();
                                $timeMs = intval( ( microtime( true ) - $jobStartTime ) * 1000 );
                                $timeMsTotal += $timeMs;
                                $profiler->scopedProfileOut( $psection );
@@ -410,7 +418,10 @@ class JobRunner implements LoggerAwareInterface {
        }
 
        /**
-        * Commit any DB master changes from a job on all load balancers
+        * Issue a commit on all masters who are currently in a transaction and have
+        * made changes to the database. It also supports sometimes waiting for the
+        * local wiki's slaves to catch up. See the documentation for
+        * $wgJobSerialCommitThreshold for more.
         *
         * @param Job $job
         * @throws DBError
index 495bda9..f146e6e 100644 (file)
@@ -27,7 +27,7 @@
  * @since 1.26
  */
 class ActivityUpdateJob extends Job {
-       function __construct( $title, $params ) {
+       function __construct( Title $title, array $params ) {
                parent::__construct( 'activityUpdateJob', $title, $params );
 
                if ( !isset( $params['type'] ) ) {
index b7f09e7..a1de77e 100644 (file)
@@ -27,7 +27,7 @@
  * @ingroup Upload
  */
 class AssembleUploadChunksJob extends Job {
-       public function __construct( $title, $params ) {
+       public function __construct( Title $title, array $params ) {
                parent::__construct( 'AssembleUploadChunks', $title, $params );
                $this->removeDuplicates = true;
        }
index 2561f2f..ab63896 100644 (file)
@@ -40,6 +40,16 @@ class DoubleRedirectJob extends Job {
        /** @var User */
        private static $user;
 
+       /**
+        * @param Title $title
+        * @param array $params
+        */
+       function __construct( Title $title, array $params ) {
+               parent::__construct( 'fixDoubleRedirect', $title, $params );
+               $this->reason = $params['reason'];
+               $this->redirTitle = Title::newFromText( $params['redirTitle'] );
+       }
+
        /**
         * Insert jobs into the job queue to fix redirects to the given title
         * @param string $reason The reason for the fix, see message
@@ -81,16 +91,6 @@ class DoubleRedirectJob extends Job {
                JobQueueGroup::singleton()->push( $jobs );
        }
 
-       /**
-        * @param Title $title
-        * @param array|bool $params
-        */
-       function __construct( $title, $params = false ) {
-               parent::__construct( 'fixDoubleRedirect', $title, $params );
-               $this->reason = $params['reason'];
-               $this->redirTitle = Title::newFromText( $params['redirTitle'] );
-       }
-
        /**
         * @return bool
         */
index c5e3a23..068d531 100644 (file)
@@ -33,7 +33,7 @@ final class DuplicateJob extends Job {
         * @param Title $title
         * @param array $params Job parameters
         */
-       function __construct( $title, $params ) {
+       function __construct( Title $title, array $params ) {
                parent::__construct( 'duplicate', $title, $params );
        }
 
index df8ae63..68e96fc 100644 (file)
@@ -28,7 +28,7 @@
  * @ingroup JobQueue
  */
 class EmaillingJob extends Job {
-       function __construct( $title, $params ) {
+       function __construct( Title $title = null, array $params ) {
                parent::__construct( 'sendMail', Title::newMainPage(), $params );
        }
 
index 1ed99a5..9a5c3c7 100644 (file)
@@ -27,7 +27,7 @@
  * @ingroup JobQueue
  */
 class EnotifNotifyJob extends Job {
-       function __construct( $title, $params ) {
+       function __construct( Title $title, array $params ) {
                parent::__construct( 'enotifNotify', $title, $params );
        }
 
index 4514e19..ca597ca 100755 (executable)
@@ -40,7 +40,7 @@ final class EnqueueJob extends Job {
         * @param Title $title
         * @param array $params Job parameters
         */
-       function __construct( $title, $params ) {
+       function __construct( Title $title, array $params ) {
                parent::__construct( 'enqueue', $title, $params );
        }
 
index e5e521c..a9010c2 100644 (file)
@@ -34,7 +34,7 @@
  * @ingroup JobQueue
  */
 class HTMLCacheUpdateJob extends Job {
-       function __construct( $title, $params = '' ) {
+       function __construct( Title $title, array $params ) {
                parent::__construct( 'htmlCacheUpdate', $title, $params );
                // Base backlink purge jobs can be de-duplicated
                $this->removeDuplicates = ( !isset( $params['range'] ) && !isset( $params['pages'] ) );
index f94d6eb..26d3c5c 100644 (file)
@@ -49,7 +49,7 @@ class NullJob extends Job {
         * @param Title $title
         * @param array $params Job parameters (lives, usleep)
         */
-       function __construct( $title, $params ) {
+       function __construct( Title $title, array $params ) {
                parent::__construct( 'null', $title, $params );
                if ( !isset( $this->params['lives'] ) ) {
                        $this->params['lives'] = 1;
index a922dd3..8a180ec 100644 (file)
@@ -29,7 +29,7 @@
  * @ingroup JobQueue
  */
 class PublishStashedFileJob extends Job {
-       public function __construct( $title, $params ) {
+       public function __construct( Title $title, array $params ) {
                parent::__construct( 'PublishStashedFile', $title, $params );
                $this->removeDuplicates = true;
        }
index cc04595..e86d914 100644 (file)
@@ -27,7 +27,7 @@
  * @since 1.25
  */
 class RecentChangesUpdateJob extends Job {
-       function __construct( $title, $params ) {
+       function __construct( Title $title, array $params ) {
                parent::__construct( 'recentChangesUpdate', $title, $params );
 
                if ( !isset( $params['type'] ) ) {
index 749913a..f706455 100644 (file)
@@ -39,7 +39,7 @@ class RefreshLinksJob extends Job {
 
        const CLOCK_FUDGE = 10;
 
-       function __construct( $title, $params = '' ) {
+       function __construct( Title $title, array $params ) {
                parent::__construct( 'refreshLinks', $title, $params );
                // A separate type is used just for cascade-protected backlinks
                if ( !empty( $this->params['prioritize'] ) ) {
index ab38138..a58fa8b 100644 (file)
@@ -27,7 +27,7 @@
  * @ingroup JobQueue
  */
 class ThumbnailRenderJob extends Job {
-       public function __construct( $title, $params ) {
+       public function __construct( Title $title, array $params ) {
                parent::__construct( 'ThumbnailRender', $title, $params );
        }
 
index d15fd02..a15d51e 100644 (file)
@@ -39,7 +39,7 @@ class UploadFromUrlJob extends Job {
        /** @var User */
        protected $user;
 
-       public function __construct( $title, $params ) {
+       public function __construct( Title $title, array $params ) {
                parent::__construct( 'uploadFromUrl', $title, $params );
        }
 
index ffe26a9..f415c9b 100644 (file)
@@ -31,6 +31,9 @@ class CSSMin {
 
        /* Constants */
 
+       /** @var string Strip marker for comments. **/
+       const PLACEHOLDER = "\x7fPLACEHOLDER\x7f";
+
        /**
         * Internet Explorer data URI length limit. See encodeImageAsDataURI().
         */
@@ -232,19 +235,22 @@ class CSSMin {
                        $remote = substr( $remote, 0, -1 );
                }
 
+               // Disallow U+007F DELETE, which is illegal anyway, and which
+               // we use for comment placeholders.
+               $source = str_replace( "\x7f", "?", $source );
+
                // Replace all comments by a placeholder so they will not interfere with the remapping.
                // Warning: This will also catch on anything looking like the start of a comment between
                // quotation marks (e.g. "foo /* bar").
                $comments = array();
-               $placeholder = uniqid( '', true );
 
                $pattern = '/(?!' . CSSMin::EMBED_REGEX . ')(' . CSSMin::COMMENT_REGEX . ')/s';
 
                $source = preg_replace_callback(
                        $pattern,
-                       function ( $match ) use ( &$comments, $placeholder ) {
+                       function ( $match ) use ( &$comments ) {
                                $comments[] = $match[ 0 ];
-                               return $placeholder . ( count( $comments ) - 1 ) . 'x';
+                               return CSSMin::PLACEHOLDER . ( count( $comments ) - 1 ) . 'x';
                        },
                        $source
                );
@@ -257,13 +263,13 @@ class CSSMin {
 
                $source = preg_replace_callback(
                        $pattern,
-                       function ( $matchOuter ) use ( $local, $remote, $embedData, $placeholder ) {
+                       function ( $matchOuter ) use ( $local, $remote, $embedData ) {
                                $rule = $matchOuter[0];
 
                                // Check for global @embed comment and remove it. Allow other comments to be present
                                // before @embed (they have been replaced with placeholders at this point).
                                $embedAll = false;
-                               $rule = preg_replace( '/^((?:\s+|' . $placeholder . '(\d+)x)*)' . CSSMin::EMBED_REGEX . '\s*/', '$1', $rule, 1, $embedAll );
+                               $rule = preg_replace( '/^((?:\s+|' . CSSMin::PLACEHOLDER . '(\d+)x)*)' . CSSMin::EMBED_REGEX . '\s*/', '$1', $rule, 1, $embedAll );
 
                                // Build two versions of current rule: with remapped URLs
                                // and with embedded data: URIs (where possible).
@@ -328,7 +334,7 @@ class CSSMin {
                        }, $source );
 
                // Re-insert comments
-               $pattern = '/' . $placeholder . '(\d+)x/';
+               $pattern = '/' . CSSMin::PLACEHOLDER . '(\d+)x/';
                $source = preg_replace_callback( $pattern, function( $match ) use ( &$comments ) {
                        return $comments[ $match[1] ];
                }, $source );
index 3cabdae..8264673 100644 (file)
@@ -206,6 +206,8 @@ class UserMailer {
                $headers['Date'] = MWTimestamp::getLocalInstance()->format( 'r' );
                $headers['Message-ID'] = self::makeMsgId();
                $headers['X-Mailer'] = 'MediaWiki mailer';
+               $headers['List-Unsubscribe'] = '<' . SpecialPage::getTitleFor( 'Preferences' )
+                       ->getFullURL( '', false, PROTO_CANONICAL ) . '>';
 
                # Line endings need to be different on Unix and Windows due to
                # the bug described at http://trac.wordpress.org/ticket/2603
index 042f749..6b36e37 100644 (file)
@@ -155,16 +155,27 @@ class XMPReader implements LoggerAwareInterface {
                $this->logger = $logger;
        }
 
+       /**
+        * free the XML parser.
+        *
+        * @note It is unclear to me if we really need to do this ourselves
+        *  or if php garbage collection will automatically free the xmlParser
+        *  when it is no longer needed.
+        */
+       private function destroyXMLParser() {
+               if ( $this->xmlParser ) {
+                       xml_parser_free( $this->xmlParser );
+                       $this->xmlParser = null;
+               }
+       }
+
        /**
         * Main use is if a single item has multiple xmp documents describing it.
         * For example in jpeg's with extendedXMP
         */
        private function resetXMLParser() {
 
-               if ( $this->xmlParser ) {
-                       //is this needed?
-                       xml_parser_free( $this->xmlParser );
-               }
+               $this->destroyXMLParser();
 
                $this->xmlParser = xml_parser_create_ns( 'UTF-8', ' ' );
                xml_parser_set_option( $this->xmlParser, XML_OPTION_CASE_FOLDING, 0 );
@@ -180,15 +191,6 @@ class XMPReader implements LoggerAwareInterface {
                $this->xmlParsableBuffer = '';
        }
 
-       /** Destroy the xml parser
-        *
-        * Not sure if this is actually needed.
-        */
-       function __destruct() {
-               // not sure if this is needed.
-               xml_parser_free( $this->xmlParser );
-       }
-
        /**
         * Check if this instance supports using this class
         */
@@ -294,12 +296,11 @@ class XMPReader implements LoggerAwareInterface {
         *
         * @param string $content XMP data
         * @param bool $allOfIt If this is all the data (true) or if its split up (false). Default true
-        * @param bool $reset Does xml parser need to be reset. Default false
         * @throws RuntimeException
         * @return bool Success.
         */
-       public function parse( $content, $allOfIt = true, $reset = false ) {
-               if ( $reset ) {
+       public function parse( $content, $allOfIt = true ) {
+               if ( !$this->xmlParser ) {
                        $this->resetXMLParser();
                }
                try {
@@ -373,14 +374,21 @@ class XMPReader implements LoggerAwareInterface {
 
                                $this->logger->info( "XMPReader::parse : Error reading XMP content: $error ($where)" );
                                $this->results = array(); // blank if error.
+                               $this->destroyXMLParser();
                                return false;
                        }
                } catch ( Exception $e ) {
                        $this->logger->info( 'XMP parse error: ' . $e );
                        $this->results = array();
 
+                       if ( $allOfIt ) {
+                               $this->destroyXMLParser();
+                       }
                        return false;
                }
+               if ( $allOfIt ) {
+                       $this->destroyXMLParser();
+               }
 
                return true;
        }
index 5e4438a..1fd22cf 100644 (file)
@@ -1961,13 +1961,13 @@ class WikiPage implements Page, IDBAccessObject {
                $status->value['revision'] = $revision;
 
                $hook_args = array( &$this, &$user, $content, $summary,
-                                                       $flags & EDIT_MINOR, null, null, &$flags, $revision, &$status, $baseRevId );
+                       $flags & EDIT_MINOR, null, null, &$flags, $revision, &$status, $baseRevId );
 
                ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $hook_args );
                Hooks::run( 'PageContentSaveComplete', $hook_args );
 
                // Promote user to any groups they meet the criteria for
-               $dbw->onTransactionIdle( function () use ( $user ) {
+               DeferredUpdates::addCallableUpdate( function () use ( $user ) {
                        $user->addAutopromoteOnceGroups( 'onEdit' );
                        $user->addAutopromoteOnceGroups( 'onView' ); // b/c
                } );
@@ -2769,9 +2769,16 @@ class WikiPage implements Page, IDBAccessObject {
                $dbw->begin( __METHOD__ );
 
                if ( $id == 0 ) {
-                       $this->loadPageData( 'forupdate' );
+                       // T98706: lock the page from various other updates but avoid using
+                       // WikiPage::READ_LOCKING as that will carry over the FOR UPDATE to
+                       // the revisions queries (which also JOIN on user). Only lock the page
+                       // row and CAS check on page_latest to see if the trx snapshot matches.
+                       $latest = $this->lock();
+
+                       $this->loadPageData( WikiPage::READ_LATEST );
                        $id = $this->getID();
-                       if ( $id == 0 ) {
+                       if ( $id == 0 || $this->getLatest() != $latest ) {
+                               // Page not there or trx snapshot is stale
                                $dbw->rollback( __METHOD__ );
                                $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
                                return $status;
@@ -2878,6 +2885,24 @@ class WikiPage implements Page, IDBAccessObject {
                return $status;
        }
 
+       /**
+        * Lock the page row for this title and return page_latest (or 0)
+        *
+        * @return integer
+        */
+       protected function lock() {
+               return (int)wfGetDB( DB_MASTER )->selectField(
+                       'page',
+                       'page_latest',
+                       array(
+                               'page_namespace' => $this->getTitle()->getNamespace(),
+                               'page_title' => $this->getTitle()->getDBkey()
+                       ),
+                       __METHOD__,
+                       array( 'FOR UPDATE' )
+               );
+       }
+
        /**
         * Do some database updates after deletion
         *
index d446ccf..e29ee88 100644 (file)
@@ -40,13 +40,10 @@ class MWTidyWrapper {
         */
        protected $mTokens;
 
-       protected $mUniqPrefix;
-
        protected $mMarkerIndex;
 
        public function __construct() {
                $this->mTokens = null;
-               $this->mUniqPrefix = null;
        }
 
        /**
@@ -55,8 +52,6 @@ class MWTidyWrapper {
         */
        public function getWrapped( $text ) {
                $this->mTokens = new ReplacementArray;
-               $this->mUniqPrefix = "\x7fUNIQ" .
-                       dechex( mt_rand( 0, 0x7fffffff ) ) . dechex( mt_rand( 0, 0x7fffffff ) );
                $this->mMarkerIndex = 0;
 
                // Replace <mw:editsection> elements with placeholders
@@ -86,7 +81,7 @@ class MWTidyWrapper {
         * @return string
         */
        public function replaceCallback( $m ) {
-               $marker = "{$this->mUniqPrefix}-item-{$this->mMarkerIndex}" . Parser::MARKER_SUFFIX;
+               $marker = Parser::MARKER_PREFIX . "-item-{$this->mMarkerIndex}" . Parser::MARKER_SUFFIX;
                $this->mMarkerIndex++;
                $this->mTokens->setPair( $marker, $m[0] );
                return $marker;
index 4ea68fc..928c3a8 100644 (file)
@@ -114,8 +114,20 @@ class Parser {
        const OT_MSG = 3;
        const OT_PLAIN = 4; # like extractSections() - portions of the original are returned unchanged.
 
-       # Marker Suffix needs to be accessible staticly.
+       /**
+        * @var string Prefix and suffix for temporary replacement strings
+        * for the multipass parser.
+        *
+        * \x7f should never appear in input as it's disallowed in XML.
+        * Using it at the front also gives us a little extra robustness
+        * since it shouldn't match when butted up against identifier-like
+        * string constructs.
+        *
+        * Must not consist of all title characters, or else it will change
+        * the behavior of <nowiki> in a link.
+        */
        const MARKER_SUFFIX = "-QINU\x7f";
+       const MARKER_PREFIX = "\x7fUNIQ-";
 
        # Markers used for wrapping the table of contents
        const TOC_START = '<mw:toc>';
@@ -206,9 +218,10 @@ class Parser {
        public $mInputSize = false; # For {{PAGESIZE}} on current page.
 
        /**
-        * @var string
-        */
-       public $mUniqPrefix;
+        * @var string Deprecated accessor for the strip marker prefix.
+        * @deprecated since 1.26; use Parser::MARKER_PREFIX instead.
+        **/
+       public $mUniqPrefix = Parser::MARKER_PREFIX;
 
        /**
         * @var array Array with the language name of each language link (i.e. the
@@ -336,18 +349,7 @@ class Parser {
                $this->mLangLinkLanguages = array();
                $this->currentRevisionCache = null;
 
-               /**
-                * Prefix for temporary replacement strings for the multipass parser.
-                * \x07 should never appear in input as it's disallowed in XML.
-                * Using it at the front also gives us a little extra robustness
-                * since it shouldn't match when butted up against identifier-like
-                * string constructs.
-                *
-                * Must not consist of all title characters, or else it will change
-                * the behavior of <nowiki> in a link.
-                */
-               $this->mUniqPrefix = "\x7fUNIQ" . self::getRandomString();
-               $this->mStripState = new StripState( $this->mUniqPrefix );
+               $this->mStripState = new StripState;
 
                # Clear these on every parse, bug 4549
                $this->mTplRedirCache = $this->mTplDomCache = array();
@@ -399,6 +401,9 @@ class Parser {
                global $wgShowHostnames;
 
                if ( $clearState ) {
+                       // We use U+007F DELETE to construct strip markers, so we have to make
+                       // sure that this character does not occur in the input text.
+                       $text = strtr( $text, "\x7f", "?" );
                        $magicScopeVariable = $this->lock();
                }
 
@@ -410,11 +415,6 @@ class Parser {
                        $this->mOutput->resetParseStartTime();
                }
 
-               # Remove the strip marker tag prefix from the input, if present.
-               if ( $clearState ) {
-                       $text = str_replace( $this->mUniqPrefix, '', $text );
-               }
-
                $oldRevisionId = $this->mRevisionId;
                $oldRevisionObject = $this->mRevisionObject;
                $oldRevisionTimestamp = $this->mRevisionTimestamp;
@@ -686,8 +686,10 @@ class Parser {
         * Get a random string
         *
         * @return string
+        * @deprecated since 1.26; use wfRandomString() instead.
         */
        public static function getRandomString() {
+               wfDeprecated( __METHOD__, '1.26' );
                return wfRandomString( 16 );
        }
 
@@ -705,18 +707,11 @@ class Parser {
         * Accessor for mUniqPrefix.
         *
         * @return string
+        * @deprecated since 1.26; use Parser::MARKER_PREFIX instead.
         */
        public function uniqPrefix() {
-               if ( !isset( $this->mUniqPrefix ) ) {
-                       # @todo FIXME: This is probably *horribly wrong*
-                       # LanguageConverter seems to want $wgParser's uniqPrefix, however
-                       # if this is called for a parser cache hit, the parser may not
-                       # have ever been initialized in the first place.
-                       # Not really sure what the heck is supposed to be going on here.
-                       return '';
-                       # throw new MWException( "Accessing uninitialized mUniqPrefix" );
-               }
-               return $this->mUniqPrefix;
+               wfDeprecated( __METHOD__, '1.26' );
+               return self::MARKER_PREFIX;
        }
 
        /**
@@ -907,10 +902,14 @@ class Parser {
         * @param array $elements List of element names. Comments are always extracted.
         * @param string $text Source text string.
         * @param array $matches Out parameter, Array: extracted tags
-        * @param string $uniq_prefix
+        * @param string|null $uniq_prefix
         * @return string Stripped text
+        * @since 1.26 The uniq_prefix argument is deprecated.
         */
-       public static function extractTagsAndParams( $elements, $text, &$matches, $uniq_prefix = '' ) {
+       public static function extractTagsAndParams( $elements, $text, &$matches, $uniq_prefix = null ) {
+               if ( $uniq_prefix !== null ) {
+                       wfDeprecated( __METHOD__ . ' called with $prefix argument', '1.26' );
+               }
                static $n = 1;
                $stripped = '';
                $matches = array();
@@ -938,7 +937,7 @@ class Parser {
                                $inside = $p[4];
                        }
 
-                       $marker = "$uniq_prefix-$element-" . sprintf( '%08X', $n++ ) . self::MARKER_SUFFIX;
+                       $marker = self::MARKER_PREFIX . "-$element-" . sprintf( '%08X', $n++ ) . self::MARKER_SUFFIX;
                        $stripped .= $marker;
 
                        if ( $close === '/>' ) {
@@ -991,10 +990,10 @@ class Parser {
         * @return string
         */
        public function insertStripItem( $text ) {
-               $rnd = "{$this->mUniqPrefix}-item-{$this->mMarkerIndex}-" . self::MARKER_SUFFIX;
+               $marker = self::MARKER_PREFIX . "-item-{$this->mMarkerIndex}-" . self::MARKER_SUFFIX;
                $this->mMarkerIndex++;
-               $this->mStripState->addGeneral( $rnd, $text );
-               return $rnd;
+               $this->mStripState->addGeneral( $marker, $text );
+               return $marker;
        }
 
        /**
@@ -1257,7 +1256,7 @@ class Parser {
 
                # replaceInternalLinks may sometimes leave behind
                # absolute URLs, which have to be masked to hide them from replaceExternalLinks
-               $text = str_replace( $this->mUniqPrefix . 'NOPARSE', '', $text );
+               $text = str_replace( self::MARKER_PREFIX . 'NOPARSE', '', $text );
 
                $text = $this->doMagicLinks( $text );
                $text = $this->formatHeadings( $text, $origText, $isMain );
@@ -2355,7 +2354,7 @@ class Parser {
         */
        public function armorLinks( $text ) {
                return preg_replace( '/\b((?i)' . $this->mUrlProtocols . ')/',
-                       "{$this->mUniqPrefix}NOPARSE$1", $text );
+                       self::MARKER_PREFIX . "NOPARSE$1", $text );
        }
 
        /**
@@ -2627,7 +2626,7 @@ class Parser {
                                $closematch = preg_match(
                                        '/(?:<\\/table|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|'
                                                . '<td|<th|<\\/?blockquote|<\\/?div|<hr|<\\/pre|<\\/p|<\\/mw:|'
-                                               . $this->mUniqPrefix
+                                               . self::MARKER_PREFIX
                                                . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS',
                                        $t
                                );
@@ -3896,7 +3895,11 @@ class Parser {
                // Defaults to Parser::statelessFetchTemplate()
                $templateCb = $this->mOptions->getTemplateCallback();
                $stuff = call_user_func( $templateCb, $title, $this );
+               // We use U+007F DELETE to distinguish strip markers from regular text.
                $text = $stuff['text'];
+               if ( is_string( $stuff['text'] ) ) {
+                       $text = strtr( $text, "\x7f", "?" );
+               }
                $finalTitle = isset( $stuff['finalTitle'] ) ? $stuff['finalTitle'] : $title;
                if ( isset( $stuff['deps'] ) ) {
                        foreach ( $stuff['deps'] as $dep ) {
@@ -4190,7 +4193,7 @@ class Parser {
                $name = $frame->expand( $params['name'] );
                $attrText = !isset( $params['attr'] ) ? null : $frame->expand( $params['attr'] );
                $content = !isset( $params['inner'] ) ? null : $frame->expand( $params['inner'] );
-               $marker = "{$this->mUniqPrefix}-$name-"
+               $marker = self::MARKER_PREFIX . "-$name-"
                        . sprintf( '%08X', $this->mMarkerIndex++ ) . self::MARKER_SUFFIX;
 
                $isFunctionTag = isset( $this->mFunctionTagHooks[strtolower( $name )] ) &&
@@ -4435,7 +4438,7 @@ class Parser {
                $prevlevel = 0;
                $toclevel = 0;
                $prevtoclevel = 0;
-               $markerRegex = "{$this->mUniqPrefix}-h-(\d+)-" . self::MARKER_SUFFIX;
+               $markerRegex = self::MARKER_PREFIX . "-h-(\d+)-" . self::MARKER_SUFFIX;
                $baseTitleText = $this->mTitle->getPrefixedDBkey();
                $oldType = $this->mOutputType;
                $this->setOutputType( self::OT_WIKI );
@@ -5776,7 +5779,7 @@ class Parser {
        public function replaceTransparentTags( $text ) {
                $matches = array();
                $elements = array_keys( $this->mTransparentTagHooks );
-               $text = self::extractTagsAndParams( $elements, $text, $matches, $this->mUniqPrefix );
+               $text = self::extractTagsAndParams( $elements, $text, $matches );
                $replacements = array();
 
                foreach ( $matches as $marker => $data ) {
@@ -6235,7 +6238,7 @@ class Parser {
                $i = 0;
                $out = '';
                while ( $i < strlen( $s ) ) {
-                       $markerStart = strpos( $s, $this->mUniqPrefix, $i );
+                       $markerStart = strpos( $s, self::MARKER_PREFIX, $i );
                        if ( $markerStart === false ) {
                                $out .= call_user_func( $callback, substr( $s, $i ) );
                                break;
index 174c1d6..32f5d06 100644 (file)
@@ -29,7 +29,6 @@ class ParserDiffTest
        public $parsers;
        public $conf;
        public $shortOutput = false;
-       public $dtUniqPrefix;
 
        public function __construct( $conf ) {
                if ( !isset( $conf['parsers'] ) ) {
@@ -43,12 +42,6 @@ class ParserDiffTest
                        return;
                }
 
-               global $wgHooks;
-               static $doneHook = false;
-               if ( !$doneHook ) {
-                       $doneHook = true;
-                       $wgHooks['ParserClearState'][] = array( $this, 'onClearState' );
-               }
                if ( isset( $this->conf['shortOutput'] ) ) {
                        $this->shortOutput = $this->conf['shortOutput'];
                }
@@ -126,18 +119,4 @@ class ParserDiffTest
                        $parser->setFunctionHook( $id, $callback, $flags );
                }
        }
-
-       /**
-        * @param Parser $parser
-        * @return bool
-        */
-       public function onClearState( &$parser ) {
-               // hack marker prefixes to get identical output
-               if ( !isset( $this->dtUniqPrefix ) ) {
-                       $this->dtUniqPrefix = $parser->uniqPrefix();
-               } else {
-                       $parser->mUniqPrefix = $this->dtUniqPrefix;
-               }
-               return true;
-       }
 }
index caef648..ff34d9b 100644 (file)
@@ -853,7 +853,8 @@ class PPDStackElement {
                $close,             // Matching closing character
                $count,             // Number of opening characters found (number of "=" for heading)
                $parts,             // Array of PPDPart objects describing pipe-separated parts.
-               $lineStart;         // True if the open char appeared at the start of the input line. Not set for headings.
+               $lineStart;         // True if the open char appeared at the start of the input line.
+                                   // Not set for headings.
 
        public $partClass = 'PPDPart';
 
@@ -1271,7 +1272,7 @@ class PPFrame_DOM implements PPFrame {
                                                $titleText = $this->title->getPrefixedDBkey();
                                                $this->parser->mHeadings[] = array( $titleText, $headingIndex );
                                                $serial = count( $this->parser->mHeadings ) - 1;
-                                               $marker = "{$this->parser->mUniqPrefix}-h-$serial-" . Parser::MARKER_SUFFIX;
+                                               $marker = Parser::MARKER_PREFIX . "-h-$serial-" . Parser::MARKER_SUFFIX;
                                                $count = $contextNode->getAttribute( 'level' );
                                                $s = substr( $s, 0, $count ) . $marker . substr( $s, $count );
                                                $this->parser->mStripState->addGeneral( $marker, '' );
index d32fb57..308ef44 100644 (file)
@@ -112,7 +112,6 @@ class Preprocessor_Hash implements Preprocessor {
         * @return PPNode_Hash_Tree
         */
        public function preprocessToObj( $text, $flags = 0 ) {
-
                // Check cache.
                global $wgMemc, $wgPreprocessorCacheThreshold;
 
@@ -1185,7 +1184,7 @@ class PPFrame_Hash implements PPFrame {
                                                $titleText = $this->title->getPrefixedDBkey();
                                                $this->parser->mHeadings[] = array( $titleText, $bits['i'] );
                                                $serial = count( $this->parser->mHeadings ) - 1;
-                                               $marker = "{$this->parser->mUniqPrefix}-h-$serial-" . Parser::MARKER_SUFFIX;
+                                               $marker = Parser::MARKER_PREFIX . "-h-$serial-" . Parser::MARKER_SUFFIX;
                                                $s = substr( $s, 0, $bits['level'] ) . $marker . substr( $s, $bits['level'] );
                                                $this->parser->mStripState->addGeneral( $marker, '' );
                                                $out .= $s;
index 7e38acc..b11dc8c 100644 (file)
@@ -37,15 +37,20 @@ class StripState {
        const UNSTRIP_RECURSION_LIMIT = 20;
 
        /**
-        * @param string $prefix
+        * @param string|null $prefix
+        * @since 1.26 The prefix argument should be omitted, as the strip marker
+        *  prefix string is now a constant.
         */
-       public function __construct( $prefix ) {
-               $this->prefix = $prefix;
+       public function __construct( $prefix = null ) {
+               if ( $prefix !== null ) {
+                       wfDeprecated( __METHOD__ . ' with called with $prefix argument' .
+                               ' (call with no arguments instead)', '1.26' );
+               }
                $this->data = array(
                        'nowiki' => array(),
                        'general' => array()
                );
-               $this->regex = "/{$this->prefix}([^\x7f]+)" . Parser::MARKER_SUFFIX . '/';
+               $this->regex = '/' . Parser::MARKER_PREFIX . "([^\x7f]+)" . Parser::MARKER_SUFFIX . '/';
                $this->circularRefGuard = array();
        }
 
@@ -166,10 +171,10 @@ class StripState {
         * @return StripState
         */
        public function getSubState( $text ) {
-               $subState = new StripState( $this->prefix );
+               $subState = new StripState();
                $pos = 0;
                while ( true ) {
-                       $startPos = strpos( $text, $this->prefix, $pos );
+                       $startPos = strpos( $text, Parser::MARKER_PREFIX, $pos );
                        $endPos = strpos( $text, Parser::MARKER_SUFFIX, $pos );
                        if ( $startPos === false || $endPos === false ) {
                                break;
@@ -202,7 +207,7 @@ class StripState {
         * @return array
         */
        public function merge( $otherState, $texts ) {
-               $mergePrefix = Parser::getRandomString();
+               $mergePrefix = wfRandomString( 16 );
 
                foreach ( $otherState->data as $type => $items ) {
                        foreach ( $items as $key => $value ) {
@@ -222,7 +227,7 @@ class StripState {
         */
        protected function mergeCallback( $m ) {
                $key = $m[1];
-               return "{$this->prefix}{$this->tempMergePrefix}-$key" . Parser::MARKER_SUFFIX;
+               return Parser::MARKER_PREFIX . $this->tempMergePrefix . '-' . $key . Parser::MARKER_SUFFIX;
        }
 
        /**
index dbf80fa..9983fec 100644 (file)
@@ -230,6 +230,21 @@ abstract class Profiler {
                }
        }
 
+       /**
+        * Output current data to the page output if configured to do so
+        *
+        * @throws MWException
+        * @since 1.26
+        */
+       public function logDataPageOutputOnly() {
+               foreach ( $this->getOutputs() as $output ) {
+                       if ( $output instanceof ProfilerOutputText ) {
+                               $stats = $this->getFunctionStats();
+                               $output->log( $stats );
+                       }
+               }
+       }
+
        /**
         * Get the content type sent out to the client.
         * Used for profilers that output instead of store data.
index 244b4e4..3fe9cdd 100644 (file)
@@ -46,4 +46,7 @@ class ProfilerStub extends Profiler {
 
        public function logData() {
        }
+
+       public function logDataPageOutputOnly() {
+       }
 }
index 1c36407..e46c753 100644 (file)
@@ -126,7 +126,6 @@ class ExtensionRegistry {
         * @throws Exception
         */
        public function readFromQueue( array $queue ) {
-               $data = array( 'globals' => array( 'wgAutoloadClasses' => array() ) );
                $autoloadClasses = array();
                $processor = new ExtensionProcessor();
                foreach ( $queue as $path => $mtime ) {
index b8a0acf..5a9465e 100644 (file)
@@ -247,6 +247,7 @@ class ResourceLoader {
 
                // Register core modules
                $this->register( include "$IP/resources/Resources.php" );
+               $this->register( include "$IP/resources/ResourcesOOUI.php" );
                // Register extension modules
                Hooks::run( 'ResourceLoaderRegisterModules', array( &$this ) );
                $this->register( $config->get( 'ResourceModules' ) );
index eaff4ab..f695b11 100644 (file)
@@ -28,7 +28,7 @@
  */
 class ResourceLoaderImageModule extends ResourceLoaderModule {
 
-       private $definition = null;
+       protected $definition = null;
 
        /**
         * Local base path, see __construct()
@@ -73,21 +73,27 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
         *         'selectorWithVariant' => [CSS selector template, variables: {prefix} {name} {variant}],
         *         // List of variants that may be used for the image files
         *         'variants' => array(
+        *             [theme name] => array(
         *                 [variant name] => array(
         *                     'color' => [color string, e.g. '#ffff00'],
         *                     'global' => [boolean, if true, this variant is available
         *                                  for all images of this type],
         *                 ),
+        *                 ...
+        *             ),
         *             ...
         *         ),
         *         // List of image files and their options
         *         'images' => array(
+        *             [theme name] => array(
         *                 [file path string],
         *                 [file path string] => array(
         *                     'name' => [image name string, defaults to file name],
         *                     'variants' => [array of variant name strings, variants
         *                                    available for this image],
         *                 ),
+        *                 ...
+        *             ),
         *             ...
         *         ),
         *     )
@@ -103,7 +109,7 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
        /**
         * Parse definition and external JSON data, if referenced.
         */
-       private function loadFromDefinition() {
+       protected function loadFromDefinition() {
                if ( $this->definition === null ) {
                        return;
                }
@@ -151,6 +157,17 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                                                        "Invalid list error. '$option' given, array expected."
                                                );
                                        }
+                                       if ( !isset( $option['default'] ) ) {
+                                               // Backwards compatibility
+                                               $option = array( 'default' => $option );
+                                       }
+                                       foreach ( $option as $skin => $data ) {
+                                               if ( !is_array( $option ) ) {
+                                                       throw new InvalidArgumentException(
+                                                               "Invalid list error. '$option' given, array expected."
+                                                       );
+                                               }
+                                       }
                                        $this->{$member} = $option;
                                        break;
 
@@ -194,9 +211,9 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
         * @param string $name Image name
         * @return ResourceLoaderImage|null
         */
-       public function getImage( $name ) {
+       public function getImage( $name, ResourceLoaderContext $context ) {
                $this->loadFromDefinition();
-               $images = $this->getImages();
+               $images = $this->getImages( $context );
                return isset( $images[$name] ) ? $images[$name] : null;
        }
 
@@ -204,21 +221,29 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
         * Get ResourceLoaderImage objects for all images.
         * @return ResourceLoaderImage[] Array keyed by image name
         */
-       public function getImages() {
+       public function getImages( ResourceLoaderContext $context ) {
+               $skin = $context->getSkin();
                if ( !isset( $this->imageObjects ) ) {
                        $this->loadFromDefinition();
                        $this->imageObjects = array();
-
-                       foreach ( $this->images as $name => $options ) {
+               }
+               if ( !isset( $this->imageObjects[ $skin ] ) ) {
+                       $this->imageObjects[ $skin ] = array();
+                       if ( !isset( $this->images[ $skin ] ) ) {
+                               $this->images[ $skin ] = isset( $this->images[ 'default' ] ) ?
+                                       $this->images[ 'default' ] :
+                                       array();
+                       }
+                       foreach ( $this->images[ $skin ] as $name => $options ) {
                                $fileDescriptor = is_string( $options ) ? $options : $options['file'];
 
                                $allowedVariants = array_merge(
                                        is_array( $options ) && isset( $options['variants'] ) ? $options['variants'] : array(),
-                                       $this->getGlobalVariants()
+                                       $this->getGlobalVariants( $context )
                                );
-                               if ( isset( $this->variants ) ) {
+                               if ( isset( $this->variants[ $skin ] ) ) {
                                        $variantConfig = array_intersect_key(
-                                               $this->variants,
+                                               $this->variants[ $skin ],
                                                array_fill_keys( $allowedVariants, true )
                                        );
                                } else {
@@ -232,11 +257,11 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                                        $this->localBasePath,
                                        $variantConfig
                                );
-                               $this->imageObjects[ $image->getName() ] = $image;
+                               $this->imageObjects[ $skin ][ $image->getName() ] = $image;
                        }
                }
 
-               return $this->imageObjects;
+               return $this->imageObjects[ $skin ];
        }
 
        /**
@@ -244,21 +269,27 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
         * for every image regardless of image options.
         * @return string[]
         */
-       public function getGlobalVariants() {
+       public function getGlobalVariants( ResourceLoaderContext $context ) {
+               $skin = $context->getSkin();
                if ( !isset( $this->globalVariants ) ) {
                        $this->loadFromDefinition();
                        $this->globalVariants = array();
-
-                       if ( isset( $this->variants ) ) {
-                               foreach ( $this->variants as $name => $config ) {
-                                       if ( isset( $config['global'] ) && $config['global'] ) {
-                                               $this->globalVariants[] = $name;
-                                       }
+               }
+               if ( !isset( $this->globalVariants[ $skin ] ) ) {
+                       $this->globalVariants[ $skin ] = array();
+                       if ( !isset( $this->variants[ $skin ] ) ) {
+                               $this->variants[ $skin ] = isset( $this->variants[ 'default' ] ) ?
+                                       $this->variants[ 'default' ] :
+                                       array();
+                       }
+                       foreach ( $this->variants[ $skin ] as $name => $config ) {
+                               if ( isset( $config['global'] ) && $config['global'] ) {
+                                       $this->globalVariants[ $skin ][] = $name;
                                }
                        }
                }
 
-               return $this->globalVariants;
+               return $this->globalVariants[ $skin ];
        }
 
        /**
@@ -273,7 +304,7 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                $script = $context->getResourceLoader()->getLoadScript( $this->getSource() );
                $selectors = $this->getSelectors();
 
-               foreach ( $this->getImages() as $name => $image ) {
+               foreach ( $this->getImages( $context ) as $name => $image ) {
                        $declarations = $this->getCssDeclarations(
                                $image->getDataUri( $context, null, 'original' ),
                                $image->getUrl( $context, $script, null, 'rasterized' )
@@ -371,7 +402,7 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
        public function getModifiedTime( ResourceLoaderContext $context ) {
                $this->loadFromDefinition();
                $files = array();
-               foreach ( $this->getImages() as $name => $image ) {
+               foreach ( $this->getImages( $context ) as $name => $image ) {
                        $files[] = $image->getPath( $context );
                }
 
diff --git a/includes/resourceloader/ResourceLoaderOOUIImageModule.php b/includes/resourceloader/ResourceLoaderOOUIImageModule.php
new file mode 100644 (file)
index 0000000..6d76493
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Secret special sauce.
+ *
+ * @since 1.26
+ */
+class ResourceLoaderOOUIImageModule extends ResourceLoaderImageModule {
+       protected function loadFromDefinition() {
+               if ( $this->definition === null ) {
+                       return;
+               }
+
+               // Core default themes
+               $themes = array( 'default' => 'mediawiki' );
+               $themes += ExtensionRegistry::getInstance()->getAttribute( 'SkinOOUIThemes' );
+
+               $name = $this->definition['name'];
+               $rootPath = $this->definition['rootPath'];
+
+               $definition = array();
+               foreach ( $themes as $skin => $theme ) {
+                       // TODO Allow extensions to specify this path somehow
+                       $dataPath = $this->localBasePath . '/' . $rootPath . '/' . $theme . '/' . $name . '.json';
+
+                       if ( file_exists( $dataPath ) ) {
+                               $data = json_decode( file_get_contents( $dataPath ), true );
+                               array_walk_recursive( $data['images'], function ( &$path ) use ( $rootPath, $theme ) {
+                                       // TODO Allow extensions to specify this path somehow
+                                       $path = $rootPath . '/' . $theme . '/' . $path;
+                               } );
+                       } else {
+                               $data = array();
+                       }
+
+                       foreach ( $data as $key => $value ) {
+                               switch ( $key ) {
+                                       case 'images':
+                                       case 'variants':
+                                               $definition[$key][$skin] = $data[$key];
+                                               break;
+
+                                       default:
+                                               if ( !isset( $definition[$key] ) ) {
+                                                       $definition[$key] = $data[$key];
+                                               } elseif ( $definition[$key] !== $data[$key] ) {
+                                                       throw new Exception( "Mismatched OOUI theme definitions are not supported: trying to load $key of $theme theme" );
+                                               }
+                                               break;
+                               }
+                       }
+               }
+
+               // Fields from definition silently override keys from JSON files
+               $this->definition += $definition;
+
+               parent::loadFromDefinition();
+       }
+}
index 4d207f6..74ad774 100644 (file)
@@ -30,6 +30,8 @@
  * Title::isCssJsSubpage.
  */
 class ResourceLoaderWikiModule extends ResourceLoaderModule {
+       /** @var string Position on the page to load this module at */
+       protected $position = 'bottom';
 
        // Origin defaults to users with sitewide authority
        protected $origin = self::ORIGIN_USER_SITEWIDE;
@@ -50,14 +52,21 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
         * @param array $options For back-compat, this can be omitted in favour of overwriting getPages.
         */
        public function __construct( array $options = null ) {
-               if ( isset( $options['styles'] ) ) {
-                       $this->styles = $options['styles'];
+               if ( is_null( $options ) ) {
+                       return;
                }
-               if ( isset( $options['scripts'] ) ) {
-                       $this->scripts = $options['scripts'];
-               }
-               if ( isset( $options['group'] ) ) {
-                       $this->group = $options['group'];
+
+               foreach ( $options as $member => $option ) {
+                       switch ( $member ) {
+                               case 'position':
+                                       $this->isPositionDefined = true;
+                                       // Don't break since we need the member set as well
+                               case 'styles':
+                               case 'scripts':
+                               case 'group':
+                                       $this->{$member} = $option;
+                                       break;
+                       }
                }
        }
 
@@ -305,4 +314,8 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                }
                return $this->titleInfo[$hash];
        }
+
+       public function getPosition() {
+               return $this->position;
+       }
 }
index ebdbf3a..dba368d 100644 (file)
@@ -36,6 +36,8 @@ abstract class RevDelItem extends RevisionItemBase {
 
        /**
         * Get the current deletion bitfield value
+        *
+        * @return integer
         */
        abstract public function getBits();
 
index 1ce9691..837557c 100644 (file)
@@ -78,7 +78,7 @@ abstract class RevDelList extends RevisionListBase {
         * transactions are done here.
         *
         * @param array $params Associative array of parameters. Members are:
-        *     value:         The integer value to set the visibility to
+        *     value:         ExtractBitParams() bitfield array
         *     comment:       The log comment.
         *     perItemStatus: Set if you want per-item status reports
         * @return Status
@@ -109,6 +109,7 @@ abstract class RevDelList extends RevisionListBase {
                // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
                for ( $this->reset(); $this->current(); $this->next() ) {
                        // @codingStandardsIgnoreEnd
+                       /** @var $item RevDelItem */
                        $item = $this->current();
                        unset( $missing[$item->getId()] );
 
@@ -200,6 +201,7 @@ abstract class RevDelList extends RevisionListBase {
                }
 
                // Log it
+               // @FIXME: $newBits/$oldBits set in for loop, makes IDE warnings too
                $this->updateLog( array(
                        'title' => $this->title,
                        'count' => $successCount,
index 5c83107..65b0309 100644 (file)
@@ -48,7 +48,7 @@ class RevDelLogItem extends RevDelItem {
        }
 
        public function getBits() {
-               return $this->row->log_deleted;
+               return (int)$this->row->log_deleted;
        }
 
        public function setBits( $bits ) {
index ba1f0f6..db2bc6a 100644 (file)
@@ -233,9 +233,9 @@ class RevisionDeleter {
         * @since 1.22
         * @param array $bitPars ExtractBitParams() params
         * @param int $oldfield Current bitfield
-        * @return array
+        * @return integer
         */
-       public static function extractBitfield( $bitPars, $oldfield ) {
+       public static function extractBitfield( array $bitPars, $oldfield ) {
                // Build the actual new rev_deleted bitfield
                $newBits = 0;
                foreach ( $bitPars as $const => $val ) {
index 6b918e9..a2304e3 100644 (file)
@@ -38,6 +38,7 @@ class SpecialContributions extends IncludableSpecialPage {
                $this->outputHeader();
                $out = $this->getOutput();
                $out->addModuleStyles( 'mediawiki.special' );
+               $this->addHelpLink( 'Help:User contributions' );
 
                $this->opts = array();
                $request = $this->getRequest();
index c30d962..dfc7cdd 100644 (file)
@@ -295,6 +295,7 @@ class SpecialExport extends SpecialPage {
                $form .= Xml::closeElement( 'form' );
 
                $out->addHTML( $form );
+               $this->addHelpLink( 'Help:Export' );
        }
 
        /**
index 8124f10..f9b8ac3 100644 (file)
@@ -303,6 +303,7 @@ class SpecialImport extends SpecialPage {
                $action = $this->getPageTitle()->getLocalURL( array( 'action' => 'submit' ) );
                $user = $this->getUser();
                $out = $this->getOutput();
+               $this->addHelpLink( '//meta.wikimedia.org/wiki/Special:MyLanguage/Help:Import', true );
                $importSources = $this->getConfig()->get( 'ImportSources' );
 
                if ( $user->isAllowed( 'importupload' ) ) {
index f5218ac..7ffaf48 100644 (file)
@@ -155,6 +155,7 @@ class LinkSearchPage extends QueryPage {
                $htmlForm->setAction( wfScript() );
                $htmlForm->setMethod( 'get' );
                $htmlForm->prepareForm()->displayForm( false );
+               $this->addHelpLink( 'Help:Linksearch' );
 
                if ( $target != '' ) {
                        $this->setParams( array(
index b62de5d..8f14a41 100644 (file)
@@ -111,7 +111,11 @@ class MediaStatisticsPage extends QueryPage {
        protected function outputResults( $out, $skin, $dbr, $res, $num, $offset ) {
                $prevMediaType = null;
                foreach ( $res as $row ) {
-                       list( $mediaType, $mime, $totalCount, $totalBytes ) = $this->splitFakeTitle( $row->title );
+                       $mediaStats = $this->splitFakeTitle( $row->title );
+                       if ( count( $mediaStats ) < 4 ) {
+                               continue;
+                       }
+                       list( $mediaType, $mime, $totalCount, $totalBytes ) = $mediaStats;
                        if ( $prevMediaType !== $mediaType ) {
                                if ( $prevMediaType !== null ) {
                                        // We're not at beginning, so we have to
index 7dc1158..96d512c 100644 (file)
@@ -57,6 +57,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        return;
                }
 
+               $this->addHelpLink(
+                       '//meta.wikimedia.org/wiki/Special:MyLanguage/Help:Recent_changes',
+                       true
+               );
                parent::execute( $subpage );
        }
 
index 3ad9f0f..3c403fe 100644 (file)
@@ -244,6 +244,7 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                        Xml::check( 'showlinkedto', $opts['showlinkedto'], array( 'id' => 'showlinkedto' ) ) . ' ' .
                        Xml::label( $this->msg( 'recentchangeslinked-to' )->text(), 'showlinkedto' ) );
 
+               $this->addHelpLink( 'Help:Related changes' );
                return $extraOpts;
        }
 
index 21867b5..5bd3a29 100644 (file)
@@ -585,7 +585,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        throw new PermissionsError( 'suppressrevision' );
                }
                # If the save went through, go to success message...
-               $status = $this->save( $bitParams, $comment, $this->targetObj );
+               $status = $this->save( $bitParams, $comment );
                if ( $status->isGood() ) {
                        $this->success();
 
@@ -651,14 +651,13 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 
        /**
         * Do the write operations. Simple wrapper for RevDel*List::setVisibility().
-        * @param int $bitfield
+        * @param array $bitPars ExtractBitParams() bitfield array
         * @param string $reason
-        * @param Title $title
         * @return Status
         */
-       protected function save( $bitfield, $reason, $title ) {
+       protected function save( array $bitPars, $reason ) {
                return $this->getList()->setVisibility(
-                       array( 'value' => $bitfield, 'comment' => $reason )
+                       array( 'value' => $bitPars, 'comment' => $reason )
                );
        }
 
index f2362a1..8a66273 100644 (file)
@@ -756,7 +756,7 @@ class SpecialUndelete extends SpecialPage {
         * @param User $user
         * @return bool
         */
-       private function isAllowed( $permission, User $user = null ) {
+       protected function isAllowed( $permission, User $user = null ) {
                $user = $user ? : $this->getUser();
                if ( $this->mTargetObj !== null ) {
                        return $this->mTargetObj->userCan( $permission, $user );
@@ -1206,7 +1206,7 @@ class SpecialUndelete extends SpecialPage {
                $repo->streamFile( $path );
        }
 
-       private function showHistory() {
+       protected function showHistory() {
                $out = $this->getOutput();
                if ( $this->mAllowed ) {
                        $out->addModules( 'mediawiki.special.undelete' );
@@ -1377,7 +1377,7 @@ class SpecialUndelete extends SpecialPage {
                return true;
        }
 
-       private function formatRevisionRow( $row, $earliestLiveTime, $remaining ) {
+       protected function formatRevisionRow( $row, $earliestLiveTime, $remaining ) {
                $rev = Revision::newFromArchiveRow( $row,
                        array(
                                'title' => $this->mTargetObj
index df9d363..20f5776 100644 (file)
@@ -43,6 +43,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
 
                $output = $this->getOutput();
                $request = $this->getRequest();
+               $this->addHelpLink( 'Help:Watching pages' );
 
                $mode = SpecialEditWatchlist::getMode( $request, $subpage );
                if ( $mode !== false ) {
index 0b3175a..be77e62 100644 (file)
@@ -46,6 +46,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
 
                $this->setHeaders();
                $this->outputHeader();
+               $this->addHelpLink( 'Help:What links here' );
 
                $opts = new FormOptions();
 
index df91588..d7c19ef 100644 (file)
@@ -746,11 +746,11 @@ abstract class UploadBase {
                $file = $this->getLocalFile();
 
                foreach ( $sizes as $size ) {
-                       if ( $file->isVectorized()
-                               || $file->getWidth() > $size ) {
-                                       $jobs[] = new ThumbnailRenderJob( $file->getTitle(), array(
-                                               'transformParams' => array( 'width' => $size ),
-                                       ) );
+                       if ( $file->isVectorized() || $file->getWidth() > $size ) {
+                               $jobs[] = new ThumbnailRenderJob(
+                                       $file->getTitle(),
+                                       array( 'transformParams' => array( 'width' => $size ) )
+                               );
                        }
                }
 
diff --git a/includes/utils/MWFunction.php b/includes/utils/MWFunction.php
deleted file mode 100644 (file)
index fa7eebe..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
- * Helper methods to call functions and instance objects.
- *
- * 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
- */
-
-class MWFunction {
-
-       /**
-        * @param string $class
-        * @param array $args
-        * @return object
-        * @deprecated 1.25 Use ObjectFactory::getObjectFromSpec() instead
-        */
-       public static function newObj( $class, $args = array() ) {
-               wfDeprecated( __METHOD__, '1.25' );
-
-               return ObjectFactory::getObjectFromSpec( array(
-                       'class' => $class,
-                       'args' => $args,
-                       'closure_expansion' => false,
-               ) );
-       }
-}
index ae723e9..58d1ee6 100644 (file)
@@ -19,6 +19,7 @@
                "resources/src/mediawiki.page",
                "resources/src/mediawiki.special",
                "resources/src/mediawiki.toolbar",
+               "resources/src/mediawiki.widgets",
                "resources/src/jquery/jquery.accessKeyLabel.js",
                "resources/src/jquery/jquery.arrowSteps.js",
                "resources/src/jquery/jquery.autoEllipsis.js",
index e1a2047..d19dc25 100644 (file)
@@ -2034,7 +2034,18 @@ class Language {
                static $table = array(
                        array( '', 'א', 'ב', 'ג', 'ד', 'ה', 'ו', 'ז', 'ח', 'ט', 'י' ),
                        array( '', 'י', 'כ', 'ל', 'מ', 'נ', 'ס', 'ע', 'פ', 'צ', 'ק' ),
-                       array( '', 'ק', 'ר', 'ש', 'ת', 'תק', 'תר', 'תש', 'תת', 'תתק', 'תתר' ),
+                       array( '',
+                               array( 'ק' ),
+                               array( 'ר' ),
+                               array( 'ש' ),
+                               array( 'ת' ),
+                               array( 'ת', 'ק' ),
+                               array( 'ת', 'ר' ),
+                               array( 'ת', 'ש' ),
+                               array( 'ת', 'ת' ),
+                               array( 'ת', 'ת', 'ק' ),
+                               array( 'ת', 'ת', 'ר' ),
+                       ),
                        array( '', 'א', 'ב', 'ג', 'ד', 'ה', 'ו', 'ז', 'ח', 'ט', 'י' )
                );
 
@@ -2043,47 +2054,59 @@ class Language {
                        return $num;
                }
 
-               $s = '';
+               // Round thousands have special notations
+               if ( $num === 1000 ) {
+                       return "א' אלף";
+               } elseif ( $num % 1000 === 0 ) {
+                       return $table[0][$num / 1000] . "' אלפים";
+               }
+
+               $letters = array();
+
                for ( $pow10 = 1000, $i = 3; $i >= 0; $pow10 /= 10, $i-- ) {
                        if ( $num >= $pow10 ) {
-                               if ( $num == 15 || $num == 16 ) {
-                                       $s .= $table[0][9] . $table[0][$num - 9];
+                               if ( $num === 15 || $num === 16 ) {
+                                       $letters[] = $table[0][9];
+                                       $letters[] = $table[0][$num - 9];
                                        $num = 0;
                                } else {
-                                       $s .= $table[$i][intval( ( $num / $pow10 ) )];
-                                       if ( $pow10 == 1000 ) {
-                                               $s .= "'";
+                                       $letters = array_merge(
+                                               $letters,
+                                               (array)$table[$i][intval( $num / $pow10 )]
+                                       );
+
+                                       if ( $pow10 === 1000 ) {
+                                               $letters[] = "'";
                                        }
                                }
                        }
+
                        $num = $num % $pow10;
                }
-               if ( strlen( $s ) == 2 ) {
-                       $str = $s . "'";
+
+               $preTransformLength = count( $letters );
+               if ( $preTransformLength === 1 ) {
+                       // Add geresh (single quote) to one-letter numbers
+                       $letters[] = "'";
                } else {
-                       $str = substr( $s, 0, strlen( $s ) - 2 ) . '"';
-                       $str .= substr( $s, strlen( $s ) - 2, 2 );
-               }
-               $start = substr( $str, 0, strlen( $str ) - 2 );
-               $end = substr( $str, strlen( $str ) - 2 );
-               switch ( $end ) {
-                       case 'כ':
-                               $str = $start . 'ך';
-                               break;
-                       case 'מ':
-                               $str = $start . 'ם';
-                               break;
-                       case 'נ':
-                               $str = $start . 'ן';
-                               break;
-                       case 'פ':
-                               $str = $start . 'ף';
-                               break;
-                       case 'צ':
-                               $str = $start . 'ץ';
-                               break;
+                       $lastIndex = $preTransformLength - 1;
+                       $letters[$lastIndex] = str_replace(
+                               array( 'כ', 'מ', 'נ', 'פ', 'צ' ),
+                               array( 'ך', 'ם', 'ן', 'ף', 'ץ' ),
+                               $letters[$lastIndex]
+                       );
+
+                       // Add gershayim (double quote) to multiple-letter numbers,
+                       // but exclude numbers with only one letter after the thousands
+                       // (1001-1009, 1020, 1030, 2001-2009, etc.)
+                       if ( $letters[1] === "'" && $preTransformLength === 3 ) {
+                               $letters[] = "'";
+                       } else {
+                               array_splice( $letters, -1, 0, '"' );
+                       }
                }
-               return $str;
+
+               return implode( $letters );
        }
 
        /**
@@ -2462,22 +2485,56 @@ class Language {
                return $this->internalUserTimeAndDate( 'both', $ts, $user, $options );
        }
 
+       /**
+        * Get the timestamp in a human-friendly relative format, e.g., "3 days ago".
+        *
+        * Determine the difference between the timestamp and the current time, and
+        * generate a readable timestamp by returning "<N> <units> ago", where the
+        * largest possible unit is used.
+        *
+        * @since 1.26 (Prior to 1.26 method existed but was not meant to be used directly)
+        *
+        * @param MWTimestamp $time
+        * @param MWTimestamp|null $relativeTo The base timestamp to compare to (defaults to now)
+        * @param User|null $user User the timestamp is being generated for (or null to use main context's user)
+        * @return string Formatted timestamp
+        */
+       public function getHumanTimestamp( MWTimestamp $time, MWTimestamp $relativeTo = null, User $user = null ) {
+               if ( $relativeTo === null ) {
+                       $relativeTo = new MWTimestamp();
+               }
+               if ( $user === null ) {
+                       $user = RequestContext::getMain()->getUser();
+               }
+
+               // Adjust for the user's timezone.
+               $offsetThis = $time->offsetForUser( $user );
+               $offsetRel = $relativeTo->offsetForUser( $user );
+
+               $ts = '';
+               if ( Hooks::run( 'GetHumanTimestamp', array( &$ts, $time, $relativeTo, $user, $this ) ) ) {
+                       $ts = $this->getHumanTimestampInternal( $time, $relativeTo, $user );
+               }
+
+               // Reset the timezone on the objects.
+               $time->timestamp->sub( $offsetThis );
+               $relativeTo->timestamp->sub( $offsetRel );
+
+               return $ts;
+       }
+
        /**
         * Convert an MWTimestamp into a pretty human-readable timestamp using
         * the given user preferences and relative base time.
         *
-        * DO NOT USE THIS FUNCTION DIRECTLY. Instead, call MWTimestamp::getHumanTimestamp
-        * on your timestamp object, which will then call this function. Calling
-        * this function directly will cause hooks to be skipped over.
-        *
-        * @see MWTimestamp::getHumanTimestamp
+        * @see Language::getHumanTimestamp
         * @param MWTimestamp $ts Timestamp to prettify
         * @param MWTimestamp $relativeTo Base timestamp
         * @param User $user User preferences to use
         * @return string Human timestamp
-        * @since 1.22
+        * @since 1.26
         */
-       public function getHumanTimestamp( MWTimestamp $ts, MWTimestamp $relativeTo, User $user ) {
+       private function getHumanTimestampInternal( MWTimestamp $ts, MWTimestamp $relativeTo, User $user ) {
                $diff = $ts->diff( $relativeTo );
                $diffDay = (bool)( (int)$ts->timestamp->format( 'w' ) -
                        (int)$relativeTo->timestamp->format( 'w' ) );
index 844888e..a6b687c 100644 (file)
@@ -355,12 +355,7 @@ class LanguageConverter {
                   2. HTML entities
                   3. placeholders created by the parser
                */
-               global $wgParser;
-               if ( isset( $wgParser ) && $wgParser->UniqPrefix() != '' ) {
-                       $marker = '|' . $wgParser->UniqPrefix() . '[\-a-zA-Z0-9]+';
-               } else {
-                       $marker = '';
-               }
+               $marker = '|' . Parser::MARKER_PREFIX . '[\-a-zA-Z0-9]+';
 
                // this one is needed when the text is inside an HTML markup
                $htmlfix = '|<[^>]+$|^[^<>]*>';
index 6425a53..759531b 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Estonian (Eesti) specific code.
+ * Estonian (eesti) specific code.
  *
  * 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
  */
 
 /**
- * Estonian (Eesti)
+ * Estonian (eesti)
  *
  * @ingroup Language
  */
 class LanguageEt extends Language {
        /**
-        * Avoid grouping whole numbers between 0 to 9999
-        *
+        * Avoid grouping whole numbers between -9999 to 9999
         * @param string $_
-        *
         * @return string
         */
        function commafy( $_ ) {
-               if ( !preg_match( '/^\d{1,4}$/', $_ ) ) {
+               if ( !preg_match( '/^\-?\d{1,4}(\.\d+)?$/', $_ ) ) {
                        return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
                } else {
                        return $_;
index fcb9e3a..a15dabd 100644 (file)
        "category_header": "الباجه في التصنيف \"$1\"",
        "subcategories": "تصنيفات تحتيه",
        "category-media-header": "فيشيي ميلتيميديا فالكاتيكورى  \"$1\"",
-       "category-empty": "''هاذ التصنيف ما فيهش لا باجات و لا ميلتيميديا.''",
+       "category-empty": "''هاذ التصنيف ما فيه لا پاجات و لا ميلتيميديا.''",
        "hidden-categories": "{{PLURAL:$1|تصنيف مدسوس|تصنيفات مدسوسة}}",
        "hidden-category-category": "تصنيفات مخبّية",
        "category-subcat-count": "{{PLURAL:$2|هاذ التصنيف فيه التصنيف الفرعي التالي|هاذ التصنيف فيه{{PLURAL:$1||التصنيف الفرعي|$1 تصنيفات فرعية}}، من إجمالي $2.}}",
        "aboutpage": "Project:على",
        "copyright": "المحتاوا راه تحت النسخة $1 تاع الليسانس، غير يلا كان مكتوب حاجاخرة.",
        "copyrightpage": "{{ns:project}}:حقوق النسخ",
-       "currentevents": "اÙ\84خبÙ\88رات",
+       "currentevents": "اÙ\84ختÙ\8aÙ\91ارات",
        "currentevents-url": "Project:خبورات",
        "disclaimers": "تنبيهات",
        "disclaimerpage": "Project:التحذيرات العامه",
        "passwordreset-emailtext-user": "المستعملي $1 ف {{SITENAME}} راه طلب تبدال ف كلمت` السرّ تاعك ف {{SITENAME}}\n($4). {{PLURAL:$3|الحساب|الحسايات}} تاع المستعملي {{PLURAL:$3|راه مربوط|راهم مربوطين}} ب لادريسة تاع ليمال هادي:\n\n$2\n\n{{PLURAL:$3|هاد كلمت` السرّ المأقّتة|هادي كلمات` السرّ المأقّتة}} غادي يكمل صلوحها منّا على {{PLURAL:$5|نهار واحد|$5 إيّام}}.\nمادابيك تسجّل داخل ضركا و تختار كلمت` سرّ جديدة. يلا كان وحداخُر دار هاد المطلب، ولا راك ضركا تفكّرت كلمت` السرّ تاعك القديمة و ما بقيتش باغي تبدّلها، تنجم برك تتنسّا هاد الميساج و تدخُل ب كلمت` السرّ تاعك تاع مضاري.",
        "passwordreset-emailelement": "سميّت` المستعملي: $1\nكلمت` السرّ المأقّتة: $2",
        "passwordreset-emailsent": "راه نبعَت إيمال تاع تبدال كلمت` السرّ.",
+       "passwordreset-emailsent-capture": "راه اترسل إيمال تاع تبدال كلمت` السرّ، و راه محطوط هنا لتحت.",
+       "passwordreset-emailerror-capture": "راه اترسل الإيمال تاع تبدال كلمت` السرّ، الّي راح محطوط هنا لتحت، بصّح البعيت تاعهُ لل {{GENDER:$2|مستعملي}} ما نجحش: $1",
+       "changeemail": "بدّل لادريسة تاع الإيمال",
+       "changeemail-text": "كمّل الكتبة ف` الجدوال هادا باش تبدّل لادريسة تاع الإيمال تاعك. يلزم لك تدخّل كلمت` السرّ تاعك باش تأكّد هاد التبدال.",
+       "changeemail-no-info": "لازم لك تكون مسجّل داخل باش توصَل ل هاد الپاجة بسّراح.",
+       "changeemail-oldemail": "لادريسة تاع الإيمال السارية:",
+       "changeemail-newemail": "لادريسة تاع الإيمال الجديدة:",
+       "changeemail-none": "(والو)",
+       "changeemail-password": "كلمت` السرّ تاعك ف {{SITENAME}}:",
+       "changeemail-submit": "بدّل الإيمال",
+       "changeemail-throttled": "راك درت بزّاف تاع المسيّات (كتَر منل مقبول!) باش تسجّل الدخول.\nالله يحفضك اصبر $1 قبَل ما تعاود تسيّي.",
+       "resettokens": "بدّل المفاتح",
+       "resettokens-text": "تنجم تبدّل المفاتح الّي يخلّيوك توصل ل شي معلومات خوصوصيّة، مربوطة بل حساب تاعك هنا.\n\nلازم لك تديرها يلا كُنت نتا مدّيتهم ل شي واحد ولا بلا كان الحساب تاعك اتهدّد.",
+       "resettokens-no-tokens": "ما كاين حتا مفاتح تنجم تبدّلهم.",
+       "resettokens-legend": "بدّل المفاتح",
+       "resettokens-tokens": "مفاتح:",
+       "resettokens-token-label": "$1 (القيمة تاع ضركا: $2)",
+       "resettokens-watchlist-token": "المفتاح تاع السيل (Atom/RSS) تاع [[Special:Watchlist|التبدالات الّي فل ليستة تاع المتابعة تاعك]]",
+       "resettokens-done": "المفاتح راهي تبدّلت.",
+       "resettokens-resetbutton": "بدّل المفاتح الّي راك ختاريتها",
        "bold_sample": "كتيبة غليظه",
        "bold_tip": "كتيبة غليظه",
        "italic_sample": "كتبة مايلة",
        "sig_tip": "سنياتورتك بالساعة و التاريخ",
        "hr_tip": "خط أفقي (ما تستعملوش بزاف)",
        "summary": "ملخص:",
+       "subject": "موضوع / علوان:",
        "minoredit": "هذي تبديلة صغيرة",
        "watchthis": "تبع الباجة",
        "savearticle": "سجل الباجة",
        "preview": "شوفه-قبلي",
        "showpreview": "بين معاينة",
        "showdiff": "عرض التبديلات",
+       "blankarticle": "<strong>ردّ البال:</strong> الپاجة الّي كريّيتها راهي خاوية.\nيلا تعاود تكليكي على {{int:savearticle}}\"، الپاجة غادي تنخلق بلا ما يكون فيها حتا محتاوا.",
        "anoneditwarning": "'''توليهة:''' راك ما دخلتش بل حساب تاعك.\nيلا تدير شي تبدال، غادي تتسجّل لادريسة آيبي تاعك فل متراخ تاع هاد الصفحة و تكون باينة ل كلّ واحد. يلا [$1 تتكونيكتا]</strong> ولا <strong>[$2 تخلق حساب]</strong>، التبدالات تاعك غادي يبانو تحت السميّة تاع المستعملي تاعك، و كاين تاني مزيّات وحدخرين.",
+       "anonpreviewwarning": "<em>ما راكش مسجّل داخل. لوكان تحفّظ التبدالات ضركا غادي تتسجّل لادريسة إيپي تاعك فل تاريخ تاع هاد الپاجة.</em>",
+       "missingsummary": "<strong>تفكار:</strong> راك ما مدّيتش تلخيص على التبدال تاعك.\nيلا تكليكي على \"{{int:savearticle}}\" مجّديد، التبدال تاعك غادي يتسجّل بلاش.",
+       "selfredirect": "<strong>ردّ البال:</strong> راك توجّه هاد الپاجة على روحها.\nبالاك راك غلطت فل ختيّار تاع التقيان تاع الپاجة، ولا تاني ما راكش فل پاجة الّي راك حاب تإيديتيها.\nيلا تكليكي على \"{{int:savearticle}}\" مجّديد، هاد التوجاه غادي ينخلق كيما هاك.",
+       "missingcommenttext": "الله يحفضك حُطّ شي تعليق هنا لتحت.",
+       "missingcommentheader": "<strong>تفكار:</strong> راك ما حطّيتش علوان تاع الموضوع تاع التعليق تاعك.\nيلا تكليكي على \"{{int:savearticle}}\" مجّديد، التبدال تاعك غادي يتسجّل بلاش.",
+       "summary-preview": "شوفة خفيفة على التلخيص:",
+       "subject-preview": "شوفة خفيفة على العلوان / الموضوع:",
+       "previewerrortext": "صرات غلطة فل محاولة باش تشوف خفيف ف` التبدالات تاعك.",
+       "blockedtitle": "المستعملي هادا راه محبّس",
+       "blockedtext": "<strong>السميّة تاع المستعملي تاع ولا الإييي راهم محبّسين</strong>\n\nالّي دار التحباس هوّا $1.\nالسبّة تاع التحباس هيّا: <em>$2</em>.\n\n* البدية تاع التحباس: $8\n* الكمال تاع التحباس: $6\n* المقصود تاع التحباس: $7\n\nتنجم تتاصل ب $1 ولا شي واحد من  [[{{MediaWiki:Grouppage-sysop}}|الإيداريّين]] باش تهدر على التحباس.\nما تنجمش تستعمل الخاصيّة تاع  \"ابعت إيمال ل هاد المستعملي\" غير يلا راك وضّعت إيمال صحيح فل  [[Special:Preferences|الختيّارات تاع الحساب تاعك]] و تاني ما راكش مبلوكي فيهم.\nلادريسة إيپي تاعك تاع ضركا هيّا $3، و النمرو تاع التعراف تاع التحباس هوّا #$5.\nالله يخلّيك حطّ كامل هاد المعلومات يلا بغيت تبعت مطلب على هاد الشي.",
+       "autoblockedtext": "لادريسة تاع الإيپي تاعك راهي محبّسة خاطر راهي اتستعملت من عند مستعملي الّي راه بداتهُ محبّس من عند $1.\nالسبّة تاع التحباس هيّا: <em>$2</em>.\n\n* البدية تاع التحباس: $8\n* الكمال تاع التحباس: $6\n* المقصود تاع التحباس: $7\n\nتنجم تتاصل ب $1 ولا شي واحد من  [[{{MediaWiki:Grouppage-sysop}}|الإيداريّين]] باش تهدر على التحباس.\nما تنجمش تستعمل الخاصيّة تاع  \"ابعت إيمال ل هاد المستعملي\" غير يلا راك وضّعت إيمال صحيح فل  [[Special:Preferences|الختيّارات تاع الحساب تاعك]] و تاني ما راكش مبلوكي فيهم.\nلادريسة إيپي تاعك تاع ضركا هيّا $3، و النمرو تاع التعراف تاع التحباس هوّا #$5.\nالله يخلّيك حطّ كامل هاد المعلومات يلا بغيت تبعت مطلب على هاد الشي.",
+       "blockednoreason": "ما تمدّت حتا سبّة",
+       "whitelistedittext": "لازم لك $1 باش تنجم تبدّل الپاجات.",
+       "confirmedittext": "لازم لك تكونفيرمي لادريسة تاع الإيمال تاعك قبل ما تنجم تإيديتي الپاجة.\nالله يسترك صاوب و أكّد لادريسة تاع الإيمال ديالك فل [[Special:Preferences|ختيّارات تاع المستعملي]].",
+       "nosuchsectiontitle": "ما مكنش تنصاب التقسيمة",
+       "nosuchsectiontext": "راك سيّيت تبدّل شي تقسيمة الّي ما كاينش منها.\nبالاك راهي تحوّلت ولا اتّمحات مين كنت نتا تشوف فل پاجة.",
+       "loginreqtitle": "تسجال الدخول راه ملزوم",
        "loginreqlink": "اتكونيكتا",
+       "loginreqpagetext": "الله يخلّيك لازم $1 باش تشوف الپاجات لُخرة.",
+       "accmailtitle": "كلمت` السرّ راهي انبعتَت",
+       "accmailtext": "راهي انخلقت كلمت` سرّ مختارة على الزهَر لل مستعملي [[User talk:$1|$1]] و و انبعتت ل $2.\nتنجم تبدّلها فل پاجة<em>[[Special:ChangePassword|بدّل كلمت` السرّ]]</em> كي تتسجّل داخل.",
        "newarticle": "(جديد)",
        "newarticletext": "راك تبعت وصيلة لباجه لم ما تخدمتش بعد.\nباش تصنع هاذ الباجه ابدا الكتبه فالصندوق التحت (شوف في [$1  زياده باجه المساعده] لمعلومات).\nإذا كانت زيارتك لهاذ الباجه غلطه، ادرك على بوطون''ولى'' في نافيقاتور الإنترنت نتاعك.",
+       "anontalkpagetext": "----''هاذ الباجة نقاش لمستخدم مجهول ما قامش بإنشاء حساب بعد و الا ما يستعملش ذاك الحساب.\nلذا لازم علينا استعمال رقم الأيبي باش نتعرفو عليه/عليها.\nمثل هذا العنوان يمكنلو يشترك فيه مستخدمين بزاف.\nإذا كنت مستخدم مجهول وتشعر بلي التعليقات ما تخصكش وصلتلك ، من فضلك [[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": "لحد الساعه ما كانش حتى نص في هاذ الباجه.\nتقدرو [[Special:Search/{{PAGENAME}}|ترميو تفتيشه على هاذ العنوان]] فالباجات لخرين,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} فتش فالعمليات المربوطه]\nو إلا[{{fullurl:{{FULLPAGENAME}}|action=edit}} أصنع هاذ الباجه]</span>.",
+       "missing-revision": "المراجعة #$1 من الباجة اللي سموها \"{{FULLPAGENAME}}\" ما هيش كاينة.\n\nهذا يصرا فالعادة منين نتبعو وصيلة تاريخها قديم لباجة تنحات.\nالتفاصيل يمكن نصيبوها في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل المسح].",
+       "userpage-userdoesnotexist": "حساب المستخدم \"<nowiki>$1</nowiki>\" ماهوش مسجل.\nمن فضلك تأكد بلي راك باغي تصنع/تعدل هاذ الباجة.",
+       "userpage-userdoesnotexist-view": "حساب المستخدم \"$1\" ماهوش مسجل.",
+       "blocked-notice-logextract": "هذا المستخدم ممنوع حاليا.\nآخر دخلة في سجل المنع موفرة بالتحت كمرجع:",
+       "clearyourcache": "'''ملاحظة:''' بعد الحفظ، بلاك تحتاج باش تفرغ الكاش نتاع المتصفح و تشوف التبديلات.\n* '''فايرفوكس / سفاري:''' ادرك ''Shift'' منين تكون تدرك ''Reload''، ولاادرك ثاني إما  ''Ctrl-F5'' ولا''Ctrl-R'' (''⌘-R'' على ماك)\n* '''قوقل كروم:''' ادرك ''Ctrl-Shift-R'' (''⌘-Shift-R'' على ماك)\n* '''إنترنت إكسبلورر:''' ادرك ''Ctrl'' منين تدرك على ''Refresh''، ولا ادرك ''Ctrl-F5''\n* '''كنكرر:''' ادرك ''Reload'' ولا ادرك ''F5''\n* '''أوبرا:''' فرغ الكاش في ''Tools → Preferences''",
+       "usercssyoucanpreview": "'''ملاحظة:''' استعمل بوطون \"{{int:showpreview}}\" لاش تجرب CSS الجديد قبل ما تسجل الباجة.",
+       "userjsyoucanpreview": "'''ملاحظة:''' استعمل بوطون\"{{int:showpreview}}\" لتجربة جافاسكربت الجديدة قبل تسجل الباجة.",
+       "usercsspreview": "'''تفكر أنك راك تعرض الأنماط المتراصة (CSS) الخاصة بيك فقط\nو تمش حفظها بعد!'''",
+       "userjspreview": "'''تذكر أنك فقط تجرب/تعاين جافاسكربت.'''\n'''مازال ما  صراش التسجيل!'''",
+       "sitecsspreview": "'''تفكر أنك راك تعرض الأنماط المتراصة (CSS) الخاصة بيك فقط\nو تمش حفظها بعد!'''",
+       "sitejspreview": "'''تذكر أنك فقط تجرب/تعاين جافاسكربت.'''\n'''مازال ما  صراش التسجيل!'''",
+       "userinvalidcssjstitle": "'''تحذير:''' ما كانش تلبيسة\"$1\".\nتفكر بلي ملفات ال.css و ال.js تستعمل حروف صغيرة في العنوان ، كمثال {{ns:user}}:Foo/vector.css و ليس {{ns:user}}:Foo/Vector.css.",
+       "updated": "ميزاجور (تحديث)",
+       "note": "'''ملاحظة:'''",
        "previewnote": "'''ما تنساش هذي معاينه قبليه.'''\nلدوك التبديلات دياولك ما تسجلوش!",
+       "continue-editing": "روح لصندوق التحرير",
+       "previewconflict": "هاذ العرض يبين النص الموجود في صندوق التحرير الفوقاني اللي يبانلك إذا اختاريت النشر.",
+       "session_fail_preview": "'''مانقدروش نسجلو التبديلات نتاوعك علا خاطر كاين معلومات تودرو في ما يخص القعدة .'''\nمن فضلت حاول مرة اخرى.\nإذا ما نجحتش مرة جديدة, حاول باش [[Special:UserLogout|تخرج]], و تدخل مرة اخرى",
+       "session_fail_preview_html": "'''مانقدروش نسجلو التبديلات نتاوعك علا خاطر كاين معلومات تودرو في ما يخص القعدة .'''\n\n''على خاطر {{SITENAME}} فعل HTML brut, الإستضهار تخبا باش نتوخاو الهجمات بالجافاسكريبت.''\n\n'''إذا كانت محاولة التبديل صادقة, حاول مرة اخرى.'''\nالا ما نجحتش مرة اخرى, [[Special:UserLogout|اخرج]], و ادخل مرة اخرى",
        "editing": "تحرير $1",
        "creating": "خليق $1",
        "editingsection": "كتيبه $1 (قسم)",
        "sharedupload-desc-here": "هاذ الملف جاي من $1. يمكن يكون مستعمل من بروجيات وحد أخرين.\nالتوصيف نتاعو في [$2 باجت الصفات] محطوطه هنا لتحت.",
        "upload-disallowed-here": "ما تنحمش تعدّل هاد التصويرة",
        "randompage": "باجة على الزهر",
-       "statistics": "إحصاويّات",
+       "statistics": "إحصائيّات",
        "nbytes": "{{PLURAL:$1|بايت 1|$1 بايت}}",
        "nmembers": "$1 اعضاء{{PLURAL:$1||s}}",
        "prefixindex": "كامل الباجات الباديه ب",
        "tooltip-ca-watch": "زيد هذ الباجة لل ليستة تاعك تاع التتباع",
        "tooltip-ca-unwatch": "اقلع هاد الباجة منل ليستة تاعك تاع التتباع",
        "tooltip-search": " فتّش في {{SITENAME}}",
-       "tooltip-search-go": "روح لباجه عندها ذاك الآسم نفسو  إذا كانت",
+       "tooltip-search-go": "روح ل باجة عندها ذاك الآسم بدّات يلا كانت كاينة",
        "tooltip-search-fulltext": "فتّش على باجه بهاد الكتبة",
        "tooltip-p-logo": "زور الپاجة اللولانيّة",
        "tooltip-n-mainpage": "زور الپاجة اللولانيّة",
index 3eac582..4864fe5 100644 (file)
        "content-model-text": "yanong-teksto",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "duplicate-args-warning": "<strong>Patanid:</strong> [[:$1]] nag-aapod [[:$2]] na igwa nin sobra sa sarong halaga para sa \"$3\" na parametro. An pinakahuring halaga sanang ipinagtao an magagamit.",
        "expensive-parserfunction-warning": "'''Patanid tabi:''' Ining pahina naglalaman nin grabe kadakulon na ekspensibong programang pambaranga sa punksyon nin mga pag-aapod.\n\nIni dapat magkaigwa nin menos sanang $2 {{PLURAL:$2|apod|mga apod}}, igwa na {{PLURAL:$1|ngunyan nin $1 apod|ngunyan nin $1 mga apod}}.",
        "expensive-parserfunction-category": "Mga pahina na igwa nin grabe kadakulon na mga ekspensibong programang pambaranga sa punksyon nin mga pag-aapod",
        "post-expand-template-inclusion-warning": "'''Patanid tabi:''' An panguyog (template) igwang sukol na grabe kadakula.\nAn ibang mga panguyog dae tabi maipagdadagdag.",
index 8017446..caa46a4 100644 (file)
        "content-model-css": "CSS",
        "content-json-empty-object": "Пусты аб’ект",
        "content-json-empty-array": "Пусты масіў",
+       "duplicate-args-warning": "<strong>Папярэджаньне:</strong> [[:$1]] выклікае [[:$2]] з больш чым адным значэньнем парамэтру «$3». Толькі апошняе з пададзеных значэньняў будзе ўжытае.",
        "duplicate-args-category": "Старонкі, на якіх у шаблёнах выкарыстоўваюцца парамэтры-дублікаты",
        "duplicate-args-category-desc": "Старонкі, якія ўтрымліваюць шаблёны з парамэтрамі-дублікатамі, напрыклад, <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> або <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Папярэджаньне: гэтая старонка ўтрымлівае зашмат працаёмістых зваротаў да функцыяў парсэра.\n\nПавінна быць ня болей за $2 {{PLURAL:$2|зварот|звароты|зваротаў}}, а цяпер ўтрымліваецца {{PLURAL:$1|$1 зварот|$1 звароты|$1 зваротаў}}.",
        "php-uploaddisabledtext": "Загрузка файлаў была адключаная ў парамэтрах канфігурацыі PHP. Калі ласка, праверце значэньне парамэтра «file_uploads».",
        "uploadscripted": "Гэты файл утрымлівае HTML-код альбо скрыпт, які можа памылкова апрацоўвацца браўзэрам.",
        "upload-scripted-pi-callback": "Немагчыма загрузіць файл, які ўтрымлівае інструкцыі апрацоўкі табліцы стыляў XML.",
+       "uploaded-script-svg": "У загружаным SVG-файле знойдзены небясьпечны элемэнт з падтрымкай сцэнароў «$1».",
        "uploaded-hostile-svg": "Знойдзены небясьпечны CSS у элемэнце стылю загружанага SVG-файла.",
+       "uploaded-event-handler-on-svg": "Усталёўваць атрыбуты апрацоўніка падзеяў <code>$1=\"$2\"</code> не дазволена для SVG-файлаў.",
        "uploadscriptednamespace": "Гэты SVG-файл утрымлівае няслушную прастору назваў «$1»",
        "uploadinvalidxml": "Не атрымалася прааналізаваць XML у загружаным файле.",
        "uploadvirus": "Файл утрымлівае вірус! Падрабязнасьці: $1",
index 5cabb4d..59edae7 100644 (file)
        "badtitletext": "Назва старонкі, па якую звярталіся, аказалася недапушчальнай, пустой, або няправільна прылучанай між-моўнай ці між-вікі назвай. Магчыма, у ёй ёсць знакі, якія нельга ўжываць у назвах.",
        "title-invalid-empty": "Назва запытанай старонкі пустая ці змяшчае толькі назву прасторы назваў.",
        "title-invalid-utf8": "Назва запытанай старонкі ўтрымлівае недапушчальную ў UTF-8 паслядоўнасць.",
-       "title-invalid-interwiki": "Ð\97агаловак Ð·Ð¼Ñ\8fÑ\88Ñ\87ае Ñ\96нÑ\82Ñ\8dÑ\80вÑ\96кÑ\96\81паÑ\81Ñ\8bлкÑ\83",
+       "title-invalid-interwiki": "Ð\97апÑ\8bÑ\82анÑ\8b Ð·Ð°Ð³Ð°Ð»Ð¾Ð²Ð°Ðº Ð·Ñ\8cмÑ\8fÑ\88Ñ\87ае Ñ\96нÑ\82Ñ\8dÑ\80вÑ\96кÑ\96\81паÑ\81Ñ\8bлкÑ\83, Ñ\8fкÑ\83Ñ\8e Ð½ÐµÐ»Ñ\8cга Ñ\9eжÑ\8bваÑ\86Ñ\8c Ñ\83 Ð½Ð°Ð·Ð²Ð°Ñ\85.",
        "perfcached": "Гэта ўзятыя з кэшу звесткі, і яны могуць не быць актуальнымі. У кэшы захоўваецца не больш за {{PLURAL:$1|адзін вынік|$1 вынікі|$1 вынікаў}}.",
        "perfcachedts": "Наступныя звесткі кэшаваныя і апошні раз былі абноўленыя $1. У кэшы {{PLURAL:$4|даступны|даступныя}} не больш за $4 {{PLURAL:$4|вынік|вынікі|вынікаў}}.",
        "querypage-no-updates": "Немагчыма абнавіць паказаныя звесткі, таму што зараз абнаўленні гэтай старонкі не дазволены.",
index 8c1312c..b22502f 100644 (file)
        "simpleantispam-label": "स्पैम-बिरोधी रोक (Anti-spam check)\nएके <strong>मत</strong> भरीं!",
        "pageinfo-toolboxlink": "पन्ना के जानकारी",
        "previousdiff": "← पुरान संपादन",
-       "nextdiff": "नया संपादन",
+       "nextdiff": "नया संपादन →",
        "file-info-size": "$1 × $2 पिक्सेल, फाइल साइज: $3, MIME टाइप: $4",
        "file-nohires": "ए से उच्च गुणवत्ता उपलब्ध नइखे।",
        "svg-long-desc": "एसवीजी फाइल, नॉमिनल्ली $1 x $2 पिक्सल्स, फाइल के आकार $3",
index 2ff0ef4..d2f3850 100644 (file)
@@ -6,7 +6,8 @@
                        "Phurbutsering",
                        "Shirayuki",
                        "YeshiTuhden",
-                       "아라"
+                       "아라",
+                       "Sawuche"
                ]
        },
        "tog-underline": "འོག་ཐིག་ཅན་ལ་སྦྲེལ་མཐུད།",
@@ -33,7 +34,7 @@
        "tog-shownumberswatching": "ཤོག་ངོས་ལ་ལྟ་བཞིན་པའི་སྤྱོད་མིའི་ཁ་གྲངས་སྟོན།",
        "tog-oldsig": "ད་ཡོད་མིང་རྟགས།",
        "tog-fancysig": "མིང་རྟགས་རྣམས་ཝེ་ཁེ་ཡི་གེར་བརྩིས་རོགས། (རང་འགུལ་གྱི་སྦྲེལ་མཐུད་མེད་པ།)",
-       "tog-uselivepreview": "འà½\86རà¼\8bà½\96à½\9eིà½\93à¼\8bà½\94འིà¼\8bསà¾\94ོà½\93à¼\8bལà¾\9fà¼\8bསà¾\9fོà½\93à¼\8bརོà½\82སà¼\8d (à½\9aོà½\91à¼\8bལà¾\9fའིà¼\8bà½\86ེà½\91à¼\8d)",
+       "tog-uselivepreview": "à½\96à½\85ོསà¼\8bà½\9fིà½\93à¼\8bà½\94à¼\8bསà¾\94ོà½\93à¼\8bལà¾\9fà¼\8bà½\96ྱེà½\91à¼\8d",
        "tog-forceeditsummary": "རྩོམ་སྒྲིག་ཀྱི་བསྡུས་དོན་སྟོང་པ་ནང་འཇུག་བྱེད་སྐབས་ང་ལ་དྲན་སྐུལ་བྱེད་རོགས།",
        "tog-watchlisthideown": "ངའི་རྩོམ་སྒྲིག་རྣམས་ལྟ་ཞིབ་ཐོ་ལས་སྦས་རོགས།",
        "tog-watchlisthidebots": "རང་འགུལ་འཕྱུལ་ཆས་ཀྱི་བཟོ་འཅོས་བྱས་པ་རྣམས་ངའི་ལྟ་ཞིབ་ཐོ་ལས་སྦས་རོགས།",
        "otherlanguages": "སྐད་རིགས་གཞན་ཐོག།",
        "redirectedfrom": "$1 ནས་ཁ་ཕྱོགས་བསྐྱར་དུ་བཟོས་པ།",
        "redirectpagesub": "རིམ་འགྲེམ་ཤོག་ངོས།",
+       "redirectto": "འདི་རུ་ གསར་བཀོད་བྱེད།",
        "lastmodifiedat": "ཤོག་ངོས་འདི་ཡི་བཟོ་བཅོས་མཐའ་མ་$1 ཀྱི་ $2 ལ་རེད།",
        "viewcount": "ཤོགངོས་འདི་{{PLURAL:$1|ཐེངས་གཅིག་|ཐེངས་ $1}}བལྟས་འདུག།",
        "protectedpage": "སྲུང་སྐྱོབ་བྱས་པའི་ཤོག་ངོས།",
        "pool-queuefull": "སྤྱི་པའི་ཐེབས་རྩའི་བསྟར་པ་ཁེངས་འདུག།",
        "pool-errorunknown": "ངོས་མ་ཟིན་པའི་ནོར་འཁྲུལ།",
        "pool-servererror": "($1) ,ཐུན་མོང་ཡ་ལན་གི་ཞབས་ཞུ་གནས་སྐབས་རིང་མིན་འདུག།",
+       "poolcounter-usage-error": "བཀོལ་སྤྱོད་མཁན་ལ་ནོར་འཁྲུལ། $1",
        "aboutsite": "{{SITENAME}}ཡི་སྐོར།",
        "aboutpage": "Project:སྐོར།",
        "copyright": "དེ་མིན་གྱི་མཆན་འགྲེལ་ཡོད་ན་མ་གཏོགས། དྲ་བའི་ནང་དོན་ $1 སྟེང་དུ་ཡོད།",
        "disclaimers": "བདག་སྤྲོད་འདོར་མཁན།",
        "disclaimerpage": "Project:ཡོངས་ཁྱབ་ཀྱི་བདག་སྤྲོད་ཁེ་དབང་རྩོད་ལེན།",
        "edithelp": "རྩོམ་སྒྲིག་རོགས་རམ།",
+       "helppage-top-gethelp": "རོགས་རམ།",
        "mainpage": "གཙོ་གནད་ཤོག་ངོས།",
        "mainpage-description": "གཙོ་གནད་ཤོག་ངོས།",
        "policy-url": "Project: སྒྲིག་གཞི།",
        "hidetoc": "སྦས།",
        "collapsible-collapse": "རྡིབ་སྐྱོན།",
        "collapsible-expand": "རྒྱ་སྐྱེད།",
+       "confirmable-confirm": "འདི་ལྟར་ {{GENDER:$1|you}} ལ་བྱེད་པ་གཏན་ཁེལ་ལམ",
+       "confirmable-yes": "ཡིན།",
+       "confirmable-no": "མིན།",
        "thisisdeleted": "$1 ལ་ལྟ་བའམ་རང་ལོགས་བྱེད་རོགས།",
        "viewdeleted": " $1 ལ་ལྟ་དགོས་སམ།",
        "restorelink": "{{PLURAL:$1|བསུབས་པའི་རྩོམ་སྒྲིག|$1 བསུབས་པའི་རྩོམ་སྒྲིག}}",
        "feedlinks": "འདྲན་ཆས། :",
        "feed-invalid": "རྒྱུན་མངགས་ཡ་ལན་ཕན་མེད་རེད་འདུག།",
+       "feed-unavailable": "མཉམ་འབྲེལ་མཐུན་རྐྱེན་ད་ལྟ་སྒྲུབ་མི་ཐུབ།",
        "site-rss-feed": "$1 ཡི་RSS འབྱུང་ཁུངས།",
        "site-atom-feed": "$1 ཡི་ཆ་ཤས་ཡ་ལན།",
        "page-rss-feed": "$1 ཡི་RSS འབྱུང་ཁུངས།",
        "enterlockreason": "བཀག་སྡོམ་བྱས་དགོས་རྐྱེན་བཀོད་རོགས དེ་མིན་བཀག་སྡོམ་འདི་དུས་ཚོད་ནམ་ཞིག་ལ་བཀྲོལ་རྒྱུ་ཡིན་མིན་སོགས་བཀོད་རོགས།",
        "readonlytext": "རྨང་གཞི་གྲངས་མཛོད་འདི་གནས་སྐབས་བཀག་སྡོམ་བྱས་འདུག། ཕལ་ཆེར་རྨང་གཞི་གྲངས་མཛོད་འདི་ཉར་འཚག་བྱད་བཞིན་འདུག། \n$1 རྒྱུ་རྐྱེན་འདི་འོག་དོ་དམ་པས་བཀག་སྡོམ་བྱས་འདུག།",
        "missing-article": "གཞི་གྲངས་མཛོད་ནང་ཤོག་ངོས་ཀྱི་ཡི་གེ་བཙལ་ཐུབ་ཀྱི་མི་འདུག་པས། \"$1\" $2 \nཕལ་ཆེར་འདི་གཤམ་ཀྱི་འགོག་རྐྱེན་ལོ་རྒྱུས་སུབ་པ་འམ་དུས་ཡོལ་ཀྱི་ཁྱད་པར་སོགས་ཀྱི་རྒྱུ་རྐྱེན་ཡིན།\nགལ་སྲིད་དེ་ལྟར་མིན་ཚེ། ཕལ་ཆེར་ཁྱེད་ཀྱི་ནོར་སྐྱོན་འཙལ་རྙེད་བྱང་བས།  [[Special:ListUsers/sysop|administrator]], དྲ་རྒྱའི་ས་ཚིགས་འདི་ཐོག་ཞུ་ཡིག་འབུལ་གནང་ཡོང་བ་མཁྱེན།",
+       "missingarticle-rev": "(བསྐྱར་ཞིབ།#: $1)",
        "readonly_lag": "གཞི་གྲངས་མཛོད་རང་འགུལ་གི་སྒོ་ཐེབས་འདུག།",
        "internalerror": "ནང་ལོག་ནོར་སྐྱོན།",
        "internalerror_info": "ནང་ལོགས་ནོར་སྐྱོན། $1",
index 5ff574a..98cd52e 100644 (file)
        "ipb-hardblock": "Mirout ouzh an implijerien kevreet da zegas kemmoù adalek ar chomlec'h IP-mañ",
        "ipbcreateaccount": "Mirout ouzh an implijer da grouiñ kontoù",
        "ipbemailban": "Mirout ouzh an implijer da gas posteloù",
-       "ipbenableautoblock": "Stankañ war-eeun ar chomlec'h IP diwezhañ implijet gant an den-mañ hag an holl chomlec'hioù a c'hallfe klask kemmañ traoù drezo drezo diwezhatoc'h",
+       "ipbenableautoblock": "Stankañ war-eeun ar chomlec'h IP diwezhañ implijet gant an den-mañ hag an holl chomlec'hioù a c'hallfe klask kemmañ traoù drezo diwezhatoc'h",
        "ipbsubmit": "Stankañ an implijer-mañ",
        "ipbother": "Prantad all",
        "ipboptions": "2 eurvezh:2 hours,1 devezh:1 day,3 devezh:3 days,1 sizhunvezh:1 week,2 sizhunvezh:2 weeks,1 mizvezh:1 month,3 mizvezh:3 months,6 mizvezh:6 months,1 bloaz:1 year,da viken:infinite",
index 8c7c044..531b9a5 100644 (file)
        "tags-edit-reason": "Motiu:",
        "tags-edit-success": "S’han aplicat els canvis correctament.",
        "tags-edit-failure": "No s’han pogut aplicar els canvis:\n$1",
+       "tags-edit-none-selected": "Seleccioneu com a mínim una etiqueta per afegir o suprimir.",
        "comparepages": "Comparar pàgines",
        "compare-page1": "Pàgina 1",
        "compare-page2": "Pàgina 2",
index 9ba0234..ebb66a1 100644 (file)
        "october": "октябрь",
        "november": "ноябрь",
        "december": "декабрь",
-       "january-gen": "январь",
-       "february-gen": "февраль",
-       "march-gen": "март",
-       "april-gen": "апрель",
-       "may-gen": "май",
-       "june-gen": "июнь",
-       "july-gen": "июль",
-       "august-gen": "август",
-       "september-gen": "сентябрь",
-       "october-gen": "октябрь",
-       "november-gen": "ноябрь",
-       "december-gen": "декабрь",
+       "january-gen": "январехь",
+       "february-gen": "февралехь",
+       "march-gen": "мартехь",
+       "april-gen": "апрелехь",
+       "may-gen": "майхь",
+       "june-gen": "июнехь",
+       "july-gen": "июлехь",
+       "august-gen": "августехь",
+       "september-gen": "сентябрехь",
+       "october-gen": "октябрехь",
+       "november-gen": "ноябрехь",
+       "december-gen": "декабрехь",
        "jan": "январь",
        "feb": "февраль",
        "mar": "март",
        "action-viewmyprivateinfo": "хьан долара хааме хьажар",
        "action-editmyprivateinfo": "хьан долара хаам табар",
        "action-managechangetags": "хаамийн базан чохь билгалонаш кхоллар а дӀаяхар а",
-       "nchanges": "$1 {{PLURAL:$1|хийцам|хийцамаш}}",
+       "nchanges": "$1 {{PLURAL:$1|хийцам}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|тӀеххьара чудаларца}}",
        "enhancedrc-history": "истори",
        "recentchanges": "Керла нисдарш",
-       "recentchanges-legend": "Керла нисдаршка хьажар тадар",
+       "recentchanges-legend": "Керлачу хийцамийн нисдарш",
        "recentchanges-summary": "Лахахь гайтина хене хьаьжжина Википедин агӀонашкахь тӀаьхьара бина хийцамаш",
        "recentchanges-noresult": "Билгал йинчу хенахь цхьа хийцамаш бина бац.",
        "recentchanges-feed-description": "Тергам бе тlаьхьара вики хийцаман хlокху ларца.",
        "sp-contributions-blocked-notice-anon": "ХӀара IP-адрес хӀинца блоктоьхна ду.\nЛахахь гойту блоктохарийн тептар чура тӀаьххьарлера дӀаяздар:",
        "sp-contributions-search": "Къинхьегам лахар",
        "sp-contributions-username": "IP-адрес я декъашхочун цӀе:",
-       "sp-contributions-toponly": "ТÓ\80аÑ\8cÑ\85Ñ\8cаÑ\80а Ð±Ð¸Ð½Ð° Ñ\85ийÑ\86амаÑ\88 Ð³Ð°Ð¹Ñ\82а",
+       "sp-contributions-toponly": "Ð\93айÑ\82а Ñ\82Ó\80аÑ\8cÑ\85Ñ\85Ñ\8cаÑ\80леÑ\80а Ñ\85ийÑ\86амаÑ\88",
        "sp-contributions-newonly": "АгӀонаш кхоллар бен ма гайта",
        "sp-contributions-submit": "Лахар",
        "whatlinkshere": "Хьажоргаш кхузе",
        "tags-delete": "дӀаяккха",
        "tags-activate": "активациян",
        "tags-deactivate": "дӀаяйа",
-       "tags-hitcount": "$1 {{PLURAL:$1|хийцам|хийцамаш}}",
+       "tags-hitcount": "$1 {{PLURAL:$1|хийцам}}",
        "tags-create-heading": "Кхолла керла билгало",
        "tags-create-explanation": "Юха кхоьллина билгалонаш декъашхошна а боташна а Ӏад йтарца тӀекхочуш хира ю.",
        "tags-create-tag-name": "Билгалонна цӀе:",
index d4f707e..3574c29 100644 (file)
        "specialpage": "खास पानो",
        "personaltools": "व्यक्तिगत औजार",
        "articlepage": "कन्टेन्ट पानो हेर",
-       "talk": "बातà¤\9aित",
+       "talk": "à¤\95à¥\81रडà¥\80à¤\95ानà¥\80",
        "views": "अवलोकन गर",
        "toolbox": "औजारहरू",
        "userpage": "प्रयोगकर्ता पाना हेर्न्या",
        "lastmodifiedat": "यै पानालाई आन्तिम पटक $2, $1 मी परिवर्तन गरिया थ्यो।",
        "viewcount": "यो पाना हेरियाको थियो {{PLURAL:$1|एकपटक|$1 पटक}}",
        "protectedpage": "सुरक्षित गरिएका पानाहरु",
-       "jumpto": "यà¥\88मà¥\80 à¤\9cावà¤\93:",
+       "jumpto": "यैमी जाओ:",
        "jumptonavigation": "खोज",
        "jumptosearch": "खोज",
        "view-pool-error": "माफ गरया , ये समयमी सर्भरहरुमी कामको भार भौत रह्या छ।\nभौत भौत प्रयोगकर्ताहरु ये पाना हेद्या प्रयास गरी रहनु भएको छ।\nकृपया यो पाना पुन: हेर्नु अगाडि केही समय पर्खिदिनुहोस् ।\n\n$1",
        "timezoneregion-atlantic": "एट्लान्टिक महासागर",
        "timezoneregion-australia": "अष्ट्रेलिया",
        "timezoneregion-indian": "हिन्द महासागर",
+       "upload": "चित्र अपलोड गर",
+       "move": "नाम बदल",
        "movethispage": "पानाको नाम बदल्न्या",
        "mywatchlist": "मेरो ध्यान सूची",
+       "watch": "ध्यान राख",
        "watchthispage": "यै पानाको ध्यान राख",
+       "unwatch": "ध्यान हटाओ",
        "unwatchthispage": "ध्यान हटाओ",
        "notanarticle": "सामाग्री छैन",
-       "contributions": "{{GENDER:$1|प्रयोगकर्ता}}को योगदान"
+       "blanknamespace": "(मुख्य)",
+       "contributions": "{{GENDER:$1|प्रयोगकर्ता}}को योगदान",
+       "contribslink": "योगदानहरू",
+       "tooltip-search": "{{SITENAME}} मी खोज",
+       "tooltip-search-fulltext": "ये पाठका लागि पाना खोज",
+       "tooltip-t-recentchangeslinked": "ये पानामा जोडिईया पानानमा ऐलैको परिवर्तन",
+       "specialpages": "खास पानो",
+       "searchsuggest-search": "खोज"
 }
index a9ca15f..83fe0b1 100644 (file)
        "passwordreset-emailtitle": "Detalles de la cuenta en {{SITENAME}}",
        "passwordreset-emailtext-ip": "Alguien (probablemente tú, desde la dirección IP $1) ha solicitado el restablecimiento de tu contraseña en {{SITENAME}} ($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}}\na esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} caducarán en {{PLURAL:$5|un día|$5 días}}.\nAhora puedes iniciar sesión y establecer una nueva contraseña. Si fue otra persona la que realizó esta solicitud, o si ya recuerdas tu contraseña original y, por tanto, no deseas cambiarla, puedes ignorar este mensaje y continuar usando tu contraseña anterior.",
        "passwordreset-emailtext-user": "El usuario $1 de {{SITENAME}} solicitó el restablecimiento de tu contraseña en {{SITENAME}}\n($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}} a esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} caducarán en {{PLURAL:$5|un día|$5 días}}.\nAhora puedes iniciar sesión y establecer una nueva contraseña. Si fue otra persona la que realizó esta solicitud, o si ya recuerdas tu contraseña original y, por tanto, no deseas cambiarla, puedes ignorar este mensaje y continuar usando tu contraseña anterior.",
-       "passwordreset-emailelement": "Nombre de usuario: $1\nContraseña temporal: $2",
+       "passwordreset-emailelement": "Nombre de {{GENDER:$1|usuario|usuaria}}: $1\nContraseña temporal: $2",
        "passwordreset-emailsent": "Se ha enviado un correo electrónico para el restablecimiento de tu contraseña.",
        "passwordreset-emailsent-capture": "Se ha enviado un correo para el restablecimiento de la contraseña, el cual se muestra a continuación.",
        "passwordreset-emailerror-capture": "Se ha generado un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero ha fallado el envío {{GENDER:$2|al usuario|a la usuaria}}: $1",
        "previewconflict": "Esta previsualización muestra cómo aparecerá el texto en el área de edición superior una vez guardados los cambios.",
        "session_fail_preview": "<strong>Lo sentimos, no hemos podido procesar tu edición debido a una pérdida de los datos de sesión.</strong>\nPor favor, inténtalo de nuevo.\nSi el problema persiste, prueba a [[Special:UserLogout|cerrar sesión]] y volver a acceder.",
        "session_fail_preview_html": "<strong>Lo sentimos, no hemos podido procesar tu edición debido a una pérdida de datos de sesión.</strong>\n\n<em>La previsualización está oculta como prevención frente a ataques JavaScript, puesto que este wiki tiene habilitado el HTML en bruto.</em>\n\n<strong>Si se trata de un intento legítimo de modificación, por favor, inténtalo de nuevo.</strong>\nSi aún así no funcionase, prueba a [[Special:UserLogout|cerrar sesión]] y volver a acceder.",
-       "token_suffix_mismatch": "<strong>Tu edición ha sido rechazada porque tu cliente ha mezclado los signos de puntuación en la clave de edición.\nSe rechazó la edición para evitar la corrupción del texto de la página.\nEsto sucede en ocasiones si se usa un servicio de proxy anónimo defectuoso.</strong>",
+       "token_suffix_mismatch": "<strong>Tu edición ha sido rechazada porque tu cliente ha mezclado los signos de puntuación en la clave de edición.</strong>\nSe rechazó la edición para evitar la corrupción del texto de la página.\nEsto sucede en ocasiones si se usa un servicio de proxy anónimo defectuoso.",
        "edit_form_incomplete": "<strong>Una parte del formulario de edición no ha llegado al servidor. Comprueba que tus cambios están intactos e inténtalo de nuevo.</strong>",
        "editing": "Edición de «$1»",
        "creating": "Creación de «$1»",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objeto vacío",
        "content-json-empty-array": "Matriz vacía",
+       "duplicate-args-warning": "<strong>Aviso:</strong> [[:$1]] usa [[:$2]] con más de un valor para el parámetro «$3». Se usará solo el último valor proporcionado.",
        "duplicate-args-category": "Páginas que usan argumentos duplicados en invocaciones de plantillas",
        "duplicate-args-category-desc": "La página contiene invocaciones de plantillas que utilizan argumentos duplicados, como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
-       "expensive-parserfunction-warning": "Aviso: Esta página contiene demasiadas llamadas a funciones sintácticas costosas (#ifexist: y similares)\n\nTiene {{PLURAL:$1|una llamada|$1 llamadas}}, pero debería tener menos de $2.",
+       "expensive-parserfunction-warning": "<strong>Advertencia:</strong> esta página contiene demasiadas llamadas a funciones sintácticas costosas.\n\nTiene {{PLURAL:$1|una llamada|$1 llamadas}}, pero debería tener menos de {{PLURAL:$2|una|$2}}.",
        "expensive-parserfunction-category": "Páginas con llamadas a funciones sintácticas demasiado costosas",
        "post-expand-template-inclusion-warning": "<strong>Aviso:</strong> El tamaño de las plantillas incluidas es muy grande.\nAlgunas de ellas no se incluirán.",
        "post-expand-template-inclusion-category": "Páginas con sobrecarga de plantillas",
        "last": "ant",
        "page_first": "primeras",
        "page_last": "últimas",
-       "histlegend": "Selección de diferencias: marca las casillas correspondientes a las versiones a comparar y pulsa Intro o el botón de abajo.<br />\nLeyenda: <strong>(act)</strong> = diferencias con la versión actual,\n<strong>(ant)</strong> = diferencias con la versión anterior, <strong>m</strong> = edición menor",
+       "histlegend": "Selección de diferencias: marca las casillas correspondientes a las versiones a comparar y pulsa Intro o el botón de abajo.<br />\nLeyenda: <strong>({{int:cur}})</strong> = diferencias con la versión actual,\n<strong>({{int:last}})</strong> = diferencias con la versión anterior, <strong>{{int:minoreditletter}}</strong> = edición menor.",
        "history-fieldset-title": "Buscar en el historial",
        "history-show-deleted": "Solo eliminadas",
        "histfirst": "primeras",
        "rev-deleted-comment": "(resumen de edición eliminado)",
        "rev-deleted-user": "(nombre de usuario eliminado)",
        "rev-deleted-event": "(detalles del registro eliminados)",
-       "rev-deleted-user-contribs": "[nombre de usuario o dirección IP eliminada - edición ocultada de la lista de contribuciones]",
+       "rev-deleted-user-contribs": "[nombre de usuario o dirección IP eliminada, edición ocultada de la lista de contribuciones]",
        "rev-deleted-text-permission": "Esta revisión ha sido <strong>eliminada</strong>.\nPara más información, consulta el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
        "rev-suppressed-text-permission": "Esta revisión ha sido <strong>suprimida</strong>.\nPara más información, consulta el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresiones].",
        "rev-deleted-text-unhide": "Esta revisión ha sido <strong>eliminada</strong>.\nPara más información, consulta el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].\nComo administrador, aún puedes [$1 ver esta revisión] si lo deseas.",
        "diff-multi-sameuser": "(No se {{PLURAL:$1|muestra una edición intermedia|muestran $1 ediciones intermedias}} del mismo usuario)",
        "diff-multi-otherusers": "(No se {{PLURAL:$1|muestra una edición intermedia|muestran $1 ediciones intermedias}} de {{PLURAL:$2|otro usuario|$2 usuarios}})",
        "diff-multi-manyusers": "(No se {{PLURAL:$1|muestra una edición intermedia|muestran $1 ediciones intermedias}} de más de {{PLURAL:$2|un usuario|$2 usuarios}})",
-       "difference-missing-revision": "No {{PLURAL:$2|se ha encontrado|se han encontrado}} {{PLURAL:$2|una revisión|$2 revisiones}} de la comparación solicitada ($1).\n\nLa causa de esto suele ser un enlace obsoleto hacia una página que ya ha sido borrada.\nPara más información, consulta el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
+       "difference-missing-revision": "No se {{PLURAL:$2|ha encontrado una revisión|han encontrado $2 revisiones}} de la comparación solicitada ($1).\n\nLa causa de esto suele ser un enlace obsoleto hacia una página que ya ha sido borrada.\nPara más información, consulta el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
        "searchresults": "Resultados de la búsqueda",
        "searchresults-title": "Resultados de la búsqueda de «$1»",
        "titlematches": "Resultados por título de página",
        "searchprofile-everything-tooltip": "Buscar en todo el contenido (incluyendo páginas de discusión)",
        "searchprofile-advanced-tooltip": "Buscar en espacios de nombres personalizados",
        "search-result-size": "$1 ({{PLURAL:$2|1 palabra|$2 palabras}})",
-       "search-result-category-size": "{{PLURAL:$1|1 miembro|$1 miembros}} ({{PLURAL:$2|1 subcategoría|$2 subcategorías}}, {{PLURAL:$3|1 fichero|$3 ficheros}})",
+       "search-result-category-size": "{{PLURAL:$1|1 miembro|$1 miembros}} ({{PLURAL:$2|1 subcategoría|$2 subcategorías}}, {{PLURAL:$3|1 archivo|$3 archivos}})",
        "search-redirect": "(redirige desde $1)",
        "search-section": "(sección $1)",
        "search-category": "(categoría $1)",
        "recentchangeslinked-to": "Mostrar los cambios en páginas enlazadas con la página seleccionada",
        "upload": "Subir archivo",
        "uploadbtn": "Subir un archivo",
-       "reuploaddesc": "Cancelar carga y volver al formulario",
+       "reuploaddesc": "Cancelar subida y volver al formulario",
        "upload-tryagain": "Enviar la descripción modificada del archivo",
        "uploadnologin": "No has iniciado sesión",
        "uploadnologintext": "Tienes que $1 para subir archivos.",
        "uploaderror": "Error al intentar subir",
        "upload-recreate-warning": "<strong>Aviso: Un archivo con ese nombre ha sido eliminado o renombrado.</strong>\n\nA continuación se muestra el registro de borrados y traslados de esta página:",
        "uploadtext": "Utiliza el siguiente formulario para subir archivos.\nPara ver o buscar archivos subidos con anterioridad, ve a la [[Special:FileList|lista de archivos subidos]].\nLos archivos subidos también quedarán registrados en el [[Special:Log/upload|registro de archivos subidos]], y los borrados en el [[Special:Log/delete|registro de borrados]].\n\nPara incluir un archivo en una página, usa un enlace como los mostrados a continuación:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> para usar la versión a tamaño completo del archivo\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|texto alternativo]]</nowiki></code></strong> para una versión de 200 píxeles de ancho situada en una caja en el margen izquierdo con \"texto alternativo\" como descripción\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> para enlazar directamente al archivo sin mostrarlo.",
-       "upload-permitted": "{{PLURAL:$2|Tipo|Tipos}} de archivo permitidos: $1.",
-       "upload-preferred": "{{PLURAL:$2|Tipo|Tipos}} de archivo preferidos: $1.",
-       "upload-prohibited": "{{PLURAL:$2|Tipo|Tipos}} de archivo prohibidos: $1.",
+       "upload-permitted": "{{PLURAL:$2|Tipo de archivo permitido|Tipos de archivo permitidos}}: $1.",
+       "upload-preferred": "{{PLURAL:$2|Tipo de archivo preferido|Tipos de archivo preferidos}}: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Tipo de archivo prohibido|Tipos de archivo prohibidos}}: $1.",
        "uploadlogpage": "Subidas de archivos",
        "uploadlogpagetext": "Debajo se muestra una lista de los últimos archivos subidos.\nVéase la [[Special:NewFiles|galería de archivos nuevos]] para una vista más estilizada",
        "filename": "Nombre del archivo",
        "uploadwarning": "Advertencia de subida de archivo",
        "uploadwarning-text": "Por favor, modifique la descripción del archivo abajo indicada e inténtelo de nuevo.",
        "savefile": "Guardar archivo",
-       "uploaddisabled": "Se desactivó la carga de archivos.",
-       "copyuploaddisabled": "Se desactivó la carga mediante URL.",
-       "uploaddisabledtext": "Se desactivó la carga de archivos.",
+       "uploaddisabled": "Se desactivó la subida de archivos.",
+       "copyuploaddisabled": "Se desactivó la subida de archivos mediante URL.",
+       "uploaddisabledtext": "Se desactivó la subida de archivos.",
        "php-uploaddisabledtext": "La subida de archivos está deshabilitada en PHP. Por favor compruebe <code>file_uploads</code> en php.ini.",
        "uploadscripted": "Este archivo contiene script o código HTML que puede ser interpretado erróneamente por un navegador web.",
+       "upload-scripted-pi-callback": "No se pueden cargar archivos que contengan instrucciones de procesamiento en forma de hojas de estilo XML.",
        "uploaded-script-svg": "Se encontró el elemento habilitado para secuencias de órdenes «$1» en el archivo SVG cargado.",
        "uploaded-hostile-svg": "Se encontró código CSS no seguro en el elemento de estilo del archivo SVG cargado.",
+       "uploaded-event-handler-on-svg": "No está permitido configurar atributos controladores de eventos <code>$1=\"$2\"</code> en los archivos SVG.",
        "uploaded-href-attribute-svg": "No se permite que los archivos SVG contengan los atributos de «href» <code>&lt;$1 $2=\"$3\"&gt;</code> apuntando a recursos no locales (p. ej., http:// o javascript:).",
+       "uploaded-href-unsafe-target-svg": "Se encontró un \"href\" hacia un destino inseguro <code><$1 $2=\"$3\"></code> en el archivo SVG cargado.",
+       "uploaded-animate-svg": "Se encontró un etiqueta \"animate\" que puede estar cambiando \"href\", mediante el atributo \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> en el archivo SVG cargado.",
+       "uploaded-setting-event-handler-svg": "Está bloqueada la configuración de atributos controladores de eventos. Se encontró <code>&lt;$1 $2=\"$3\"&gt;</code> en el archivo SVG cargado.",
+       "uploaded-setting-href-svg": "Está bloqueado el uso de la etiqueta \"set\" para añadir un atributo \"href\" al elemento padre.",
+       "uploaded-wrong-setting-svg": "Está bloqueado el uso de la etiqueta \"set\" para añadir un destino remote/data/script a cualquier atributo. Se encontró <code>&lt;set to=\"$1\"&gt;</code> en el archivo SVG cargado.",
+       "uploaded-setting-handler-svg": "Están bloqueados los archivos SVG que configuran el atributo \"handler\" con remote/data/script. Se encontró <code>$1=\"$2\"</code> en el archivo SVG cargado.",
        "uploaded-remote-url-svg": "Se bloquean los SVG que contienen URL de estilo externas. El archivo SVG cargado contiene <code>$1=\"$2\"</code>.",
+       "uploaded-image-filter-svg": "Se encontró un filtro de imagen con URL: <code>&lt;$1 $2=\"$3\"&gt;</code> en el archivo SVG cargado.",
        "uploadscriptednamespace": "Este archivo SVG contiene un espacio de nombre no permitido '$1'",
        "uploadinvalidxml": "No se pudo analizar el XML del archivo cargado.",
        "uploadvirus": "¡El archivo contiene un virus!\nDetalles: $1",
        "destfilename": "Nombre del archivo de destino:",
        "upload-maxfilesize": "Tamaño máximo del archivo: $1",
        "upload-description": "Descripción de archivo",
-       "upload-options": "Opciones de carga",
+       "upload-options": "Opciones de subida",
        "watchthisupload": "Vigilar este archivo",
        "filewasdeleted": "Un archivo con este nombre se subió con anterioridad y posteriormente ha sido borrado. Deberías revisar el $1 antes de subirlo de nuevo.",
        "filename-bad-prefix": "El nombre del archivo que estás subiendo comienza por '''«$1»''', un nombre nada descriptivo de su contenido. Es un típico nombre de los que asignan automáticamente las cámaras digitales.\n\nPor favor, elige un nombre más descriptivo.",
        "filename-prefix-blacklist": " #<!-- deja esta línea exactamente como está --> <pre>\n# La sintaxis de esta página es la siguiente:\n#   * Todo texto que se encuentre después del carácter \"#\" hasta el final de la línea se tratará como un comentario y será ignorado\n#   * Cualquier línea que no esté en blanco será interpretada como un prefijo típico en nombres de archivo que suelen asignar automáticamente las cámaras digitales\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # algunos teléfonos móviles / celulares\nIMG # genérico\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- deja esta línea exactamente como está -->",
        "upload-success-subj": "Subida con éxito",
-       "upload-success-msg": "La carga desde [$2] se realizó correctamente. Está disponible aquí: [[:{{ns:file}}:$1]]",
+       "upload-success-msg": "La subida desde [$2] se realizó correctamente. Está disponible aquí: [[:{{ns:file}}:$1]]",
        "upload-failure-subj": "Problema en la subida",
        "upload-failure-msg": "Hubo un problema durante la subida desde [$2]:\n\n$1",
        "upload-warning-subj": "Alerta de subida",
        "backend-fail-closetemp": "No se pudo cerrar el archivo temporal.",
        "backend-fail-read": "No se pudo leer el archivo «$1».",
        "backend-fail-create": "No se pudo escribir el archivo $1.",
-       "backend-fail-maxsize": "No se pudo escribir el archivo $1 porque es mayor de {{PLURAL:$2|un byte|$2 bytes}}.",
+       "backend-fail-maxsize": "No se pudo escribir el archivo \"$1\" porque es mayor a {{PLURAL:$2|un byte|$2 bytes}}.",
        "backend-fail-readonly": "El servidor (back-end) de almacenamiento \"$1\" está actualmente en estado de sólo lectura. La razón aducida fue: \"$2\"",
        "backend-fail-synced": "El archivo \"$1\" se encuentra en un estado incoherente dentro de los servidores (backends) de almacenamiento interno",
        "backend-fail-connect": "No se pudo conectar al servidor (backend) de almacenamiento \"$1\".",
        "invalid-chunk-offset": "Desplazamiento inválido del fragmento",
        "img-auth-accessdenied": "Acceso denegado",
        "img-auth-nopathinfo": "Falta PATH_INFO.\nEl servidor no está configurado para proporcionar esta información.\nEs posible que esté basado en CGI y que no sea compatible con img_auth.\nConsulte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
-       "img-auth-notindir": "La ruta solicitada no figura en la carpeta de cargas configurada.",
+       "img-auth-notindir": "La ruta solicitada no figura en la carpeta de subidas configurada.",
        "img-auth-badtitle": "Incapaz de construir un título válido de «$1».",
        "img-auth-nologinnWL": "No has iniciado sesión y «$1» no está en la lista blanca.",
        "img-auth-nofile": "El archivo «$1» no existe.",
        "upload_source_url": "(un archivo elegido de una URL válida y accesible públicamente)",
        "upload_source_file": "(un archivo elegido de tu computadora)",
        "listfiles-delete": "borrar",
-       "listfiles-summary": "Esta página especial muestra todos los archivos cargados.",
+       "listfiles-summary": "Esta página especial muestra todos los archivos subidos.",
        "listfiles_search_for": "Buscar por nombre de imagen:",
        "listfiles-userdoesnotexist": "La cuenta de usuario «$1» no está registrada.",
        "imgfile": "archivo",
        "filehist-comment": "Comentario",
        "imagelinks": "Usos del archivo",
        "linkstoimage": "{{PLURAL:$1|La siguiente página enlaza|Las siguientes páginas enlazan}} a este archivo:",
-       "linkstoimage-more": "Hay más de {{PLURAL:$1|una página que enlaza|$1 páginas que enlazan}} con este archivo.\n\nLa lista siguiente sólo muestra {{PLURAL:$1|la primera página que enlaza|las primeras $1 páginas que enlazan}} con este archivo.\nTambién puedes consultar la [[Special:WhatLinksHere/$2|lista completa]].",
+       "linkstoimage-more": "Hay más de {{PLURAL:$1|una página que enlaza|$1 páginas que enlazan}} con este archivo.\nLa lista siguiente sólo muestra {{PLURAL:$1|la primera página que enlaza|las primeras $1 páginas que enlazan}} con este archivo.\nTambién puedes consultar la [[Special:WhatLinksHere/$2|lista completa]].",
        "nolinkstoimage": "No hay páginas que enlacen a esta imagen.",
        "morelinkstoimage": "Vea [[Special:WhatLinksHere/$1|más enlaces]] a este archivo.",
        "linkstoimage-redirect": "$1 (archivo de redirección) $2",
        "filedelete-maintenance": "Borrado y restauración de archivos temporalmente deshabilitados durante el mantenimiento.",
        "filedelete-maintenance-title": "No se puede eliminar el archivo",
        "mimesearch": "Búsqueda por MIME",
-       "mimesearch-summary": "Esta página permite el filtrado de ficheros por su tipo MIME.\nEntrada: contenttype/subtype o contenttype/*, p. ej. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Esta página permite el filtrado de ficheros por su tipo MIME.\nEntrada: tipo/subtipo o tipo/*, p. ej. <code>image/jpeg</code>.",
        "mimetype": "Tipo MIME:",
        "download": "descargar",
        "unwatchedpages": "Páginas no vigiladas",
        "unusedtemplatestext": "Aquí se enumeran todas las páginas en el espacio de nombres {{ns:template}} que no están incluidas en otras páginas. Recuerda mirar lo que enlaza a las plantillas antes de borrarlas.",
        "unusedtemplateswlh": "otros enlaces",
        "randompage": "Página aleatoria",
-       "randompage-nopages": "No hay páginas en los siguientes {{PLURAL:$2|espacio de nombre|espacios de nombre}}: $1.",
+       "randompage-nopages": "No hay páginas en {{PLURAL:$2|el siguiente espacio de nombres|los siguientes espacios de nombres}}: $1.",
        "randomincategory": "Página aleatoria en categoría",
        "randomincategory-invalidcategory": "\"$1\" no es una categoría válida.",
        "randomincategory-nopages": "No hay páginas en la categoría [[:Category:$1|$1]].",
        "unusedimages": "Imágenes sin uso",
        "wantedcategories": "Categorías requeridas",
        "wantedpages": "Páginas requeridas",
-       "wantedpages-summary": "Lista de páginas inexistentes con el mayor número de enlaces a ellas, excluyendo páginas con únicamente redirecciones. Para una lista de páginas con redirecciones apuntando a ellas, consulte [[{{#special:BrokenRedirects}}]].",
+       "wantedpages-summary": "Lista de páginas inexistentes con el mayor número de enlaces a ellas, excluyendo páginas que son solo redirecciones a ellas. Para ver una lista de páginas inexistentes con redirecciones apuntando a ellas, consulta [[{{#special:BrokenRedirects}}|la lista de redirecciones rotas]].",
        "wantedpages-badtitle": "Título inválido en conjunto de resultados: $1",
        "wantedfiles": "Ficheros requeridos",
        "wantedfiletext-cat": "Los siguientes archivos están en uso, pero no existen. Es posible que algunos de ellos estén almacenados en repositorios externos y se hayan incluido aquí por error; dichas entradas aparecen <del>tachadas</del>. De igual manera, las páginas que incluyen archivos inexistentes se enumeran en [[:$1]].",
        "undeletepagetext": "{{PLURAL:$1|La siguiente página ha sido borrada, pero aún está en el archivo y puede ser restaurada.|Las siguientes $1 páginas han sido borradas, pero aún están en el archivo y pueden ser restauradas.}}\nPuede que el archivo se limpie periódicamente.",
        "undelete-fieldset-title": "Restaurar revisiones",
        "undeleteextrahelp": "Para restaurar todo el historial de la página, deja todas las casillas sin seleccionar y pulsa en <strong><em>{{int:undeletebtn}}</em></strong>. Para realizar una restauración selectiva, marca las revisiones que deban restaurarse y pulsa en <strong><em>{{int:undeletebtn}}</em></strong>.",
-       "undeleterevisions": "$1 {{PLURAL:$1|revisión|revisiones}} archivadas",
+       "undeleterevisions": "$1 {{PLURAL:$1|revisión archivada|revisiones archivadas}}",
        "undeletehistory": "Si restauras la página, todas sus revisiones se restaurarán en el historial.\nSi una nueva página con el mismo nombre se ha creado desde que se borró la original, las versiones restauradas aparecerán en el historial previo.",
        "undeleterevdel": "No se deshará el borrado si éste resulta en el borrado parcial de la última revisión de la página. En tal caso, desmarque o muestre las revisiones borradas más recientes. Las revisiones de archivos que no tiene permitido ver no se restaurarán.",
        "undeletehistorynoadmin": "El artículo ha sido borrado. La razón de su eliminación se indica abajo en el resumen, así como los detalles de las ediciones realizadas antes del borrado. El texto completo del artículo está disponible sólo para usuarios con permisos de administrador.",
        "undeleteviewlink": "ver",
        "undeleteinvert": "Invertir selección",
        "undeletecomment": "Razón:",
-       "undeletedrevisions": "{{PLURAL:$1|Una edición restaurada|$1 ediciones restauradas}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|ediciones restauradas y $2 archivo restaurado|ediciones y $2 archivos restaurados}}",
+       "undeletedrevisions": "{{PLURAL:$1|Una revisión restaurada|$1 revisiones restauradas}}",
+       "undeletedrevisions-files": "{{PLURAL:$1|1 revisión|$1 revisiones}} y {{PLURAL:$2|1 archivo|$2 archivos}} restaurados",
        "undeletedfiles": "$1 {{PLURAL:$1|archivo restaurado|archivos restaurados}}",
        "cannotundelete": "Hubo un error durante la restauración:\n$1",
        "undeletedpage": "'''Se ha restaurado $1'''\n\nConsulta el [[Special:Log/delete|registro de borrados]] para ver una lista de los últimos borrados y restauraciones.",
        "blocklist-reason": "Motivo",
        "ipblocklist-submit": "Buscar",
        "ipblocklist-localblock": "Bloqueo local",
-       "ipblocklist-otherblocks": "Otros {{PLURAL:$1|bloqueo| bloqueos}}",
+       "ipblocklist-otherblocks": "{{PLURAL:$1|Otro bloqueo|Otros bloqueos}}",
        "infiniteblock": "infinito",
        "expiringblock": "expira el $1 a las $2",
        "anononlyblock": "sólo anón.",
        "exif-compression-2": "CCITT Group 3 1-Dimensional Modified Huffman run length encoding",
        "exif-compression-3": "Codificación de fax CCITT grupo 3",
        "exif-compression-4": "Codificación de fax CCITT grupo 4",
+       "exif-compression-6": "JPEG (antiguo)",
        "exif-copyrighted-true": "Con derechos de autor",
        "exif-copyrighted-false": "No se ha definido el estado del copyright",
        "exif-unknowndate": "Fecha desconocida",
        "exif-orientation-8": "Rotada 90° a la derecha",
        "exif-planarconfiguration-1": "formato panorámico",
        "exif-planarconfiguration-2": "formato plano",
+       "exif-xyresolution-i": "$1 ppp",
        "exif-colorspace-65535": "Sin calibrar",
        "exif-componentsconfiguration-0": "no existe",
        "exif-exposureprogram-0": "No definido",
        "confirm-unwatch-button": "Aceptar",
        "confirm-unwatch-top": "¿Quitar esta página de tu lista de seguimiento?",
        "comma-separator": ",&#32;",
+       "percent": "$1 %",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← página anterior",
        "imgmultipagenext": "siguiente página →",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desactivado''')",
        "mediastatistics": "Estadísticas de multimedia",
        "mediastatistics-summary": "Estadísticas sobre los tipos de archivos cargados. Sólo se incluyen las versiones más recientes. Los archivos antiguos o eliminados están excluidos.",
+       "mediastatistics-nfiles": "$1 ($2 %)",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 ''byte''|$1 ''bytes''}} ($2; $3 %)",
        "mediastatistics-table-mimetype": "Tipo MIME",
        "mediastatistics-table-extensions": "Extensiones posibles",
index 10a49b8..2d52780 100644 (file)
        "content-model-css": "CSS",
        "content-json-empty-object": "Tühi objekt",
        "content-json-empty-array": "Tühi massiiv",
+       "duplicate-args-warning": "<strong>Hoiatus:</strong> [[:$1]] kutsub malli [[:$2]] nii, et parameetrile \"$3\" vastab rohkem kui üks väärtus. Väärtustest kasutatakse ainult viimast.",
        "duplicate-args-category": "Leheküljed, kus mallikutses on topeltargument",
        "duplicate-args-category-desc": "Lehekülg sisaldab mallikutseid, kus mõnd argumenti on kasutatud mitu korda, näiteks <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> või <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Hoiatus:''' See lehekülg kasutab liialt palju aeglustavaid laiendusfunktsioone. Neid võiks kasutada vähem kui {{PLURAL:$2|ühel|$2}} korral, praegu on kasutatud {{PLURAL:$1|ühel|$1}} korral.",
index 666ac13..d68dc90 100644 (file)
@@ -58,7 +58,7 @@
        "tog-numberheadings": "شماره‌گذاری خودکار عنوان‌ها",
        "tog-showtoolbar": "نوار ابزار ویرایش نمایش یابد",
        "tog-editondblclick": "ویرایش صفحات با دو کلیک",
-       "tog-editsectiononrightclick": "فعالکردن ویرایش بخش‌ها با کلیک راست روی عنوان بخش‌ها",
+       "tog-editsectiononrightclick": "فعال کردن ویرایش بخش‌ها با کلیک راست روی عنوان بخش‌ها",
        "tog-watchcreations": "صفحه‌هایی که می‌سازم و پرونده‌هایی که بارگذاری می‌کنم به فهرست پیگیری‌هایم افزوده شود",
        "tog-watchdefault": "صفحه‌ها و پرونده‌هایی که ویرایش می‌کنم به فهرست پیگیری‌هایم افزوده شود",
        "tog-watchmoves": "صفحه‌ها و پرونده‌هایی که منتقل می‌کنم به فهرست پی‌گیری‌هایم افزوده شود",
        "expiringblock": "در $1 ساعت $2 به پایان می‌رسد",
        "anononlyblock": "فقط کاربران گمنام",
        "noautoblockblock": "بستن خودکار غیرفعال است",
-       "createaccountblock": "اÙ\85کاÙ\86 Ø§Û\8cجاد Ø­Ø³Ø§Ø¨ Ù\85سدÙ\88د Ø§Ø³Øª",
-       "emailblock": "ایمیل مسدود شد",
+       "createaccountblock": "اÙ\85کاÙ\86 Ø³Ø§Ø®Øª Ø­Ø³Ø§Ø¨ Ú¯Ø±Ù\81تÙ\87â\80\8cشدÙ\87",
+       "emailblock": "ایمیل بسته‌شده",
        "blocklist-nousertalk": "نمی تواند صفحهٔ بحث خود را ویرایش کند",
        "ipblocklist-empty": "فهرست بسته‌شدن‌ها خالی‌است.",
        "ipblocklist-no-results": "دسترسی حساب کاربری یا نشانی آی‌پی مورد نظر قطع نیست.",
        "block-log-flags-anononly": "فقط کاربران گمنام",
        "block-log-flags-nocreate": "قابلیت ایجاد حساب غیرفعال شد",
        "block-log-flags-noautoblock": "قطع دسترسی خودکار غیرفعال شد",
-       "block-log-flags-noemail": "ایمیل مسدود شد",
+       "block-log-flags-noemail": "ایمیل بسته‌شد",
        "block-log-flags-nousertalk": "صفحهٔ بحث خود را نمی‌تواند ویرایش کند",
        "block-log-flags-angry-autoblock": "قطع دسترسی خودکار پیشرفته فعال شد",
        "block-log-flags-hiddenname": "نام کاربری پنهان",
index 640227a..89f878d 100644 (file)
        "unusedimages": "Käyttämättömät tiedostot",
        "wantedcategories": "Halutut luokat",
        "wantedpages": "Halutut sivut",
-       "wantedpages-summary": "Luettelo olemattomista sivuista, joihin johtaa eniten linkkejä. Luettelossa ei kuitenkaan ole sellaisia sivuja, joihin johtaa ainoastaan uudelleenohjauksia. Jos haluat nähdä luettelon niistä olemattomista sivuista, joihin on linkki uudelleenohjauksista, katso sivua [[{{#special:BrokenRedirects}}]].",
+       "wantedpages-summary": "Luettelo olemattomista sivuista, joihin johtaa eniten linkkejä. Luettelossa ei kuitenkaan ole sellaisia sivuja, joihin johtaa ainoastaan uudelleenohjauksia. Jos haluat nähdä luettelon niistä olemattomista sivuista, joihin on linkki uudelleenohjauksista, katso [[{{#special:BrokenRedirects}}|luettelo virheellisistä ohjauksista]].",
        "wantedpages-badtitle": "Virheellinen otsikko tuloksissa: $1",
        "wantedfiles": "Halutut tiedostot",
        "wantedfiletext-cat": "Seuraavia tiedostoja käytetään, mutta niitä ei ole olemassa. Ulkopuolissa mediavarastoissa olevat tiedostot voivat näkyä tällä listalla, vaikka ne ovat olemassa. Tällaiset väärät merkinnät on <del>yliviivattu</del>. Lisäksi sellaiset sivut, joihin on sisällytetty tiedostoja, jotka eivät ole olemassa, on luetteloitu [[:$1|täällä]].",
index 5a24696..c6b998a 100644 (file)
        "content-model-css": "CSS",
        "content-json-empty-object": "Obxecto baleiro",
        "content-json-empty-array": "Matriz baleira",
+       "duplicate-args-warning": "<strong>Advertencia:</strong> [[:$1]] está chamando a [[:$2]] con máis dun valor para o parámetro \"$3\". Só se usará o último valor proporcionado.",
        "duplicate-args-category": "Páxinas con argumentos duplicados nas chamadas aos modelos",
        "duplicate-args-category-desc": "Esta páxina contén as chamadas aos modelos que utilizan argumentos duplicados, como <code><nowiki>{{exemplo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{exemplo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Aviso:''' Esta páxina contén demasiadas chamadas a funcións analíticas custosas.\n\nDebe ter menos {{PLURAL:$2|dunha chamada|de $2 chamadas}}, e agora hai $1.",
        "feedback-cancel": "Cancelar",
        "feedback-close": "Feito",
        "feedback-external-bug-report-button": "Gardar unha tarefa técnica",
-       "feedback-dialog-title": "Enviar opinión",
-       "feedback-dialog-intro": "Pode usar o formulario simple de abaixo para enviar a súa opinión. O seu comentario será engadido á páxina \"$1\", xunto co seu nome de usuario.",
+       "feedback-dialog-title": "Enviar comentarios",
+       "feedback-dialog-intro": "Pode usar o formulario simple de abaixo para enviar os seus comentarios sobre o editor visual. O seu comentario será engadido á páxina \"$1\", xunto co seu nome de usuario.",
        "feedback-error-title": "Erro",
        "feedback-error1": "Erro: Resultado da API non recoñecido",
        "feedback-error2": "Erro: Fallo de edición",
index 65767a6..478b55e 100644 (file)
        "createacct-submit": "तुमचे खातें तयार करात",
        "createacct-another-submit": "दुसरें खातें तयार कर",
        "createacct-benefit-heading": "{{SITENAME}}तुमच्या सारख्या लोकांनी केल्लो",
-       "createacct-benefit-body1": "{{PLURAL:$1|संपादन|संपादन}}",
+       "createacct-benefit-body1": "{{बहुवचन:$1|संपादन|संपादना}}",
        "createacct-benefit-body2": "{{PLURAL:$1|पान|पानां}}",
-       "createacct-benefit-body3": "सद्याचे{{PLURAL:$1|योगदान करपी|योगदान करपी}}",
+       "createacct-benefit-body3": "सद्याचे{{बहुवचन:$1|योगदान करपी|ते योगदान करपी}}",
        "badretype": "तुवें घातिल्लीं गुपीत उतरां जुळनात",
        "userexists": "घातिल्लें वापरप्याचें नांव पयलींच वापरांत आसा.\nउपकार करून दुसरें नांव वेंच",
        "loginerror": "लॉन इन त्रुटी",
        "shown-title": "दर एका पानार {{PLURAL:$1|निकाल}}दाखय",
        "viewprevnext": "पळयात ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "ह्या'''विकीचेर \"[[:$1]]\" ह्या नांवाचें पान आसा .''' {{PLURAL:$2|0=|See also the other search results found.}}",
-       "searchmenu-new": "हà¥\8dया à¤µà¤¿à¤\95à¥\80à¤\9aà¥\87र $1 à¤¹à¥\87à¤\82 à¤ªà¤¾à¤¨ à¤¤à¤¯à¤¾à¤° à¤\95रात, {{PLURAL:$2|}} à¤¤à¥\81मà¤\9aà¥\8dया à¤¸à¥\8bदाà¤\82तलà¥\8dयान à¤®à¥\87ळिलà¥\8dलà¥\87à¤\82 à¤ªà¤¾à¤¨à¤¯ à¤ªà¤³à¥\87यात. / à¤¸à¥\8bà¤\82दाà¤\82तलà¥\8dयान मेळिल्ले निकाळय पळेयात.",
+       "searchmenu-new": "हà¥\8dया à¤µà¤¿à¤\95à¥\80à¤\9aà¥\87र $1 à¤¹à¥\87à¤\82 à¤ªà¤¾à¤¨ à¤¤à¤¯à¤¾à¤° à¤\95रात, {{PLURAL:$2|}} à¤¸à¥\8bदà¥\82न à¤®à¥\87ळिलà¥\8dलà¥\87à¤\82 à¤ªà¤¾à¤¨à¤¯ à¤ªà¤³à¥\87यात. / à¤¸à¥\8bदà¥\82न मेळिल्ले निकाळय पळेयात.",
        "searchprofile-articles": "मजकूराचीं पानां",
        "searchprofile-images": "मल्टीमिडीया",
        "searchprofile-everything": "जणेकलें",
        "minoreditletter": "म",
        "newpageletter": "न",
        "boteditletter": "ब",
-       "rc-change-size-new": "बदला उपरांत $1",
+       "rc-change-size-new": "$1 {{बहुवचन:$1|byte|bytes}}बदल केल्या उपरांत",
        "rc-enhanced-expand": "म्हायती दाखय",
        "rc-enhanced-hide": "म्हायती लिपय",
        "recentchangeslinked": "संबंदातले बदल",
        "recentchangeslinked-toolbox": "संबंदीत बदल",
        "recentchangeslinked-title": "\"$1\" च्या संबंदातले बदल",
-       "recentchangeslinked-summary": "à¤\96ाशà¥\87लà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\82 à¤\95डलà¥\8dयान à¤\9cà¥\8bडणà¥\80 à¤®à¥\87ळिलà¥\8dलà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\82मदà¥\80à¤\82 (वा à¤µà¤¿à¤¶à¤¿à¤¶à¥\8dà¤\9f à¤¶à¥\8dरà¥\87णà¥\80à¤\9aà¥\8dया à¤µà¤¾à¤\82à¤\97डà¥\8dयाà¤\82मदà¥\80à¤\82)हालà¥\80à¤\82à¤\9a à¤\95à¥\87लà¥\8dलà¥\8dया à¤¬à¤¦à¤²à¤¾à¤\82à¤\9aà¥\80 à¤¹à¥\80 à¤µà¤³à¥\87रà¥\80. à¤¤à¥\81मà¤\9aà¥\8dया à¤²à¤\95à¥\8dष à¤µà¤³à¥\87रà¥\87à¤\82तलà¥\80à¤\82 à¤ªà¤¾à¤¨à¤¾ '''ठळà¤\95''' à¤¦à¤¾à¤\96यलà¥\8dयाà¤\82त",
+       "recentchangeslinked-summary": "खाशेल्या पानां कडल्यान जोडणी मेळिल्ल्या पानांमदीं (वा विशिश्ट श्रेणीच्या वांगड्यांमदीं)हालींच केल्ल्या बदलांची ही वळेरी. तुमच्या लक्ष वळेरेंतलीं पाना '''ठळक''' दाखयल्यात",
        "recentchangeslinked-page": "पानाचें नांव",
        "recentchangeslinked-to": "ह्या पाना बदला दिल्ल्या पानांक जुळून आशिल्ल्या पानांचे बदल दाखय",
        "upload": "फायल अपलोड करात",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|उलोवप]])",
        "specialpages": "खाशेलीं पानां",
        "tag-filter": "[[Special:Tags|लेबल]]गाळणो:",
-       "tag-list-wrapper": "([[Special:कुरवेचीट|{{PLURAL:$1|कुरवेचीट|कुरवेचीटी}}]]: $2)",
+       "tag-list-wrapper": "([[विशेश:कुरवेचीट|{{बहुवचन:$1|कुरवेचीट|कुरवेचीटी}}]]: $2)",
        "logentry-delete-delete": "$1 {{GENDER:$2|काडून उडयल्ले पान}} $3",
        "logentry-move-move": "$1 न $3 पानाचेर $4 {{GENDER:$2|हालयला}}",
        "logentry-newusers-create": "उपयोगकत्याचें $1 {{लिंग:$2|तयार केलें}}",
index 8517748..630adae 100644 (file)
        "content-model-css": "सी॰एस॰एस",
        "content-json-empty-object": "रिक्त ऑब्जेक्ट",
        "content-json-empty-array": "रिक्त ऐरे",
+       "duplicate-args-warning": "<strong>चेतावनी:</strong> [[:$1]] प्राचल \"$3\" के लिए [[:$2]] को एक से अधिक बार काम में ले रहा है। केवल अन्त में दिया गया मान ही काम में लिया जायेगा।",
        "duplicate-args-category": "टेम्पलेट कॉल में डुप्लिकेट तर्क का उपयोग करते हुए पन्ने",
        "duplicate-args-category-desc": "पेज जैसे तर्कों के डुप्लिकेट का उपयोग करने वाले टेम्पलेट कॉल, जैसे <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ओैर <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''चेतावनी:''' इस पृष्ठ पर बहुत अधिक संख्या में कीमती पार्सर फ़ंक्शनों का प्रयोग किया गया है।\n\nइनका प्रयोग $2 से कम बार होना चाहिये, इस समय प्रयोग $1 बार {{PLURAL:$1|है|हैं}}।",
        "uploaddisabledtext": "फ़ाइल अपलोड अक्षम हैं।",
        "php-uploaddisabledtext": "पी॰एच॰पी में फ़ाइल अपलोड बंद हैं।\nकृपया file_uploads जमाव की जाँच करें।",
        "uploadscripted": "इस फ़ाइल में एच॰टी॰एम॰एल या स्क्रिप्ट कोड है, जो वेब ब्राउज़र द्वारा गलत पढ़ा जा सकता है।",
+       "upload-scripted-pi-callback": "उस फाइल को अपलोड नहीं किया जा सकता जिसमें एक्सएमएल-स्टाइलशीट प्रसंस्करण निर्देश समाविष्ट हैं।",
+       "uploaded-script-svg": "अपलोड की गयी एसवीजी फ़ाइल में स्क्रीप्ट अवयव \"$1\" पाया गया।",
+       "uploaded-hostile-svg": "अपलोड की गयी एसवीजी फाइल के शैली अवयव में असुरक्षित सीएसएस पायी गयी।",
+       "uploaded-event-handler-on-svg": "सेटिंग ईवेंट हैंडलर (आयोजन प्रबन्धनकर्ता वरियता) <code>$1=\"$2\"</code> एसवीजी फ़ाइल में अनुमत नहीं है।",
+       "uploaded-href-attribute-svg": "गैर-स्थानीय लक्ष्य के साथ एचआरईऍफ श्रेय (Href attributes) <code>&lt;$1 $2=\"$3\"&gt;</code> (उदाहरण के लिए http://, जावास्क्रीप्ट:, इत्यादि) एसवीजी फाइल में अनुमत नहीं हैं।",
+       "uploaded-href-unsafe-target-svg": "अपलोड की गयी फ़ाइल में असुरक्षित लक्ष्य <code>&lt;$1 $2=\"$3\"&gt;</code> पाये गए।",
+       "uploaded-animate-svg": "चिप्पि \"animate\" पायी गई जिससे href परिवर्तित हो सकता है, अपलोड की गयी फ़ाइल में \"from\" विशेषता <code>&lt;$1 $2=\"$3\"&gt;</code> काम में ली जा रही है।",
        "uploadscriptednamespace": "इस एस॰वी॰जी फ़ाइल में अमान्य नामस्थान \"$1\" है।",
        "uploadinvalidxml": "अपलोड की गई फ़ाइल में स्थित XML पार्स नहीं की जा सकी।",
        "uploadvirus": "इस फ़ाइल में व्हाईरस हैं! अधिक जानकारी: $1",
index 7b0d948..4cadd83 100644 (file)
@@ -47,7 +47,8 @@
                        "Twotwo2019",
                        "SeoJeongHo",
                        "Banwol",
-                       "Ysjbserver"
+                       "Ysjbserver",
+                       "LiteHell"
                ]
        },
        "tog-underline": "링크에 밑줄:",
        "uploaddisabledtext": "파일 올리기 기능이 비활성화되어 있습니다.",
        "php-uploaddisabledtext": "PHP 파일 올리기가 비활성화되었습니다. 파일 올리기 설정을 확인하십시오.",
        "uploadscripted": "이 파일에는 HTML이나 다른 스크립트 코드가 포함되어 있어, 웹 브라우저에서 오류를 일으킬 수 있습니다.",
+       "uploaded-remote-url-svg": "원격 URL로 style 속성이 설정된 SVG파일은 금지됩니다. 업로드된 SVG 파일에서 <code>$1=\"$2\"</code>를 발견하였습니다.",
        "uploadscriptednamespace": "이 SVG 파일은 사용할 수 없는 이름공간 '$1'을 포함하고 있습니다.",
        "uploadinvalidxml": "업로드된 파일의 XML의 구문을 분석할 수 없습니다.",
        "uploadvirus": "파일이 바이러스를 포함하고 있습니다!\n자세한 설명: $1",
index 94af3dc..fa0fa1b 100644 (file)
        "translateinterface": "Övversäzonge för <stron>alle</strong> Wikis jonn blohß op [//translatewiki.net/ translatewiki.net], woh mer MedijaWiki övversaz weed.",
        "cascadeprotected": "Die Sigg es jeschöz, un mer kann se nit ändere. Se es en en Schotz-Kaskad enjebonge, zosamme met dä {{PLURAL:$1|Sigg|Sigge}}:\n$2",
        "namespaceprotected": "Do darfs Sigge em Appachtemang „$1“ nit ändere.",
-       "customcssprotected": "Do darfs di <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Cascading Style Sheet\">CSS</i>-Sigg heh nit ändere. Se jehööd enem andere Metmacher, un es e Schtöck fun dämm sing Enschtällonge.",
-       "customjsprotected": "Do darfs di JavaSkep-Sigg heh nit ändere. Se jehööd enem anndere Metmacher, un es e Schtöck fun dämm sing Enschtällonge.",
+       "customcssprotected": "Do darfs di <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Cascading Style Sheet\">CSS</i>-Sigg heh nit ändere. Se jehööd enem andere Metmaacher, un es e Schtök fun dämm singe Enschtällonge.",
+       "customjsprotected": "Do darfs di JavaSkep-Sigg heh nit änndere. Se jehööd enem anndere Metmaacher, un es e Schtök fun dämm singe Enschtällonge.",
        "mycustomcssprotected": "Do häs nit dat Rääsch, he di Sigg med enem <i lang=\"en\" xml:lang=\"en\">CSS</i> ze verändere.",
        "mycustomjsprotected": "Do häs nit dat Rääsch, he di Sigg med enem JavaSkrep ze verändere.",
        "myprivateinfoprotected": "Do häs nit dat Rääsch, Ding päsöönlesche Aanjaabe ze verändere.",
        "cannotchangeemail": "Sing <i lang=\"en\">e-mail<i> Addreß kam_mer ehe em Wiki nit ändere.",
        "emaildisabled": "Heh dat Wiki kann kein <i lang=\"en\">e-mails</i> verschecke.",
        "accountcreated": "Aanjemeldt",
-       "accountcreatedtext": "De Aanmeldung för dä Metmaacher [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|{{{int:talk/ksh}}}]]) es fäädesch.",
+       "accountcreatedtext": "De Aanmeldung för dä Metmaacher [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|{{{int:talk/ksh}}}]]) es fähdesch.",
        "createaccount-title": "Enne neue Metmaacher aanmelde för {{GRAMMAR:Akkusativ|{{SITENAME}}}}",
        "createaccount-text": "Einer hät Desch als Metmaacher „$2“ {{GRAMMAR:em|{{SITENAME}}}} aanjemälldt.\nDat es e Wikki, un De fengks et onger däm URL:\n $4\nDat Paßwoot „$3“ hät sesch dat Wiki för Desch usjewörfelt.\nDon jlisch enlogge un donn et änndere.\n\nWann Dat all böömesch Dörver för Desch sin, da fojeß heh di\ne-mail eijfach. Wann De en däm Wikki nit metmaache wells, och.",
        "login-throttled": "Do häs zo öff, zo vill, un zo lang en de letzde Zick probeet, ennzelogge.\nWaad e Wielsche ävver $1, ih dat De et wider versöhks.",
        "undo-summary-username-hidden": "Nemm di Väsjohn $1 vun enem verschtoche Metmaacher widder retuur.",
        "cantcreateaccounttitle": "Kann keine Zojang enrichte",
        "cantcreateaccount-text": "Dä [[User:$3|$3]] hät verbodde, dat mer sich vun dä IP-Adress '''$1''' uß als ene neue Metmaacher aanmelde könne soll.\n\nAls Jrund för et Sperre es enjedraare: ''$2''",
-       "cantcreateaccount-range-text": "Ne neue Metmacher aanmälde vun <i lang=\"en\" xml:lang=\"en\">IP</i>-Adräße em Berett vun <strong>$1</strong>, woh de Dinge dren es, wood vum {{GENDER:$3|vum|vum|vumm Metmaacher|vun dä|vum}} [[User:$3|$3]] verbodde.\nDer Jrond: <em><$2</em>\n\nDing <i lang=\"en\" xml:lang=\"en\">IP</i>-Adräß es: <strong>$4</strong>",
+       "cantcreateaccount-range-text": "Ne neue Metmaacher aanmälde vun <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräße em Berett vun <strong>$1</strong>, woh de Dinge dren es, wood vum {{GENDER:$3|vum|vum|vumm Metmaacher|vun dä|vum}} [[User:$3|$3]] verbodde.\nDer Jrond: <em><$2</em>\n\nDing <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräß es: <strong>$4</strong>",
        "viewpagelogs": "De Logböcher för heh di Sigg beloore",
        "nohistory": "Et jitt kei fottjeschmesse, zeröckhollba Versione vun dä Sigg.",
        "currentrev": "Neuste Väsjohn",
        "group-suppress": "Kontrollettis",
        "group-all": "(jeede)",
        "group-user-member": "{{GENDER:$1|Metmaacher|Metmaacherėn}}",
-       "group-autoconfirmed-member": "automattesch beshtääteshte {{GENDER:$1|Metmaacher|Metmaacherėn}}",
+       "group-autoconfirmed-member": "automattesch beschtähteschte {{GENDER:$1|Metmaacher|Metmaacherėn|Metmaacher|Metmaacherėn|Metmaacher}}",
        "group-bot-member": "{{GENDER:$1|Bot}}",
        "group-sysop-member": "{{GENDER:$1|Wiki-Köbes}}",
        "group-bureaucrat-member": "{{GENDER:$1|Bürrokraad|Bürrokraadefrou}}",
        "watching": "Drobb oppaßße…",
        "unwatching": "Nimmih drobb oppaßße",
        "watcherrortext": "Ene Fähler es opjetrodde beim Ändere vun de Enshtällonge för Ding Oppaßleß för „$1“",
-       "enotif_reset": "Saz all Änderonge op „Aanjeluurt“, un fäädesch.",
+       "enotif_reset": "Saz alle Änderonge op „Aanjeluhrt“, un fähdesch.",
        "enotif_impersonal_salutation": "Metmaacher {{GRAMMAR:Genitiv vun|{{SITENAME}}}}",
        "enotif_subject_deleted": "{{GENDER:$2|Dä Metmaacher|Et|Dä Metmaacher|De Metmaacherėn|Dä Metmaacher}} $2 hät di Sigg $1 {{GRAMMAR:en 3|{{ucfirst:{{SITENAME}}}}}} fott jeschmeße.",
        "enotif_subject_created": "{{GENDER:$2|Dä Metmaacher|Et|Dä Metmaacher|De Metmaacherėn|Dä Metmaacher}} $2 hät di Sigg $1 {{GRAMMAR:en 3|{{ucfirst:{{SITENAME}}}}}} aanjelaat.",
        "common.css": "/* CSS heh aan dä Stell hät Uswirkunge op all Ovverflääsche */",
        "print.css": "/* CSS heh aan dä Stell wirrek nur op et Sigge Drökke */",
        "noscript.css": "/* Dat CSS heh aan dä Stell krijje nur de Metmaacher met affjeschaldt JavaSkrepp jescheck */",
-       "group-autoconfirmed.css": "/* Dat CSS heh aan dä Stell krijje nur de automattesch beshtääteshte Metmacher jescheck */",
+       "group-autoconfirmed.css": "/* Dat CSS heh aan dä Stell krijje nur de automattesch beschtähteschte Metmaacher jescheck */",
        "group-user.css": "/* Dat CSS heh aan dä Schtäll wirrek sesch nur op de enjeloggte Metmaacher uß */",
        "group-bot.css": "/* Dat CSS heh aan dä Stell krijje nur de Bot-Projrammee jescheck */",
        "group-sysop.css": "/* Dat CSS heh aan dä Stell krijje nur dem Wiki sing Köbeße jescheck */",
index 6cd1b50..8270157 100644 (file)
        "permissionserrors": "Çewtiyê destûrê",
        "permissionserrorstext": "Tu nikanê vê tiştî bikê, ji bo {{PLURAL:$1|vê sedemê|van sedeman}}:",
        "permissionserrorstext-withaction": "Mafên te bo $2 tune ye ji bo {{PLURAL:$1|vê sedemê|van sedeman}}:",
-       "recreate-moveddeleted-warn": "'''Zanibe: Tu kê rûpelekê çêkê yê niha hate jêbirin!'''\n\nZanibe ku nuhçêkirinê vê rûpelê hêja ye ya na.\nÎnformasyon li ser jêbirinê vê rûpelê li vir e:",
+       "recreate-moveddeleted-warn": "<strong>Zanibe: Tu kê rûpelekê çêkê yê niha hate jêbirin!</strong>\n\nZanibe ku nuhçêkirinê vê rûpelê hêja ye ya na.\nÎnformasyon li ser jêbirinê vê rûpelê li vir e:",
        "moveddeleted-notice": "Ev rûpel hatiye jêbirin.\nSedema jêbirina rûpelê bi referansa li jêr hatiye piştrastkirin.",
        "log-fulllog": "Tevahiya wê bibîne",
        "edit-conflict": "Têkçûna guherandinan.",
        "rcshowhideminor-hide": "veşêre",
        "rcshowhidebots": "Bot'an $1",
        "rcshowhidebots-show": "nîşan bide",
-       "rcshowhidebots-hide": "Veşêre",
+       "rcshowhidebots-hide": "veşêre",
        "rcshowhideliu": "Bikarhênerên tomarkirî $1",
        "rcshowhideliu-show": "nîşan bide",
        "rcshowhideliu-hide": "veşêre",
        "rcshowhideanons": "Bikarhênerên netomarkirî (IP) $1",
-       "rcshowhideanons-show": "Nîşan bide",
-       "rcshowhideanons-hide": "Veşêre",
+       "rcshowhideanons-show": "nîşan bide",
+       "rcshowhideanons-hide": "veşêre",
        "rcshowhidepatr": "Guherandinên kontrolkirî $1",
        "rcshowhidepatr-show": "Nîşan bide",
        "rcshowhidepatr-hide": "Veşêre",
        "brokenredirects-delete": "jê bibe",
        "withoutinterwiki": "Rûpelên bê girêdanên ziman",
        "withoutinterwiki-legend": "Pêşbendik",
-       "withoutinterwiki-submit": "Nîşan bide",
+       "withoutinterwiki-submit": "nîşan bide",
        "nbytes": "$1 {{PLURAL:$1|byte|byte}}",
        "ncategories": "$1 {{PLURAL:$1|Kategorî|Kategorî}}",
        "nlinks": "$1 {{PLURAL:$1|girêdan|girêdan}}",
        "linksearch": "Lêgerîna girêdanên derve",
        "linksearch-ns": "Valahiya nav:",
        "linksearch-ok": "Lêgerîn",
-       "listusers-submit": "Nîşan bide",
+       "listusers-submit": "nîşan bide",
        "listusers-noresult": "Bikarhêner nehate dîtin.",
        "listusers-blocked": "(hate astengkirin)",
        "activeusers": "Lîsteya bikarhênerên çalak",
index eafb346..7ea0395 100644 (file)
        "thumbnail_gd-library": "अपूर्ण जी.डी.पुस्तकालय विन्यास: प्रकार्य $1 अनुपस्थित",
        "thumbnail_image-missing": "संचिका लगैए अनुपस्थित अछि: $1",
        "import": "पन्ना सभकेँ आनू",
-       "importinterwiki": "à¤\9fà¥\8dरानà¥\8dसविà¤\95à¥\80 à¤\86नà¥\82",
-       "import-interwiki-text": "à¤\8fà¤\95à¤\9fा à¤µà¤¿à¤\95à¥\80 à¤\86 à¤ªà¤¨à¥\8dना à¤¶à¥\80रà¥\8dषà¤\95 à¤\85नबालà¥\87 à¤\9aà¥\81नà¥\82।\nसà¤\82शà¥\8bधन à¤¤à¤¿à¤¥à¤¿ à¤\86 à¤¸à¤®à¥\8dपादà¤\95à¤\95 à¤¨à¤¾à¤® à¤¸à¥\81रà¤\95à¥\8dषित à¤°à¤¹à¤¤à¥¤\nसभà¤\9fा à¤\9fà¥\8dरानà¥\8dसविà¤\95à¥\80 à¤\86यात à¤\95à¥\8dरिया à¤¸à¤®à¥\8dपà¥\8dरवà¥\87शित à¤\85à¤\9bि [[Special:Log/import|import log]] à¤ªà¤°।",
+       "importinterwiki": "à¤\95à¥\8bनà¥\8b à¤\94र à¤µà¤¿à¤\95ि à¤¸à¤\81 à¤\86यात à¤\95रà¥\80",
+       "import-interwiki-text": "à¤\8fà¤\95à¤\9fा à¤µà¤¿à¤\95à¥\80 à¤\86 à¤ªà¤¨à¥\8dना à¤¶à¥\80रà¥\8dषà¤\95 à¤\86नà¥\88लà¥\87ल à¤\9aà¥\81नà¥\82।\nसà¤\82शà¥\8bधन à¤¤à¤¿à¤¥à¤¿ à¤\86 à¤¸à¤®à¥\8dपादà¤\95à¤\95 à¤¨à¤¾à¤® à¤¸à¥\81रà¤\95à¥\8dषित à¤°à¤¹à¤¤à¥¤\nसभà¤\9fा à¤\9fà¥\8dरानà¥\8dसविà¤\95à¥\80 à¤\86यात à¤\95à¥\8dरिया à¤¸à¤®à¥\8dपà¥\8dरवà¥\87शित [[Special:Log/import|à¤\86यात à¤²à¤\97]] à¤ªà¤° à¤°à¤¹à¤¤।",
        "import-interwiki-sourcewiki": "मूल विकि:",
        "import-interwiki-sourcepage": "मूल पन्ना:",
        "import-interwiki-history": "अए पन्नाक सभटा इतिहास संशोधनक द्वितीयक बनाउ",
        "import-interwiki-templates": "सभटा नमूना शामिल करू",
        "import-interwiki-submit": "आनू",
+       "import-mapping-default": "पूर्व निर्धारित स्थान सभ पर आयात करी",
+       "import-mapping-namespace": "कोनो नामस्थान पर आयात करी",
+       "import-mapping-subpage": "निम्न लिखित पृष्ठ के उपपृष्ठ के रूप में आयात करी:",
        "import-upload-filename": "संचिकानाम:",
        "import-comment": "समीक्षा:",
        "importtext": "मूल विकी [[Special:Export|export utility]] क प्रयोग कऽ संचिका पठाउ।\nअपन संगणकमे एकरा सुरक्षित करू आ एतए उपारोपित करू।",
        "import-invalid-interwiki": "विशिष्ट विकीसँ आयात नै कऽ सकै छी।",
        "import-error-edit": "\"$1\" पन्ना आयातित नै कएल गेल अछि कारण अहाँकेँ एकरा सम्पादित करबाक अधिकार नै अछि।",
        "import-error-create": "\"$1\" पन्ना आयातित नै कएल गेल अछि कारण अहाँकेँ एकरा निर्माण करबाक अधिकार नै अछि।",
+       "import-error-interwiki": "पृष्ठ \"$1\" आयात नै केल गेल कियाकि एकर नाम अन्तरविकि जडी बनाबै के लेल आरक्षित अछि।",
+       "import-error-special": "पृष्ठ \"$1\" आयात नै केल गेल कियाकि इ एक एहन विशेष नामस्थान के अन्तर्गत आबैत अछि जे में पृष्ठ पृष्ठ नै बनाएल जा सकैत अछि।",
+       "import-error-invalid": "पृष्ठ \"$1\" आयात नै केल गेल कियाकि इ आयात पश्चात जे नाम रहत यो इ विकी पर अमान्य अछि।",
        "import-options-wrong": "गलत {{PLURAL:$2|विकल्प}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "दयाल गेल उपसर्ग पन्ना शीर्षक अमान्य अछि ।",
        "import-rootpage-nosubpage": "दयाल गेल उपसर्ग पन्ना \"$1\" के नामस्थान में उप-पन्ना नै बनाबाल जा सकएत अछि ।",
        "revdelete-uname-unhid": "प्रयोक्तानाम सोझाँ",
        "revdelete-restricted": "संचालक लेल प्रायोगिक प्रतिबन्ध",
        "revdelete-unrestricted": "संचालक लेल हटाओल प्रतिबन्ध",
+       "logentry-import-upload": "$1 {{GENDER:$2|आयात केल गेल}} $3 संचिका उपारोपन के माध्यम सँ",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|आयात केल गेल}} $3 कोनो और विकि सँ",
+       "logentry-merge-merge": "$1 {{GENDER:$2|विलय केल गेल}} $3 के $4 में (संशोधन $5 धरि)",
        "logentry-move-move": "$1 हटाएल पन्ना $3 सँ $4",
        "logentry-move-move-noredirect": "$1 {{लिंग:$2|हटाएल}} पन्ना $3 सँ $4 घुमौआकेँ बिना छोड़ने",
        "logentry-move-move_redir": "$1 {{लिंग:$2|हटाएल}} पन्ना $3 सँ $4 घुमौआक अतिरिक्त",
        "logentry-newusers-newusers": "$1 {{लिंग:$2|बनाएल}} एकटा प्रयोक्ता खाता",
        "logentry-newusers-create": "$1 {{लिंग:$2|बनाएल}} एकटा प्रयोक्ता खाता",
        "logentry-newusers-create2": "$1 {{लिंग:$2|बनाएल}} {{लिंग:$4|एकटा प्रयोक्ता खाता}} $3",
+       "logentry-newusers-byemail": "$1 द्वारा प्रयोक्ता खाता $3 {{GENDER:$2|बनाओल}} गेल आ कूटशब्द ई-पत्र द्वारा भेजल गेल",
        "logentry-newusers-autocreate": "खाता $1 छल {{लिंग:$2|बनाएल}} स्वतः",
        "logentry-upload-upload": "$1 {{GENDER:$2|ए}} $3 अपलोड केलक",
        "log-name-tag": "ट्याग लग",
        "pagelang-language": "भाषा",
        "pagelang-select-lang": "भाषा चुनु",
        "right-pagelang": "पृष्ठ के भाषा परिवर्तन करू",
-       "action-pagelang": "पृष्ठ के भाषा परिवर्तन करू"
+       "action-pagelang": "पृष्ठ के भाषा परिवर्तन करू",
+       "special-characters-group-latin": "ल्याटिन",
+       "special-characters-group-latinextended": "ल्याटिन विस्तारित",
+       "special-characters-group-ipa": "आइपीए",
+       "special-characters-group-symbols": "प्रतीक",
+       "special-characters-group-greek": "ग्रीक",
+       "special-characters-group-cyrillic": "सिरिलिक",
+       "special-characters-group-arabic": "अरबी",
+       "special-characters-group-arabicextended": "अरबी विस्तारित",
+       "special-characters-group-persian": "फार्सी",
+       "special-characters-group-hebrew": "हिब्रू",
+       "special-characters-group-bangla": "बांग्ला",
+       "special-characters-group-tamil": "तमिल",
+       "special-characters-group-telugu": "तेलूगू",
+       "special-characters-group-sinhala": "सिंहल",
+       "special-characters-group-gujarati": "गुजराती",
+       "special-characters-group-devanagari": "देवनागरी",
+       "special-characters-group-thai": "थाई",
+       "special-characters-group-lao": "लाओ",
+       "special-characters-group-khmer": "खमेर",
+       "special-characters-title-endash": "एन डैश",
+       "special-characters-title-emdash": "एम डैश",
+       "special-characters-title-minus": "ऋण चिह्न"
 }
index 586f217..b99ecee 100644 (file)
        "content-model-css": "CSS",
        "content-json-empty-object": "Празен објект",
        "content-json-empty-array": "Празна низа",
+       "duplicate-args-warning": "<strong>Предупредување:</strong> [[:$1]] го повикува [[:$2]] со повеќе од една вредност за параметарот „$3“. Ќе се употреби само последната вредност.",
        "duplicate-args-category": "Страници што користат дуплирани аргументи во повикувања на шаблони",
        "duplicate-args-category-desc": "Страницава содржи повикувања на шаблони кои се дупликати на аргументи, како што се <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> или <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Предупредување: Оваа страница користи премногу повикувања на parser функции.\n\nТреба да има помалку од $2 {{PLURAL:$2|повикување|повикувања}} а сега има {{PLURAL:$1|$1 повикување|$1 повикувања}}.",
index 2d72967..066a716 100644 (file)
@@ -27,7 +27,8 @@
                        "Vssun",
                        "Ævar Arnfjörð Bjarmason <avarab@gmail.com>",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Viswaprabha"
                ]
        },
        "tog-underline": "കണ്ണികൾക്ക് അടിവരയിടുക:",
        "title-invalid-characters": "ആവശ്യപ്പെട്ട താളിന്റെ തലക്കെട്ടിൽ അസാധുവായ അക്ഷരങ്ങളുണ്ട്: \"$1\".",
        "title-invalid-relative": "തലക്കെട്ടിന് ആപേക്ഷികമായ പഥമാണുള്ളത്. ഉപയോക്താവിന്റെ ബ്രൗസറിൽ നിന്ന് ശ്രമിക്കുമ്പോൾ മിക്കവാറും എത്തിച്ചേരില്ലാത്തതിനാൽ ആപേക്ഷിക താൾ തലക്കെട്ടുകൾ (./, ../) അസാധുവാണ്.",
        "title-invalid-magic-tilde": "ആവശ്യപ്പെട്ട താൾ തലക്കെട്ടിൽ അസാധുവായ മാന്ത്രിക ടിൽഡേ പരമ്പര ഉൾപ്പെടുന്നു (<nowiki>~~~</nowiki>).",
-       "title-invalid-too-long": "à´\86വശàµ\8dയപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9f à´¤à´¾àµ¾ à´¤à´²à´\95àµ\8dà´\95àµ\86à´\9fàµ\8dà´\9fàµ\8d à´¨àµ\80ളമàµ\87റിയതാണàµ\8d. à´¯àµ\81.à´\9fà´¿.à´\8eà´«àµ\8d.-8 à´\8eൻà´\95àµ\8bà´¡à´¿à´\99àµ\8dà´\99ിൽ à´\85തിന് $1 ബൈറ്റുകളിലധികം നീളമുണ്ടാകാൻ പാടില്ല.",
+       "title-invalid-too-long": "à´\88 à´¤à´²à´\95àµ\8dà´\95àµ\86à´\9fàµ\8dà´\9fà´¿à´¨àµ\8dà´±àµ\86 à´¨àµ\80à´³à´\82 à´\95àµ\82à´\9fàµ\81തലാണàµ\81àµ\8d. UTF-8 à´\8eൻà´\95àµ\8bà´¡à´¿à´\99àµ\8dà´\99ിൽ à´¤à´²à´\95àµ\8dà´\95àµ\86à´\9fàµ\8dà´\9fàµ\81à´\95ൾà´\95àµ\8dà´\95് $1 ബൈറ്റുകളിലധികം നീളമുണ്ടാകാൻ പാടില്ല.",
        "title-invalid-leading-colon": "ആവശ്യപ്പെട്ട താൾ തലക്കെട്ടിന്റെയാദ്യം അസാധുവായ അപൂർണ്ണവിരാമം ഉൾപ്പെടുന്നു.",
        "perfcached": "താഴെ കൊടുത്തിരിക്കുന്ന വിവരം ശേഖരിച്ചു വെച്ചിരിക്കുന്നതാണ്, അതുകൊണ്ട് ചിലപ്പോൾ പുതിയതായിരിക്കണമെന്നില്ല. പരമാവധി {{PLURAL:$1|ഒരു ഫലം|$1 ഫലങ്ങൾ}} ശേഖരിച്ചുവെച്ചിരിക്കുന്നവയിൽ ഉണ്ട്.",
        "perfcachedts": "താഴെയുള്ള വിവരങ്ങൾ ശേഖരിച്ച് വെച്ചവയിൽ പെടുന്നു, അവസാനം പുതുക്കിയത് $1-നു ആണ്‌. പരമാവധി {{PLURAL:$4|ഒരു ഫലം|$4 ഫലങ്ങൾ}} ശേഖരിച്ചുവെച്ചിരിക്കുന്നവയിൽ ഉണ്ട്.",
        "userrights-lookup-user": "ഉപയോക്തൃസംഘങ്ങളെ പരിപാലിക്കുക",
        "userrights-user-editname": "ഒരു ഉപയോക്തൃനാമം ടൈപ്പു ചെയ്യുക:",
        "editusergroup": "ഉപയോക്തൃസംഘങ്ങൾ തിരുത്തുക",
-       "editinguser": "'''[[User:$1|$1]]''' എന്ന ഉപയോക്താവിന്റെ ഉപയോക്തൃ അവകാശങ്ങൾ തിരുത്തുന്നു $2",
+       "editinguser": "{{GENDER:$1|user}} <strong>[[User:$1|$1]]</strong> $2 എന്ന ഉപയോക്താവിന്റെ ഉപയോക്തൃ അവകാശങ്ങൾ തിരുത്തുന്നു",
        "userrights-editusergroup": "ഉപയോക്തൃസമൂഹത്തിലെ അംഗത്വം തിരുത്തുക",
        "saveusergroups": "ഉപയോക്തൃസംഘങ്ങൾ സേവ് ചെയ്യുക",
        "userrights-groupsmember": "അംഗത്വമുള്ളത്:",
        "unusedimages": "ഉപയോഗിക്കപ്പെടാത്ത പ്രമാണങ്ങൾ",
        "wantedcategories": "അവശ്യ വർഗ്ഗങ്ങൾ",
        "wantedpages": "അവശ്യ താളുകൾ",
-       "wantedpages-summary": "മറàµ\8dà´±àµ\81താളàµ\81à´\95ളിൽ à´¨à´¿à´¨àµ\8dà´¨àµ\8d à´\8fà´±àµ\8dറവàµ\81മധിà´\95à´\82 à´\95à´£àµ\8dണിà´\9aàµ\87ർതàµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´¨à´¿à´²à´µà´¿à´²à´¿à´²àµ\8dലാതàµ\8dà´¤ à´¤à´¾à´³àµ\81à´\95à´³àµ\81à´\9fàµ\86 à´ªà´\9fàµ\8dà´\9fà´¿à´\95യാണിതàµ\8d, à´¤à´¿à´°à´¿à´\9aàµ\8dà´\9aàµ\81വിà´\9fà´²àµ\81à´\95ൾ à´®à´¾à´¤àµ\8dà´°à´\82 à´\95à´£àµ\8dണി à´\9aàµ\87ർതàµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dനവ à´\92ഴിവാà´\95àµ\8dà´\95ിയിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81. à´¤à´¿à´°à´¿à´\9aàµ\8dà´\9aàµ\81വിà´\9fà´²àµ\81à´\95ൾ à´\95à´£àµ\8dണി à´\9aàµ\87ർതàµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´¨à´¿à´²à´µà´¿à´²à´¿à´²àµ\8dലാതàµ\8dà´¤ à´¤à´¾à´³àµ\81à´\95à´³àµ\81à´\9fàµ\86 à´ªà´\9fàµ\8dà´\9fà´¿à´\95à´¯àµ\8dà´\95àµ\8dà´\95àµ\8d [[{{#special:BrokenRedirects}}]] à´\95ാണàµ\81à´\95.",
+       "wantedpages-summary": "തിരിà´\9aàµ\8dà´\9aàµ\81വിà´\9fà´²àµ\81à´\95ൾ à´\92à´´à´¿à´\95àµ\86, à´®à´±àµ\8dà´±àµ\81താളàµ\81à´\95ളിൽ à´¨à´¿à´¨àµ\8dà´¨àµ\8d à´\8fà´±àµ\8dറവàµ\81മധിà´\95à´\82 à´\95à´£àµ\8dണിà´\9aàµ\87ർതàµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dനതàµ\81à´\82 à´\8eà´¨àµ\8dനാൽ à´¨à´¿à´²à´µà´¿à´²à´¿à´²àµ\8dലാതàµ\8dതതàµ\81മായ à´¤à´¾à´³àµ\81à´\95à´³àµ\81à´\9fàµ\86 à´ªà´\9fàµ\8dà´\9fà´¿à´\95. (തിരിà´\9aàµ\8dà´\9aàµ\81വിà´\9fൽ à´\95à´£àµ\8dണിà´\95ൾ à´\9aàµ\87ർതàµ\8dതിà´\9fàµ\8dà´\9fàµ\81à´£àµ\8dà´\9fàµ\86à´\99àµ\8dà´\95à´¿à´²àµ\81à´\82  à´¨à´¿à´²à´µà´¿à´²à´¿à´²àµ\8dലാതàµ\8dà´¤ à´¤à´¾à´³àµ\81à´\95à´³àµ\81à´\9fàµ\86 à´ªà´\9fàµ\8dà´\9fà´¿à´\95à´¯àµ\8dà´\95àµ\8dà´\95àµ\8d [[{{#special:BrokenRedirects}}]] à´\95ാണàµ\81à´\95).",
        "wantedpages-badtitle": "ഫലങ്ങളുടെ ഗണത്തിൽ അസാധുവായ തലക്കെട്ട്: $1",
        "wantedfiles": "ആവശ്യമുള്ള പ്രമാണങ്ങൾ",
        "wantedfiletext-cat": "താഴെക്കൊടുത്തിരിക്കുന്ന പ്രമാണങ്ങൾ ഉപയോഗിച്ചിട്ടുണ്ടെങ്കിലും നിലവിലില്ല. ബാഹ്യ റെപ്പോസിറ്ററികളിൽ നിന്നുള്ള പ്രമാണങ്ങൾ നിലവിലുണ്ടെങ്കിലും പട്ടികയിൽ ഉൾപ്പെട്ടിട്ടുണ്ടാവാം. അത്തരത്തിൽ തെറ്റായി ഉൾപ്പെടുത്തിയിരിക്കുന്നവ <del>വെട്ടിക്കളയുക</del>. കൂടുതലായി, നിലവിലില്ലാത്ത പ്രമാണങ്ങൾ ഉൾപ്പെടുത്തിയിട്ടുള്ള താളുകൾ കാണാൻ [[:$1]] സന്ദർശിക്കുക.",
index cc74d8f..a6fb249 100644 (file)
        "content-model-css": "CSS",
        "content-json-empty-object": "Oggetto abbacante",
        "content-json-empty-array": "Array abbacante",
+       "duplicate-args-warning": "<strong>Attenziò:</strong> [[:$1]] sta chiammanno [[:$2]] cu cchiù 'e nu volore p' 'o parametro \"$3\". Surtanto ll'urdemo valore s'auserrà.",
        "duplicate-args-category": "Paggene c'ausano argomiente dupprecate dint' 'e chiammate a 'e mudelle",
        "duplicate-args-category-desc": "'A paggena tene chiammate a mudelle c'ausassero argomiente dupprecate, comme p'esempio <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Attenziò:''' Sta paggena cuntene troppe chiammate a 'e funzione parser.\n\nN'avesse 'a tené meno 'e $2, p' 'o mumento ce ne {{PLURAL:$1|stà $1|stanno $1}}.",
index 8ef3e66..bc71992 100644 (file)
@@ -67,7 +67,8 @@
                        "Sikjes",
                        "Robin0van0der0vliet",
                        "Kthoelen",
-                       "Mbch331"
+                       "Mbch331",
+                       "Esketti"
                ]
        },
        "tog-underline": "Koppelingen onderstrepen:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Leeg object",
        "content-json-empty-array": "Lege reeks",
+       "duplicate-args-warning": "<strong>Waarschuwing:</strong> [[:$1]] belt [[:$2]] met meer dan één waarde voor de \"$3\" parameter. Alleen de laatste waarde wordt gebruikt.",
        "duplicate-args-category": "Pagina's met dubbele sjabloonparameters",
        "duplicate-args-category-desc": "De pagina bevat aanroepen van sjablonen waarin hetzelfde argument meerdere keren wordt gebruikt, bijvoorbeeld <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> of <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Waarschuwing:''' deze pagina gebruikt te veel kostbare parserfuncties.\n\nNu {{PLURAL:$1|is|zijn}} het er $1, terwijl het er minder dan $2 {{PLURAL:$2|moet|moeten}} zijn.",
        "uploaddisabledtext": "Het uploaden van bestanden is uitgeschakeld.",
        "php-uploaddisabledtext": "Het uploaden van bestanden is uitgeschakeld in PHP.\nControleer de instelling \"file_uploads\".",
        "uploadscripted": "Dit bestand bevat HTML- of scriptcode die foutief door uw browser kan worden weergegeven.",
+       "upload-scripted-pi-callback": "Kan niet een bestand met de xml-stylesheet uploaden.",
+       "uploaded-script-svg": "Gevonden scriptable element \"$1\" in het geüploade SVG-bestand.",
+       "uploaded-hostile-svg": "Gevonden onveilige CSS in de stijl element van het geüploade SVG-bestand .",
+       "uploaded-event-handler-on-svg": "Het instellen van de event-handler attributen <code>$1=\"$2\"</code> is niet toegestaan in SVG-bestanden.",
+       "uploaded-href-attribute-svg": "Href kenmerken <code><$1 $2=\"$3\"></code> met niet-lokale doel (bijv. http:// javascript:, enz.) zijn niet toegestaan in SVG-bestanden.",
+       "uploaded-href-unsafe-target-svg": "Gevonden href tot onveilige doel <code><$1 $2=\"$3\"></code> in het geüploade SVG-bestand .",
+       "uploaded-animate-svg": "Gevonden \"animeren\" tag die kan veranderen href behulp van de \"uit\" - attribuut <code><$1 $2=\"$3\"></code> in het geüploade svg-bestand.",
+       "uploaded-setting-event-handler-svg": "Het instellen van de event-handler attributen is geblokkeerd, gevonden <code><$1 $2=\"$3\"></code> in het geüploade SVG-bestand.",
+       "uploaded-setting-href-svg": "Met behulp van de \"set\" tag toevoegen \"href\" attribuut te bovenliggende element is geblokkeerd.",
+       "uploaded-wrong-setting-svg": "Met behulp van de \"set\" tag toevoegen van een afstandsbediening/data/script doel aan een kenmerk is geblokkeerd. Gevonden <code><set=\"$1\"></code> in het geüploade SVG-bestand.",
+       "uploaded-setting-handler-svg": "SVG-dat stelt de \"handler\" attribuut met afstandsbediening/data/script geblokkeerd. Gevonden <code>$1=\"$2\"</code> in de SVG-bestand geüpload.",
+       "uploaded-remote-url-svg": "SVG-dat wordt voorzien van een style attribuut met externe URL wordt geblokkeerd. Gevonden <code>$1=\"$2\"</code> in de SVG-bestand geüpload.",
+       "uploaded-image-filter-svg": "Gevonden href tot onveilige doel <code><$1 $2=\"$3\"></code> in het geüploade SVG-bestand .",
        "uploadscriptednamespace": "Dit SVG-bestand bevat een ongeldige naamruimte \"$1\".",
        "uploadinvalidxml": "De XML in het geüploade bestand kon niet worden verwerkt.",
        "uploadvirus": "Het bestand bevat een virus! Details: $1",
        "unusedimages": "Ongebruikte bestanden",
        "wantedcategories": "Niet-bestaande categorieën met de meeste koppelingen",
        "wantedpages": "Niet-bestaande pagina's met koppelingen",
-       "wantedpages-summary": "Lijst met niet-bestaande pagina's waar het meest naar verwezen worden, zonder pagina's waar alleen via doorverwijzingen naar wordt verwezen. Voor een lijst met niet-bestaande pagina's waar doorverwijzingen naar verwijzen, kunt u [[{{#special:BrokenRedirects}}]] gebruiken.",
+       "wantedpages-summary": "Lijst van niet-bestaande pagina 's met de meeste schakels naar hen, met uitsluiting van pagina' s die slechts omleidingen linken naar hen. Voor een lijst van niet-bestaande pagina ' s die omleidingen linken naar hen, zie [[{{#special:BrokenRedirects}}|de lijst van gebroken redirects]].",
        "wantedpages-badtitle": "Ongeldige paginanaam in resultaat: $1",
        "wantedfiles": "Niet-bestaande bestanden met koppelingen",
        "wantedfiletext-cat": "De volgende bestanden worden gebruikt maar bestaan niet. Bestanden van externe repositories kunnen zijn opgenomen in de lijst, ondanks dat ze bestaan. Dergelijke vals positieven worden <del>doorgehaald weergegeven</del>. Pagina's die niet-bestaande bestanden insluiten staan op de pagina [[:$1]].",
index 56cabca..960106c 100644 (file)
        "unwatchthispage": "Fjern overvaking",
        "notanarticle": "Ikkje innhaldsside",
        "notvisiblerev": "Sideversjonen er sletta",
-       "watchlist-details": "{{PLURAL:$1|Éi side|$1 sider}} på overvakingslista di, utan separat teljing av diskusjonssider.",
+       "watchlist-details": "Du har {{PLURAL:$1|éi side|$1 sider}} på overvakingslista di (med tilhøyrande diskusjonssider).",
        "wlheader-enotif": "Funksjonen for endringsmeldingar per e-post er på.",
        "wlheader-showupdated": "Sider som har vorte endra sidan du sist såg på dei er '''utheva'''",
        "wlnote": "Nedanfor er {{PLURAL:$1|den siste endringa|dei siste '''$1''' endringane}} {{PLURAL:$2|den siste timen|dei siste '''$2''' timane}}, for $3, kl. $4.",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|endra}} gruppemedlemskap for $3",
        "logentry-rights-autopromote": "$1 vart automatisk {{GENDER:$2|forfremja}} frå $4 til $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|lasta opp}} $3",
+       "log-name-tag": "Merkelogg",
        "rightsnone": "(ingen)",
        "revdelete-summary": "Samandrag",
        "feedback-adding": "Legg til attendemeldinga til sida...",
index 1bbceb4..afeccc7 100644 (file)
        "content-model-css": "CSS",
        "content-json-empty-object": "Пустой объект",
        "content-json-empty-array": "Пустой массив",
+       "duplicate-args-warning": "<strong>Внимание:</strong> [[:$1]] вызывает [[:$2]] с более чем одним значением параметра «$3». Будет использовано только последнее указанное значение.",
        "duplicate-args-category": "Страницы, использующие повторяющиеся аргументы в вызовах шаблонов",
        "duplicate-args-category-desc": "Страницы, содержащие вызовы шаблонов, использующие повторяющиеся аргументы, такие как <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> или <code><nowiki>{{foo|bar|1=bar}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Внимание!''' Эта страница содержит слишком много вызовов ресурсоёмких функций.\n\nДолжно быть не более {{PLURAL:$2|$2 вызова|$2 вызовов|1=одного вызова}}, в то время как сейчас здесь $1 {{PLURAL:$1|вызов|вызовов|вызова}}.",
        "upload-scripted-pi-callback": "Невозможно загрузить файл, содержащий инструкции обработки таблицы стилей XML.",
        "uploaded-script-svg": "Найден небезопасный элемент с поддержкой сценариев «$1» в загруженном SVG-файле.",
        "uploaded-hostile-svg": "Найден небезопасный CSS-код в элементе стиля загруженного SVG-файла.",
+       "uploaded-event-handler-on-svg": "Установка атрибутов обработчика событий <code>$1=\"$2\"</code> не разрешено для SVG-файлов.",
+       "uploaded-href-attribute-svg": "В SVG-файлах не допускаются href-атрибуты <code>&lt;$1 $2=\"$3\"&gt;</code> с нелокальной целью (т.е. http://, javascript:, и пр.).",
        "uploaded-href-unsafe-target-svg": "В загруженном SVG-файле найдена ссылка на небезопасную цель <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-animate-svg": "Найден тег «animate», который может изменять ссылку с помощью «from»-атрибута <code>&lt;$1 $2=\"$3\"&gt;</code> в загруженном SVG-файле.",
+       "uploaded-setting-event-handler-svg": "Установка атрибутов обработчика событий заблокирована, в загруженном SVG-файле найден код <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-setting-href-svg": "Использование тега «set» для добавления атрибута «href» в родительский элемент заблокировано.",
+       "uploaded-wrong-setting-svg": "Использование тега «set» для добавления в качестве цели удалённого адреса/данных/сценария для любого атрибута заблокировано. В загруженном SVG-файле найдена конструкция <code>&lt;set to=\"$1\"&gt;</code>.",
+       "uploaded-setting-handler-svg": "SVG, который задаёт атрибут «handler» с помощью удалённого адреса/данных/скрипта, блокируется. Найдена конструкция <code>$1=\"$2\"</code> в загруженном SVG-файле.",
+       "uploaded-remote-url-svg": "SVG, который задаёт любой атрибут стиля с помощью удалённого URL-адреса, блокируется. Найдена конструкция <code>$1=\"$2\"</code> в загруженном SVG-файле.",
+       "uploaded-image-filter-svg": "В загруженном SVG-файле найден фильтр изображений с URL-адресом <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploadscriptednamespace": "Этот SVG-файл содержит некорректное пространство имён '$1'",
        "uploadinvalidxml": "XML в загруженном файле не может быть проанализирован.",
        "uploadvirus": "Файл содержит вирус! См. $1",
        "file-nohires": "Нет версии с бо́льшим разрешением.",
        "svg-long-desc": "SVG-файл, номинально $1 × $2 {{PLURAL:$2|пиксель|пикселя|пикселей}}, размер файла: $3",
        "svg-long-desc-animated": "Анимированный SVG-файл, номинально $1 × $2 {{PLURAL:$2|пиксель|пикселя|пикселей}}, размер файла: $3",
-       "svg-long-error": "неправильный SVG-файл: $1",
+       "svg-long-error": "Ð\9dеправильный SVG-файл: $1",
        "show-big-image": "Исходный файл",
        "show-big-image-preview": "Размер при предпросмотре: $1.",
        "show-big-image-other": "{{PLURAL:$2|1=Другое разрешение|Другие разрешения}}: $1.",
index 9badd97..0455ebd 100644 (file)
        "mypage": "पृष्ठम्",
        "mytalk": "सम्भाषणम्",
        "anontalk": "अस्य अन्तर्जालसंविदः (I P address) कृते सम्भाषणम्",
-       "navigation": "सà¤\9eà¥\8dà¤\9aरणà¤\82",
+       "navigation": "सà¤\9eà¥\8dà¤\9aरणमà¥\8d",
        "and": "&#32;तथा च",
        "qbfind": "अन्विष्यताम्",
        "qbbrowse": "अन्विष्यताम्",
        "viewcount": "एतत्पृष्ठं {{PLURAL:$1|एक वारं|$1 वारं}} दृष्टम् अस्ति",
        "protectedpage": "संरक्षितपृष्ठम्",
        "jumpto": "अत्र गम्यताम् :",
-       "jumptonavigation": "सà¤\9eà¥\8dà¤\9aरणà¤\82",
+       "jumptonavigation": "सà¤\9eà¥\8dà¤\9aरणमà¥\8d",
        "jumptosearch": "अन्वेषणम्",
        "view-pool-error": "क्षम्यताम् ! सद्यः वितरकस्य (server) उपरि बहु कार्यभारः अस्ति । \nबहवः जनाः एतत् पृष्ठं पश्यन्तः सन्ति । \nएतत् पृष्ठं पुनर्द्रष्टुं प्रतीक्ष्यताम् । $1",
        "generic-pool-error": "क्षम्यताम् ! सद्यः वितरकस्य (server) उपरि बहु कार्यभारः अस्ति । \nबहवः जनाः एतत् पृष्ठं पश्यन्तः सन्ति । \nएतत् पृष्ठं पुनर्द्रष्टुं प्रतीक्ष्यताम् ।",
index fb8c1d3..9c79ad3 100644 (file)
        "badtitletext": "Lu tìtulu di pàggina addumannatu nun era vàlidu, era vacanti, o vinìa dûn culligamentu intir-linguìsticu o intir-wiki malu fattu.\nPutissi cuntèniri unu o cchiu' ssai caràttiri chi' nun su' cunsintuti ntê tìtula.",
        "title-invalid-empty": "Lu tìtulu addumannatu pâ pàggina è vacanti o puru cunteni sulu lu nomu dûn namespace.",
        "title-invalid-utf8": "Lu tìtulu addumannatu pâ pàggina cunteni na siguenza UTF-8 nun vàlida.",
-       "title-invalid-interwiki": "Lu tìtulu cunteni nu culligamentu interwiki",
+       "title-invalid-interwiki": "Lu tìtulu addumannatu pâ pàggina cunteni ligami interwiki, ca ntê tìtula nun si ponnu adupirari.",
        "title-invalid-talk-namespace": "Lu tìtulu addumannatu pâ pàggina si rifirisci a na pàggina di discussioni ca nun esisti.",
        "title-invalid-characters": "Lu tìtulu addumannatu pâ pàggina cunteni caràttiri nun vàlidi: \"$1\".",
        "title-invalid-relative": "Lu tìtulu havi un caminu rilativu. Li tìtuli di pàggina rilativi (./, ../) nun sunnu boni, picchì spissu nun si ponnu arruvari pi' menzu dî browser di l'utenti.",
        "title-invalid-magic-tilde": "Lu tìtulu addumannatu pâ pàggina cunteni na siguenza maggica di tildi nun vàlida(<nowiki>~~~</nowiki>).",
-       "title-invalid-too-long": "Lu tìtulu addumannatu pâ pàggina è troppu longu. Nun havi a' èssiri cchiu' longu di $1 byte sutta cudìfica UTF-8.",
+       "title-invalid-too-long": "Lu tìtulu addumannatu pâ pàggina è troppu longu. Nun havi a' èssiri cchiu' longu di {{PLURAL:$1|byte}} sutta cudìfica UTF-8.",
        "title-invalid-leading-colon": "Lu tìtulu addumannatu pâ pàggina cunteni nu signu di du punti ô principiu, chi' nun è vàlidu.",
        "perfcached": "Li dati ca sèquinu sunnu stratti di na ''cache'' e putissiru nun èssiri aggiurnati. Ntâ ''cache'' {{PLURAL:$1|capi un risultatu|càpunu $1 risultati}} massimu.",
        "perfcachedts": "Li dati ca sèquinu sunnu stratti di na ''cache'', e furu aggiurnati l'ultima vota ô $1. Ntâ ''cache'' {{PLURAL:$4|capi un risultatu|capunu $4 risultati}} massimu.",
        "content-model-javascript": "JavaScript",
        "content-json-empty-object": "Oggettu vacanti",
        "content-json-empty-array": "Vitturi vacanti",
+       "duplicate-args-warning": "<strong>Accura:</strong> [[:$1]] sta' chiamannu [[:$2]] cu' cchiu' ssai dûn valuri comu paràmitru \"$3\". Sarravi adupiratu sulu l'ùrtimu valuri spicificatu.",
        "duplicate-args-category": "Pàggini chi' cuntènunu chiamati a' template cu' argumenti duplicati",
        "duplicate-args-category-desc": "A pàggina cunteni chiamati a' template chi' adòpirunu argumenti duplicati, comu <code><nowiki>{{pippu|plutu=1|plutu=2}}</nowiki></code> o <code><nowiki>{{pippu|plutu|1=papirinu}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Accura: Sta pàggina cunteni troppi chiamati ê parser functions.\n\nAvissi a èssiri menu di $2, ô mumentu ci {{PLURAL:$1|nn'è $1|nni sunnu $1}}.",
        "userrights-lookup-user": "Gistisci li gruppi di l'utenti",
        "userrights-user-editname": "Metti nu nomu utenti:",
        "editusergroup": "Cancia li gruppi di l'utenti",
-       "editinguser": "Canciamentu dî dritti di l'utenti <strong>[[User:$1|$1]]</strong> $2",
+       "editinguser": "Stai canciannu li dritti di {{GENDER:$1|l'utenti}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Cancia li gruppi di l'utenti",
        "saveusergroups": "Sarva li gruppi di l'utenti",
        "userrights-groupsmember": "Membru di:",
        "uploaddisabledtext": "Li carricamenti dî file sunnu disattivati.",
        "php-uploaddisabledtext": "Li carricamenti dî file sunnu disattivati ntô PHP.\nPi' favuri cuntrolla la mpustazzioni file_uploads.",
        "uploadscripted": "Stu file cunteni còdici HTML o di script, ca putissi èssiri ntirpitratu erruniamenti d'un browser web.",
+       "upload-scripted-pi-callback": "Nun si ponnu carricari file ca cuntènunu l'istruzzioni di prucessu xml-stylesheet.",
+       "uploaded-script-svg": "Fu' truvatu n'elimentu prugrammàbbili \"$1\" ntô file SVG carricatu.",
+       "uploaded-hostile-svg": "Fu' truvatu còdici CSS risicusu nta l'elimentu style dû file SVG carricatu.",
+       "uploaded-event-handler-on-svg": "Nun è cunsintutu di mpustari l'attribbuti gistura di eventi <code>$1=\"$2\"</code> ntê file SVG.",
+       "uploaded-href-attribute-svg": "Nun sunnu cunsintuti l'attribbuti href <code>&lt;$1 $2=\"$3\"&gt;</code> cu na distinazzioni ca nun è lucali (ad esempiu http://, javascript:, etc) ntê file SVG.",
+       "uploaded-href-unsafe-target-svg": "Fu' truvatu n'href cu na distinazzioni risicusa <code>&lt;$1 $2=\"$3\"&gt;</code> ntô file SVG carricatu.",
+       "uploaded-animate-svg": "Fu' truvata n'etichetta \"animate\" ca purrìa canciari href, adupirannu l'attribbutu \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code>, ntô file SVG carricatu.",
+       "uploaded-setting-event-handler-svg": "Lu mpustari l'attribbuti dî gistura di l'eventi veni bluccatu; fu' truvatu <code>&lt;$1 $2=\"$3\"&gt;</code> ntô file SVG carricatu.",
+       "uploaded-setting-href-svg": "L'adupirari l'etichetta \"set\" p'agghiùnciri n'attribbutu \"href\" a' l'elimentu ginituri veni bluccatu.",
+       "uploaded-wrong-setting-svg": "L'adupirari l'etichetta \"set\" p'agghiùnciri na distinazzioni rimota/data/script a n'attribbutu quali è jè, è bluccatu. Fu' truvatu <code>&lt;set to=\"$1\"&gt;</code> ntô file SVG carricatu.",
+       "uploaded-setting-handler-svg": "Lu còdici SVG ca mposta l'attribbutu \"handler\" a na distinazzioni rimota/data/script veni bluccatu. Fu' truvatu <code>$1=\"$2\"</code> ntô file SVG carricatu.",
+       "uploaded-remote-url-svg": "Lu còdici SVG ca mposta n'attribbutu style quali è jè versu di n'URL rimota veni bluccatu. Fu' truvatu <code>$1=\"$2\"</code> ntô file SVG carricatu.",
+       "uploaded-image-filter-svg": "Fu' truvatu nu filtru di mmàggini cu' URL <code>&lt;$1 $2=\"$3\"&gt;</code> ntô file SVG carricatu.",
        "uploadscriptednamespace": "Stu file SVG cunteni nu namespace nun cunsintutu, \"$1\".",
        "uploadinvalidxml": "L'XML ntô file carricatu nun potti èssiri analizzatu sintatticamenti.",
        "uploadvirus": "Lu file cunteni un virus!\nDittagghî: $1",
        "unusedimages": "File nun usati",
        "wantedcategories": "Catigurìi addumannati",
        "wantedpages": "Pàggini addumannati",
-       "wantedpages-summary": "Elencu dî pàggini chi' nun esìstunu però hannu lu maggiuri nùmmiru di ligami versu d'iddi, lassannu stari li pàggini chi' comu ligami versu d'iddi hannu sulu rimanni. P'aviri n'elencu dî pàggini chi nun esìstunu però hannu rimanni versu d'iddi, talìa [[{{#special:BrokenRedirects}}]].",
+       "wantedpages-summary": "Elencu dî pàggini ca nun esìstunu però hannu lu maggiuri nùmmiru di ligami versu d'iddi, lassannu stari li pàggini chi' comu ligami versu d'iddi hannu sulu rimanni. P'aviri n'elencu dî pàggini ca nun esìstunu però hannu rimanni versu d'iddi, talìa [[{{#special:BrokenRedirects}}|l'elencu dî rimanni rutti]].",
        "wantedpages-badtitle": "Tìtulu nun vàlidu ntô gruppu di risultati: $1",
        "wantedfiles": "File addumannati",
        "wantedfiletext-cat": "Li file ccassutta su' richiamati però nun esìstunu. Ntâ lista cci ponnu èssiri macari li file chi' stannu nta dipòsiti esterni, cu' tuttu chi' esìstunu. Sti fausi pusitivi sarrannu <del>sbarrati</del>. Sparti, li pàggini chi' nclùdunu file chi' nun esìstunu su' elincati nta [[:$1]].",
        "tags-update-remove-not-allowed-multi": "Nun è cunsintutu di livari {{PLURAL:$2|st'etichetta|st'etichetti}} a' manu: $1",
        "tags-edit-title": "Canciamentu di l'etichetti",
        "tags-edit-manage-link": "Gistisci l'etichetti",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Virsioni scigghiuta|Virsioni scigghiuti}} di [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Eventu dû riggistru scigghiutu|Eventi dû riggistru scigghiuti}}:",
        "tags-edit-revision-legend": "Agghiunci o leva etichetti di {{PLURAL:$1|sta virsioni|tutti li $1 virsioni}}",
+       "tags-edit-logentry-legend": "Agghiunci o leva etichetti di {{PLURAL:$1|sta vuci di riggistru|tutti li $1 vuci di riggistru}}",
        "tags-edit-existing-tags": "Etichetti esistenti:",
+       "tags-edit-existing-tags-none": "''Nudda''",
        "tags-edit-new-tags": "Etichetti novi:",
        "tags-edit-add": "Agghiunci st'etichetti:",
        "tags-edit-remove": "Leva st'etichetti:",
+       "tags-edit-remove-all-tags": "(leva tutti l'etichetti)",
        "tags-edit-chosen-placeholder": "Scegghî quarchi etichetta",
+       "tags-edit-chosen-no-results": "Nun si truvàu nudda etichetta ca currispunni",
+       "tags-edit-reason": "Mutivu:",
+       "tags-edit-revision-submit": "Àpplica li canciamenti a' {{PLURAL:$1|sta virsioni|$1 virsioni}}",
+       "tags-edit-logentry-submit": "Àpplica li canciamenti a' {{PLURAL:$1|sta vuci di riggistru|$1 vuci di riggistru}}",
+       "tags-edit-success": "Li canciamenti furu applicati boni.",
+       "tags-edit-failure": "Nun si pòttiru applicari li canciamenti:\n$1",
+       "tags-edit-nooldid-title": "Virsioni oggettu nun vàlida",
+       "tags-edit-nooldid-text": "O nun spicificasti nudda virsioni comu oggettu di sta funzioni, o puru la virsioni spicificata nun esisti.",
        "tags-edit-none-selected": "Pi' favuri scegghi ammenu una etichetta, di agghiùnciri o livari.",
        "comparepages": "Cunfrunta pàggini",
        "compare-page1": "Pàggina 1",
        "revdelete-uname-unhid": "nomu utenti ammustratu",
        "revdelete-restricted": "misi ristrizzioni pi' l'amministratura",
        "revdelete-unrestricted": "livati ristrizzioni pi' l'amministratura",
+       "logentry-block-block": "$1 {{GENDER:$2|bluccàu}} a' {{GENDER:$4|$3}} cûn tempu di scadenza di $5 $6",
+       "logentry-block-unblock": "$1 {{GENDER:$2|sbluccàu}} a' {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "$1 {{GENDER:$2|canciàu}} li mpustazzioni dû bloccu di {{GENDER:$4|$3}} cûn tempu di scadenza di $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|bluccàu}} a' {{GENDER:$4|$3}} cûn tempu di scadenza di $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|canciàu}} li mpustazzioni dû bloccu di {{GENDER:$4|$3}} cûn tempu di scadenza di $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|impurtàu}} $3 pi' menzu dûn carricamentu di file",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|impurtàu}} $3 di n'autra wiki",
        "logentry-merge-merge": "$1 {{GENDER:$2|juncìu}} $3 nta $4 (virsioni nfina ô $5)",
        "logentry-move-move": "$1 {{GENDER:$2|spustau}} la pàggina $3 nti $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|spustau}} a pàggina $3 nta $4 senza lassari nu rimannu",
        "logentry-upload-revert": "$1 {{GENDER:$2|carricau}} $3",
        "log-name-managetags": "Riggistru dâ gistioni di l'etichetti",
        "log-description-managetags": "Sta pàggina elenca l'opirazzioni amministrativi chi' riguàrdunu l'[[Special:Tags|etichetti]]. Lu riggìstru cunteni sulu l'azzioni chi' furu fatti a' manu di n'amministraturi; l'etichetti ponnu puru èssiri criati e cancillati dû software dâ wiki senza lassari vuci nta stu riggistru.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|criàu}} l'etichetta «$4»",
        "logentry-managetags-delete": "$1 {{GENDER:$2|cancillàu}} l'etichetta \"$4\" (livata di $5 {{PLURAL:$5|virsioni o vuci di riggistru}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|attivàu}} l'etichetta «$4» pi' l'usu di utenti e bot",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|disattivàu}} l'etichetta \"$4\" pi' l'usu di l'utenti e dî bot",
+       "log-name-tag": "Riggistru di l'etichetti",
        "log-description-tag": "Sta pàggina ammustra quannu l'utenti agghiunciunu o lèvunu [[Special:Tags|etichetti]] di sìnguli virsioni o vuci di riggistru. Stu riggistru nun rifirisci li variazzioni di l'etichetti chi' succèdunu ntô cuntestu di nu canciamentu, na cancillazzioni, o n'autra opirazzioni comu a' chisti.",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|agghiuncìu}} l'{{PLURAL:$7|etichetta|etichetti}} $6 â virsioni $4 dâ pàggina $3",
        "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|agghiuncìu}} {{PLURAL:$7|l'etichetta|l'etichetti}} $6 â vuci di riggistru $5 dâ pàggina $3",
        "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|livàu}} {{PLURAL:$9|l'etichetta|l'etichetti}} $8 dâ virsioni $4 dâ pàggina $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|livàu}} l'{{PLURAL:$9|etichetta|etichetti}} $8 dâ vuci di riggistru $5 dâ pàggina $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|canciàu}} l'etichetti dâ virsioni $4 dâ pàggina $3 ({{PLURAL:$7|nn'agghiuncìu}} $6; {{PLURAL:$9|nni livàu}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|aggiurnàu}} l'etichetti ntâ vuci di riggistru $5 dâ pàggina $3 ({{PLURAL:$7|nn'agghiuncìu}} $6; {{PLURAL:$9|nni livàu}} $8)",
        "rightsnone": "(nuddu)",
        "revdelete-summary": "riassuntu dô canciamentu",
        "feedback-adding": "Agghiuncimentu dû cummentu â pàggina...",
+       "feedback-back": "Arreti",
        "feedback-bugcheck": "Bonu! Sulu cuntrolla chi' nun è unu dî [$1 bug già canusciuti].",
        "feedback-bugnew": "Cuntrullai. Signala nu bug novu",
        "feedback-bugornote": "Si' si' bonu a' discrìviri un prubblema tècnicu di manera dittagghiata, pi' favuri [$1 signala nu bug].\nSi' no, poi adupirari u mòdulu facilitatu ccassutta. U to cummentu sarravi agghiunciutu â pàggina \"[$3 $2]\", nsemmula ô to nomu utenti.",
        "feedback-cancel": "Annulla",
        "feedback-close": "Finutu",
+       "feedback-external-bug-report-button": "Signala nu prubblema tècnicu",
+       "feedback-dialog-title": "Lassa nu cummentu",
+       "feedback-dialog-intro": "Poi adupirari stu mòdulu facili ccassutta pi' lassari lu to cummentu. Stu cummentu sarravi agghiunciutu â pàggina «$1», nsemmula ô to nomu utenti.",
+       "feedback-error-title": "Erruri",
        "feedback-error1": "Erruri: Risultatu di l'API nun ricanusciutu",
        "feedback-error2": "Erruri: A mudìfica nun riniscìu",
        "feedback-error3": "Erruri: Nudda risposta di l'API",
+       "feedback-error4": "Erruri: Nun fu' pussìbbili pubblicari ntô tìtulu dû cummentu spicificatu",
        "feedback-message": "Missaggiu:",
        "feedback-subject": "Oggettu:",
        "feedback-submit": "Manna",
+       "feedback-terms": "Capisciu ca li nfurmazzioni dû me aggenti di l'utenti cuntènunu li virsioni pricisi dû me browser e dû me sistema opirativu, e ca sti nfurmazzioni sarrannu cunnivisi pubblicamenti a' latu dû me cummentu.",
+       "feedback-termsofuse": "Accunsentu a' lassari lu me cummentu in cuncurdanza cu' li Cunnizzioni d'Usu.",
        "feedback-thanks": "Grazzî! U to cummentu fu' affissu ntâ pàggina \"[$2 $1]\".",
        "feedback-thanks-title": "Ti ringrazziamu!",
        "feedback-useragent": "Aggenti di l'utenti:",
        "log-name-pagelang": "Riggistru dî canci di lingua",
        "log-description-pagelang": "Chistu è nu riggistru dî canciamenti â lingua dî pàggini.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|canciau}} a lingua dâ pàggina $3 di $4 a' $5.",
-       "default-skin-not-found": "Whoops! La peddi pridifinuta dâ to wiki, mpustata nta <code dir=\"ltr\">$wgDefaultSkin</code> comu <code>$1</code>, nun è dispunìbbili.\n\nA' quantu pari la to istallazzioni ncludi {{PLURAL:$4|la peddi|li peddi}} ccasutta. Talìa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuali: Cunfigurazzioni dî peddi] p'istruzzioni supra a' comu {{PLURAL:$4|s'attìva|s'attìvunu e comu si scegghî chidda pridifinuta}}.\n\n$2\n\n; Si' hai istallatu MediaWiki ora ora:\n: E' prubbàbbili chi' l'istallasti dû git, o direttamenti dû còdici surgenti nta quarchi' n'autra manera. Allura sta cosa è privista. Prova e istalla quarchi' peddi di [https://www.mediawiki.org/wiki/Category:All_skins l'archìviu dî peddi di mediawiki.org], a na manera di chisti:\n:* Scàrrica [https://www.mediawiki.org/wiki/Download lu prugramma d'istallazzioni in furmatu tar], chi' cunteni tanti peddi ed estinsioni. Poi cupiari e ncuddari la cartella <code>skins/</code> di ddadintra.\n:* Scàrrica a' una a' una quarchi' peddi in furmatu tar di [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clona via git unu dî dipòsiti <code>mediawiki/skins/*</code> ntâ cartella <code dir=\"ltr\">skins/</code> dâ to istallazzioni di MediaWiki.\n: Fari accussì' nun avissi a' ntirfirìri cû to dipòsitu git si' si' nu sviluppaturi di MediaWiki.\n\n; Si' hai aggiurnatu MediaWiki ora ora:\n: MediaWiki virsioni 1.24 e succissivi nun attìvunu cchiu' di manera autumàtica i peddi istallati (talìa [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manüali: Scuperta autumatica dî peddi]). Poi cupiari e ncuddari {{PLURAL:$5|sta riga|sti righi}} nta <code>LocalSettings.php</code> p'attivari {{PLURAL:$5|la peddi chi' pi' com'ora è istallata|tutti li peddi chi' pi' com'ora sunnu istallati}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si' hai mudificatu <code>LocalSettings.php</code> ora ora:\n: Cuntrolla chi' nun sbagghiasti a' scrìviri li nomi dî peddi.",
-       "default-skin-not-found-no-skins": "Whoops! La peddi pridifinuta dâ to wiki, mpustata nta <code dir=\"ltr\">$wgDefaultSkin</code> comu <code>$1</code>, nun è dispunìbbili.\n\nNun hai nudda peddi installata.\n\n; Si' hai installatu o puru aggiurnatu MediaWiki ora ora:\n: E' prubbàbbili chi' l'installasti dû git, o direttamenti dû còdici surgenti nta quarchi' autra manera. Allura sta cosa è privista. MediaWiki virsioni 1.24 e succissivi nun cuntènunu nudda peddi ntô dipòsitu principali. Prova e installa quarchi' peddi di [https://www.mediawiki.org/wiki/Category:All_skins l'archìviu dî peddi di mediawiki.org], a na manera di chisti:\n:* Scàrrica [https://www.mediawiki.org/wiki/Download u prugramma d'installazzioni in furmatu tar], chi' cunteni tanti peddi ed estinsioni. Poi cupiari e ncuddari a cartella <code>skins/</code> di ddadintra.\n:* Scàrrica a' una a' una quarchi' peddi in furmatu tar di [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clona via git unu dî dipòsiti <code>mediawiki/skins/*</code> ntâ cartella <code dir=\"ltr\">skins/</code> dâ to installazzioni di MediaWiki.\n: Fari accussì' nun avissi a' ntirfirìri cû to dipòsitu git si' si' nu sviluppaturi di MediaWiki. Talìa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manüali: Cunfigurazzioni dî peddi] p'istruzzioni supra a' comu s'attìvunu i peddi e comu si scegghî chidda pridifinuta.",
+       "default-skin-not-found": "Whoops! La peddi pridifinuta dâ to wiki, mpustata nta <code dir=\"ltr\">$wgDefaultSkin</code> comu <code>$1</code>, nun è dispunìbbili.\n\nA' quantu pari la to istallazzioni ncludi {{PLURAL:$4|la peddi|li peddi}} ccasutta. Talìa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuali: Cunfigurazzioni dî peddi] p'istruzzioni supra a' comu {{PLURAL:$4|s'attìva|s'attìvunu e comu si scegghî chidda pridifinuta}}.\n\n$2\n\n; Si' hai istallatu MediaWiki ora ora:\n: E' prubbàbbili ca l'istallasti dû git, o direttamenti dû còdici surgenti nta quarchi' n'autra manera. Allura sta cosa è privista. Prova e istalla quarchi' peddi di [https://www.mediawiki.org/wiki/Category:All_skins l'archìviu dî peddi di mediawiki.org], a na manera di chisti:\n:* Scàrrica [https://www.mediawiki.org/wiki/Download lu prugramma d'istallazzioni in furmatu tar], ca cunteni tanti peddi ed estinsioni. Poi cupiari e ncuddari la cartella <code>skins/</code> di ddadintra.\n:* Scàrrica a' una a' una quarchi' peddi ntô furmatu tar di [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Adòpira Git pi' scarricari peddi].\n: Lu fari accussi' nun avissi a' ntirfirìri cû to dipòsitu git si' si' nu sviluppaturi di MediaWiki.\n\n; Si' hai aggiurnatu MediaWiki ora ora:\n: MediaWiki virsioni 1.24 e succissivi nun attìvunu cchiu' di manera autumàtica li peddi istallati (talìa [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manüali: Scuperta autumatica dî peddi]). Poi cupiari e ncuddari {{PLURAL:$5|sta riga|sti righi}} nta <code>LocalSettings.php</code> p'attivari {{PLURAL:$5|la peddi ca è istallata pi' com'ora|tutti li peddi ca sunnu istallati pi' com'ora}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si' hai mudificatu <code>LocalSettings.php</code> ora ora:\n: Cuntrolla ca nun sbagghiasti a' scrìviri li nomi dî peddi.",
+       "default-skin-not-found-no-skins": "Whoops! La peddi pridifinuta dâ to wiki, mpustata nta <code dir=\"ltr\">$wgDefaultSkin</code> comu <code>$1</code>, nun è dispunìbbili.\n\nNun hai nudda peddi installata.\n\n; Si' hai installatu o puru aggiurnatu MediaWiki ora ora:\n: E' prubbàbbili chi' l'installasti dû git, o direttamenti dû còdici surgenti nta quarchi' autra manera. Allura sta cosa è privista. MediaWiki virsioni 1.24 e succissivi nun cuntènunu nudda peddi ntô dipòsitu principali. Prova e installa quarchi' peddi di [https://www.mediawiki.org/wiki/Category:All_skins l'archìviu dî peddi di mediawiki.org], a na manera di chisti:\n:* Scàrrica [https://www.mediawiki.org/wiki/Download u prugramma d'installazzioni in furmatu tar], chi' cunteni tanti peddi ed estinsioni. Poi cupiari e ncuddari a cartella <code>skins/</code> di ddadintra.\n:* Scàrrica a' una a' una quarchi' peddi in furmatu tar di [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Adòpira Git pi' scarricari peddi].\n: Fari accussì' nun avissi a' ntirfirìri cû to dipòsitu git si' si' nu sviluppaturi di MediaWiki. Talìa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manüali: Cunfigurazzioni dî peddi] p'istruzzioni supra a' comu s'attìvunu i peddi e comu si scegghî chidda pridifinuta.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (attivata)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''disattivata''')",
        "mediastatistics": "Statìstichi supra ê file multimidiali",
index 8bb2d3f..f81d91e 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Aursani",
                        "아라",
-                       "Fayazburiro"
+                       "Fayazburiro",
+                       "Sindhu"
                ]
        },
        "tog-underline": "هيٺان ڏنل لڪير واري لنڪ",
        "october-date": "آڪٽوبر $1",
        "november-date": "نَوِمبر $1",
        "december-date": "ڊسمبر $1",
+       "pagecategories": "{{PLURAL:$1|زمرو|زمرا}}",
        "category_header": "\"$1\" زمري جا صفحا",
        "subcategories": "ذيلي زمرا",
        "category-media-header": " \"$1\" زمري اندر ذريعات",
        "category-empty": "''في الوقت هن زمري ۾ ڪي به صفحا يا ذريعات شامل ناهن.''",
+       "hidden-categories": "{{PLURAL:$1|لڪيل زمرو|لڪيل زمرا}}",
        "hidden-category-category": "لڪل زمرا",
        "listingcontinuesabbrev": "جاري..",
        "about": "بابت",
        "moredotdotdot": "اڃا...",
        "mypage": "منهنجو صفحو",
        "mytalk": "ڳاله ٻوله",
+       "navigation": "رهنمائي",
        "and": "&#32;۽",
        "qbfind": "ڳوليو",
        "qbbrowse": "جھانگيو",
        "qbmyoptions": "منهنجا صفحا",
        "faq": "ڪپوس",
        "faqpage": "Project:ڪپوس",
+       "namespaces": "نانءُ پولار:",
+       "variants": "اقسام",
+       "navigation-heading": "رهنما مينيو",
        "errorpagetitle": "چُڪَ",
        "returnto": "$1 ڏانهن وَرو.",
        "tagline": "{{SITENAME}} طرفان",
        "site-atom-feed": "$1 اڻو روان رسد",
        "page-rss-feed": "\"$1\" RSS برق مواد",
        "page-atom-feed": "\"$1\" اڻو روان رسد",
-       "red-link-title": "$1 (اÚ\83ا Ù\84Ú©Ù\8aÙ\84 Ù\86اÙ\87ي)",
+       "red-link-title": "$1 (صÙ\81Ø­Ù\88 Ù\88جÙ\88د Ù\86Ù\87 Ù¿Ù\88 Ø±Ú©ي)",
        "nstab-main": "صفحو",
        "nstab-user": "تعارفي صفحو",
        "nstab-media": "ذريعاتي صفحو",
        "acct_creation_throttle_hit": "معاف ڪجَو، اوهان اڳي ئي $1 کاتا کولي چڪا آهيو. ان کان وڌيڪ نه ٿا کولي سگھجن.",
        "accountcreated": "کاتو کلي چڪو",
        "accountcreatedtext": "$1 نالي يوزر کاتو کلي چڪو آھي.",
+       "pt-login": "لاگ ان ٿيو",
+       "pt-createaccount": "کاتو کوليو",
        "changepassword": "ڳجھو لفظ تبديل ڪريو",
        "retypenew": "نئون ڳجھو لفظ ٻيهر ٽائيپ ڪندا:",
        "bold_sample": "گهري تحرير",
        "template-semiprotected": "(نيم تحفظيل)",
        "nocreatetext": "{{SITENAME}} نوان صفحا سرجڻ جي روڪَ ڪئي آهي.\nتوهان اڳي ئي موجود صفحن کي سنواري سگھو ٿا، يا [[Special:UserLogin|لاگ اِن ٿي يا نئون کاتو کولي سگھو ٿا]].",
        "recreate-moveddeleted-warn": "'''خبردار: توهان اهڙو صفحو نئين سر سرجي رهيا آهيو جيڪو اڳي ڊاٺو ويو آهي.'''\n\nبهتر ٿيندو ته توهان سوچي وٺو ته ڇا ان صفحي کي سنوارڻ بهتر ٿيندو.\nتوهآن جي سهوليت خاطر هتي ان صفحي جو ڊاٺ لاگ ميسر ڪجي ٿو:",
+       "duplicate-args-warning": "وارننگ: [[:$2]]کي [[:$1]] ڪال ڪري رهيو آهي، ساڻ هڪ کان وڌيڪ قدرن لاءِ ’$3‘ پيراميٽرس لاءِ. فقط آخري قدر مهيا ڪيل استعمال ڪيو ويندو.",
        "viewpagelogs": "هن صفحي جا لاگ ڏسو",
        "currentrev": "هاڻوڪو مسودو",
        "revisionasof": "$1 وارو پرت",
        "lineno": "سِٽَ $1:",
        "compareselectedversions": "چونڊيل پرت ڀيٽيو",
        "editundo": "اڻڪريو",
+       "searchresults": "ڳولا نتيجا",
+       "searchresults-title": "”$1“ لاءِ ڳولا نتيجا",
        "prevn": "پويان {{PLURAL:$1|$1}}",
        "nextn": "اڳيان {{PLURAL:$1|$1}}",
        "viewprevnext": "ڏسو ($1 {{int:pipe-separator}} $2) ($3)",
+       "search-result-size": "$1 ({{PLURAL:$2|لفظُ|$2 لفظَ}})",
        "preferences": "ترجيحات",
        "mypreferences": "منهنجون ترجيحات",
        "skin-preview": "پيش نگاهه",
        "minoreditletter": "م",
        "newpageletter": "ن",
        "boteditletter": "گ",
+       "rc-change-size-new": "$1 {{PLURAL:$1|بائيٽ|بائيٽس}} تبديليءَ کان پوءِ",
        "recentchangeslinked": "لاڳاپيل تبديليون",
        "recentchangeslinked-feed": "لاڳاپيل تبديليون",
        "recentchangeslinked-toolbox": "لاڳاپيل تبديليون",
        "upload": "فائيل چاڙهيو",
        "uploadbtn": "فائيل چاڙهيو",
        "uploadlogpage": "چاڙهه لاگ",
+       "upload-scripted-pi-callback": "ان فائيل کي اپلوڊ نه ٿو ڪري سگهي جنهن ۾ ايڪس ايم ايل اسٽائيل شيٽ جون پراسيسنگ هدايتون شامل هجن.",
+       "uploaded-script-svg": "اسڪرپٽ جوڳو ايليمينٽ ”$1” مليو آهي، اپلوڊ ٿيل ايس وي جي فائيل ۾.",
+       "uploaded-hostile-svg": "اپلوڊ ٿيل ايس وي جي فائيل جو غير محفوظ سي ايس ايس ۾ اسٽائيل ايلمينٽ مليو",
+       "uploaded-event-handler-on-svg": "واقعي جون هينڊل ڪندڙ وصفون \n<code>$1=\"$2\"</code> ايس وي جي فائيل ۾ اجازت نه آهي.",
+       "uploaded-href-attribute-svg": "Href خاصيتون \n<code>&lt;$1 $2=\"$3\"&gt;</code> نان لوڪل ٽارگيٽ سان جهڙوڪ ( http://, javascript:, وغيره) ايس وي جي فائيل ۾ اجازت مليل نه آهن",
+       "uploaded-href-unsafe-target-svg": "href جو غير محفوظ نشانو مليو آهي <code>&lt;$1 $2=\"$3\"&gt;</code> اپلوڊ ٿيل ايس وي جي فائيل ۾",
+       "uploaded-animate-svg": "”اينيميٽ“ ٽيگ ڳوليو  جيڪا ٿي سگهي ٿو href کي تبديل ڪري رهي هجي. \"form\" وصف استعمال ڪندي <code>&lt;$1 $2=\"$3\"&gt;</code> اپلوڊ ٿيل ايس وي جي فائيل ۾",
+       "uploaded-setting-event-handler-svg": "واقعي کي هينڊل ڪندڙ جي سيٽنگ جون وصفون بلاڪ ٿيل آهن. \n<code>&lt;$1 $2=\"$3\"&gt;</code> اپلوڊ ٿيل ايس وي جي فائيل ۾ مليو",
+       "uploaded-setting-href-svg": "\"set\"  ٽيگ کي \"href\" وصف استعمال ڪندي بنيادي عنصر کي بلاڪ ڪيو ويو آهي",
+       "uploaded-wrong-setting-svg": "\"set\" ٽيگ کي استعمال ڪندي رموٽ/ڊيٽا/اسڪرپٽ ٽارگيٽ کي ڪنهن وصف سان جوڙڻ کي بلاڪ ڪيو ويو آهي. \n<code>&lt;set to=\"$1\"&gt;</code>اپلوڊ ٿيل ايس وي جي فائيل ۾ مليو آهي.",
+       "uploaded-setting-handler-svg": "اهي ايس وي جي جيڪي ”هينڊل ڪندڙ“ وصفن کي رموٽ/ڊيٽا/اسڪرپٽ کي سيٽ ٿا ڪن، کي بلاڪ ڪيو ويو آهي.<code>$1=\"$2\"</code> مليو آهي اپلوڊ ٿيل ايس وي جي فائيل ۾.",
+       "uploaded-remote-url-svg": "ايس وي جي جيڪا سيٽ ڪري ٿي ڪنهن اسٽائيل وصف  رموٽ يو آر ايل سان  بلاڪ ٿيل آهي.\n <code>$1=\"$2\"</code> اپلوڊ ٿيل ايس وي جي فائيل ۾ مليو",
+       "uploaded-image-filter-svg": "هن يو آر ايل سان <code>&lt;$1 $2=\"$3\"&gt;</code> اميج فلٽر مليو آهي، اپلوڊ ٿيل ايس وي جي فائيل ۾،",
        "listfiles": "فائيل فهرست",
        "file-anchor-link": "فائيل",
        "filehist": "فائيل جي سوانح",
        "filehist-dimensions": "ماپَ",
        "filehist-filesize": "فائيل سائيز",
        "filehist-comment": "تاثرات",
-       "imagelinks": "ڳنڍڻا",
+       "imagelinks": "فائيل جو استعمال",
        "linkstoimage": "هن فائيل سان {{PLURAL:$1|هيٺيون صفحو ڳنڍيل آهي |$1 هيٺيان صفحا ڳنڍيل آهن}}:",
        "nolinkstoimage": "هن فائيل سان ڪو به صفحو ڳنڍيل ناهي.",
        "sharedupload": "هيءَ هڪ شراڪتي چاڙهه آهي، تنهنڪري ان کي ٻيون رٿائون به استعمال ڪري سگھن ٿيون.",
        "tooltip-pt-mycontris": "منهنجون ڀاڱيداريون",
        "tooltip-pt-login": "توهان کي همٿائجي ٿو ته توهان لاگ اِن ٿيو، بهرحال اهو لازمي ناهي.",
        "tooltip-pt-logout": "لاگ آئوٽ",
+       "tooltip-pt-createaccount": "توهان جي همٿ افزائي ڪئي وئي آهي ته هڪ کاتو کوليو ۽ لاگ ان ٿيو؛ جيتوڻيڪ، اهو ضروري نه آهي",
        "tooltip-ca-talk": "موادي صفحي تي بحث",
        "tooltip-ca-edit": "توهان هيءُ صفحو سنواري سگھو ٿا. مهرباني ڪري سانڍڻ کان اڳ پيش نگاهه جو اختيار استعمال ڪندا.",
        "tooltip-ca-addsection": "هن بحث تي تاثرات درج ڪرايو",
        "tooltip-ca-viewsource": "هيءُ صفحو تحفظيل آهي. توهان ان جو ڪوڊ ڏسي سگھو ٿا.",
+       "tooltip-ca-history": "هن صفحي جون گذريل نظرثانيون",
        "tooltip-ca-protect": "هيءُ صفحو تحفظيو",
        "tooltip-ca-delete": "هيءُ صفحو ڊاهيو",
        "tooltip-ca-move": "هيءُ صفحو چوريو",
        "tooltip-ca-watch": "هيءُ صفحو پنهنجي ٽيٽ فهرست ۾ شامل ڪريو",
        "tooltip-ca-unwatch": "هيءُ صفحو پنهنجي ٽيٽ فهرست مان هٽايو",
        "tooltip-search": "جھڙتيو {{SITENAME}}",
+       "tooltip-search-go": "صفحي تي وڃو بلڪل هن ساڳئي نالي سان جيڪڏهن موجود آهي ته",
+       "tooltip-search-fulltext": "هن متن لاءِ صفحا ڳوليو",
+       "tooltip-p-logo": "مکيه صفحو وزٽ ڪريو",
        "tooltip-n-mainpage": "مک صفحو گھمو",
+       "tooltip-n-mainpage-description": "مکيه صفحو وزٽ ڪريو",
        "tooltip-n-portal": "هن رٿا بابت، توهان ڇا ٿا ڪري سگھو، ڪهڙي شَي ڪٿي ملندي",
        "tooltip-n-currentevents": "تازن واقعن تي تفصيلي ڄاڻ لهو",
        "tooltip-n-recentchanges": "هن وڪيءَ ۾ تازين تبديلين جي فهرست.",
        "tooltip-n-randompage": "بلاترتيب ڪو به صفحو اتاريو",
        "tooltip-n-help": "ڳولي لهڻ جي جاءِ.",
        "tooltip-t-whatlinkshere": "هتان ڳنڍيل سمورا وڪي صفحا",
+       "tooltip-t-recentchangeslinked": "ويجھڙائيءَ ۾ صفحن ۾ ٿيل تبديليون هن صفحي تان ڳنڍيل يا لنڪ ٿيل آهن",
        "tooltip-t-contributions": "هن يُوزر جون ڀاڱيداريون ڏسو",
        "tooltip-t-emailuser": "هن يُوزر کي برق ٽپال اماڻيو",
        "tooltip-t-upload": "فائيل چاڙهيو",
        "tooltip-t-specialpages": "سڀني خاص صفحن جي فهرست",
        "tooltip-t-print": "هن صفحي جو ڇاپائتو پرت",
+       "tooltip-t-permalink": "صفحي جي هن نظرثاليءَ ڏانهن مستقل لنڪ",
+       "tooltip-ca-nstab-main": "مواد جي صفحي کي ڏسو",
        "tooltip-ca-nstab-user": "هن جو يُوزر صفحو ڏسو",
+       "tooltip-ca-nstab-special": "هي خاص صفحو آهي، توهان هن صفحي کي ترميم نه ٿا ڪري سگهو.",
        "tooltip-ca-nstab-project": "رٿائي صفحو ڏسو",
        "tooltip-ca-nstab-image": "هن فائيل جو صفحو ڏسو",
        "tooltip-ca-nstab-template": "سانچو ڏسو",
        "tooltip-compareselectedversions": "هن صفحي جن ٻن چونڊيل پرتن درميان تفاوت ڏسو.",
        "tooltip-watch": "هيءُ صفحو پنهنجي ٽيٽ فهرست ۾ شامل ڪريو",
        "anonymous": "{{SITENAME}} جا نامعلوم يوزرس",
+       "pageinfo-toolboxlink": "صفحي جي معلومات",
        "previousdiff": "← اڳوڻو تفاوت",
        "nextdiff": "نئون تفاوت -->",
        "file-info-size": "$1 × $2 عڪسلون، فائيل سائيز: $3، MIME ٽائيپ: $4",
        "file-nohires": "اڃا سنهو تحلل ميسر ناهي.",
        "svg-long-desc": "ايس وي جي فائيل، اٽڪل $1 × $2 عڪسلون، فائيل سائيز: $3",
        "show-big-image": "سنهو ترين تحلل",
+       "show-big-image-size": "$1*$2 پڪزلس",
        "newimages": "نون فائيلن جي گيلري",
        "noimages": "ڏسڻ لاءِ ڪجھه ناهي.",
        "bydate": "تاريخوار",
        "metadata": "اعدادِ اعداد",
        "metadata-expand": "توسيعي تفصيل ڏيکاريو",
        "metadata-collapse": "توسيعي تفصيل لڪايو",
+       "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": "ٻٽڻيون في جُز",
        "watchlisttools-raw": "ڪچي ٽيٽ فهرست سنواريو",
        "version": "ورزن",
        "specialpages": "خاص صفحا",
-       "specialpages-group-users": "يوزرس ۽ حق"
+       "specialpages-group-users": "يوزرس ۽ حق",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ٽيگ|ٽيگز}}]]: $2)",
+       "searchsuggest-search": "ڳوليو"
 }
index 46b3a96..6ec7e68 100644 (file)
        "passwordreset-username": "Sandiasma:",
        "passwordreset-domain": "Domain:",
        "passwordreset-capture": "Témbongkeun surat-é hasilna?",
+       "passwordreset-capture-help": "Upama anjeun nyéntang ieu kotak, surélék (anu ngirimkeun kecap sandi saheulaanan) bakal ditémbongkeun ka anjeun sarta dikirimkeun ka pamakéna.",
        "passwordreset-email": "Alamat surélék:",
        "passwordreset-emailtitle": "Wincikan akun di {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Aya (bisa jadi Anjeun, ti alamat IP $1) ménta dibéjaan ngeunaan akun di {{SITENAME}} ($4). {{PLURAL:$3|Akun|Akun-akun}} di handap patali jeung alamat ieu surélék:\n\n$2\n\n{{PLURAL:$3|Ieu sandi saheulaanan|Ieu sandi saheulaanan}} anu bakal kadaluwarsa dina témpo {{PLURAL:$5|sapoé|$5 poé}}.\nAnjeun kudu asup sarta milih sandi anyar ayeuna. Lamun nu séjén nyieun ieu paménta, atawa lamun Anjeun geus inget sandi aslina sarta moal dirobah, ieu surat teu kudu diwaro.",
-       "passwordreset-emailtext-user": "Hiji jalma (bisa jadi Anjeun, ti alamat IP $1) ménta pangéling-ngéling nu wincik tina akun pikeun {{SITENAME}} ($4).\n{{PLURAL:$3|Akun|Akun-akun}} di handap patali jeung alamat surélék ieu:\n\n$2\n\n{{PLURAL:$3|Sandi saheulaanan|Sandi saheulaanan}} ieu bakal kadaluwarsa dina témpo {{PLURAL:$5|sapoé|$5 poé}}.\nAnjeun kudu asup sarta milih sandi anyar ayeuna. Lamun jalma séjén nyieun\nieu pamundut atawa lamun Anjeun inget sandi asli sarta moal \nngarobah deui, Anjeun bisa teu maliré ieu talatah sarta terus ngagunakeun sandi heubeul.",
+       "passwordreset-emailtext-ip": "Aya (sigana anjeun, ti alamat IP $1) ménta nyetél ulang kecap sandi pikeun {{SITENAME}} ($4). {{PLURAL:$3|Akun}} di handap tumali jeung alamat ieu surélék:\n\n$2\n\n{{PLURAL:$3|Ieu sandi saheulaanan}} bakal kadaluwarsa dina témpo {{PLURAL:$5|sapoé|$5 poé}}.\nAnjeun kudu asup sarta milih sandi anyar ayeuna. Lamun teu rumasa nyieun ieu paménta, atawa lamun geus inget sandi aslina sarta moal dirobah, ieu surat teu kudu diwaro.",
+       "passwordreset-emailtext-user": "Pamaké $1 di {{SITENAME}} ménta nyetél ulang sandi anjeun di {{SITENAME}} ($4). {{PLURAL:$3|Akun}} di handap tumali jeung alamat surélék ieu:\n\n$2\n\n{{PLURAL:$3|Ieu sandi saheulaanan}} bakal kadaluwarsa dina témpo {{PLURAL:$5|sapoé|$5 poé}}.\nAnjeun kudu asup sarta milih sandi anyar ayeuna. Lamun henteu rumasa nyieun ieu pamundut atawa lamun geus inget sandi asli sarta moal ngarobah deui, ieu talatah teu kudu dipaliré.",
        "passwordreset-emailelement": "Sandiasma: $1\nSandi saheulaanan: $2",
-       "passwordreset-emailsent": "Surélék pangéling geus dikirim.",
+       "passwordreset-emailsent": "Surélék pikeun nyetél ulang kecap sandi geus dikirim.",
+       "passwordreset-emailsent-capture": "Surélék pikeun nyetél ulang kecap sandi geus dikirim, sakumaha ditémbongkeun di handap.",
+       "passwordreset-emailerror-capture": "Surélék pikeun nyetél ulang kecap sandi geus dijieun, sakumaha ditémbongkeun di handap, tapi gagal ngirim ka {{GENDER:$2|pamaké}}: $1",
        "changeemail": "Ganti alamat surélék",
        "changeemail-text": "Lengkepan ieu formulir pikeun ngaganti alamat surélék. Anjeun bakal kudu ngasupkeun sandi pikeun ngonfirmasi ieu parobahan.",
        "changeemail-no-info": "Anjeun kudu asup log pikeun bisa muka ieu kaca sacara langsung.",
        "changeemail-none": "(euweuh)",
        "changeemail-password": "Kecap sandi {{SITENAME}} Anjeun:",
        "changeemail-submit": "Ganti surélék",
+       "changeemail-throttled": "Anjeun loba teuing gagal asup log.\nTungguan $1 saméméh nyobaan deui.",
        "resettokens": "Rését token",
        "resettokens-text": "Anjeun bisa ngarését token sangkan bisa muka sababaraha data-data pribadi anu tumali jeung akun anjeun di dieu.\n\nAnjeun kudu ngarését lamun kungsi teu kahaja ngabéjaan anu séjén atawa lamun aya anu nyusup kana akun anjeun.",
        "resettokens-no-tokens": "Taya token pikeun dirését.",
        "resettokens-legend": "Rését token",
        "resettokens-tokens": "Token:",
+       "resettokens-token-label": "$1 (ajén ayeuna: $2)",
+       "resettokens-watchlist-token": "Token pikeun asupan raramat (Atom/RSS) [[Special:Watchlist|parobahan kana kaca-kaca anu diponcorong]]",
        "resettokens-resetbutton": "Setél token anu dipilih",
        "bold_sample": "Téks kandel",
        "bold_tip": "Téks kandel",
        "anoneditwarning": "<strong>Awas:</strong> Anjeun can asup log. Lamun ngédit, alamat IP anjeun bakal katempo ku balaréa. Lamun anjeun <strong>[$1 asup log]</strong> atawa <strong>[$2 nyieun akun]</strong>, ngaran anjeun bakal natrat dina jujutan éditanana, kalayan sababaraha kauntungan lianna.",
        "anonpreviewwarning": "\"Anjeun can asup log. Mun disimpen, alamat IP anjeun bakal kacatet dina jujutan ieu kaca.\"",
        "missingsummary": "'''Pépéling:''' Anjeun can ngeusian sari éditan. Mun anjeun ngaklik deui Simpen, éditan anjeun bakal disimpen tanpa sari éditan",
+       "selfredirect": "<strong>Awas:</strong> Anjeun ngalihkeun ieu kaca ka asalna.\nAnjeun sigana salah ngasupkeun tujul alihan, atawa ngédit kaca anu salah.\nUpama anjeun ngaklik deui \"{{int:savearticle}}\", alihanana bakal angger dijieun.",
        "missingcommenttext": "Mangga tulis koméntar di handapeun ieu.",
        "missingcommentheader": "'''Pépéling''': Anjeun can ngeusian judul pikeun ieu koméntar.\nMun anjeun ngaklik deui \"{{int:savearticle}}\", éditan anjeun bakal disimpen tanpa koméntar.",
        "summary-preview": "Ringkesan pramidang:",
        "subject-preview": "Sawangan subyek/tajuk:",
+       "previewerrortext": "Aya éror nalika nyobaan nyawang robahan anjeun.",
        "blockedtitle": "Pamaké dipeungpeuk",
        "blockedtext": "'''Ngaran pamaké atawa alamat IP anjeun dipeungpeuk.'''\n\nDipeungpeuk ku $1.\nAlesanana ''$2''.\n\n* Mimiti dipeungpeuk : $8\n* dipeungpeuk kadaluarsa dina: $6\n* Sasaran nudipeungpeuk : $7\n\nAnjeun bisa nepungan $1 atawa salasahiji [[{{MediaWiki:Grouppage-sysop}}|kuncén]] séjén pikeun nyawalakeun hal ieu.\n'''Catet''': yén anjeun teu bisa maké fungsi \"surélékan pamaké ieu\" mun anjeun teu ngadaptarkeun alamat surélék nu sah kana [[Special:Preferences|préferénsi pamaké]] anjeun.\n\nAlamat IP anjeun $3 jeung ID na #$5.\nLampirkeun informasi ieu dina unggal ''query'' anjeun.",
        "autoblockedtext": "Alamat IP anjeun otomatis dipeungpeuk sabab dipaké ku pamaké séjén nu geus dipeungpeuk ku $1, kalawan alesan:\n\n:''$2''\n\n*Mimiti dipeungpeuk: $8\n*Kadaluwarsa peungpeuk: $6\n*Sasaran peungpeuk: $7\n\nAnjeun bisa nepungan $1 atawa [[{{MediaWiki:Grouppage-sysop}}|kuncé]] lianna pikeun ngabadamikeun ieu peungpeukan.\n\nCatet yén anjeun moal bisa migunakeun fitur \"surélékan ieu pamaké\" mun alamat surélék anu didaptarkeun dina [[Special:Preferences|préferénsi pamaké]]na teu sah, sarta teu dipeungpeuk tina migunakeun ieu fitur.\n\nAlamat IP Anjeun ayeuna nyaéta $3, sarta ID peungpeukan anjeun #$5.\nMangga sebatkeun éta ID dina pamundut-pamundut anjeun.",
        "loginreqlink": "asup log",
        "loginreqpagetext": "Mun hayang muka kaca séjénna, Anjeun kudu $1.",
        "accmailtitle": "Sandi geus dikirim.",
-       "accmailtext": "Sandi acak pikeun [[User talk:$1|$1]] geus dikirimkeun ka $2.\n\nSandi pikeun rekening anyar ieu bisa diganti dina kaca ''[[Special:ChangePassword|ganti sandi]]'' sanggeus asup log.",
+       "accmailtext": "Sandi acak pikeun [[User talk:$1|$1]] geus dikirim ka $2. Éta sandi bisa diganti dina kaca ''[[Special:ChangePassword|ganti sandi]]'' sanggeus asup log.",
        "newarticle": "(anyar)",
        "newarticletext": "Anjeun geus nuturkeun tutumbu ka kaca nu can aya.\nPikeun nyieun kaca, mimitian ku ngetik jeroeun kotak di handap\n(tempo [$1 kaca pitulung] pikeun leuwih écés).\nMun anjeun ka dieu teu ngahaja, klik baé tombol '''back''' na panyungsi anjeun.",
-       "anontalkpagetext": "----''Ieu mangrupa kaca sawala pikeun pamaké anonim nu can (henteu) nyieun rekening, kusabab kitu alamat IP dipaké dina hal ieu pikeun nyirikeun anjeunna. Alamat IP ieu bisa dipaké ku sababaraha urang. Mun anjeun salasahiji pamaké anonim sarta ngarasa aya koméntar nu teu pakait geus ditujukeun ka anjeun, leuwih hadé [[Special:UserLogin|nyieun rekening atawa asup log]] sangkan teu pahili jeung pamaké anonim séjén.''",
+       "anontalkpagetext": "----\n<em>Ieu mangrupa kaca sawala pikeun pamaké anonim anu can nyieun akun, atawa anu henteu maké.</em>\nKu kituna kapaksa make alamat IP pikeun nyirikeun anjeunna. Alamat IP ieu bisa dipaké ku sababaraha jalma. Lamun anjeun salasahiji pamaké anonim sarta ngarasa aya koméntar nu teu pakait geus ditujukeun ka anjeun, mangga [[Special:UserLogin/signup|nyieun akun]] atawa [[Special:UserLogin|asup log]] sangkan teu pacorok jeung pamaké anonim lianna.",
        "noarticletext": "Kiwari can aya téks dina ieu kaca.\nAnjeun bisa [[Special:Search/{{PAGENAME}}|nyusud judul ieu kaca]] dina kaca séjén,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nyusud log nu tumali],\natawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} ngédit ieu kaca]</span>.",
        "noarticletext-nopermission": "Kiwari can aya téks dina ieu kaca.\nAnjeun bisa [[Special:Search/{{PAGENAME}}|nyusud judul ieu kaca]] dina kaca séjén,atawa <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nyusud log nu tumali]</span>, tapi teu wenang pikeun nyieun ieu kaca.",
+       "missing-revision": "Révisi #$1 kaca \"{{FULLPAGENAME}}\" teu aya.\n\nKajadian ieu biasana kusabab nuturkeun tutumbu jujutan kaca anu geus dihapus.\nWincikanana bisa ditempo di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log hapusan].",
        "userpage-userdoesnotexist": "Rekening pamaké \"<nowiki>$1</nowiki>\" tacan kadaptar. Mangga tilikan lamun anjeun hoyong ngadamel/ngédit kaca ieu.",
        "userpage-userdoesnotexist-view": "Rekening pamaké \"$1\" teu aya dina daptar.",
        "blocked-notice-logextract": "Ieu pamaké keur dipeungpeuk.\nPikeun rujukan, éntri log panungtung dipidangkeun di handap:",
-       "clearyourcache": "'''Catetan:''' Sanggeus nyimpen, anjeun perlu ngosongkeun sindangan panyungsi anjeun pikeun nempo parobahanana:\n'''Mozilla/Safari/Konqueror:''' pencét & tahan ''Shift'' bari ngaklik ''Reload'' (atawa pencét ''Ctrl-Shift-R''), '''IE:''' pencét ''Ctrl-F5'', '''Opera:''' pencét ''F5''.",
+       "clearyourcache": "<strong>Catet:</strong> Sanggeus nyimpen, anjeun kudu narabas singgahan panyungsi anjeun pikeun nempo parobahanana.\n* <strong>Firefox/Safari:</strong> Tahan <em>Shift</em> bari ngaklik <em>Reload</em>, atawa pencét boh <em>Ctrl-F5</em> atawa <em>Ctrl-R</em> (<em>⌘-R</em> dina Mac)\n* <strong>Google Chrome:</strong> Pencét <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> dina Mac)\n* <strong>Internet Explorer:</strong> Tahan <em>Ctrl</em> bari ngaklik <em>Refresh</em>, atawa pencét <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Kosongkeun singgahan dina <em>Tools → Preferences</em>",
        "usercssyoucanpreview": "Tip:''' Paké tombol \"{{int:showpreview}}\" pikeun nyobaan CSS anyar anjeun méméh nyimpen.",
        "userjsyoucanpreview": "Tip:''' Paké tombol \"{{int:showpreview}}\" pikeun nyobaan JavaScript anyar anjeun méméh nyimpen.",
        "usercsspreview": "'''Inget yén anjeun ukur nyawang css pamaké anjeun, can disimpen!'''",
        "updated": "(Geus diropéa)",
        "note": "'''Catetan:'''",
        "previewnote": "'''Inget yén ieu ukur pratayang, can disimpen.'''\nÉditan anjeun can disimpen!",
+       "continue-editing": "Miang ka bagian ngédit",
        "previewconflict": "Sawangan ieu mangrupa eunteung pikeun téks na rohangan ngédit sakumaha bakal katémbong mun ku anjeun disimpen.",
        "session_fail_preview": "'''Punten! Kami teu bisa ngolah éditan anjeun alatan leungitna data rintakan. Mangga cobian deui. Mun tetep teu bisa, cobi kaluar log lajeng lebet deui.'''",
        "session_fail_preview_html": "'''Punten! Kami teu bisa ngolah éditan anjeun sabab leungitna data rintakan.'''\n\n''Kusabab {{SITENAME}} ngawenangkeun dipakéna HTML atah, pramidangna disumputkeun pikeun nyegah panarajang JavaScript.''\n\n'''Mun ieu éditan bener, mangga cobian deui. Mun tetep teu metu, cobi [[Special:UserLogout|kaluar log]] heula, lajeng lebet deui.'''",
        "yourdiff": "Béda",
        "copyrightwarning": "Perhatikeun yén sadaya kontribusi ka MediaWiki dianggap medal dina panangtayungan lisénsi $2 (tempo $1 pikeun jéntréna). Mun anjeun teu miharep tulisan anjeun dirobah sarta disebarkeun deui, ulah dilebetkeun ka dieu.<br />\nAnjeun ogé jangji yén tulisan ieu dijieun ku sorangan, atawa disalin ti ''domain'' umum atawa sumberdaya bébas séjénna. '''ULAH NGASUPKEUN KARYA NU MIBANDA HAK CIPTA TANPA IDIN!'''",
        "copyrightwarning2": "Catet yén sadaya kontribusi ka {{SITENAME}} bisa diédit, dirobah, atawa dihapus ku kontributor séjén. Mun anjeun teu miharep tulisan anjeun dirobah, ulah ngintunkeun ka dieu.<br />\nAnjeun ogé mastikeun yén ieu téh pituin tulisan anjeun, atawa salinan ti domain umum atawa sumberdaya bébas séjénna (tempo $1 pikeun écésna).\n'''ULAH NGINTUNKEUN KARYA NU MIBANDA HAK CIPTA TANPA WIDI!'''",
-       "longpageerror": "'''SALAH: Téks anu dikirimkeun gedéna $1 kb, leuwih ti maksimum $2 kb. Téks teu bisa disimpen.'''",
+       "longpageerror": "<strong>Éror: téks anu dikirimkeun panjangna {{PLURAL:$1|hiji kilobit|$1 kilobit}}, leuwih ti maksimum {{PLURAL:$2|hiji kilobit|$2 kilobit}}.</strong>\nTeu bisa disimpen.",
        "readonlywarning": "<strong>Awas: pangkalan data dikonci pikeun diropéa, anjeun moal bisa nyimpen éditan anjeun ayeuna.</strong>\nMun perlu, simpen heula téksna kana berkas téks pikeun diasupkeun deui séjén mangsa.\n\nKuncén anu ngonci pangkalan data méré katerangan: $1",
        "protectedpagewarning": "'''AWAS: ieu kaca dikonci sarta ngan bisa dirobah ku pamaké nu statusna kuncén.'''\nÉntri log panungtungan ditémbongkeun di handap:",
        "semiprotectedpagewarning": "'''Catetan''': ieu kaca dikonci sarta ukur bisa dirobah ku pamaké nu geus kadaptar.\nÉntri log panungtung dibéréndélkeun di handap:",
        "edit-gone-missing": "Kaca teu bisa dianyarkeun,\nsigana kusabab geus dihapus.",
        "edit-conflict": "Éditan bantrok",
        "edit-no-change": "Éditan anjeun teu diwaro, kusabab taya nu robah dina tulisanana.",
+       "postedit-confirmation-created": "Kaca geus dijieun.",
        "postedit-confirmation-saved": "Éditan anjeun tos disimpen.",
        "edit-already-exists": "Teu bisa nyieun kaca anyar.\nArtikelna geus aya.",
        "defaultmessagetext": "Téks ti dituna",
        "invalid-content-data": "Data eusi henteu valid",
        "content-not-allowed-here": "Eusi \"$1\" teu diijinan di kaca [[$2]]",
+       "editwarning-warning": "Ninggalkeun ieu kaca bakal ngaleungitkeun parobahan anu tas dijieun.\nUpama anjeun geus asup log, anjeun bisa numpurkeun ieu talatah dina bagian \"{{int:prefs-editing}}\" préferénsi anjeun.",
        "editpage-notsupportedcontentformat-title": "Format eusi teu dirojong",
        "editpage-notsupportedcontentformat-text": "Format eusi $1 teu dirojong ku modél eusi $2.",
        "content-model-wikitext": "wikitéks",
        "content-model-css": "CSS",
        "content-json-empty-object": "Obyék kosong",
        "content-json-empty-array": "Larik kosong",
+       "duplicate-args-warning": "<strong>Awas:</strong> [[:$1]] nyalukan [[:$2]] ku leuwih ti hiji ajén pikeun paraméter \"$3\". Ngan ajén panungtung anu bakal dipaké.",
+       "duplicate-args-category": "Kaca maké argumén ganda dina caluk citakan",
+       "duplicate-args-category-desc": "Éta kaca ngandung caluk citakan anu maké argumén ganda, kawas <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> atawa <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Inget!: Kaca ieu ngandung réa teuing maké fungsi ''parser''.\n\nAyeuna aya {{PLURAL:$1|$1 panggilan|$1 panggilan}}, sakuduna kurang ti $2 {{PLURAL:$2|panggilan|panggilan}}.",
        "expensive-parserfunction-category": "Kaca kalawan réa teuing maké fungsi parser",
        "post-expand-template-inclusion-warning": "Inget! : Ukuran citakan anu dipaké badag teuing.\nSawatara citakan baris teu diasupkeun.",
        "post-expand-template-argument-category": "Kaca kalawan argumén citakan anu teu dipaliré",
        "parser-template-loop-warning": "Katangén ayana citakan anu patumpang tindih: [[$1]]",
        "parser-template-recursion-depth-warning": "Citakan patumpang tindih ngaleuwihan wates($1)",
+       "language-converter-depth-warning": "Parobah basa ngaleuwihan wates jerona ($1)",
+       "expansion-depth-exceeded-category": "Kaca-kaca anu jero ékspansina leuwih ti wates",
+       "expansion-depth-exceeded-category-desc": "Kacana ngaleuwihan wates jero ékspansina.",
+       "expansion-depth-exceeded-warning": "Kaca ngaleuwihan jero ékspansi",
        "undo-success": "Éditan ieu bisa dibolaykeun. Mangga pariksa babandingan di handap pikeun mastikeun mémang anjeun miharep éta parobahan. Mun geus yakin, mangga simpen parobahanana pikeun ngabolaykeun éditan.",
        "undo-failure": "Éditan teu bisa dibolaykeun alatan kaselang ku éditan séjén.",
        "undo-norev": "Éditan ieu henteu bisa bolaykeun alatan kaca henteu kapanggih atawa geus dihapus.",
        "undo-summary-username-hidden": "Bolaykeun révisi $1 ku pamaké nyumput",
        "cantcreateaccounttitle": "Rekening teu bisa dijieun",
        "cantcreateaccount-text": "Nyieun rekening ti ieu alamat IP ('''$1''') dipeungpeuk ku [[User:$3|$3]].\n\nAlesanana $3 cenah ''$2''.",
+       "cantcreateaccount-range-text": "Nyieun akun ti alamat IP dina rentang '''$1''', kaasup alamat IP anjeun ('''$4'''), dipeungpeuk ku [[User:$3|$3]].\n\nAlesan $3 nyaéta ''$2''",
        "viewpagelogs": "Tempo log kaca ieu",
        "nohistory": "Teu aya jujutan édit pikeun kaca ieu.",
        "currentrev": "Révisi kiwari",
        "currentrev-asof": "Révisi mangsa $1",
        "revisionasof": "Révisi nurutkeun $1",
-       "revision-info": "Révisi per $1; $2",
+       "revision-info": "Révisi per $1 ku {{GENDER:$6|$2}}$7",
        "previousrevision": "← Révisi leuwih heubeul",
        "nextrevision": "Révisi nu leuwih anyar →",
        "currentrevisionlink": "Témbongkeun révisi kiwari",
        "history-feed-description": "Sajarah révisi kaca ieu di wiki",
        "history-feed-item-nocomment": "$1 dina $2",
        "history-feed-empty": "Kaca nu dipundut teu kapanggih.\nBisa jadi geus dihapus ti wiki atawa diganti ngaranna.\nCobaan [[Special:Search|sungsi di wiki]] pikeun kaca-kaca nu sarimbag.",
+       "history-edit-tags": "Édit tag révisi anu dipilih",
        "rev-deleted-comment": "(rangkuman éditan dihapus)",
        "rev-deleted-user": "(ngaran pamaké geus dihapus)",
-       "rev-deleted-event": "(lampah log dihapus)",
+       "rev-deleted-event": "(wincikan log geus dihapus)",
        "rev-deleted-user-contribs": "[Ngaran pamaké atawa alamat IP dihapus - suntingan disumputkeun tina daptar kontribusi]",
        "rev-deleted-text-permission": "Révisi ieu kaca geus '''dihapus'''.\nPedaran lengkepna bisa dipilari di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log hapusan]",
-       "rev-deleted-text-unhide": "Révisi ieu kaca geus '''dihapus'''.\nLengkepna bisa ditéang dina [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log hapusan].\nSalaku kuncén, mun perlu, anjeun bisa kénéh [$1 nempo ieu révisi].",
-       "rev-suppressed-text-unhide": "Révisi ieu kaca geus '''dihapus'''.\nLengkepna bisa dipaluruh dina [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log hapusan].\nSalaku kuncén, mun perlu, anjeun bisa kénéh [$1 nempo ieu révisi].",
-       "rev-deleted-text-view": "Révisi ieu kaca geus '''dihapus'''.\nSalaku administrator, anjeun angger bisa nempo; pedaran lengkepna bisa dipilari di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log hapusan].",
+       "rev-suppressed-text-permission": "Révisi ieu kaca geus <strong>disuprési</strong>.\nWincikanana bisa dipaluruh di [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log suprési].",
+       "rev-deleted-text-unhide": "Révisi ieu kaca geus <strong>dihapus</strong>.\nWincikanana bisa dipaluruh di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log hapusan].\nAnjeun kénéh [$1 nempo ieu révisi] lamun perlu.",
+       "rev-suppressed-text-unhide": "Révisi ieu kaca geus <strong>disuprési</strong>.\nWincikanana bisa dipaluruh di [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log suprési].\nAnjeun bisa kénéh [$1 nempo ieu révisi] lamun perlu.",
+       "rev-deleted-text-view": "Révisi ieu kaca geus <strong>dihapus</strong>.\nAnjeun bisa kénéh nempo; wincikanana bisa dipaluruh di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log hapusan].",
+       "rev-suppressed-text-view": "Révisi ieu kaca geus <strong>disuprési</strong>.\nAnjeun bisa kénéh nempo; wincikanana bisa dipaluruh di [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log suprési].",
        "rev-deleted-no-diff": "Anjeun teu bisa némbongkeun bédana kusabab révisina geus '''dihapus'''.\nLeuwih lengkepna bisa ditéang di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log hapusan].",
        "rev-suppressed-no-diff": "Anjeun teu bisa ningali ieu parobahan ku sabab salah sahiji tina éditan geus ''dihapus'''.",
-       "rev-deleted-unhide-diff": "Salahsahiji révisi dina ieu béda geus '''dihapus'''.\nLengkepna bisa dipilari di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log hapusan].\nSalaku kuncen, mun perlu, anjeun bisa kénéh [$1 nempo bédana].",
+       "rev-deleted-unhide-diff": "Salasahiji révisi dina ieu jujutan geus <strong>dihapus</strong>.\nWincikanana bisa dipaluruh di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log hapusan].\nAnjeun bisa kénéh [$1 nempo jujutanana], lamun perlu.",
+       "rev-suppressed-unhide-diff": "Salasahiji révisi ieu jujutan geus <strong>disuprés</strong>.\nWincikanana bisa dipaluruh di [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log suprési].\nAnjeun bisa kénéh [$1 muka ieu jujutan] lamun perlu.",
        "rev-delundel": "témbongkeun/sumputkeun",
        "rev-showdeleted": "témbongkeun",
        "revisiondelete": "Hapus/bolay ngahapus révisi",
index 64f666d..c37821f 100644 (file)
@@ -73,7 +73,8 @@
                        "Macofe",
                        "Nighteagle2000",
                        "Watermelon juice",
-                       "Ömer Berkay"
+                       "Ömer Berkay",
+                       "Demircimehmed"
                ]
        },
        "tog-underline": "Bağlantıların altını çiz:",
        "pool-timeout": "Kilit için zaman bitimi bekleniyor",
        "pool-queuefull": "Havuz sırası dolu",
        "pool-errorunknown": "Bilinmeyen hata",
-       "pool-servererror": "Anket sayacı hizmeti kullanılamıyor ($1).",
+       "pool-servererror": "Havuz sayacı hizmeti kullanılamıyor ($1).",
        "poolcounter-usage-error": "Kullanım hatası: $1",
        "aboutsite": "{{SITENAME}} hakkında",
        "aboutpage": "Project:Hakkında",
        "title-invalid-characters": "İstenen sayfa başlığı geçersiz karakter içeriyor: \"$1\"",
        "title-invalid-relative": "Başlık göreli yol içeriyor. Göreli yol içeren başlıklar (./, ../ gibi) kullanılamaz, çünkü genelde kullanıcıların tarayıcıları bu şekildeki başlıklara erişimde sıkıntı yaşar.",
        "title-invalid-magic-tilde": "İstenen sayfa başlığı geçersiz bir sihirli yaklaşık işareti dizisi içeriyor (<nowiki>~~~</nowiki>).",
-       "title-invalid-too-long": "İstenen sayfa başlığı çok uzun. UTF-8 kodlamasında $1 bayttan daha uzun olmamalı.",
+       "title-invalid-too-long": "İstenen sayfa başlığı çok uzun. UTF-8 kodlamasında $1 {{PLURAL:$1|bayttan}} daha uzun olmamalı.",
        "title-invalid-leading-colon": "İstenen sayfa başlığının başında geçersiz bir \"iki nokta\" var.",
        "perfcached": "Aşağıdaki veriler önbellekten alınmıştır ve güncel olmayabilir. Önbellekte en fazla {{PLURAL:$1|bir sonuç|$1 sonuç}} mevcut.",
        "perfcachedts": "Aşağıdaki veri önbelleklenmiştir, son güncelleme tarihi: $1. Önbellekte en fazla {{PLURAL:$1|bir sonuç|$4 sonuç}} mevcut.",
        "content-model-css": "CSS",
        "content-json-empty-object": "Boş nesne",
        "content-json-empty-array": "Boş dizi",
+       "duplicate-args-warning": "<strong>Uyarı:</strong>[[:$1]] [[:$2]] şablonunu \"$3\" parametresi için birden fazla değerle çağırıyor. Sadece sağlanan son değer kullanılacak.",
        "duplicate-args-category": "Yinelenen şablon değişkenleri kullanan sayfalar",
        "duplicate-args-category-desc": "Sayfada içeren şablonları çağırmak için bu terimler kullanılır <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Uyarı: Bu sayfa çok fazla zengin derleyici fonksiyonu çağrısı içeriyor.\n\nBu $2 çağrıdan az olmalı, şu anda {{PLURAL:$1|1 çağrı var|$1 çağrı var}}.",
        "userrights-lookup-user": "Kullanıcı gruplarını düzenle",
        "userrights-user-editname": "Kullanıcı adı giriniz:",
        "editusergroup": "Kullanıcı grupları düzenle",
-       "editinguser": "'''[[User:$1|$1]]'''  $2 kullanıcısının yetkilerini değiştirmektesiniz",
+       "editinguser": "<strong>'''[[User:$1|$1]]'''</strong> $2 kullanıcısının yetkileri değiştiriliyor",
        "userrights-editusergroup": "Kullanıcı grupları düzenle",
        "saveusergroups": "Kullanıcı grupları kaydet",
        "userrights-groupsmember": "İçinde olduğu gruplar:",
        "uploaddisabledtext": "Dosya yüklemeleri devredışı bırakılmıştır.",
        "php-uploaddisabledtext": "PHP dosyası yüklemeleri devre dışıdır. Lütfen file_uploads ayarını kontrol edin.",
        "uploadscripted": "Bu dosya bir internet tarayıcısı tarafından hatalı çevrilebilecek bir HTML veya script kodu içermektedir.",
+       "upload-scripted-pi-callback": "xml-stylesheet işleme talimatları içeren bir dosyalar yüklenemez.",
+       "uploaded-script-svg": "Yüklenen SVG dosyasında komutlanabilir (scriptable) öğe bulundu: \"$1\"",
+       "uploaded-hostile-svg": "Yüklenen SVG dosyasının \"style\" öğesinde güvensiz CSS bulundu.",
+       "uploaded-event-handler-on-svg": "SVG dosyalarında event-handler özniteliğini <code>$1=\"$2\"</code> şeklinde ayarlanmasına izin verilmiyor.",
+       "uploaded-href-attribute-svg": "SVG dosyalarında yerel olmayan (örn. http://, javascript:, vb.) hedefleri olan <code>&lt;$1 $2=\"$3\"&gt;</code> href özniteliklerine izin verilmez.",
+       "uploaded-href-unsafe-target-svg": "Yüklenen SVG dosyasında <code>&lt;$1 $2=\"$3\"&gt;</code> güvensiz hedefine href bulundu.",
+       "uploaded-animate-svg": "\"animate\" etiketi bulundu, href'i değiştiriyor olabilir. Yüklenen SVG dosyasındaki \"from\" özniteliği kullanılıyor  <code>&lt;$1 $2=\"$3\"&gt;</code>",
        "uploadscriptednamespace": "Bu SVG dosyası geçersiz \"$1\" alan adını içermektedir.",
        "uploadinvalidxml": "Yüklenen dosyadaki XML işlenemedi.",
        "uploadvirus": "Bu dosya virüslüdür! Detayları: $1",
index cc2f201..02c6f54 100644 (file)
@@ -59,7 +59,8 @@
                        "Green Zero",
                        "Macofe",
                        "Alex Blokha",
-                       "Lxlalexlxl"
+                       "Lxlalexlxl",
+                       "Капитан Джон Шепард"
                ]
        },
        "tog-underline": "Підкреслювання посилань:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Порожній об'єкт",
        "content-json-empty-array": "Порожній масив",
+       "duplicate-args-warning": "<strong>Увага:</strong> [[:$1]] викликає [[:$2]] з більш ніж одним значенням параметра «$3». Буде використано лише останнє вказане значення.",
        "duplicate-args-category": "Сторінки, що містять шаблон із кількома значеннями одного й того ж параметра",
        "duplicate-args-category-desc": "Тут перелічено сторінки, що містять дублікатне визначення аргументу при включенні шаблону, приміром, <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> або <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Увага:''' Ця сторінка містить дуже багато викликів ресурсомістких функцій.\n\nКількість викликів не повинна перевищувати $2, зараз потрібно зробити $1 {{PLURAL:$1|виклик|виклики|викликів}}.",
        "uploaddisabledtext": "Можливість завантаження файлів відключена.",
        "php-uploaddisabledtext": "Завантаження файлів вимкнене у налаштуваннях PHP. Будь ласка, перевірте значення file_uploads.",
        "uploadscripted": "Файл містить HTML-код або скрипт, який може неправильно обробитися браузером.",
+       "upload-scripted-pi-callback": " \t\nНеможливо завантажити файл, що містить інструкції опрацювання таблиці стилів XML.",
+       "uploaded-script-svg": " \t\t\nЗнайдений небезпечний елемент з підтримкою сценаріїв «$1» в завантаженому файлі SVG.",
+       "uploaded-hostile-svg": " \t\nЗнайдений небезпечний CSS-код в елементі стилю завантаженого файлу SVG.",
+       "uploaded-event-handler-on-svg": " \t\nУстановка атрибутів обробника подій <code>$1=\"$2\"</code> не дозволено для SVG-файлів.",
+       "uploaded-href-attribute-svg": " \t\t\nУ SVG-файлів не допускаються href атрибути <code>&lt;$1 $2=\"$3\"&gt;</code> з засобів перехресного локального обміну повідомленнями з метою (т. е. http:// javascript:, тощо).",
        "uploadscriptednamespace": "Цей SVG-файл містить недопустимий простір імен \"$1\"",
        "uploadinvalidxml": "Не вдалося проаналізувати XML у завантаженому файлі.",
        "uploadvirus": "Файл містить вірус! Див. $1",
        "listfiles-delete": "видалити",
        "listfiles-summary": "Ця спеціальна сторінка показує всі завантажені файли.",
        "listfiles_search_for": "Пошук по назві зображення:",
-       "listfiles-userdoesnotexist": "Ð\9eблÑ\8bковий Ð·Ð°Ð¿Ð¸Ñ\81 Â«$1» Ð½Ðµ Ð·Ð°Ñ\80еÑ\8dстровано.",
+       "listfiles-userdoesnotexist": "Ð\9eблÑ\96ковий Ð·Ð°Ð¿Ð¸Ñ\81 Â«$1» Ð½Ðµ Ð·Ð°Ñ\80еÑ\94стровано.",
        "imgfile": "файл",
        "listfiles": "Список файлів",
        "listfiles_thumb": "Мініатюра",
index 3c93d85..04e30ad 100644 (file)
@@ -17,7 +17,8 @@
                        "Impersonator 1",
                        "LNDDYL",
                        "TheChampionMan1234",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Poiuyt"
                ]
        },
        "tog-underline": "鏈接下橫線:",
@@ -25,7 +26,7 @@
        "tog-hidepatrolled": "此垡變化裏囥脫巡脫編",
        "tog-newpageshidepatrolled": "新頁表裏囥脫巡脫頁",
        "tog-extendwatchlist": "擴大關注表,顯示全部變化,弗單清此垡個",
-       "tog-usenewrc": "使用强化版个近段辰光个改动(JavaScript)",
+       "tog-usenewrc": "使用折叠版个近段辰光个改动搭关注表",
        "tog-numberheadings": "標題自動編號",
        "tog-showtoolbar": "顯示編傢伙欄",
        "tog-editondblclick": "捺兩記編頁",
@@ -44,7 +45,7 @@
        "tog-shownumberswatching": "顯示關注人數",
        "tog-oldsig": "能界签名先望:",
        "tog-fancysig": "畀簽名當wiki文本(弗自動鏈接)",
-       "tog-uselivepreview": "用當場先望(試驗)",
+       "tog-uselivepreview": "使用实时预览",
        "tog-forceeditsummary": "編要空白到提醒我",
        "tog-watchlisthideown": "關注表裏囥脫我所編",
        "tog-watchlisthidebots": "關注表裏囥脫機器人所編",
        "tog-prefershttps": "登录后老世用保险连接",
        "underline-always": "老世",
        "underline-never": "老世弗",
-       "underline-default": "ç\9a®è\86\9aè¦\81å¼\97æµ\81覽å\99¨é»\98èª\8d",
+       "underline-default": "ç\9a®è\82¤æ\88\96æµ\8fè§\88å\99¨é»\98认设置",
        "editfont-style": "編寫區字體樣式:",
-       "editfont-default": "æµ\81覽å\99¨é»\98èª\8d",
-       "editfont-monospace": "樣闊字體",
-       "editfont-sansserif": "Sans-serif字體",
-       "editfont-serif": "Serif字體",
-       "sunday": "星期日",
-       "monday": "星期一",
-       "tuesday": "星期二",
-       "wednesday": "星期三",
-       "thursday": "星期四",
-       "friday": "星期五",
-       "saturday": "星期六",
+       "editfont-default": "æµ\8fè§\88å\99¨é»\98认",
+       "editfont-monospace": "等阔字体",
+       "editfont-sansserif": "无衬线字体",
+       "editfont-serif": "衬线字体",
+       "sunday": "礼拜日",
+       "monday": "礼拜一",
+       "tuesday": "礼拜两",
+       "wednesday": "礼拜三",
+       "thursday": "礼拜四",
+       "friday": "礼拜五",
+       "saturday": "礼拜六",
        "sun": "日",
        "mon": "一",
-       "tue": "äº\8c",
+       "tue": "两",
        "wed": "三",
        "thu": "四",
        "fri": "五",
@@ -93,7 +94,7 @@
        "november": "11月",
        "december": "12月",
        "january-gen": "一月",
-       "february-gen": "äº\8c月",
+       "february-gen": "两月",
        "march-gen": "三月",
        "april-gen": "四月",
        "may-gen": "五月",
        "december-date": "12月 $1",
        "pagecategories": "{{PLURAL:$1|分类}}",
        "category_header": "“$1”分類裏個頁",
-       "subcategories": "å\85\92å\88\86é¡\9e",
+       "subcategories": "å­\90å\88\86ç±»",
        "category-media-header": "\"$1\"分类里个媒体",
        "category-empty": "''箇分类里页搭媒体能界还呒有。''",
        "hidden-categories": "$1囥脫分類",
        "mypage": "我个页面",
        "mytalk": "我个讨论",
        "anontalk": "箇IP地址個話",
-       "navigation": "å°\8e航",
+       "navigation": "导航",
        "and": "&#32;搭",
        "qbfind": "尋",
-       "qbbrowse": "æµ\81覽",
+       "qbbrowse": "æµ\8fè§\88",
        "qbedit": "編",
        "qbpageoptions": "箇頁",
        "qbmyoptions": "我頁",
        "actions": "动作",
        "namespaces": "名字空间",
        "variants": "变量",
+       "navigation-heading": "导航菜单",
        "errorpagetitle": "錯誤",
        "returnto": "返回$1。",
-       "tagline": "从{{SITENAME}}来",
-       "help": "幫忙",
+       "tagline": "来自{{SITENAME}}",
+       "help": "帮忙",
        "search": "寻",
        "searchbutton": "搜寻",
        "go": "去",
        "permalink": "老世链接",
        "print": "打印",
        "view": "望",
+       "view-foreign": "登$1上看",
        "edit": "编",
        "create": "建",
+       "create-local": "添加本地说明",
        "editthispage": "編箇頁",
        "create-this-page": "建箇頁",
        "delete": "刪",
        "unprotectthispage": "變更箇頁保態",
        "newpage": "新页",
        "talkpage": "探討箇頁",
-       "talkpagelinktext": "è¨\8eè«\96",
+       "talkpagelinktext": "讨论",
        "specialpage": "特別頁",
        "personaltools": "私人家伙",
        "articlepage": "望內容頁",
-       "talk": "探讨",
+       "talk": "讨论",
        "views": "望",
-       "toolbox": "家伙匣",
+       "toolbox": "家",
        "userpage": "望用戶頁",
        "projectpage": "望計劃頁",
        "imagepage": "望文件頁",
        "otherlanguages": "别样话版",
        "redirectedfrom": "(从$1转戳到箇里)",
        "redirectpagesub": "轉戳頁",
+       "redirectto": "重定向到:",
        "lastmodifiedat": "箇页此垡来$1 $2改进。",
        "viewcount": "箇頁望過$1垡。",
        "protectedpage": "受保頁",
        "pool-queuefull": "池队列满哉",
        "pool-errorunknown": "弗识个错误",
        "aboutsite": "有关{{SITENAME}}",
-       "aboutpage": "Project:有关",
-       "copyright": "内容侪拉$1下底发布。",
+       "aboutpage": "Project:关于",
+       "copyright": "除非另外声明,内容侪拉$1下底发布。",
        "copyrightpage": "{{ns:project}}:版权",
-       "currentevents": "箇阶段个事干",
-       "currentevents-url": "Project:箇阶段个事干",
-       "disclaimers": "甮追問",
-       "disclaimerpage": "Project:甮追問",
+       "currentevents": "近段辰光个事体",
+       "currentevents-url": "Project:近段辰光个事体",
+       "disclaimers": "免责声明",
+       "disclaimerpage": "Project:免责声明",
        "edithelp": "編寫幫助",
        "mainpage": "封面",
        "mainpage-description": "封面",
        "policy-url": "Project:策略",
-       "portal": "社å\8d\80è\87ºé\96\80",
-       "portal-url": "Project:社å\8d\80è\87ºé\96\80",
-       "privacy": "é\9a±ç§\81ç­\96ç\95¥",
-       "privacypage": "Project:é\9a±ç§\81ç­\96ç\95¥",
+       "portal": "社å\8cºé\97¨å \82",
+       "portal-url": "Project:社å\8cºé\97¨å \82",
+       "privacy": "é\9a\90ç§\81æ\94¿ç­\96",
+       "privacypage": "Project:é\9a\90ç§\81æ\94¿ç­\96",
        "badaccess": "权限",
        "badaccess-group0": "弗準爾做箇操作。",
        "badaccess-groups": "爾個請求要徠{{PLURAL:$2|箇個}}用戶組裏好用:$1。",
        "ok": "好",
        "retrievedfrom": "取自“$1”",
        "youhavenewmessages": "你侬有$1($2)。",
-       "newmessageslinkplural": "{{PLURAL:$1|新消息}}",
+       "newmessageslinkplural": "{{PLURAL:$1|新消息|999=新消息}}",
        "newmessagesdifflinkplural": "此垡̺{{PLURAL:$1|变化}}",
        "youhavenewmessagesmulti": "爾徠$1裏有新信息",
-       "editsection": "ç·¨",
+       "editsection": "ç¼\96è¾\91",
        "editold": "编",
        "viewsourceold": "望源碼",
        "editlink": "编",
-       "viewsourcelink": "æ\9c\9bæº\90碼",
+       "viewsourcelink": "æ\9c\9bæº\90ç \81",
        "editsectionhint": "编段: $1",
        "toc": "目录",
        "showtoc": "顯示",
        "badtitle": "坏标题",
        "badtitletext": "所请求页面个标题是无效个、弗存在,跨语言或跨wiki链接个标题错误。渠作兴包含一只或多只弗好用拉标题里向字符。",
        "perfcached": "下向是缓存数据,呒数弗是最新个。 A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
-       "perfcachedts": "下头是缓存数据,压末一趟更新辰光是$1。 A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+       "perfcachedts": "下头是缓存数据,阿末一趟更新辰光是$1。缓存里最多有{{PLURAL:$4|$4条结果}}。",
        "querypage-no-updates": "当前禁止对此页面进行更新。箇搭个数据弗好立即刷新。",
        "viewsource": "望源码",
        "actionthrottled": "动作已压制",
        "viewsourcetext": "侬可以查看搭仔复制箇只页面个源码:",
        "viewyourtext": "你侬好望也好畀'''你侬编个'''复制到箇页:",
        "protectedinterface": "箇页为箇维基个软件提供界面文本,锁牢定防乱用。\n加改全部维基个译文,用[//translatewiki.net/ translatewiki.net],MediaWiki软件个本地化计划。",
-       "editinginterface": "'''警告:''' 侬来里编写个页面是畀软件用个界面文本。箇页变化会影响各许人个界面样子。假使要畀全部维基翻译,用 [//translatewiki.net/wiki/Main_Page?setlang=zh-hans translatewiki.net],MediaWiki软件个本地化计划。",
+       "editinginterface": "<strong>警告:</strong>侬来里编写个页面是畀软件用个界面文本。箇页变化会影响各许人个界面样子。",
        "cascadeprotected": "箇只页面拨保护拉许,因为箇只页面拨下底已经标注“级联保护”个{{PLURAL:$1|一只|多只}}被保护页面包含:\n$2",
        "namespaceprotected": "侬无没编辑'''$1'''名字空间里向页面个权限。",
        "customcssprotected": "箇CSS页你呒处编,箇页有各许用户个私人设置。",
        "invalidtitle-knownnamespace": "非法个题目头,有名字空间$2搭文字$3",
        "invalidtitle-unknownnamespace": "非法个题目头,有弗识个数字$1搭文字$2",
        "exception-nologin": "朆登录",
-       "exception-nologin-text": "箇页要勿箇操作需要你登录到箇wiki裏来。",
+       "exception-nologin-text": "请登录来访问箇页面或操作。",
        "virus-badscanner": "设置问题:未知个反病毒扫描器:''$1''",
        "virus-scanfailed": "扫描失败(代码 $1)",
        "virus-unknownscanner": "未知个反病毒扫描器:",
        "welcomeuser": "走来赞,$1!",
        "welcomecreation-msg": "你个账号建起来哉。\n覅忘记哉走去改你个[[Special:Preferences|{{SITENAME}}个私人偏好]]。",
        "yourname": "用户名:",
+       "userlogin-yourname": "用户名",
        "userlogin-yourname-ph": "打进你侬个用户名",
        "createacct-another-username-ph": "打进用户名",
        "yourpassword": "密码:",
+       "userlogin-yourpassword": "密码",
        "userlogin-yourpassword-ph": "密码打进去",
        "createacct-yourpassword-ph": "密码打进去",
        "yourpasswordagain": "密码再打一遍:",
-       "createacct-yourpasswordagain-ph": "密码打一遍添",
+       "createacct-yourpasswordagain": "确认密码",
+       "createacct-yourpasswordagain-ph": "再打一遍密码",
        "remembermypassword": "徕箇浏览器里畀我登进去个记牢(记$1{{PLURAL:$1|日|日}})",
-       "userlogin-remembermypassword": "长期徕线里",
+       "userlogin-remembermypassword": "记牢我个登录状态",
        "userlogin-signwithsecure": "用保险链接",
        "yourdomainname": "侬个域名:",
        "password-change-forbidden": "箇wiki裏呒处改你侬个密码。",
        "logout": "登出",
        "userlogout": "登出",
        "notloggedin": "弗曾登录",
-       "userlogin-noaccount": "账号还呒?",
+       "userlogin-noaccount": "呒不账号?",
        "userlogin-joinproject": "加进{{SITENAME}}",
        "nologin": "你侬还呒有账号?'''$1'''。",
        "nologinlink": "建新账号",
        "gotaccount": "已经有仔帐号哉? '''$1'''。",
        "gotaccountlink": "登录",
        "userlogin-resetlink": "忘记登录细节?",
-       "userlogin-resetpassword-link": "转设密码",
+       "userlogin-resetpassword-link": "忘脱密码?",
+       "userlogin-helplink2": "登录帮忙",
        "userlogin-loggedin": "你侬用{{GENDER:$1|$1}}登进来哉。用下向个表以别样身份登进。",
        "userlogin-createanother": "建别样账号",
        "createacct-emailrequired": "电子信地址",
        "passwordtooshort": "密码起码要$1个字符。",
        "password-name-match": "密码弗好搭户名一样。",
        "password-login-forbidden": "用箇名字搭密码是弗准个。",
-       "mailmypassword": "新密码用电子信寄畀我",
+       "mailmypassword": "重置密码",
        "passwordremindertitle": "{{SITENAME}} 个临时新密码",
        "passwordremindertext": "有人(作兴是侬,来自IP地址$1)已经请求{{SITENAME}}个新密码($4)。\n用户“$2”个一只新临时密码现在已经设置好为“$3”。\n假使箇只动作是侬发起个,侬需要立即登录并选择一只新个密码。\n侬个临时密码会得垃拉$5日里向过期。\n\n假使箇只请求弗是侬发起个,或者侬已经拿密码想起来外加弗准备改脱渠,\n侬可以忽略此消息并继续使用侬个旧密码。",
        "noemail": "用户\"$1\"弗曾登记电子邮件地址。",
        "noemailcreate": "侬要提供只有效个电子邮件地址",
        "passwordsent": "用户\"$1\"个新密码已经寄往登记个电子邮件地址。\n请收着仔再登录。",
        "blocked-mailpassword": "侬个IP地址处于查封状态,弗允许编辑,为仔安全起见,密码恢复功能已经禁用。",
-       "eauthentsent": "一封确认信已经发送到指定个e-mail地址。垃拉发送其它邮件到箇只账户之前,侬必须首先按照箇封信里向个指示确认箇只电子邮箱真实有效。",
+       "eauthentsent": "一封确认信已经发送到指定个电子邮箱地址。\n垃拉其它邮件发送到箇只账户之前,侬必须首先按照箇封信里向个指示,确认箇只邮箱真实有效。",
        "throttled-mailpassword": "密码转设电子信徕最近$1个钟头里发畀你侬哉。保险点,密码转设电子信$1个钟头只一垡好发。",
        "mailerror": "发送邮件错误:$1",
        "acct_creation_throttle_hit": "弗好意思,使用箇只IP个访客已经创建仔$1只账号,迭个是箇段辰光里向所允许个最大值。箇咾使用箇只IP个地址个访客暂时弗好再创建账户。",
-       "emailauthenticated": "侬个电子邮箱地址已经垃拉$2 $3确认有效。",
-       "emailnotauthenticated": "侬个邮箱地址<strong>还弗曾认证</strong>。下底眼功能将弗会发送任何邮件。",
+       "emailauthenticated": "侬个电子邮箱地址已经垃拉$2 $3确认。",
+       "emailnotauthenticated": "侬个电子邮箱地址还朆确认。\n下底个功能弗会发送任何邮件。",
        "noemailprefs": "指定一只电子邮箱地址以使用箇眼功能。",
        "emailconfirmlink": "确认邮箱地址",
        "invalidemailaddress": "邮箱地址格式弗对,请输入正确个邮箱地址或清空输入框。",
        "createaccount-title": "垃拉{{SITENAME}}里向创建新账户",
        "createaccount-text": "有人垃拉{{SITENAME}}里向利用侬个邮箱创建仔一只叫 \"$2\" 个新帐户($4),密码是 \"$3\" 。侬应该立即登录并更改密码。\n\n如果箇个账户创建错误个说话,侬可以忽略此信息。",
        "login-throttled": "你侬试登忒多次哉。\n等 $1 再试试凑相。",
-       "login-abort-generic": "登录弗成功 - 流产",
+       "login-abort-generic": "登录弗成功 - 已终止",
        "loginlanguagelabel": "语言:$1",
        "suspicious-userlogout": "侬登出个要求已经拨回头脱,因为渠可能是由已损坏个浏览器或者缓存代理传送个。",
+       "pt-login": "登录",
+       "pt-login-button": "登录",
+       "pt-createaccount": "建账号",
+       "pt-userlogout": "登出",
        "changepassword": "改密码",
-       "resetpass_announce": "侬是通过一只临时发送到e-mail里向个代码登录的。要完成登录,侬必须垃此地设定一只新密码:",
+       "resetpass_announce": "要完成登录,侬必须设定一只新密码。",
        "resetpass_header": "更改密码",
        "oldpassword": "旧密码:",
        "newpassword": "新密码:",
        "resetpass-submit-cancel": "取消",
        "resetpass-wrong-oldpass": "无效个临时或者现有密码。\n侬作兴已经成功拿密码改脱,或者已经请求一个新个临时密码。",
        "resetpass-temp-password": "临时密码:",
+       "passwordreset": "重置密码",
        "passwordreset-username": "用戶名",
-       "bold_sample": "黑体文本",
-       "bold_tip": "黑体文本",
+       "bold_sample": "粗体文字",
+       "bold_tip": "粗体文字",
        "italic_sample": "斜体文本",
        "italic_tip": "斜体文本",
        "link_sample": "链接标题",
        "media_tip": "文件链接",
        "sig_tip": "签名搭辰光戳",
        "hr_tip": "水平线 (小心用)",
-       "summary": "摘要:",
+       "summary": "摘要",
        "subject": "主题 / 标题:",
        "minoredit": "箇是小变化",
        "watchthis": "关注箇页",
        "preview": "望望相",
        "showpreview": "显示望望相",
        "showdiff": "显示变化",
-       "anoneditwarning": "'''警告:''' 你侬朆登进来。\n你侬个IP地址会记进箇页个编史里。",
+       "anoneditwarning": "<strong>警告:</strong>你呒不登录。如果你做仔啥编辑,箇么你个IP地址会公开可见。如果你<strong>[$1 登录]</strong>或<strong>[$2 创建]</strong>一个账号,你个编辑会归功于你用户名下底,而且会有其他好处。",
        "anonpreviewwarning": "''侬弗曾登录。侬个IP位址会得记录拉此页个编辑历史里向。''",
        "missingsummary": "'''提示:''' 侬弗曾提供编辑摘要。假使侬再次单击保存,侬个编辑将弗带编辑摘要保存。",
        "missingcommenttext": "请垃下头输入备注。",
        "blockedtitle": "用户拨查封",
        "blockedtext": "侬个用户名或IP地址已经拨$1查封。\n\n箇趟查封是由$1所封个。原因是''$2''。\n\n* 箇趟查封开始个辰光是:$8\n* 箇趟查封到期个辰光是:$6\n* 对于畀查封者:$7\n\n侬可以联络$1或者其他个 [[{{MediaWiki:Grouppage-sysop}}|管理员]],讨论箇趟查封。\n除非侬已经垃侬个 [[Special:Preferences|个人设置]]里向设置仔一只有效个电子邮件地址,弗然侬弗好使用「e-mail箇位用户」功能。当设置了一只有效个电子邮件地址之后,箇只功能是弗会畀封锁个。\n\n侬个IP地址是$3,而该查封ID是 #$5。 请垃拉侬个查询里向注明以上所有资料。",
        "autoblockedtext": "侬个IP地址已经自动查封,由于之前另一位 搭侬用一样IP个用户畀$1所查封。\n而查封个原因是:\n\n:''$2''\n\n* 箇趟查封个开始辰光是:$8\n* 箇趟查封个到期辰光是:$6\n* 对于畀查封者:$7\n\n侬可以联络$1或者其他个 [[{{MediaWiki:Grouppage-sysop}}|管理员]],讨论箇趟查封。\n除非侬已经垃侬个 [[Special:Preferences|个人设置]]里向设置仔一只有效个电子邮件地址,弗然侬弗好使用「e-mail箇位用户」功能。当设置了一只有效个电子邮件地址之后,箇只功能是弗会畀封锁个。\n\n侬个IP地址是$3,而该查封ID是 #$5。 请垃拉侬个查询里向注明以上所有资料。",
-       "blockednoreason": "弗曾拨原因",
+       "blockednoreason": "朆畀出原因",
        "whitelistedittext": "侬必须$1才能编辑。",
        "confirmedittext": "垃拉编辑此页之前侬必须确认侬个邮箱地址。请通过[[Special:Preferences|个人设置]]设置并验证侬个邮箱地址。",
        "nosuchsectiontitle": "寻弗着箇只段落",
        "session_fail_preview": "'''弗好意思!由于会话数据落失,我伲弗好处理侬个编辑。'''请重试。如果再次失败,请尝试[[Special:UserLogout|登出]]之后重新登录。",
        "session_fail_preview_html": "'''弗好意思!我伲弗好处理侬垃拉进程数据落失辰光个编辑。'''\n\n''由于{{SITENAME}}允许使用原始个 HTML,为著防范 JavaScript 攻击,预览已畀隐藏。''\n\n'''如果这是一次合法的编辑,请重新进行尝试。'''如果还不行,请 [[Special:UserLogout|退出]]并重新登录。",
        "token_suffix_mismatch": "'''由于侬用户端里向个编辑令牌毁损仔一些标点符号字元,为防止编辑个文字损坏,侬个编辑已经畀回头。'''\n箇种情况通常出现垃拉使用含有交关bug、以网络为主个匿名代理服务个辰光。",
-       "editing": "徕里编$1",
+       "editing": "来里编$1",
+       "creating": "创建“$1”",
        "editingsection": "徕里编写$1(段)",
        "editingcomment": "垃许编辑 $1 (新段落)",
        "editconflict": "编辑冲突: $1",
        "currentrev": "最后版本",
        "currentrev-asof": "于$1个最新修订版",
        "revisionasof": "垃拉$1所作出个修订版",
-       "revision-info": "垃拉$1由$2所作版本",
+       "revision-info": "{{GENDER:$6|$2}}$1个版本$7",
        "previousrevision": "←还旧版",
        "nextrevision": "新点个版本→",
        "currentrevisionlink": "最后版本",
        "history-feed-description": "wiki里向本页个修订历史",
        "history-feed-item-nocomment": "$1垃拉$2",
        "history-feed-empty": "请求个页面弗存在。渠作兴已畀删除或重命名。\n尝试[[Special:Search|搜索本站]]获得相关新建页面。",
-       "rev-deleted-comment": "(备注已删除)",
+       "rev-deleted-comment": "(编辑摘要畀删脱)",
        "rev-deleted-user": "(用户名已删除)",
-       "rev-deleted-event": "(日志动作已删除)",
+       "rev-deleted-event": "(日志细节畀删脱)",
        "rev-deleted-user-contribs": "[用户名或IP地址已删除 - 垃贡献里向囥脱编辑]",
        "rev-deleted-text-permission": "箇只页面版本已畀'''删除'''。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]里向可以寻着详细信息。",
-       "rev-deleted-text-unhide": "箇只页面修订已经畀'''删除'''。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]里向可以寻着详细信息。\n作为管理员,如果侬想继续个闲话,侬可以仍旧[$1 查看箇趟修订]。",
-       "rev-suppressed-text-unhide": "箇只页面修订已经畀'''废止'''。\n垃拉[{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} 废止日志]里向可以寻着详细信息。\n作为管理员,如果侬想继续个闲话,侬可以仍旧[$1 查看箇趟修订]。",
-       "rev-deleted-text-view": "箇只页面修订已经畀'''删除'''。作为管理员,侬可以查看渠;\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]里向可以寻着详细信息。",
-       "rev-suppressed-text-view": "箇只页面修订已经畀'''废止'''。作为管理员,侬可以查看渠;\n垃拉[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 废止日志]里向可以寻着详细信息。",
+       "rev-deleted-text-unhide": "箇只页面修订已经畀<strong>删脱</strong>。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]里向可以寻着详细信息。\n如果侬想继续个说话,侬仍旧好[$1 查看箇趟修订]。",
+       "rev-suppressed-text-unhide": "箇只页面修订已经畀<strong>监督囥脱</strong>。\n垃拉[{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} 监督日志]里向可以寻着详细信息。\n如果侬想继续个说话,侬仍旧好[$1 查看箇趟修订]。",
+       "rev-deleted-text-view": "箇只页面修订已经畀<strong>删脱</strong>。\n侬可以查看渠;垃拉[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]里向可以寻着详细信息。",
+       "rev-suppressed-text-view": "箇只页面修订已经畀<strong>监督囥脱</strong>。\n侬可以查看渠;垃拉[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]里向可以寻着详细信息。",
        "rev-deleted-no-diff": "因为其中一趟修订已畀'''删除''',侬弗可以查看差异。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]里向可以寻着更多信息。",
        "rev-suppressed-no-diff": "箇只页面个其中一趟版本已经畀'''删除''',箇咾弗可以查看箇趟版本。",
-       "rev-deleted-unhide-diff": "箇只页面个其中一趟修订已经畀'''删除'''。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]里向可以寻着更多信息。\n作为管理员,如果侬想继续个闲话,侬仍旧可以[$1 查看箇趟修订]。",
-       "rev-suppressed-unhide-diff": "箇只页面个其中一趟修订已经拨'''废止'''。\n垃拉[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 废止日志]里向可以寻着更多资料。\n作为管理员,如果侬想继续个闲话,侬可以仍旧[$1 查看箇趟修订]。",
-       "rev-deleted-diff-view": "差异里向个一趟修订已拨'''删除'''。\n作为管理员,侬可以查看箇个差异。详细信息可垃拉[{{fullurl: {{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]里向寻着。",
-       "rev-suppressed-diff-view": "差异里向个一趟修订已拨'''废止'''。\n作为管理员,侬可以查看箇个差异。详细信息可垃拉[{{fullurl: {{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 废止日志]里向寻着。",
+       "rev-deleted-unhide-diff": "箇只页面个其中一趟修订已经畀<strong>删脱</strong>。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]里向可以寻着更多信息。\n如果侬想继续个说话,侬仍旧好[$1 查看箇趟修订]。",
+       "rev-suppressed-unhide-diff": "箇只页面个其中一趟修订已经畀<strong>监督囥脱</strong>。\n垃拉[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]里向可以寻着详细信息。\n如果侬想继续个说话,侬仍旧好[$1 查看箇趟修订]。",
+       "rev-deleted-diff-view": "差异对比里向个一趟修订已经畀<strong>删脱</strong>。\n侬可以查看箇个差异;详细信息可垃拉[{{fullurl: {{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]里向寻着。",
+       "rev-suppressed-diff-view": "差异对比里向个一趟修订已经畀<strong>监督囥脱</strong>。\n侬可以查看箇个差异;详细信息可垃拉[{{fullurl: {{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]里向寻着。",
        "rev-delundel": "显示/囥脱",
        "rev-showdeleted": "显示",
        "revisiondelete": "删除 / 反删除版本",
        "revertmerge": "反合并",
        "mergelogpagetext": "下底是只最近发生个页面历史合并个记录列表。",
        "history-title": "“$1”的版本历史",
+       "difference-title": "“$1”版本间个差别",
        "lineno": "第$1排:",
        "compareselectedversions": "比较选中个版本",
        "showhideselectedversions": "显示/囥脱选定修订版本",
        "editundo": "撤销",
+       "diff-multi-sameuser": "(朆显示同一用户个$1个中间版本)",
        "searchresults": "搜寻结果",
        "searchresults-title": "搜寻“$1”个结果",
        "titlematches": "页面标题匹配",
        "shown-title": "一页显示$1个结果",
        "viewprevnext": "查看($1 {{int:pipe-separator}} $2)($3)",
        "searchmenu-exists": "'''箇wiki里有一页名字“[[:$1]]”哉'''",
-       "searchmenu-new": "'''徕箇wiki里建“[[:$1]]”页!'''",
+       "searchmenu-new": "<strong>登箇Wiki上建“[[:$1]]”页!</strong>{{PLURAL:$2|0=|另见寻着个页面。|另见搜寻个结果。}}",
        "searchprofile-articles": "内容页",
        "searchprofile-images": "多媒体",
        "searchprofile-everything": "全部",
        "searchprofile-advanced": "高级",
-       "searchprofile-articles-tooltip": "徕$1里搜寻",
+       "searchprofile-articles-tooltip": "登$1里向寻",
        "searchprofile-images-tooltip": "搜寻文件",
        "searchprofile-everything-tooltip": "搜寻全部内容(包括讨论页)",
        "searchprofile-advanced-tooltip": "垃拉自定义名字空间里向搜索",
        "searchrelated": "相关",
        "searchall": "全部",
        "showingresults": "下头显示从第<b>$2</b>条开始个<b>$1</b>条结果:",
+       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong>条结果里个<strong>$1</strong>条|<strong>$3</strong>条结果里个<strong>$1~$2</strong>条}}",
        "search-nonefound": "查询呒有结果。",
        "powersearch-legend": "高级搜索",
        "powersearch-ns": "垃拉箇眼名字空间里向搜索:",
        "right-movefile": "移文件",
        "right-upload": "傳文件",
        "right-reupload": "文件以舊換新",
+       "right-writeapi": "使用写入API",
        "right-delete": "刪頁面",
        "right-browsearchive": "搜尋已刪頁",
        "right-viewmywatchlist": "望自己個關注表",
        "action-editmyprivateinfo": "編私人信息",
        "nchanges": "$1趟更改",
        "enhancedrc-history": "歷史",
-       "recentchanges": "箇阶段个变化",
+       "recentchanges": "近段辰光个改动",
        "recentchanges-legend": "箇阶段个变化选项",
        "recentchanges-summary": "登该个页面浪跟踪最近对维基百科个改动。",
        "recentchanges-feed-description": "跟踪此订阅垃拉 wiki 高头个最近更改。",
        "recentchanges-label-newpage": "建新页来编",
        "recentchanges-label-minor": "箇是小编写",
+       "recentchanges-label-bot": "箇编辑由机器人执行",
+       "recentchanges-label-unpatrolled": "该编辑还朆巡查",
+       "recentchanges-label-plusminus": "箇页面字节数前后个变化",
+       "recentchanges-legend-heading": "'''说明:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}(见[[Special:NewPages|新页面列表]])",
        "rclistfrom": "显示 $3 $2 以来个新改动",
        "rcshowhideminor": "$1小编写",
+       "rcshowhideminor-show": "显示",
+       "rcshowhideminor-hide": "囥脱",
        "rcshowhidebots": "$1机器人",
-       "rcshowhideliu": "$1登录个用户",
+       "rcshowhidebots-show": "显示",
+       "rcshowhidebots-hide": "囥脱",
+       "rcshowhideliu": "$1注册用户",
+       "rcshowhideliu-hide": "囥脱",
        "rcshowhideanons": "$1匿名用户",
-       "rcshowhidemine": "$1我个修改",
+       "rcshowhideanons-show": "显示",
+       "rcshowhideanons-hide": "囥脱",
+       "rcshowhidemine": "$1我个编辑",
+       "rcshowhidemine-show": "显示",
+       "rcshowhidemine-hide": "囥脱",
        "rclinks": "显示来拉上个 $2 日里向个最近 $1 趟改动<br />$3",
        "diff": "两样",
        "hist": "历史",
        "minoreditletter": "小",
        "newpageletter": "新",
        "boteditletter": "机",
+       "rc-change-size-new": "更改后有$1字节",
        "newsectionsummary": "/* $1 */ 新段落",
        "rc-enhanced-expand": "显示细节",
        "rc-enhanced-hide": "畀细节囥脱",
-       "recentchangeslinked": "相关变化",
+       "recentchangeslinked": "搭界个改动",
        "recentchangeslinked-feed": "搭界个改动",
        "recentchangeslinked-toolbox": "相关变化",
        "recentchangeslinked-title": "搭“$1”有关个改动",
        "lockmanager-notlocked": "“$1”朆鎖牢,嘸處開鎖。",
        "img-auth-nofile": "“$1”文件嘸。",
        "upload-curl-error6": "URL走弗進。",
+       "license-header": "授权协议",
        "listfiles_search_for": "寻图片名字:",
        "imgfile": "源文件",
        "listfiles": "文件列表",
        "nolinkstoimage": "呒有页链到箇文件。",
        "linkstoimage-redirect": "$1(文件轉戳到)$2",
        "sharedupload": "箇只文件来源于$1,渠作兴垃拉其它项目当中拨应用。",
-       "sharedupload-desc-here": "箇文件$1里个,作兴会来别个项目里用。\n渠个描述页里所描述个显示如下。",
+       "sharedupload-desc-here": "箇文件$1里个,作兴会畀别个项目使用。\n渠个[$2 描述页]里个说明显示如下。",
        "uploadnewversion-linktext": "上载该文件个新版",
+       "upload-disallowed-here": "你弗可以覆盖伊只文件。",
        "filerevert": "恢复$1",
        "filerevert-legend": "恢复文物",
        "filerevert-comment": "理由:",
        "pager-older-n": "旧$1次",
        "booksources": "书源",
        "booksources-search-legend": "搜索图书来源",
+       "booksources-search": "搜寻",
        "specialloguserlabel": "用戶:",
        "speciallogtitlelabel": "目標(標題要弗用戶):",
        "log": "记录",
        "deletereasonotherlist": "别个理由",
        "rollback": "恢复编辑",
        "rollbacklink": "回退",
+       "rollbacklinkcount": "回退$1届编辑",
        "rollbackfailed": "恢复失败",
        "revertpage": "恢复[[Special:Contributions/$2|$2]] ([[User talk:$2|讲张]])个改动;恢复到[[User:$1|$1]]个上一版本",
        "protectlogpage": "保护日志",
        "undelete-search-submit": "搜尋",
        "namespace": "名字空间:",
        "invert": "反选择",
+       "tooltip-invert": "请选择该框来囥脱指定名字空间(搭有关名字空间,如果你选择)个页面更改",
+       "namespace_association": "有关个名字空间",
+       "tooltip-namespace_association": "选中该复选框可包括搭选定名字空间有关个讨论页或子页面",
        "blanknamespace": "(主)",
-       "contributions": "用户贡献",
+       "contributions": "{{GENDER:$1|用户}}贡献",
        "contributions-title": "$1个贡献",
        "mycontris": "我个贡献",
        "contribsub2": "$1个贡献($2)",
        "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' 呒处显示,因为 '''$wgUseDatabaseMessages''' 关勒浪。",
        "thumbnail-more": "放大",
        "filemissing": "文件寻弗着哉",
-       "tooltip-pt-userpage": "你侬个ç\94¨æ\88·é¡µ",
-       "tooltip-pt-mytalk": "你侬个讨论页",
-       "tooltip-pt-preferences": "我欢喜个",
+       "tooltip-pt-userpage": "侬个用户页",
+       "tooltip-pt-mytalk": "侬个讨论页",
+       "tooltip-pt-preferences": "侬个设置",
        "tooltip-pt-watchlist": "监控修改页面列表",
-       "tooltip-pt-mycontris": "你侬个贡ç\8c®å\88\97表",
+       "tooltip-pt-mycontris": "侬个贡献列表",
        "tooltip-pt-login": "鼓励大家登录进来,不过也弗是板定要求",
        "tooltip-pt-logout": "登出",
+       "tooltip-pt-createaccount": "建议你建立一个账号并登录,但必过箇弗是板要个",
        "tooltip-ca-talk": "讨论内容页",
        "tooltip-ca-edit": "箇页你侬好编。保存之前望望相起。",
        "tooltip-ca-addsection": "开始新段",
-       "tooltip-ca-viewsource": "箇页受保,你侬好望源代码",
+       "tooltip-ca-viewsource": "箇页受保护,你好望源代码",
        "tooltip-ca-history": "箇页以早个版本",
        "tooltip-ca-protect": "保护箇页",
        "tooltip-ca-delete": "删脱箇页",
        "tooltip-search": "搜寻{{SITENAME}}",
        "tooltip-search-go": "转到页本确切名称,如果存在",
        "tooltip-search-fulltext": "搜寻包含箇星文本个页面",
-       "tooltip-p-logo": "封面",
+       "tooltip-p-logo": "翻到封面",
        "tooltip-n-mainpage": "翻到封面",
        "tooltip-n-mainpage-description": "翻到封面",
        "tooltip-n-portal": "有关箇计划,啥好做,应该哪能做",
        "tooltip-summary": "打进短摘要",
        "interlanguage-link-title": "̩$1 - $2",
        "anonymous": "{{SITENAME}}浪个匿名用户",
+       "simpleantispam-label": "反垃圾检查。\n<strong>覅</strong>加进伊个!",
+       "pageinfo-toolboxlink": "页面信息",
        "deletedrevision": "拨删脱个旧修订 $1",
        "previousdiff": "←老版",
        "nextdiff": "新版→",
        "file-info-size": "$1×$2像素,文件大小:$3,MIME类型:$4",
        "file-nohires": "无更高分辨率可提供。",
        "svg-long-desc": "SVG文件,名义大小:$1×$2像素,文件大小:$3",
-       "show-big-image": "完整分辨率",
+       "show-big-image": "原始文件",
+       "show-big-image-preview": "本预览个尺寸:$1。",
+       "show-big-image-other": "其他{{PLURAL:$2|分辨率}}:$1。",
+       "show-big-image-size": "$1×$2像素",
        "newimages": "新文件陈列室",
        "ilsubmit": "搜寻",
        "bad_image_list": "格式如下:\n\n只列出项目(线开始* )的审议。\n第一个环节上线必须是一个链接到一个坏文件。\n其后的任何链接在同一行被认为是例外情况,即网页的文件,则可能会发生内部。",
        "metadata-help": "箇只文件里向包含有扩展个信息。箇些信息可能是由数码相机或扫描仪垃拉创建或数字化过程中所添加个。\n\n如果此文件个源文件已经修改,一些信息垃拉修改后个文件里向将弗能完全反映出来。",
        "metadata-expand": "显示详细资料",
        "metadata-collapse": "隐藏详细资料",
-       "metadata-fields": "垃拉本信息里向所列出个 EXIF 元数据域包含垃拉图片显示页面,\n当元数据表损坏个辰光只显示下头眼信息,别个元数据默认为隐藏。\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别个元数据默认囥脱。\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": "方位",
+       "exif-xresolution": "水平分辨率",
+       "exif-yresolution": "垂直分辨率",
+       "exif-datetime": "文件更改日脚辰光",
+       "exif-make": "照相机厂商",
+       "exif-model": "照相机型号",
+       "exif-software": "使用软件",
        "exif-artist": "作者",
+       "exif-exifversion": "Exif版本",
+       "exif-colorspace": "色彩空间",
+       "exif-datetimeoriginal": "数据生成日脚辰光",
+       "exif-datetimedigitized": "数字化日脚辰光",
+       "exif-orientation-1": "标准",
        "exif-componentsconfiguration-0": "弗存在",
        "exif-subjectdistance-value": "$1米",
        "exif-contrast-2": "高",
        "confirmemail_subject": "{{SITENAME}}电子邮件地址确认",
        "confirmemail_body": "用IP地址$1嗰人(呒数是你侬),徕translatewiki.net里一个账号“$2”建起,用你侬个电子信箱地址。\n\n确认记箇账号是弗是你侬嘅,激活translatewiki.net里嗰电子信功能。用浏览器打开下向嗰链接:\n\n$3\n\n假使你侬*朆*注册过箇账号,揿下向嗰链接取消电子信确认:\n\n$5\n\n确认码会到$4过期。",
        "confirmemail_body_changed": "用IP地址$1嗰人,(呒数是你侬)徕{{SITENAME}}里一个账号“$2”建起,用你侬个电子信箱地址。\n\n确认记箇账号是弗是你侬嘅,激活{{SITENAME}}里嗰电子信功能。用浏览器打开下向嗰链接:\n\n$3\n\n假使你侬*朆*注册过箇账号,揿下向嗰链接取消电子信确认:\n\n$5\n\n确认码会到$4过期。",
-       "scarytranscludetoolong": "[对呒起,URL太长了]",
+       "scarytranscludetoolong": "[URL忒长]",
        "confirmrecreate": "用户[[User:$1|$1]] ([[User talk:$1|讲张]])勒拉倷开始编辑该页面之后拿俚删脱,理由是: : ''$2'' 请拿定章程,倷阿是真个要重建该页面。",
        "confirm_purge_button": "确定",
        "comma-separator": "、",
        "table_pager_next": "下页",
        "table_pager_prev": "上页",
        "table_pager_first": "头一页",
-       "table_pager_last": "末一页",
+       "table_pager_last": "末一页",
        "table_pager_limit": "显示 $1 条每页",
        "autoredircomment": "重定向页面至[[$1]]",
        "autosumm-new": "新页面:$1",
        "watchlisttools-view": "望相关修改",
        "watchlisttools-edit": "望搭编关注表",
        "watchlisttools-raw": "编写原始关注表",
+       "signature": "[[{{ns:user}}:$1|$2]]([[{{ns:user_talk}}:$1|讨论]])",
        "version": "版本",
        "specialpages": "特殊页",
+       "tag-filter": "[[Special:Tags|标签]]过滤器:",
+       "tag-list-wrapper": "([[Special:Tags|$1个标签]]:$2)",
        "tags-active-yes": "好",
        "tags-active-no": "弗",
        "dberr-info-hidden": "(數據庫服務器連弗上)",
+       "logentry-delete-delete": "$1{{GENDER:$2|删除}}页面$3",
        "revdelete-restricted": "已将限制应用到管理员",
        "revdelete-unrestricted": "已移除对管理员个限制",
+       "logentry-move-move": "$1{{GENDER:$2|捅荡}}页面$3到$4",
+       "logentry-newusers-create": "用户账号$1畀{{GENDER:$2|创建}}",
+       "logentry-upload-upload": "$1{{GENDER:$2|上传}}$3",
        "rightsnone": "(呒)",
-       "revdelete-summary": "编辑摘要"
+       "revdelete-summary": "编辑摘要",
+       "searchsuggest-search": "搜寻"
 }
index 5af957e..5b30aa0 100644 (file)
        "content-model-css": "CSS",
        "content-json-empty-object": "空的对象",
        "content-json-empty-array": "空的数组",
+       "duplicate-args-warning": "<strong>警告:</strong>[[:$1]]正在调用超过一个[[:$2]]中“$3”参数的值。只有最后提供的值会被使用。",
        "duplicate-args-category": "调用重复模板参数的页面",
        "duplicate-args-category-desc": "页面包含调用了重复参数的模板,例如<code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>或<code><nowiki>{{foo|bar|1=baz}}</nowiki></code>。",
        "expensive-parserfunction-warning": "<strong>警告:</strong>这个页面有太多高昂的语法功能调用。\n\n它应该少过$2次呼叫,现在有$1次呼叫。",
        "uploaded-event-handler-on-svg": "在SVG文件中不允许设置event-handler属性<code>$1=\"$2\"</code>。",
        "uploaded-href-attribute-svg": "在SVG文件中不允许Href属性<code>&lt;$1 $2=\"$3\"&gt;</code>带非本地目标(例如http://、javascript:等)。",
        "uploaded-href-unsafe-target-svg": "在上传的SVG文件中找到href至不安全目标<code>&lt;$1 $2=\"$3\"&gt;</code>。",
-       "uploaded-animate-svg": "找到“animate”标签,它可能会更改href,在上传的SVG文件中使用“from”属性<code>&lt;$1 $2=\"$3\"&gt;</code>。",
+       "uploaded-animate-svg": "在上传的SVG文件找到“animate”标签,它可能会更改href,使用“from”属性<code>&lt;$1 $2=\"$3\"&gt;</code>。",
        "uploaded-setting-event-handler-svg": "设置event-handler属性时受阻,在上传的SVG文件中找到<code>&lt;$1 $2=\"$3\"&gt;</code>。",
        "uploaded-setting-href-svg": "使用“set”标签加入“href”属性至父元素时受阻。",
        "uploaded-wrong-setting-svg": "使用“set”标签添加远程/数据/脚本目标至任意属性时受阻。在上传的SVG文件中找到<code>&lt;set to=\"$1\"&gt;</code>。",
index cc21dc6..57c5c02 100644 (file)
        "content-model-css": "CSS",
        "content-json-empty-object": "空物件",
        "content-json-empty-array": "空陣列",
+       "duplicate-args-warning": "<strong>警告:</strong> [[:$1]] 呼叫 [[:$2]] 的 \"$3\" 參數使用了超過一次,僅會使用提供的最後一個參數值。",
        "duplicate-args-category": "模板呼叫時使用重複的參數的頁面",
-       "duplicate-args-category-desc": "該頁面包含重複使用參數的模板呼叫,如 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> 或 <code><nowiki>{{foo|bar|1=baz}}</nowiki>。",
+       "duplicate-args-category-desc": "該頁面包含重複使用參數的模板呼叫,如 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> 或 <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>。",
        "expensive-parserfunction-warning": "<strong>警告:</strong>此頁面使用了太多消耗系統資源的解析函數。\n\n使用次數應小於 $2 次,但目前使用了 $1 次。",
        "expensive-parserfunction-category": "使用了太多消耗系統資源的分析函數的頁面",
        "post-expand-template-inclusion-warning": "<strong>警告:</strong>引用模板後大小超出限制。\n部份模板內容將不會被使用。",
        "post-expand-template-inclusion-category": "引用模板後大小超出限制的頁面",
        "post-expand-template-argument-warning": "<strong>警告:</strong>此頁面有一個以上的模板參數過長。\n過長的參數會被直接忽略。",
        "post-expand-template-argument-category": "模板參數有部份被忽略的頁面",
-       "parser-template-loop-warning": "偵測到模板遞迴:[[$1]]",
+       "parser-template-loop-warning": "偵測到模板迴圈:[[$1]]",
        "parser-template-recursion-depth-warning": "超出模板遞迴深度限制 ($1)",
        "language-converter-depth-warning": "已超出語言轉換器深度限制 ($1)",
        "node-count-exceeded-category": "節點數量超出限制的頁面",
        "php-uploaddisabledtext": "PHP 已停用檔案上傳。\n請檢查 file_uploads 設定。",
        "uploadscripted": "此檔案包含可能會被網頁瀏覽器錯誤執行的 HTML 或 Script。",
        "upload-scripted-pi-callback": "無法上傳包含 xml-stylesheet 處理命令的檔案。",
-       "uploaded-script-svg": "於上傳的 SVG 檔案中找到可程式的腳本標籤 \"$1\"。",
-       "uploaded-hostile-svg": "於上傳的 SVG 檔案的樣式標籤中找到不安全的 CSS。",
+       "uploaded-script-svg": "於上傳的 SVG 檔案中找到可程式的腳本標籤 \"$1\"。",
+       "uploaded-hostile-svg": "於上傳的 SVG 檔案的樣式標籤中找到不安全的 CSS。",
        "uploaded-event-handler-on-svg": "不允許在 SVG 檔案設定 event-handler 屬性 <code>$1=\"$2\"</code>。",
        "uploaded-href-attribute-svg": "不允許在 SVG 檔案中的 Href 屬性 <code>&lt;$1 $2=\"$3\"&gt;</code> 使用非本地的目標  (例如 http://, javascript:, 等)。",
-       "uploaded-href-unsafe-target-svg": "於上傳的 SVG 檔案中找到 href 連結至不安全的目標 <code>&lt;$1 $2=\"$3\"&gt;</code>。",
-       "uploaded-animate-svg": "於上傳的 SVG 檔案中找到 \"animate\" 標籤可能會使用 \"from\" 屬性 <code>&lt;$1 $2=\"$3\"&gt;</code> 更改 href。",
+       "uploaded-href-unsafe-target-svg": "於已上傳的 SVG 檔案中找到 href 連結至不安全的目標 <code>&lt;$1 $2=\"$3\"&gt;</code>。",
+       "uploaded-animate-svg": "於已上傳的 SVG 檔案中找到 \"animate\" 標籤可能會使用 \"from\" 屬性 <code>&lt;$1 $2=\"$3\"&gt;</code> 更改 href。",
+       "uploaded-setting-event-handler-svg": "於已上傳的 SVG 檔案中找到 <code>&lt;$1 $2=\"$3\"&gt;</code>,已禁止設定 event-handler 屬性。",
+       "uploaded-setting-href-svg": "已禁止使用 \"set\" 標籤來加入 \"href\" 屬性至父元素。",
+       "uploaded-wrong-setting-svg": "於已上傳的 SVG 檔案中找到 <code>&lt;set to=\"$1\"&gt;</code>,已禁止使用 \"set\" 標籤加入 remote/data/script 目標至任何屬性。",
+       "uploaded-setting-handler-svg": "於已上傳的 SVG 檔案中找到 <code>$1=\"$2\"</code>,已禁止 SVG 使用 remote/data/script 設定 \"handler\" 屬性。",
+       "uploaded-remote-url-svg": "於已上傳的 SVG 檔案中找到 <code>$1=\"$2\"</code>,已禁止 SVG 使用任何遠端 URL 設定樣式。",
+       "uploaded-image-filter-svg": "於已上傳的 SVG 檔案中找到圖片過濾器使用 URL:<code>&lt;$1 $2=\"$3\"&gt;</code>。",
        "uploadscriptednamespace": "此 SVG 檔案使用了非法的命名空間 \"$1\"。",
        "uploadinvalidxml": "無法解析已上傳檔案中的 XML。",
        "uploadvirus": "該檔案含有病毒!\n詳細資訊:$1",
        "unusedimages": "未使用的檔案",
        "wantedcategories": "需要的分類",
        "wantedpages": "需要的頁面",
-       "wantedpages-summary": "以下為最多連結的不存在頁面,除只有重新導向連結的頁面外。 若要取得不存在的重新導向頁面,請至 [[{{#special:BrokenRedirects}}]]。",
+       "wantedpages-summary": "以下為最多連結的不存在頁面,除只有重新導向連結的頁面外。 若要取得不存在的重新導向頁面,請至 [[{{#special:BrokenRedirects}}|損壞的重新導向清單]]。",
        "wantedpages-badtitle": "結果集合中的標題無效:$1",
        "wantedfiles": "需要的檔案",
        "wantedfiletext-cat": "下列檔案被時用,但檔案不存在。 外部儲存庫的檔案儘管存在,但此清單仍會列出。 這類誤報的項目會以 <del>刪除線</del> 標示。 另外,頁面內嵌檔案不存在會於清單 [[:$1]] 中顯示。",
        "log-name-pagelang": "更改語言日誌",
        "log-description-pagelang": "此頁為頁面語言的變更日誌。",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|已更改}}頁面 $3 的語言從 $4 到 $5。",
-       "default-skin-not-found": "哎呀!您於 <code dir=\"ltr\">$wgDefaultSkin</code> 設定的 Wiki 預設外觀 <code>$1</code> 無法使用。\n\n您的安裝程序應包含以下{{PLURAL:$4|外觀}}。請參考 [https://www.mediawiki.org/wiki/Manual:Skin_configuration 操作手冊:外觀設定] 以取得如何{{PLURAL:$4|開啟外觀並設為預設值}}的資訊。\n\n$2\n\n; 若您才剛安裝完 MediaWiki:\n: 您大概是使用 git 或直接透過原始碼使用其他方法安裝,這種情況是正常的。請嘗試安裝 [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org 的外觀目錄] 中的部份外觀使用以下方式:\n:* 下載 [https://www.mediawiki.org/wiki/Special:MyLanguage/Download tarball 安裝程式],該程式包含數個外觀與擴充套件。您可以複製並貼上至 <code>skins/</code> 目錄。\n:* 自 [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] 下載個別外觀 tarball。\n:* 透過 git 複製 <code>mediawiki/skins/*</code> 儲存庫中其中一個外觀到您安裝的 MediaWiki <code dir=\"ltr\">skins/</code> 目錄中。\n: 若您是 MediaWiki 的開發人員,這麼做應該不會影響到您的 git 儲存庫。\n\n; 若您才剛升級 MediaWiki:\n: MediaWiki 1.24 與較新的版本不再自動開啟已安裝的外觀 (請參考 [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery 操作手冊:外觀自動搜尋])。您可以將下列{{PLURAL:$5|行}}貼上至 <code>LocalSettings.php</code> 來開啟{{PLURAL:$5|所有}}目前已經安裝的{{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> 設定的 Wiki 預設外觀 <code>$1</code> 無法使用。\n\n您未安裝任何的外觀。\n\n; 若您才剛安裝完或升級完 MediaWiki:\n: 您大概是使用 git 或直接透過原始碼使用其他方法安裝,這種情況是正常的。 MediaWiki 1.24 或較新的版本在主要儲存庫中不再包含任何的外觀。 請嘗試安裝 [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org 的外觀目錄] 中的部份外觀使用以下方式:\n:* 下載 [https://www.mediawiki.org/wiki/Special:MyLanguage/Download tarball 安裝程式],該程式包含數個外觀與擴充套件。 您可以複製並貼上至 <code>skins/</code> 目錄。\n:* 自 [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] 下載個別外觀 tarball。\n:* 透過 git 複製 <code>mediawiki/skins/*</code> 儲存庫中其中一個外觀到您安裝的 MediaWiki <code dir=\"ltr\">skins/</code> 目錄中。\n: 若您是 MediaWiki 的開發人員,這麼做應該不會影響到您的 git 儲存庫。 請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration 操作手冊:外觀設定] 以取得如何開啟外觀並設為預設值的資訊。",
+       "default-skin-not-found": "哎呀!您於 <code dir=\"ltr\">$wgDefaultSkin</code> 設定的 Wiki 預設外觀 <code>$1</code> 無法使用。\n\n您的安裝程序應包含以下{{PLURAL:$4|外觀}}。請參考 [https://www.mediawiki.org/wiki/Manual:Skin_configuration 操作手冊:外觀設定] 以取得如何{{PLURAL:$4|開啟外觀並設為預設值}}的資訊。\n\n$2\n\n; 若您才剛安裝完 MediaWiki:\n: 您大概是使用 git 或直接透過原始碼使用其他方法安裝,這種情況是正常的。請嘗試安裝 [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org 的外觀目錄] 中的部份外觀使用以下方式:\n:* 下載 [https://www.mediawiki.org/wiki/Special:MyLanguage/Download tarball 安裝程式],該程式包含數個外觀與擴充套件。您可以複製並貼上至 <code>skins/</code> 目錄。\n:* 自 [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] 下載個別外觀 tarball。\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins 使用 Git 下載外觀]。\n: 若您是 MediaWiki 的開發人員,這麼做應該不會影響到您的 git 儲存庫。\n\n; 若您才剛升級 MediaWiki:\n: MediaWiki 1.24 與較新的版本不再自動開啟已安裝的外觀 (請參考 [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery 操作手冊:外觀自動搜尋])。您可以將下列{{PLURAL:$5|行}}貼上至 <code>LocalSettings.php</code> 來開啟{{PLURAL:$5|所有}}目前已經安裝的{{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> 設定的 Wiki 預設外觀 <code>$1</code> 無法使用。\n\n您未安裝任何的外觀。\n\n; 若您才剛安裝完或升級完 MediaWiki:\n: 您大概是使用 git 或直接透過原始碼使用其他方法安裝,這種情況是正常的。 MediaWiki 1.24 或較新的版本在主要儲存庫中不再包含任何的外觀。 請嘗試安裝 [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org 的外觀目錄] 中的部份外觀使用以下方式:\n:* 下載 [https://www.mediawiki.org/wiki/Special:MyLanguage/Download tarball 安裝程式],該程式包含數個外觀與擴充套件。 您可以複製並貼上至 <code>skins/</code> 目錄。\n:* 自 [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] 下載個別外觀 tarball。\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins 使用 Git 下載外觀]。\n: 若您是 MediaWiki 的開發人員,這麼做應該不會影響到您的 git 儲存庫。 請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration 操作手冊:外觀設定] 以取得如何開啟外觀並設為預設值的資訊。",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (已開啟)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''已停用''')",
        "mediastatistics": "媒體統計資訊",
index 0c7ea62..e231807 100644 (file)
--- a/load.php
+++ b/load.php
@@ -41,11 +41,7 @@ $configFactory = ConfigFactory::getDefaultInstance();
 $resourceLoader = new ResourceLoader( $configFactory->makeConfig( 'main' ) );
 $resourceLoader->respond( new ResourceLoaderContext( $resourceLoader, $wgRequest ) );
 
-JobQueueGroup::pushLazyJobs();
-
 Profiler::instance()->setTemplated( true );
-wfLogProfilingData();
 
-// Shut down the database.
-$lb = wfGetLBFactory();
-$lb->shutdown();
+$mediawiki = new MediaWiki();
+$mediawiki->doPostOutputShutdown( 'fast' );
index eab2b63..6fa27ef 100644 (file)
@@ -22,6 +22,7 @@
                                "name": "General",
                                "classes": [
                                        "mw.Title",
+                                       "mw.MalformedTitleException",
                                        "mw.Uri",
                                        "mw.messagePoster.*",
                                        "mw.notification",
                                        "mw.Feedback.Dialog"
                                ]
                        },
+                       {
+                               "name": "Widgets",
+                               "classes": [
+                                       "mw.widgets*"
+                               ]
+                       },
                        {
                                "name": "Special",
                                "classes": [
index 1f5ac16..23be767 100644 (file)
@@ -94,20 +94,23 @@ return array(
         * including more than one of them into your skin as this will result in duplicate CSS.
         */
        'mediawiki.skinning.elements' => array(
+               'position' => 'top',
                'styles' => array(
                        'resources/src/mediawiki.skinning/elements.css' => array( 'media' => 'screen' ),
                ),
        ),
        'mediawiki.skinning.content' => array(
+               'position' => 'top',
                'styles' => array(
                        'resources/src/mediawiki.skinning/elements.css' => array( 'media' => 'screen' ),
                        'resources/src/mediawiki.skinning/content.css' => array( 'media' => 'screen' ),
                ),
        ),
+       // Used in the web installer. Test it after modifying this definition!
        'mediawiki.skinning.interface' => array(
                'position' => 'top',
+               // Display wiki logo on .mw-wiki-logo elements.
                'class' => 'ResourceLoaderSkinModule',
-               // Used in the web installer. Test it after modifying this definition!
                'styles' => array(
                        'resources/src/mediawiki.skinning/elements.css' => array( 'media' => 'screen' ),
                        'resources/src/mediawiki.skinning/content.css' => array( 'media' => 'screen' ),
@@ -127,12 +130,19 @@ return array(
        ),
 
        'mediawiki.skinning.content.externallinks' => array(
-               'position' => 'top',
+               'position' => 'bottom',
                'styles' => array(
                        'resources/src/mediawiki.skinning/content.externallinks.css' => array( 'media' => 'screen' ),
                ),
        ),
 
+       // Display wiki logo on .mw-wiki-logo elements.
+       // This is also part of 'mediawiki.skinning.interface' module; the skin shouldn't load them both.
+       'mediawiki.skinning.logo' => array(
+               'position' => 'top',
+               'class' => 'ResourceLoaderSkinModule',
+       ),
+
        /* jQuery */
 
        'jquery' => array(
@@ -1600,8 +1610,8 @@ return array(
 
        /* MediaWiki Installer */
 
+       // Used in the web installer. Test it after modifying this definition!
        'mediawiki.legacy.config' => array(
-               // Used in the web installer. Test it after modifying this definition!
                // These files are not actually loaded via ResourceLoader, so dependencies etc. won't work.
                'scripts' => 'mw-config/config.js',
                'styles' => 'mw-config/config.css',
@@ -1628,8 +1638,8 @@ return array(
                'dependencies' => 'jquery.byteLimit',
                'messages' => array( 'protect-unchain-permissions' )
        ),
+       // Used in the web installer. Test it after modifying this definition!
        'mediawiki.legacy.shared' => array(
-               // Used in the web installer. Test it after modifying this definition!
                'position' => 'top',
                'styles' => array(
                        'resources/src/mediawiki.legacy/shared.css' => array( 'media' => 'screen' )
@@ -1725,6 +1735,23 @@ return array(
                'targets' => array( 'desktop', 'mobile' ),
        ),
 
+       'mediawiki.widgets' => array(
+               'scripts' => array(
+                       'resources/src/mediawiki.widgets/mw.widgets.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js',
+               ),
+               'skinStyles' => array(
+                       'default' => 'resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.css',
+               ),
+               'dependencies' => array(
+                       'oojs-ui',
+               ),
+               'messages' => array(
+                       // …
+               ),
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
+
        /* es5-shim */
        'es5-shim' => array(
                'scripts' => array(
@@ -1758,178 +1785,5 @@ return array(
        /* OOjs UI */
        // WARNING: OOjs-UI is NOT TESTED with older browsers and is likely to break
        // if loaded in browsers that don't support ES5
-       'oojs-ui' => array(
-               'scripts' => array(
-                       'resources/lib/oojs-ui/oojs-ui.js',
-               ),
-               'skinScripts' => array(
-                       'default' => 'resources/lib/oojs-ui/oojs-ui-mediawiki.js',
-               ),
-               'dependencies' => array(
-                       'es5-shim',
-                       'oojs',
-                       'oojs-ui.styles',
-                       'oojs-ui.styles.icons',
-                       'oojs-ui.styles.indicators',
-                       'oojs-ui.styles.textures',
-               ),
-               'messages' => array(
-                       'ooui-dialog-message-accept',
-                       'ooui-dialog-message-reject',
-                       'ooui-dialog-process-continue',
-                       'ooui-dialog-process-dismiss',
-                       'ooui-dialog-process-error',
-                       'ooui-dialog-process-retry',
-                       'ooui-outline-control-move-down',
-                       'ooui-outline-control-move-up',
-                       'ooui-outline-control-remove',
-                       'ooui-toolbar-more',
-                       'ooui-toolgroup-collapse',
-                       'ooui-toolgroup-expand',
-               ),
-               'targets' => array( 'desktop', 'mobile' ),
-       ),
-
-       'oojs-ui.styles' => array(
-               'position' => 'top',
-               'styles' => 'resources/src/oojs-ui-local.css', // HACK, see inside the file
-               'skinStyles' => array(
-                       'default' => 'resources/lib/oojs-ui/oojs-ui-mediawiki-noimages.css',
-               ),
-               'targets' => array( 'desktop', 'mobile' ),
-       ),
-
-       'oojs-ui.styles.icons' => array(
-               'position' => 'top',
-               'class' => 'ResourceLoaderImageModule',
-               'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
-               'data' => 'icons.json',
-               'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
-               'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
-       ),
-       'oojs-ui.styles.indicators' => array(
-               'position' => 'top',
-               'class' => 'ResourceLoaderImageModule',
-               'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
-               'data' => 'indicators.json',
-       ),
-       'oojs-ui.styles.textures' => array(
-               'position' => 'top',
-               'class' => 'ResourceLoaderImageModule',
-               'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
-               'data' => 'textures.json',
-       ),
-       'oojs-ui.styles.icons-alerts' => array(
-               'position' => 'top',
-               'class' => 'ResourceLoaderImageModule',
-               'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
-               'data' => 'icons-alerts.json',
-               'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
-               'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
-       ),
-       'oojs-ui.styles.icons-content' => array(
-               'position' => 'top',
-               'class' => 'ResourceLoaderImageModule',
-               'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
-               'data' => 'icons-content.json',
-               'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
-               'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
-       ),
-       'oojs-ui.styles.icons-editing-advanced' => array(
-               'position' => 'top',
-               'class' => 'ResourceLoaderImageModule',
-               'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
-               'data' => 'icons-editing-advanced.json',
-               'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
-               'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
-       ),
-       'oojs-ui.styles.icons-editing-core' => array(
-               'position' => 'top',
-               'class' => 'ResourceLoaderImageModule',
-               'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
-               'data' => 'icons-editing-core.json',
-               'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
-               'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
-       ),
-       'oojs-ui.styles.icons-editing-list' => array(
-               'position' => 'top',
-               'class' => 'ResourceLoaderImageModule',
-               'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
-               'data' => 'icons-editing-list.json',
-               'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
-               'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
-       ),
-       'oojs-ui.styles.icons-editing-styling' => array(
-               'position' => 'top',
-               'class' => 'ResourceLoaderImageModule',
-               'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
-               'data' => 'icons-editing-styling.json',
-               'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
-               'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
-       ),
-       'oojs-ui.styles.icons-interactions' => array(
-               'position' => 'top',
-               'class' => 'ResourceLoaderImageModule',
-               'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
-               'data' => 'icons-interactions.json',
-               'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
-               'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
-       ),
-       'oojs-ui.styles.icons-layout' => array(
-               'position' => 'top',
-               'class' => 'ResourceLoaderImageModule',
-               'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
-               'data' => 'icons-layout.json',
-               'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
-               'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
-       ),
-       'oojs-ui.styles.icons-location' => array(
-               'position' => 'top',
-               'class' => 'ResourceLoaderImageModule',
-               'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
-               'data' => 'icons-location.json',
-               'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
-               'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
-       ),
-       'oojs-ui.styles.icons-media' => array(
-               'position' => 'top',
-               'class' => 'ResourceLoaderImageModule',
-               'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
-               'data' => 'icons-media.json',
-               'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
-               'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
-       ),
-       'oojs-ui.styles.icons-moderation' => array(
-               'position' => 'top',
-               'class' => 'ResourceLoaderImageModule',
-               'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
-               'data' => 'icons-moderation.json',
-               'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
-               'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
-       ),
-       'oojs-ui.styles.icons-movement' => array(
-               'position' => 'top',
-               'class' => 'ResourceLoaderImageModule',
-               'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
-               'data' => 'icons-movement.json',
-               'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
-               'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
-       ),
-       'oojs-ui.styles.icons-user' => array(
-               'position' => 'top',
-               'class' => 'ResourceLoaderImageModule',
-               'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
-               'data' => 'icons-user.json',
-               'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
-               'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
-       ),
-       'oojs-ui.styles.icons-wikimedia' => array(
-               'position' => 'top',
-               'class' => 'ResourceLoaderImageModule',
-               'localBasePath' => "$IP/resources/lib/oojs-ui/themes/mediawiki",
-               'data' => 'icons-wikimedia.json',
-               'selectorWithoutVariant' => '.oo-ui-icon-{name}, .mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
-               'selectorWithVariant' => '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before',
-       ),
-
+       // @see ResourcesOOUI.php
 );
diff --git a/resources/ResourcesOOUI.php b/resources/ResourcesOOUI.php
new file mode 100644 (file)
index 0000000..37203fb
--- /dev/null
@@ -0,0 +1,122 @@
+<?php
+/**
+ * Definition of OOjs UI ResourceLoader modules.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+       die( 'Not an entry point.' );
+}
+
+// WARNING: OOjs-UI is NOT TESTED with older browsers and is likely to break
+// if loaded in browsers that don't support ES5
+return call_user_func( function () {
+       // Core default themes
+       $themes = array( 'default' => 'mediawiki' );
+       $themes += ExtensionRegistry::getInstance()->getAttribute( 'SkinOOUIThemes' );
+       $modules = array();
+
+       $modules['oojs-ui'] = array(
+               'scripts' => array(
+                       'resources/lib/oojs-ui/oojs-ui.js',
+               ),
+               'skinScripts' => array_combine(
+                       array_keys( $themes ),
+                       array_map( function ( $theme ) {
+                               // TODO Allow extensions to specify this path somehow
+                               return "resources/lib/oojs-ui/oojs-ui-$theme.js";
+                       }, array_values( $themes ) )
+               ),
+               'dependencies' => array(
+                       'es5-shim',
+                       'oojs',
+                       'oojs-ui.styles',
+                       'oojs-ui.styles.icons',
+                       'oojs-ui.styles.indicators',
+                       'oojs-ui.styles.textures',
+               ),
+               'messages' => array(
+                       'ooui-dialog-message-accept',
+                       'ooui-dialog-message-reject',
+                       'ooui-dialog-process-continue',
+                       'ooui-dialog-process-dismiss',
+                       'ooui-dialog-process-error',
+                       'ooui-dialog-process-retry',
+                       'ooui-outline-control-move-down',
+                       'ooui-outline-control-move-up',
+                       'ooui-outline-control-remove',
+                       'ooui-toolbar-more',
+                       'ooui-toolgroup-collapse',
+                       'ooui-toolgroup-expand',
+               ),
+               'targets' => array( 'desktop', 'mobile' ),
+       );
+       $modules['oojs-ui.styles'] = array(
+               'position' => 'top',
+               'styles' => 'resources/src/oojs-ui-local.css', // HACK, see inside the file
+               'skinStyles' => array_combine(
+                       array_keys( $themes ),
+                       array_map( function ( $theme ) {
+                               // TODO Allow extensions to specify this path somehow
+                               return "resources/lib/oojs-ui/oojs-ui-$theme-noimages.css";
+                       }, array_values( $themes ) )
+               ),
+               'targets' => array( 'desktop', 'mobile' ),
+       );
+
+       $imageSets = array(
+               // Comments for greppability
+               'icons', // oojs-ui.styles.icons
+               'indicators', // oojs-ui.styles.indicators
+               'textures', // oojs-ui.styles.textures
+               'icons-alerts', // oojs-ui.styles.icons-alerts
+               'icons-content', // oojs-ui.styles.icons-content
+               'icons-editing-advanced', // oojs-ui.styles.icons-editing-advanced
+               'icons-editing-core', // oojs-ui.styles.icons-editing-core
+               'icons-editing-list', // oojs-ui.styles.icons-editing-list
+               'icons-editing-styling', // oojs-ui.styles.icons-editing-styling
+               'icons-interactions', // oojs-ui.styles.icons-interactions
+               'icons-layout', // oojs-ui.styles.icons-layout
+               'icons-location', // oojs-ui.styles.icons-location
+               'icons-media', // oojs-ui.styles.icons-media
+               'icons-moderation', // oojs-ui.styles.icons-moderation
+               'icons-movement', // oojs-ui.styles.icons-movement
+               'icons-user', // oojs-ui.styles.icons-user
+               'icons-wikimedia', // oojs-ui.styles.icons-wikimedia
+       );
+       $rootPath = 'resources/lib/oojs-ui/themes';
+
+       foreach ( $imageSets as $name ) {
+               $module = array(
+                       'position' => 'top',
+                       'class' => 'ResourceLoaderOOUIImageModule',
+                       'name' => $name,
+                       'rootPath' => $rootPath,
+               );
+
+               if ( substr( $name, 0, 5 ) === 'icons' ) {
+                       $module['selectorWithoutVariant'] = '.oo-ui-icon-{name}, .mw-ui-icon-{name}:before';
+                       $module['selectorWithVariant'] = '.oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:before, .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before';
+               }
+
+               $modules[ "oojs-ui.styles.$name" ] = $module;
+       }
+
+       return $modules;
+} );
index 8140d1a..9c59fc1 100644 (file)
@@ -237,10 +237,6 @@ textarea {
        box-sizing: border-box;
 }
 
-select {
-       vertical-align: top;
-}
-
 /* Emulate Center */
 .center {
        width: 100%;
index 4829f5f..ac5becb 100644 (file)
@@ -54,6 +54,9 @@
                // we hide the input element as instead we will style the label that follows
                // we use opacity so that VoiceOver software can still identify it
                opacity: 0;
+               // Render "on top of" the label, so that it's still clickable (T98905)
+               z-index: 1;
+               position: relative;
                // ensure the invisible checkbox takes up the required width
                width: @checkboxSize;
                height: @checkboxSize;
index a6e6490..d9e8c42 100644 (file)
@@ -4,7 +4,6 @@
 // Mixins
 .mixin-mw-ui-icon-bgimage(@iconSvg, @iconPng) {
        &.mw-ui-icon {
-               &:after,
                &:before {
                        .background-image-svg(@iconSvg, @iconPng);
                }
@@ -54,7 +53,6 @@
                }
        }
 
-       &.mw-ui-icon-after:after,
        &.mw-ui-icon-before:before,
        &.mw-ui-icon-element:before {
                background-position: 50% 50%;
                        margin-right: @iconGutterWidth;
                }
        }
-
-       // Icons with text before
-       //
-       // Markup:
-       // <div class="mw-ui-icon mw-ui-icon-after mw-ui-icon-ok mw-ui-progressive mw-ui-button">OK</div>
-       //
-       // Styleguide 6.1.3
-       &.mw-ui-icon-after {
-               &:after {
-                       position: relative;
-                       float: right;
-                       width: @iconSize;
-                       margin-left: @iconGutterWidth;
-               }
-       }
 }
diff --git a/resources/src/mediawiki.widgets/AUTHORS.txt b/resources/src/mediawiki.widgets/AUTHORS.txt
new file mode 100644 (file)
index 0000000..10064b2
--- /dev/null
@@ -0,0 +1,10 @@
+Authors (alphabetically)
+
+Alex Monk <krenair@wikimedia.org>
+Bartosz Dziewoński <bdziewonski@wikimedia.org>
+Ed Sanders <esanders@wikimedia.org>
+James D. Forrester <jforrester@wikimedia.org>
+Roan Kattouw <roan@wikimedia.org>
+Sucheta Ghoshal <sghoshal@wikimedia.org>
+Timo Tijhof <timo@wikimedia.org>
+Trevor Parscal <trevor@wikimedia.org>
diff --git a/resources/src/mediawiki.widgets/LICENSE.txt b/resources/src/mediawiki.widgets/LICENSE.txt
new file mode 100644 (file)
index 0000000..b03ca80
--- /dev/null
@@ -0,0 +1,25 @@
+Copyright (c) 2011-2015 MediaWiki Widgets Team and others under the
+terms of The MIT License (MIT), as follows:
+
+This software consists of voluntary contributions made by many
+individuals (AUTHORS.txt) For exact contribution history, see the
+revision history and logs, available at https://gerrit.wikimedia.org
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.css b/resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.css
new file mode 100644 (file)
index 0000000..0065f70
--- /dev/null
@@ -0,0 +1,10 @@
+/*!
+ * MediaWiki Widgets – TitleInputWidget styles.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+.mw-widget-TitleInputWidget {
+       width: 30em;
+}
diff --git a/resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js b/resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js
new file mode 100644 (file)
index 0000000..bfedb6b
--- /dev/null
@@ -0,0 +1,132 @@
+/*!
+ * MediaWiki Widgets – TitleInputWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+       /**
+        * Creates an mw.widgets.TitleInputWidget object.
+        *
+        * @class
+        * @extends OO.ui.TextInputWidget
+        * @mixins OO.ui.LookupElement
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {number} [namespace] Namespace to prepend to queries
+        */
+       mw.widgets.TitleInputWidget = function MWWTitleInputWidget( config ) {
+               // Config initialization
+               config = config || {};
+
+               // Parent constructor
+               OO.ui.TextInputWidget.call( this, config );
+
+               // Mixin constructors
+               OO.ui.LookupElement.call( this, config );
+
+               // Properties
+               this.namespace = config.namespace || null;
+
+               // Initialization
+               this.$element.addClass( 'mw-widget-TitleInputWidget' );
+               this.lookupMenu.$element.addClass( 'mw-widget-TitleInputWidget-menu' );
+       };
+
+       /* Inheritance */
+
+       OO.inheritClass( mw.widgets.TitleInputWidget, OO.ui.TextInputWidget );
+
+       OO.mixinClass( mw.widgets.TitleInputWidget, OO.ui.LookupElement );
+
+       /* Methods */
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.TitleInputWidget.prototype.onLookupMenuItemChoose = function ( item ) {
+               this.closeLookupMenu();
+               this.setLookupsDisabled( true );
+               this.setValue( item.getData() );
+               this.setLookupsDisabled( false );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.TitleInputWidget.prototype.getLookupRequest = function () {
+               var value = this.value;
+
+               // Prefix with default namespace name
+               if ( this.namespace !== null && mw.Title.newFromText( value, this.namespace ) ) {
+                       value = mw.Title.newFromText( value, this.namespace ).getPrefixedText();
+               }
+
+               // Dont send leading ':' to open search
+               if ( value.charAt( 0 ) === ':' ) {
+                       value = value.slice( 1 );
+               }
+
+               return new mw.Api().get( {
+                       action: 'opensearch',
+                       search: value,
+                       suggest: ''
+               } );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.TitleInputWidget.prototype.getLookupCacheDataFromResponse = function ( data ) {
+               return data[1] || [];
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.TitleInputWidget.prototype.getLookupMenuOptionsFromData = function ( data ) {
+               var i, len, title, value,
+                       items = [],
+                       matchingPages = data;
+
+               // Matching pages
+               if ( matchingPages && matchingPages.length ) {
+                       for ( i = 0, len = matchingPages.length; i < len; i++ ) {
+                               title = new mw.Title( matchingPages[i] );
+                               if ( this.namespace !== null ) {
+                                       value = title.getRelativeText( this.namespace );
+                               } else {
+                                       value = title.getPrefixedText();
+                               }
+                               items.push( new OO.ui.MenuOptionWidget( {
+                                       data: value,
+                                       label: value
+                               } ) );
+                       }
+               }
+
+               return items;
+       };
+
+       /**
+        * Get title object corresponding to #getValue
+        *
+        * @returns {mw.Title|null} Title object, or null if value is invalid
+        */
+       mw.widgets.TitleInputWidget.prototype.getTitle = function () {
+               var title = this.getValue(),
+                       // mw.Title doesn't handle null well
+                       titleObj = mw.Title.newFromText( title, this.namespace !== null ? this.namespace : undefined );
+
+               return titleObj;
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.TitleInputWidget.prototype.isValid = function () {
+               return $.Deferred().resolve( !!this.getTitle() ).promise();
+       };
+
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/mw.widgets.js b/resources/src/mediawiki.widgets/mw.widgets.js
new file mode 100644 (file)
index 0000000..dc8b0cf
--- /dev/null
@@ -0,0 +1 @@
+mediaWiki.widgets = {};
index 3efb7ec..8785b0b 100644 (file)
         * @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
-        * @throws {Error} When the title is invalid
+        * @throws {mw.MalformedTitleException} Throws when the title is invalid with details on why the title is invalid
         */
        function Title( title, namespace ) {
                var parsed = parse( title, namespace );
-               if ( !parsed ) {
-                       throw new Error( 'Unable to parse title' );
-               }
 
                this.namespace = parsed.namespace;
                this.title = parsed.title;
         * @method parse
         * @param {string} title
         * @param {number} [defaultNamespace=NS_MAIN]
-        * @return {Object|boolean}
+        * @return {Object}
+        * @throws {mw.MalformedTitleException} When the title is invalid
         */
        parse = function ( title, defaultNamespace ) {
                var namespace, m, id, i, fragment, ext;
                }
 
                if ( title === '' ) {
-                       return false;
+                       throw new MalformedTitleException( 'title-invalid-empty', title );
                }
 
                // Process namespace prefix (if any)
                                if ( namespace === NS_TALK && ( m = title.match( rSplit ) ) ) {
                                        // Disallow titles like Talk:File:x (subject should roundtrip: talk:file:x -> file:x -> file_talk:x)
                                        if ( getNsIdByName( m[1] ) !== false ) {
-                                               return false;
+                                               throw new MalformedTitleException( 'title-invalid-talk-namespace', title );
                                        }
                                }
                        }
 
                // Reject illegal characters
                if ( title.match( rInvalid ) ) {
-                       return false;
+                       throw new MalformedTitleException( 'title-invalid-characters', title, [ title.match( rInvalid )[0] ] );
                }
 
                // Disallow titles that browsers or servers might resolve as directory navigation
                                title.slice( -3 ) === '/..'
                        )
                ) {
-                       return false;
+                       throw new MalformedTitleException( 'title-invalid-relative', title );
                }
 
                // Disallow magic tilde sequence
                if ( title.indexOf( '~~~' ) !== -1 ) {
-                       return false;
+                       throw new MalformedTitleException( 'title-invalid-magic-tilde', title );
                }
 
                // Disallow titles exceeding the TITLE_MAX_BYTES byte size limit (size of underlying database field)
                // Note: The PHP implementation also asserts that even in NS_SPECIAL, the title should
                // be less than 512 bytes.
                if ( namespace !== NS_SPECIAL && $.byteLength( title ) > TITLE_MAX_BYTES ) {
-                       return false;
+                       throw new MalformedTitleException( 'title-invalid-too-long', title, [ TITLE_MAX_BYTES ] );
                }
 
                // Can't make a link to a namespace alone.
                if ( title === '' && namespace !== NS_MAIN ) {
-                       return false;
+                       throw new MalformedTitleException( 'title-invalid-empty', title );
                }
 
                // Any remaining initial :s are illegal.
                if ( title.charAt( 0 ) === ':' ) {
-                       return false;
+                       throw new MalformedTitleException( 'title-invalid-leading-colon', title );
                }
 
                // For backwards-compatibility with old mw.Title, we separate the extension from the
         * @return {mw.Title|null} A valid Title object or null if the title is invalid
         */
        Title.newFromText = function ( title, namespace ) {
-               var t, parsed = parse( title, namespace );
-               if ( !parsed ) {
+               var t, parsed;
+               try {
+                       parsed = parse( title, namespace );
+               } catch ( e ) {
                        return null;
                }
 
        // Expose
        mw.Title = Title;
 
+       /**
+        * @class mw.MalformedTitleException
+        *
+        * Custom exception class that provides parameters for additional error
+        * information regarding the reason behind the invalidity of the requested
+        * title.  The information can be used in i18n messages that can be displayed
+        * to the user.
+        *
+        * Based on MalformedTitleException.php#__construct
+        *
+        * @constructor
+        * @param {string} message Reason e.g. invalid-title-too-long for a long title
+        * @param {string} titleText The invalid title text involved
+        * @param {Array} errorMessageParameters Additional error information
+        */
+       function MalformedTitleException( message, titleText, errorMessageParameters ) {
+               this.message = message;
+               this.titleText = titleText;
+               if ( errorMessageParameters ) {
+                       this.errorMessageParameters = errorMessageParameters;
+               } else {
+                       this.errorMessageParameters = [ ];
+               }
+
+               if ( titleText ) {
+                       this.errorMessageParameters.push( titleText );
+               }
+       }
+
+       MalformedTitleException.prototype = createObject(Error.prototype);
+       MalformedTitleException.prototype.name = 'MalformedTitleException';
+       MalformedTitleException.prototype.constructor = MalformedTitleException;
+       mw.MalformedTitleException = MalformedTitleException;
+
 }( mediaWiki, jQuery ) );
index f2b4b00..0c24720 100644 (file)
 
                        /**
                         * @since 1.26
-                        * @param {Object[]} modules List of module registry objects
+                        * @param {Array} modules List of module names
                         * @return {string} Hash of concatenated version hashes.
                         */
                        function getCombinedVersion( modules ) {
                                var hashes = $.map( modules, function ( module ) {
-                                       return module.version;
+                                       return registry[module].version;
                                } );
                                // Trim for consistency with server-side ResourceLoader::makeHash. It also helps
                                // save precious space in the limited query string. Otherwise modules are more
diff --git a/tests/phpunit/includes/exception/HttpErrorTest.php b/tests/phpunit/includes/exception/HttpErrorTest.php
new file mode 100644 (file)
index 0000000..66fe90c
--- /dev/null
@@ -0,0 +1,65 @@
+<?php
+
+/**
+ * @todo tests for HttpError::report
+ *
+ * @covers HttpError
+ */
+class HttpErrorTest extends MediaWikiTestCase {
+
+       public function testIsLoggable() {
+               $httpError = new HttpError( 500, 'server error!' );
+               $this->assertFalse( $httpError->isLoggable(), 'http error is not loggable' );
+       }
+
+       public function testGetStatusCode() {
+               $httpError = new HttpError( 500, 'server error!' );
+               $this->assertEquals( 500, $httpError->getStatusCode() );
+       }
+
+       /**
+        * @dataProvider getHtmlProvider
+        */
+       public function testGetHtml( array $expected, $content, $header ) {
+               $httpError = new HttpError( 500, $content, $header );
+               $errorHtml = $httpError->getHtml();
+
+               foreach ( $expected as $key => $html ) {
+                       $this->assertContains( $html, $errorHtml, $key );
+               }
+       }
+
+       public function getHtmlProvider() {
+               return array(
+                       array(
+                               array(
+                                       'head html' => '<head><title>Server Error 123</title></head>',
+                                       'body html' => '<body><h1>Server Error 123</h1>'
+                                               . '<p>a server error!</p></body>'
+                               ),
+                               'a server error!',
+                               'Server Error 123'
+                       ),
+                       array(
+                               array(
+                                       'head html' => '<head><title>loginerror</title></head>',
+                                       'body html' => '<body><h1>loginerror</h1>'
+                                       . '<p>suspicious-userlogout</p></body>'
+                               ),
+                               new RawMessage( 'suspicious-userlogout' ),
+                               new RawMessage( 'loginerror' )
+                       ),
+                       array(
+                               array(
+                                       'head html' => '<html><head><title>Internal Server Error</title></head>',
+                                       'body html' => '<body><h1>Internal Server Error</h1>'
+                                               . '<p>a server error!</p></body></html>'
+                               ),
+                               'a server error!',
+                               null
+                       )
+               );
+       }
+
+
+}
diff --git a/tests/phpunit/includes/utils/MWFunctionTest.php b/tests/phpunit/includes/utils/MWFunctionTest.php
deleted file mode 100644 (file)
index f4d1799..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-/**
- * @covers MWFunction
- */
-class MWFunctionTest extends MediaWikiTestCase {
-       public function testNewObjFunction() {
-               $arg1 = 'Foo';
-               $arg2 = 'Bar';
-               $arg3 = array( 'Baz' );
-               $arg4 = new ExampleObject;
-
-               $args = array( $arg1, $arg2, $arg3, $arg4 );
-
-               $newObject = new MWBlankClass( $arg1, $arg2, $arg3, $arg4 );
-               $this->hideDeprecated( 'MWFunction::newObj' );
-               $this->assertEquals(
-                       MWFunction::newObj( 'MWBlankClass', $args )->args,
-                       $newObject->args
-               );
-       }
-}
-
-class MWBlankClass {
-
-       public $args = array();
-
-       function __construct( $arg1, $arg2, $arg3, $arg4 ) {
-               $this->args = array( $arg1, $arg2, $arg3, $arg4 );
-       }
-}
-
-class ExampleObject {
-}
index cff2e8f..faa30c3 100644 (file)
@@ -1412,6 +1412,77 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
+       /**
+        * @dataProvider provideHebrewNumeralsData
+        * @covers Language::hebrewNumeral
+        */
+       public function testHebrewNumeral( $num, $numerals ) {
+               $this->assertEquals(
+                       $numerals,
+                       Language::hebrewNumeral( $num ),
+                       "hebrewNumeral('$num')"
+               );
+       }
+
+       public static function provideHebrewNumeralsData() {
+               return array(
+                       array( -1, -1 ),
+                       array( 0, 0 ),
+                       array( 1, "א'" ),
+                       array( 2, "ב'" ),
+                       array( 3, "ג'" ),
+                       array( 4, "ד'" ),
+                       array( 5, "ה'" ),
+                       array( 6, "ו'" ),
+                       array( 7, "ז'" ),
+                       array( 8, "ח'" ),
+                       array( 9, "ט'" ),
+                       array( 10, "י'" ),
+                       array( 11, 'י"א' ),
+                       array( 14, 'י"ד' ),
+                       array( 15, 'ט"ו' ),
+                       array( 16, 'ט"ז' ),
+                       array( 17, 'י"ז' ),
+                       array( 20, "כ'" ),
+                       array( 21, 'כ"א' ),
+                       array( 30, "ל'" ),
+                       array( 40, "מ'" ),
+                       array( 50, "נ'" ),
+                       array( 60, "ס'" ),
+                       array( 70, "ע'" ),
+                       array( 80, "פ'" ),
+                       array( 90, "צ'" ),
+                       array( 99, 'צ"ט' ),
+                       array( 100, "ק'" ),
+                       array( 101, 'ק"א' ),
+                       array( 110, 'ק"י' ),
+                       array( 200, "ר'" ),
+                       array( 300, "ש'" ),
+                       array( 400, "ת'" ),
+                       array( 500, 'ת"ק' ),
+                       array( 800, 'ת"ת' ),
+                       array( 1000, "א' אלף" ),
+                       array( 1001, "א'א'" ),
+                       array( 1012, "א'י\"ב" ),
+                       array( 1020, "א'ך'" ),
+                       array( 1030, "א'ל'" ),
+                       array( 1081, "א'פ\"א" ),
+                       array( 2000, "ב' אלפים" ),
+                       array( 2016, "ב'ט\"ז" ),
+                       array( 3000, "ג' אלפים" ),
+                       array( 4000, "ד' אלפים" ),
+                       array( 4904, "ד'תתק\"ד" ),
+                       array( 5000, "ה' אלפים" ),
+                       array( 5680, "ה'תר\"ף" ),
+                       array( 5690, "ה'תר\"ץ" ),
+                       array( 5708, "ה'תש\"ח" ),
+                       array( 5720, "ה'תש\"ך" ),
+                       array( 5740, "ה'תש\"ם" ),
+                       array( 5750, "ה'תש\"ן" ),
+                       array( 5775, "ה'תשע\"ה" ),
+               );
+       }
+
        /**
         * @dataProvider providePluralData
         * @covers Language::convertPlural
index 2079a64..051c39e 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -35,11 +35,8 @@ if ( defined( 'THUMB_HANDLER' ) ) {
        wfStreamThumb( $_GET );
 }
 
-wfLogProfilingData();
-// Commit and close up!
-$factory = wfGetLBFactory();
-$factory->commitMasterChanges();
-$factory->shutdown();
+$mediawiki = new MediaWiki();
+$mediawiki->doPostOutputShutdown( 'fast' );
 
 //--------------------------------------------------------------------------