Merge "Show a confirmation message on Special:UserRights"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 14 Oct 2015 09:13:36 +0000 (09:13 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 14 Oct 2015 09:13:36 +0000 (09:13 +0000)
227 files changed:
Gruntfile.js
RELEASE-NOTES-1.26
RELEASE-NOTES-1.27
autoload.php
composer.json
docs/hooks.txt
includes/Collation.php
includes/GlobalFunctions.php
includes/Html.php
includes/HtmlFormatter.php
includes/HttpFunctions.php
includes/Import.php
includes/Linker.php
includes/MediaWiki.php
includes/NoLocalSettings.php
includes/OutputPage.php
includes/Title.php
includes/User.php
includes/api/ApiImport.php
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/ja.json
includes/api/i18n/ksh.json
includes/api/i18n/mr.json
includes/api/i18n/sr-ec.json
includes/changes/CategoryMembershipChange.php
includes/changes/RecentChange.php
includes/changetags/ChangeTags.php
includes/content/ContentHandler.php
includes/db/DatabasePostgres.php
includes/db/loadbalancer/LBFactoryFake.php
includes/db/loadbalancer/LBFactorySingle.php
includes/db/loadbalancer/LoadMonitor.php
includes/deferred/DataUpdate.php
includes/deferred/DeferredUpdates.php
includes/installer/LocalSettingsGenerator.php
includes/installer/WebInstaller.php
includes/installer/i18n/hy.json
includes/jobqueue/jobs/DeleteLinksJob.php
includes/libs/IEUrlExtension.php
includes/libs/objectcache/WANObjectCache.php
includes/logging/LogFormatter.php
includes/logging/RightsLogFormatter.php
includes/mail/EmailNotification.php
includes/objectcache/ObjectCache.php
includes/page/ImagePage.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/password/PasswordFactory.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderEditToolbarModule.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/specialpage/ChangesListSpecialPage.php
includes/specials/SpecialChangePassword.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserlogin.php
includes/upload/UploadBase.php
includes/upload/UploadStash.php
languages/classes/LanguageHy.php
languages/classes/LanguageWa.php
languages/i18n/af.json
languages/i18n/an.json
languages/i18n/ar.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/cv.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/ext.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/frp.json
languages/i18n/gl.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ilo.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kk-cyrl.json
languages/i18n/km.json
languages/i18n/ko.json
languages/i18n/ksh.json
languages/i18n/lb.json
languages/i18n/li.json
languages/i18n/lt.json
languages/i18n/lus.json
languages/i18n/lv.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/mzn.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/olo.json
languages/i18n/or.json
languages/i18n/pa.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sa.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/ta.json
languages/i18n/th.json
languages/i18n/tl.json
languages/i18n/uk.json
languages/i18n/vec.json
languages/i18n/vi.json
languages/i18n/wa.json
languages/i18n/wo.json
languages/i18n/yi.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/i18n/zh-tw.json
maintenance/backupTextPass.inc
maintenance/cleanupCaps.php
maintenance/cleanupSpam.php
maintenance/cleanupTable.inc
maintenance/deleteBatch.php
maintenance/deleteEqualMessages.php
maintenance/edit.php
maintenance/importImages.php
maintenance/importSiteScripts.php
maintenance/moveBatch.php
maintenance/namespaceDupes.php
maintenance/protect.php
maintenance/rollbackEdits.php
maintenance/storage/recompressTracked.php
maintenance/tables.sql
maintenance/undelete.php
opensearch_desc.php
package.json
phpcs.xml
resources/Resources.php
resources/lib/oojs-ui/i18n/nb.json
resources/lib/oojs-ui/i18n/pa.json
resources/lib/oojs-ui/oojs-ui-apex-noimages.css
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-mediawiki-noimages.css
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui.js
resources/src/jquery/jquery.spinner.js
resources/src/jquery/jquery.tablesorter.js
resources/src/mediawiki.action/mediawiki.action.view.metadata.js
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js
resources/src/mediawiki.widgets/mw.widgets.TitleSearchWidget.js
resources/src/mediawiki/api.js
resources/src/mediawiki/api/upload.js
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.js
resources/src/mediawiki/mediawiki.ForeignUpload.js
resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
resources/src/mediawiki/mediawiki.Upload.js
resources/src/mediawiki/mediawiki.jqueryMsg.js
resources/src/mediawiki/page/gallery.css
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/GlobalFunctions/wfEscapeShellArgTest.php
tests/phpunit/includes/LinkFilterTest.php
tests/phpunit/includes/TestUser.php
tests/phpunit/includes/UserTest.php
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiCreateAccountTest.php
tests/phpunit/includes/api/UserWrapper.php
tests/phpunit/includes/cache/GenderCacheTest.php
tests/phpunit/includes/logging/RightsLogFormatterTest.php
tests/phpunit/includes/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/password/PasswordTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/maintenance/MaintenanceTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.upload.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js

index 8dbeb6b..946b652 100644 (file)
@@ -33,9 +33,7 @@ module.exports = function ( grunt ) {
                },
                banana: {
                        options: {
-                               disallowBlankTranslations: false,
-                               disallowDuplicateTranslations: false,
-                               disallowUnusedTranslations: false
+                               disallowBlankTranslations: false
                        },
                        core: 'languages/i18n/',
                        api: 'includes/api/i18n/',
index efca318..53d9188 100644 (file)
@@ -94,6 +94,12 @@ production.
 * If search returns zero results and current search engine has a "did you mean"
   suggestion, results for suggestion will be shown. Can be disabled by setting
   $wgSearchRunSuggestedQuery to false.
+* Added several JavaScript libraries for uploading files to MediaWiki
+  from the client-side. See documentation for mw.Upload and its
+  subclasses for more information.
+* Added OOUI dialogs and layout for file upload interfaces. See
+  documentation for mw.Upload.Dialog, mw.Upload.BookletLayout and its
+  subclasses for more information.
 
 == External libraries ==
 === Upgraded external libraries ===
index 06feb4d..b34b3c0 100644 (file)
@@ -16,7 +16,6 @@ production.
   1000 for the latter) are now hard-coded.
 * $wgDebugDumpSqlLength was removed (deprecated in 1.24).
 * $wgDebugDBTransactions was removed (deprecated in 1.20).
-* $wgRemoteUploadTarget (added in 1.26) removed, replaced by $wgForeignUploadTargets
 * $wgUseXVO has been removed, as it provides functionality only used by
   custom Wikimedia patches against Squid 2.x that probably noone uses in
   production anymore. There is now $wgUseKeyHeader that provides similar
@@ -25,6 +24,25 @@ production.
 * $wgScriptExtension (and support for '.php5' entry points) was removed. See the
   deprecation notice in the release notes for version 1.25 for advice on how to
   preserve support for '.php5' entry points via URL rewriting.
+* Password handling via the User object has been deprecated and partially
+  removed, pending the future introduction of AuthManager. In particular:
+** expirePassword(), getPasswordExpireDate(), resetPasswordExpiration(), and
+   getPasswordExpired() have been removed. They were unused outside of core.
+** The mPassword, mNewpassword, mNewpassTime, and mPasswordExpires fields are
+   now private and will be removed in the future.
+** The getPassword() and getTemporaryPassword() methods now throw
+   BadMethodCallException and will be removed in the future.
+** The ability to pass 'password' and 'newpassword' to createNew() has been
+   removed. The only users of it seem to have been using it to set invalid
+   passwords, and so shouldn't be greatly affected.
+** setPassword(), setInternalPassword(), and setNewpassword() have been
+   deprecated, pending the introduction of AuthManager.
+** User::randomPassword() is deprecated in favor of a new method
+   PasswordFactory::generateRandomPasswordString()
+** User::getPasswordFactory() is deprecated, callers should just create a
+   PasswordFactory themselves.
+** A new constructor, User::newSystemUser(), has been added to simplify the
+   creation of passwordless "system" users for logged actions.
 
 === New features in 1.27 ===
 * $wgDataCenterId and $wgDataCenterRoles where added, which will serve as
@@ -41,6 +59,8 @@ production.
 * $wgCdnMaxageLagged was added, which limits the CDN cache TTL
   when any load balancer uses a DB that is lagged beyond the 'max lag'
   setting in the relevant section of $wgLBFactoryConf.
+* User::newSystemUser() may be used to simplify the creation of passwordless
+  "system" users for logged actions from scripts and extensions.
 
 ==== External libraries ====
 
@@ -52,6 +72,8 @@ production.
 * ApiPageSet::setRedirectMergePolicy() was added. This allows generator
   modules to define how generator data for a redirect source gets merged
   into the redirect destination.
+* prop=imageinfo&iiprop=uploadwarning will no longer include the possibility of
+  "was-deleted" warning.
 
 === Action API internal changes in 1.27 ===
 
index 269b142..673072b 100644 (file)
@@ -728,6 +728,7 @@ $wgAutoloadLocalClasses = array(
        'MWSaltedPassword' => __DIR__ . '/includes/password/MWSaltedPassword.php',
        'MWTidy' => __DIR__ . '/includes/parser/MWTidy.php',
        'MWTimestamp' => __DIR__ . '/includes/MWTimestamp.php',
+       'MWUnknownContentModelException' => __DIR__ . '/includes/content/ContentHandler.php',
        'MachineReadableRCFeedFormatter' => __DIR__ . '/includes/rcfeed/MachineReadableRCFeedFormatter.php',
        'MagicWord' => __DIR__ . '/includes/MagicWord.php',
        'MagicWordArray' => __DIR__ . '/includes/MagicWord.php',
index 46ff59c..6209017 100644 (file)
@@ -21,7 +21,7 @@
                "ext-iconv": "*",
                "liuggio/statsd-php-client": "1.0.16",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.12.11",
+               "oojs/oojs-ui": "0.12.12",
                "oyejorge/less.php": "1.7.0.9",
                "php": ">=5.3.3",
                "psr/log": "1.0.0",
index 717dd39..0e76d58 100644 (file)
@@ -1956,12 +1956,14 @@ $rcid: ID of the revision to be marked patrolled
 $user: the user (object) marking the revision as patrolled
 $wcOnlySysopsCanPatrol: config setting indicating whether the user needs to be a
   sysop in order to mark an edit patrolled.
+$auto true if the edit is being marked as patrolled automatically
 
 'MarkPatrolledComplete': After an edit is marked patrolled.
 $rcid: ID of the revision marked as patrolled
 $user: user (object) who marked the edit patrolled
 $wcOnlySysopsCanPatrol: config setting indicating whether the user must be a
   sysop to patrol the edit.
+$auto true if the edit is being marked as patrolled automatically
 
 'MediaWikiPerformAction': Override MediaWiki::performAction(). Use this to do
 something completely different, after the basic globals have been set up, but
index c1f0b38..40e8627 100644 (file)
@@ -406,14 +406,15 @@ class IcuCollation extends Collation {
                        }
                }
 
-               // Sort the letters.
-               //
-               // It's impossible to have the precompiled data file properly sorted,
-               // because the sort order changes depending on ICU version. If the
-               // array is not properly sorted, the binary search will return random
-               // results.
-               //
-               // We also take this opportunity to remove primary collisions.
+               /* Sort the letters.
+                *
+                * It's impossible to have the precompiled data file properly sorted,
+                * because the sort order changes depending on ICU version. If the
+                * array is not properly sorted, the binary search will return random
+                * results.
+                *
+                * We also take this opportunity to remove primary collisions.
+                */
                $letterMap = array();
                foreach ( $letters as $letter ) {
                        $key = $this->getPrimarySortKey( $letter );
@@ -428,38 +429,40 @@ class IcuCollation extends Collation {
                        }
                }
                ksort( $letterMap, SORT_STRING );
-               // Remove duplicate prefixes. Basically if something has a sortkey
-               // which is a prefix of some other sortkey, then it is an
-               // expansion and probably should not be considered a section
-               // header.
-               //
-               // For example 'þ' is sometimes sorted as if it is the letters
-               // 'th'. Other times it is its own primary element. Another
-               // example is '₨'. Sometimes its a currency symbol. Sometimes it
-               // is an 'R' followed by an 's'.
-               //
-               // Additionally an expanded element should always sort directly
-               // after its first element due to they way sortkeys work.
-               //
-               // UCA sortkey elements are of variable length but no collation
-               // element should be a prefix of some other element, so I think
-               // this is safe. See:
-               // * https://ssl.icu-project.org/repos/icu/icuhtml/trunk/design/collation/ICU_collation_design.htm
-               // * http://site.icu-project.org/design/collation/uca-weight-allocation
-               //
-               // Additionally, there is something called primary compression to
-               // worry about. Basically, if you have two primary elements that
-               // are more than one byte and both start with the same byte then
-               // the first byte is dropped on the second primary. Additionally
-               // either \x03 or \xFF may be added to mean that the next primary
-               // does not start with the first byte of the first primary.
-               //
-               // This shouldn't matter much, as the first primary is not
-               // changed, and that is what we are comparing against.
-               //
-               // tl;dr: This makes some assumptions about how icu implements
-               // collations. It seems incredibly unlikely these assumptions
-               // will change, but nonetheless they are assumptions.
+
+               /* Remove duplicate prefixes. Basically if something has a sortkey
+                * which is a prefix of some other sortkey, then it is an
+                * expansion and probably should not be considered a section
+                * header.
+                *
+                * For example 'þ' is sometimes sorted as if it is the letters
+                * 'th'. Other times it is its own primary element. Another
+                * example is '₨'. Sometimes its a currency symbol. Sometimes it
+                * is an 'R' followed by an 's'.
+                *
+                * Additionally an expanded element should always sort directly
+                * after its first element due to they way sortkeys work.
+                *
+                * UCA sortkey elements are of variable length but no collation
+                * element should be a prefix of some other element, so I think
+                * this is safe. See:
+                * - https://ssl.icu-project.org/repos/icu/icuhtml/trunk/design/collation/ICU_collation_design.htm
+                * - http://site.icu-project.org/design/collation/uca-weight-allocation
+                *
+                * Additionally, there is something called primary compression to
+                * worry about. Basically, if you have two primary elements that
+                * are more than one byte and both start with the same byte then
+                * the first byte is dropped on the second primary. Additionally
+                * either \x03 or \xFF may be added to mean that the next primary
+                * does not start with the first byte of the first primary.
+                *
+                * This shouldn't matter much, as the first primary is not
+                * changed, and that is what we are comparing against.
+                *
+                * tl;dr: This makes some assumptions about how icu implements
+                * collations. It seems incredibly unlikely these assumptions
+                * will change, but nonetheless they are assumptions.
+                */
 
                $prev = false;
                $duplicatePrefixes = array();
index 243df92..14327dc 100644 (file)
@@ -2856,16 +2856,17 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(),
        $status = false;
        $logMsg = false;
 
-       // According to the documentation, it is possible for stream_select()
-       // to fail due to EINTR. I haven't managed to induce this in testing
-       // despite sending various signals. If it did happen, the error
-       // message would take the form:
-       //
-       // stream_select(): unable to select [4]: Interrupted system call (max_fd=5)
-       //
-       // where [4] is the value of the macro EINTR and "Interrupted system
-       // call" is string which according to the Linux manual is "possibly"
-       // localised according to LC_MESSAGES.
+       /* According to the documentation, it is possible for stream_select()
+        * to fail due to EINTR. I haven't managed to induce this in testing
+        * despite sending various signals. If it did happen, the error
+        * message would take the form:
+        *
+        * stream_select(): unable to select [4]: Interrupted system call (max_fd=5)
+        *
+        * where [4] is the value of the macro EINTR and "Interrupted system
+        * call" is string which according to the Linux manual is "possibly"
+        * localised according to LC_MESSAGES.
+        */
        $eintr = defined( 'SOCKET_EINTR' ) ? SOCKET_EINTR : 4;
        $eintrMessage = "stream_select(): unable to select [$eintr]";
 
@@ -3737,16 +3738,16 @@ function wfScript( $script = 'index' ) {
  */
 function wfGetScriptUrl() {
        if ( isset( $_SERVER['SCRIPT_NAME'] ) ) {
-               #
-               # as it was called, minus the query string.
-               #
-               # Some sites use Apache rewrite rules to handle subdomains,
-               # and have PHP set up in a weird way that causes PHP_SELF
-               # to contain the rewritten URL instead of the one that the
-               # outside world sees.
-               #
-               # If in this mode, use SCRIPT_URL instead, which mod_rewrite
-               # provides containing the "before" URL.
+               /* as it was called, minus the query string.
+                *
+                * Some sites use Apache rewrite rules to handle subdomains,
+                * and have PHP set up in a weird way that causes PHP_SELF
+                * to contain the rewritten URL instead of the one that the
+                * outside world sees.
+                *
+                * If in this mode, use SCRIPT_URL instead, which mod_rewrite
+                * provides containing the "before" URL.
+                */
                return $_SERVER['SCRIPT_NAME'];
        } else {
                return $_SERVER['URL'];
index c61dca8..506b9cc 100644 (file)
@@ -597,7 +597,6 @@ class Html {
                                // we may as well not call htmlspecialchars().
                                // @todo FIXME: Verify that we actually need to
                                // escape \n\r\t here, and explain why, exactly.
-                               #
                                // We could call Sanitizer::encodeAttribute() for this, but we
                                // don't because we're stubborn and like our marginal savings on
                                // byte size from not having to encode unnecessary quotes.
index 83db268..2d81b28 100644 (file)
@@ -74,10 +74,8 @@ class HtmlFormatter {
                        }
 
                        // Workaround for bug that caused spaces before references
-                       // to disappear during processing:
-                       // https://phabricator.wikimedia.org/T55086
-                       //
-                       // Please replace with a better fix if one can be found.
+                       // to disappear during processing: https://phabricator.wikimedia.org/T55086
+                       // TODO: Please replace with a better fix if one can be found.
                        $html = str_replace( ' <', '&#32;<', $html );
 
                        libxml_use_internal_errors( true );
@@ -295,7 +293,6 @@ class HtmlFormatter {
                        $html = $this->fixLibXml( $html );
                        if ( wfIsWindows() ) {
                                // Cleanup for CRLF misprocessing of unknown origin on Windows.
-                               //
                                // If this error continues in the future, please track it down in the
                                // XML code paths if possible and fix there.
                                $html = str_replace( '&#13;', '', $html );
index bbf3de6..60196ab 100644 (file)
@@ -971,6 +971,8 @@ class PhpHttpRequest extends MWHttpRequest {
                        'ssl' => array(
                                'verify_peer' => $this->sslVerifyCert,
                                'SNI_enabled' => true,
+                               'ciphers' => 'HIGH:!SSLv2:!SSLv3:-ADH:-kDH:-kECDH:-DSS',
+                               'disable_compression' => true,
                        ),
                );
 
index 60d4a1f..33ab4ea 100644 (file)
@@ -1606,6 +1606,20 @@ class WikiRevision {
                        }
                }
 
+               // Select previous version to make size diffs correct
+               $prevId = $dbw->selectField( 'revision', 'rev_id',
+                       array(
+                               'rev_page' => $pageId,
+                               'rev_timestamp <= ' . $dbw->timestamp( $this->timestamp ),
+                       ),
+                       __METHOD__,
+                       array( 'ORDER BY' => array(
+                                       'rev_timestamp DESC',
+                                       'rev_id DESC', // timestamp is not unique per page
+                               )
+                       )
+               );
+
                # @todo FIXME: Use original rev_id optionally (better for backups)
                # Insert the row
                $revision = new Revision( array(
@@ -1620,6 +1634,7 @@ class WikiRevision {
                        'user_text' => $userText,
                        'timestamp' => $this->timestamp,
                        'minor_edit' => $this->minor,
+                       'parent_id' => $prevId,
                        ) );
                $revision->insertOn( $dbw );
                $changed = $page->updateIfNewerOn( $dbw, $revision );
index 2e33bd1..e821004 100644 (file)
@@ -623,7 +623,6 @@ class Linker {
                        # Create a thumbnail. Alignment depends on the writing direction of
                        # the page content language (right-aligned for LTR languages,
                        # left-aligned for RTL languages)
-                       #
                        # If a thumbnail width has not been provided, it is set
                        # to the default user option as specified in Language*.php
                        if ( $fp['align'] == '' ) {
index aee6ee1..3399790 100644 (file)
@@ -203,10 +203,9 @@ class MediaWiki {
                        // curid and oldid request  parameters would allow page titles to be enumerated even
                        // when they are not guessable. So we reset the title to Special:Badtitle before the
                        // permissions error is displayed.
-                       //
+
                        // The skin mostly uses $this->context->getTitle() these days, but some extensions
                        // still use $wgTitle.
-
                        $badTitle = SpecialPage::getTitleFor( 'Badtitle' );
                        $this->context->setTitle( $badTitle );
                        $wgTitle = $badTitle;
@@ -628,7 +627,7 @@ class MediaWiki {
                                        // redirecting to HTTPS. It's likely such a request is going
                                        // to fail due to post data being lost, but let's try anyway
                                        // and just log the instance.
-                                       //
+
                                        // @todo FIXME: See if we could issue a 307 or 308 here, need
                                        // to see how clients (automated & browser) behave when we do
                                        wfDebugLog( 'RedirectedPosts', "Redirected from HTTP to HTTPS: $oldUrl" );
index 6de9bfc..d299ab6 100644 (file)
@@ -37,7 +37,9 @@ foreach ( array_filter( explode( '/', $_SERVER['PHP_SELF'] ) ) as $part ) {
 if ( !function_exists( 'session_name' ) ) {
        $installerStarted = false;
 } else {
-       session_name( 'mw_installer_session' );
+       if ( !wfIniGetBool( 'session.auto_start' ) ) {
+               session_name( 'mw_installer_session' );
+       }
        $oldReporting = error_reporting( E_ALL & ~E_NOTICE );
        $success = session_start();
        error_reporting( $oldReporting );
index d85c60c..d29ec54 100644 (file)
@@ -236,7 +236,7 @@ class OutputPage extends ContextSource {
 
        /** @var int Cache stuff. Looks like mEnableClientCache */
        protected $mSquidMaxage = 0;
-       /** @var in Upper limit on mSquidMaxage */
+       /** @var int Upper limit on mSquidMaxage */
        protected $mCdnMaxageLimit = INF;
 
        /**
@@ -1957,7 +1957,7 @@ class OutputPage extends ContextSource {
         * @since 1.27
         */
        public function lowerCdnMaxage( $maxage ) {
-               $this->mCdnMaxageLimit = $this->min( $maxage, $this->mCdnMaxageLimit );
+               $this->mCdnMaxageLimit = min( $maxage, $this->mCdnMaxageLimit );
                $this->setSquidMaxage( $this->mSquidMaxage );
        }
 
@@ -3856,18 +3856,19 @@ class OutputPage extends ContextSource {
                                if ( $media == $targetMedia ) {
                                        $media = '';
                                } elseif ( preg_match( $screenMediaQueryRegex, $media ) === 1 ) {
-                                       // This regex will not attempt to understand a comma-separated media_query_list
-                                       //
-                                       // Example supported values for $media:
-                                       // 'screen', 'only screen', 'screen and (min-width: 982px)' ),
-                                       // Example NOT supported value for $media:
-                                       // '3d-glasses, screen, print and resolution > 90dpi'
-                                       //
-                                       // If it's a print request, we never want any kind of screen stylesheets
-                                       // If it's a handheld request (currently the only other choice with a switch),
-                                       // we don't want simple 'screen' but we might want screen queries that
-                                       // have a max-width or something, so we'll pass all others on and let the
-                                       // client do the query.
+                                       /* This regex will not attempt to understand a comma-separated media_query_list
+                                        *
+                                        * Example supported values for $media:
+                                        * 'screen', 'only screen', 'screen and (min-width: 982px)' ),
+                                        * Example NOT supported value for $media:
+                                        * '3d-glasses, screen, print and resolution > 90dpi'
+                                        *
+                                        * If it's a print request, we never want any kind of screen stylesheets
+                                        * If it's a handheld request (currently the only other choice with a switch),
+                                        * we don't want simple 'screen' but we might want screen queries that
+                                        * have a max-width or something, so we'll pass all others on and let the
+                                        * client do the query.
+                                        */
                                        if ( $targetMedia == 'print' || $media == 'screen' ) {
                                                return null;
                                        }
index 8e5fae9..7fb2b06 100644 (file)
@@ -1008,10 +1008,8 @@ class Title {
         */
        public function getNsText() {
                if ( $this->isExternal() ) {
-                       // This probably shouldn't even happen. ohh man, oh yuck.
-                       // But for interwiki transclusion it sometimes does.
-                       // Shit. Shit shit shit.
-                       //
+                       // This probably shouldn't even happen,
+                       // but for interwiki transclusion it sometimes does.
                        // Use the canonical namespaces if possible to try to
                        // resolve a foreign namespace.
                        if ( MWNamespace::exists( $this->mNamespace ) ) {
index 75649a7..0dfdfc4 100644 (file)
@@ -28,7 +28,7 @@ define( 'EDIT_TOKEN_SUFFIX', '+\\' );
 
 /**
  * The User object encapsulates all of the user-specific settings (user_id,
- * name, rights, password, email address, options, last login time). Client
+ * name, rights, email address, options, last login time). Client
  * classes use the getXXX() functions to access these fields. These functions
  * do all the work of determining whether the user is logged in,
  * whether the requested option can be satisfied from cookies or
@@ -64,11 +64,6 @@ class User implements IDBAccessObject {
         */
        const GETOPTIONS_EXCLUDE_DEFAULTS = 1;
 
-       /**
-        * @var PasswordFactory Lazily loaded factory object for passwords
-        */
-       private static $mPasswordFactory = null;
-
        /**
         * Array of Strings List of member variables which are saved to the
         * shared cache (memcached). Any operation which changes the
@@ -190,20 +185,22 @@ class User implements IDBAccessObject {
        public $mName;
        /** @var string */
        public $mRealName;
+
        /**
-        * @todo Make this actually private
-        * @private
-        * @var Password
-        */
-       public $mPassword;
-       /**
-        * @todo Make this actually private
-        * @private
-        * @var Password
+        * These fields were marked "@private", but were defined as public to
+        * maintain compatibility with PHP4 code since PHP4 didn't support access
+        * restrictions. AuthManager makes password handling pluggable, meaning
+        * these fields don't make sense anymore. If this broke something, see
+        * T89459 for the context of the change.
+        * @deprecated These are mostly unused, but kept for now to raise errors on attempted access.
         */
-       public $mNewpassword;
-       /** @var string */
-       public $mNewpassTime;
+       // @{
+       private $mPassword = null;
+       private $mNewpassword;
+       private $mNewpassTime;
+       private $mPasswordExpires;
+       // @}
+
        /** @var string */
        public $mEmail;
        /** @var string TS_MW timestamp from the DB */
@@ -226,8 +223,6 @@ class User implements IDBAccessObject {
        public $mGroups;
        /** @var array */
        protected $mOptionOverrides;
-       /** @var string */
-       protected $mPasswordExpires;
        // @}
 
        /**
@@ -559,7 +554,7 @@ class User implements IDBAccessObject {
         * The row should have the following fields from the user table in it:
         * - either user_name or user_id to load further data if needed (or both)
         * - user_real_name
-        * - all other fields (email, password, etc.)
+        * - all other fields (email, etc.)
         * It is useless to provide the remaining fields if either user_id,
         * user_name and user_real_name are not provided because the whole row
         * will be loaded once more from the database when accessing them.
@@ -574,6 +569,97 @@ class User implements IDBAccessObject {
                return $user;
        }
 
+       /**
+        * Static factory method for creation of a "system" user from username.
+        *
+        * A "system" user is an account that's used to attribute logged actions
+        * taken by MediaWiki itself, as opposed to a bot or human user. Examples
+        * might include the 'Maintenance script' or 'Conversion script' accounts
+        * used by various scripts in the maintenance/ directory or accounts such
+        * as 'MediaWiki message delivery' used by the MassMessage extension.
+        *
+        * This can optionally create the user if it doesn't exist, and "steal" the
+        * account if it does exist.
+        *
+        * @param string $name Username
+        * @param array $options Options are:
+        *  - validate: As for User::getCanonicalName(), default 'valid'
+        *  - create: Whether to create the user if it doesn't already exist, default true
+        *  - steal: Whether to reset the account's password and email if it
+        *    already exists, default false
+        * @return User|null
+        */
+       public static function newSystemUser( $name, $options = array() ) {
+               $options += array(
+                       'validate' => 'valid',
+                       'create' => true,
+                       'steal' => false,
+               );
+
+               $name = self::getCanonicalName( $name, $options['validate'] );
+               if ( $name === false ) {
+                       return null;
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               $row = $dbw->selectRow(
+                       'user',
+                       array_merge(
+                               self::selectFields(),
+                               array( 'user_password', 'user_newpassword' )
+                       ),
+                       array( 'user_name' => $name ),
+                       __METHOD__
+               );
+               if ( !$row ) {
+                       // No user. Create it?
+                       return $options['create'] ? self::createNew( $name ) : null;
+               }
+               $user = self::newFromRow( $row );
+
+               // A user is considered to exist as a non-system user if it has a
+               // password set, or a temporary password set, or an email set.
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               try {
+                       $password = $passwordFactory->newFromCiphertext( $row->user_password );
+               } catch ( PasswordError $e ) {
+                       wfDebug( 'Invalid password hash found in database.' );
+                       $password = PasswordFactory::newInvalidPassword();
+               }
+               try {
+                       $newpassword = $passwordFactory->newFromCiphertext( $row->user_newpassword );
+               } catch ( PasswordError $e ) {
+                       wfDebug( 'Invalid password hash found in database.' );
+                       $newpassword = PasswordFactory::newInvalidPassword();
+               }
+               if ( !$password instanceof InvalidPassword || !$newpassword instanceof InvalidPassword
+                       || $user->mEmail
+               ) {
+                       // User exists. Steal it?
+                       if ( !$options['steal'] ) {
+                               return null;
+                       }
+
+                       $nopass = PasswordFactory::newInvalidPassword()->toString();
+
+                       $dbw->update(
+                               'user',
+                               array(
+                                       'user_password' => $nopass,
+                                       'user_newpassword' => $nopass,
+                                       'user_newpass_time' => null,
+                               ),
+                               array( 'user_id' => $user->getId() ),
+                               __METHOD__
+                       );
+                       $user->invalidateEmail();
+                       $user->saveSettings();
+               }
+
+               return $user;
+       }
+
        // @}
 
        /**
@@ -875,73 +961,6 @@ class User implements IDBAccessObject {
                }
        }
 
-       /**
-        * Expire a user's password
-        * @since 1.23
-        * @param int $ts Optional timestamp to convert, default 0 for the current time
-        */
-       public function expirePassword( $ts = 0 ) {
-               $this->loadPasswords();
-               $timestamp = wfTimestamp( TS_MW, $ts );
-               $this->mPasswordExpires = $timestamp;
-               $this->saveSettings();
-       }
-
-       /**
-        * Clear the password expiration for a user
-        * @since 1.23
-        * @param bool $load Ensure user object is loaded first
-        */
-       public function resetPasswordExpiration( $load = true ) {
-               global $wgPasswordExpirationDays;
-               if ( $load ) {
-                       $this->load();
-               }
-               $newExpire = null;
-               if ( $wgPasswordExpirationDays ) {
-                       $newExpire = wfTimestamp(
-                               TS_MW,
-                               time() + ( $wgPasswordExpirationDays * 24 * 3600 )
-                       );
-               }
-               // Give extensions a chance to force an expiration
-               Hooks::run( 'ResetPasswordExpiration', array( $this, &$newExpire ) );
-               $this->mPasswordExpires = $newExpire;
-       }
-
-       /**
-        * Check if the user's password is expired.
-        * TODO: Put this and password length into a PasswordPolicy object
-        * @since 1.23
-        * @return string|bool The expiration type, or false if not expired
-        *      hard: A password change is required to login
-        *      soft: Allow login, but encourage password change
-        *      false: Password is not expired
-        */
-       public function getPasswordExpired() {
-               global $wgPasswordExpireGrace;
-               $expired = false;
-               $now = wfTimestamp();
-               $expiration = $this->getPasswordExpireDate();
-               $expUnix = wfTimestamp( TS_UNIX, $expiration );
-               if ( $expiration !== null && $expUnix < $now ) {
-                       $expired = ( $expUnix + $wgPasswordExpireGrace < $now ) ? 'hard' : 'soft';
-               }
-               return $expired;
-       }
-
-       /**
-        * Get this user's password expiration date. Since this may be using
-        * the cached User object, we assume that whatever mechanism is setting
-        * the expiration date is also expiring the User cache.
-        * @since 1.23
-        * @return string|null The datestamp of the expiration, or null if not set
-        */
-       public function getPasswordExpireDate() {
-               $this->load();
-               return $this->mPasswordExpires;
-       }
-
        /**
         * Given unvalidated user input, return a canonical username, or false if
         * the username is invalid.
@@ -1022,19 +1041,12 @@ class User implements IDBAccessObject {
        /**
         * Return a random password.
         *
+        * @deprecated since 1.27, use PasswordFactory::generateRandomPasswordString()
         * @return string New random password
         */
        public static function randomPassword() {
                global $wgMinimalPasswordLength;
-               // Decide the final password length based on our min password length,
-               // stopping at a minimum of 10 chars.
-               $length = max( 10, $wgMinimalPasswordLength );
-               // Multiply by 1.25 to get the number of hex characters we need
-               $length = $length * 1.25;
-               // Generate random hex chars
-               $hex = MWCryptRand::generateHex( $length );
-               // Convert from base 16 to base 32 to get a proper password like string
-               return wfBaseConvert( $hex, 16, 32 );
+               return PasswordFactory::generateRandomPasswordString( $wgMinimalPasswordLength );
        }
 
        /**
@@ -1046,15 +1058,9 @@ class User implements IDBAccessObject {
         * @param string|bool $name
         */
        public function loadDefaults( $name = false ) {
-
-               $passwordFactory = self::getPasswordFactory();
-
                $this->mId = 0;
                $this->mName = $name;
                $this->mRealName = '';
-               $this->mPassword = $passwordFactory->newFromCiphertext( null );
-               $this->mNewpassword = $passwordFactory->newFromCiphertext( null );
-               $this->mNewpassTime = null;
                $this->mEmail = '';
                $this->mOptionOverrides = null;
                $this->mOptionsLoaded = false;
@@ -1070,8 +1076,6 @@ class User implements IDBAccessObject {
                $this->mEmailAuthenticated = null;
                $this->mEmailToken = '';
                $this->mEmailTokenExpires = null;
-               $this->mPasswordExpires = null;
-               $this->resetPasswordExpiration( false );
                $this->mRegistration = wfTimestamp( TS_MW );
                $this->mGroups = array();
 
@@ -1243,7 +1247,6 @@ class User implements IDBAccessObject {
         */
        protected function loadFromRow( $row, $data = null ) {
                $all = true;
-               $passwordFactory = self::getPasswordFactory();
 
                $this->mGroups = null; // deferred
 
@@ -1280,31 +1283,6 @@ class User implements IDBAccessObject {
                        $all = false;
                }
 
-               if ( isset( $row->user_password ) ) {
-                       // Check for *really* old password hashes that don't even have a type
-                       // The old hash format was just an md5 hex hash, with no type information
-                       if ( preg_match( '/^[0-9a-f]{32}$/', $row->user_password ) ) {
-                               $row->user_password = ":A:{$this->mId}:{$row->user_password}";
-                       }
-
-                       try {
-                               $this->mPassword = $passwordFactory->newFromCiphertext( $row->user_password );
-                       } catch ( PasswordError $e ) {
-                               wfDebug( 'Invalid password hash found in database.' );
-                               $this->mPassword = $passwordFactory->newFromCiphertext( null );
-                       }
-
-                       try {
-                               $this->mNewpassword = $passwordFactory->newFromCiphertext( $row->user_newpassword );
-                       } catch ( PasswordError $e ) {
-                               wfDebug( 'Invalid password hash found in database.' );
-                               $this->mNewpassword = $passwordFactory->newFromCiphertext( null );
-                       }
-
-                       $this->mNewpassTime = wfTimestampOrNull( TS_MW, $row->user_newpass_time );
-                       $this->mPasswordExpires = wfTimestampOrNull( TS_MW, $row->user_password_expires );
-               }
-
                if ( isset( $row->user_email ) ) {
                        $this->mEmail = $row->user_email;
                        $this->mTouched = wfTimestamp( TS_MW, $row->user_touched );
@@ -1367,33 +1345,6 @@ class User implements IDBAccessObject {
                }
        }
 
-       /**
-        * Load the user's password hashes from the database
-        *
-        * This is usually called in a scenario where the actual User object was
-        * loaded from the cache, and then password comparison needs to be performed.
-        * Password hashes are not stored in memcached.
-        *
-        * @since 1.24
-        */
-       private function loadPasswords() {
-               if ( $this->getId() !== 0 &&
-                       ( $this->mPassword === null || $this->mNewpassword === null )
-               ) {
-                       $db = ( $this->queryFlagsUsed & self::READ_LATEST )
-                               ? wfGetDB( DB_MASTER )
-                               : wfGetDB( DB_SLAVE );
-
-                       $this->loadFromRow( $db->selectRow(
-                               'user',
-                               array( 'user_password', 'user_newpassword',
-                                       'user_newpass_time', 'user_password_expires' ),
-                               array( 'user_id' => $this->getId() ),
-                               __METHOD__
-                       ) );
-               }
-       }
-
        /**
         * Add the user to the group if he/she meets given criteria.
         *
@@ -2383,23 +2334,21 @@ class User implements IDBAccessObject {
        }
 
        /**
+        * @deprecated Removed in 1.27.
         * @return Password
         * @since 1.24
         */
        public function getPassword() {
-               $this->loadPasswords();
-
-               return $this->mPassword;
+               throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
        }
 
        /**
+        * @deprecated Removed in 1.27.
         * @return Password
         * @since 1.24
         */
        public function getTemporaryPassword() {
-               $this->loadPasswords();
-
-               return $this->mNewpassword;
+               throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
        }
 
        /**
@@ -2413,16 +2362,14 @@ class User implements IDBAccessObject {
         * wipes it, so the account cannot be logged in until
         * a new password is set, for instance via e-mail.
         *
+        * @deprecated since 1.27. AuthManager is coming.
         * @param string $str New password to set
         * @throws PasswordError On failure
-        *
         * @return bool
         */
        public function setPassword( $str ) {
                global $wgAuth;
 
-               $this->loadPasswords();
-
                if ( $str !== null ) {
                        if ( !$wgAuth->allowPasswordChange() ) {
                                throw new PasswordError( wfMessage( 'password-change-forbidden' )->text() );
@@ -2438,7 +2385,9 @@ class User implements IDBAccessObject {
                        throw new PasswordError( wfMessage( 'externaldberror' )->text() );
                }
 
-               $this->setInternalPassword( $str );
+               $this->setToken();
+               $this->setOption( 'watchlisttoken', false );
+               $this->setPasswordInternal( $str );
 
                return true;
        }
@@ -2446,19 +2395,49 @@ class User implements IDBAccessObject {
        /**
         * Set the password and reset the random token unconditionally.
         *
+        * @deprecated since 1.27. AuthManager is coming.
         * @param string|null $str New password to set or null to set an invalid
         *  password hash meaning that the user will not be able to log in
         *  through the web interface.
         */
        public function setInternalPassword( $str ) {
-               $this->setToken();
-               $this->setOption( 'watchlisttoken', false );
+               global $wgAuth;
 
-               $passwordFactory = self::getPasswordFactory();
-               $this->mPassword = $passwordFactory->newFromPlaintext( $str );
+               if ( $wgAuth->allowSetLocalPassword() ) {
+                       $this->setToken();
+                       $this->setOption( 'watchlisttoken', false );
+                       $this->setPasswordInternal( $str );
+               }
+       }
 
-               $this->mNewpassword = $passwordFactory->newFromCiphertext( null );
-               $this->mNewpassTime = null;
+       /**
+        * Actually set the password and such
+        * @param string|null $str New password to set or null to set an invalid
+        *  password hash meaning that the user will not be able to log in
+        *  through the web interface.
+        */
+       private function setPasswordInternal( $str ) {
+               $id = self::idFromName( $this->getName() );
+               if ( $id ) {
+                       $passwordFactory = new PasswordFactory();
+                       $passwordFactory->init( RequestContext::getMain()->getConfig() );
+                       $dbw = wfGetDB( DB_MASTER );
+                       $dbw->update(
+                               'user',
+                               array(
+                                       'user_password' => $passwordFactory->newFromPlaintext( $str )->toString(),
+                                       'user_newpassword' => PasswordFactory::newInvalidPassword()->toString(),
+                                       'user_newpass_time' => $dbw->timestampOrNull( null ),
+                               ),
+                               array(
+                                       'user_id' => $id,
+                               ),
+                               __METHOD__
+                       );
+                       $this->mPassword = null;
+               } else {
+                       $this->mPassword = $str;
+               }
        }
 
        /**
@@ -2493,19 +2472,27 @@ class User implements IDBAccessObject {
        /**
         * Set the password for a password reminder or new account email
         *
+        * @deprecated since 1.27, AuthManager is coming
         * @param string $str New password to set or null to set an invalid
         *  password hash meaning that the user will not be able to use it
         * @param bool $throttle If true, reset the throttle timestamp to the present
         */
        public function setNewpassword( $str, $throttle = true ) {
-               $this->loadPasswords();
+               $dbw = wfGetDB( DB_MASTER );
+
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               $update = array(
+                       'user_newpassword' => $passwordFactory->newFromPlaintext( $str )->toString(),
+               );
 
-               $this->mNewpassword = self::getPasswordFactory()->newFromPlaintext( $str );
                if ( $str === null ) {
-                       $this->mNewpassTime = null;
+                       $update['user_newpass_time'] = null;
                } elseif ( $throttle ) {
-                       $this->mNewpassTime = wfTimestampNow();
+                       $update['user_newpass_time'] = $dbw->timestamp();
                }
+
+               $dbw->update( 'user', $update, array( 'user_id' => $id ), __METHOD__ );
        }
 
        /**
@@ -2515,11 +2502,27 @@ class User implements IDBAccessObject {
         */
        public function isPasswordReminderThrottled() {
                global $wgPasswordReminderResendTime;
+
+               if ( !$wgPasswordReminderResendTime ) {
+                       return false;
+               }
+
                $this->load();
-               if ( !$this->mNewpassTime || !$wgPasswordReminderResendTime ) {
+
+               $db = ( $this->queryFlagsUsed & self::READ_LATEST )
+                       ? wfGetDB( DB_MASTER )
+                       : wfGetDB( DB_SLAVE );
+               $newpassTime = $db->selectField(
+                       'user',
+                       'user_newpass_time',
+                       array( 'user_id' => $this->getId() ),
+                       __METHOD__
+               );
+
+               if ( $newpassTime === null ) {
                        return false;
                }
-               $expiry = wfTimestamp( TS_UNIX, $this->mNewpassTime ) + $wgPasswordReminderResendTime * 3600;
+               $expiry = wfTimestamp( TS_UNIX, $newpassTime ) + $wgPasswordReminderResendTime * 3600;
                return time() < $expiry;
        }
 
@@ -3657,8 +3660,6 @@ class User implements IDBAccessObject {
         * @todo Only rarely do all these fields need to be set!
         */
        public function saveSettings() {
-               global $wgAuth;
-
                if ( wfReadOnly() ) {
                        // @TODO: caller should deal with this instead!
                        // This should really just be an exception.
@@ -3670,7 +3671,6 @@ class User implements IDBAccessObject {
                }
 
                $this->load();
-               $this->loadPasswords();
                if ( 0 == $this->mId ) {
                        return; // anon
                }
@@ -3681,17 +3681,10 @@ class User implements IDBAccessObject {
                $oldTouched = $this->mTouched;
                $newTouched = $this->newTouchedTimestamp();
 
-               if ( !$wgAuth->allowSetLocalPassword() ) {
-                       $this->mPassword = self::getPasswordFactory()->newFromCiphertext( null );
-               }
-
                $dbw = wfGetDB( DB_MASTER );
                $dbw->update( 'user',
                        array( /* SET */
                                'user_name' => $this->mName,
-                               'user_password' => $this->mPassword->toString(),
-                               'user_newpassword' => $this->mNewpassword->toString(),
-                               'user_newpass_time' => $dbw->timestampOrNull( $this->mNewpassTime ),
                                'user_real_name' => $this->mRealName,
                                'user_email' => $this->mEmail,
                                'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
@@ -3699,7 +3692,6 @@ class User implements IDBAccessObject {
                                'user_token' => strval( $this->mToken ),
                                'user_email_token' => $this->mEmailToken,
                                'user_email_token_expires' => $dbw->timestampOrNull( $this->mEmailTokenExpires ),
-                               'user_password_expires' => $dbw->timestampOrNull( $this->mPasswordExpires ),
                        ), array( /* WHERE */
                                'user_id' => $this->mId,
                                'user_touched' => $dbw->timestamp( $oldTouched ) // CAS check
@@ -3757,10 +3749,6 @@ class User implements IDBAccessObject {
         * @param string $name Username to add
         * @param array $params Array of Strings Non-default parameters to save to
         *   the database as user_* fields:
-        *   - password: The user's password hash. Password logins will be disabled
-        *     if this is omitted.
-        *   - newpassword: Hash for a temporary password that has been mailed to
-        *     the user.
         *   - email: The user's email address.
         *   - email_authenticated: The email authentication timestamp.
         *   - real_name: The user's real name.
@@ -3771,9 +3759,15 @@ class User implements IDBAccessObject {
         * @return User|null User object, or null if the username already exists.
         */
        public static function createNew( $name, $params = array() ) {
+               foreach ( array( 'password', 'newpassword', 'newpass_time', 'password_expires' ) as $field ) {
+                       if ( isset( $params[$field] ) ) {
+                               wfDeprecated( __METHOD__ . " with param '$field'", '1.27' );
+                               unset( $params[$field] );
+                       }
+               }
+
                $user = new User;
                $user->load();
-               $user->loadPasswords();
                $user->setToken(); // init token
                if ( isset( $params['options'] ) ) {
                        $user->mOptions = $params['options'] + (array)$user->mOptions;
@@ -3782,12 +3776,13 @@ class User implements IDBAccessObject {
                $dbw = wfGetDB( DB_MASTER );
                $seqVal = $dbw->nextSequenceValue( 'user_user_id_seq' );
 
+               $noPass = PasswordFactory::newInvalidPassword()->toString();
+
                $fields = array(
                        'user_id' => $seqVal,
                        'user_name' => $name,
-                       'user_password' => $user->mPassword->toString(),
-                       'user_newpassword' => $user->mNewpassword->toString(),
-                       'user_newpass_time' => $dbw->timestampOrNull( $user->mNewpassTime ),
+                       'user_password' => $noPass,
+                       'user_newpassword' => $noPass,
                        'user_email' => $user->mEmail,
                        'user_email_authenticated' => $dbw->timestampOrNull( $user->mEmailAuthenticated ),
                        'user_real_name' => $user->mRealName,
@@ -3836,13 +3831,14 @@ class User implements IDBAccessObject {
         */
        public function addToDatabase() {
                $this->load();
-               $this->loadPasswords();
                if ( !$this->mToken ) {
                        $this->setToken(); // init token
                }
 
                $this->mTouched = $this->newTouchedTimestamp();
 
+               $noPass = PasswordFactory::newInvalidPassword()->toString();
+
                $dbw = wfGetDB( DB_MASTER );
                $inWrite = $dbw->writesOrCallbacksPending();
                $seqVal = $dbw->nextSequenceValue( 'user_user_id_seq' );
@@ -3850,9 +3846,8 @@ class User implements IDBAccessObject {
                        array(
                                'user_id' => $seqVal,
                                'user_name' => $this->mName,
-                               'user_password' => $this->mPassword->toString(),
-                               'user_newpassword' => $this->mNewpassword->toString(),
-                               'user_newpass_time' => $dbw->timestampOrNull( $this->mNewpassTime ),
+                               'user_password' => $noPass,
+                               'user_newpassword' => $noPass,
                                'user_email' => $this->mEmail,
                                'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
                                'user_real_name' => $this->mRealName,
@@ -3894,6 +3889,11 @@ class User implements IDBAccessObject {
                }
                $this->mId = $dbw->insertId();
 
+               // Set the password now that it's in the DB, if applicable
+               if ( $this->mPassword !== null ) {
+                       $this->setPasswordInternal( $this->mPassword );
+               }
+
                // Clear instance cache other than user table data, which is already accurate
                $this->clearInstanceCache();
 
@@ -4002,13 +4002,14 @@ class User implements IDBAccessObject {
 
        /**
         * Check to see if the given clear-text password is one of the accepted passwords
+        * @deprecated since 1.27. AuthManager is coming.
         * @param string $password User password
         * @return bool True if the given password is correct, otherwise False
         */
        public function checkPassword( $password ) {
                global $wgAuth, $wgLegacyEncoding;
 
-               $this->loadPasswords();
+               $this->load();
 
                // Some passwords will give a fatal Status, which means there is
                // some sort of technical or security reason for this password to
@@ -4030,12 +4031,27 @@ class User implements IDBAccessObject {
                        return false;
                }
 
-               if ( !$this->mPassword->equals( $password ) ) {
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               $db = ( $this->queryFlagsUsed & self::READ_LATEST )
+                       ? wfGetDB( DB_MASTER )
+                       : wfGetDB( DB_SLAVE );
+
+               try {
+                       $mPassword = $passwordFactory->newFromCiphertext( $db->selectField(
+                               'user', 'user_password', array( 'user_id' => $this->getId() ), __METHOD__
+                       ) );
+               } catch ( PasswordError $e ) {
+                       wfDebug( 'Invalid password hash found in database.' );
+                       $mPassword = PasswordFactory::newInvalidPassword();
+               }
+
+               if ( !$mPassword->equals( $password ) ) {
                        if ( $wgLegacyEncoding ) {
                                // Some wikis were converted from ISO 8859-1 to UTF-8, the passwords can't be converted
                                // Check for this with iconv
                                $cp1252Password = iconv( 'UTF-8', 'WINDOWS-1252//TRANSLIT', $password );
-                               if ( $cp1252Password === $password || !$this->mPassword->equals( $cp1252Password ) ) {
+                               if ( $cp1252Password === $password || !$mPassword->equals( $cp1252Password ) ) {
                                        return false;
                                }
                        } else {
@@ -4043,10 +4059,8 @@ class User implements IDBAccessObject {
                        }
                }
 
-               $passwordFactory = self::getPasswordFactory();
-               if ( $passwordFactory->needsUpdate( $this->mPassword ) && !wfReadOnly() ) {
-                       $this->mPassword = $passwordFactory->newFromPlaintext( $password );
-                       $this->saveSettings();
+               if ( $passwordFactory->needsUpdate( $mPassword ) && !wfReadOnly() ) {
+                       $this->setPasswordInternal( $password );
                }
 
                return true;
@@ -4056,20 +4070,39 @@ class User implements IDBAccessObject {
         * Check if the given clear-text password matches the temporary password
         * sent by e-mail for password reset operations.
         *
+        * @deprecated since 1.27. AuthManager is coming.
         * @param string $plaintext
-        *
         * @return bool True if matches, false otherwise
         */
        public function checkTemporaryPassword( $plaintext ) {
                global $wgNewPasswordExpiry;
 
                $this->load();
-               $this->loadPasswords();
-               if ( $this->mNewpassword->equals( $plaintext ) ) {
-                       if ( is_null( $this->mNewpassTime ) ) {
+
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               $db = ( $this->queryFlagsUsed & self::READ_LATEST )
+                       ? wfGetDB( DB_MASTER )
+                       : wfGetDB( DB_SLAVE );
+
+               $row = $db->selectRow(
+                       'user',
+                       array( 'user_newpassword', 'user_newpass_time' ),
+                       array( 'user_id' => $this->getId() ),
+                       __METHOD__
+               );
+               try {
+                       $mNewpassword = $passwordFactory->newFromCiphertext( $row->user_newpassword );
+               } catch ( PasswordError $e ) {
+                       wfDebug( 'Invalid password hash found in database.' );
+                       $mNewpassword = PasswordFactory::newInvalidPassword();
+               }
+
+               if ( $mNewpassword->equals( $plaintext ) ) {
+                       if ( is_null( $row->user_newpass_time ) ) {
                                return true;
                        }
-                       $expiry = wfTimestamp( TS_UNIX, $this->mNewpassTime ) + $wgNewPasswordExpiry;
+                       $expiry = wfTimestamp( TS_UNIX, $row->user_newpass_time ) + $wgNewPasswordExpiry;
                        return ( time() < $expiry );
                } else {
                        return false;
@@ -4927,7 +4960,9 @@ class User implements IDBAccessObject {
         */
        public static function crypt( $password, $salt = false ) {
                wfDeprecated( __METHOD__, '1.24' );
-               $hash = self::getPasswordFactory()->newFromPlaintext( $password );
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               $hash = $passwordFactory->newFromPlaintext( $password );
                return $hash->toString();
        }
 
@@ -4956,7 +4991,9 @@ class User implements IDBAccessObject {
                        }
                }
 
-               $hash = self::getPasswordFactory()->newFromCiphertext( $hash );
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               $hash = $passwordFactory->newFromCiphertext( $hash );
                return $hash->equals( $password );
        }
 
@@ -5166,15 +5203,14 @@ class User implements IDBAccessObject {
        /**
         * Lazily instantiate and return a factory object for making passwords
         *
+        * @deprecated since 1.27, create a PasswordFactory directly instead
         * @return PasswordFactory
         */
        public static function getPasswordFactory() {
-               if ( self::$mPasswordFactory === null ) {
-                       self::$mPasswordFactory = new PasswordFactory();
-                       self::$mPasswordFactory->init( RequestContext::getMain()->getConfig() );
-               }
-
-               return self::$mPasswordFactory;
+               wfDeprecated( __METHOD__, '1.27' );
+               $ret = new PasswordFactory();
+               $ret->init( RequestContext::getMain()->getConfig() );
+               return $ret;
        }
 
        /**
@@ -5196,6 +5232,7 @@ class User implements IDBAccessObject {
         *
         * @todo FIXME: This does not belong here; put it in Html or Linker or somewhere
         *
+        * @deprecated since 1.27
         * @return array Array of HTML attributes suitable for feeding to
         *   Html::element(), directly or indirectly.  (Don't feed to Xml::*()!
         *   That will get confused by the boolean attribute syntax used.)
@@ -5209,7 +5246,7 @@ class User implements IDBAccessObject {
 
                # Note that the pattern requirement will always be satisfied if the
                # input is empty, so we need required in all cases.
-               #
+
                # @todo FIXME: Bug 23769: This needs to not claim the password is required
                # if e-mail confirmation is being used.  Since HTML5 input validation
                # is b0rked anyway in some browsers, just return nothing.  When it's
index a6aae4b..f0ca6fe 100644 (file)
@@ -97,7 +97,7 @@ class ApiImport extends ApiBase {
         * source.
         *
         * @return array
-        * @since 1.26
+        * @since 1.27
         */
        public function getAllowedImportSources() {
                $importSources = $this->getConfig()->get( 'ImportSources' );
index da7b902..92efbfe 100644 (file)
@@ -81,6 +81,7 @@
        "apihelp-delete-param-title": "Titre de la page que vous voulez supprimer. Impossible de l’utiliser avec <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "ID de la page que vous voulez supprimer. Impossible à utiliser avec <var>$1title</var>.",
        "apihelp-delete-param-reason": "Motif de suppression. Si non défini, un motif généré automatiquement sera utilisé.",
+       "apihelp-delete-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal des suppressions.",
        "apihelp-delete-param-watch": "Ajouter la page à la liste de suivi de l’utilisateur actuel.",
        "apihelp-delete-param-watchlist": "Ajouter ou supprimer sans distinction la page de la liste de suivi de l'utilisateur actuel, utiliser les préférences ou ne rien changer au suivi.",
        "apihelp-delete-param-unwatch": "Supprimer la page de la liste de suivi de l'utilisateur actuel.",
index 2b40125..96ab8ca 100644 (file)
@@ -70,6 +70,7 @@
        "apihelp-delete-param-title": "Título da páxina a eliminar. Non pode usarse xunto con <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "Identificador da páxina a eliminar. Non pode usarse xunto con <var>$1title</var>.",
        "apihelp-delete-param-reason": "Razón para o borrado. Se non se indica, usarase unha razón xenerada automaticamente.",
+       "apihelp-delete-param-tags": "Cambiar as etiquetas a aplicar na entrada do rexistro de borrado.",
        "apihelp-delete-param-watch": "Engadir esta páxina á lista de vixilancia do usuario actual.",
        "apihelp-delete-param-watchlist": "Engadir ou eliminar sen condicións a páxina da lista de vixiancia do usuario actual, use as preferencias ou non cambie a vixiancia.",
        "apihelp-delete-param-unwatch": "Eliminar esta páxina da lista de vixilancia do usuario actual.",
index 075b22b..5f9850b 100644 (file)
@@ -73,6 +73,7 @@
        "apihelp-edit-param-section": "節番号です。先頭の節の場合は <kbd>0</kbd>、新しい節の場合は <kbd>new</kbd>を指定します。",
        "apihelp-edit-param-sectiontitle": "新しい節の名前です。",
        "apihelp-edit-param-text": "ページの本文。",
+       "apihelp-edit-param-summary": "編集の要約。$1section=new で $1sectiontitle が設定されていない場合は節名としても利用されます。",
        "apihelp-edit-param-tags": "この版に適用する変更タグ。",
        "apihelp-edit-param-minor": "細部の編集",
        "apihelp-edit-param-notminor": "細部の編集ではない。",
        "apihelp-expandtemplates-param-title": "ページの名前です。",
        "apihelp-expandtemplates-param-text": "変換するウィキテキストです。",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "展開されたウィキテキスト。",
+       "apihelp-expandtemplates-paramvalue-prop-parsetree": "入力のXML構文解析ツリー。",
        "apihelp-expandtemplates-param-includecomments": "HTMLコメントを出力に含めるかどうか。",
+       "apihelp-expandtemplates-param-generatexml": "XMLの構文解析ツリーを生成します (replaced by $1prop=parsetree)",
        "apihelp-expandtemplates-example-simple": "ウィキテキスト <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd> を展開する。",
        "apihelp-feedcontributions-description": "利用者の投稿記録フィードを返します。",
        "apihelp-feedcontributions-param-feedformat": "フィードの形式。",
        "apihelp-feedrecentchanges-description": "最近の更新フィードを返します。",
        "apihelp-feedrecentchanges-param-feedformat": "フィードの形式。",
        "apihelp-feedrecentchanges-param-namespace": "この名前空間の結果のみに絞り込む。",
+       "apihelp-feedrecentchanges-param-invert": "選択されたものを除く、すべての名前空間。",
+       "apihelp-feedrecentchanges-param-associated": "関連する(トークまたはメイン)名前空間を含めます。",
        "apihelp-feedrecentchanges-param-limit": "返す結果の最大数。",
        "apihelp-feedrecentchanges-param-from": "これ以降の編集を表示する。",
        "apihelp-feedrecentchanges-param-hideminor": "細部の変更を隠す。",
        "apihelp-login-example-login": "ログイン",
        "apihelp-logout-description": "ログアウトしてセッションデータを消去します。",
        "apihelp-logout-example-logout": "現在の利用者をログアウトする。",
+       "apihelp-managetags-param-operation": "実行する操作:\n;create: 手動適用のための新たな変更タグを作成します。\n;delete: 変更タグをデータベースから削除し、そのタグが使用されているすべての版、最近の更新項目、記録項目からそれを除去します。\n;activate: 変更タグを有効化し、利用者がそのタグを手動で適用できるようにします。\n;deactivate: 変更タグを無効化し、利用者がそのタグを手動で適用することができないようにします。",
        "apihelp-managetags-param-tag": "作成、削除、有効化、または無効化するタグ。タグの作成の場合、そのタグは存在しないものでなければなりません。タグの削除の場合、そのタグが存在しなければなりません。タグの有効化の場合、そのタグが存在し、かつ拡張機能によって使用されていないものでなければなりません。タグの無効化の場合、そのタグが現在有効であって手動で定義されたものでなければなりません。",
        "apihelp-managetags-param-reason": "タグを作成、削除、有効化、または無効化する追加の理由。",
+       "apihelp-managetags-param-ignorewarnings": "操作中に発生したすべての警告を無視するかどうか。",
        "apihelp-managetags-example-create": "<kbd>spam</kbd> という名前のタグを <kbd>For use in edit patrolling</kbd> という理由で作成する",
        "apihelp-managetags-example-delete": "<kbd>vandlaism</kbd> タグを <kbd>Misspelt</kbd> という理由で削除する",
        "apihelp-managetags-example-activate": "<kbd>spam</kbd> という名前のタグを <kbd>For use in edit patrolling</kbd> という理由で有効化する",
        "apihelp-opensearch-param-limit": "返す結果の最大数。",
        "apihelp-opensearch-param-namespace": "検索する名前空間。",
        "apihelp-opensearch-param-suggest": "<var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> が false の場合、何もしません。",
+       "apihelp-opensearch-param-redirects": "転送を処理する方法:\n;return: 転送ページそのものを返します。\n;resolve: 転送先のページを返します。$1limit より返される結果が少なくなるかもしれません。\n歴史的な理由により、$1format=json では \"return\" が、他の形式では \"resolve\" が既定です。",
        "apihelp-opensearch-param-format": "出力する形式。",
        "apihelp-opensearch-example-te": "<kbd>Te</kbd> から始まるページを検索する。",
        "apihelp-options-example-reset": "すべて初期設定に戻す。",
        "apihelp-options-example-complex": "すべての個人設定を初期化し、<kbd>skin</kbd> および <kbd> nickname </kbd> を設定する。",
        "apihelp-paraminfo-description": "API モジュールに関する情報を取得します。",
        "apihelp-paraminfo-param-modules": "モジュールの名前のリスト (<var>action</var> および <var>format</var> パラメーターの値, または <kbd>main</kbd>). <kbd>+</kbd> を使用して下位モジュールを指定できます。",
+       "apihelp-paraminfo-param-helpformat": "ヘルプ文字列の形式。",
+       "apihelp-paraminfo-param-querymodules": "クエリモジュール名のリスト (<var>prop</var>, <var>meta</var> or <var>list</var> パラメータの値)。<kbd>$1querymodules=foo</kbd> の代わりに <kbd>$1modules=query+foo</kbd> を使用してください。",
        "apihelp-paraminfo-example-1": "<kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd>, and <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> に関する情報を表示する。",
+       "apihelp-parse-param-summary": "構文解析のための要約",
+       "apihelp-parse-param-prop": "どの情報を取得するか:",
+       "apihelp-parse-paramvalue-prop-text": "ウィキテキストの解析されたテキストを提供します。",
+       "apihelp-parse-paramvalue-prop-langlinks": "解析されたウィキテキストにおける言語リンクを提供します。",
+       "apihelp-parse-paramvalue-prop-categories": "構文解析されたウィキテキストのカテゴリを提供します。",
+       "apihelp-parse-paramvalue-prop-categorieshtml": "カテゴリのHTMLバージョンを提供します。",
+       "apihelp-parse-paramvalue-prop-links": "構文解析されたウィキテキスト内で内部リンクを提供します。",
+       "apihelp-parse-paramvalue-prop-templates": "構文解析されたウィキテキストでテンプレートを提供します。",
+       "apihelp-parse-paramvalue-prop-images": "構文解析されたウィキテキストの画像を提供します。",
+       "apihelp-parse-paramvalue-prop-externallinks": "構文解析されたウィキテキスト内で外部リンクを提供します。",
+       "apihelp-parse-paramvalue-prop-sections": "構文解析されたウィキテキスト内のセクションを提供します。",
+       "apihelp-parse-paramvalue-prop-revid": "構文解析されたページの版IDを追加します。",
+       "apihelp-parse-paramvalue-prop-displaytitle": "構文解析されたウィキテキストのタイトルを追加します。",
+       "apihelp-parse-paramvalue-prop-headitems": "ページの <code>&lt;head&gt;</code> の中に入れてアイテムを提供します。",
+       "apihelp-parse-paramvalue-prop-headhtml": "ページの解析された <code>&lt;head&gt;</code> を与える。",
+       "apihelp-parse-paramvalue-prop-jsconfigvars": "ページに固有のJavaScriptの設定変数を提供します。",
+       "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "JSON文字列としてページに固有のJavaScriptの設定変数を提供します。",
+       "apihelp-parse-paramvalue-prop-indicators": "ページ上で使用されるページのステータスインジケータのHTMLを提供します。",
+       "apihelp-parse-paramvalue-prop-iwlinks": "構文解析されたウィキテキスト内でウィキ間リンクを提供します。",
+       "apihelp-parse-paramvalue-prop-wikitext": "構文解析されたオリジナルのwikiテキストを提供します。",
+       "apihelp-parse-paramvalue-prop-properties": "構文解析されたウィキテキスト内で定義されたさまざまなプロパティを提供します。",
+       "apihelp-parse-paramvalue-prop-parsetree": "版内容のXML構文解析ツリー (requires content model <code>$1</code>)",
+       "apihelp-parse-param-pst": "それを構文解析する前に、入力の上で事前保存の変換を実行してください。テキストで使用した場合のみ有効です。",
+       "apihelp-parse-param-effectivelanglinks": "エクステンションによって供給された言語リンクが含まれています (for use with <kbd>$1prop=langlinks</kbd>).",
+       "apihelp-parse-param-section": "この節番号の内容のみを構文解析します。\n\n<kbd>new</kbd> のとき、ページに新しい節を追加するかのように <var>$1text</var> と<var>$1sectiontitle</var> を解析します。\n\n<kbd>new</kbd> は <var>text</var> を指定したときのみ許可されます。",
+       "apihelp-parse-param-sectiontitle": "<var>section</var> が <kbd>new</kbd> のときの、新しい節の節名。\n\nページ編集とは異なり、これは <var>summary</var> が省略または空のときにはフォールバックしません。",
        "apihelp-parse-param-disablepp": "<var>$1disablelimitreport</var> を代わりに使用してください。",
+       "apihelp-parse-param-disabletidy": "パーサ出力に(例えば整頓)HTMLのクリーンアップを実行しないでください。",
        "apihelp-parse-param-preview": "プレビューモードでのパース",
        "apihelp-parse-example-page": "ページをパース",
        "apihelp-parse-example-text": "ウィキテキストをパース",
+       "apihelp-parse-example-summary": "要約を構文解析します。",
        "apihelp-patrol-description": "ページまたは版を巡回済みにします。",
        "apihelp-patrol-param-revid": "巡回済みにする版ID。",
        "apihelp-patrol-example-rcid": "最近の更新を巡回",
        "apihelp-protect-param-reason": "保護(解除)の理由。",
        "apihelp-protect-param-watch": "指定されると、保護(解除)するページが現在の利用者のウォッチリストに追加されます。",
        "apihelp-protect-example-protect": "ページを保護する。",
+       "apihelp-protect-example-unprotect2": "制限を設定されたページ保護を解除します。",
+       "apihelp-purge-description": "指定されたページのキャッシュをパージします。\n\n利用者がログインしていない場合は、 POST リクエストが必要です。",
+       "apihelp-purge-param-forcelinkupdate": "リンクテーブルを更新します。",
        "apihelp-purge-example-simple": "ページ <kbd>Main Page</kbd> および <kbd>API</kbd> をパージする。",
        "apihelp-purge-example-generator": "標準名前空間にある最初の10ページをパージする。",
+       "apihelp-query-param-prop": "照会ページ用に、どのプロパティを取得するか。",
+       "apihelp-query-param-list": "どの一覧を取得するか。",
+       "apihelp-query-param-meta": "どのメタデータを取得するか。",
+       "apihelp-query-param-export": "指定されたまたは生成されたすべてのページの、現在の版を書き出します。",
+       "apihelp-query-param-iwurl": "タイトルがウィキ間リンクである場合に、完全なURLを取得するかどうか。",
        "apihelp-query-example-revisions": "[[Special:ApiHelp/query+siteinfo|サイト情報]]と<kbd>Main Page</kbd>の[[Special:ApiHelp/query+revisions|版]]を取得する。",
        "apihelp-query+allcategories-description": "すべてのカテゴリを一覧表示します。",
        "apihelp-query+allcategories-param-from": "列挙を開始するカテゴリ。",
        "apihelp-query+allcategories-param-to": "列挙を終了するカテゴリ。",
-       "apihelp-query+allcategories-param-prefix": "ã\81\93ã\81®å\80¤ã\81§å§\8bã\81¾ã\82\8bã\82¿ã\82¤ã\83\88ã\83«のカテゴリを検索します。",
+       "apihelp-query+allcategories-param-prefix": "ã\81\93ã\81®å\80¤ã\81§å§\8bã\81¾ã\82\8bã\83\9aã\83¼ã\82¸å\90\8dのカテゴリを検索します。",
        "apihelp-query+allcategories-param-dir": "並べ替えの方向。",
        "apihelp-query+allcategories-param-limit": "返すカテゴリの数。",
        "apihelp-query+allcategories-param-prop": "取得するプロパティ:",
+       "apihelp-query+allcategories-paramvalue-prop-size": "カテゴリ内のページ数を追加します。",
+       "apihelp-query+allcategories-paramvalue-prop-hidden": "<code>_&#95;HIDDENCAT_&#95;</code>に隠されているタグカテゴリ。",
+       "apihelp-query+allcategories-example-size": "カテゴリを、内包するページ数の情報と共に、一覧表示する。",
        "apihelp-query+allcategories-example-generator": "<kbd>List</kbd> で始まるカテゴリページに関する情報を取得する。",
+       "apihelp-query+alldeletedrevisions-description": "利用者によって削除された、または名前空間内の削除されたすべての版を一覧表示する。",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "<var>$3user</var> と同時に使用できません。",
        "apihelp-query+alldeletedrevisions-param-start": "列挙の始点となるタイムスタンプ。",
        "apihelp-query+alldeletedrevisions-param-end": "列挙の終点となるタイムスタンプ。",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "ジェネレーターとして使用する場合、版IDではなくページ名を生成します。",
        "apihelp-query+alldeletedrevisions-example-user": "利用者 <kbd>Example</kbd> による削除された直近の50版を一覧表示する。",
        "apihelp-query+alldeletedrevisions-example-ns-main": "標準名前空間にある削除された最初の50版を一覧表示する。",
-       "apihelp-query+allfileusages-param-from": "列挙を開始するファイルのタイトル。",
-       "apihelp-query+allfileusages-param-to": "列挙を終了するファイルのタイトル。",
-       "apihelp-query+allfileusages-param-prefix": "この値で始まるすべてのファイルのタイトルを検索する。",
+       "apihelp-query+allfileusages-description": "存在しないものを含め、すべてのファイルの使用状況を一覧表示する。",
+       "apihelp-query+allfileusages-param-from": "列挙を開始するファイルのページ名。",
+       "apihelp-query+allfileusages-param-to": "列挙を終了するファイルのページ名。",
+       "apihelp-query+allfileusages-param-prefix": "この値で始まるページ名のすべてのファイルを検索する。",
+       "apihelp-query+allfileusages-param-prop": "どの情報を結果に含めるか:",
+       "apihelp-query+allfileusages-paramvalue-prop-ids": "使用しているページのページIDを追加します ($1unique とは同時に使用できません)。",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "ファイルのページ名を追加します。",
+       "apihelp-query+allfileusages-example-unique": "ユニークなファイルを一覧表示する。",
+       "apihelp-query+allfileusages-example-generator": "ファイルを含むページを取得します。",
+       "apihelp-query+allimages-description": "順次すべての画像を列挙します。",
        "apihelp-query+allimages-param-sort": "並べ替えに使用するプロパティ。",
        "apihelp-query+allimages-param-from": "列挙の始点となる画像タイトル。$1sort=name を指定した場合のみ使用できます。",
-       "apihelp-query+allimages-param-to": "å\88\97æ\8c\99ã\81®çµ\82ç\82¹ã\81¨ã\81ªã\82\8bç\94»å\83\8fã\82¿ã\82¤ã\83\88ã\83«。$1sort=name を指定した場合のみ使用できます。",
+       "apihelp-query+allimages-param-to": "å\88\97æ\8c\99ã\81®çµ\82ç\82¹ã\81¨ã\81ªã\82\8bç\94»å\83\8fã\81®ã\83\9aã\83¼ã\82¸å\90\8d。$1sort=name を指定した場合のみ使用できます。",
        "apihelp-query+allimages-param-start": "列挙の始点となるタイムスタンプ。$1sort=timestamp を指定した場合のみ使用できます。",
        "apihelp-query+allimages-param-end": "列挙の終点となるタイムスタンプ。$1sort=timestamp を指定した場合のみ使用できます。",
        "apihelp-query+allimages-param-prefix": "この値で始まるすべての画像タイトルを検索する。$1sort=name を指定した場合のみ使用できます。",
        "apihelp-query+allimages-example-mimetypes": "MIMEタイプが <kbd>image/png</kbd> または <kbd>image/gif</kbd> であるファイルの一覧を表示する",
        "apihelp-query+allimages-example-generator": "<kbd>T</kbd> で始まる4つのファイルに関する情報を表示する。",
        "apihelp-query+alllinks-description": "与えられた名前空間へのすべてのリンクを一覧表示します。",
-       "apihelp-query+alllinks-param-from": "å\88\97æ\8c\99ã\82\92é\96\8bå§\8bã\81\99ã\82\8bã\83ªã\83³ã\82¯ã\81®ã\82¿ã\82¤ã\83\88ã\83«。",
+       "apihelp-query+alllinks-param-from": "å\88\97æ\8c\99ã\82\92é\96\8bå§\8bã\81\99ã\82\8bã\83ªã\83³ã\82¯ã\81®ã\83\9aã\83¼ã\82¸å\90\8d。",
        "apihelp-query+alllinks-param-to": "列挙を終了するリンクのページ名。",
        "apihelp-query+alllinks-param-prefix": "この値で始まるすべてのリンクされたページを検索する。",
+       "apihelp-query+alllinks-paramvalue-prop-title": "リンクのページ名を追加します。",
+       "apihelp-query+alllinks-param-namespace": "列挙する名前空間。",
        "apihelp-query+alllinks-example-B": "<kbd>B</kbd> で始まるリンクされたページ (存在しないページも含む)を、リンク元のページIDとともに表示する。",
+       "apihelp-query+alllinks-example-unique": "ユニークなリンクのタイトルを一覧。",
+       "apihelp-query+alllinks-example-generator": "リンクを含むページを取得します。",
+       "apihelp-query+allmessages-param-messages": "出力のためのメッセージ。 <kbd>*</kbd>(デフォルト)は、すべてのメッセージを意味します。",
        "apihelp-query+allmessages-param-prop": "取得するプロパティ:",
+       "apihelp-query+allmessages-param-nocontent": "設定した場合、出力内のメッセージの内容が含まれていません。",
        "apihelp-query+allmessages-param-args": "メッセージ中に展開される引数。",
        "apihelp-query+allmessages-param-filter": "この文字列を含んだ名前のメッセージのみを返す。",
        "apihelp-query+allmessages-param-customised": "変更された状態のメッセージのみを返す。",
        "apihelp-query+allpages-param-from": "列挙を開始するページ名。",
        "apihelp-query+allpages-param-to": "列挙を終了するページ名。",
        "apihelp-query+allpages-param-prefix": "この値で始まるすべてのページ名を検索します。",
+       "apihelp-query+allpages-param-namespace": "列挙する名前空間。",
        "apihelp-query+allpages-param-prtype": "保護されているページに絞り込む。",
        "apihelp-query+allpages-param-prlevel": "保護レベルで絞り込む ($1type= パラメーターと同時に使用しなければなりません)。",
        "apihelp-query+allpages-param-limit": "返すページの総数。",
        "apihelp-query+allpages-example-generator-revisions": "<kbd>Re</kbd> で始まる最初の非リダイレクトの2ページの内容を表示する。",
        "apihelp-query+allredirects-param-from": "列挙を開始するリダイレクトのページ名。",
        "apihelp-query+allredirects-param-to": "列挙を終了するリダイレクトのページ名。",
+       "apihelp-query+allredirects-param-namespace": "列挙する名前空間。",
        "apihelp-query+allrevisions-description": "すべての版を一覧表示する。",
        "apihelp-query+allrevisions-param-start": "列挙の始点となるタイムスタンプ。",
        "apihelp-query+allrevisions-param-end": "列挙の終点となるタイムスタンプ。",
        "apihelp-query+allrevisions-example-user": "利用者 <kbd>Example</kbd> による直近の50版を一覧表示する。",
        "apihelp-query+allrevisions-example-ns-main": "標準名前空間にある最初の50版を一覧表示する。",
        "apihelp-query+alltransclusions-param-prefix": "この値で始まるすべてのトランスクルードされているページを検索する。",
+       "apihelp-query+alltransclusions-param-namespace": "列挙する前空間。",
        "apihelp-query+alltransclusions-example-generator": "参照読み込みを含んでいるページを取得する。",
        "apihelp-query+allusers-description": "すべての登録利用者を一覧表示します。",
        "apihelp-query+allusers-param-from": "列挙を開始する利用者名。",
        "apihelp-query+backlinks-description": "与えられたページにリンクしているすべてのページを検索します。",
        "apihelp-query+backlinks-param-title": "検索するページ名。<var>$1pageid</var> とは同時に使用できません。",
        "apihelp-query+backlinks-param-pageid": "検索するページID。<var>$1title</var>とは同時に使用できません。",
+       "apihelp-query+backlinks-param-namespace": "列挙する名前空間。",
        "apihelp-query+backlinks-example-simple": "<kbd>Main page</kbd> へのリンクを表示する。",
        "apihelp-query+backlinks-example-generator": "<kbd>Main page</kbd> にリンクしているページの情報を取得する。",
        "apihelp-query+blocks-description": "ブロックされた利用者とIPアドレスを一覧表示します。",
        "apihelp-query+blocks-param-users": "検索対象の利用者のリスト (任意)。",
        "apihelp-query+blocks-param-limit": "一覧表示するブロックの最大数。",
        "apihelp-query+blocks-param-prop": "取得するプロパティ:",
+       "apihelp-query+blocks-paramvalue-prop-id": "ブロックのIDを追加します。",
+       "apihelp-query+blocks-paramvalue-prop-user": "ブロックされた利用者の利用者名を追加します。",
+       "apihelp-query+blocks-paramvalue-prop-userid": "ブロックされた利用者の利用者IDを追加します。",
+       "apihelp-query+blocks-paramvalue-prop-by": "ブロック実行者の利用者名を追加します。",
+       "apihelp-query+blocks-paramvalue-prop-byid": "ブロック実行者の利用者IDを追加します。",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "ブロックが与えられたときのタイムスタンプを追加します。",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "ブロックの有効期限が切れたときのタイムスタンプを追加します。",
+       "apihelp-query+blocks-paramvalue-prop-reason": "ブロックに指定された理由を追加します。",
+       "apihelp-query+blocks-paramvalue-prop-range": "ブロックの影響を受けたIPアドレスの範囲を追加します。",
+       "apihelp-query+blocks-paramvalue-prop-flags": "(autoblock, anononly, などとの) ban をタグ付けします。",
+       "apihelp-query+blocks-param-show": "これらの基準を満たす項目のみを表示します。\nたとえば、IPアドレスの無期限ブロックのみを表示するには、<kbd>$1show=ip|!temp</kbd> を設定します。",
        "apihelp-query+blocks-example-simple": "ブロックを一覧表示する。",
        "apihelp-query+blocks-example-users": "利用者<kbd>Alice</kbd> および <kbd>Bob</kbd> のブロックを一覧表示する。",
+       "apihelp-query+categories-param-prop": "各カテゴリについて取得する追加のプロパティ:",
+       "apihelp-query+categories-paramvalue-prop-timestamp": "カテゴリが追加されたときのタイムスタンプを追加します。",
+       "apihelp-query+categories-paramvalue-prop-hidden": "<code>_&#95;HIDDENCAT_&#95;</code>で隠されているカテゴリに印を付ける。",
+       "apihelp-query+categories-param-show": "どの種類のカテゴリを表示するか。",
        "apihelp-query+categories-param-limit": "返すカテゴリの数。",
        "apihelp-query+categories-example-simple": "ページ <kbd>Albert Einstein</kbd> が属しているカテゴリの一覧を取得する。",
        "apihelp-query+categories-example-generator": "ページ <kbd>Albert Einstein</kbd> で使われているすべてのカテゴリに関する情報を取得する。",
        "apihelp-query+categorymembers-description": "与えられたカテゴリ内のすべてのページを一覧表示します。",
        "apihelp-query+categorymembers-param-title": "一覧表示するカテゴリ (必須)。<kbd>{{ns:category}}:</kbd> 接頭辞を含まなければなりません。<var>$1pageid</var> とは同時に使用できません。",
        "apihelp-query+categorymembers-param-pageid": "一覧表示するカテゴリのページID. <var>$1title</var> とは同時に使用できません。",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "ページIDを追加します。",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "ページ名と名前空間IDを追加します。",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkey": "カテゴリでのソートに使用するソートキーを追加します(16進数文字列)。",
+       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "ページが含まれていたときのタイムスタンプを追加します。",
        "apihelp-query+categorymembers-param-limit": "返すページの最大数。",
        "apihelp-query+categorymembers-param-sort": "並べ替えに使用するプロパティ。",
        "apihelp-query+categorymembers-param-start": "列挙の始点となるタイムスタンプ。<kbd>$1sort=timestamp</kbd>を指定した場合のみ使用できます。",
        "apihelp-query+contributors-description": "ページへのログインした投稿者の一覧と匿名投稿者の数を取得します。",
        "apihelp-query+contributors-param-limit": "返す投稿者の数。",
        "apihelp-query+contributors-example-simple": "<kbd>Main Page</kbd> への投稿者を表示する。",
+       "apihelp-query+deletedrevisions-param-start": "列挙の始点となるタイムスタンプ。版IDの一覧を処理するときには無視されます。",
+       "apihelp-query+deletedrevisions-param-end": "列挙の終点となるタイムスタンプ。版IDの一覧を処理するときには無視されます。",
        "apihelp-query+deletedrevisions-param-tag": "このタグが付与された版のみ表示します。",
        "apihelp-query+deletedrevisions-param-user": "この利用者による版のみを一覧表示。",
        "apihelp-query+deletedrevisions-param-excludeuser": "この利用者による版を一覧表示しない。",
        "apihelp-query+deletedrevisions-example-titles": "ページ <kbd>Main Page</kbd> および <kbd>Talk:Main Page</kbd> の削除された版とその内容を一覧表示する。",
        "apihelp-query+deletedrevisions-example-revids": "削除された版 <kbd>123456</kbd> に関する情報を一覧表示する。",
+       "apihelp-query+deletedrevs-param-start": "列挙の始点となるタイムスタンプ。",
+       "apihelp-query+deletedrevs-param-end": "列挙の終点となるタイムスタンプ。",
        "apihelp-query+deletedrevs-param-from": "列挙の始点となるページ名。",
        "apihelp-query+deletedrevs-param-to": "列挙の終点となるページ名。",
-       "apihelp-query+disabled-description": "このクエリ モジュールは無効化されています。",
+       "apihelp-query+deletedrevs-param-excludeuser": "この利用者による版を一覧表示しない。",
+       "apihelp-query+deletedrevs-param-namespace": "この名前空間に含まれるページのみを一覧表示します。",
+       "apihelp-query+deletedrevs-param-limit": "一覧表示する版の最大量。",
+       "apihelp-query+deletedrevs-example-mode1": "ページ <kbd>Main Page</kbd> および <kbd>Talk:Main Page</kbd> の最後に削除された版を内容と共に一覧表示する(モード 1)。",
+       "apihelp-query+deletedrevs-example-mode2": "<kbd>Bob</kbd> による、削除された最後の50投稿を一覧表示する(モード 2)。",
+       "apihelp-query+deletedrevs-example-mode3-main": "標準名前空間にある削除された最初の50版を一覧表示する(モード 3)。",
+       "apihelp-query+deletedrevs-example-mode3-talk": "{{ns:talk}}名前空間にある削除された最初の50版を一覧表示する(モード 3)。",
+       "apihelp-query+disabled-description": "このクエリモジュールは無効化されています。",
        "apihelp-query+embeddedin-param-title": "検索するページ名。$1pageid とは同時に使用できません。",
        "apihelp-query+embeddedin-param-pageid": "検索するページID. $1titleとは同時に使用できません。",
+       "apihelp-query+embeddedin-param-namespace": "列挙する名前空間。",
        "apihelp-query+embeddedin-example-simple": "<kbd>Template:Stub</kbd> を参照読み込みしているページを表示する。",
        "apihelp-query+embeddedin-example-generator": "<kbd>Template:Stub</kbd> をトランスクルードしているページに関する情報を取得する。",
        "apihelp-query+extlinks-description": "与えられたページにあるすべての外部URL (インターウィキを除く) を返します。",
        "apihelp-query+extlinks-param-protocol": "URLのプロトコル。このパラメータが空であり、かつ<var>$1query</var> が設定されている場合, protocol は <kbd>http</kbd> となります。すべての外部リンクを一覧表示するためにはこのパラメータと <var>$1query</var> の両方を空にしてください。",
        "apihelp-query+extlinks-example-simple": "<kbd>Main Page</kbd> の外部リンクの一覧を取得する。",
        "apihelp-query+exturlusage-description": "与えられたURLを含むページを一覧表示します。",
+       "apihelp-query+exturlusage-paramvalue-prop-ids": "ページのIDを追加します。",
+       "apihelp-query+exturlusage-paramvalue-prop-title": "ページ名と名前空間IDを追加します。",
+       "apihelp-query+exturlusage-paramvalue-prop-url": "ページ内で使用されているURLを追加します。",
+       "apihelp-query+exturlusage-param-namespace": "列挙するページ名前空間。",
        "apihelp-query+exturlusage-example-simple": "<kbd>http://www.mediawiki.org</kbd> にリンクしているページを一覧表示する。",
+       "apihelp-query+filearchive-description": "削除されたファイルをすべて順に列挙します。",
+       "apihelp-query+filearchive-param-from": "列挙の始点となる画像のページ名。",
+       "apihelp-query+filearchive-param-to": "列挙の終点となる画像のページ名。",
+       "apihelp-query+filearchive-param-prop": "どの画像情報を取得するか:",
+       "apihelp-query+filearchive-paramvalue-prop-timestamp": "バージョンがアップロードされたタイムスタンプを追加します。",
+       "apihelp-query+filearchive-paramvalue-prop-user": "画像のバージョンをアップロードした利用者を追加します。",
+       "apihelp-query+filearchive-paramvalue-prop-size": "バイト単位での画像や高さ、幅、ページ数のサイズを追加します(該当する場合)。",
+       "apihelp-query+filearchive-paramvalue-prop-mime": "画像の MIME を追加します。",
+       "apihelp-query+filearchive-paramvalue-prop-mediatype": "画像のメディア・タイプを追加します。",
+       "apihelp-query+filearchive-paramvalue-prop-metadata": "画像のバージョンの Exif メタデータを一覧表示します。",
+       "apihelp-query+filearchive-paramvalue-prop-bitdepth": "バージョンのビット深度を追加します。",
+       "apihelp-query+filearchive-paramvalue-prop-archivename": "非最新バージョンのアーカイブバージョンのファイル名を追加します。",
        "apihelp-query+filearchive-example-simple": "削除されたファイルの一覧を表示する。",
+       "apihelp-query+filerepoinfo-example-simple": "ファイルリポジトリについての情報を取得します。",
        "apihelp-query+fileusage-param-prop": "取得するプロパティ:",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "各ページのページID。",
+       "apihelp-query+fileusage-paramvalue-prop-title": "各ページのページ名。",
        "apihelp-query+fileusage-example-simple": "[[:File:Example.jpg]] を使用しているページの一覧を取得する。",
        "apihelp-query+fileusage-example-generator": "[[:File:Example.jpg]] を使用しているページの情報を取得する。",
        "apihelp-query+imageinfo-param-prop": "取得するファイル情報:",
+       "apihelp-query+imageinfo-paramvalue-prop-url": "ファイルと説明ページへのURLを提供します。",
+       "apihelp-query+imageinfo-paramvalue-prop-size": "バイト単位でファイルや高さ、幅、ページ数のサイズを追加します(該当する場合)。",
+       "apihelp-query+imageinfo-paramvalue-prop-mime": "ファイルのMIMEタイプを追加します。",
+       "apihelp-query+imageinfo-paramvalue-prop-thumbmime": "画像サムネイルのMIMEタイプを追加します(url と $1urlwidth パラメータが必須です)。",
+       "apihelp-query+imageinfo-paramvalue-prop-mediatype": "ファイルのメディアタイプを追加します。",
+       "apihelp-query+imageinfo-paramvalue-prop-metadata": "ファイルのバージョンの Exif メタデータを一覧表示します。",
+       "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "バージョンのビット深度を追加します。",
        "apihelp-query+imageinfo-param-start": "一覧表示の始点となるタイムスタンプ。",
        "apihelp-query+imageinfo-param-end": "一覧表示の終点となるタイムスタンプ。",
        "apihelp-query+imageinfo-example-simple": "[[:File:Albert Einstein Head.jpg]] の現在のバージョンに関する情報を取得する。",
        "apihelp-query+images-example-generator": "[[Main Page]] で使用されているファイルに関する情報を取得する。",
        "apihelp-query+imageusage-param-title": "検索するページ名。$1pageid とは同時に使用できません。",
        "apihelp-query+imageusage-param-pageid": "検索するページID. $1titleとは同時に使用できません。",
+       "apihelp-query+imageusage-param-namespace": "列挙する名前空間。",
        "apihelp-query+imageusage-example-simple": "[[:File:Albert Einstein Head.jpg]] を使用しているページを表示する。",
        "apihelp-query+imageusage-example-generator": "[[:File:Albert Einstein Head.jpg]] を使用しているページに関する情報を取得する。",
        "apihelp-query+info-description": "ページの基本的な情報を取得します。",
        "apihelp-query+info-paramvalue-prop-protection": "それぞれのページの保護レベルを一覧表示する。",
        "apihelp-query+info-example-simple": "<kbd>Main Page</kbd> に関する情報を取得する。",
        "apihelp-query+iwbacklinks-param-prop": "取得するプロパティ:",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "ウィキ間リンクのページ名を追加します。",
        "apihelp-query+iwbacklinks-example-simple": "[[wikibooks:Test]] へリンクしているページを取得する。",
        "apihelp-query+iwbacklinks-example-generator": "[[wikibooks:Test]] へリンクしているページの情報を取得する。",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "完全なURLを追加します。",
        "apihelp-query+iwlinks-param-limit": "返すウィキ間リンクの数。",
        "apihelp-query+iwlinks-param-prefix": "この接頭辞のウィキ間リンクのみを返す。",
        "apihelp-query+iwlinks-param-title": "検索するウィキ間リンク。<var>$1</var> と同時に使用しなければなりません。",
        "apihelp-query+langbacklinks-param-title": "検索する言語間リンク。$1lang と同時に使用しなければなりません。",
        "apihelp-query+langbacklinks-param-limit": "返すページの総数。",
        "apihelp-query+langbacklinks-param-prop": "取得するプロパティ:",
+       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "言語間リンクのページ名を追加します。",
        "apihelp-query+langbacklinks-example-simple": "[[:fr:Test]] へリンクしているページを取得する。",
        "apihelp-query+langbacklinks-example-generator": "[[:fr:Test]] へリンクしているページの情報を取得する。",
        "apihelp-query+langlinks-param-limit": "返す言語間リンクの数。",
        "apihelp-query+langlinks-param-url": "完全なURLを取得するかどうか (<var>$1prop</var>とは同時に使用できません).",
+       "apihelp-query+langlinks-paramvalue-prop-url": "完全なURLを追加します。",
+       "apihelp-query+langlinks-paramvalue-prop-autonym": "ネイティブ言語名を追加します。",
        "apihelp-query+langlinks-param-lang": "この言語コードの言語間リンクのみを返す。",
        "apihelp-query+langlinks-param-title": "検索するリンク。<var>$1lang</var>と同時に使用しなければなりません。",
        "apihelp-query+langlinks-example-simple": "<kbd>Main Page</kbd> にある言語間リンクを取得する。",
        "apihelp-query+links-example-generator": "<kbd>Main Page</kbd> からリンクされているページに関する情報を取得する。",
        "apihelp-query+links-example-namespaces": "<kbd>Main Page</kbd> からの {{ns:user}} および {{ns:template}} 名前空間へのリンクを取得する。",
        "apihelp-query+linkshere-param-prop": "取得するプロパティ:",
+       "apihelp-query+linkshere-paramvalue-prop-pageid": "各ページのページID。",
+       "apihelp-query+linkshere-paramvalue-prop-title": "各ページのページ名。",
        "apihelp-query+linkshere-example-simple": "[[Main Page]] にリンクしているページの一覧を取得する。",
        "apihelp-query+linkshere-example-generator": "<kbd>[[Main Page]]<kbd> にリンクしているページの情報を取得する。",
        "apihelp-query+logevents-param-prop": "取得するプロパティ:",
+       "apihelp-query+logevents-paramvalue-prop-ids": "記録イベントのIDを追加します。",
+       "apihelp-query+logevents-paramvalue-prop-title": "記録イベントにページ名を追加します。",
+       "apihelp-query+logevents-paramvalue-prop-type": "記録イベントのタイプを追加します。",
+       "apihelp-query+logevents-paramvalue-prop-comment": "記録イベントのコメントを追加します。",
+       "apihelp-query+logevents-paramvalue-prop-parsedcomment": "記録イベントの構文解析されたコメントを追加します。",
+       "apihelp-query+logevents-paramvalue-prop-details": "記録イベントに関する追加の詳細を一覧表示します。",
+       "apihelp-query+logevents-paramvalue-prop-tags": "記録イベントのタグを一覧表示します。",
+       "apihelp-query+logevents-param-type": "このタイプの記録項目のみに絞り込む。",
        "apihelp-query+logevents-param-start": "列挙の始点となるタイムスタンプ。",
        "apihelp-query+logevents-param-end": "列挙の終点となるタイムスタンプ。",
        "apihelp-query+logevents-param-user": "与えられた利用者による記録項目に絞り込む。",
        "apihelp-query+pageprops-description": "ページコンテンツで定義されている様々なページのプロパティを取得。",
        "apihelp-query+pageprops-example-simple": "ページ <kbd>Main Page</kbd> および <kbd>MeiaWiki</kbd> のプロパティを取得する。",
        "apihelp-query+pageswithprop-description": "与えられたページプロパティが使用されているすべてのページを一覧表示します。",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "ページIDを追加します。",
+       "apihelp-query+pageswithprop-paramvalue-prop-title": "ページ名と名前空間IDを追加します。",
        "apihelp-query+pageswithprop-paramvalue-prop-value": "ページプロパティの値を追加。",
        "apihelp-query+pageswithprop-param-limit": "返すページの最大数。",
        "apihelp-query+pageswithprop-example-simple": "<code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code> を使用している最初の10ページを一覧表示する。",
        "apihelp-query+protectedtitles-param-start": "一覧表示の始点となる保護タイムスタンプ。",
        "apihelp-query+protectedtitles-param-end": "一覧表示の終点となる保護タイムスタンプ。",
        "apihelp-query+protectedtitles-param-prop": "取得するプロパティ:",
+       "apihelp-query+protectedtitles-paramvalue-prop-level": "保護レベルを追加します。",
        "apihelp-query+protectedtitles-example-simple": "保護されているページを一覧表示する。",
        "apihelp-query+protectedtitles-example-generator": "標準名前空間にある保護されたページへのリンクを検索する。",
        "apihelp-query+querypage-param-page": "特別ページの名前です。これは大文字小文字を区別することに注意。",
        "apihelp-query+recentchanges-param-user": "この利用者による変更のみを一覧表示する。",
        "apihelp-query+recentchanges-param-excludeuser": "この利用者による変更を一覧表示しない。",
        "apihelp-query+recentchanges-param-tag": "このタグが付与された版のみ一覧表示する。",
+       "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "構文解析された編集コメントを追加します。",
+       "apihelp-query+recentchanges-paramvalue-prop-flags": "編集のフラグを追加します。",
+       "apihelp-query+recentchanges-paramvalue-prop-timestamp": "編集のタイムスタンプを追加します。",
+       "apihelp-query+recentchanges-paramvalue-prop-title": "編集のページ名を追加します。",
+       "apihelp-query+recentchanges-paramvalue-prop-ids": "ページID、最近の変更IDと新旧の版IDを追加します。",
+       "apihelp-query+recentchanges-paramvalue-prop-sizes": "バイト単位の新旧のページの長さを追加します。",
+       "apihelp-query+recentchanges-paramvalue-prop-redirect": "編集されたページが転送ページである場合、印を付けます。",
+       "apihelp-query+recentchanges-paramvalue-prop-patrolled": "巡回可能な編集について、巡回済みかどうか印を付けます。",
+       "apihelp-query+recentchanges-paramvalue-prop-loginfo": "記録項目に記録の情報 (記録ID,  記録タイプなど) を追加します。",
+       "apihelp-query+recentchanges-param-token": "代わりに <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> を使用してください。",
        "apihelp-query+recentchanges-param-limit": "返す変更の総数。",
        "apihelp-query+recentchanges-param-toponly": "最新の版である変更のみを一覧表示する。",
        "apihelp-query+recentchanges-param-generaterevisions": "ジェネレータとして使用される場合、版IDではなくページ名を生成します。関連する版IDのない最近の変更の項目 (例えば、ほとんどの記録項目) は何も生成しません。",
        "apihelp-query+recentchanges-example-simple": "最近の更新を一覧表示する。",
        "apihelp-query+redirects-description": "ページへのすべての転送を返します。",
        "apihelp-query+redirects-param-prop": "取得するプロパティ:",
+       "apihelp-query+redirects-paramvalue-prop-pageid": "各リダイレクトのページID。",
+       "apihelp-query+redirects-paramvalue-prop-title": "各リダイレクトのページ名。",
        "apihelp-query+redirects-param-limit": "返す転送の数。",
        "apihelp-query+redirects-example-simple": "[[Main Page]] への転送の一覧を取得する。",
        "apihelp-query+redirects-example-generator": "[[Main Page]] へのすべての転送ページに関する情報を取得する。",
        "apihelp-query+revisions-example-first5-after": "<kbd>Main Page</kbd> の 2006-05-01 以降の最初の5版を取得する。",
        "apihelp-query+revisions-example-first5-not-localhost": "<kbd>Main Page</kbd> の匿名利用者 <kbd>127.0.0.1</kbd> 以外による最初の5版を取得する。",
        "apihelp-query+revisions-example-first5-user": "<kbd>Main Page</kbd> の <kbd>MediaWiki default</kbd> による最初の5版を取得する。",
+       "apihelp-query+revisions+base-paramvalue-prop-ids": "版のID。",
+       "apihelp-query+revisions+base-paramvalue-prop-timestamp": "版のタイムスタンプ。",
+       "apihelp-query+revisions+base-paramvalue-prop-user": "その版を作成した利用者。",
+       "apihelp-query+revisions+base-paramvalue-prop-userid": "その版の作成者の利用者ID。",
+       "apihelp-query+revisions+base-paramvalue-prop-size": "その版の長さ (バイト) 。",
+       "apihelp-query+revisions+base-paramvalue-prop-comment": "その版の利用者によるコメント。",
+       "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "その版の利用者による、構文解析されたコメント。",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "その版のテキスト。",
+       "apihelp-query+revisions+base-paramvalue-prop-tags": "その版のタグ。",
        "apihelp-query+search-description": "全文検索を行います。",
        "apihelp-query+search-param-search": "この値を含むページ名または本文を検索します。Wikiの検索バックエンド実装に応じて、あなたは特別な検索機能を呼び出すための文字列を検索することができます。",
        "apihelp-query+search-param-namespace": "この名前空間内のみを検索します。",
        "apihelp-query+search-param-what": "実行する検索の種類です。",
        "apihelp-query+search-param-prop": "返すプロパティ:",
+       "apihelp-query+search-paramvalue-prop-size": "バイト単位のページのサイズを追加します。",
+       "apihelp-query+search-paramvalue-prop-wordcount": "ページのワード数を追加します。",
+       "apihelp-query+search-paramvalue-prop-timestamp": "ページが最後に編集されたときのタイムスタンプを追加します。",
+       "apihelp-query+search-paramvalue-prop-sectiontitle": "合致するタイトルを追加します。",
        "apihelp-query+search-param-limit": "返すページの総数です。",
        "apihelp-query+search-example-simple": "<kbd>meaning</kbd> を検索する。",
        "apihelp-query+search-example-generator": "<kbd>meaning</kbd> の検索で返されたページのページ情報を取得する。",
+       "apihelp-query+siteinfo-param-prop": "どの情報を取得するか:",
+       "apihelp-query+siteinfo-paramvalue-prop-general": "システム全体の情報。",
+       "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "特別ページの別名の一覧。",
+       "apihelp-query+siteinfo-paramvalue-prop-magicwords": "マジックワードとこれらの別名の一覧。",
        "apihelp-query+siteinfo-example-simple": "サイト情報を取得する。",
        "apihelp-query+tags-description": "変更タグを一覧表示します。",
        "apihelp-query+tags-param-limit": "一覧表示するタグの最大数。",
        "apihelp-query+tags-param-prop": "取得するプロパティ:",
+       "apihelp-query+tags-paramvalue-prop-name": "タグの名前を追加。",
+       "apihelp-query+tags-paramvalue-prop-displayname": "タグのためのシステムメッセージを追加します。",
+       "apihelp-query+tags-paramvalue-prop-description": "タグの説明を追加します。",
+       "apihelp-query+tags-paramvalue-prop-hitcount": "版の記録項目の数と、このタグを持っている記録項目の数を、追加します。",
        "apihelp-query+tags-example-simple": "利用可能なタグを一覧表示する。",
        "apihelp-query+templates-description": "与えられたページでトランスクルードされているすべてのページを返します。",
        "apihelp-query+templates-param-namespace": "この名前空間のテンプレートのみ表示する。",
        "apihelp-query+tokens-example-types": "ウォッチトークンおよび巡回トークンを取得する。",
        "apihelp-query+transcludedin-description": "与えられたページをトランスクルードしているすべてのページを検索します。",
        "apihelp-query+transcludedin-param-prop": "取得するプロパティ:",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "各ページのページID。",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "各ページのページ名。",
        "apihelp-query+transcludedin-example-simple": "<kbd>Main Page</kbd> をトランスクルードしているページの一覧を取得する。",
        "apihelp-query+transcludedin-example-generator": "<kbd>Main Page</kbd> をトランスクルードしているページに関する情報を取得する。",
        "apihelp-query+usercontribs-description": "利用者によるすべての編集を取得します。",
        "apihelp-query+usercontribs-param-user": "投稿記録を取得する利用者。",
        "apihelp-query+usercontribs-param-userprefix": "この値で始まる名前のすべての利用者の投稿記録を取得します。$1user をオーバーライドします。",
        "apihelp-query+usercontribs-param-namespace": "この名前空間への投稿記録のみを一覧表示する。",
+       "apihelp-query+usercontribs-paramvalue-prop-ids": "ページIDと版IDを追加します。",
+       "apihelp-query+usercontribs-paramvalue-prop-title": "ページ名と名前空間IDを追加します。",
+       "apihelp-query+usercontribs-paramvalue-prop-timestamp": "編集のタイムスタンプを追加します。",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "編集のコメントを追加します。",
+       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "構文解析された編集コメントを追加します。",
+       "apihelp-query+usercontribs-paramvalue-prop-size": "編集の新しいサイズを追加します。",
        "apihelp-query+usercontribs-param-tag": "このタグが付与された版のみを一覧表示する。",
        "apihelp-query+usercontribs-param-toponly": "最新の版である変更のみを一覧表示する。",
        "apihelp-query+usercontribs-example-user": "利用者 <kbd>Example</kbd> の投稿記録を表示する。",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "利用者の本名を追加します。",
+       "apihelp-query+userinfo-example-simple": "現在の利用者に関する情報を取得します。",
+       "apihelp-query+userinfo-example-data": "現在の利用者に関する追加情報を取得します。",
+       "apihelp-query+users-description": "利用者のリストについての情報を取得します。",
+       "apihelp-query+users-param-prop": "どの情報を結果に含めるか:",
        "apihelp-query+users-param-token": "代わりに <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> を使用してください。",
        "apihelp-query+users-example-simple": "利用者 <kbd>Example</kbd> の情報を返す。",
        "apihelp-query+watchlist-description": "現在の利用者のウォッチリストにあるページへの最近の更新を取得します。",
        "apihelp-query+watchlist-param-user": "この利用者による変更のみを一覧表示する。",
        "apihelp-query+watchlist-param-excludeuser": "この利用者による変更を一覧表示しない。",
        "apihelp-query+watchlist-param-prop": "追加で取得するプロパティ:",
+       "apihelp-query+watchlist-paramvalue-prop-ids": "版IDとページIDを追加します。",
+       "apihelp-query+watchlist-paramvalue-prop-title": "ページ名を追加します。",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "編集のコメントを追加します。",
+       "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "編集の構文解析されたコメントを追加します。",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "編集のタイムスタンプを追加します。",
+       "apihelp-query+watchlist-paramvalue-prop-loginfo": "適切な場合にログ情報を追加します。",
+       "apihelp-query+watchlist-example-simple": "現在の利用者のウォッチリストにある最近変更されたページの最新版を一覧表示します。",
        "apihelp-query+watchlist-example-generator": "現在の利用者のウォッチリスト上の最近更新されたページに関する情報を取得する。",
        "apihelp-query+watchlistraw-description": "現在の利用者のウォッチリストにあるすべてのページを取得します。",
        "apihelp-query+watchlistraw-param-namespace": "この名前空間に含まれるページのみを一覧表示します。",
        "apihelp-revisiondelete-example-revision": "<kbd>Main Page</kbd> の版 <kbd>12345</kbd> の本文を隠す。",
        "apihelp-rollback-param-title": "巻き戻すページ名です。<var>$1pageid</var> とは同時に使用できません。",
        "apihelp-rollback-param-pageid": "巻き戻すページのページIDです。<var>$1title</var> とは同時に使用できません。",
+       "apihelp-rollback-param-user": "巻き戻し対象の編集を行った利用者名。",
+       "apihelp-rollback-param-markbot": "巻き戻された編集と巻き戻しをボットの編集としてマークする。",
        "apihelp-rollback-example-simple": "利用者 <kbd>Example</kbd> による <kbd>Main Page</kbd> への最後の一連の編集を巻き戻す。",
+       "apihelp-rollback-example-summary": "IP利用者 <kbd>192.0.2.5</kbd> による <kbd>Main Page</kbd> への最後の一連の編集を <kbd>Reverting vandalism</kbd> という理由で、それらの編集とその差し戻しをボットの編集としてマークして差し戻す。",
+       "apihelp-stashedit-param-title": "編集されているページのページ名。",
        "apihelp-tag-param-reason": "変更の理由。",
        "apihelp-tag-example-log": "<kbd>Wrongly applied</kbd> という理由で <kbd>spam</kbd> タグを 記録項目ID 123 から取り除く",
        "apihelp-tokens-param-type": "リクエストするトークンの種類。",
        "apihelp-json-description": "データを JSON 形式で出力します。",
        "apihelp-json-param-callback": "指定すると、指定した関数呼び出しで出力をラップします。安全のため、利用者固有のデータはすべて制限されます。",
        "apihelp-json-param-utf8": "指定すると、大部分の非 ASCII 文字 (すべてではありません) を、16 進のエスケープ シーケンスに置換する代わりに UTF-8 として符号化します。<var>formatversion</var> が <kbd>1</kbd> でない場合は既定です。",
+       "apihelp-json-param-ascii": "指定すると、すべての非ASCII文字を16進エスケープにエンコードします。<var>formatversion</var> が <kbd>1</kbd> の場合既定です。",
        "apihelp-jsonfm-description": "データを JSON 形式 (HTML に埋め込んだ形式) で出力します。",
        "apihelp-none-description": "何も出力しません。",
        "apihelp-php-description": "データを PHP のシリアル化した形式で出力します。",
        "apihelp-yamlfm-description": "データを YAML 形式 (HTML に埋め込んだ形式) で出力します。",
        "api-format-title": "MediaWiki API の結果",
        "api-format-prettyprint-header": "このページは $1 形式を HTML で表現したものです。HTML はデバッグに役立ちますが、アプリケーションでの使用には適していません。\n\n<var>format</var> パラメーターを指定すると出力形式を変更できます 。$1 形式の非 HTML 版を閲覧するには、format=$2 を設定してください。\n\n詳細情報については [[mw:API|完全な説明文書]]または [[Special:ApiHelp/main|API のヘルプ]]を参照してください。",
+       "api-pageset-param-titles": "対象のページ名のリスト。",
+       "api-pageset-param-pageids": "対象のページIDのリスト。",
+       "api-pageset-param-revids": "対象の版IDのリスト。",
+       "api-pageset-param-generator": "クエリモジュールを実行することにより対象のページの一覧を取得する。\n\n<strong>注意</strong> Generator パラメーターの名前は \"g\" で始まります。例を参照してください。",
+       "api-pageset-param-redirects-generator": "<var>$1titles</var>, <var>$1pageids</var>, および <var>$1revids</var>, および <var>$1generator</var> によって返されたページの転送を自動的に解決する。",
        "api-help-title": "MediaWiki API ヘルプ",
        "api-help-lead": "このページは自動生成された MediaWiki API の説明文書ページです。\n\n説明文書と例: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "メイン モジュール",
index 6ae334b..c8f8ac4 100644 (file)
@@ -14,7 +14,7 @@
        "apihelp-main-param-requestid": "Jehde Aanjahb vun heh weed widder med ußjejovve. Esuh kam_mer einzel Affrohre ussenein hallde.",
        "apihelp-main-param-servedby": "Donn däm ẞööver, dä et jedonn hät, singe Nahme med ußjävve.",
        "apihelp-main-param-curtimestamp": "Donn de aktoälle Zigg un et Dattum med ußjävve.",
-       "apihelp-main-param-uselang": "De schprohch för et Övversäzze vun Täxte un Nohreeschte. En Leß met de Köözelle kam_mer vun dä Sigg <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> holle, met <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">siprop=languages</kbd>, udder jiff <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">user</kbd> aan, öm dem aktoälle Metmaacher sing eetzde Schprohch ze krijje, udder nemm <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">content</kbd> öm heh dämm Wikki singe Ennhald sing Schprohch ze krijje.",
+       "apihelp-main-param-uselang": "De Schprohch för et Övversäzze vun Täxte un Nohreeschte. <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> holle, met <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">siprop=languages</kbd> jidd en Leß met de Köözelle för Schprohche uß, udder jiff <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">user</kbd> aan, öm dem aktoälle Metmaacher sing eetzde Schprohch ze krijje, udder nemm <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">content</kbd> öm heh dämm Wikki singe Ennhald sing Schprohch ze krijje.",
        "apihelp-block-description": "Ene Metmaacher schpärre.",
        "apihelp-block-param-user": "Däm Nahme vun däm Metmaacher, de <i lang=\"en\" xml:lang=\"en\" title=\"Internet Protocol\">IP</i>-Addräß udder dä Berätt, dä De Schpärre wells.",
        "apihelp-block-param-expiry": "De Zigg bes zom Ußloufe. Kam_mer als en Door aanjävve, esu wi „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">5 months</kbd>“ udder „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">2 weeks</kbd>“ un kam_mer als ene Zigg_Pongk aanjävve, esu wi „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">2014-09-18T12:34:56Z</kbd>“, un wam_mer „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">infinite</kbd>“, „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">indefinite</kbd>“ udder „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">never</kbd>“ aanjitt, dohrt di Schpärr för iiwesch.",
index 74db742..1b62c5c 100644 (file)
@@ -8,5 +8,10 @@
        "apihelp-main-param-action": "कोणती कार्यवाही करावयाची.",
        "apihelp-main-param-curtimestamp": "निकालात सद्य वेळठश्याचा अंतर्भाव करा.",
        "apihelp-block-description": "सदस्यास प्रतिबंधित करा.",
-       "apihelp-block-param-user": "सदस्याचे नाव, अंक-पत्त्ता, किंवा प्रतिबंध करण्यासाठीचा आयपीचा आवाका."
+       "apihelp-block-param-user": "सदस्याचे नाव, अंक-पत्त्ता, किंवा प्रतिबंध करण्यासाठीचा आयपीचा आवाका.",
+       "apihelp-query+allrevisions-description": "सर्व आवृत्त्यांची यादी",
+       "apihelp-query+allrevisions-param-user": "फक्त या सदस्याच्याच आवृत्त्यांची यादी करा",
+       "apihelp-query+allrevisions-param-excludeuser": "या सदस्याच्या आवृत्त्यांची यादी करु नका.",
+       "apihelp-stashedit-param-title": "पानाच्या मथळ्याचे संपादन होत आहे.",
+       "apihelp-stashedit-param-sectiontitle": "नविन विभागाचा मथळा"
 }
index db801b8..3f4aa61 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Milicevic01",
-                       "Aktron"
+                       "Aktron",
+                       "Сербијана"
                ]
        },
        "apihelp-block-description": "Блокирај корисника.",
@@ -20,5 +21,7 @@
        "apihelp-login-param-name": "Корисничко име.",
        "apihelp-login-param-password": "Лозинка.",
        "apihelp-login-example-login": "Пријавa.",
-       "apihelp-move-description": "Премештање странице."
+       "apihelp-move-description": "Премештање странице.",
+       "apihelp-query+allrevisions-param-namespace": "Само списак страница у овом именском простору.",
+       "apihelp-stashedit-param-text": "Страница са садржајем."
 }
index a12a1d8..9e73ebe 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  * @author Kai Nissen
  * @author Adam Shorland
- * @since 1.26
+ * @since 1.27
  */
 
 use Wikimedia\Assert\Assert;
index 2ccc24b..3599f50 100644 (file)
@@ -460,7 +460,9 @@ class RecentChange {
                // Automatic patrol needs "autopatrol", ordinary patrol needs "patrol"
                $right = $auto ? 'autopatrol' : 'patrol';
                $errors = array_merge( $errors, $this->getTitle()->getUserPermissionsErrors( $right, $user ) );
-               if ( !Hooks::run( 'MarkPatrolled', array( $this->getAttribute( 'rc_id' ), &$user, false ) ) ) {
+               if ( !Hooks::run( 'MarkPatrolled',
+                                       array( $this->getAttribute( 'rc_id' ), &$user, false, $auto ) )
+               ) {
                        $errors[] = array( 'hookaborted' );
                }
                // Users without the 'autopatrol' right can't patrol their
@@ -481,7 +483,10 @@ class RecentChange {
                $this->reallyMarkPatrolled();
                // Log this patrol event
                PatrolLog::record( $this, $auto, $user );
-               Hooks::run( 'MarkPatrolledComplete', array( $this->getAttribute( 'rc_id' ), &$user, false ) );
+               Hooks::run(
+                                       'MarkPatrolledComplete',
+                                       array( $this->getAttribute( 'rc_id' ), &$user, false, $auto )
+               );
 
                return array();
        }
@@ -760,7 +765,7 @@ class RecentChange {
         * Constructs a RecentChange object for the given categorization
         * This does not call save() on the object and thus does not write to the db
         *
-        * @since 1.26
+        * @since 1.27
         *
         * @param string $timestamp Timestamp of the recent change to occur
         * @param Title $categoryTitle Title of the category a page is being added to or removed from
@@ -950,3 +955,4 @@ class RecentChange {
                return $unserializedParams;
        }
 }
+
index 55fc104..5c70c99 100644 (file)
@@ -1101,7 +1101,8 @@ class ChangeTags {
                        },
                        array(
                                'checkKeys' => array( wfMemcKey( 'active-tags' ) ),
-                               'lockTSE' => INF
+                               'lockTSE' => INF,
+                               'pcTTL' => 30
                        )
                );
        }
@@ -1146,7 +1147,8 @@ class ChangeTags {
                        },
                        array(
                                'checkKeys' => array( wfMemcKey( 'valid-tags-db' ) ),
-                               'lockTSE' => INF
+                               'lockTSE' => INF,
+                               'pcTTL' => 30
                        )
                );
        }
@@ -1173,7 +1175,8 @@ class ChangeTags {
                        },
                        array(
                                'checkKeys' => array( wfMemcKey( 'valid-tags-hook' ) ),
-                               'lockTSE' => INF
+                               'lockTSE' => INF,
+                               'pcTTL' => 30
                        )
                );
        }
@@ -1214,15 +1217,8 @@ class ChangeTags {
         * @return array Array of string => int
         */
        public static function tagUsageStatistics() {
-               static $cachedStats = null;
-
-               // Process cache to avoid I/O and repeated regens during holdoff
-               if ( $cachedStats !== null ) {
-                       return $cachedStats;
-               }
-
                $fname = __METHOD__;
-               $cachedStats = ObjectCache::getMainWANInstance()->getWithSetCallback(
+               return ObjectCache::getMainWANInstance()->getWithSetCallback(
                        wfMemcKey( 'change-tag-statistics' ),
                        300,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
@@ -1247,11 +1243,10 @@ class ChangeTags {
                        },
                        array(
                                'checkKeys' => array( wfMemcKey( 'change-tag-statistics' ) ),
-                               'lockTSE' => INF
+                               'lockTSE' => INF,
+                               'pcTTL' => 30
                        )
                );
-
-               return $cachedStats;
        }
 
        /**
index 76f2a7b..acaa288 100644 (file)
 class MWContentSerializationException extends MWException {
 }
 
+/**
+ * Exception thrown when an unregistered content model is requested. This error
+ * can be triggered by user input, so a separate exception class is provided so
+ * callers can substitute a context-specific, internationalised error message.
+ *
+ * @ingroup Content
+ * @since 1.27
+ */
+class MWUnknownContentModelException extends MWException {
+       /** @var string The name of the unknown content model */
+       private $modelId;
+
+       /** @param string $modelId */
+       function __construct( $modelId ) {
+               parent::__construct( "The content model '$modelId' is not registered on this wiki.\n" .
+                       'See https://www.mediawiki.org/wiki/Content_handlers to find out which extensions ' .
+                       'handle this content model.' );
+               $this->modelId = $modelId;
+       }
+
+       /** @return string */
+       public function getModelId() {
+               return $modelId;
+       }
+}
+
 /**
  * A content handler knows how do deal with a specific type of content on a wiki
  * page. Content is stored in the database in a serialized form (using a
@@ -307,7 +333,8 @@ abstract class ContentHandler {
         * @param string $modelId The ID of the content model for which to get a
         *    handler. Use CONTENT_MODEL_XXX constants.
         *
-        * @throws MWException If no handler is known for the model ID.
+        * @throws MWException For internal errors and problems in the configuration.
+        * @throws MWUnknownContentModelException If no handler is known for the model ID.
         * @return ContentHandler The ContentHandler singleton for handling the model given by the ID.
         */
        public static function getForModelID( $modelId ) {
@@ -323,7 +350,7 @@ abstract class ContentHandler {
                        Hooks::run( 'ContentHandlerForModelID', array( $modelId, &$handler ) );
 
                        if ( $handler === null ) {
-                               throw new MWException( "No handler for model '$modelId' registered in \$wgContentHandlers" );
+                               throw new MWUnknownContentModelException( $modelId );
                        }
 
                        if ( !( $handler instanceof ContentHandler ) ) {
index c9d7b35..64ae1c6 100644 (file)
@@ -395,6 +395,9 @@ class DatabasePostgres extends Database {
                if ( function_exists( 'mb_convert_encoding' ) ) {
                        $sql = mb_convert_encoding( $sql, 'UTF-8' );
                }
+               // Clear previously left over PQresult
+               while ( $res = pg_get_result( $this->mConn ) )
+                       pg_free_result( $res );
                if ( pg_send_query( $this->mConn, $sql ) === false ) {
                        throw new DBUnexpectedError( $this, "Unable to post new query to PostgreSQL\n" );
                }
index d8becf5..41066e0 100644 (file)
@@ -28,9 +28,6 @@
  * LBFactory::enableBackend() to return to normal behavior
  */
 class LBFactoryFake extends LBFactory {
-       public function __construct( array $conf ) {
-       }
-
        public function newMainLB( $wiki = false ) {
                throw new DBAccessError;
        }
index a41dadf..32bce6c 100644 (file)
@@ -33,6 +33,8 @@ class LBFactorySingle extends LBFactory {
         *  - connection: The DatabaseBase connection object
         */
        public function __construct( array $conf ) {
+               parent::__construct( $conf );
+
                $this->lb = new LoadBalancerSingle( $conf );
        }
 
index 438e4fc..d5cd017 100644 (file)
@@ -56,7 +56,7 @@ interface LoadMonitor {
 
        /**
         * Clear any process and persistent cache of lag times
-        * @since 1.26
+        * @since 1.27
         */
        public function clearCaches();
 }
index 4a61b2a..cb57140 100644 (file)
@@ -127,7 +127,7 @@ abstract class DataUpdate implements DeferrableUpdate {
         *
         * @param DataUpdate[] $updates A list of DataUpdate instances
         * @return DataUpdate[]
-        * @since 1.26
+        * @since 1.27
         */
        protected static function enqueueUpdates( array $updates ) {
                $remaining = array();
@@ -151,7 +151,7 @@ abstract class DataUpdate implements DeferrableUpdate {
  * Such updates must be representable using IJobSpecification, so that
  * they can be serialized into jobs and enqueued for later execution
  *
- * @since 1.26
+ * @since 1.27
  */
 interface EnqueueableDataUpdate {
        /**
index 53312cd..8f8ed2e 100644 (file)
@@ -149,7 +149,7 @@ class DeferredUpdates {
        /**
         * @note This method is intended for testing purposes
         * @param bool $value Whether to *always* defer updates, even in CLI mode
-        * @since 1.26
+        * @since 1.27
         */
        public static function forceDeferral( $value ) {
                self::$forceDeferral = $value;
index 09b5929..5a2dd1a 100644 (file)
@@ -153,8 +153,9 @@ class LocalSettingsGenerator {
 
                if ( count( $this->extensions ) ) {
                        $localSettings .= "
-# Enabled Extensions. Most extensions are enabled by including the base extension file here
-# but check specific extension documentation for more details
+# Enabled extensions. Most of the extensions are enabled by adding
+# wfLoadExtensions('ExtensionName');
+# to LocalSettings.php. Check specific extension documentation for more details.
 # The following extensions were automatically enabled:\n";
 
                        foreach ( $this->extensions as $extName ) {
index c2243b9..67a4def 100644 (file)
@@ -343,6 +343,7 @@ class WebInstaller extends Installer {
                $this->phpErrors = array();
                set_error_handler( array( $this, 'errorHandler' ) );
                try {
+                       session_name( 'mw_installer_session' );
                        session_start();
                } catch ( Exception $e ) {
                        restore_error_handler();
index a1f9154..369f4ed 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Vahe Gharakhanyan"
+                       "Vahe Gharakhanyan",
+                       "Kareyac"
                ]
        },
        "config-title": "ՄեդիաՎիքի $1-ի տեղադրում",
        "config-page-releasenotes": "Տեղեկություն տարբերակի մասին",
        "config-page-existingwiki": "Գոյություն ունեցող վիքի",
        "config-restart": "Այո, նորից սկսել",
+       "config-ns-generic": "Նախագիծ",
        "config-admin-password": "Գաղտնաբառ՝",
        "config-admin-password-confirm": "Գաղտնաբառը կրկին`",
        "config-admin-email": "Էլ-փոստի հասցեն՝",
+       "config-profile-wiki": "Բաց վիքի",
+       "config-profile-private": "Մասնավոր վիքի",
        "config-license": "Հեղինակային իրավունք և արտոնագիր`",
        "config-license-cc-by-sa": "Creative Commons Attribution-ShareAlike",
        "config-license-cc-by": "Creative Commons Attribution",
@@ -32,6 +36,7 @@
        "config-license-cc-0": "Creative Commons Zero (հանրային սեփականություն)",
        "config-license-gfdl": "GNU Free Documentation License 1.3 կամ ավելի ուշ",
        "config-license-pd": "Հանրային սեփականություն",
+       "config-cc-again": "Ընտրեեք նորից...",
        "config-help": "օգնություն",
        "mainpagetext": "'''«MediaWiki» ծրագիրը հաջողությամբ տեղադրվեց։'''",
        "mainpagedocfooter": "Այցելեք [//meta.wikimedia.org/wiki/Help:Contents User's Guide]՝ վիքի ծրագրային ապահովման օգտագործման մասին տեղեկությունների համար։\n\n== Որոշ օգտակար ռեսուրսներ ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
index b24109b..9767d9f 100644 (file)
@@ -27,7 +27,7 @@
  * Only DataUpdate classes should construct these jobs
  *
  * @ingroup JobQueue
- * @since 1.26
+ * @since 1.27
  */
 class DeleteLinksJob extends Job {
        function __construct( Title $title, array $params ) {
index 49d05d4..216d9b7 100644 (file)
@@ -119,7 +119,6 @@ class IEUrlExtension {
 
                if ( !preg_match( '/^[a-zA-Z0-9_-]+$/', $extension ) ) {
                        // Non-alphanumeric extension, unlikely to be registered.
-                       //
                        // The regex above is known to match all registered file extensions
                        // in a default Windows XP installation. It's important to allow
                        // extensions with ampersands and percent signs, since that reduces
index 6c69b14..71c8a93 100644 (file)
  * This class is intended for caching data from primary stores.
  * If the get() method does not return a value, then the caller
  * should query the new value and backfill the cache using set().
+ * When querying the store on cache miss, the closest DB replica
+ * should be used. Try to avoid heavyweight DB master or quorum reads.
  * When the source data changes, a purge method should be called.
  * Since purges are expensive, they should be avoided. One can do so if:
  *   - a) The object cached is immutable; or
  *   - b) Validity is checked against the source after get(); or
  *   - c) Using a modest TTL is reasonably correct and performant
+ *
  * The simplest purge method is delete().
  *
  * Instances of this class must be configured to point to a valid
 class WANObjectCache {
        /** @var BagOStuff The local datacenter cache */
        protected $cache;
+       /** @var HashBagOStuff Script instance PHP cache */
+       protected $procCache;
        /** @var string Cache pool name */
        protected $pool;
-       /** @var EventRelayer */
+       /** @var EventRelayer Bus that handles purge broadcasts */
        protected $relayer;
 
-       /** @var int */
+       /** @var int ERR_* constant for the "last error" registry */
        protected $lastRelayError = self::ERR_NONE;
 
        /** Max time expected to pass between delete() and DB commit finishing */
@@ -86,7 +91,7 @@ class WANObjectCache {
        /** Default time-since-expiry on a miss that makes a key "hot" */
        const LOCK_TSE = 1;
 
-       /** Idiom for set()/getWithSetCallback() TTL */
+       /** Idiom for set()/getWithSetCallback() TTL being "forever" */
        const TTL_NONE = 0;
        /** Idiom for getWithSetCallback() callbacks to avoid calling set() */
        const TTL_UNCACHEABLE = -1;
@@ -98,13 +103,11 @@ class WANObjectCache {
        /** Cache format version number */
        const VERSION = 1;
 
-       /** Fields of value holder arrays */
        const FLD_VERSION = 0;
        const FLD_VALUE = 1;
        const FLD_TTL = 2;
        const FLD_TIME = 3;
 
-       /** Possible values for getLastError() */
        const ERR_NONE = 0; // no error
        const ERR_NO_RESPONSE = 1; // no response
        const ERR_UNREACHABLE = 2; // can't connect
@@ -127,10 +130,13 @@ class WANObjectCache {
                $this->cache = $params['cache'];
                $this->pool = $params['pool'];
                $this->relayer = $params['relayer'];
+               $this->procCache = new HashBagOStuff();
        }
 
        /**
-        * @return WANObjectCache Cache that wraps EmptyBagOStuff
+        * Get an instance that wraps EmptyBagOStuff
+        *
+        * @return WANObjectCache
         */
        public static function newEmpty() {
                return new self( array(
@@ -171,7 +177,7 @@ class WANObjectCache {
         * However, pre-snapshot values might still be seen if an update was made
         * in a remote datacenter but the purge from delete() didn't relay yet.
         *
-        * Consider using getWithSetCallback() instead of get()/set() cycles.
+        * Consider using getWithSetCallback() instead of get() and set() cycles.
         * That method has cache slam avoiding features for hot/expensive keys.
         *
         * @param string $key Cache key
@@ -194,7 +200,7 @@ class WANObjectCache {
         *
         * @param array $keys List of cache keys
         * @param array $curTTLs Map of (key => approximate TTL left) for existing keys [returned]
-        * @param array $checkKeys List of "check" keys
+        * @param array $checkKeys List of "check" keys to apply to all of $keys
         * @return array Map of (key => value) for keys that exist
         */
        final public function getMulti(
@@ -255,7 +261,7 @@ class WANObjectCache {
        }
 
        /**
-        * Set the value of a key from cache
+        * Set the value of a key in cache
         *
         * Simply calling this method when source data changes is not valid because
         * the changes do not replicate to the other WAN sites. In that case, delete()
@@ -269,7 +275,7 @@ class WANObjectCache {
         *   - d) T1 reads the row and calls set() due to a cache miss
         *   - e) Stale value is stuck in cache
         *
-        * Setting 'lag' helps avoids keys getting stuck in long-term stale states.
+        * Setting 'lag' and 'since' help avoids keys getting stuck in stale states.
         *
         * Example usage:
         * @code
@@ -288,16 +294,16 @@ class WANObjectCache {
         *   - lag     : Seconds of slave lag. Typically, this is either the slave lag
         *               before the data was read or, if applicable, the slave lag before
         *               the snapshot-isolated transaction the data was read from started.
-        *               [Default: 0 seconds]
+        *               Default: 0 seconds
         *   - since   : UNIX timestamp of the data in $value. Typically, this is either
         *               the current time the data was read or (if applicable) the time when
         *               the snapshot-isolated transaction the data was read from started.
-        *               [Default: 0 seconds]
+        *               Default: 0 seconds
         *   - lockTSE : if excessive possible snapshot lag is detected,
         *               then stash the value into a temporary location
         *               with this TTL. This is only useful if the reads
         *               use getWithSetCallback() with "lockTSE" set.
-        *               [Default: WANObjectCache::TSE_NONE]
+        *               Default: WANObjectCache::TSE_NONE
         * @return bool Success
         */
        final public function set( $key, $value, $ttl = 0, array $opts = array() ) {
@@ -344,10 +350,12 @@ class WANObjectCache {
         * This is implemented by storing a special "tombstone" value at the cache
         * key that this class recognizes; get() calls will return false for the key
         * and any set() calls will refuse to replace tombstone values at the key.
-        * For this to always avoid writing stale values, the following must hold:
+        * For this to always avoid stale value writes, the following must hold:
         *   - a) Replication lag is bounded to being less than HOLDOFF_TTL; or
         *   - b) If lag is higher, the DB will have gone into read-only mode already
         *
+        * Note that set() can also be lag-aware and lower the TTL if it's high.
+        *
         * When using potentially long-running ACID transactions, a good pattern is
         * to use a pre-commit hook to issue the delete. This means that immediately
         * after commit, callers will see the tombstone in cache in the local datacenter
@@ -406,7 +414,7 @@ class WANObjectCache {
         * if the key was evicted from cache, such calculations may show the
         * time since expiry as ~0 seconds.
         *
-        * Note that "check" keys won't collide with other regular keys
+        * Note that "check" keys won't collide with other regular keys.
         *
         * @param string $key
         * @return float UNIX timestamp of the key
@@ -434,20 +442,23 @@ class WANObjectCache {
         * keys, the relevant "check" keys must be supplied for this to work.
         *
         * The "check" key essentially represents a last-modified field.
-        * It is set in the future a few seconds when this is called, to
-        * avoid race conditions where dependent keys get updated with a
-        * stale value (e.g. from a DB slave).
+        * When touched, keys using it via get(), getMulti(), or getWithSetCallback()
+        * will be invalidated. It is treated as being HOLDOFF_TTL seconds in the future
+        * by those methods to avoid race conditions where dependent keys get updated
+        * with stale values (e.g. from a DB slave).
         *
-        * This is typically useful for keys with static names or some cases
+        * This is typically useful for keys with hardcoded names or in some cases
         * dynamically generated names where a low number of combinations exist.
         * When a few important keys get a large number of hits, a high cache
-        * time is usually desired as well as lockTSE logic. The resetCheckKey()
+        * time is usually desired as well as "lockTSE" logic. The resetCheckKey()
         * method is less appropriate in such cases since the "time since expiry"
         * cannot be inferred.
         *
-        * Note that "check" keys won't collide with other regular keys
+        * Note that "check" keys won't collide with other regular keys.
         *
         * @see WANObjectCache::get()
+        * @see WANObjectCache::getWithSetCallback()
+        * @see WANObjectCache::resetCheckKey()
         *
         * @param string $key Cache key
         * @return bool True if the item was purged or not found, false on failure
@@ -464,8 +475,8 @@ class WANObjectCache {
        /**
         * Delete a "check" key from all datacenters, invalidating keys that use it
         *
-        * This is similar to touchCheckKey() in that keys using it via
-        * getWithSetCallback() will be invalidated. The differences are:
+        * This is similar to touchCheckKey() in that keys using it via get(), getMulti(),
+        * or getWithSetCallback() will be invalidated. The differences are:
         *   - a) The timestamp will be deleted from all caches and lazily
         *        re-initialized when accessed (rather than set everywhere)
         *   - b) Thus, dependent keys will be known to be invalid, but not
@@ -479,10 +490,11 @@ class WANObjectCache {
         * This is typically useful for keys with dynamically generated names
         * where a high number of combinations exist.
         *
-        * Note that "check" keys won't collide with other regular keys
+        * Note that "check" keys won't collide with other regular keys.
         *
-        * @see WANObjectCache::touchCheckKey()
         * @see WANObjectCache::get()
+        * @see WANObjectCache::getWithSetCallback()
+        * @see WANObjectCache::touchCheckKey()
         *
         * @param string $key Cache key
         * @return bool True if the item was purged or not found, false on failure
@@ -499,24 +511,21 @@ class WANObjectCache {
         * Method to fetch/regenerate cache keys
         *
         * On cache miss, the key will be set to the callback result via set()
-        * unless the callback returns false. The arguments supplied to it are:
-        *     (current value or false, &$ttl, &$setOpts)
-        * The callback function returns the new value given the current
-        * value (false if not present). Preemptive re-caching and $checkKeys
-        * can result in a non-false current value. The TTL of the new value
-        * can be set dynamically by altering $ttl in the callback (by reference).
-        * The $setOpts array can be altered and is given to set() when called;
-        * it is recommended to set the 'since' field to avoid race conditions.
-        * Setting 'lag' helps avoids keys getting stuck in long-term stale states.
-        *
-        * Usually, callbacks ignore the current value, but it can be used
-        * to maintain "most recent X" values that come from time or sequence
-        * based source data, provided that the "as of" id/time is tracked.
-        *
-        * Usage of $checkKeys is similar to get() and getMulti(). However,
-        * rather than the caller having to inspect a "current time left"
-        * variable (e.g. $curTTL, $curTTLs), a cache regeneration will be
-        * triggered using the callback.
+        * (unless the callback returns false) and that result will be returned.
+        * The arguments supplied to the callback are:
+        *   - $oldValue : current cache value or false if not present
+        *   - &$ttl : a reference to the TTL which can be altered
+        *   - &$setOpts : a reference to options for set() which can be altered
+        *
+        * It is strongly recommended to set the 'lag' and 'since' fields to avoid race conditions
+        * that can cause stale values to get stuck at keys. Usually, callbacks ignore the current
+        * value, but it can be used to maintain "most recent X" values that come from time or
+        * sequence based source data, provided that the "as of" id/time is tracked. Note that
+        * preemptive regeneration and $checkKeys can result in a non-false current value.
+        *
+        * Usage of $checkKeys is similar to get() and getMulti(). However, rather than the caller
+        * having to inspect a "current time left" variable (e.g. $curTTL, $curTTLs), a cache
+        * regeneration will automatically be triggered using the callback.
         *
         * The simplest way to avoid stampedes for hot keys is to use
         * the 'lockTSE' option in $opts. If cache purges are needed, also:
@@ -556,8 +565,8 @@ class WANObjectCache {
         *
         *             return CatConfig::newFromRow( $dbr->selectRow( ... ) );
         *         },
-        *         // Calling touchCheckKey() on this key invalidates the cache
         *         array(
+        *             // Calling touchCheckKey() on this key invalidates the cache
         *             'checkKeys' => array( wfMemcKey( 'site-cat-config' ) ),
         *             // Try to only let one datacenter thread manage cache updates at a time
         *             'lockTSE' => 30
@@ -581,9 +590,9 @@ class WANObjectCache {
         *
         *             return CatState::newFromResults( $dbr->select( ... ) );
         *         },
-        *         // The "check" keys that represent things the value depends on;
-        *         // Calling touchCheckKey() on any of them invalidates the cache
         *         array(
+        *              // The "check" keys that represent things the value depends on;
+        *              // Calling touchCheckKey() on any of them invalidates the cache
         *             'checkKeys' => array(
         *                 wfMemcKey( 'sustenance-bowls', $cat->getRoomId() ),
         *                 wfMemcKey( 'people-present', $cat->getHouseId() ),
@@ -628,7 +637,8 @@ class WANObjectCache {
         *   - WANObjectCache::TTL_UNCACHEABLE: Do not cache at all
         * @param callable $callback Value generation function
         * @param array $opts Options map:
-        *   - checkKeys: List of "check" keys.
+        *   - checkKeys: List of "check" keys. The key at $key will be seen as invalid when either
+        *      touchCheckKey() or resetCheckKey() is called on any of these keys.
         *   - lowTTL: Consider pre-emptive updates when the current TTL (sec) of the key is less than
         *      this. It becomes more likely over time, becoming a certainty once the key is expired.
         *      Default: WANObjectCache::LOW_TTL seconds.
@@ -638,7 +648,15 @@ class WANObjectCache {
         *      expiration is low, the assumption is that the key is hot and that a stampede is worth
         *      avoiding. Setting this above WANObjectCache::HOLDOFF_TTL makes no difference. The
         *      higher this is set, the higher the worst-case staleness can be.
-        *      Use WANObjectCache::TSE_NONE to disable this logic. Default: WANObjectCache::TSE_NONE.
+        *      Use WANObjectCache::TSE_NONE to disable this logic.
+        *      Default: WANObjectCache::TSE_NONE.
+        *   - pcTTL : process cache the value in this PHP instance with this TTL. This avoids
+        *      network I/O when a key is read several times. This will not cache if the callback
+        *      returns false however. Note that any purges will not be seen while process cached;
+        *      since the callback should use slave DBs and they may be lagged or have snapshot
+        *      isolation anyway, this should not typically matter.
+        *      Default: WANObjectCache::TTL_UNCACHEABLE.
+        * @param array $oldOpts Unused (mentioned only to avoid PHPDoc warnings)
         * @return mixed Value to use for the key
         */
        final public function getWithSetCallback(
@@ -658,6 +676,38 @@ class WANObjectCache {
                        $checkKeys = isset( $opts['checkKeys'] ) ? $opts['checkKeys'] : array();
                }
 
+               $pcTTL = isset( $opts['pcTTL'] ) ? $opts['pcTTL'] : self::TTL_UNCACHEABLE;
+
+               // Try the process cache if enabled
+               $value = ( $pcTTL >= 0 ) ? $this->procCache->get( $key ) : false;
+
+               if ( $value === false ) {
+                       // Fetch the value over the network
+                       $value = $this->doGetWithSetCallback( $key, $ttl, $callback, $checkKeys, $opts );
+                       // Update the process cache if enabled
+                       if ( $pcTTL >= 0 && $value !== false ) {
+                               $this->procCache->set( $key, $value, $pcTTL );
+                       }
+               }
+
+               return $value;
+       }
+
+       /**
+        * Do the actual I/O for getWithSetCallback() when needed
+        *
+        * @see WANObjectCache::getWithSetCallback()
+        *
+        * @param string $key
+        * @param integer $ttl
+        * @param callback $callback
+        * @param array $checkKeys
+        * @param array $opts
+        * @return mixed
+        */
+       protected function doGetWithSetCallback(
+               $key, $ttl, $callback, array $checkKeys, array $opts
+       ) {
                $lowTTL = isset( $opts['lowTTL'] ) ? $opts['lowTTL'] : min( self::LOW_TTL, $ttl );
                $lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : self::TSE_NONE;
 
index 1d31088..e2d9946 100644 (file)
@@ -604,12 +604,13 @@ class LogFormatter {
         * value in consideration.
         * @param Title $title The page
         * @param array $parameters Query parameters
+        * @param string|null $html Linktext of the link as raw html
         * @throws MWException
         * @return string
         */
-       protected function makePageLink( Title $title = null, $parameters = array() ) {
+       protected function makePageLink( Title $title = null, $parameters = array(), $html = null ) {
                if ( !$this->plaintext ) {
-                       $link = Linker::link( $title, null, array(), $parameters );
+                       $link = Linker::link( $title, $html, array(), $parameters );
                } else {
                        if ( !$title instanceof Title ) {
                                throw new MWException( "Expected title, got null" );
index 352bda5..79ffe86 100644 (file)
@@ -29,7 +29,7 @@
  * @since 1.21
  */
 class RightsLogFormatter extends LogFormatter {
-       protected function makePageLink( Title $title = null, $parameters = array() ) {
+       protected function makePageLink( Title $title = null, $parameters = array(), $html = null ) {
                global $wgContLang, $wgUserrightsInterwikiDelimiter;
 
                if ( !$this->plaintext ) {
@@ -38,7 +38,7 @@ class RightsLogFormatter extends LogFormatter {
 
                        if ( count( $parts ) === 2 ) {
                                $titleLink = WikiMap::foreignUserLink( $parts[1], $parts[0],
-                                       htmlspecialchars( $title->getPrefixedText() ) );
+                                       htmlspecialchars( $title->getText() ) );
 
                                if ( $titleLink !== false ) {
                                        return $titleLink;
@@ -46,7 +46,7 @@ class RightsLogFormatter extends LogFormatter {
                        }
                }
 
-               return parent::makePageLink( $title, $parameters );
+               return parent::makePageLink( $title, $parameters, $title ? $title->getText() : null );
        }
 
        protected function getMessageKey() {
index 31dd395..044bb53 100644 (file)
@@ -76,7 +76,7 @@ class EmailNotification {
         *  timestamp will not be updated(they have already seen it)
         * @param Title $title The title to update timestamps for
         * @param string $timestamp Set the update timestamp to this value
-        * @return int[]
+        * @return int[] Array of user IDs
         */
        public static function updateWatchlistTimestamp( User $editor, Title $title, $timestamp ) {
                global $wgEnotifWatchlist, $wgShowUpdatedMarker;
index 70e97ff..ea0fb44 100644 (file)
@@ -43,12 +43,12 @@ use MediaWiki\Logger\LoggerFactory;
  * Primary entry points:
  *
  * - ObjectCache::newAccelerator( $fallbackType )
- *   Purpose: Cache.
+ *   Purpose: Cache for very hot keys.
  *   Stored only on the individual web server.
  *   Not associated with other servers.
  *
- * - wfGetMainCache()
- *   Purpose: Cache.
+ * - ObjectCache::getMainClusterInstance()
+ *   Purpose: Memory storage for per-cluster coordination and tracking.
  *   Stored centrally within the local data-center.
  *   Not replicated to other DCs.
  *   Also known as $wgMemc. Configured by $wgMainCacheType.
@@ -71,10 +71,9 @@ use MediaWiki\Logger\LoggerFactory;
  * @ingroup Cache
  */
 class ObjectCache {
-       /** @var Array Map of (id => BagOStuff) */
+       /** @var BagOStuff[] Map of (id => BagOStuff) */
        public static $instances = array();
-
-       /** @var Array Map of (id => WANObjectCache) */
+       /** @var WANObjectCache[] Map of (id => WANObjectCache) */
        public static $wanInstances = array();
 
        /**
@@ -261,6 +260,18 @@ class ObjectCache {
                return new $class( $params );
        }
 
+       /**
+        * Get the main cluster-local cache object.
+        *
+        * @since 1.27
+        * @return BagOStuff
+        */
+       public static function getMainClusterInstance() {
+               $config = RequestContext::getMain()->getConfig();
+               $id = $config->get( 'MainCacheType' );
+               return self::getInstance( $id );
+       }
+
        /**
         * Get the main WAN cache object.
         *
index e1cd76c..7957e65 100644 (file)
@@ -382,13 +382,8 @@ class ImagePage extends Article {
                                        }
                                        $otherSizes = array_unique( $otherSizes );
 
-                                       $msgsmall = '';
                                        $sizeLinkBigImagePreview = $this->makeSizeLink( $params, $width, $height );
-                                       if ( $sizeLinkBigImagePreview ) {
-                                               $msgsmall .= $this->getContext()->msg( 'show-big-image-preview' )->
-                                                       rawParams( $sizeLinkBigImagePreview )->
-                                                       parse();
-                                       }
+                                       $msgsmall = $this->getThumbPrevText( $params, $sizeLinkBigImagePreview );
                                        if ( count( $otherSizes ) ) {
                                                $msgsmall .= ' ' .
                                                Html::rawElement(
@@ -632,6 +627,44 @@ EOT
                $out->setFileVersion( $this->displayImg );
        }
 
+       /**
+        * Make the text under the image to say what size preview
+        *
+        * @param $params Array parameters for thumbnail
+        * @param $sizeLinkBigImagePreview HTML for the current size
+        * @return string HTML output
+        */
+       private function getThumbPrevText( $params, $sizeLinkBigImagePreview ) {
+               if ( $sizeLinkBigImagePreview ) {
+                       // Show a different message of preview is different format from original.
+                       $previewTypeDiffers = false;
+                       $origExt = $thumbExt = $this->displayImg->getExtension();
+                       if ( $this->displayImg->getHandler() ) {
+                               $origMime = $this->displayImg->getMimeType();
+                               $typeParams = $params;
+                               $this->displayImg->getHandler()->normaliseParams( $this->displayImg, $typeParams );
+                               list( $thumbExt, $thumbMime ) = $this->displayImg->getHandler()->getThumbType(
+                                       $origExt, $origMime, $typeParams );
+                               if ( $thumbMime !== $origMime ) {
+                                       $previewTypeDiffers = true;
+                               }
+                       }
+                       if ( $previewTypeDiffers ) {
+                               return $this->getContext()->msg( 'show-big-image-preview-differ' )->
+                                       rawParams( $sizeLinkBigImagePreview )->
+                                       params( strtoupper( $origExt ) )->
+                                       params( strtoupper( $thumbExt ) )->
+                                       parse();
+                       } else {
+                               return $this->getContext()->msg( 'show-big-image-preview' )->
+                                       rawParams( $sizeLinkBigImagePreview )->
+                               parse();
+                       }
+               } else {
+                       return '';
+               }
+       }
+
        /**
         * Creates an thumbnail of specified size and returns an HTML link to it
         * @param array $params Scaler parameters
index 4e359a6..c329689 100644 (file)
@@ -23,8 +23,8 @@
 
 /**
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class Preprocessor_DOM implements Preprocessor {
        // @codingStandardsIgnoreEnd
 
@@ -961,8 +961,8 @@ class PPDPart {
 /**
  * An expansion frame, used as a context to expand the result of preprocessToObj()
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPFrame_DOM implements PPFrame {
        // @codingStandardsIgnoreEnd
 
@@ -1575,8 +1575,8 @@ class PPFrame_DOM implements PPFrame {
 /**
  * Expansion frame with template arguments
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPTemplateFrame_DOM extends PPFrame_DOM {
        // @codingStandardsIgnoreEnd
 
@@ -1742,8 +1742,8 @@ class PPTemplateFrame_DOM extends PPFrame_DOM {
 /**
  * Expansion frame with custom arguments
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPCustomFrame_DOM extends PPFrame_DOM {
        // @codingStandardsIgnoreEnd
 
@@ -1791,8 +1791,8 @@ class PPCustomFrame_DOM extends PPFrame_DOM {
 
 /**
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPNode_DOM implements PPNode {
        // @codingStandardsIgnoreEnd
 
index f536d82..49fa8a1 100644 (file)
@@ -26,8 +26,8 @@
  *   * attribute nodes are children
  *   * "<h>" nodes that aren't at the top are replaced with <possible-h>
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class Preprocessor_Hash implements Preprocessor {
        // @codingStandardsIgnoreEnd
 
@@ -749,8 +749,8 @@ class Preprocessor_Hash implements Preprocessor {
 /**
  * Stack class to help Preprocessor::preprocessToObj()
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPDStack_Hash extends PPDStack {
        // @codingStandardsIgnoreEnd
 
@@ -763,8 +763,8 @@ class PPDStack_Hash extends PPDStack {
 
 /**
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPDStackElement_Hash extends PPDStackElement {
        // @codingStandardsIgnoreENd
 
@@ -804,8 +804,8 @@ class PPDStackElement_Hash extends PPDStackElement {
 
 /**
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPDPart_Hash extends PPDPart {
        // @codingStandardsIgnoreEnd
 
@@ -820,8 +820,8 @@ class PPDPart_Hash extends PPDPart {
 
 /**
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPDAccum_Hash {
        // @codingStandardsIgnoreEnd
 
@@ -891,8 +891,8 @@ class PPDAccum_Hash {
 /**
  * An expansion frame, used as a context to expand the result of preprocessToObj()
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPFrame_Hash implements PPFrame {
        // @codingStandardsIgnoreEnd
 
@@ -1477,8 +1477,8 @@ class PPFrame_Hash implements PPFrame {
 /**
  * Expansion frame with template arguments
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPTemplateFrame_Hash extends PPFrame_Hash {
        // @codingStandardsIgnoreEnd
 
@@ -1660,8 +1660,8 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
 /**
  * Expansion frame with custom arguments
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPCustomFrame_Hash extends PPFrame_Hash {
        // @codingStandardsIgnoreEnd
 
@@ -1713,8 +1713,8 @@ class PPCustomFrame_Hash extends PPFrame_Hash {
 
 /**
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPNode_Hash_Tree implements PPNode {
        // @codingStandardsIgnoreEnd
 
@@ -1938,8 +1938,8 @@ class PPNode_Hash_Tree implements PPNode {
 
 /**
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPNode_Hash_Text implements PPNode {
        // @codingStandardsIgnoreEnd
 
@@ -1999,8 +1999,8 @@ class PPNode_Hash_Text implements PPNode {
 
 /**
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPNode_Hash_Array implements PPNode {
        // @codingStandardsIgnoreEnd
 
@@ -2057,8 +2057,8 @@ class PPNode_Hash_Array implements PPNode {
 
 /**
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPNode_Hash_Attr implements PPNode {
        // @codingStandardsIgnoreEnd
 
index 86a3fef..e1f272b 100644 (file)
@@ -188,4 +188,38 @@ final class PasswordFactory {
                        return $password->needsUpdate();
                }
        }
+
+       /**
+        * Generate a random string suitable for a password
+        *
+        * @param int $minLength Minimum length of password to generate
+        * @return string
+        */
+       public static function generateRandomPasswordString( $minLength = 10 ) {
+               // Decide the final password length based on our min password length,
+               // stopping at a minimum of 10 chars.
+               $length = max( 10, $minLength );
+               // Multiply by 1.25 to get the number of hex characters we need
+               $length = $length * 1.25;
+               // Generate random hex chars
+               $hex = MWCryptRand::generateHex( $length );
+               // Convert from base 16 to base 32 to get a proper password like string
+               return wfBaseConvert( $hex, 16, 32 );
+       }
+
+       /**
+        * Create an InvalidPassword
+        *
+        * @return InvalidPassword
+        */
+       public static function newInvalidPassword() {
+               static $password = null;
+
+               if ( $password === null ) {
+                       $factory = new self();
+                       $password = new InvalidPassword( $factory, array( 'type' => '' ), null );
+               }
+
+               return $password;
+       }
 }
index 77ceff6..1221a2d 100644 (file)
@@ -1587,7 +1587,7 @@ MESSAGE;
         * Returns LESS compiler set up for use with MediaWiki
         *
         * @since 1.22
-        * @since 1.26 added $extraVars parameter
+        * @since 1.27 added $extraVars parameter
         * @param Config $config
         * @param array $extraVars Associative array of extra (i.e., other than the
         *   globally-configured ones) that should be used for compilation.
index fca7961..f811231 100644 (file)
@@ -29,7 +29,7 @@ class ResourceLoaderEditToolbarModule extends ResourceLoaderFileModule {
        /**
         * Get language-specific LESS variables for this module.
         *
-        * @since 1.26
+        * @since 1.27
         * @param ResourceLoaderContext $context
         * @return array
         */
index 0e53547..bc17821 100644 (file)
@@ -859,12 +859,12 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @return array List of concatenated and remapped CSS data from $styles,
         *     keyed by media type
         *
-        * @since 1.26 Calling this method without a ResourceLoaderContext instance
+        * @since 1.27 Calling this method without a ResourceLoaderContext instance
         *   is deprecated.
         */
        public function readStyleFiles( array $styles, $flip, $context = null ) {
                if ( $context === null ) {
-                       wfDeprecated( __METHOD__ . ' without a ResourceLoader context', '1.26' );
+                       wfDeprecated( __METHOD__ . ' without a ResourceLoader context', '1.27' );
                        $context = ResourceLoaderContext::newDummyContext();
                }
 
@@ -952,7 +952,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * Keeps track of all used files and adds them to localFileRefs.
         *
         * @since 1.22
-        * @since 1.26 Added $context paramter.
+        * @since 1.27 Added $context paramter.
         * @throws Exception If less.php encounters a parse error
         * @param string $fileName File path of LESS source
         * @param ResourceLoaderContext $context Context in which to generate script
index 4ddfe55..c50e8b2 100644 (file)
@@ -423,7 +423,7 @@ abstract class ResourceLoaderModule {
        /**
         * Set the files this module depends on indirectly for a given skin.
         *
-        * @since 1.26
+        * @since 1.27
         * @param ResourceLoaderContext $context
         * @param array $localFileRefs List of files
         */
@@ -457,7 +457,7 @@ abstract class ResourceLoaderModule {
         * This is used to make file paths safe for storing in a database without the paths
         * becoming stale or incorrect when MediaWiki is moved or upgraded (T111481).
         *
-        * @since 1.26
+        * @since 1.27
         * @param array $filePaths
         * @return array
         */
@@ -471,7 +471,7 @@ abstract class ResourceLoaderModule {
        /**
         * Expand directories relative to $IP.
         *
-        * @since 1.26
+        * @since 1.27
         * @param array $filePaths
         * @return array
         */
@@ -527,7 +527,7 @@ abstract class ResourceLoaderModule {
        /**
         * Get module-specific LESS variables, if any.
         *
-        * @since 1.26
+        * @since 1.27
         * @param ResourceLoaderContext $context
         * @return array Module-specific LESS variables.
         */
index 23bd394..ccdf3fa 100644 (file)
@@ -383,7 +383,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         *
         * @param FormOptions $opts
         */
-       function setTopText( FormOptions $opts ) {
+       public function setTopText( FormOptions $opts ) {
                // nothing by default
        }
 
@@ -393,7 +393,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         *
         * @param FormOptions $opts
         */
-       function setBottomText( FormOptions $opts ) {
+       public function setBottomText( FormOptions $opts ) {
                // nothing by default
        }
 
@@ -405,7 +405,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * @param FormOptions $opts
         * @return array
         */
-       function getExtraOptions( $opts ) {
+       public function getExtraOptions( $opts ) {
                return array();
        }
 
index 6a4347d..df68b12 100644 (file)
@@ -301,8 +301,8 @@ class SpecialChangePassword extends FormSpecialPage {
                        $remember = $this->getRequest()->getCookie( 'Token' ) !== null;
                        $user->setCookies( null, null, $remember );
                }
-               $user->resetPasswordExpiration();
                $user->saveSettings();
+               $this->resetPasswordExpiration( $user );
        }
 
        public function requiresUnblock() {
@@ -312,4 +312,28 @@ class SpecialChangePassword extends FormSpecialPage {
        protected function getGroupName() {
                return 'users';
        }
+
+       /**
+        * For resetting user password expiration, until AuthManager comes along
+        * @param User $user
+        */
+       private function resetPasswordExpiration( User $user ) {
+               global $wgPasswordExpirationDays;
+               $newExpire = null;
+               if ( $wgPasswordExpirationDays ) {
+                       $newExpire = wfTimestamp(
+                               TS_MW,
+                               time() + ( $wgPasswordExpirationDays * 24 * 3600 )
+                       );
+               }
+               // Give extensions a chance to force an expiration
+               Hooks::run( 'ResetPasswordExpiration', array( $this, &$newExpire ) );
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->update(
+                       'user',
+                       array( 'user_password_expires' => $dbw->timestampOrNull( $newExpire ) ),
+                       array( 'user_id' => $user->getID() ),
+                       __METHOD__
+               );
+       }
 }
index f1eb8c2..53e1d1b 100644 (file)
@@ -139,7 +139,7 @@ class SpecialPasswordReset extends FormSpecialPage {
         * @return bool|array
         */
        public function onSubmit( array $data ) {
-               global $wgAuth;
+               global $wgAuth, $wgMinimalPasswordLength;
 
                if ( isset( $data['Domain'] ) ) {
                        if ( $wgAuth->validDomain( $data['Domain'] ) ) {
@@ -254,7 +254,7 @@ class SpecialPasswordReset extends FormSpecialPage {
 
                $passwords = array();
                foreach ( $users as $user ) {
-                       $password = $user->randomPassword();
+                       $password = PasswordFactory::generateRandomPasswordString( $wgMinimalPasswordLength );
                        $user->setNewpassword( $password );
                        $user->saveSettings();
                        $passwords[] = $this->msg( 'passwordreset-emailelement', $user->getName(), $password )
index 00ee327..447c3ef 100644 (file)
@@ -587,7 +587,7 @@ class PageArchive {
                $restored = 0;
 
                foreach ( $result as $row ) {
-                       // Check for key dupes due to shitty archive integrity.
+                       // Check for key dupes due to needed archive integrity.
                        if ( $row->ar_rev_id ) {
                                $exists = $dbw->selectField( 'revision', '1',
                                        array( 'rev_id' => $row->ar_rev_id ), __METHOD__ );
index 10d55b2..ad44076 100644 (file)
@@ -263,7 +263,7 @@ class SpecialUpload extends SpecialPage {
                }
 
                # Give a notice if the user is uploading a file that has been deleted or moved
-               # Note that this is independent from the message 'filewasdeleted' that requires JS
+               # Note that this is independent from the message 'filewasdeleted'
                $desiredTitleObj = Title::makeTitleSafe( NS_FILE, $this->mDesiredDestName );
                $delNotice = ''; // empty by default
                if ( $desiredTitleObj instanceof Title && !$desiredTitleObj->exists() ) {
@@ -366,6 +366,19 @@ class SpecialUpload extends SpecialPage {
                        }
                        if ( $warning == 'exists' ) {
                                $msg = "\t<li>" . self::getExistsWarning( $args ) . "</li>\n";
+                       } elseif ( $warning == 'was-deleted' ) {
+                               # If the file existed before and was deleted, warn the user of this
+                               $ltitle = SpecialPage::getTitleFor( 'Log' );
+                               $llink = Linker::linkKnown(
+                                       $ltitle,
+                                       wfMessage( 'deletionlog' )->escaped(),
+                                       array(),
+                                       array(
+                                               'type' => 'delete',
+                                               'page' => Title::makeTitle( NS_FILE, $args )->getPrefixedText(),
+                                       )
+                               );
+                               $msg = "\t<li>" . wfMessage( 'filewasdeleted' )->rawParams( $llink )->parse() . "</li>\n";
                        } elseif ( $warning == 'duplicate' ) {
                                $msg = $this->getDupeWarning( $args );
                        } elseif ( $warning == 'duplicate-archive' ) {
@@ -711,19 +724,6 @@ class SpecialUpload extends SpecialPage {
                        $warning = wfMessage( 'file-thumbnail-no', $badPart )->parse();
                } elseif ( $exists['warning'] == 'bad-prefix' ) {
                        $warning = wfMessage( 'filename-bad-prefix', $exists['prefix'] )->parse();
-               } elseif ( $exists['warning'] == 'was-deleted' ) {
-                       # If the file existed before and was deleted, warn the user of this
-                       $ltitle = SpecialPage::getTitleFor( 'Log' );
-                       $llink = Linker::linkKnown(
-                               $ltitle,
-                               wfMessage( 'deletionlog' )->escaped(),
-                               array(),
-                               array(
-                                       'type' => 'delete',
-                                       'page' => $filename
-                               )
-                       );
-                       $warning = wfMessage( 'filewasdeleted' )->rawParams( $llink )->parseAsBlock();
                }
 
                return $warning;
index 085cfee..0da598b 100644 (file)
@@ -826,7 +826,7 @@ class LoginForm extends SpecialPage {
                } elseif ( $wgBlockDisablesLogin && $u->isBlocked() ) {
                        // If we've enabled it, make it so that a blocked user cannot login
                        $retval = self::USER_BLOCKED;
-               } elseif ( $u->getPasswordExpired() == 'hard' ) {
+               } elseif ( $this->checkUserPasswordExpired( $u ) == 'hard' ) {
                        // Force reset now, without logging in
                        $retval = self::RESET_PASS;
                        $this->mAbortLoginErrorMsg = 'resetpass-expired';
@@ -994,7 +994,7 @@ class LoginForm extends SpecialPage {
                                        $this->getContext()->setLanguage( $userLang );
                                        // Reset SessionID on Successful login (bug 40995)
                                        $this->renewSessionId();
-                                       if ( $this->getUser()->getPasswordExpired() == 'soft' ) {
+                                       if ( $this->checkUserPasswordExpired( $this->getUser() ) == 'soft' ) {
                                                $this->resetLoginForm( $this->msg( 'resetpass-expired-soft' ) );
                                        } elseif ( $wgInvalidPasswordReset
                                                && !$user->isValidPassword( $this->mPassword )
@@ -1121,7 +1121,7 @@ class LoginForm extends SpecialPage {
        function mailPasswordInternal( $u, $throttle = true, $emailTitle = 'passwordremindertitle',
                $emailText = 'passwordremindertext'
        ) {
-               global $wgNewPasswordExpiry;
+               global $wgNewPasswordExpiry, $wgMinimalPasswordLength;
 
                if ( $u->getEmail() == '' ) {
                        return Status::newFatal( 'noemail', $u->getName() );
@@ -1134,7 +1134,7 @@ class LoginForm extends SpecialPage {
                $currentUser = $this->getUser();
                Hooks::run( 'User::mailPasswordInternal', array( &$currentUser, &$ip, &$u ) );
 
-               $np = $u->randomPassword();
+               $np = PasswordFactory::generateRandomPasswordString( $wgMinimalPasswordLength );
                $u->setNewpassword( $np, $throttle );
                $u->saveSettings();
                $userLanguage = $u->getOption( 'language' );
@@ -1717,4 +1717,25 @@ class LoginForm extends SpecialPage {
        protected function getGroupName() {
                return 'login';
        }
+
+       /**
+        * Private function to check password expiration, until AuthManager comes
+        * along to handle that.
+        * @param User $user
+        * @return string|bool
+        */
+       private function checkUserPasswordExpired( User $user ) {
+               global $wgPasswordExpireGrace;
+               $dbr = wfGetDB( DB_SLAVE );
+               $ts = $dbr->selectField( 'user', 'user_password_expires', array( 'user_id' => $user->getId() ) );
+
+               $expired = false;
+               $now = wfTimestamp();
+               $expUnix = wfTimestamp( TS_UNIX, $ts );
+               if ( $ts !== null && $expUnix < $now ) {
+                       $expired = ( $expUnix + $wgPasswordExpireGrace < $now ) ? 'hard' : 'soft';
+               }
+               return $expired;
+       }
+
 }
index 5193a7f..5f4a16a 100644 (file)
@@ -643,6 +643,10 @@ abstract class UploadBase {
                        $warnings['exists'] = $exists;
                }
 
+               if ( $localFile->wasDeleted() && !$localFile->exists() ) {
+                       $warnings['was-deleted'] = $filename;
+               }
+
                // Check dupes against existing files
                $hash = $this->getTempFileSha1Base36();
                $dupes = RepoGroup::singleton()->findBySha1( $hash );
@@ -1745,10 +1749,6 @@ abstract class UploadBase {
                        return array( 'warning' => 'page-exists', 'file' => $file );
                }
 
-               if ( $file->wasDeleted() && !$file->exists() ) {
-                       return array( 'warning' => 'was-deleted', 'file' => $file );
-               }
-
                if ( strpos( $file->getName(), '.' ) == false ) {
                        $partname = $file->getName();
                        $extension = '';
@@ -1763,7 +1763,7 @@ abstract class UploadBase {
                        // We're not using the normalized form of the extension.
                        // Normal form is lowercase, using most common of alternate
                        // extensions (eg 'jpg' rather than 'JPEG').
-                       //
+
                        // Check for another file using the normalized form...
                        $nt_lc = Title::makeTitle( NS_FILE, "{$partname}.{$normalizedExtension}" );
                        $file_lc = wfLocalFile( $nt_lc );
index b9a1bbf..b971c00 100644 (file)
@@ -221,7 +221,6 @@ class UploadStash {
                // If no key was supplied, make one.  a mysql insertid would be totally
                // reasonable here, except that for historical reasons, the key is this
                // random thing instead.  At least it's not guessable.
-               //
                // Some things that when combined will make a suitably unique key.
                // see: http://www.jwz.org/doc/mid.html
                list( $usec, $sec ) = explode( ' ', microtime() );
index b7767eb..7cedcc5 100644 (file)
@@ -68,10 +68,10 @@ class LanguageHy extends Language {
                                case 'accusative': # Հայցական հոլով
                                        # stub
                                        break;
-                               case 'instrumental':  #
+                               case 'instrumental':
                                        # stub
                                        break;
-                               case 'prepositional': #
+                               case 'prepositional':
                                        # stub
                                        break;
                        }
index 98d138d..3520298 100644 (file)
@@ -50,7 +50,6 @@ class LanguageWa extends Language {
                $datePreference = $this->dateFormat( $format );
 
                # ISO (YYYY-mm-dd) format
-               #
                # we also output this format for YMD (eg: 2001 January 15)
                if ( $datePreference == 'ISO 8601' ) {
                        $d = substr( $ts, 0, 4 ) . '-' . substr( $ts, 4, 2 ) . '-' . substr( $ts, 6, 2 );
@@ -64,7 +63,6 @@ class LanguageWa extends Language {
                }
 
                # Walloon format
-               #
                # we output this in all other cases
                $m = substr( $ts, 4, 2 );
                $n = substr( $ts, 6, 2 );
index e80f11c..12a0a2f 100644 (file)
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "bladsy bestaan nog nie",
-       "mw-widgets-titleinput-description-redirect": "aanstuur na $1"
+       "mw-widgets-titleinput-description-redirect": "aanstuur na $1",
+       "api-error-blacklisted": "Kies asseblief 'n ander, beskrywende titel."
 }
index dbc005c..53d2471 100644 (file)
        "special-characters-group-lao": "Laosiano",
        "special-characters-group-khmer": "Khmer",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "AAAA-MM"
+       "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "api-error-blacklisted": "Trigue un titol diferent, mas descriptivo."
 }
index 04985a4..355987d 100644 (file)
        "special-characters-title-minus": "علامة الطرح",
        "mw-widgets-dateinput-no-date": "لا تاريخ تم اختياره",
        "mw-widgets-titleinput-description-new-page": "الصفحة غير موجودة بعد",
-       "mw-widgets-titleinput-description-redirect": "تحويل إلى $1"
+       "mw-widgets-titleinput-description-redirect": "تحويل إلى $1",
+       "api-error-blacklisted": "اختر عنوانا مختلفا ومفهوما."
 }
index 360a696..8d37c4f 100644 (file)
        "ok": "موافئ",
        "retrievedfrom": "اتجابت من \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|عندك}} $1 ($2).",
-       "youhavenewmessagesfromusers": "{{PLURAL:$4|عÙ\86دÙ\83}} $1 Ù\85Ù\86 {{PLURAL:${{PLURAL:$3|}}3|Ù\8aÙ\88زر Ù\88احد|Ù\8aÙ\88زر Ù\88احد|اتÙ\86Ù\8aÙ\86 Ù\8aÙ\88زر |$3 Ù\85ستخدÙ\85Ù\8aÙ\86|$3 يوزر}} ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|عÙ\86دÙ\83}} $1 Ù\85Ù\86 {{PLURAL:${{PLURAL:$3|}}3|Ù\8aÙ\88زر Ù\88احد|Ù\8aÙ\88زر Ù\88احد|اتÙ\86Ù\8aÙ\86 Ù\8aÙ\88زر |$3 Ù\8aÙ\88زر|$3 يوزر}} ($2).",
        "youhavenewmessagesmanyusers": "عندك $1 من يوزرات كتير  ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|رساله جديده|999=رسايل جديده}}",
        "newmessagesdifflinkplural": "أحدث {{PLURAL:$1|تغيير|999=تغييرات}}",
        "right-siteadmin": "قفل وفتح قاعدة البيانات",
        "right-override-export-depth": "تصدير الصفحات مع الصفحات الموصوله لحد عمق 5",
        "right-sendemail": "يبعت إيميل لليوزرز التانيين",
-       "right-passwordreset": "إعادة ضبط كلمة سر مستخدم([[Special:PasswordReset|صفحة خاصة]])",
+       "right-passwordreset": "إعادة ضبط كلمة سر يوزر",
+       "right-managechangetags": "إنشاء و مسح [[Special:Tags|الوسوم]] من قاعدة البيانات",
        "newuserlogpage": "سجل اليوزرز الجداد",
        "newuserlogpagetext": "دا سجل لليوزرز الجداد",
        "rightslog": "سجل صلاحيات اليوزرز",
index aa87e28..e2ee451 100644 (file)
        "watchlisttools-edit": "লক্ষ্য-তালিকা চাওক আৰু সম্পাদনা কৰক",
        "watchlisttools-raw": "অশোধিত লক্ষ্য-তালিকা সম্পাদনা কৰক",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
+       "timezone-utc": "ইউ.টি.চি.",
        "duplicate-defaultsort": "'''সাৱধান!''' পূৰ্বনিৰ্ধাৰিত ক্ৰমসূচক \"$2\"-এ আগৰ ক্ৰমসূচক \"$1\"ক বিস্থাপিত কৰিছে।",
        "version": "সংস্কৰণ",
        "version-extensions": "ইন্‌ষ্টল কৰা এক্সটেনচনসমূহ",
        "duration-centuries": "$1 {{PLURAL:$1|শতাব্দী|শতাব্দী}}",
        "duration-millennia": "$1 {{PLURAL:$1|সহস্ৰাব্দ|সহস্ৰাব্দ}}",
        "rotate-comment": "ছবিখন ঘড়ীৰ কাটাৰ দিশত $1 {{PLURAL:$1|ডিগ্ৰী}} ঘূৰোৱা হৈছে।",
+       "limitreport-cputime": "চি.পি.ইউ. সময় ব্যৱহাৰ",
        "expandtemplates": "সাঁচবোৰ বহলাওক",
        "expand_templates_input": "পাঠ্য ভৰাওক",
        "expand_templates_output": "ফলাফল",
        "special-characters-group-khmer": "খেমাৰ",
        "special-characters-title-endash": "en দেছ্‌",
        "special-characters-title-emdash": "em দেছ‌",
-       "special-characters-title-minus": "বিয়োগ চিন"
+       "special-characters-title-minus": "বিয়োগ চিন",
+       "api-error-blacklisted": "অনুগ্ৰহ কৰি অন্য এটা বৰ্ণনামূলক শিৰোনাম নিৰ্বাচন কৰক"
 }
index 80dbb7d..b2dc32c 100644 (file)
        "passwordreset-emailsent-capture": "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo.",
        "passwordreset-emailerror-capture": "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo, pero falló l'unviu {{GENDER:$2|al usuariu|a la usuaria}}: $1",
        "changeemail": "Camudar o desaniciar la dirección de corréu electrónicu",
-       "changeemail-header": "Camudar la direición de corréu electrónicu de la cuenta",
+       "changeemail-header": "Completa esti formulariu pa camudar la dirección de corréu electrónicu. Si quies desaniciar l'asociación de cualquier dirección de corréu electrónicu de la to cuenta, dexa en blancu la nueva dirección de corréu electrónicu cuando unvies el formulariu.",
+       "changeemail-passwordrequired": "Vas tener qu'escribir la contraseña pa confirmar esti cambéu.",
        "changeemail-no-info": "Tien d'aniciar sesión pa entrar direutamente a esta páxina.",
        "changeemail-oldemail": "Direición de corréu electrónicu actual:",
        "changeemail-newemail": "Direición de corréu electrónicu nueva:",
        "sig_tip": "La to robla con data y hora",
        "hr_tip": "Llinia horizontal (úsala con moderación)",
        "summary": "Resume:",
-       "subject": "Asuntu/títulu:",
+       "subject": "Asuntu:",
        "minoredit": "Esta ye una edición menor",
        "watchthis": "Vixilar esta páxina",
        "savearticle": "Guardar la páxina",
        "missingsummary": "'''Recordatoriu:''' Nun conseñasti un resume d'edición.\nSi calques nuevamente \"{{int:savearticle}}\", la to edición guardaráse ensin nengún resume.",
        "selfredirect": "<strong>Atención:</strong> Tas redirixendo esta páxina a ella mesma.\nSeique conseñaras un oxetivu enquivocáu pa la redireición, o que teas editando una páxina enquivocada. Si vuelves a facer clic en «{{int:savearticle}}», crearáse la redireición de toles maneres.",
        "missingcommenttext": "Por favor, escribi un comentariu abaxo.",
-       "missingcommentheader": "'''Recordatoriu:''' Nun conseñasti un asuntu/titular pa esti comentariu.\nSi calques nuevamente \"{{int:savearticle}}\", la to edición guardaráse ensin dengún.",
+       "missingcommentheader": "<strong>Recordatoriu:</strong> Nun conseñasti un asuntu pa esti comentariu.\nSi calques nuevamente «{{int:savearticle}}», la to edición guardaráse ensin nengunu.",
        "summary-preview": "Vista previa del resume:",
-       "subject-preview": "Vista previa del asuntu/titular:",
+       "subject-preview": "Vista previa del asuntu:",
        "previewerrortext": "Hebo un error al intentar entever los cambios.",
        "blockedtitle": "L'usuariu ta bloquiáu",
        "blockedtext": "'''El to nome d'usuariu o direición IP ta bloquiáu.'''\n\nEl bloquéu fexolu $1.\nEl motivu conseñáu ye ''$2''.\n\n* Principiu del bloquéu: $8\n* Caducidá del bloquéu: $6\n* Usuariu a bloquiar: $7\n\nPues ponete'n contautu con $1 o con otru [[{{MediaWiki:Grouppage-sysop}}|alministrador]] p'aldericar sobre'l bloquéu.\nNun pues usar la función 'manda-y un corréu electrónicu a esti usuariu' a nun ser que tea especificada una direición de\ncorréu electrónicu válida nes tos [[Special:Preferences|preferencies de cuenta]] y que nun tengas torgao usala.\nLa to direición IP actual ye $3, y la ID del bloquéu ye #$5.\nPor favor, incluye tolos detalles anteriores nes consultes que faigas.",
        "foreign-structured-upload-form-label-own-work": "Esti ye'l mio propiu trabayu",
        "foreign-structured-upload-form-label-infoform-categories": "Categoríes",
        "foreign-structured-upload-form-label-infoform-date": "Data",
+       "foreign-structured-upload-form-label-own-work-message-local": "Confirmo que xubo esti ficheru siguiendo les condiciones de serviciu y les polítiques de llicencies de {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Si nun puedes xubir esti ficheru baxo les polítiques de {{SITENAME}}, zarra esti diálogu y prueba otru métodu.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Quiciabes quieras probar tamién [[Special:Upload|la páxina predeterminada de xubíes]].",
        "foreign-structured-upload-form-label-own-work-message-default": "Entiendo que toi xubiendo esti ficheru a un depósitu compartíu. Confirmo que toi faciéndolo cumpliendo les condiciones de serviciu y les polítiques de llicencies d'esi sitiu.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Si nun puedes xubir esti ficheru baxo les polítiques del depósitu compartíu, zarra esti diálogu y prueba otru métodu.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "Tamién pué interesate usar [[Special:Upload|la páxina de carga de {{SITENAME}}]] si esti ficheru pué xubise allí baxo les sos polítiques.",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "la páxina inda nun esiste",
-       "mw-widgets-titleinput-description-redirect": "redirixir a $1"
+       "mw-widgets-titleinput-description-redirect": "redirixir a $1",
+       "api-error-blacklisted": "Escueyi un títulu distintu, más descriptivu."
 }
index 92ae16e..9a1c8fb 100644 (file)
        "expand_templates_generate_xml": "Ipahiling an panlunhay na kahoy nin XML",
        "expand_templates_preview": "Patânaw",
        "mw-widgets-dateinput-placeholder-day": "TTTT-BB-AA",
-       "mw-widgets-dateinput-placeholder-month": "TTTT-BB"
+       "mw-widgets-dateinput-placeholder-month": "TTTT-BB",
+       "api-error-blacklisted": "Pakipili tabi nin sarong nalalaen, deskriptibong titulo."
 }
index ace7059..684923a 100644 (file)
        "missingsummary": "'''Напамін:''' Вы не пазначылі кароткае апісаньне зьменаў.\nКалі Вы націсьніце кнопку «Запісаць» яшчэ раз, Вашае рэдагаваньне будзе запісанае без апісаньня.",
        "selfredirect": "<strong>Папярэджаньне:</strong> вы перанакіроўваеце старонку саму на сябе.\nМагчыма, вы пазначылі няслушную старонку для перанакіраваньня або вы рэдагуеце ня тую старонку.\nКалі вы націсьніце «{{int:savearticle}}» яшчэ раз, перанакіраваньне будзе створанае.",
        "missingcommenttext": "Калі ласка, увядзіце камэнтар ніжэй.",
-       "missingcommentheader": "'''Напамін:''' Вы не пазначылі загаловак камэнтара.\nКалі Вы націсьніце кнопку «{{int:savearticle}}» яшчэ раз, Ваш камэнтар захаваецца бяз тэмы.",
+       "missingcommentheader": "<strong>Напамін:</strong> Вы не пазначылі загаловак камэнтара. Калі Вы націсьніце кнопку «{{int:savearticle}}» яшчэ раз, Вашая зьмена будзе захаваная без камэнтара.",
        "summary-preview": "Папярэдні прагляд апісаньня:",
        "subject-preview": "Папярэдні прагляд загалоўку:",
        "previewerrortext": "Адбылася памылка пры спробе папярэдняга прагляду вашых зьменаў.",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] і яшчэ {{PLURAL:$2|$2 старонка была дададзеная|$2 старонкі былі дададзеныя|$2 старонак былі дададзеныя}} да катэгорыі",
        "recentchanges-page-removed-from-category": "[[:$1]] выдаленая з катэгорыі",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] і яшчэ $2 {{PLURAL:$2|старонка была выдаленая|старонкі былі выдаленыя|старонак былі выдаленыя}} з катэгорыі",
+       "autochange-username": "Аўтаматычная зьмена MediaWiki",
        "upload": "Загрузіць файл",
        "uploadbtn": "Загрузіць файл",
        "reuploaddesc": "Скасаваць загрузку і вярнуцца да формы загрузкі",
        "special-characters-title-minus": "мінус",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
-       "mw-widgets-titleinput-description-new-page": "старонка яшчэ не існуе"
+       "mw-widgets-titleinput-description-new-page": "старонка яшчэ не існуе",
+       "api-error-blacklisted": "Калі ласка, выбярыце іншую, апісальную назву."
 }
index f75abe3..3b2366e 100644 (file)
@@ -37,8 +37,8 @@
        "tog-hideminor": "Скриване на малки редакции в последните промени",
        "tog-hidepatrolled": "Скриване на патрулираните редакции от списъка с последните промени",
        "tog-newpageshidepatrolled": "Скриване на патрулираните редакции от списъка на новите страници",
-       "tog-extendwatchlist": "Разширяване на списъка за наблюдение, така че показва всички промени, не само последните",
-       "tog-usenewrc": "Ð\93Ñ\80Ñ\83пиÑ\80ане Ð½Ð° Ð¿Ñ\80омени Ð¿Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е Ð½Ð° Ð¿Ð¾Ñ\81ледниÑ\82е Ð¿Ñ\80омени Ð¸ списъка за наблюдение",
+       "tog-extendwatchlist": "РазÑ\88иÑ\80Ñ\8fване Ð½Ð° Ñ\81пиÑ\81Ñ\8aка Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение, Ñ\82ака Ñ\87е Ð´Ð° Ð¿Ð¾ÐºÐ°Ð·Ð²Ð° Ð²Ñ\81иÑ\87ки Ð¿Ñ\80омени, Ð½Ðµ Ñ\81амо Ð¿Ð¾Ñ\81ледниÑ\82е",
+       "tog-usenewrc": "Ð\93Ñ\80Ñ\83пиÑ\80ане Ð¿Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86и Ð½Ð° Ð¿Ñ\80омениÑ\82е Ð½Ð° Ð\9fоÑ\81ледни Ð¿Ñ\80омени Ð¸ Ð² списъка за наблюдение",
        "tog-numberheadings": "Автоматично номериране на заглавията",
        "tog-showtoolbar": "Показване на лентата с инструменти за редактиране",
        "tog-editondblclick": "Редактиране на страниците чрез двойно щракване",
        "special-characters-title-emdash": "дълго тире",
        "special-characters-title-minus": "знак минус",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
-       "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ"
+       "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
+       "api-error-blacklisted": "Моля, изберете различно, описателно заглавие."
 }
index bfea927..b43070d 100644 (file)
        "prefs-labs": "آزمایشی ئین ویژگی ئان",
        "prefs-user-pages": "کار زوروکی تاکدیمان",
        "prefs-personal": "کار زوروکی پروفایل",
-       "prefs-rc": "آخیرین تغیراتان",
+       "prefs-rc": "نۆکین تغیران",
        "prefs-watchlist": "واچلیست",
        "prefs-editwatchlist": "واچلیستی ایڈیٹ کورتین",
        "prefs-editwatchlist-label": "وتئ واچلیست ئی موچین لڑلیستانئ ایڈیٹ:",
        "stub-threshold": "آستانه په کۆنڈ لینکاني قالب بندیا ($1):",
        "stub-threshold-sample-link": "نمونه",
        "stub-threshold-disabled": "غیرفعال",
-       "recentchangesdays": "روچانی اندازه گ بئ آخیر ئین تغیراتانئ تا نشان داته بوته انت:",
+       "recentchangesdays": "روچانی اندازه گ بِه آخیرئین تغیراتانئ تا نشان داته بوته انت:",
        "recentchangesdays-max": "حداکثر $1 {{PLURAL:$1|روچ}}",
        "recentchangescount": "پیش پرزین نشان داته بوته ئین ایڈیٹ ئانی اندازه گ:",
-       "prefs-help-recentchangescount": "اÛ\8c Ø´Ø§Ù\85Û\8cÙ\84 Ø¢Ø®Û\8cرئÛ\8cÙ\86 ØªØºÛ\8cراÙ\86Û\8cØ\8cتاکدÛ\8cÙ\85اÙ\86Û\8c ØªØ§Ø±Û\8cØ®Ú\86Ù\87 Ø¦Û\8c Ù\88 Ø³Û\8cاÙ\87Ù\87 Ø¦Ø§Ù\86Û\8c Ø§Ø³ت.",
+       "prefs-help-recentchangescount": "اÛ\8c Ø´Ø§Ù\85Û\8cÙ\84 Ø¦Ù\87 Ø¨Û\8cت Ø´Ù\87 Ø¢Ø®Û\8cرئÛ\8cÙ\86 ØªØºÛ\8cراÙ\86Ø\8cÚ©Ù\87 ØªØ§Ú©Ø¯Û\8cÙ\85اÙ\86Û\8c ØªØ§Ø±Û\8cØ®Ú\86Ù\87 Ù\88 Ø®Ø§Ù\84Û\8cگاÙ\87 Ø§Ù\86ت.",
        "savedprefs": "شمی تنظیمات ذخیره بوتنت.",
        "timezonelegend": "منطقهٔ زمانی:",
        "localtime": "محلی ئن وخت:",
        "right-importupload": "تاکدیمئ داخل کورتین شه فایلئ اپلوڈ کورتین ئا",
        "right-patrol": "دیگرانئ ایڈیٹانی مارک جتین",
        "right-autopatrol": "اوتوماتیکین مارک وارتین ایڈیٹ ئانی",
-       "right-patrolmarks": "آخیرئین گشت وارته ئین برچسپ ئی دیستین",
+       "right-patrolmarks": "گشت وارته ئین علامتاني نۆکین تغیرانئ دیستین",
        "right-unwatchedpages": "دیستین آ دیمانی لیستی که پدگیری ئه نه بیئنت",
        "right-mergehistory": "تاکدیمانی تاریخچه ئی ادغام کورتین",
        "right-userrights": "ایڈیٹ کورتین کار زوروکئ موچین اختیارانئ",
        "nchanges": "$1 {{PLURAL:$1|ٹگل|ٹگل}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|شه اخر ئین دیستینا}}",
        "enhancedrc-history": "تاریخچه",
-       "recentchanges": "آخیرین تغیراتان",
+       "recentchanges": "نۆکین تغیران",
        "recentchanges-legend": "آخیر ئین تغیراتانئ آپشن",
-       "recentchanges-summary": "ویکی ئی آخیر ئین تغیرانا بئ تاکدیمی تا بچاریت.",
+       "recentchanges-summary": "به ائ ویکیێ تا نۆکین و آخیرئین تغیرانه به ای دیمئ تا بگیندێت.",
        "recentchanges-noresult": "هیچ تغیری بئ تعین بوته ئین دوره ئی تا گۆ ای معیاران هموانی نداشت.",
-       "recentchanges-feed-description": "اÛ\8c Ù\88Û\8cÚ©Û\8c Ø¦Û\8c Ø¢Ø®Û\8cر Ø¦Û\8cÙ\86 ØªØºÛ\8cراÙ\86ا Ø¨Ø¦ Ø§Û\8c Ù\88ارگ Ø¦Û\8c ØªØ§ Ø¨Ú\86ارÛ\8cت.",
+       "recentchanges-feed-description": "بÙ\87 Ø§Ø¦ Ù\88Û\8cÚ©Û\8cÛ\8e ØªØ§ Ù\86Û\86Ú©Û\8cÙ\86 Ù\88 Ø¢Ø®Û\8cرئÛ\8cÙ\86 ØªØºÛ\8cراÙ\86Ù\87 Ø¨Ù\87 Ø§Û\8c Ù\81Û\8cÚ\88ئ ØªØ§ Ø¨Ú¯Û\8cÙ\86دÛ\8eت.",
        "recentchanges-label-newpage": "ای ایڈیٹ نوکین تاکدیمی ئا جوڑ کورت",
        "recentchanges-label-minor": "ای یک گونڈین ایڈیٹئ است",
        "recentchanges-label-bot": "ای ایڈیٹا یک ربات ئی کورته",
        "tooltip-n-mainpage-description": "بُنیاد ئین تاکدیمی دیستین",
        "tooltip-n-portal": "بی پروژه ئی موریدا٬ آنچه که توانیت انجام دهیت و ای که چی چیزی ئا شه گوجا ودی بکنیت",
        "tooltip-n-currentevents": "پدزمینه ئین مئلوماتئ بدست آورتین شه انونین رویداد ئان",
-       "tooltip-n-recentchanges": "ویکی ئی آخیرین تغیرايانی لڑ لیست",
+       "tooltip-n-recentchanges": "ائ ویکیێ نۆکین و آخیرئین تغیراني لڑ",
        "tooltip-n-randompage": "یک تصادفی ئین دیمی آورتین",
        "tooltip-n-help": "جای په ودی کورتین ئا",
        "tooltip-t-whatlinkshere": "موچین تاکدیمانی لڑ لیست که گۆ ای دیما لینک وارته انت",
index af8a0eb..d4a8520 100644 (file)
        "passwordreset-emailsent-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল করা হয়েছে, যা নিচে দেখানো হচ্ছে।",
        "passwordreset-emailerror-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 {{GENDER:$2|ব্যবহারকারীকে}} এটি পাঠানো যায়নি!",
        "changeemail": "ই-মেইল ঠিকানা পরিবর্তন",
-       "changeemail-text": "ই-মেইল ঠিকানা পরিবর্তন করতে আপনাকে এই ফরমটি পূরণ করতে হবে। এই পরিবর্তনটি নিশ্চিত করতে আপনার পাসওয়ার্ড প্রদানের প্রয়োজন হবে।",
+       "changeemail-header": "অ্যাকাউন্ট ই-মেইল ঠিকানা পরিবর্তন",
        "changeemail-no-info": "এই পাতাটিতে সরাসরি প্রবেশাধিকার পেতে আপনাকে অবশ্যই লগইন করতে হবে।",
        "changeemail-oldemail": "বর্তমান ই-মেইল ঠিকানা:",
        "changeemail-newemail": "নতুন ই-মেইল ঠিকানা:",
        "mw-widgets-dateinput-placeholder-day": "বববব-মম-দদ",
        "mw-widgets-dateinput-placeholder-month": "বববব-মম",
        "mw-widgets-titleinput-description-new-page": "পাতা এখনো বিদ্যমান নয়",
-       "mw-widgets-titleinput-description-redirect": "$1-এ পুনঃনির্দেশিত"
+       "mw-widgets-titleinput-description-redirect": "$1-এ পুনঃনির্দেশিত",
+       "api-error-blacklisted": "অনুগ্রহ করে অপর কোনো বর্ণনামূলক নাম ব্যবহার করুন।"
 }
index 0c35756..b6209b1 100644 (file)
        "special-characters-group-devanagari": "Devanagari",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Laoseg",
-       "special-characters-group-khmer": "Khmer"
+       "special-characters-group-khmer": "Khmer",
+       "api-error-blacklisted": "Dibabit un titl deskrivañ all"
 }
index 8859053..64e2111 100644 (file)
        "nstab-template": "Šablon",
        "nstab-help": "Pomoć",
        "nstab-category": "Kategorija",
+       "mainpage-nstab": "Početna strana",
        "nosuchaction": "Ova radnja ne postoji",
        "nosuchactiontext": "Akcija navedena u URL-u nije valjana.\nMožda ste pogriješili pri unosu URL-a ili ste slijedili pokvaren link.\nMoguće je i da je ovo greška u {{SITENAME}} softveru.",
        "nosuchspecialpage": "Nema takve posebne stranice",
        "protect-fallback": "Dozvolite samo korisnicima sa \"$1\" ovlastima/privilegijama",
        "protect-level-autoconfirmed": "Dopušteno samo automatski potvrđenim korisnicima",
        "protect-level-sysop": "Dopušteno samo administratorima",
+       "protect-summary-desc": "[$1=$2] ($3)",
        "protect-summary-cascade": "prenosna zaštita",
        "protect-expiring": "ističe $1 (UTC)",
        "protect-expiring-local": "ističe $1",
-       "protect-expiry-indefinite": "neograničeno",
+       "protect-expiry-indefinite": "neodređeno",
        "protect-cascade": "Zaštiti sve stranice koje su uključene u ovu (prenosiva zaštita)",
        "protect-cantedit": "Ne možete mijenjati nivo zaštite ove stranice, jer nemate prava da je uređujete.",
        "protect-othertime": "Drugo vrijeme:",
        "tooltip-whatlinkshere-invert": "Označite ovu kutiju za sakrivanje linkova sa stranica u izabranom imenskom prostoru.",
        "namespace_association": "Povezan imenski prostor",
        "tooltip-namespace_association": "Označite ovu kutiju da također uključite razgovor ili imenski prostor teme koja je povezana sa odabranim imenskim prostorom",
-       "blanknamespace": "(Glavno)",
+       "blanknamespace": "(glavni)",
        "contributions": "Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}}",
        "contributions-title": "Doprinosi korisnika $1",
        "mycontris": "Doprinosi",
        "tooltip-ca-nstab-main": "Pogledajte stranicu sa sadržajem",
        "tooltip-ca-nstab-user": "Pogledajte korisničku stranicu",
        "tooltip-ca-nstab-media": "Pogledajte medija fajl",
-       "tooltip-ca-nstab-special": "Ovo je posebna stranica. Ne možete je uređivati.",
+       "tooltip-ca-nstab-special": "Ovo je posebna stranica, te se ne može zasebno uređivati",
        "tooltip-ca-nstab-project": "Pogledajte projekat stranicu",
        "tooltip-ca-nstab-image": "Pogledajte stranicu slike",
        "tooltip-ca-nstab-mediawiki": "Pogledajte sistemsku poruku",
        "exif-urgency-low": "Nisko ( $1 )",
        "exif-urgency-high": "Visoko ($1)",
        "exif-urgency-other": "Korisnički određen prioritet ($1)",
-       "namespacesall": "sve",
+       "namespacesall": "svi",
        "monthsall": "sve",
        "confirmemail": "Potvrdite adresu e-pošte",
        "confirmemail_noemail": "Niste unijeli tačnu e-mail adresu u Vaše [[Special:Preferences|korisničke postavke]].",
        "logentry-newusers-byemail": "Korisnički račun $3 je {{GENDER:$2|napravio|napravila}} $1 i lozinka/šifra je poslana putem e-maila",
        "logentry-newusers-autocreate": "Korisnički račun $1 automatski je {{GENDER:$2|napravljen}}",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|premjestio|premjestila}} je postavke zaštite sa $4 na $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|uklonio|uklonila}} je zaštitu sa stranice $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|zaštitio|zaštitila}} je $3 $4",
+       "logentry-protect-modify": "$1 {{GENDER:$2|promijenio|promijenila}} je stepen zaštite za $3 $4",
        "logentry-rights-rights": "$1 {{GENDER:$2|promijenio|promijenila}} je članstvo grupe za $3 iz $4 u $5",
        "logentry-rights-rights-legacy": "$1 je {{GENDER:$2|promijenio|promijenila|promijenio}} članstvo grupe za $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$1|je automatski promijenjeno članstvo|su automatski promijenjena članstva}} iz $4 u $5",
index 7d3ffe8..2b99a6b 100644 (file)
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "la pàgina no existeix encara",
-       "mw-widgets-titleinput-description-redirect": "redirigeix a $1"
+       "mw-widgets-titleinput-description-redirect": "redirigeix a $1",
+       "api-error-blacklisted": "Trieu un títol diferent, més descriptiu."
 }
index b729a55..3972e39 100644 (file)
        "special-characters-group-sinhala": "سینھالا",
        "special-characters-group-gujarati": "گوجەراتی",
        "special-characters-group-thai": "تایلەندی",
-       "special-characters-group-khmer": "خمێری"
+       "special-characters-group-khmer": "خمێری",
+       "api-error-blacklisted": "هەڵبژێرە ناونیشانی جیاوازتر و واتادارتر."
 }
index 804eb0c..bf21f22 100644 (file)
        "viewsource": "Zobrazit zdroj",
        "viewsource-title": "Zobrazení zdroje stránky $1",
        "actionthrottled": "Akce byla pozastavena",
-       "actionthrottledtext": "Vzhledem k protispamovým opatřením nemůžete požadovanou akci provádět příliš častokrát v krátké době.\nZkuste to znovu za několik minut.",
+       "actionthrottledtext": "Vzhledem k opatřením proti zneužití nemůžete požadovanou akci provádět příliš často v krátkém časovém rozmezí.\nZkuste to znovu za několik minut.",
        "protectedpagetext": "Tato stránka byla zamčena, aby se předešlo jejímu editování.",
        "viewsourcetext": "Můžete si prohlédnout a zkopírovat zdrojový kód této stránky.",
        "viewyourtext": "Můžete si prohlédnout a zkopírovat zdrojový kód <strong>vašich změn</strong> této stránky.",
        "passwordreset-emailtext-ip": "Někdo (patrně vy, z IP adresy $1) zažádal na {{grammar:6sg|{{SITENAME}}}} ($4) o nastavení nového hesla k vašemu účtu. K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:\n\n$2\n\n{{PLURAL:$3|Toto dočasné heslo|Tato dočasná hesla}} vyprší za {{PLURAL:$5|jeden den|$5 dny|$5 dnů}}.\nNyní byste se měli přihlásit a zvolit si nové heslo. Pokud tento požadavek poslal někdo jiný nebo jste si na své staré heslo vzpomněli, a nechcete ho tedy změnit, můžete tuto zprávu ignorovat a nadále používat původní heslo.",
        "passwordreset-emailtext-user": "{{gender:$1|Uživatel|Uživatelka}} $1 na {{grammar:6sg|{{SITENAME}}}} {{gender:$1|zažádal|zažádala}} na {{grammar:6sg|{{SITENAME}}}} ($4) o nastavení nového hesla k vašemu\núčtu. K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:\n\n$2\n\n{{PLURAL:$3|Toto dočasné heslo|Tato dočasná hesla}} vyprší {{PLURAL:$5|za jeden den|za $5 dny|za $5 dnů}}.\nNyní byste se měl(a) přihlásit a zvolit si nové heslo. Pokud tento požadavek\nposlal někdo jiný nebo jste si na své staré heslo vzpomněl(a), a nechcete ho\ntedy změnit, můžete tuto zprávu ignorovat a nadále používat původní heslo.",
        "passwordreset-emailelement": "Uživatelské jméno: \n$1\n\nDočasné heslo: \n$2",
-       "passwordreset-emailsent": "E-mail pro získání nového hesla byl odeslán.",
+       "passwordreset-emailsent": "Pokud je to registrovaná emailová adresa k vašemu účtu, tak vám bude odeslán požadavak pro získání nového hesla.",
        "passwordreset-emailsent-capture": "Byl odeslán e-mail pro získání nového hesla, který je zobrazen níže.",
        "passwordreset-emailerror-capture": "Byl vygenerován e-mail pro získání nového hesla, který je zobrazen níže, ale {{GENDER:$2|uživateli|uživatelce}} se ho nepodařilo odeslat: $1",
        "changeemail": "Změna nebo odstranění e-mailové adresy",
-       "changeemail-header": "Změna e-mailové adresy k účtu",
+       "changeemail-header": "Vyplněním tohoto formuláře můžete změnit svou e-mailovou adresu. Pokud chcete ze svého účtu odstranit vazbu na všechny e-mailové adresy, ponechte při odeslání formuláře novou e-mailovou adresu prázdnou.",
+       "changeemail-passwordrequired": "Pro potvrzení této změny musíte zadat své heslo.",
        "changeemail-no-info": "K této stránce mají přímý přístup jen přihlášení uživatelé.",
        "changeemail-oldemail": "Stávající e-mailová adresa:",
        "changeemail-newemail": "Nová e-mailová adresa:",
        "sig_tip": "Váš podpis s datem a časem",
        "hr_tip": "Vodorovná čára (používejte střídmě)",
        "summary": "Shrnutí editace:",
-       "subject": "Předmět/nadpis:",
+       "subject": "Předmět:",
        "minoredit": "Tato změna je malá editace.",
        "watchthis": "Sledovat tuto stránku",
        "savearticle": "Uložit změny",
        "missingsummary": "<strong>Připomenutí:</strong> Nezadali jste shrnutí editace. Pokud ještě jednou kliknete na „{{int:savearticle}}“, bude vaše editace zapsána bez shrnutí.",
        "selfredirect": "<strong>Upozornění:</strong> Pokoušíte se tuto stránku přesměrovat na sebe samu.\nMožná jste zadali chybný cíl přesměrování, nebo editujete špatnou stránku.\nPokud ještě jednou kliknete na „{{int:savearticle}}“, bude i přesto přesměrování vytvořeno.",
        "missingcommenttext": "Zadejte komentář",
-       "missingcommentheader": "<strong>Připomenutí:</strong> Nezadali jste předmět/nadpis pro tento komentář.\nPokud ještě jednou kliknete na „{{int:savearticle}}“, bude vaše editace uložena bez něj.",
+       "missingcommentheader": "<strong>Připomenutí:</strong> Nezadali jste předmět pro tento komentář.\nPokud ještě jednou kliknete na „{{int:savearticle}}“, bude vaše editace uložena bez něj.",
        "summary-preview": "Náhled shrnutí:",
-       "subject-preview": "Náhled předmětu/nadpisu:",
+       "subject-preview": "Náhled předmětu:",
        "previewerrortext": "Při pokusu o zobrazení náhledu vašich změn došlo k chybě.",
        "blockedtitle": "Uživatel zablokován",
        "blockedtext": "<strong>Vaší IP adrese či uživatelskému jménu byla zablokována možnost editace.</strong>\n\nZablokování {{GENDER:$4|provedl|provedla}} $1.\nUdaným důvodem bylo <em>$2</em>.\n\n* Začátek blokování: $8\n* Zablokování vyprší: $6\n* Blokovaný uživatel: $7\n\nPokud chcete zablokování prodiskutovat, můžete kontaktovat {{GENDER:$4|uživatele|uživatelku}} $1 či jiného [[{{MediaWiki:Grouppage-sysop}}|správce]].\nUvědomte si, že nemůžete použít funkci „Poslat e-mail“, jestliže nemáte ve svém [[Special:Preferences|nastavení]] uvedenu platnou e-mailovou adresu nebo pokud vám byla tato možnost zakázána.\nVaše IP adresa je $3 a&nbsp;identifikační číslo bloku je #$5; tyto údaje uvádějte ve všech dotazech na správce.",
        "mw-widgets-dateinput-placeholder-day": "RRRR-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "RRRR-MM",
        "mw-widgets-titleinput-description-new-page": "stránka zatím neexistuje",
-       "mw-widgets-titleinput-description-redirect": "přesměrování na $1"
+       "mw-widgets-titleinput-description-redirect": "přesměrování na $1",
+       "api-error-blacklisted": "Zvolte jiný, popisný název."
 }
index dba2662..447c18c 100644 (file)
        "unblocklink": "блокировкăран кăлар",
        "contribslink": "хушни",
        "blocklogpage": "Ĕçлеме чарнисен журналĕ",
+       "blocklogentry": "[[$1]] чарса хучĕ $2 пĕтиччен $3",
        "unblocklogentry": "«$1» блокировкăран кăларнă",
        "block-log-flags-anononly": "анонимлă хутшăнакансем кăна",
        "block-log-flags-nocreate": "хутшăнакансене регистрациленме чарнă",
        "block-log-flags-noemail": "çыру яма чарнă",
        "move-page-legend": "Страницăна куçарнă",
-       "movearticle": "Страницăн ятне улăштар",
        "newtitle": "Çĕнĕ ят",
        "move-watch": "Ку страницăна сăнамаллисем шутне хуш",
        "movepagebtn": "Страницăн ятне улăштар",
        "htmlform-selectorother-other": "Урăххи",
        "htmlform-no": "Çук",
        "logentry-delete-delete": "$1 $3 страница {{GENDER:$2|пăсса утрĕ}}",
+       "logentry-block-block": "$1 {{GENDER:$4|$3}} {{GENDER:$2|чарса хучĕ}} $5 пĕтиччен $6",
        "logentry-move-move": "$1 страницă {{GENDER:$2|ятне улăштарчĕ}} $3 - $4",
        "rightsnone": "(çук)",
        "feedback-back": "Каялла",
index 156470d..ae34411 100644 (file)
        "special-characters-title-emdash": "heiffen em",
        "special-characters-title-minus": "arwydd minws",
        "mw-widgets-dateinput-placeholder-day": "BBBB-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "BBBB-MM"
+       "mw-widgets-dateinput-placeholder-month": "BBBB-MM",
+       "api-error-blacklisted": "Dewiswch deitl gwahanol sy'n disgrifio'r gwaith, os gwelwch yn dda."
 }
index 18da372..01a6847 100644 (file)
        "nstab-template": "Skabelon",
        "nstab-help": "Hjælp",
        "nstab-category": "Kategori",
+       "mainpage-nstab": "Forside",
        "nosuchaction": "Funktionen findes ikke",
        "nosuchactiontext": "Handlingen som er angivet i URL'en er ugyldig.\nDu kan have skrevet URL'en forkert, eller fulgt en ukorrekt henvisning.\nDet kan også skyldes en fejl i programmellet som bruges af {{SITENAME}}.",
        "nosuchspecialpage": "En sådan specialside findes ikke",
        "viewsource": "Vis kildetekst",
        "viewsource-title": "Se kildekoden til $1",
        "actionthrottled": "Begrænsning af handling",
-       "actionthrottledtext": "For at modvirke spam, er det ikke muligt at udføre denne handling mange gange på kort tid. Du har overskredet grænsen, hvorfor handlingen er blevet afbrudt. Vær venlig at forsøge igen om et par minutter.",
+       "actionthrottledtext": "For at modvirke spam, er det ikke muligt at udføre denne handling mange gange på kort tid. Du har overskredet grænsen, hvorfor handlingen er blevet afbrudt. Du kan forsøge igen om et par minutter.",
        "protectedpagetext": "Denne side er blevet beskyttet, for at forhindre redigering eller andre handlinger.",
        "viewsourcetext": "Du kan se og kopiere kildekoden til siden:",
-       "viewyourtext": "Du kan se og kopiere kildekoden for '''dine redigeringer''' til denne side:",
+       "viewyourtext": "Du kan se og kopiere kildekoden for <strong>dine redigeringer</strong> til denne side.",
        "protectedinterface": "Denne side indeholder teksten i brugergrænsefladen til softwaren på denne wiki, og er beskyttet for at forhindre misbrug.\nHvis du vil tilføje eller ændre oversættelser for alle wiki-websteder, så brug venligst [//translatewiki.net/ translatewiki.net], projektet for oversættelse af MediaWiki.",
        "editinginterface": "<strong>Advarsel:</strong> Du redigerer en side, som bruges til at give interface-tekst til softwaren.\nÆndringer på denne side vil påvirke udseendet af brugergrænsefladen for andre brugere på denne wiki.",
        "translateinterface": "For at tilføje eller ændre oversættelser for alle wikier, skal du bruge [//translatewiki.net/ translatewiki.net], der er MediaWikis lokaliseringsprojekt.",
        "createacct-captcha": "Sikkerhedskontrol",
        "createacct-imgcaptcha-ph": "Indtast venligst ovenstående tekst",
        "createacct-submit": "Opret din konto",
-       "createacct-another-submit": "Opret en anden konto",
+       "createacct-another-submit": "Opret konto",
        "createacct-benefit-heading": "{{SITENAME}} laves af mennesker som dig.",
        "createacct-benefit-body1": "{{PLURAL:$1|redigering|redigeringer}}",
        "createacct-benefit-body2": "{{PLURAL:$1|side|sider}}",
        "createacct-benefit-body3": "{{PLURAL:$1|nylig bidragyder|nylige bidragydere}}",
        "badretype": "De indtastede adgangskoder er ikke ens.",
+       "usernameinprogress": "En oprettelse af konto for dette brugernavn er allerede i gang.\nVent venligst.",
        "userexists": "Det brugernavn, du har valgt, er allerede i brug.\nVælg venligst et andet brugernavn.",
        "loginerror": "Logon mislykket",
        "createacct-error": "Fejl ved kontooprettelse",
        "passwordreset-emailtext-ip": "Nogen (sandsynligvis dig, fra IP-adressen $1) har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mailadresse:\n\n$2\n\n{{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.\nDu bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har lavet denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.",
        "passwordreset-emailtext-user": "Brugeren $1 på {{SITENAME}} har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mailadresse:\n\n$2\n\n{{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.\nDu bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har lavet denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.",
        "passwordreset-emailelement": "Brugernavn: \n$1\n\nMidlertidig adgangskode: \n$2",
-       "passwordreset-emailsent": "En e-mail om nulstilling af adgangskode er blevet sendt.",
+       "passwordreset-emailsent": "Hvis dettte er en registreret e-mail-adresse til din konto, så vil en nulstilling af adgangskoden e-mail blive sendt.",
        "passwordreset-emailsent-capture": "En e-mail om nulstilling af adgangskode, som vist nedenfor, er blevet sendt.",
        "passwordreset-emailerror-capture": "En mail om nulstilling af adgangskode, som vist nedenfor, blev genereret, men det lykkedes ikke at sende den til {{GENDER:$2|bruger}}: $1",
-       "changeemail": "Ændre e-mailadresse",
-       "changeemail-header": "Ændre kontoens e-mailadresse",
+       "changeemail": "Ændr eller fjern e-mailadresse",
+       "changeemail-header": "Udfyld denne formular for at ændre din e-mail-adresse. Hvis du gerne vil  fjerne den forbindelsen af e-mail-adresse fra din konto, så lad den nye e-mailadresse være blank, når du sender formularen.",
+       "changeemail-passwordrequired": "Du er nødt til at indtaste din adgangskode for at bekræfte denne ændring.",
        "changeemail-no-info": "Du skal være logget på for at komme direkte til denne side.",
        "changeemail-oldemail": "Nuværende e-mailadresse:",
        "changeemail-newemail": "Ny e-mailadresse:",
        "tooltip-pt-logout": "Log af",
        "tooltip-pt-createaccount": "Du opfordres til at oprette en konto og logge på, men det er ikke obligatorisk",
        "tooltip-ca-talk": "Diskussion om indholdet på siden",
-       "tooltip-ca-edit": "Du kan redigere denne side. Brug venligst forhåndsvisning før du gemmer.",
+       "tooltip-ca-edit": "Redigér denne side",
        "tooltip-ca-addsection": "Start et nyt afsnit",
        "tooltip-ca-viewsource": "Denne side er beskyttet.\nDu kan se på kildeteksten.",
        "tooltip-ca-history": "Tidligere versioner af denne side",
        "tooltip-ca-nstab-main": "Se indholdssiden",
        "tooltip-ca-nstab-user": "Se brugersiden",
        "tooltip-ca-nstab-media": "Se mediasiden",
-       "tooltip-ca-nstab-special": "Dette er en specialside; man kan ikke redigere sådanne sider",
+       "tooltip-ca-nstab-special": "Dette er en specialside og kan ikke redigeres",
        "tooltip-ca-nstab-project": "Vis projektsiden",
        "tooltip-ca-nstab-image": "Se filsiden",
        "tooltip-ca-nstab-mediawiki": "Se systembeskeden",
        "spam_reverting": "Sidste version uden henvisning til $1 gendannet.",
        "spam_blanking": "Alle versioner, som indeholdt henvisninger til $1, er renset.",
        "spam_deleting": "Alle versioner indeholder henvisninger til $1, sletter",
-       "simpleantispam-label": "Anti-spam tjek.\nUdfyld '''IKKE''' dette!",
+       "simpleantispam-label": "Anti-spam tjek.\nUdfyld <strong>ikke</strong> dette!",
        "pageinfo-title": "Information om \"$1\"",
        "pageinfo-not-current": "Beklager, det er umuligt at give denne information for gamle udgaver.",
        "pageinfo-header-basic": "Grundlæggende oplysninger",
        "exif-primarychromaticities": "Kromaticitet af primærfarver",
        "exif-ycbcrcoefficients": "YCbCr-koefficienter",
        "exif-referenceblackwhite": "Sort/hvide-referencepunkter",
-       "exif-datetime": "Lagringstidspunkt",
+       "exif-datetime": "Dato og tid for ændring af fil",
        "exif-imagedescription": "Billedtitel",
-       "exif-make": "Producent",
-       "exif-model": "Model",
+       "exif-make": "Kameraproducent",
+       "exif-model": "Kameramodel",
        "exif-software": "Software",
        "exif-artist": "Fotograf",
        "exif-copyright": "Ophavsret",
        "exif-usercomment": "Brugerkommentarer",
        "exif-relatedsoundfile": "Tilhørende lydfil",
        "exif-datetimeoriginal": "Optagelsestidspunkt",
-       "exif-datetimedigitized": "Digitaliseringstidspunkt",
+       "exif-datetimedigitized": "Dato og tid for digitalisering",
        "exif-subsectime": "Lagringstidspunkt (1/100 s)",
        "exif-subsectimeoriginal": "Optagelsestidspunkt (1/100 s)",
        "exif-subsectimedigitized": "Digitaliseringstidspunkt (1/100 s)",
        "special-characters-title-emdash": "lang tankestreg",
        "special-characters-title-minus": "minustegn",
        "mw-widgets-dateinput-placeholder-day": "ÅÅÅÅ-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM"
+       "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
+       "api-error-blacklisted": "Vælg venligst en anden, beskrivende titel."
 }
index 3412983..dbf1979 100644 (file)
@@ -81,7 +81,8 @@
                        "Tiin",
                        "Freddy2001",
                        "Luke081515",
-                       "J. 'mach' wust"
+                       "J. 'mach' wust",
+                       "R4c0r"
                ]
        },
        "tog-underline": "Links unterstreichen:",
        "svg-long-error": "Ungültige SVG-Datei: $1",
        "show-big-image": "Originaldatei",
        "show-big-image-preview": "Größe dieser Vorschau: $1.",
+       "show-big-image-preview-differ": "Größe der $3-Vorschau dieser $2-Datei: $1.",
        "show-big-image-other": "Weitere {{PLURAL:$2|Auflösung|Auflösungen}}: $1.",
        "show-big-image-size": "$1 × $2 Pixel",
        "file-info-gif-looped": "Endlosschleife",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-TT",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "Seite ist noch nicht vorhanden",
-       "mw-widgets-titleinput-description-redirect": "Weiterleitung nach $1"
+       "mw-widgets-titleinput-description-redirect": "Weiterleitung nach $1",
+       "api-error-blacklisted": "Bitte einen anderen, aussagekräftigen Titel wählen."
 }
index 8f90d6c..2fc71a2 100644 (file)
        "special-characters-title-emdash": "tira derge",
        "special-characters-title-minus": "işaretê kemiye",
        "mw-widgets-dateinput-placeholder-day": "SSSS-AA-RR",
-       "mw-widgets-dateinput-placeholder-month": "SSSS-AA"
+       "mw-widgets-dateinput-placeholder-month": "SSSS-AA",
+       "api-error-blacklisted": "Reca keme zewbina weçine, name wa şınasnaye bo."
 }
index 765106b..ef3c1e3 100644 (file)
        "userjsyoucanpreview": "'''Χρήσιμη συμβουλή:''' Χρησιμοποιήστε το κουμπί \"{{int:showpreview}}\" για να ελέγξτε τη νέα σας JS πριν την αποθηκεύσετε.",
        "usercsspreview": "'''Σας υπενθυμίζουμε ότι κάνετε απλώς έλεγχο/προεπισκόπηση του CSS του χρήστη -δεν το έχετε ακόμα αποθηκεύσει! '''",
        "userjspreview": "'''Σας υπενθυμίζουμε ότι κάνετε απλώς έλεγχο/προεπισκόπηση του JavaScript του χρήστη -δεν το έχετε ακόμα αποθηκεύσει!'''",
-       "sitecsspreview": "''' Θυμηθείτε ότι κάνετε μόνο προεπισκόπηση σ' αυτή τη  CSS.'' '\n'' ' Δεν το έχετε σώσει  ακόμη!'' '",
+       "sitecsspreview": "<strong>Θυμηθείτε ότι είναι απλώς μια προεπισκόπηση αυτού του CSS.\nΔεν έχει αποθηκευτεί ακόμα!</strong>",
        "sitejspreview": "''' Θυμηθείτε ότι κάνετε μόνο προεπισκόπηση σ'αυτόν τον κώδικα JavaScript.'' '\n'' ' Δεν τον έχετε αποθηκεύσει ακόμη!'' '",
        "userinvalidcssjstitle": "'''Προσοχή:''' Δεν υπάρχει skin με τίτλο \"$1\". Θυμηθείτε οι προσαρμοσμένες σελίδες .css και .js χρησιμοποιούν έναν τίτλο με μικρά γράμματα, π.χ. {{ns:user}}:Foo/vector.css σε αντίθεση με το {{ns:user}}:Foo/Vector.css.",
        "updated": "(Ενημερώθηκε)",
        "mw-widgets-dateinput-placeholder-day": "ΕΕΕΕ-ΜΜ-ΗΗ",
        "mw-widgets-dateinput-placeholder-month": "ΕΕΕΕ-ΜΜ",
        "mw-widgets-titleinput-description-new-page": "η σελίδα που δεν υπάρχει ακόμα",
-       "mw-widgets-titleinput-description-redirect": "ανακατεύθυνση στο $1"
+       "mw-widgets-titleinput-description-redirect": "ανακατεύθυνση στο $1",
+       "api-error-blacklisted": "Παρακαλώ επιλέξτε ένα διαφορετικό, περιγραφικό τίτλο."
 }
index 8e6ae3d..8f4ef96 100644 (file)
        "upload-dialog-button-done": "Done",
        "upload-dialog-button-save": "Save",
        "upload-dialog-button-upload": "Upload",
-       "upload-process-error": "An error occurred",
-       "upload-process-warning": "A warning occurred",
        "upload-form-label-select-file": "Select file",
        "upload-form-label-infoform-title": "Details",
        "upload-form-label-infoform-name": "Name",
        "svg-long-error": "Invalid SVG file: $1",
        "show-big-image": "Original file",
        "show-big-image-preview": "Size of this preview: $1.",
+       "show-big-image-preview-differ": "Size of this $3 preview of this $2 file: $1.",
        "show-big-image-other": "Other {{PLURAL:$2|resolution|resolutions}}: $1.",
        "show-big-image-size": "$1 × $2 pixels",
        "file-info-gif-looped": "looped",
        "mw-widgets-dateinput-placeholder-day": "YYYY-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "YYYY-MM",
        "mw-widgets-titleinput-description-new-page": "page does not exist yet",
-       "mw-widgets-titleinput-description-redirect": "redirect to $1"
+       "mw-widgets-titleinput-description-redirect": "redirect to $1",
+       "api-error-blacklisted": "Please choose a different, descriptive title."
 }
index 11bfb3d..d9362f9 100644 (file)
        "special-characters-title-emdash": "longa streketo",
        "special-characters-title-minus": "minus-signo",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-TT",
-       "mw-widgets-dateinput-placeholder-month": "JJJJ-MM"
+       "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
+       "api-error-blacklisted": "Bonvolu elekti alian, priskriban titolon."
 }
index 9daab3c..e71cd2f 100644 (file)
        "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",
        "changeemail": "Cambiar o eliminar la dirección de correo electrónico",
-       "changeemail-header": "Cambiar la dirección de correo de la cuenta",
+       "changeemail-header": "Completa este formulario para cambiar tu dirección de correo electrónico. Si quieres eliminar la asociación de cualquier dirección de correo electrónico con tu cuenta, deja en blanco la nueva dirección de correo electrónico cuando envíes el formulario.",
        "changeemail-passwordrequired": "Tendrás que escribir tu contraseña para confirmar este cambio.",
        "changeemail-no-info": "Debes iniciar sesión para acceder directamente a esta página.",
        "changeemail-oldemail": "Dirección de correo electrónico actual:",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "la página aún no existe",
-       "mw-widgets-titleinput-description-redirect": "redirigir a $1"
+       "mw-widgets-titleinput-description-redirect": "redirigir a $1",
+       "api-error-blacklisted": "Elige un título diferente, más descriptivo."
 }
index c74ef89..8216c8a 100644 (file)
        "viewsource": "Vaata lähteteksti",
        "viewsource-title": "Lehekülje $1 lähteteksti vaatamine",
        "actionthrottled": "Toiming nurjus",
-       "actionthrottledtext": "Rämpsmuudatuste vastase meetmena pole sul lühikse aja jooksul seda toimingut liiga palju kordi lubatud sooritada. Sa oled lühikse aja jooskul seda toimingut liiga palju kordi sooritanud.\nPalun proovi mõne minuti pärast uuesti.",
+       "actionthrottledtext": "Väärtarvituse vastase meetmena pole sul lühikse aja jooksul seda toimingut liiga palju kordi lubatud sooritada. Sa oled lühikse aja jooskul seda toimingut liiga palju kordi sooritanud.\nPalun proovi mõne minuti pärast uuesti.",
        "protectedpagetext": "See lehekülg on lukustatud, et ei tehtaks muudatusi ega sooritataks muid toiminguid.",
        "viewsourcetext": "Saad vaadata ja kopeerida selle lehekülje lähteteksti.",
        "viewyourtext": "Saad vaadata ja kopeerida sellel leheküljel tehtud <strong>enda muudatuste</strong> lähteteksti.",
        "passwordreset-emailtext-ip": "Keegi, arvatavasti sina ise, IP-aadressilt $1 palus lähtestada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) parooli. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:\n\n$2\n\n{{PLURAL:$3|See ajutine parool aegub|Need ajutised paroolid aeguvad}} {{PLURAL:$5|ühe|$5}} päeva pärast.\nPeaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi teine või kui sulle meenus su parool ja sa ei soovi seda enam muuta, võid teadet eirata ja jätkata vana parooli kasutamist.",
        "passwordreset-emailtext-user": "{{GRAMMAR:genitive|{{SITENAME}}}} kasutaja $1 palus lähtestada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) parooli. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:\n\n$2\n\n{{PLURAL:$3|See ajutine parool aegub|Need ajutised paroolid aeguvad}} {{PLURAL:$5|ühe|$5}} päeva pärast.\nPeaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi teine või kui sulle meenus su parool ja sa ei soovi seda enam muuta, võid teadet eirata ja jätkata vana parooli kasutamist.",
        "passwordreset-emailelement": "Kasutajanimi: \n$1\n\nAjutine parool: \n$2",
-       "passwordreset-emailsent": "Parooli lähtestamise e-kiri on saadetud.",
+       "passwordreset-emailsent": "Kui oled sidunud konto selle e-posti aadressiga, siis saadetakse sulle parooli lähtestamise e-kiri.",
        "passwordreset-emailsent-capture": "E-kirjatsi on saadetud allpool näidatav parooli lähtestuskiri.",
        "passwordreset-emailerror-capture": "Koostati allpool näidatav parooli lähtestuskiri, aga selle e-kirjatsi {{GENDER:$2|kasutajale}} saatmine ebaõnnestus: $1",
-       "changeemail": "E-posti aadressi muutmine",
-       "changeemail-text": "Täida see vorm, et muuta oma e-posti aadress. Et seda muudatust kinnitada, pead sisestama oma parooli.",
+       "changeemail": "E-posti aadressi muutmine või eemaldamine",
+       "changeemail-header": "Täida see vorm, et muuta oma e-posti aadress. Kui soovid, et konto poleks enam seotud ühegi e-posti aadressiga, siis jäta vormi esitamisel e-posti aadressi väli tühjaks.",
+       "changeemail-passwordrequired": "Et muudatus kinnitada, pead sisestama oma parooli.",
        "changeemail-no-info": "Otselingi kaudu sellele lehele jõudmiseks pead olema sisse loginud.",
        "changeemail-oldemail": "Praegune e-posti aadress:",
        "changeemail-newemail": "Uus e-posti aadress:",
+       "changeemail-newemail-help": "See väli tuleks jätta tühjaks juhul, kui tahad oma e-posti aadressi eemaldada. Kui eemaldad e-posti aadressi, ei sa siin vikis unustatud parooli lähtestada ja sulle ei saa e-kirju saata.",
        "changeemail-none": "(puudub)",
        "changeemail-password": "Sinu parool {{GRAMMAR:inessive|{{SITENAME}}}}:",
        "changeemail-submit": "Muuda e-posti aadress",
        "sig_tip": "Sinu allkiri ajatempliga",
        "hr_tip": "Rõhtkriips (kasuta liialdamata)",
        "summary": "Resümee:",
-       "subject": "Pealkiri:",
+       "subject": "Teema:",
        "minoredit": "See on pisiparandus",
        "watchthis": "Jälgi seda lehekülge",
        "savearticle": "Salvesta",
        "missingsummary": "'''Meeldetuletus:''' Sa ei ole lisanud muudatuse resümeed.\nKui vajutad uuesti salvestamise nupule, salvestatakse muudatus ilma resümeeta.",
        "selfredirect": "<strong>Hoiatus:</strong> Suunad selle lehekülje iseeneda juurde.\nVõimalik, et oled määranud ümbersuunamise jaoks vale sihtleheküljeks või redigeerid vale lehekülge.\nÜmbersuunamine luuakse sellest hoolimata, kui klõpsad uuesti \"{{int:savearticle}}\".",
        "missingcommenttext": "Palun sisesta siit allapoole kommentaar.",
-       "missingcommentheader": "'''Meeldetuletus:''' Sa pole kirjutanud kommentaarile teemat ega pealkirja.\nKui klõpsad uuesti \"{{int:savearticle}}\", salvestatakse su kommentaar kummatagi.",
+       "missingcommentheader": "<strong>Meeldetuletus:</strong> Sa pole kirjutanud kommentaarile teemat.\nKui klõpsad uuesti \"{{int:savearticle}}\", salvestatakse su kommentaar ilma teemata.",
        "summary-preview": "Resümee eelvaade:",
        "subject-preview": "Alaosa pealkirja eelvaade:",
        "previewerrortext": "Sinu muudatuste eelvaatluse juures esines tõrge.",
        "prefs-watchlist-token": "Jälgimisloendi luba:",
        "prefs-misc": "Muu",
        "prefs-resetpass": "Muuda parool",
-       "prefs-changeemail": "Muuda e-posti aadressi",
+       "prefs-changeemail": "Muuda e-posti aadressi või eemalda see",
        "prefs-setemail": "Määra e-posti aadress",
        "prefs-email": "E-posti sätted",
        "prefs-rendering": "Ilme",
        "recentchanges-page-added-to-category-bundled": "kategooriasse lisatud \"[[:$1]]\" ja veel {{PLURAL:$2|üks lehekülg|$2 lehekülge}}",
        "recentchanges-page-removed-from-category": "kategooriast eemaldatud \"[[:$1]]\"",
        "recentchanges-page-removed-from-category-bundled": "kategooriast eemaldatud \"[[:$1]]\" ja veel {{PLURAL:$2|üks lehekülg|$2 lehekülge}}",
+       "autochange-username": "MediaWiki automaatne muudatus",
        "upload": "Faili üleslaadimine",
        "uploadbtn": "Laadi fail üles",
        "reuploaddesc": "Tagasi üleslaadimise vormi juurde.",
        "upload-options": "Üleslaadimise sätted",
        "watchthisupload": "Jälgi seda faili",
        "filewasdeleted": "Selle nimega fail on lisatud ja kustutatud hiljuti.\nKontrolli $1 enne jätkamist.",
+       "filename-thumb-name": "Tundub, et tegu on pisipildi pealkirjaga. Palun ära laadi pisipilti samas vikis uuesti üles. Või siis paranda palun failinimi, nii et see oleks sisukam ja ei sisaldaks pisipildi eesliidet.",
        "filename-bad-prefix": "Üleslaaditava faili nimi algab eesliitega '''\"$1\"''', mis on omane digikaamera antud ebamäärastele nimedele.\nPalun vali oma failile kirjeldavam nimi.",
        "filename-prefix-blacklist": " #<!-- jäta see rida muutmata --> <pre>\n# Süntaks on järgmine:\n#   * Kõik alates märgist \"#\" kuni rea lõpuni on kommentaar.\n#   * Iga mittetühi rida on tüüpiline eesliide, mille digikaamerad automaatselt failinimele lisavad.\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # mõned mobiiltelefonid\nIMG # üldine\nJD # Jenoptik\nMGP # Pentax\nPICT # erinevad\n #</pre> <!-- jäta see rida muutmata -->",
        "upload-success-subj": "Üleslaadimine õnnestus",
        "upload-form-label-infoform-description": "Kirjeldus",
        "upload-form-label-usage-title": "Kasutus",
        "upload-form-label-usage-filename": "Failinimi",
+       "foreign-structured-upload-form-label-own-work": "See on minu enda töö",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategooriad",
+       "foreign-structured-upload-form-label-infoform-date": "Kuupäev",
+       "foreign-structured-upload-form-label-own-work-message-local": "Kinnitan, et seda faili üles laadides järgin saidi {{SITENAME}} kasutustingimusi ja litsentsipõhimõtteid.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Kui sul pole võimalik laadida seda faili üles kooskõlas saidi {{SITENAME}} reeglitega, siis palun sule see dialoog ja proovi teisiti toimida.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Võimalik, et soovid kasutada [[Special:Upload|harilikku üleslaadimislehekülge]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Saan aru, et laadin selle faili jagatud varamusse. Kinnitan, et teen seda kooskõlas sealsete kasutustingimuste ja litsentsipõhimõtetega.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Kui sul pole võimalik laadida seda faili üles kooskõlas jagatud varamu reeglitega, siis palun sule see dialoog ja proovi teisiti toimida.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Võimalik, et soovid [[Special:Upload|laadida selle faili üles saidil {{SITENAME}}]], kui seda on võimalik teha kooskõlas sealsete reeglitega.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Kinnitan, et olen selle faili autoriõiguse valdaja ja nõustun faili avaldamisega Wikimedia Commonsis pöördumatult Creative Commonsi litsentsi \"[https://creativecommons.org/licenses/by-sa/4.0/deed.et Autorile viitamine + jagamine samadel tingimustel 4.0]\" all. Samuti nõustun [https://wikimediafoundation.org/wiki/Terms_of_Use kasutustingimustega].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Kui sa pole selle faili autoriõiguse valdaja või kui soovid avaldada seda teise litsentsi all, siis on sul võimalik kasutada [https://commons.wikimedia.org/wiki/Special:UploadWizard Commonsi üleslaadimisviisardit].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Võimalik, et soovid kasutada [[Special:Upload|saidi {{SITENAME}} üleslaadimislehekülge]], kui seda faili on lubatud üles laadida kooskõlas sealsete reeglitega.",
        "backend-fail-stream": "Faili $1 ei saanud edastada.",
        "backend-fail-backup": "Faili $1 ei saanud varundada.",
        "backend-fail-notexists": "Faili $1 pole olemas.",
        "move-page-legend": "Lehekülje teisaldamine",
        "movepagetext": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nSaad senisele pealkirjale viitavad ümbersuunamised automaatselt parandada.\nKui sa seda ei tee, kontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge '''ei teisaldata''' juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui viimane on redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n'''Hoiatus!'''\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
        "movepagetext-noredirectfixer": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nKontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge '''ei teisaldata''' juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui olemasolev lehekülg on tühi või redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n'''Hoiatus!'''\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
-       "movepagetalktext": "Koos artiklileheküljega teisaldatakse automaatselt ka arutelulehekülg, '''välja arvatud juhtudel, kui:'''\n*uue pealkirja all on juba arutelulehekülg, mis pole tühi;\n*jätad alloleva märkeruudu valimata.\n\nNeil juhtudel saad lehekülje soovi korral käsitsi teisaldada või liita.",
+       "movepagetalktext": "Kui märgid selle ruudu, teisaldatakse arutelulehekülg automaatselt uue pealkirja alla. Seda välja arvatud juhul, kui uue pealkirja all on juba arutelulehekülg, mis pole tühi.\n\nSel juhul saad lehekülje soovi korral käsitsi teisaldada või liita.",
        "moveuserpage-warning": "'''Hoiatus:''' Oled teisaldamas kasutajalehekülge. Pane tähele, et teisaldatakse ainult lehekülg ja kasutajat '''ei''' nimetata ümber.",
        "movecategorypage-warning": "<strong>Hoiatus:</strong> Oled teisaldamas kategoorialehekülge. Pane palun tähele, et teisaldatakse vaid see lehekülg ja ühtegi vanas kategoorias sisalduvat lehekülge <em>ei</em> kategoriseerita ümber uude kategooriasse.",
        "movenologintext": "Lehekülje teisaldamiseks pead registreeruma ja [[Special:UserLogin|sisse logima]].",
        "cant-move-to-user-page": "Sul ei ole õigust teisaldada lehekülge kasutajaleheks (ei käi kasutaja alamlehe kohta).",
        "cant-move-category-page": "Sul pole õigust kategoorialehekülgi teisaldada.",
        "cant-move-to-category-page": "Sul pole õigust teisaldada lehekülge kategoorialeheküljele.",
-       "newtitle": "Uue pealkirja alla:",
+       "newtitle": "Uus pealkiri:",
        "move-watch": "Jälgi lähte- ja sihtlehekülge",
        "movepagebtn": "Teisalda lehekülg",
        "pagemovedsub": "Lehekülg on teisaldatud",
        "svg-long-error": "Vigane SVG-fail: $1",
        "show-big-image": "Algfail",
        "show-big-image-preview": "Selle eelvaate suurus: $1.",
+       "show-big-image-preview-differ": "Selle $2-faili $3-vormingus eelvaate suurus: $1.",
        "show-big-image-other": "{{PLURAL:$2|Teine eraldusvõime|Teised eraldusvõimed}}: $1.",
        "show-big-image-size": "$1 × $2 pikslit",
        "file-info-gif-looped": "korduv",
        "mw-widgets-dateinput-placeholder-day": "AAAA-KK-PP",
        "mw-widgets-dateinput-placeholder-month": "AAAA-KK",
        "mw-widgets-titleinput-description-new-page": "lehekülge pole veel",
-       "mw-widgets-titleinput-description-redirect": "ümbersuunamine leheküljele \"$1\""
+       "mw-widgets-titleinput-description-redirect": "ümbersuunamine leheküljele \"$1\"",
+       "api-error-blacklisted": "Palun vali muu pealkiri, mis on kirjeldav."
 }
index fff3e79..1eca2bb 100644 (file)
        "actionthrottled": "Ekintzaren gainetik pasa da",
        "actionthrottledtext": "Spamaren aurkako neurri gisa ekintza hau denbora tarte laburrean aldi askotan egiteko mugapena duzu, eta muga hori zeharkatu duzu.\nSaia zaitez berriro minutu batzuen buruan, mesedez.",
        "protectedpagetext": "Orri hau babestu da, edizioak edo beste ekintza batzuk egin ez daitezen.",
-       "viewsourcetext": "Orri honen iturburu-testua ikusi eta kopiatu dezakezu:",
-       "viewyourtext": "Ondorengo orri honetan '''zeuk egin dituzun aldaketen''' iturburu kodea ikus eta kopia dezakezu:",
+       "viewsourcetext": "Orri honen iturburu-testua ikusi eta kopiatu dezakezu.",
+       "viewyourtext": "Ondorengo orri honetan <strong>zeuk egin dituzun aldaketen</strong> iturburu kodea ikus eta kopia dezakezu:",
        "protectedinterface": "Orrialde honek softwarearentzako interfaze testua gordetzen du eta blokeatuta dago bandalismoak saihesteko.\nWiki guztientzako aldaketak egin edo gehitzeko, mesedez erabili [//translatewiki.net/ translatewiki.net], MediaWikiren lokalizazio proiektua.",
-       "editinginterface": "'''Oharra:''' Softwarearen interfazerako testua duen orri bat aldatzen ari zara.\nOrri honetako aldaketek wiki honetako erabiltzaile guztiei eragingo diete.\nItzulpenetarako, erabil ezazu [//translatewiki.net/ translatewiki.net], MediaWiki proiektuan.",
+       "editinginterface": "<strong> Oharra:</strong> Softwarearen interfazerako testua duen orri bat aldatzen ari zara.\nOrri honetako aldaketek wiki honetako erabiltzaile guztiei eragingo diete.",
+       "translateinterface": "Itzulpenetarako, erabil ezazu [//translatewiki.net/ translatewiki.net], MediaWiki proiektuan.",
        "cascadeprotected": "Orri hau aldaketen aurka babestua dago, sartuta dagoelako «kaskadako babesa» aukerarekin babestu {{PLURAL:$1|duten orri honetan|dituzten orri hauetan}}:\n$2",
        "namespaceprotected": "Ez daukazu '''$1''' izen-tarteko orrialdeak aldatzeko baimenik.",
        "customcssprotected": "Ez duzu baimenik CSS orrialde hau aldatzeko beste erabiltzaile baten hobespen pertsonalak dituelako.",
        "invalidtitle-knownnamespace": "Izenburua gaizki dago \"$2\" izen eremuan eta \"$3\" testuan",
        "invalidtitle-unknownnamespace": "Izenburua gaizki dago \"$1\" izen eremuan ezezagunean eta \"$2\" testuan",
        "exception-nologin": "Saioa hasi gabe",
-       "exception-nologin-text": "Orri honetan sartzeko edo ekintza hau egiteko, [[Special:Userlogin|saioa hasi]] behar duzu.",
+       "exception-nologin-text": "Orri honetan sartzeko edo ekintza hau egiteko, saioa hasi behar duzu.",
        "exception-nologin-text-manual": "Mesedez $1 orrialde honetan sartu edo ekintza hau egiteko.",
        "virus-badscanner": "Ezarpen txarrak: antibirus ezezaguna: ''$1''",
        "virus-scanfailed": "eskaneatze txarra ($1 kodea)",
        "passwordreset-emailelement": "Erabiltzaile izena: \n$1\n\nBehin-behineko pasahitza: \n$2",
        "passwordreset-emailsent": "Pasahitza berrezartzeko e-posta bidali da.",
        "passwordreset-emailsent-capture": "Pasahitza berrezartzeko e-posta bat bidali dizugu, behean erakusten dena.",
-       "changeemail": "Aldatu e-mail helbidea",
+       "changeemail": "Aldatu edo kendu e-mail helbidea",
        "changeemail-header": "Aldatu kontuko e-posta helbidea",
        "changeemail-no-info": "Orrialde honetara zuzenean sartzeko izena eman behar duzu.",
        "changeemail-oldemail": "Egungo e-mail helbidea:",
        "missingcommenttext": "Mesedez, iruzkin bat idatzi jarraian.",
        "missingcommentheader": "'''Oharra:''' Ez duzu iruzkin honetarako gairik edo goiburukorik ezarri. «{{int:Savearticle}}» klikatzen baduzu, hutsune horrekin gordeko da.",
        "summary-preview": "Laburpenaren aurreikuspena:",
-       "subject-preview": "Gaia/Izenburuaren aurreikuspena:",
+       "subject-preview": "Gaiaren aurrebista:",
        "blockedtitle": "Erabiltzailea blokeatuta dago",
        "blockedtext": "'''Zure erabiltzaile izena edo IP helbidea blokeaturik dago.'''\n\n$1 administratzaileak ezarri du blokeoa.\nEmandako arrazoia hau da: ''$2''.\n\n* Blokeoaren hasiera: $8\n* Blokeoaren bukaera: $6\n* Blokeatua: $7\n\nBlokeoari buruz eztabaidatzeko, jo ezazu $1 administratzailearengana edo beste [[{{MediaWiki:Grouppage-sysop}}|administratzaile]] batengana.\n«Bidali mezu elektronikoa lankide honi» tresna erabili ahal izateko, ezinbestekoa da zure [[Special:Preferences|hobespenetan]] baliozkoa den helbide elektroniko bat emanda izatea, eta tresna hori erabiltzeko aukera zuri blokeatu ez izana.\nOrain duzun IP helbidea $3 da, eta blokeoaren zenbakia #$5 da.\nEman itzazu datu hauek guztiak, blokeoari buruzko edozein eskaera egitean.",
        "autoblockedtext": "Zure IP helbidea automatikoki blokeaturik dago, $1 administratzaileak blokeatutako beste wikilari batek erabili zuelako. Emandako arrazoia hau da:\n\n:''$2''\n\n* Blokeoaren hasiera: $8\n* Blokeoaren bukaera: $6\n* Blokeatua: $7\n\nBlokeoari buruz eztabaidatzeko, jo ezazu $1 administratzailearengana edo beste [[{{MediaWiki:Grouppage-sysop}}|administratzaile]] batengana.\n\n«Bidali mezu elektronikoa lankide honi» tresna erabili ahal izateko, ezinbestekoa da zure [[Special:Preferences|hobespenetan]] baliozkoa den helbide elektroniko bat emanda izatea, eta tresna hori erabiltzeko aukera zuri blokeatu ez izana.\n\nOrain duzun IP helbidea $3 da, eta blokeoaren zenbakia #$5 da.\n\nEman itzazu datu hauek guztiak, blokeoari buruzko edozein eskaera egitean.",
        "prefs-watchlist-token": "Jarraipen zerrendaren tokena:",
        "prefs-misc": "Denetarik",
        "prefs-resetpass": "Pasahitza aldatu",
-       "prefs-changeemail": "Aldatu e-mail helbidea",
+       "prefs-changeemail": "Aldatu edo kendu e-mail helbidea",
        "prefs-setemail": "E-mail helbide bat ezarri",
        "prefs-email": "E-posta aukerak",
        "prefs-rendering": "Itxura",
index ad61892..52a6d6c 100644 (file)
        "specialpages": "Páhinas especialis",
        "specialpages-group-other": "Otras páhinas especialis",
        "specialpages-group-login": "Entral / Crial cuenta",
-       "specialpages-group-changes": "Úrtimus chambus i rustrihus",
+       "specialpages-group-changes": "Últimus cambius i rustrijus",
        "specialpages-group-users": "Usuárius i derechus",
        "specialpages-group-highuse": "Páginas mas visoreás",
        "specialpages-group-pages": "Lista de páginas",
index d759040..8c39588 100644 (file)
        "sig_tip": "امضای شما و برچسب زمان",
        "hr_tip": "خط افقی (از آن کم استفاده کنید)",
        "summary": "خلاصه:",
-       "subject": "موضوع/عنوان:",
+       "subject": "عنوان:",
        "minoredit": "این ویرایش، جزئی است",
        "watchthis": "پی‌گیری این صفحه",
        "savearticle": "صفحه ذخیره شود",
        "mergehistory-go": "نمایش تاریخچه قابل ادغام",
        "mergehistory-submit": "ادغام نسخه‌ها",
        "mergehistory-empty": "هیچ‌یک از نسخه‌ها قابل ادغام نیستند.",
-       "mergehistory-done": "$3 نسخه از $1  با موفقیت در [[:$2]] ادغام {{PLURAL:$3|شد}}.",
+       "mergehistory-done": "$3 نسخه از $1 در [[:$2]] ادغام شد.",
        "mergehistory-fail": "ادغام تاریخچه ممکن نیست، لطفاً گزینه‌های صفحه و زمان را بازبینی کنید.",
        "mergehistory-fail-toobig": "نمی‌توان ادغام تاریخچه را انجام داد که بیشتر از محدودیت $1 {{PLURAL:$1|نسخه}} انتقال داده خواهد شد.",
        "mergehistory-no-source": "صفحهٔ مبدأ $1 وجود ندارد.",
        "emailccsubject": "رونوشت پیغام شما به $1: $2",
        "emailsent": "ایمیل ارسال شد",
        "emailsenttext": "پیام ایمیل شما فرستاده شد.",
-       "emailuserfooter": "این ایمیل با استفاده از ویژگی «{{int:emailuser}}» {{SITENAME}} توسط $1 به $2 ارسال شد.",
+       "emailuserfooter": "این ایمیل با استفاده از ویژگی «{{int:emailuser}}» {{SITENAME}} توسط $1 به {{GENDER:$2|$2}} {{GENDER:$1|ارسال شد}}.",
        "usermessage-summary": "گذاشتن پیغام سامانه.",
        "usermessage-editor": "پیغام رسان سامانه",
        "watchlist": "فهرست پی‌گیری",
        "deletepage": "حذف صفحه",
        "confirm": "تأیید",
        "excontent": "محتوای صفحه این بود: «$1»",
-       "excontentauthor": "محتوای صفحه این بود: «$1» (و تنها مشارکت‌کننده «[[Special:Contributions/$2|$2]]» بود)",
+       "excontentauthor": "محتوای صفحه این بود: «$1» و تنها مشارکت‌کننده «[[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]])» بود",
        "exbeforeblank": "محتوای صفحه قبل از خالی‌کردن این بود: «$1»",
        "delete-confirm": "حذف «$1»",
        "delete-legend": "حذف",
        "cant-move-to-user-page": "شما اجازه ندارید که یک صفحه را به یک صفحهٔ کاربر انتقال دهید (به استثنای زیر صفحه‌های کاربری).",
        "cant-move-category-page": "شما اجازهٔ انتقال دادن صفحهٔ رده‌ها را ندارید.",
        "cant-move-to-category-page": "شما مجوز برای انتقال صفحه به صفحه رده ندارید.",
-       "newtitle": "بÙ\87 Ø¹Ù\86Ù\88اÙ\86 ØªØ§Ø²Ù\87:",
+       "newtitle": "عنوان تازه:",
        "move-watch": "پی‌گیری صفحه‌های مبدأ و مقصد",
        "movepagebtn": "صفحه منتقل شود",
        "pagemovedsub": "انتقال با موفقیت انجام شد",
        "logentry-newusers-byemail": "حساب کاربری $3 توسط $1 {{GENDER:$2|ایجاد شد}} و رمز عبور به وسیلهٔ ایمیل ارسال شد",
        "logentry-newusers-autocreate": "حساب $1  به شکل خودکار {{GENDER:$2|ایجاد شد}}",
        "logentry-protect-move_prot": "$1 تنظیمات محافظت را از $4 به $3 {{GENDER:$2|منتقل کرد}}",
+       "logentry-protect-unprotect": "$1 $3 را از محافظت {{GENDER:$2|خارج کرد}}",
        "logentry-protect-protect": "$1 $3 را {{GENDER:$2|محافظت کرد}} $4",
+       "logentry-protect-modify": "$1 سطح محافظت $3 را {{GENDER:$2|تغییر داد}} $4",
        "logentry-rights-rights": "$1 عضویت $3 را از گروه $4 به $5 {{GENDER:$2|تغییر داد}}",
        "logentry-rights-rights-legacy": "$1 گروه عضویت $3 را {{GENDER:$2|تغییر داد}}",
        "logentry-rights-autopromote": "$1 به طور خودکار از $4 به $5 {{GENDER:$2|ارتقاء داد}}",
        "special-characters-title-minus": "علامت منفی",
        "mw-widgets-dateinput-no-date": "هیچ داده‌ای انتخاب نشده",
        "mw-widgets-titleinput-description-new-page": "این صفحه هنوز وجود ندارد",
-       "mw-widgets-titleinput-description-redirect": "تغییر مسیر به $1"
+       "mw-widgets-titleinput-description-redirect": "تغییر مسیر به $1",
+       "api-error-blacklisted": "لطفاً یک عنوان توصیفی متفاوت انتخاب کنید."
 }
index 0abbd63..6322387 100644 (file)
        "passwordreset-emailsent-capture": "Salasanan uudistamisesta kertova sähköpostiviesti on lähetetty, ja se näkyy myös alla.",
        "passwordreset-emailerror-capture": "Allaoleva sähköpostiviesti luotiin, mutta sen lähettäminen {{GENDER:$2|käyttäjälle}} epäonnistui: $1",
        "changeemail": "Muuta tai poista sähköpostiosoite",
-       "changeemail-header": "Muuta tunnuksen sähköpostiosoite",
+       "changeemail-header": "Täydennä tämä lomake, jolla voit muuttaa sähköpostiosoitettasi. Jos haluat poistaa sähköpostiosoitteesi kokonaan tunnuksesi yhteydestä, älä kirjoita uudeksi osoitteeksi mitään vaan jätä se tyhjäksi.",
+       "changeemail-passwordrequired": "Sinun on syötettävä salasanasi vahvistaaksesi tämän muutoksen.",
        "changeemail-no-info": "Tämän sivun käyttö edellyttää sisäänkirjautumista.",
        "changeemail-oldemail": "Nykyinen sähköpostiosoite:",
        "changeemail-newemail": "Uusi sähköpostiosoite:",
        "sig_tip": "Allekirjoitus aikaleiman kanssa",
        "hr_tip": "Vaakasuora viiva",
        "summary": "Yhteenveto:",
-       "subject": "Aihe tai otsikko:",
+       "subject": "Aiheotsikko:",
        "minoredit": "Tämä on pieni muutos",
        "watchthis": "Tarkkaile tätä sivua",
        "savearticle": "Tallenna sivu",
        "missingsummary": "Et ole antanut yhteenvetoa. Jos valitset Tallenna uudelleen, niin muokkauksesi tallennetaan ilman yhteenvetoa.",
        "selfredirect": "<strong>Varoitus:</strong> Olet tekemässä uudelleenohjausta, joka johtaa tästä sivusta tähän samaan sivuun. \n\nOlet ehkä määrittänyt ohjauksen kohteen väärin tai kenties muokkaat parhaillaan väärää sivua.\n\nJos painat toimintoa \"{{int:savearticle}}\" uudestaan, tämä ohjaussivu luodaan joka tapauksessa.",
        "missingcommenttext": "Kirjoita viesti alle.",
-       "missingcommentheader": "Et ole antanut otsikkoa kommentillesi. Napsauta ”{{int:savearticle}}”, jos et halua antaa otsikkoa.",
+       "missingcommentheader": "<strong>Muistutus:</strong> Et ole antanut aiheotsikkoa tälle kommentille. Napsauta ”{{int:savearticle}}”, jos haluat tallentaa kommenttisi ilman sellaista.",
        "summary-preview": "Yhteenvedon esikatselu:",
-       "subject-preview": "Otsikon esikatselu:",
+       "subject-preview": "Aiheotsikon esikatselu:",
        "previewerrortext": "Muokkaustesi esikatselun toteuttamisessa on tapahtunut virhe.",
        "blockedtitle": "Käyttäjä on estetty",
        "blockedtext": "'''Käyttäjätunnuksesi tai IP-osoitteesi on estetty.'''\n\nEston on asettanut $1.\nSyy: '''$2'''\n\n* Eston alkamisaika: $8\n* Eston päättymisaika: $6\n* Kohde: $7\n\nVoit keskustella ylläpitäjän $1 tai toisen [[{{MediaWiki:Grouppage-sysop}}|ylläpitäjän]] kanssa estosta.\nHuomaa, ettet voi lähettää sähköpostia {{GRAMMAR:genitive|{{SITENAME}}}} kautta, ellet ole asettanut olemassa olevaa sähköpostiosoitetta [[Special:Preferences|asetuksissa]] tai jos esto on asetettu koskemaan myös sähköpostin lähettämistä.\nIP-osoitteesi on $3 ja estotunnus on #$5.\nLiitä kaikki yllä olevat tiedot mahdollisiin kyselyihisi.",
        "mw-widgets-dateinput-placeholder-day": "VVVV-KK-PP",
        "mw-widgets-dateinput-placeholder-month": "VVVV-KK",
        "mw-widgets-titleinput-description-new-page": "sivua ei ole olemassa vielä",
-       "mw-widgets-titleinput-description-redirect": "ohjaus kohteeseen $1"
+       "mw-widgets-titleinput-description-redirect": "ohjaus kohteeseen $1",
+       "api-error-blacklisted": "Valitse toinen, kuvaava nimi."
 }
index 52b959b..ce67f3e 100644 (file)
        "expand_templates_preview": "Forskoðan",
        "mw-widgets-dateinput-placeholder-day": "ÁÁÁÁ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "ÁÁÁÁ-MM",
-       "mw-widgets-titleinput-description-new-page": "síðan er ikki til enn"
+       "mw-widgets-titleinput-description-new-page": "síðan er ikki til enn",
+       "api-error-blacklisted": "Vinarliga vel ein annarleiðis tittul, sum lýsir fíluna betri."
 }
index 9731f4c..d00a80b 100644 (file)
        "passwordreset-emailsent-capture": "Un courriel de réinitialisation de mot de passe a été envoyé, qui est affiché ci-dessous.",
        "passwordreset-emailerror-capture": "Un courriel de réinitialisation de mot de passe a été généré, qui est affiché ci-dessous, mais l'envoi à l'{{GENDER:$2|utilisateur|utilisatrice}} a échoué : $1",
        "changeemail": "Changer ou supprimer l’adresse de courriel",
-       "changeemail-header": "Changer l’adresse de courriel du compte",
+       "changeemail-header": "Complétez ce formulaire pour modifier votre adresse de courriel. Si vous voulez supprimer l’association d’une adresse de courriel avec votre compte, laissez la nouvelle adresse de courriel vide lors de la soumission du formulaire.",
+       "changeemail-passwordrequired": "Vous devrez saisir votre mot de passe pour confirmer cette modification.",
        "changeemail-no-info": "Vous devez être connecté pour pouvoir accéder directement à cette page.",
        "changeemail-oldemail": "Adresse de courriel actuelle :",
        "changeemail-newemail": "Nouvelle adresse de courriel :",
        "sig_tip": "Votre signature avec la date",
        "hr_tip": "Ligne horizontale (ne pas en abuser)",
        "summary": "Résumé :",
-       "subject": "Sujet / titre :",
+       "subject": "Sujet :",
        "minoredit": "Modification mineure",
        "watchthis": "Suivre cette page",
        "savearticle": "Enregistrer",
        "missingsummary": "'''Rappel :''' vous n'avez pas encore fourni le résumé de votre modification.\nSi vous cliquez de nouveau sur le bouton « {{int:savearticle}} », la publication sera faite sans nouvel avertissement.",
        "selfredirect": "<strong>Attention :</strong> Vous êtes en train de rediriger la page vers elle-même.\nVous pouvez avoir spécifié la mauvaise cible pour la redirection, ou vous modifiez peut-être la mauvaise page.\nSi vous cliquez de nouveau sur « {{int:savearticle}} », la redirection sera créée tout de même.",
        "missingcommenttext": "Veuillez entrer un commentaire ci-dessous.",
-       "missingcommentheader": "'''Rappel :''' vous n'avez pas fourni de sujet ou de titre à ce commentaire.\nSi vous cliquez de nouveau sur « {{int:Savearticle}} », votre modification sera enregistrée sans titre.",
+       "missingcommentheader": "<strong>Rappel :</strong> Vous n’avez pas fourni de sujet pour ce commentaire.\nSi vous cliquez de nouveau sur « {{int:Savearticle}} », votre modification sera enregistrée sans sujet.",
        "summary-preview": "Aperçu du résumé :",
-       "subject-preview": "Prévisualisation du sujet/titre :",
+       "subject-preview": "Aperçu du sujet :",
        "previewerrortext": "Une erreur s’est produite lors de la tentative de prévisualisation de vos modifications.",
        "blockedtitle": "L’utilisateur est bloqué.",
        "blockedtext": "'''Votre compte utilisateur ou votre adresse IP a été bloqué.'''\n\nLe blocage a été effectué par $1.\nLa raison invoquée est la suivante : ''$2''.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7.\n\nVous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrateur]] pour en discuter.\nVous ne pouvez utiliser la fonction « {{int:emailuser}} » que si une adresse de courriel valide est spécifiée dans vos [[Special:Preferences|préférences]] et que si cette fonctionnalité n’a pas été bloquée.\nVotre adresse IP actuelle est $3 et votre identifiant de blocage est $5.\nVeuillez préciser ces indications dans toutes les requêtes que vous ferez.",
        "svg-long-error": "Fichier SVG non valide: $1",
        "show-big-image": "Fichier d'origine",
        "show-big-image-preview": "Taille de cet aperçu : $1.",
+       "show-big-image-preview-differ": "Taille de cet aperçu $3 de ce fichier $2 : $1.",
        "show-big-image-other": "{{PLURAL:$2|Autre résolution|Autres résolutions}} : $1.",
        "show-big-image-size": "$1 × $2 pixels",
        "file-info-gif-looped": "en boucle",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-JJ",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "la page n’existe pas encore",
-       "mw-widgets-titleinput-description-redirect": "redirection vers $1"
+       "mw-widgets-titleinput-description-redirect": "redirection vers $1",
+       "api-error-blacklisted": "Merci de choisir un autre titre descriptif."
 }
index b101045..081306a 100644 (file)
        "special-characters-title-emdash": "terèt èm",
        "special-characters-title-minus": "segno muens",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-JJ",
-       "mw-widgets-dateinput-placeholder-month": "AAAA-MM"
+       "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "api-error-blacklisted": "Volyéd chouèsir un ôtro titro dèscriptif."
 }
index de60d04..ae63bc4 100644 (file)
        "passwordreset-emailsent-capture": "Enviouse un correo electrónico de restablecemento do contrasinal, mostrado a continuación.",
        "passwordreset-emailerror-capture": "Xerouse un correo electrónico de restablecemento do contrasinal, mostrado a continuación, pero o envío {{GENDER:$2|ao usuario|á usuaria}} fallou: $1",
        "changeemail": "Cambiar ou eliminar o enderezo de correo electrónico",
-       "changeemail-header": "Cambiar o enderezo de correo electrónico da conta",
+       "changeemail-header": "Encha este formulario para cambiar o seu enderezo de correo electrónico. Se vostede quere eliminar a asociación da dirección de correo electrónico da súa conta, deixe en branco a nova dirección de correo electrónico cando envíe o formulario.",
+       "changeemail-passwordrequired": "Terá que escribir o seu contrasinal para confirmar este cambio.",
        "changeemail-no-info": "Debe rexistrarse para acceder directamente a esta páxina.",
        "changeemail-oldemail": "Enderezo de correo electrónico actual:",
        "changeemail-newemail": "Novo enderezo de correo electrónico:",
        "sig_tip": "A súa sinatura con data e hora",
        "hr_tip": "Liña horizontal (úsea con moderación)",
        "summary": "Resumo:",
-       "subject": "Asunto/título:",
+       "subject": "Asunto:",
        "minoredit": "Esta é unha edición pequena",
        "watchthis": "Vixiar esta páxina",
        "savearticle": "Gardar a páxina",
        "missingsummary": "'''Aviso:''' Esqueceu incluír o texto do campo resumo.\nSe preme en \"{{int:savearticle}}\" a súa edición gardarase sen ningunha descrición da edición.",
        "selfredirect": "<strong>Atención:</strong> Está redirecionando esta páxina a ela mesma. Vostede pode ter especificado a páxina incorrecta para a redireción, ou pode que estea a editar a páxina incorrecta. Se preme \"{{int:savearticle}}\" de novo, crearase a redireción de tódolos xeitos.",
        "missingcommenttext": "Por favor, escriba un comentario a continuación.",
-       "missingcommentheader": "'''Aviso:''' Non escribiu ningún texto no asunto/título deste comentario.\nSe preme sobre \"{{int:savearticle}}\", a súa edición gardarase sen el.",
+       "missingcommentheader": "<strong>Aviso:</strong> Non escribiu ningún texto no asunto deste comentario.\nSe preme sobre \"{{int:savearticle}}\", a súa edición gardarase sen el.",
        "summary-preview": "Vista previa do resumo:",
-       "subject-preview": "Vista previa do asunto/título:",
+       "subject-preview": "Vista previa do asunto:",
        "previewerrortext": "Houbo un erro ó tentar previsualizar os cambios.",
        "blockedtitle": "O usuario está bloqueado",
        "blockedtext": "'''O seu nome de usuario ou enderezo IP foi bloqueado.'''\n\nO bloqueo foi realizado por $1.\nA razón que deu foi ''$2''.\n\n* Inicio do bloqueo: $8\n* Caducidade do bloqueo: $6\n* Pretendeuse bloquear: $7\n\nPode contactar con $1 ou con calquera outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir este bloqueo.\nNon pode empregar a característica \"Enviar un correo electrónico a este usuario\" a non ser que dispoña dun enderezo electrónico válido rexistrado nas súas [[Special:Preferences|preferencias de usuario]] e que o seu uso non fose bloqueado.\nO seu enderezo IP actual é $3 e o ID do bloqueo é #$5.\nPor favor, inclúa eses datos nas consultas que faga.",
        "foreign-structured-upload-form-label-own-work": "Isto é o meu propio traballo",
        "foreign-structured-upload-form-label-infoform-categories": "Categorías",
        "foreign-structured-upload-form-label-infoform-date": "Data",
+       "foreign-structured-upload-form-label-own-work-message-local": "Confirmo que estou a cargar este ficheiro seguindo os termos de uso e políticas de licenza de {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Quizais tamén queira probar [[Special:Upload|a páxina predeterminada de subidas]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Comprendo que estou a cargar este ficheiro nun repositorio compartido. Confirmo que fago isto seguindo os termos de uso e políticas de licenza existentes alí.",
        "backend-fail-stream": "Non se puido transmitir o ficheiro \"$1\".",
        "backend-fail-backup": "Non se puido facer unha copia de seguridade do ficheiro \"$1\".",
        "backend-fail-notexists": "O ficheiro \"$1\" non existe.",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "a páxina aínda non existe",
-       "mw-widgets-titleinput-description-redirect": "redirección cara a $1"
+       "mw-widgets-titleinput-description-redirect": "redirección cara a $1",
+       "api-error-blacklisted": "Escolla un título diferente e descritivo."
 }
index bc83861..a019dba 100644 (file)
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-TT",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "d Syte git’s no nid",
-       "mw-widgets-titleinput-description-redirect": "Wyterleitig uf $1"
+       "mw-widgets-titleinput-description-redirect": "Wyterleitig uf $1",
+       "api-error-blacklisted": "Bitte due en andre, ussagechräftigere Titel usswääle."
 }
index 1e463ae..773448b 100644 (file)
        "nstab-template": "ઢાંચો",
        "nstab-help": "મદદનું પાનું",
        "nstab-category": "શ્રેણી",
+       "mainpage-nstab": "મુખપૃષ્ઠ",
        "nosuchaction": "આવી કોઇ ક્રિયા નથી",
        "nosuchactiontext": "આ URL દ્વારા દર્શાવેલી ક્રિયા અયોગ્ય છે.\nતમે કદાચ ખોટો URL છાપ્યો હશે અથવા ખોટી કડીથી અહીં આવ્યા હશો.\nતમે સોફ્ટવેરની આ ખામી {{SITENAME}} પર દર્શાવી શકો છો.",
        "nosuchspecialpage": "એવું ખાસ પાનું નથી",
        "passwordreset-emailsent-capture": "પાસવર્ડ બદલવાનો ઇમેલ મોકલવામાં આવ્યો છે, જે નીચે પ્રમાણે છે.",
        "passwordreset-emailerror-capture": "પાસવર્ડ ફરી ગોઠવવા માટેનો ઇમેલ બનાવવામાં આવ્યો છે, જે નીચે પ્રમાણે છે, પરંતુ તે {{GENDER:$2|સભ્ય}}ને મોકલવામાં નિષ્ફળ થયો છે: $1",
        "changeemail": "ઇમેલ સરનામું બદલો",
-       "changeemail-text": "તમારું ઈ-મેઈલ સરનામું બદલવા માટે આ ફોર્મ ભરો. આ ફેરફાર કાયમ કરવા માટે તમારે પાસવર્ડ ભરવાની જરૂર પડશે.",
+       "changeemail-header": "તમારા ખાતાનું ઇમેલ સરનામું બદલો",
        "changeemail-no-info": "બારોબાર આ પાનું જોવા માટે પ્રવેશ કરવો આવશ્યક છે.",
        "changeemail-oldemail": "હાલનું ઈમેલ સરનામું:",
        "changeemail-newemail": "નવું ઈમેલ સરનામું:",
        "special-characters-group-thai": "થાઈ",
        "special-characters-group-lao": "લાઓ",
        "special-characters-group-khmer": "ખ્મેર",
-       "mw-widgets-titleinput-description-new-page": "પાનું અસ્તિત્વ ધરાવતું નથી."
+       "mw-widgets-titleinput-description-new-page": "પાનું અસ્તિત્વ ધરાવતું નથી.",
+       "api-error-blacklisted": "મહેરબાની કરી વધુ વિસ્તૃત અર્થ સભર શીર્ષક આપો."
 }
index 6e2247b..366e73c 100644 (file)
        "svg-long-desc-animated": "קובץ SVG מונפש, הגודל המקורי: <span dir=\"ltr\">$1 × $2</span> פיקסלים, גודל הקובץ: $3",
        "svg-long-error": "קובץ SVG לא תקין: $1",
        "show-big-image": "לקובץ המקורי",
-       "show-big-image-preview": "גודל תצוגה זו: $1.",
+       "show-big-image-preview": "גודל התצוגה המקדימה הזאת: $1.",
+       "show-big-image-preview-differ": "גודל התצוגה המקדימה הזאת מסוג $3 של קובץ ה־$2 הזה: $1.",
        "show-big-image-other": "{{PLURAL:$2|רזולוציה אחרת|רזולוציות אחרות}}: $1.",
        "show-big-image-size": "<span dir=\"ltr\">$1 × $2</span> פיקסלים",
        "file-info-gif-looped": "בלולאה",
        "special-characters-title-minus": "מינוס",
        "mw-widgets-dateinput-no-date": "לא נבחר תאריך",
        "mw-widgets-titleinput-description-new-page": "הדף עדיין לא קיים",
-       "mw-widgets-titleinput-description-redirect": "הפניה ל{{GRAMMAR:תחילית|$1}}"
+       "mw-widgets-titleinput-description-redirect": "הפניה ל{{GRAMMAR:תחילית|$1}}",
+       "api-error-blacklisted": "נא לבחור כותרת שונה, מתארת יותר."
 }
index f9dcaba..8630a02 100644 (file)
        "shown-title": "Prikaži $1 {{PLURAL:$1|rezultat|rezultata|rezultata}} po stranici",
        "viewprevnext": "Vidi ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "* Stranica '''[[$1]]'''",
-       "searchmenu-new": "<strong>Napravite stranicu \"[[:$1]]\" na ovom wiki projektu!</strong>\n{{PLURAL:$2|0=|Cm. i stranica koje se nalaze u rezultatima vaših pretraživanja.|Cm. također su pronađeni rezultati pretraživanja.}}",
+       "searchmenu-new": "<strong>Napravite stranicu \"[[:$1]]\" na ovom wiki projektu!</strong>\n{{PLURAL:$2|0=|Pogledajte i stranicu pronađenu pretragom.|Pogledajte i druge rezultate pretrage.}}",
        "searchprofile-articles": "Stranice sa sadržajem",
        "searchprofile-images": "Multimedija",
        "searchprofile-everything": "Sve",
index 8c01de8..0c8cc3a 100644 (file)
        "special-characters-title-emdash": "dołha ležaca smužka",
        "special-characters-title-minus": "minusowe znamješko",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-TT",
-       "mw-widgets-dateinput-placeholder-month": "JJJJ-MM"
+       "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
+       "api-error-blacklisted": "Prošu wubjer druhi, wuprajiwy titul."
 }
index bde8353..082562c 100644 (file)
        "mw-widgets-dateinput-placeholder-day": "ÉÉÉÉ-HH-NN",
        "mw-widgets-dateinput-placeholder-month": "ÉÉÉÉ-HH",
        "mw-widgets-titleinput-description-new-page": "a lap még nem létezik",
-       "mw-widgets-titleinput-description-redirect": "átirányítás ide: $1"
+       "mw-widgets-titleinput-description-redirect": "átirányítás ide: $1",
+       "api-error-blacklisted": "Válasszon egy másik, leíró címet."
 }
index 7ac7837..5f52a54 100644 (file)
        "passwordreset-emailsent-capture": "Un message de e-mail pro le reinitialisation del contrasigno ha essite inviate; iste message es monstrate hic infra.",
        "passwordreset-emailerror-capture": "Un e-mail pro le reinitialisation del contrasigno ha essite generate; iste message es monstrate hic infra, ma le invio al {{GENDER:$2|usator}} ha fallite: $1",
        "changeemail": "Cambiar o remover adresse de e-mail",
-       "changeemail-header": "Cambiar le adresse de e-mail del conto",
+       "changeemail-header": "Completa iste formulario pro cambiar tu adresse de e-mail. Si tu vole remover le association de omne adresse de e-mail ab tu conto, lassa le campo pro le nove adresse de e-mail vacue quando tu submitte le formulario.",
+       "changeemail-passwordrequired": "Essera necessari entrar tu contrasigno pro confirmar iste cambiamento.",
        "changeemail-no-info": "Tu debe aperir un session pro poter acceder directemente a iste pagina.",
        "changeemail-oldemail": "Adresse de e-mail actual:",
        "changeemail-newemail": "Adresse de e-mail nove:",
        "sig_tip": "Tu signatura con data e hora",
        "hr_tip": "Linea horizontal (usa con moderation)",
        "summary": "Summario:",
-       "subject": "Subjecto/titulo:",
+       "subject": "Subjecto:",
        "minoredit": "Isto es un modification minor",
        "watchthis": "Observar iste pagina",
        "savearticle": "Publicar pagina",
        "missingsummary": "'''Rememoration:''' Tu non ha specificate un summario del modification.\nSi tu clicca super \"{{int:savearticle}}\" de novo, le modification essera publicate sin summario.",
        "selfredirect": "<strong>Attention:</strong> Tu redirige iste pagina verso se mesme.\nTu pote haber specificate le mal destination pro le redirection, o tu modifica forsan le mal pagina.\nSi tu clicca sur \"{{int:savearticle}}\" de novo, le redirection essera create in despecto de isto.",
        "missingcommenttext": "Per favor entra un commento infra.",
-       "missingcommentheader": "'''Rememoration:''' Tu non ha specificate un subjecto/titulo pro iste commento.\nSi tu clicca super \"{{int:savearticle}}\" de novo, le modification essera publicate sin titulo.",
+       "missingcommentheader": "<strong>Rememoration:</strong> Tu non ha fornite un subjecto pro iste commento.\nSi tu clicca super \"{{int:savearticle}}\" de novo, le modification essera publicate sin subjecto.",
        "summary-preview": "Previsualisation del summario:",
-       "subject-preview": "Previsualisation del subjecto/titulo:",
+       "subject-preview": "Previsualisation del subjecto:",
        "previewerrortext": "Un error ha occurrite durante le tentativa de previsualisar le cambiamentos.",
        "blockedtitle": "Le usator es blocate",
        "blockedtext": "'''Tu nomine de usator o adresse IP ha essite blocate.'''\n\nLe blocada esseva facite per $1.\nLe motivo presentate es ''$2''.\n\n* Initio del blocada: $8\n* Expiration del blocada: $6\n* Le blocato intendite: $7\n\nTu pote contactar $1 o un altere [[{{MediaWiki:Grouppage-sysop}}|administrator]] pro discuter le blocada.\nTu non pote usar le function 'inviar e-mail a iste usator' salvo que un adresse de e-mail valide es specificate in le\n[[Special:Preferences|preferentias de tu conto]] e que tu non ha essite blocate de usar lo.\nTu adresse IP actual es $3, e le ID del blocada es #$5.\nPer favor include tote le detalios supra specificate in omne correspondentia.",
        "svg-long-error": "File SVG invalide: $1",
        "show-big-image": "File original",
        "show-big-image-preview": " Dimension de iste previsualisation: $1.",
+       "show-big-image-preview-differ": "Dimension de iste previsualisation $3 de iste file $2: $1.",
        "show-big-image-other": "Altere {{PLURAL:$2|resolution|resolutiones}}: $1.",
        "show-big-image-size": "$1 × $2 pixels",
        "file-info-gif-looped": "repetente",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "pagina non existe ancora",
-       "mw-widgets-titleinput-description-redirect": "redirection a $1"
+       "mw-widgets-titleinput-description-redirect": "redirection a $1",
+       "api-error-blacklisted": "Per favor elige un altere titulo, plus descriptive."
 }
index 6a97e39..e623de5 100644 (file)
        "special-characters-title-emdash": "em dash",
        "special-characters-title-minus": "tanda kurang",
        "mw-widgets-dateinput-placeholder-day": "TTTT-BB-HH",
-       "mw-widgets-dateinput-placeholder-month": "TTTT-BB"
+       "mw-widgets-dateinput-placeholder-month": "TTTT-BB",
+       "api-error-blacklisted": "Pilih judul lain yang deskriptif"
 }
index d6b73b5..5d1fd88 100644 (file)
        "mw-widgets-dateinput-placeholder-day": "TTTT-BB-AA",
        "mw-widgets-dateinput-placeholder-month": "TTTT-BB",
        "mw-widgets-titleinput-description-new-page": "awan pay ti panid",
-       "mw-widgets-titleinput-description-redirect": "ibaw-ing iti $1"
+       "mw-widgets-titleinput-description-redirect": "ibaw-ing iti $1",
+       "api-error-blacklisted": "Pangngaasi nga agpili iti sabali, a mangipalpalawag a titulo."
 }
index 8958882..adfe655 100644 (file)
        "shown-title": "Sýna $1 {{PLURAL:$1|niðurstöðu|niðurstöður}} á hverri síðu",
        "viewprevnext": "Skoða ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Það er síða að nafni „[[:$1]]“ á þessum wiki'''",
-       "searchmenu-new": "<strong>Skapaðu síðuna \"[[:$1]]\" á þessum wiki!<strong>\nSjá einnig {{PLURAL:$2|0=|leitarniðurstöðuna|leitarniðurstöðurnar}}.",
+       "searchmenu-new": "<strong>Skapaðu síðuna „[[:$1]]“ á þessum wiki!<strong>\nSjá einnig {{PLURAL:$2|0=|leitarniðurstöðuna|leitarniðurstöðurnar}}.",
        "searchprofile-articles": "Efnissíður",
        "searchprofile-images": "Margmiðlanir",
        "searchprofile-everything": "Allt",
        "special-characters-group-thai": "Taílenskt",
        "special-characters-group-lao": "Laoskt",
        "mw-widgets-titleinput-description-new-page": "síðan er ekki enn til",
-       "mw-widgets-titleinput-description-redirect": "tilvísun á $1"
+       "mw-widgets-titleinput-description-redirect": "tilvísun á $1",
+       "api-error-blacklisted": "Vinsamlegast veldu annað lýsandi skráarnafn"
 }
index c2f8bf0..b8deaf7 100644 (file)
        "svg-long-error": "File SVG non valido: $1",
        "show-big-image": "File originale",
        "show-big-image-preview": "Dimensioni di questa anteprima: $1.",
+       "show-big-image-preview-differ": "Dimensioni di questa anteprima $3 per questo file $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Altra risoluzione|Altre risoluzioni}}: $1.",
        "show-big-image-size": "$1 × $2 pixel",
        "file-info-gif-looped": "ciclico",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-GG",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "questa pagina non esiste ancora",
-       "mw-widgets-titleinput-description-redirect": "reindirizzamento a $1"
+       "mw-widgets-titleinput-description-redirect": "reindirizzamento a $1",
+       "api-error-blacklisted": "Per favore scegli un titolo diverso e descrittivo."
 }
index 4afbcc3..2368816 100644 (file)
        "recentchangeslinked-summary": "これは指定したページからリンクされている (または指定したカテゴリに含まれている) ページの最近の変更の一覧です。\n[[Special:Watchlist|自分のウォッチリスト]]にあるページは<strong>太字</strong>で表示されます。",
        "recentchangeslinked-page": "ページ名:",
        "recentchangeslinked-to": "このページへのリンク元での変更の表示に切り替え",
+       "recentchanges-page-added-to-category": "[[:$1]] カテゴリに追加",
+       "recentchanges-page-removed-from-category": "[[:$1]] カテゴリから削除",
        "autochange-username": "メディアウィキ自動変更",
        "upload": "ファイルをアップロード",
        "uploadbtn": "ファイルをアップロード",
        "exif-sharpness": "撮影シャープネス",
        "exif-devicesettingdescription": "撮影条件記述情報",
        "exif-subjectdistancerange": "被写体距離レンジ",
-       "exif-imageuniqueid": "画像ユニークID",
+       "exif-imageuniqueid": "ユニーク画像ID",
        "exif-gpsversionid": "GPSタグのバージョン",
        "exif-gpslatituderef": "北緯/南緯",
        "exif-gpslatitude": "緯度",
        "special-characters-title-minus": "マイナス記号",
        "mw-widgets-dateinput-no-date": "選択されたデータ無し",
        "mw-widgets-titleinput-description-new-page": "ページは存在しません",
-       "mw-widgets-titleinput-description-redirect": "$1 へのリダイレクト"
+       "mw-widgets-titleinput-description-redirect": "$1 へのリダイレクト",
+       "api-error-blacklisted": "他の、説明的なタイトルをお選びください。"
 }
index 19f82a1..0b8abff 100644 (file)
        "special-characters-group-devanagari": "Dewanagari",
        "special-characters-group-thai": "Thailand",
        "special-characters-group-lao": "Lao",
-       "special-characters-group-khmer": "Khmer"
+       "special-characters-group-khmer": "Khmer",
+       "api-error-blacklisted": "Mangga pilih judhul liya sing njelasaké"
 }
index 844cfea..5c3199e 100644 (file)
        "mw-widgets-dateinput-placeholder-day": "წწწწ-თთ-დდ",
        "mw-widgets-dateinput-placeholder-month": "წწწწ-თთ",
        "mw-widgets-titleinput-description-new-page": "გვერდი ჯერ არ არსებობს",
-       "mw-widgets-titleinput-description-redirect": "გადამისამართება $1-ზე"
+       "mw-widgets-titleinput-description-redirect": "გადამისამართება $1-ზე",
+       "api-error-blacklisted": "გთხოვთ, აირჩიეთ სხვა, აღწერილობითი სათაური."
 }
index 51105ea..049cc74 100644 (file)
        "createacct-captcha": "Құпиялық тексеруі",
        "createacct-imgcaptcha-ph": "Жоғарыдағы мәтінді енгізіңіз",
        "createacct-submit": "Тіркелгіңізді жасаңыз",
-       "createacct-another-submit": "Ð\91аÑ\81Ò\9bа Ñ\82іркелгі жасау",
+       "createacct-another-submit": "Тіркелгі жасау",
        "createacct-benefit-heading": "{{SITENAME}} сіздермен жасалады.",
        "createacct-benefit-body1": "{{PLURAL:$1|өңдеме|өңдеме}}",
        "createacct-benefit-body2": "{{PLURAL:$1|бет|бет}}",
        "passwordreset-emailsent": "Құпия сөзді өзгерту электронды пошта арқылы жөнелтілді.",
        "passwordreset-emailsent-capture": "Құпия сөзді өзгерту электронды пошта арқылы жөнелтілді, ол төменде көрсетілген.",
        "passwordreset-emailerror-capture": "Құпиясөзді өзгерту электрон хаты жасалды, ол төменде көрсетілген, бірақ ол {{GENDER:$2|қатысушыға}} жөнелтілмеді: $1",
-       "changeemail": "Е-пошта мекен-жайын өзгерту",
+       "changeemail": "Е-пошта мекенжайын өзгерту немесе аластау",
        "changeemail-header": "Е-пошта мекен-жайының өзгертілуі",
        "changeemail-no-info": "Бұл бетке тікелей ену үшін жүйеге кіруіңіз керек.",
        "changeemail-oldemail": "Е-поштаның қазіргі уақыттағы мекен-жайы:",
        "sig_tip": "Қолтаңбаңыз және уақыт белгісі",
        "hr_tip": "Көлденең сызық (үнемді қолданыңыз)",
        "summary": "Түйіндемесі:",
-       "subject": "Тақырыбы/бас жолы:",
+       "subject": "Тақырыбы:",
        "minoredit": "Бұл шағын өңдеме",
        "watchthis": "Бұл бетті бақылау",
        "savearticle": "Бетті сақтау",
        "missingsummary": "<strong>Ескерту:</strong> Өңдеменің қысқаша түйіндемесін енгізбепсіз.\n«{{int:savearticle}}» батырмасын қайта бассаңыз өңдемеңіз түйіндемесіз сақталады.",
        "selfredirect": "<strong>Ескерту:</strong> Сіз бұл бетті өзіне бағыттадыңыз.\nСіз бағыттау үшін қате нысана көрсеттіңіз не қате бетті өңдеген болуыңыз мүмкін.\nЕгер «{{int:savearticle}}» дегенді қайта бассаңыз, бағыттау қалайда басталады.",
        "missingcommenttext": "Пікіріңізді төменге енгізіңіз.",
-       "missingcommentheader": "<strong>Ð\95Ñ\81кеÑ\80Ñ\82Ñ\83:</strong> Ð\91ұл Ð¿Ñ\96кÑ\96Ñ\80ге Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bпÑ\8b/баÑ\81 Ð¶Ð¾Ð»Ñ\8b жазбапсыз.\n«{{int:savearticle}}» түймесін тағы бассаңыз өңдемеңіз түйіндемесіз сақталады.",
+       "missingcommentheader": "<strong>Ð\95Ñ\81кеÑ\80Ñ\82Ñ\83:</strong> Ð\91ұл Ð¿Ñ\96кÑ\96Ñ\80ге Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bбÑ\8bн жазбапсыз.\n«{{int:savearticle}}» түймесін тағы бассаңыз өңдемеңіз түйіндемесіз сақталады.",
        "summary-preview": "Қысқаша түйіндемесін қарап шығу:",
-       "subject-preview": "Тақырыбын/бас жолын қарап шығу:",
+       "subject-preview": "Тақырыбын қарап шығу:",
        "previewerrortext": "Өзгерістеріңізді қарап шығу талпынысыңыз кезінде қате кездесті.",
        "blockedtitle": "Қатысушы бұғатталған",
        "blockedtext": "<strong>Қатысушы атыңыз не IP мекенжайыңыз бұғатталған.</strong>\n\n$1 деген әкімші бұғаттаған. \nКелтірілген себебі: <em>$2</em>.\n\n* Бұғаттаған кезі: $8\n* Бұғаттаудың бітетін кезі: $6\n* Бұғаттау нысанасы: $7\n\nОсы бұғаттауды талқылау үшін $1 не өзге [[{{MediaWiki:Grouppage-sysop}}|әкімшімен]] байланыса аласыз.\n[[Special:Preferences|Тіркелгі бапталымдары]]ңызда жарамды е-пошта мекенжайын көрсетіп және де оны пайдаланудан бұғатталмаған жағдайда ғана «Қатысушыға хат жазу» қызметін қолдана аласыз.\nАғымдық IP мекенжайыңыз: $3, бұғатау нөмірі: #$5.\nСұраным жасағанда осының екеуін де кірістіруіңізді сұраймыз.",
        "columns": "Бағандар:",
        "searchresultshead": "Іздеу",
        "stub-threshold": "<a href=\"#\" class=\"stub\">Бастама сілтемесін</a> пішімдеу табалдырығы (байт):",
+       "stub-threshold-sample-link": "қарапайым",
        "stub-threshold-disabled": "Ажыратылған",
        "recentchangesdays": "Жуықтағы өзгерістерде көрсетілетін күн саны:",
        "recentchangesdays-max": "Ең көбі $1 {{PLURAL:$1|күн|күн}}",
        "recentchangeslinked-summary": "Бұл тізімде өзіндік бетке сілтеген беттердегі (не өзіндік санат мүшелеріндегі) істелген жуықтағы өзгерістер беріледі.\n[[Special:Watchlist|Бақылау тізіміңіздегі]] беттер '''жуан''' болып белгіленеді.",
        "recentchangeslinked-page": "Бет атауы:",
        "recentchangeslinked-to": "Керісінше, келтірілген бетке сілтейтін беттердегі өзгерістерді көрсет",
+       "recentchanges-page-added-to-category": "[[:$1]] бетіне санат қосты",
        "upload": "Файл жүктеу",
        "uploadbtn": "Файлды жүктеу",
        "reuploaddesc": "Жүктеу пішініне қайта келу.",
        "upload-form-label-infoform-description": "Сипаттамасы",
        "upload-form-label-usage-title": "Қолданылуы",
        "upload-form-label-usage-filename": "Файл атауы",
+       "foreign-structured-upload-form-label-own-work": "Бұл менің өз туындым",
+       "foreign-structured-upload-form-label-infoform-categories": "Санаттар",
+       "foreign-structured-upload-form-label-infoform-date": "Ай-күні",
        "backend-fail-stream": "«$1» файлы ақпады.",
        "backend-fail-backup": "«$1» файлының сақтық есесі жасалмады.",
        "backend-fail-notexists": "$1 файлы бар емес.",
        "nopagetext": "Келтірілген нысана бетіңіз жоқ.",
        "pager-newer-n": "{{PLURAL:$1|жаңалау 1|жаңалау $1}}",
        "pager-older-n": "{{PLURAL:$1|ескілеу 1|ескілеу $1}}",
-       "suppress": "ШеÑ\82Ñ\82еÑ\82у",
+       "suppress": "Ð\96аÑ\81Ñ\8bÑ\80у",
        "querypage-disabled": "Бұл арнайы бет өнімділік себептері үшін өшірілген",
        "apihelp": "API бойынша анықтама",
        "apihelp-no-such-module": "«$1» модулі табылмады.",
        "booksources-text": "Төменде жаңа және қолданған кітаптар сататын тораптарының сілтемелері тізімделген және ізделген кітаптар туралы қосымша ақпарат болуы мүмкін:",
        "booksources-invalid-isbn": "Берілген ISBN жарамды болып көрінубеуі мүмкін; бастапқы қайнар көзінен еселеуде пайда болған қателерді тексеріңіз.",
        "specialloguserlabel": "Орындаушы:",
-       "speciallogtitlelabel": "Нысана (атауы немесе қатысушы):",
+       "speciallogtitlelabel": "Нысана (атауы немесе қатысушының {{ns:user}}:қатысушы есімі):",
        "log": "Журналдар",
        "all-logs-page": "Барлық журналдар",
        "alllogstext": "{{SITENAME}} жобасының барлық қатынаулы журналдарын біріктіріп көрсетуі.\nЖурнал түрін, қатысушы атын (үлкен кішілігін ескеріп), не тиісті бетін бөлектеп, тарылтып қарай аласыз (кейде үлкен кішілігін ескеріп).",
        "mw-widgets-dateinput-placeholder-day": "ЖЖЖЖ-АА-КК",
        "mw-widgets-dateinput-placeholder-month": "ЖЖЖЖ-АА",
        "mw-widgets-titleinput-description-new-page": "бет жоқ екен",
-       "mw-widgets-titleinput-description-redirect": "$1 дегенге бағыттату"
+       "mw-widgets-titleinput-description-redirect": "$1 дегенге бағыттату",
+       "api-error-blacklisted": "Өтініш, сипаттама атауының басқасын таңдаңыз."
 }
index e99c62f..90338d8 100644 (file)
        "passwordreset-emailsent-capture": "អ៊ីមែលស្ដារពាក្យសម្ងាត់មួយដូចបង្ហាញខាងក្រោមត្រូវបានផ្ញើទៅហើយ។",
        "passwordreset-emailerror-capture": "អ៊ីមែលស្ដារពាក្យសម្ងាត់មួយដូចបង្ហាញខាងក្រោមត្រូវបានបង្កើតហើយ ប៉ុន្តែការផ្ញើទៅកាន់ {{GENDER:$2|អ្នកប្រើប្រាស់}}មិនបានសំរេចទេ៖ $1",
        "changeemail": "ផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែល",
-       "changeemail-text": "សូមបំពេញសំនុំបែបបទនេះដើម្បីផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែលរបស់អ្នក។ អ្នកនឹងត្រូវបញ្ចូលពាក្យសម្ងាត់ដើម្បីអះអាងលើការផ្លាស់ប្ដូរនេះ។",
+       "changeemail-header": "ផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែលសំរាប់គណនីនេះ",
        "changeemail-no-info": "អ្នក​ចាំបាច់​ត្រូវតែ​កត់ឈ្មោះចូល ដើម្បី​ចូលទៅកាន់​ទំព័រ​នេះ​ដោយផ្ទាល់​។",
        "changeemail-oldemail": "អាសយដ្ឋានអ៊ីមែលបច្ចុប្បន្ន៖",
        "changeemail-newemail": "អាសយដ្ឋានអ៊ីមែលថ្មី៖",
        "special-characters-title-minus": "សញ្ញាដក",
        "mw-widgets-dateinput-no-date": "គ្មានកាលបរិច្ឆេទត្រូវបានជ្រើសរើស",
        "mw-widgets-titleinput-description-new-page": "ទំព័រមិនទាន់មាននៅឡើយទេ",
-       "mw-widgets-titleinput-description-redirect": "បញ្ជូនបន្តទៅ $1"
+       "mw-widgets-titleinput-description-redirect": "បញ្ជូនបន្តទៅ $1",
+       "api-error-blacklisted": "សូមជ្រើសរើសឈ្មោះផ្សេងដែលក្បោះក្បាយជាង។"
 }
index 27779f9..0bb2640 100644 (file)
        "logentry-tag-update-add-logentry": "$1 사용자가 $3 문서의 기록 항목 $5에 $6 {{PLURAL:$7|태그}}를 {{GENDER:$2|추가했습니다}}",
        "logentry-tag-update-remove-revision": "$1 사용자가 $3 문서의 $4판에서 $8 {{PLURAL:$9|태그}}를 {{GENDER:$2|제거했습니다}}",
        "logentry-tag-update-remove-logentry": "$1 사용자가 $3 문서의 기록 항목 $5에서 $8 {{PLURAL:$9|태그}}를 {{GENDER:$2|제거했습니다}}",
+       "logentry-tag-update-revision": "$1 사용자가 $3 문서의 $4 판에서 태그를 수정했습니다 ($6을(를) {{PLURAL:$7|추가함}}; $8을(를) {{PLURAL:$9|제거함}})",
        "rightsnone": "(없음)",
        "revdelete-summary": "편집 요약",
        "feedback-adding": "문서에 피드백을 올리는 중...",
        "special-characters-title-minus": "빼기 기호",
        "mw-widgets-dateinput-no-date": "선택된 날짜 없음",
        "mw-widgets-titleinput-description-new-page": "문서가 존재하지 않습니다",
-       "mw-widgets-titleinput-description-redirect": "$1 문서로 넘겨주기"
+       "mw-widgets-titleinput-description-redirect": "$1 문서로 넘겨주기",
+       "api-error-blacklisted": "이 파일을 설명할 수 있는 다른 제목을 선택하세요."
 }
index d4bd092..e24f877 100644 (file)
        "viewsource": "Wikitex aanluure",
        "viewsource-title": "Der Wikkitäx vun dä Sigg „$1“ belohre.",
        "actionthrottled": "Dat ka'mer nit esu öff maache",
-       "actionthrottledtext": "Dat darf mer nor en jeweße Zahl Mole hengerenander maache. Do bes jrad aan de Jrenz jekumme. Kannze jo en e paar Menutte widder probeere.",
+       "actionthrottledtext": "Dat darf mer nor en jeweße Zahl Mole hengerenander maache. Do bes jrahd aan de Jränz jekumme. Kannze jo en e paa Menutte wider probehre.",
        "protectedpagetext": "Di Sigg es jeschöz, un mer kann se nit änndere.",
        "viewsourcetext": "Heh es dä Sigg ier Wikitex zom Belooere un Koppeere.",
        "viewyourtext": "Mer kann de Quälle vun de eije Ännderonge aan heh dä Sigg beloore un kopeere.",
        "move-page-legend": "Sigg Ömnenne",
        "movepagetext": "Heh kanns De en Sigg ömnenne.\nDomet kritt di Sigg ene neue Name, un all vörherije Versione vun dä Sigg och.\nUnger däm ahle Tittel weed automatisch en Ömleidong op dä neue Tittel enjedrare.\n\nDo kannß dat Höksche säze domet Ömleidonge automattesch aanjepaß wääde, di op dä ahle Tittel zeije — dat weet ävver nur allmählesch pö a pö hengerher jemaat.\nLinks op dä ahle Tittel blieve ävver wi se wore, wann De dat Höksche nit säz.\nDat heiß, dann moß De selver nohluure, of do jäz [[Special:DoubleRedirects|dubbelde Ömleidonge]] udder [[Special:BrokenRedirects|kapodde Ömleiduoge]] bei eruskumme.\nWann De en Sigg ömnenne deis, häs Do och doför ze sorje, dat de betroffene Links do henjonn, wo se hen jonn solle.\nAlsu holl Der de Liss „Wat noh heh link“ fun dä Sigg heh un jangk se dorsch!\n\nDe Sigg weed '''nit''' ömjenannt, wann et met däm neue Name ald en Sigg jitt, '''ußer''' et es en Ömleidong un se es noch nie jeändert woode.\nEsu kam_mer en Sigg jlich widder zeröck ömbenänne, wam_mer sich bem Ömbenänne verdonn hät, un mer kann och kein Sigge kapottmaache, wo ald jet drop schteiht.\n\n'''Oppjepass!'''\nWat beim Ömnenne erus kütt, künnt en opfällije un villeisch stüürende Änderong aam Wiki sin, besönders bei öff jebruchte Sigge.\nAlsu bes secher, dat De verschteihs, wat De heh am maache bes, ih dat De et mähs!",
        "movepagetext-noredirectfixer": "Heh kanns De en Sigg ömnenne.\nDomet kritt di Sigg ene neue Nahme, un all vörherije Väsjohne vun dä Sigg och.\nOnger däm ahle Tittel weed automattesch en Ömleidong op dä neue Tittel enjedrare.\n\nLenks op dä ahle Tittel bliive ävver, wie se wohre.\nDat heiß, Do moß selver nohloore, ov doh jetz [[Special:DoubleRedirects|dubbelde]] oder [[Special:BrokenRedirects|kapodde Ömleidonge]] bei eruskumme.\nWann De en Sigg ömnenne deiß, häs Do och doför ze sorje, dat de betroffe Links doh henjonn, wo se hen jonn solle.\nAlsu holl Der di Liss „Wat noh heh link“ fun dä Sigg heh un jangk se dorsch!\n\nDi Sigg weed '''nit''' ömjenannt, wann et met däm neue Tittel ald en Sigg jitt, '''ußer''' doh es nix drop, oder et es en Ömleijdong un se es noch nie jeändert woode.\nEsu kam_mer en Sigg jlich widder retuur ömnänne, wam_mer sich mem Ömnänne verdonn hät, un mer kann och kein Sigge kapottmaache, wo ald jet drop schteiht.\n\n<strong>Oppjepaß!</strong>\nWat beim Ömnänne erus kütt, künnt en opfällije un velleijsch stührende Änderong aam Wikki sin, besönders bei öff jebruchte Sigge.\nAlsu bes secher, dat De verschteihs, wat De heh am maache bes, ih dat De et mähs!",
-       "movepagetalktext": "Dä Sigg ehr Klaafsigg, wann se ein hät, weed automatisch met  ömjenannt, '''usser''' wann:\n* de Sigg en en ander Appachtemeng kütt,\n* en Klaafsigg met däm neue Name ald do es, un et steiht och jet drop,\n* De unge en däm Kääsje '''kei''' Hökche aan häs.\nEn dänne Fäll, muss De Der dä Enhald vun dä Klaafsigge selvs vörnemme, un eröm kopeere watte bruchs.",
+       "movepagetalktext": "Wam_mer en däm Kääsje e Höhksche määt, weed heh di Sigg automattesch ömjenannd op di neuje Övverschreff, ußer wann en Klaafsigg met dä neuje Övverschrev ald do es, un et steiht och jet drop.\n\nEn dämm Fall mpß De Der dä Enhald vun dä Klaafsigge selvs vörnemme, un eröm kopeere wat De bruchs.",
        "moveuserpage-warning": "'''Opjepaß:''' Do wells en Metmaachersigg ömnänne, domet weed ävver dä Metmaacher sellver ''nit'' met ömjenannt.",
        "movecategorypage-warning": "<strong>Opjepaß:</strong> Do kanns bloß di Sigg vun dä Saachjropp ömbenänne. Sigge, di en dä ahle Saachjropp sin, blieve doh. Se kumme nit met en di neue Saachjropp.",
        "movenologintext": "Do mööts ald aanjemeldt un [[Special:UserLogin|enjelogg]] sin, öm en Sigg ömzenenne.",
        "svg-long-error": "En kapodde <i lang=\"en\">SVG</i>-Dattei: $1",
        "show-big-image": "Ojinaal-Dattei",
        "show-big-image-preview": "Heh di Vör_Aanseesch es $1 jruuß.",
+       "show-big-image-preview-differ": "Der Ömvang vun heh däm $3-Minnibeldsche vun dä Ojinahl $2-Datteij es: $1.",
        "show-big-image-other": "{{PLURAL:$2|Ander Oplühsung|Ander Oplühsunge|kein ander Oplühsunge}}: $1.",
        "show-big-image-size": "{{PLURAL:$1|Ei Pixel|$1 Pixelle}} breed × {{PLURAL:$2|Ei Pixel|$2 Pixelle}} huh",
        "file-info-gif-looped": "läuf emmer widder vun vürre",
        "special-characters-title-minus": "Et Winnijer-Zeische",
        "mw-widgets-dateinput-no-date": "Kein Dattom es ußjewählt",
        "mw-widgets-titleinput-description-new-page": "di Sigg jidd_et noch nit",
-       "mw-widgets-titleinput-description-redirect": "ömleijde op „$1“"
+       "mw-widgets-titleinput-description-redirect": "ömleijde op „$1“",
+       "api-error-blacklisted": "Söhk Der ene anndere Nahme uß, dä mih drövver säht."
 }
index 84892bf..d07d95a 100644 (file)
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "Säit gëtt et nach net",
-       "mw-widgets-titleinput-description-redirect": "viruleeden op $1"
+       "mw-widgets-titleinput-description-redirect": "viruleeden op $1",
+       "api-error-blacklisted": "Sicht w.e.g. en aneren Titel, deen méi iwwer de Sujet ausseet."
 }
index cb6e321..4cc3907 100644 (file)
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Cambodzjaans",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "JJJJ-MM"
+       "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
+       "api-error-blacklisted": "Kees 'nen angere, besjrievendje naam."
 }
index 7db32b5..67ff93b 100644 (file)
        "special-characters-title-minus": "minuso ženklas",
        "mw-widgets-dateinput-no-date": "Nepasirinkta data",
        "mw-widgets-titleinput-description-new-page": "puslapis dar neegzistuoja",
-       "mw-widgets-titleinput-description-redirect": "nukreipti į $1"
+       "mw-widgets-titleinput-description-redirect": "nukreipti į $1",
+       "api-error-blacklisted": "Prašome pasirinkti kitą, aprašomąją antraštę."
 }
index fa8e3aa..c56b3b6 100644 (file)
        "passwordreset-emailsent-capture": "Hriat nawntirna e-lehkha thawn a ni, a hnuaia tarlan ang khuan.",
        "passwordreset-emailerror-capture": "Hriat nawntirna e-lehkha siam chhuah a ni a, a hnuaia tarlan ang khuan; mahsé thawn hlawhchham a ni: $1",
        "changeemail": "E-chenhmun thlâk rawh",
-       "changeemail-text": "I e-chenhmun thlâk tùrin hei hi dahkhat vek rawh. I tihdanglam nemngheh nan i thurûk ziahluh i ngai ang.",
+       "changeemail-header": "Siangchan e-chenhmun thlâk rawh",
        "changeemail-no-info": "He phêk lut mai tùr chuan i inziahluh a ngai.",
        "changeemail-oldemail": "Tùna i e-chenhmun:",
        "changeemail-newemail": "E-chenhmun thar:",
        "move-page": "$1 hming thlâkna",
        "move-page-legend": "Phêk hming thlâkna",
        "movepagetext-noredirectfixer": "Hei hi phêk hming thlâkna a ni. A phêk chanchin-hlui zawng zawng pawh a sawn nghâl vek ang.\nA hming hlui kha hming thara hruailuhna phêkah chantir nghal a ni bawk dawn a ni.\n[[Special:DoubleRedirects|Hming thlâk nawn]] leh [[Special:BrokenRedirects|Hming thlâk chhumbung]] a awm loh nan fimkhur ang che.\nHe phêk hlui zawmtute a hmun dik taka hruailuh a nih leh nih lohvah mawh i phur ang.\n\nI hming thar vuah ang hmingpu dang phêk a awm tawh chuan he phêk hming i thlak tum hi a thlak theih loh vang, a ruak emaw, hruailuhna phêk a ni emaw, siamţhat a la ni lo emaw te a nih ngawt loh chuan.\nChumi awmzia chu, phêk awmsa i luahlantir thei lo va, mahsé a phêk hming hlui ngai i puttir leh thei thung tihna a ni.\n\n'''Vaukhanna!'''\nPhêk lar deuh tan chuan hei hi danglamna râpthlâk leh beisei loh tak i thlen thut thei tih hrechiang ang che;\nphêk hming thlâkina a nghawng theih thilte i hrechiang tih infiah ang che.",
-       "movearticle": "Phêk hming thlâk tùr:",
        "moveuserpage-warning": "'''Vaukhanna:''' Hmangtu phêk i thlak dawn mek. A hmangtu phêk i thlak ringawt ang a, hmangtu hming erawh i thlâk dawn lo tih hria ang che.",
        "movenologintext": "Phêk hming thlâk tùrin  [[Special:UserLogin|i (inziah)luh]] a ngai.",
        "movenotallowed": "Phêk sawn phalna i nei lo.",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
        "mw-widgets-dateinput-placeholder-day": "KKKK-TT-NN",
-       "mw-widgets-dateinput-placeholder-month": "KKKK-TT"
+       "mw-widgets-dateinput-placeholder-month": "KKKK-TT",
+       "api-error-blacklisted": "Hming dang, chiang zâwk deuh thlang hräm rawh le."
 }
index e93723b..b10cf28 100644 (file)
        "jumpto": "Pārlēkt uz:",
        "jumptonavigation": "navigācija",
        "jumptosearch": "meklēt",
-       "view-pool-error": "Atvainojiet, šobrīd serveri ir pārslogoti.\nPārāk daudz lietotāju mēģina apskatīt šo lapu.\nLūdzu, brīdi uzgaidiet un mēģiniet šo lapu apskatīt vēlreiz.\n\n$1",
+       "view-pool-error": "Atvainojiet, šobrīd serveri ir pārslogoti.\nPārāk daudz dalībnieku mēģina apskatīt šo lapu.\nLūdzu, brīdi uzgaidiet un mēģiniet šo lapu apskatīt vēlreiz.\n\n$1",
        "generic-pool-error": "Atvainojiet, šobrīd serveri ir pārslogoti.\nPārāk daudz lietotāju mēģina apskatīt šo lapu.\nLūdzu, brīdi uzgaidiet un mēģiniet šo lapu apskatīt vēlreiz.",
        "pool-timeout": "Noildze, gaidot bloķēšanu",
        "pool-errorunknown": "Nezināma kļūda",
        "createacct-captcha": "Drošības pārbaude",
        "createacct-imgcaptcha-ph": "Ievadiet tekstu, kuru jūs redzat augstāk",
        "createacct-submit": "Izveidot savu kontu",
-       "createacct-another-submit": "Izveidot citu lietotāja kontu",
+       "createacct-another-submit": "Izveidot citu dalībnieka kontu",
        "createacct-benefit-heading": "{{SITENAME}} darbojas ar tādu cilvēku kā Tu ieguldījumu.",
        "createacct-benefit-body1": "{{PLURAL:$1|labojumi|labojums|labojumi}}",
        "createacct-benefit-body2": "{{PLURAL:$1|lapas|lapa|lapas}}",
        "longpageerror": "'''Kļūda: Teksts, kuru tu mēģināji saglabāt, ir $1 kilobaitus garš, kas ir vairāk nekā pieļaujamie $2 kilobaiti.\nTas nevar tikt saglabāts.'''",
        "readonlywarning": "'''Brīdinājums: Datubāze ir slēgta apkopei, tāpēc tu tagad nevarēsi saglabāt veiktās izmaiņas.\nTu vari nokopēt tekstu un saglabāt kā teksta failu vēlākam laikam.'''\n\nAdmins, kas slēdza datubāzi, norādīja šādu paskaidrojumu: $1",
        "protectedpagewarning": "'''BRĪDINĀJUMS: Šī lapa ir aizsargāta, tikai lietotāji ar administratora privilēģijām var to izmainīt.'''\n\nPēdējais aizsargāšanas reģistra ieraksts ir apskatāms zemāk:",
-       "semiprotectedpagewarning": "'''Piezīme:''' Šī lapa ir aizsargāta, lai to varētu labot tikai reģistrēti lietotāji.\nPēdējais reģistra ieraksts ir apskatāms zemāk:",
+       "semiprotectedpagewarning": "'''Piezīme:''' Šī lapa ir aizsargāta, lai to varētu labot tikai reģistrēti dalībnieki.\nPēdējais reģistra ieraksts ir apskatāms zemāk:",
        "titleprotectedwarning": "'''Brīdinājums: Šī lapa ir slēgta un to var izveidot tikai [[Special:ListGroupRights|noteikti]] lietotāji.'''",
        "templatesused": "Šajā lapā {{PLURAL:$1|izmantotās veidnes|izmantotā veidne|izmantotās veidnes}}:",
        "templatesusedpreview": "Šajā pirmskatā {{PLURAL:$1|izmantotās veidnes|izmanotā veidne|izmantotās veidnes}}:",
        "pagehist": "Lapas vēsture",
        "deletedhist": "Dzēstā vēsture",
        "revdelete-modify-missing": "Kļūda, mainot vienumu ar ID $1: tas ir pazudis no datubāzes!",
-       "revdelete-reason-dropdown": "*Biežākie dzēšanas iemesli\n** autortiesību pārkāpums\n** nepiemērota personīgā informācija\n** nepiemērots lietotāja vārds\n** potenciāli apmelojoša informācija",
+       "revdelete-reason-dropdown": "*Biežākie dzēšanas iemesli\n** autortiesību pārkāpums\n** nepiemērota personīgā informācija\n** nepiemērots dalībnieka vārds\n** potenciāli apmelojoša informācija",
        "revdelete-otherreason": "Cits/papildu iemesls:",
        "revdelete-reasonotherlist": "Cits iemesls",
        "revdelete-edit-reasonlist": "Izmainīt dzēšanas iemeslus",
        "showhideselectedversions": "Rādīt/slēpt izvēlētās versijas",
        "editundo": "atcelt",
        "diff-empty": "(Nav atšķirību)",
-       "diff-multi-sameuser": "({{PLURAL:$1|$1 starpversijas|$1 starpversija|$1 starpversijas}}, ko mainījis viens lietotājs, nav {{PLURAL:$1|parādītas|parādīta|parādītas}})",
+       "diff-multi-sameuser": "({{PLURAL:$1|$1 starpversijas|$1 starpversija|$1 starpversijas}}, ko mainījis viens dalībnieks, nav {{PLURAL:$1|parādītas|parādīta|parādītas}})",
        "diff-multi-otherusers": "({{PLURAL:$1|$1 starpversijas|Viena starpversija|$1 starpversijas}}, ko {{PLURAL:$2|saglabājuši|saglabājis|saglabājuši}} {{PLURAL:$2|$2 lietotāji|viens cits lietotājs|$2 lietotāji}}, nav parādīta{{PLURAL:$1||s}})",
        "diff-multi-manyusers": "({{PLURAL:$1|$1 starpversijas|$1 starpversija|$1 starpversijas}}, ko saglabājuši vairāk nekā $2 {{PLURAL:$2|lietotāji|lietotājs|lietotāji}}, nav parādīta{{PLURAL:$1||s}})",
        "searchresults": "Meklēšanas rezultāti",
        "prefs-help-prefershttps": "Šie uzstādījumi stāsies spēkā nākamajā pievienošanās reizē.",
        "email-address-validity-valid": "E-pasta adrese šķiet derīga",
        "email-address-validity-invalid": "Ievadiet derīgu e-pasta adresi",
-       "userrights": "Lietotāju tiesību pārvaldība",
-       "userrights-lookup-user": "Pārvaldīt lietotāja grupas",
+       "userrights": "Dalībnieku tiesību pārvaldība",
+       "userrights-lookup-user": "Pārvaldīt dalībnieka grupas",
        "userrights-user-editname": "Ievadi lietotājvārdu:",
-       "editusergroup": "Izmainīt lietotāja grupas",
+       "editusergroup": "Izmainīt dalībnieka grupas",
        "editinguser": "Izmainīt lietotāja '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) statusu",
        "userrights-editusergroup": "Izmainīt lietotāja grupas",
-       "saveusergroups": "Saglabāt lietotāja grupas",
+       "saveusergroups": "Saglabāt dalībnieka grupas",
        "userrights-groupsmember": "Šobrīd ietilpst grupās:",
        "userrights-groupsmember-auto": "Netiešs dalībnieks:",
        "userrights-groups-help": "Tu vari izmainīt kādās grupās šis lietotājs ir:\n* Ieķeksēts lauciņš norāda, ka lietotājs ir attiecīgajā grupā.\n* Neieķeksēts lauciņš norāda, ka lietotājs nav attiecīgajā grupā.\n* * norāda, ka šo grupu tu nevarēsi noņemt, pēc tam, kad to būsi pielicis, vai otrādāk (tu nevarēsi atcelt savas izmaiņas).",
        "protectedpages-unknown-performer": "Nezināms lietotājs",
        "protectedtitles": "Aizsargātie nosaukumi",
        "protectedtitlesempty": "Pagaidām nevienas lapas nosaukums nav aizsargāts ar šiem paraametriem.",
-       "listusers": "Lietotāju uzskaitījums",
-       "listusers-editsonly": "Rādīt tikai lietotājus, kas ir izdarījuši kādas izmaiņas",
+       "listusers": "dalībnieku uzskaitījums",
+       "listusers-editsonly": "Rādīt tikai dalībniekus, kas ir izdarījuši kādas izmaiņas",
        "listusers-creationsort": "Kārtot pēc izveidošanas datuma",
        "usereditcount": "$1 {{PLURAL:$1|izmaiņas|izmaiņa|izmaiņas}}",
        "usercreated": "{{GENDER:$3|Izveidoja}} $1 plkst. $2",
        "linksearch-ok": "Meklēt",
        "linksearch-text": "Atbalstītie protokoli: $1",
        "linksearch-line": "$1 ir izveidota saite no $2",
-       "listusersfrom": "Parādīt lietotājus sākot ar:",
+       "listusersfrom": "Parādīt dalībniekus sākot ar:",
        "listusers-submit": "Parādīt",
-       "listusers-noresult": "Neviens lietotājs nav atrasts.",
+       "listusers-noresult": "Neviens dalībnieks nav atrasts.",
        "listusers-blocked": "(bloķēts)",
-       "activeusers": "Aktīvo lietotāju saraksts",
-       "activeusers-intro": "Šis ir lietotāju saraksts, kas veikuši kādu darbību {{PLURAL:daudzskaitlī:$1|pēdējā|pēdējās}} $1 {{PLURAL:daudzskaitlī:$1|dienā|dienās}}.",
+       "activeusers": "Aktīvo dalībnieku saraksts",
+       "activeusers-intro": "Šis ir dalībnieku saraksts, kas veikuši kādu darbību {{PLURAL:daudzskaitlī:$1|pēdējā|pēdējās}} $1 {{PLURAL:daudzskaitlī:$1|dienā|dienās}}.",
        "activeusers-count": "$1 {{PLURAL:$1|darbību|darbība|darbības}} {{PLURAL:$3|pēdējās $3 dienās|pēdējā $3 dienā|pēdējās $3 dienās}}",
-       "activeusers-from": "Parādīt lietotājus, sākot ar:",
+       "activeusers-from": "Parādīt dalībniekus, sākot ar:",
        "activeusers-hidebots": "Paslēpt botus",
        "activeusers-hidesysops": "Paslēpt administratorus",
-       "activeusers-noresult": "Neviens lietotājs nav atrasts.",
+       "activeusers-noresult": "Neviens dalībnieks nav atrasts.",
        "listgrouprights": "Lietotāju grupu tiesības",
-       "listgrouprights-summary": "Šis ir šajā wiki definēto lietotāju grupu uskaitījums, kopā ar tām atbilstošajām piekļuves tiesībām.\nPapildu informāciju par katru individuālu piekļuves tiesību veidu, iespējams, var atrast [[{{MediaWiki:Listgrouprights-helppage}}|šeit]].",
+       "listgrouprights-summary": "Šis ir šajā viki definēto dalībnieku grupu uzskaitījums, kopā ar tām atbilstošajām piekļuves tiesībām.\nPapildu informāciju par katru individuālu piekļuves tiesību veidu, iespējams, var atrast [[{{MediaWiki:Listgrouprights-helppage}}|šeit]].",
        "listgrouprights-group": "Grupa",
        "listgrouprights-rights": "Tiesības",
        "listgrouprights-helppage": "Help:Grupu tiesības",
        "special-characters-group-telugu": "Telugu",
        "special-characters-group-sinhala": "Singāļu",
        "special-characters-group-gujarati": "Gudžarati",
-       "mw-widgets-dateinput-no-date": "Nav izvēlēts datums"
+       "mw-widgets-dateinput-no-date": "Nav izvēlēts datums",
+       "api-error-blacklisted": "Lūdzu, izvēlieties citu, aprakstošu nosaukumu!"
 }
index 5f0c2ac..002e571 100644 (file)
        "svg-long-error": "Неважечка SVG-податотека: $1",
        "show-big-image": "Изворна податотека",
        "show-big-image-preview": "Големина на овој преглед: $1.",
+       "show-big-image-preview-differ": "Големина на овој $3-преглед на оваа $2-податотека: $1.",
        "show-big-image-other": "{{PLURAL:$2|Друга разделеност|Други разделености}}: $1.",
        "show-big-image-size": "$1 × $2 пиксели",
        "file-info-gif-looped": "кружно",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "mw-widgets-titleinput-description-new-page": "страницата сè уште не постои",
-       "mw-widgets-titleinput-description-redirect": "пренасочување кон $1"
+       "mw-widgets-titleinput-description-redirect": "пренасочување кон $1",
+       "api-error-blacklisted": "Одберете поинаков, описен наслов."
 }
index db58d81..75bfcde 100644 (file)
        "special-characters-title-minus": "വ്യവകലന ചിഹ്നം",
        "mw-widgets-dateinput-no-date": "തീയതി ഒന്നും തിരഞ്ഞെടുത്തിട്ടില്ല",
        "mw-widgets-titleinput-description-new-page": "താൾ ഇപ്പോൾ നിലവിലില്ല",
-       "mw-widgets-titleinput-description-redirect": "$1 എന്ന താളിലേക്കുള്ള തിരിച്ചുവിടൽ"
+       "mw-widgets-titleinput-description-redirect": "$1 എന്ന താളിലേക്കുള്ള തിരിച്ചുവിടൽ",
+       "api-error-blacklisted": "ദയവായി മറ്റൊരു വിവരണാത്മകമായ തലക്കെട്ട് തിരഞ്ഞെടുക്കുക."
 }
index 4acdba5..7a1baee 100644 (file)
@@ -76,7 +76,7 @@
        "tog-shownumberswatching": "पहारा देणाऱ्या सदस्यांचा आकडा दाखवा",
        "tog-oldsig": "सध्याची सही:",
        "tog-fancysig": "सही विकिसंज्ञा म्हणून वापरा (आपोआप दुव्याशिवाय)",
-       "tog-uselivepreview": "सà¤\82पादन à¤\95रता à¤\95रताà¤\9a à¤\9dलà¤\95 à¤¦à¤¾à¤\96वा (पà¥\8dरयà¥\8bà¤\97à¤\95à¥\8dषम)",
+       "tog-uselivepreview": "सà¤\9cà¥\80व à¤\9dलà¤\95 à¤¦à¤¾à¤\96वा",
        "tog-forceeditsummary": "जर ’बदलांचा आढावा’ दिला नसेल तर मला सूचित करा",
        "tog-watchlisthideown": "पहाऱ्याच्या सूचीतून माझे बदल लपवा",
        "tog-watchlisthidebots": "पहाऱ्याच्या सूचीतून सांगकाम्यांचे बदल लपवा",
        "view": "दाखवा",
        "view-foreign": "$1 वर पहा",
        "edit": "संपादन",
+       "edit-local": "स्थानिक वर्णन संपादा",
        "create": "तयार करा",
        "create-local": "स्थानिक वर्णन जोडा",
        "editthispage": "हे पृष्ठ संपादित करा",
        "jumptonavigation": "सुचालन",
        "jumptosearch": "शोध",
        "view-pool-error": "माफ करा. यावेळेस सर्व्हरवर ताण आहे. अनेक सदस्य हे पान बघण्याचा प्रयत्न करित आहेत. पुन्हा या पानावर येण्यासाठी थोडा वेळ थांबून परत प्रयत्‍न करा.\n$1",
+       "generic-pool-error": "माफ करा. यावेळेस सर्व्हरवर ताण आहे. अनेक सदस्य हे पान बघण्याचा प्रयत्न करित आहेत. पुन्हा या पानावर येण्यासाठी थोडा वेळ थांबून परत प्रयत्‍न करा.",
        "pool-timeout": "ताळ्यासाठी वाट पाहण्याची वेळ संपली",
        "pool-queuefull": "सर्व्हरवर ताण आहे.",
        "pool-errorunknown": "अपरिचित त्रुटी",
        "actionthrottled": "कृती नियामक(थ्रॉटल) केली",
        "actionthrottledtext": "अपशब्द-विरोधी उपायाच्या दृष्टीने(अँटी-अब्युज मेझर ),ही कृती थोड्या कालावधीत असंख्यवेळा करण्यापासून, तुम्हाला प्रतिबंधित करण्यात आले आहे, आणि आपण या मर्यादेचे उल्लंघन केले आहे. कृपया काही मिनीटांनंतर पुन्हा प्रयत्न करा.",
        "protectedpagetext": "हे पान बदल अथवा इतर कृती होऊ नयेत म्हणून सुरक्षित केले आहे.",
-       "viewsourcetext": "तà¥\81मà¥\8dहà¥\80 à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤\9aा à¤¸à¥\8dरà¥\8bत à¤ªà¤¾à¤¹à¥\82 à¤¶à¤\95ता à¤µ à¤ªà¥\8dरत à¤\95रà¥\82 à¤¶à¤\95ता:",
-       "viewyourtext": "तुम्ही या पानाची, '''तुमची संपादने''' पाहू शकता व त्याची प्रत करू शकता:",
+       "viewsourcetext": "तà¥\81मà¥\8dहà¥\80 à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤\9aा à¤¸à¥\8dरà¥\8bत à¤ªà¤¾à¤¹à¥\82 à¤µ à¤ªà¥\8dरत à¤\95रà¥\82 à¤¶à¤\95ता.",
+       "viewyourtext": "तुम्ही या पानाची,<strong>तुमची संपादने</strong> पाहू शकता व त्याची प्रत करू शकता.",
        "protectedinterface": "हे पान सॉफ्टवेअरला इंटरफेस लेखन पुरवते, म्हणून दुरूपयोग टाळण्यासाठी संरक्षित केलेले आहे.\n\nसर्व विकिंवर, अनुवाद जोडण्याकरता किंवा बदलण्याकरता अथवा शुद्धलेखन चिकित्सेकरीता , कृपया [//translatewiki.net/ translatewiki.net], या मिडियाविकि स्थानिकीकरण प्रकल्पावर जा.",
-       "editinginterface": "'''सावधान:''' तुम्ही संचेतनाचे (सॉफ्टवेअर) संपर्क माध्यम मजकूर असलेले पान संपादित करित आहात. या पानावरील बदल या विकिवरील इतर सदस्यांच्या सदस्य संपर्क माध्यमाचे स्वरूप बदलू शकते.सर्व विकिंवरील भाषांतरासाठी  कृपया मिडीयाविकि स्थानिकीकरण प्रकल्पाच्या [//translatewiki.net/ translatewiki.net]या सुविधेचा वापर करा.",
+       "editinginterface": "<strong>सावधान</strong>तुम्ही संचेतनाचे (सॉफ्टवेअर) संपर्क माध्यम मजकूर असलेले पान संपादित करित आहात. या पानावरील बदल या विकिवरील इतर सदस्यांच्या सदस्य संपर्क माध्यमाचे स्वरूप बदलू शकते.",
        "cascadeprotected": "हे पान संपादनांपासून सुरक्षित केल्या गेले आहे, कारण ते खालील {{PLURAL:$1|पानात|पानांमध्ये}} अंतर्भूत केलेले आहे,{{PLURAL:$1|जे पान|जी पाने }} निपतन पर्याय सुरु केल्यामुळे सुरक्षित आहेत:\n$2",
        "namespaceprotected": "'''$1''' नामविश्वातील पाने संपादण्याची आपणांस परवानगी नाही.",
        "customcssprotected": "या पानावर इतर सदस्याची वैयक्तिक मांडणी असल्यामुळे, तुम्हाला हे सीएसएस पान संपादित करण्याची परवानगी नाही.",
        "passwordreset-emailsent-capture": "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र पाठवण्यात आले आहे जे खाली दर्शविण्यात आले आहे.",
        "passwordreset-emailerror-capture": "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र निर्माण करण्यात आले, जे खाली दर्शविण्यात आले आहे.परंतु,{{GENDER:$2|सदस्य}}ला पाठविणे असफल झाले: $1",
        "changeemail": "विपत्रपत्ता बदला किंवा हटवा",
-       "changeemail-header": "आपल्या खात्याचा ईमेल पत्ता बदला.",
+       "changeemail-header": "आपला विपत्रपत्ता बदलण्यास हे आवेदन पूर्ण करा.जर आपणास आपल्या खात्याशी संलग्न कोणताही विपत्रपत्ता हटवायचा असेल तर,आवेदन सादर करण्यापूर्वी, नविन विपत्रपत्त्यासाठी असलेली जागा कोरी ठेवा.",
+       "changeemail-passwordrequired": "हे बदल नक्की करण्यासाठी आपणास आपला संकेतांक टाकावा लागेल.",
        "changeemail-no-info": "हे पान थेट बघण्यासठी तुम्हाला सनोंद-प्रवेशित असावे लागेल.",
        "changeemail-oldemail": "सध्याचा ईमेल पत्ता :",
        "changeemail-newemail": "नवा ईमेल पत्ता:",
        "sig_tip": "वेळेबरोबर तुमची सही",
        "hr_tip": "आडवी रेषा (अपवादानेच वापरा)",
        "summary": "बदलांचा आढावा :",
-       "subject": "विषय/मथळा:",
+       "subject": "विषय:",
        "minoredit": "हा एक छोटा बदल आहे",
        "watchthis": "या लेखावर लक्ष ठेवा",
        "savearticle": "हा लेख साठवा",
        "anonpreviewwarning": "\"'''सावधान:''' तुम्ही विकिपीडियाचे सदस्य म्हणून सनोंद-प्रवेश (लॉग-इन) केलेला नाही. या पानाच्या संपादन इतिहासात तुमचा अंकपत्ता (आय.पी. ॲड्रेस) नोंदला जाईल.\"",
        "missingsummary": "'''आठवण:''' आपण संपादन सारांश पुरवलेला नाही.आपण 'जतन करा' वर पुन्हा टिचकी मारली तर, ते त्याशिवायच जतन होईल.",
        "missingcommenttext": "कृपया खाली प्रतिक्रिया भरा.",
-       "missingcommentheader": "'''आठवण:''' आपण या लेखनाकरिता विषय किंवा मथळा दिलेला नाही. आपण पुन्हा \"{{int:savearticle}}\" वर टिचकले तर, तुमचे संपादन त्याशिवायच जतन होईल.",
+       "missingcommentheader": "<strong>आठवण:<strong> आपण या लेखनाकरिता विषय दिलेला नाही. आपण पुन्हा \"{{int:savearticle}}\" वर टिचकले तर, तुमचे संपादन त्याशिवायच जतन होईल.",
        "summary-preview": "आढाव्याची झलक:",
-       "subject-preview": "विषय/मथळा झलक:",
+       "subject-preview": "विषय झलक:",
        "blockedtitle": "हा सदस्य प्रतिबंधित आहे",
        "blockedtext": "'''तुमचे सदस्यनाव अथवा IP पत्ता ब्लॉक केलेला आहे.'''\n\nहा ब्लॉक $1 यांनी केलेला आहे.\nयासाठी ''$2'' हे कारण दिलेले आहे.\n\n* ब्लॉकची सुरूवात: $8\n* ब्लॉकचा शेवट: $6\n* कुणाला ब्लॉक करायचे आहे: $7\n\nतुम्ही ह्या ब्लॉक संदर्भातील चर्चेसाठी $1 अथवा [[{{MediaWiki:Grouppage-sysop}}|प्रबंधकांशी]] संपर्क करू शकता.\nतुम्ही जोवर वैध ई-मेल पत्ता आपल्या [[Special:Preferences|'माझ्या पसंती']] पानावर देत नाही तोवर तुम्ही ’सदस्याला ई-मेल पाठवा’ हा दुवा वापरू शकत नाही. तसेच असे करण्यापासून आपल्याला ब्लॉक केलेले नाही.\nतुमचा सध्याचा IP पत्ता $3 हा आहे, व तुमचा ब्लॉक क्रमांक #$5 हा आहे.\nकृपया या संदर्भातील चर्चेमध्ये वरील सर्व तपशिल उद्घृत करा.",
        "autoblockedtext": "तुमचा आंतरजालीय अंकपत्ता आपोआप स्थगित केला आहे कारण तो इतर अशा सदस्याने वापरला, ज्याला $1ने प्रतिबंधित केले.\nआणि दिलेले कारण खालील प्रमाणे आहे\n:''$2''\nब्लॉकची सुरूवात: $8\nब्लॉकचा शेवट: $6\nकुणाला ब्लॉक करायचे आहे: $7\n\nतुम्ही $1शी संपर्क करू शकता किंवा इतर [[{{MediaWiki:Grouppage-sysop}}|प्रबंधकां पैकी]] एकाशी स्थगनाबद्दल चर्चा करू शकता.\n\n[[Special:Preferences|सदस्य पसंतीत]]त शाबीत विपत्र पत्ता नमूद असल्या शिवाय आणि तुम्हाला  तो वापरण्या पासून प्रतिबंधित केले असल्यास तुम्ही  \"या सदस्यास विपत्र पाठवा\" सुविधा  वापरू शकणार नाही.\nतुमचा सध्याचा IP पत्ता $3 हा आहे, व तुमचा ब्लॉक क्रमांक #$5 हा आहे. \nतुमचा स्थगन क्र $5 आहे. कृपया या संदर्भातील चर्चेमध्ये वरील सर्व तपशिल उद्घृत करा.",
        "parser-template-recursion-depth-warning": "साचा पुनरावर्तन खोली मर्यादा ओलांडली ($1)",
        "language-converter-depth-warning": "भाषा रुपांतरण खोली मर्यादा ओलांडली ($1)",
        "node-count-exceeded-category": "लेख जेथे निस्पंद-गणना(नोड-काऊंट) पार केल्या गेला",
-       "node-count-exceeded-warning": "लेखाची पर्वसंधि-गणना(नोड-काऊंट) पार झाली",
+       "node-count-exceeded-warning": "लेखाची पर्वसंधि-गणना(नोड-काऊंट)मर्यादा पार झाली",
        "expansion-depth-exceeded-category": "लेख जेथे विस्तार-तळ(एक्सपांशन डेप्थ) पार केल्या गेली",
        "expansion-depth-exceeded-warning": "लेखाने विस्तार-तळ(एक्सपांशन डेप्थ) पार केला",
        "parser-unstrip-loop-warning": "'अनस्ट्रिप'(अरोखीत) वलय(लुप) आढळले",
        "upload-too-many-redirects": "या आंतरजालपत्त्यात खूप पुनर्निर्देशने आहेत",
        "upload-http-error": "एक एचटीटीपी चूक उद्भवली: $1",
        "upload-copy-upload-invalid-domain": "संक्रमित केलेली महिती अधिक्षेत्रात उपलब्ध नाही.",
+       "upload-dialog-title": "संचिकेचे अपभारण करा",
+       "upload-dialog-button-cancel": "रद्द करा",
+       "upload-dialog-button-done": "झाले",
+       "upload-dialog-button-save": "जतन करा",
+       "upload-dialog-button-upload": "अपभारण करा",
+       "upload-process-error": "त्रुटी घडली",
+       "upload-process-warning": "ईशारा उद्भवला",
+       "upload-form-label-select-file": "संचिका निवडा",
+       "upload-form-label-infoform-title": "तपशील",
+       "upload-form-label-infoform-name": "नाव",
+       "upload-form-label-infoform-description": "वर्णन",
+       "upload-form-label-usage-title": "वापर",
+       "upload-form-label-usage-filename": "संचिका नाम",
        "foreign-structured-upload-form-label-own-work": "हे माझे स्वत:चे काम आहे",
+       "foreign-structured-upload-form-label-infoform-categories": "वर्ग",
+       "foreign-structured-upload-form-label-infoform-date": "दिनांक",
        "backend-fail-stream": "$1 या संचिकेचा स्त्रोत शोधता आला नाही.",
        "backend-fail-backup": "$1 या संचिकेची आधारप्रत बनविता आली नाही.",
        "backend-fail-notexists": "$1 ही संचिका अस्तित्वात नाही.",
        "license": "परवाना:",
        "license-header": "परवाना:",
        "nolicense": "काही निवडलेले नाही",
+       "licenses-edit": "परवान्याच्या विकल्पाचे संपादन करा",
        "license-nopreview": "(झलक उपलब्ध नाही)",
-       "upload_source_url": "(एक सुयोग्य,सार्वजनिकरित्या उपलब्ध URL)",
-       "upload_source_file": "(तुमच्या संगणकावरील एक संचिका)",
+       "upload_source_url": "(एक सुयोग्य,सार्वजनिकरित्या उपलब्ध URL निवडली आहे)",
+       "upload_source_file": "(तुमच्या संगणकावरील एक संचिका निवडली आहे)",
+       "listfiles-delete": "वगळा",
        "listfiles-summary": "हे विशेष पान सर्व अपभारिलेल्या संचिका दर्शिविते.",
        "listfiles_search_for": "चित्र नावाने शोध:",
+       "listfiles-userdoesnotexist": "सदस्यखाते \"$1\"  हे नोंदलेले नाही.",
        "imgfile": "संचिका",
        "listfiles": "चित्र यादी",
        "listfiles_thumb": "नखुले",
        "filerevert-legend": "संचिका पूर्वपदास",
        "filerevert-intro": "तुम्ही [$3, $2 प्रमाणे आवर्तन$4 कडे]<strong>[[Media:$1|$1]]</strong>  उलटवत आहात.",
        "filerevert-comment": "कारण:",
-       "filerevert-defaultcomment": "$2, $1 à¤\9aà¥\8dया à¤\86वà¥\83तà¥\8dतà¥\80त à¤ªà¥\82रà¥\8dवपदास",
+       "filerevert-defaultcomment": "$2, $1 à¤\9aà¥\8dया à¤\86वà¥\83तà¥\8dतà¥\80स à¤ªà¥\82रà¥\8dवपदावर ($3)",
        "filerevert-submit": "पूर्वपद",
        "filerevert-success": "[$3, $2 प्रमाणे आवर्तन $4]कडे<strong>[[Media:$1|$1]]</strong>उलटवण्यात आली.",
        "filerevert-badversion": "दिलेलेल्या वेळ मापनानुसार,या संचिकेकरिता कोणतीही पूर्वीची स्थानिक आवृत्ती नाही.",
        "filedelete-maintenance": "देखभालीदरम्यान, संचिका वगळणे व पुनर्स्थापित करणे तात्पुरते अक्षम केल्या गेले आहे.",
        "filedelete-maintenance-title": "संचिका (फाईल) वगळू शकत नाही.",
        "mimesearch": "विविधामाप (माईम) शोधा",
-       "mimesearch-summary": "हे पान विविधामाप (माईम)-प्रकारांकरिता संचिकांची चाळणी करण्याची सुविधा पुरवते:\nInput:contenttype/subtype, e.g. <code>image/jpeg</code>.",
+       "mimesearch-summary": "हे पान विविधामाप (माईम)-प्रकारांकरिता संचिकांची चाळणी करण्याची सुविधा पुरवते.\nInput:contenttype/subtype, e.g. <code>image/jpeg</code>.",
        "mimetype": "विविधामाप (माईम) प्रकार:",
        "download": "अधिभारण करा",
        "unwatchedpages": "देखरेख नसलेली पाने",
        "randomincategory": "वर्गातील अनियत पान",
        "randomincategory-invalidcategory": "\"$1\" हे अधिकृत वर्गाचे नाव नाही.",
        "randomincategory-nopages": "[[:Category:$1]] यात काहीच पाने नाहीत.",
+       "randomincategory-category": "वर्ग:",
+       "randomincategory-legend": "वर्गातील अविशिष्ट पान",
        "randomincategory-submit": "चला",
        "randomredirect": "अविशिष्ट पुनर्निर्देशन",
        "randomredirect-nopages": "$1 या नामविश्वात कोणतीही पुर्ननिर्देशने नाहीत.",
        "pageswithprop-prophidden-binary": "बायनरी गुणधर्माची किंमत लपविलेली आहे ($1)",
        "doubleredirects": "दुहेरी-पुनर्निर्देशने",
        "doubleredirectstext": "हे पान, अशा पानांची यादी पुरवते की जी पाने, दुसऱ्या पुर्ननिर्देशीत पानाकडे पुर्ननिर्देशीत झाली आहेत.प्रत्येक ओळीत पहिल्या आणि दुसऱ्या पुर्ननिर्देशनाचा दुवा दिला आहे,तसेच, दुसऱ्या  पुर्ननिर्देशनाचे लक्ष्य पान पण दिले आहे,जे मुळात ते \nलक्ष्यपान आहे ज्याकडे, पहिले पुनर्निर्देशन असावयास हवे.\n\n<del>खोडलेल्या प्रविष्टी</del>समायोजित करण्यात आलेल्या आहेत.",
-       "double-redirect-fixed-move": "[[$1]] हलवले गेले आहे.\nते आता [[$2]] येथे निर्देशित होते.",
+       "double-redirect-fixed-move": "[[$1]] हलवले गेले आहे.\nते आता स्वयंचलितरित्या अद्यतन केल्या गेले व [[$2]] येथे निर्देशित होते.",
        "double-redirect-fixed-maintenance": "[[$1]] ते [[$2]] हे चुकीचे पुनर्निर्देशन ठिकठाक केले.",
        "double-redirect-fixer": "पुनर्निर्देशन ठिकठाक करणारा",
        "brokenredirects": "मोडकी पुनर्निर्देशने",
        "listgrouprights-removegroup-self": "स्वतःच्या खात्यातून हे {{PLURAL:$2|गट}} वगळा: $1",
        "listgrouprights-addgroup-self-all": "सर्व गट स्वतःच्या खात्यात जोडा",
        "listgrouprights-removegroup-self-all": "सर्व गट स्वतःच्या खात्यातून काढून टाका",
+       "listgrouprights-namespaceprotection-header": "नामविश्व प्रतिबंध",
+       "listgrouprights-namespaceprotection-namespace": "नामविश्व",
+       "trackingcategories": "वर्ग शोधत आहोत",
+       "trackingcategories-name": "संदेश नाम",
        "mailnologin": "पाठविण्याचा पत्ता नाही",
        "mailnologintext": "इतर सदस्यांना विपत्र(ई-मेल) पाठवण्याकरिता तुम्ही [[Special:UserLogin|प्रवेश केलेला]] असणे आणि  प्रमाणित (ई-मेल) पत्ता तुमच्या [[Special:Preferences|पसंतीत]] नमूद असणे आवश्यक आहे.",
        "emailuser": "या सदस्याला ई-मेल पाठवा",
        "rollback-success": "$1 ने उलटवलेली संपादने;$2 च्या आवृत्तीस परत नेली.",
        "sessionfailure-title": "सत्र त्रुटी",
        "sessionfailure": "तुमच्या दाखल सत्रात काही समस्या दिसते;सत्र अपहारणापासून \nवाचविण्याचे दृष्टीने ही कृती रद्द केल्या गेली आहे.कृपया आपल्या विचरकाच्या \"back\" कळीवर टिचकी मारा आणि तुम्ही ज्या पानावरून आला ते पुन्हा चढवा,आणि परत प्रयत्न करा.",
+       "changecontentmodel-title-label": "लेखपान शीर्ष",
+       "changecontentmodel-reason-label": "कारण:",
        "protectlogpage": "सुरक्षा नोंदी",
        "protectlogtext": "पानांना लावलेल्या ताळ्यांची आणि ताळे उघडण्याबद्दलच्या पानाची खाली सूची दिली आहे.सध्याच्या सुरक्षित पानांबद्दलच्या माहितीकरिता [[Special:ProtectedPages|सुरक्षीत पानांची सूची]] पहा.",
        "protectedarticle": "\"[[$1]]\" सुरक्षित केला",
        "undeletepagetext": "खालील {{PLURAL:$1|पान वगळले आहे तरीसुद्धा विदागारात जतन आहे आणि पुनर्स्थापित करणे शक्य आहे|$1 पाने वगळली आहेत तरी सुद्धा विदागारात जतन आहेत आणि पुनर्स्थापित करणे शक्य आहेत}}. विदागारातील साठवण ठरावीक कालावधीने स्वच्छ करता येते.",
        "undelete-fieldset-title": "आवर्तने पुनर्स्थापित करा",
        "undeleteextrahelp": "पानाचा संपूर्ण इतिहास पुनर्स्थापित करण्यासाठी,साऱ्या चौकटपेट्या (चेकबॉक्सेस) रिकाम्या ठेवा\nआणि  '''''{{int:undeletebtn}}''''' वर टिचकी मारा. निवडक पुनर्स्थापन करण्याकरिता, ज्या आवर्तनांचे पुनर्स्थापन करावयाचे त्यांचेशी सुसंगत चौकटपेट्या (चेकबॉक्सेस) निवडा , आणि '''''{{int:undeletebtn}}''''' वर टिचकी मारा.",
-       "undeleterevisions": "$1 {{PLURAL:$1|आवर्तन|आवर्तने}}विदागारात संचीत",
+       "undeleterevisions": "$1 {{PLURAL:$1|आवर्तन वगळले|आवर्तने वगळली}}",
        "undeletehistory": "जर तुम्ही पान पुनर्स्थापित केले तर ,सारी आवर्तने इतिहासात पुनर्स्थापित होतील.\nवगळल्या पासून त्याच नावाचे नवे पान तयार केले गेले असेले तर, पुनर्स्थापित आवर्तने पाठीमागील इतिहासात दिसतील. पुनर्स्थापना नंतर संचिकांच्या आवर्तनांवरील बंधने गळून पडतील याची नोंद घ्या.",
        "undeleterevdel": "पृष्ठ पानाचे आवर्तन अर्धवट वगळले जाणार असेल तर पुनर्स्थापनाची कृती केली जाणार नाही.\nअशा प्रसंगी, तुम्ही अगदी अलीकडील वगळलेली आवर्तने अनचेक किंवा अनहाईड केलीच पाहिजे.",
        "undeletehistorynoadmin": "हे पान वगळले गेले आहे.वगळण्याचे कारण खालील आढाव्यात,वगळण्यापूर्वी संपादित करणाऱ्या संपादकांच्या माहिती सोबत,दाखवले आहे. वगळलेल्या आवर्तनांचा नेमका मजकूर केवळ प्रचालकांना उपलब्ध असेल.",
        "move-page-legend": "पृष्ठ स्थानांतरण",
        "movepagetext": "खालील अर्ज हा एखाद्या लेखाचे शीर्षक बदलण्यासाठी वापरता येईल. खालील अर्ज भरल्यानंतर लेखाचे शीर्षक बदलले जाईल तसेच त्या लेखाचा सर्व इतिहास हा नवीन लेखामध्ये स्थानांतरित केला जाईल.\nजुने शीर्षक नवीन शीर्षकाला पुनर्निर्देशित करेल.\nजुन्या शीर्षकाला असलेले दुवे बदलले जाणार नाहीत, तरी तुम्हाला विनंती आहे की स्थानांतरण केल्यानंतर\n[[Special:DoubleRedirects|दुहेरी]] अथवा [[Special:BrokenRedirects|मोडकी]] पुनर्निर्देशने तपासावीत.\nचुकीचे दुवे टाळण्याची जबाबदारी सर्वस्वी तुमच्यावर राहील.\n\nजर नवीन शीर्षकाचा लेख अस्तित्वात असेल तर स्थानांतरण होणार '''नाही'''.\nपण जर नवीन शीर्षकाचा लेख हा रिकामा असेल अथवा पुनर्निर्देशन असेल (म्हणजेच त्या लेखाला जर संपादन इतिहास नसेल) तर स्थानांतरण होईल. याचा अर्थ असा की जर काही चूक झाली तर तुम्ही पुन्हा जुन्या शीर्षकाकडे स्थानांतरण करू शकता.\n\n'''सूचना!'''\nस्थानांतरण केल्यास एखाद्या महत्वाच्या लेखामध्ये अनपेक्षित बदल होऊ शकतात. तुम्हाला विनंती आहे की तुम्ही पूर्ण काळजी घ्या व होणारे परिणाम समजावून घ्या.\nजर तुम्हाला शंका असेल तर प्रबंधकांशी संपर्क करा.",
        "movepagetext-noredirectfixer": "खालील अर्ज हा एखाद्या लेखाचे शीर्षक बदलण्यासाठी वापरता येईल. खालील अर्ज भरल्यानंतर लेखाचे शीर्षक बदलले जाईल तसेच त्या लेखाचा सर्व इतिहास हा नवीन लेखामध्ये स्थानांतरित केला जाईल.\n\nजुने शीर्षक नवीन शीर्षकाकडे पुनर्निर्देशित करेल.\n\n[[Special:DoubleRedirects|दुहेरी]] अथवा [[Special:BrokenRedirects|मोडकी]] पुनर्निर्देशनांकरीता तपासण्याची काळजी घ्या.\nउपलब्ध दुवे  जिथे उघडणे अभिप्रेत होते तसेच उघडतील याची तुम्ही जबाबदारी घेत आहात\n\nजर नवीन शीर्षकाचा लेख अस्तित्वात असेल तर स्थानांतरण होणार '''नाही'''.\nपण जर नवीन शीर्षकाचा लेख हा रिकामा असेल अथवा पुनर्निर्देशन असेल (म्हणजेच त्या लेखाला जर संपादन इतिहास नसेल) तर स्थानांतरण होईल. याचा अर्थ असा की जर काही चूक झाली तर तुम्ही पुन्हा जुन्या शीर्षकाकडे स्थानांतरण करू शकता.\n<strong>ईशारा!</strong>\nअसे केल्याने एखाद्या महत्वाच्या/लोकप्रीय लेखामध्ये अनपेक्षित आणि महत्वाचे बदल होऊ शकतात. तुम्हाला विनंती आहे की तुम्ही पूर्ण काळजी घ्या व होणारे परिणाम समजावून घ्या.\nजर तुम्हाला शंका असेल तर प्रचालक/प्रबंधकांशी संपर्क करा.",
-       "movepagetalktext": "सà¤\82बà¤\82धित à¤\9aरà¥\8dà¤\9aा à¤ªà¥\83षà¥\8dठ à¤¯à¤¾à¤¬à¤°à¥\8bबर à¤¸à¥\8dथानाà¤\82तरà¥\80त à¤¹à¥\8bणार à¤¨à¤¾à¤¹à¥\80 '''à¤\9cर:'''\n* à¤¤à¥\81मà¥\8dहà¥\80 à¤ªà¥\83षà¥\8dठ à¤¦à¥\81सऱà¥\8dया à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवात à¤¸à¥\8dथानाà¤\82तरà¥\80त à¤\95रत à¤\85साल\n* à¤¯à¤¾ à¤¨à¤¾à¤µà¤¾à¤\9aà¥\87 à¤\9aरà¥\8dà¤\9aा à¤ªà¤¾à¤¨ à¤\85à¤\97à¥\8bदरà¤\9a à¤\85सà¥\8dतितà¥\8dवात à¤\85सà¥\87ल à¤¤à¤°, à¤\95िà¤\82वा\n* à¤\96ालà¥\80ल à¤\9aà¥\8cà¤\95à¤\9fपà¥\87à¤\9fà¥\80 (à¤\9aà¥\87à¤\95बà¥\89à¤\95à¥\8dस) à¤°à¤¿à¤\95ामà¥\80 à¤ à¥\87वलà¥\80 à¤¤à¤°.\n\nया à¤¬à¤¾à¤¬à¤¤à¥\80त à¤¤à¥\81मà¥\8dहाला à¤¸à¥\8dवतà¤\83ला à¤¹à¥\80 à¤ªà¤¾à¤¨à¥\87 à¤\8fà¤\95तà¥\8dर करावी लागतील.",
+       "movepagetalktext": "à¤\9cर à¤\86पण à¤¹à¤¾ à¤¬à¥\89à¤\95à¥\8dस 'à¤\9aà¥\87à¤\95' à¤\95à¥\87ला à¤¤à¤°,यातà¥\80ल à¤¸à¤\82लà¤\97à¥\8dन à¤\9aरà¥\8dà¤\9aा à¤ªà¤¾à¤¨à¥\87 à¤\86पà¥\8bà¤\86प à¤¨à¤µà¤¿à¤¨ à¤®à¤¥à¤³à¥\8dयास à¤¸à¤\82लà¤\97à¥\8dन à¤¹à¥\8bतà¥\80ल.(तà¥\87थà¥\87 à¤ªà¥\81रà¥\8dवà¥\80à¤\9a à¤²à¤¿à¤¹à¤¿à¤²à¥\87लà¥\87 à¤\9aरà¥\8dà¤\9aापान à¤¨à¤¸à¥\87ल à¤¤à¤°)\n\nया à¤¬à¤¾à¤¬à¤¤à¥\80त à¤¤à¥\81मà¥\8dहाला à¤¸à¥\8dवतà¤\83ला à¤¹à¥\80 à¤ªà¤¾à¤¨à¥\87 à¤¸à¥\8dवत:à¤\9a à¤¹à¤²à¤µà¤¾à¤µà¥\80 à¤\95िà¤\82वा à¤µà¤¿à¤²à¥\80न करावी लागतील.",
        "moveuserpage-warning": "'''सावधान:''' आपण एक सदस्य पान स्थलांतरित करत आहात. कृपया लक्षात घ्या की, फक्त हे पान स्थलांतरित होइल, सदस्य नाम बदलले जाणार नाही.",
        "movenologintext": "पान स्थानांतरित करण्यासाठी तुम्ही नोंदीकृत सदस्य हवे व तुम्हाला [[Special:UserLogin|सनोंद-प्रवेश]] करावा लागेल.",
        "movenotallowed": "{{SITENAME}}वरील पाने स्थानांतरीत करण्याची आपल्यास परवानगी नाही.",
        "thumbnail_image-missing": "संचिका सापडत नाही: $1",
        "thumbnail_image-failure-limit": "हे नखुले देण्यासाठी नुकतेच अनेक अयशस्वी प्रयत्न($1 किंवा अधिक) केल्या गेले आहेत.कृपया नंतर पुन्हा प्रयत्न करा.",
        "import": "पाने आयात करा",
-       "importinterwiki": "à¤\86à¤\82तरविà¤\95ि à¤\86यात",
+       "importinterwiki": "दà¥\81सऱà¥\8dया à¤µà¤¿à¤\95à¥\80वरà¥\81न à¤\86यात à¤\95रा",
        "import-interwiki-text": "आयात करण्याकरिता एक विकि आणि पानाचा मथळा निवडा.\nआवर्तनांच्या तारखा आणि संपादकांची नावे जतन केली जातील.\nसर्व आंतरविकि आयात क्रिया [[Special:Log/import|आयात नोंदीत]] दाखल केल्या आहेत.",
+       "import-interwiki-sourcewiki": "स्रोत विकि:",
+       "import-interwiki-sourcepage": "स्रोत पान:",
        "import-interwiki-history": "या पानाकरिताची साऱ्या इतिहास आवर्तनांची नक्कल करा",
        "import-interwiki-templates": "साचे आंतरभूत करा",
        "import-interwiki-submit": "आयात",
        "autosumm-replace": "पान '$1' वापरून बदलले.",
        "autoredircomment": "[[$1]] कडे पुनर्निर्देशित",
        "autosumm-new": "नवीन पान \"$1\"",
+       "autosumm-newblank": "रिकामे पान बनविले",
        "size-bytes": "$1 बा.",
        "size-kilobytes": "$1 कि.बा.",
        "size-megabytes": "$1 मे.बा.",
        "watchlistedit-raw-done": "तुमची पहाऱ्याची सूची परिष्कृत करण्यात आली आहे.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 शीर्षक होते |$1 शीर्षक होती }} भर घातली:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 शीर्षक होते |$1 शीर्षक होती }} वगळले:",
+       "watchlistedit-clear-title": "निरीक्षणसूची साफ केली",
+       "watchlistedit-clear-legend": "निरीक्षणसूची साफ करा",
+       "watchlistedit-clear-explain": "आपल्या ननिरीक्षणसूचीतील सर्व शिर्षक हटविल्या जातील.",
+       "watchlistedit-clear-titles": "शिर्षके:",
+       "watchlisttools-clear": "निरीक्षणसूची साफ करा",
        "watchlisttools-view": "संबंधित बदल पहा",
        "watchlisttools-edit": "पहाऱ्याची  सूची पहा आणि संपादित करा",
        "watchlisttools-raw": "नित्य पहाण्याची कच्ची-सूची संपादित करा",
        "version-entrypoints": "आत येणारी यू॰आर॰एल",
        "version-entrypoints-header-entrypoint": "आत येण्याचा मार्ग",
        "version-entrypoints-header-url": "यू॰आर॰एल",
+       "version-libraries-library": "ग्रंथालय",
+       "version-libraries-version": "आवृत्ती",
+       "version-libraries-license": "परवाना",
+       "version-libraries-description": "वर्णन",
+       "version-libraries-authors": "लेखक",
        "redirect": "संचिका,सदस्य किंवा आवृत्ती या ओळखणीनुसार पुनर्निर्देशन",
        "redirect-legend": "संचिका अथवा पानास पुनर्निर्देशन",
        "redirect-summary": "हे विशेष पान एक संचिकेस पुनर्निर्देशित करते(दिलेले संचिकानाम),एक पान(दिलेली आवृत्ती किंवा पान ओळखण) किंवा एक सदस्यपान(दिलेला सदस्य अंक).\nवापर:[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], किंवा [[{{#Special:Redirect}}/user/101]].",
        "tags-tag": "खूण नाव",
        "tags-display-header": "बदल सुचीवर कसे दिसेल",
        "tags-description-header": "अर्थाची पूर्ण माहिती",
+       "tags-source-header": "स्रोत",
        "tags-active-header": "सक्रिय?",
        "tags-hitcount-header": "खुणा केलेले बदल",
+       "tags-actions-header": "क्रिया",
        "tags-active-yes": "होय",
        "tags-active-no": "नाही",
+       "tags-source-none": "वापरात नाही",
        "tags-edit": "संपादन करा",
+       "tags-delete": "वगळा",
+       "tags-activate": "सक्रीय करा",
+       "tags-deactivate": "निष्क्रिय करा",
        "tags-hitcount": "$1 {{PLURAL:$1|बदल|बदल}}",
+       "tags-create-heading": "नवीन बिल्ला तयार करा",
+       "tags-create-reason": "कारण:",
+       "tags-create-submit": "निर्मित करा",
+       "tags-delete-reason": "कारण:",
+       "tags-activate-reason": "कारण:",
+       "tags-activate-submit": "सक्रीय करा",
+       "tags-deactivate-reason": "कारण:",
+       "tags-deactivate-submit": "निष्क्रिय करा",
+       "tags-edit-reason": "कारण:",
        "comparepages": "पानांची तुलना करा",
        "compare-page1": "पान १",
        "compare-page2": "पान २",
        "htmlform-no": "नाही",
        "htmlform-yes": "होय",
        "htmlform-chosen-placeholder": "पर्याय निवडा",
+       "htmlform-cloner-create": "अधिक जोडा",
+       "htmlform-cloner-delete": "हटवा",
+       "htmlform-cloner-required": "किमान एक किंमत हवी",
+       "htmlform-title-not-exists": "[[:$1]] अस्तीत्वात नाही.",
+       "htmlform-user-not-exists": "<strong>$1</strong> अस्तीत्वात नाही.",
+       "htmlform-user-not-valid": "<strong>$1</strong> हे वैध सदस्यनाम नाही.",
        "sqlite-has-fts": "पूर्ण-मजकूर शोध समर्थनासहित $1",
        "sqlite-no-fts": "पूर्ण-मजकूर शोध समर्थनाविरहित $1",
        "logentry-delete-delete": "$1 {{GENDER:$2|वगळलेले पान}} $3",
        "rightsnone": "(काहीही नाही)",
        "revdelete-summary": "संपादन माहिती",
        "feedback-adding": "आपला पश्चप्रदाय (फिडबॅक)  जोडत आहोत या पानास.......",
+       "feedback-back": "परत",
        "feedback-bugcheck": "उत्तम! फक्त एकदा खात्री करा की हा [$1 अगोदरच माहिती असलेला बग] तर नाहीये.",
        "feedback-bugnew": "मी तपासले आहे. हा एक नवीन बग म्हणून नोंद करावी",
        "feedback-bugornote": "जर आपण तांत्रिक प्रश्न  विस्तृतपणे मांडण्यास तयार असाल तर कृपया [$1 गणकदोष वृतांत] पाठवा. नपेक्षा, खाली देण्यात आलेले सोपे आवेदनपत्र वापरा. आपली टिप्पणी \"[$3 $2]\" या पानास आपले सदस्यनाव व आपण कोणता ब्राउजर वापरता यासह जोडण्यात येईल.",
        "feedback-cancel": "रद्द करा",
        "feedback-close": "झाले",
+       "feedback-error-title": "चूक",
        "feedback-error1": "चूक: API कडून अनोळखी परिणाम",
        "feedback-error2": "त्रुटी: संपादन रद्द",
        "feedback-error3": "त्रुटी:एपीआय तर्फे काहीच प्रत्युत्तर नाही",
        "api-error-badaccess-groups": "आपणास ह्या विकिवर संचिका चढवण्याची परवानगी नाही",
        "api-error-badtoken": "अंतर्गत चूक: अयोग्य टोकन",
        "api-error-copyuploaddisabled": "या विदागारावर 'संकेतस्थळावरील संचिका चढविणे' अक्षम करण्यात आले आहे.",
-       "api-error-duplicate": "या संकेतस्थळावर यासारखाच आशय असलेली {{PLURAL:$1|संचिका आहे दुसरी संचिका| दुसऱ्या संचिका}} आहेत.",
-       "api-error-duplicate-archive": "{{PLURAL:$1| another file| some other files}} हे याच नावाने साईट वर आहे आणि   पान {{PLURAL:$1|it was|they were}} वगळले गेले आहे",
+       "api-error-duplicate": "{{PLURAL:$1|दुसरी संचिका|दुसऱ्या इतर संचिका}}ही याच नावाने व याच आशयासह संकेतस्थळावर आहेत.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|दुसरी संचिका|दुसऱ्या इतर संचिका}}ही याच नावाने व याच आशयासह संकेतस्थळावर आहे परंतु{{PLURAL:$1|ते वगळल्या गेले|ती वगळल्या गेलीत}}",
        "api-error-empty-file": "तुम्ही प्रस्तुत केलेली संचिका रिकामी होती.",
        "api-error-emptypage": "नवीन आणि मोकळी पाने बनवायला परवानगी नाही",
        "api-error-fetchfileerror": "अंतर्गत चूक: फाइल मिळवतांना काहीतरी चूक झाली आहे",
        "expand_templates_remove_nowiki": "निकालात <nowiki>खूणपतका दाखवू नका",
        "expand_templates_generate_xml": "XML चा पार्स (parse) वृक्ष दाखवा",
        "expand_templates_preview": "झलक",
+       "pagelang-name": "पान",
+       "mediastatistics-header-office": "कार्यालय",
        "special-characters-group-latin": "लॅटीन",
        "special-characters-group-latinextended": "विस्तारीत लॅटीन भाषा",
        "special-characters-group-ipa": "आंतरराष्ट्रीय उच्चारानुरूप अक्षरपद्धती",
        "special-characters-group-thai": "थाई भाषा",
        "special-characters-group-lao": "लाऒ भाषा",
        "special-characters-group-khmer": "ख्मेर",
-       "special-characters-title-minus": "ॠण चिन्ह"
+       "special-characters-title-minus": "ॠण चिन्ह",
+       "mw-widgets-dateinput-no-date": "कोणताही दिनांक निवडला नाही",
+       "mw-widgets-titleinput-description-new-page": "अद्याप पान अस्तित्वात नाही",
+       "api-error-blacklisted": "कुपया वेगळे वर्णनात्मक शीर्षक निवडा"
 }
index 67508af..8847169 100644 (file)
        "special-characters-group-khmer": "Khmer",
        "special-characters-title-endash": "sengkang en",
        "special-characters-title-emdash": "sengkang em",
-       "special-characters-title-minus": "tanda tolak"
+       "special-characters-title-minus": "tanda tolak",
+       "api-error-blacklisted": "Sila pilih tajuk yang berbeza dan deskriptif."
 }
index 41bc527..af31a1c 100644 (file)
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
        "mw-widgets-dateinput-placeholder-day": "SSSS-XX-ĠĠ",
-       "mw-widgets-dateinput-placeholder-month": "SSSS-XX"
+       "mw-widgets-dateinput-placeholder-month": "SSSS-XX",
+       "api-error-blacklisted": "Jekk jogħġbok agħżel titlu differenti u deskrittiv."
 }
index 216e2f1..6728fed 100644 (file)
        "api-error-unknown-error": "خطای داخلی: زمونی که شما تلاش کاردنی باربی‌یشتن پرونده ره انجوم هادین، اتا چی اشتباه پیش بورده.",
        "api-error-unknown-warning": "اخطار نشناسی‌یه: $1",
        "api-error-uploaddisabled": "باربی‌یشتن این ویکی دله غیرفعاله.",
-       "api-error-verification-error": "ممکن هسته که پرونده رِقِد بورد بائه یا پسوند غلط داره."
+       "api-error-verification-error": "ممکن هسته که پرونده رِقِد بورد بائه یا پسوند غلط داره.",
+       "api-error-blacklisted": "اتا عنوان توصیفی دیگه انتخاب هاکنین."
 }
index 02d98b8..1d00676 100644 (file)
        "sig_tip": "Firma cu data e ora",
        "hr_tip": "Linea orizzontale (ausà cu gedizzio)",
        "summary": "Innece",
-       "subject": "Argomiento/titolo:",
+       "subject": "Suggietto:",
        "minoredit": "Chisto è nu cagnamiénto piccerillo",
        "watchthis": "Tiene d'uocchio chesta paggena",
        "savearticle": "Sarva 'a paggena",
        "missingsummary": "'''Attenziò:''' nun s'è specificato l'oggetto 'e stu cagnamiento. Clicann' 'a \"{{int:savearticle}}\" n'ata vota 'o cagnamiento sarrà sarvato cu l'oggetto abbacante.",
        "selfredirect": "<strong>Attenziò:</strong> State crianno nu redirect a 'o stesso articolo.\nPuò darse c'avites specificato 'o pizzo sbagliato p' 'o redirect, o ca stavate cagnanno 'o pizzo sbagliato.\nSi cliccate \"{{int:savearticle}}\" n'ata vota, si criarrà 'o redirect.",
        "missingcommenttext": "Pe' piacere scrivete nu commento ccà abbascio.",
-       "missingcommentheader": "'''Attenziò:''' nun s'è specificato l'oggetto/titolo 'e stu commento. Clicann' 'a \"{{int:savearticle}}\" n'ata vota 'o cagnamiento sarrà sarvato c' 'o titolo abbacante.",
+       "missingcommentheader": "<strong>Arricurdateve:</strong> nun s'è specificato l'oggetto/titolo pe stu commento. Clicann' 'a \"{{int:savearticle}}\" n'ata vota 'o cagnamiento sarrà sarvato c' 'o titolo/oggetto abbacante.",
        "summary-preview": "Anteprimma'e l'oggetto:",
-       "subject-preview": "Anteprima 'e l'oggetto/intestazione:",
+       "subject-preview": "Anteprimma 'e l'oggetto:",
        "previewerrortext": "È succiesso n'errore quanno se steva a ffà pre-veré 'e cagnamiente vuoste.",
        "blockedtitle": "Utente bloccato.",
        "blockedtext": "<strong>'O nomme utente o ll'IP vuosto è stato bloccato.</strong>\n\n'O blocco è stato mpustato 'a $1. 'O mutivo d' 'o blocco è chesto: ''$2''\n\n* Abbiàta d' 'o blocco: $8\n* Ammaturità d' 'o blocco: $6\n* Tiempo 'e blocco: $7\n\nPutite cuntattà $1 o n'atu [[{{MediaWiki:Grouppage-sysop}}|ammenistratore]] pe' discutere 'o blocco.\n\nVedite c' 'a funzione 'Scrivete a ll'utente' nun è attiva si nun s'è riggistrato 'o ndirizzo e-mail buono dint' 'e [[Special:Preferences|preferenze]] o pùre si ll'uso 'e tale funzione è stato bloccato.\n\n'O ndirizzo IP attuale è $3, 'o nummero ID d' 'o blocco è #$5.\nPe' piacere avite 'e specificà tutte sti dettaglie ccà ncoppa quanno facite cocche dumanna.",
        "svg-long-error": "File SVG invalido: $1",
        "show-big-image": "File 'e origgine",
        "show-big-image-preview": "Dimenziune 'e sta anteprimma: $1.",
+       "show-big-image-preview-differ": "Grannezza 'e sta $3 mostra 'e stu $2 file: $1.",
        "show-big-image-other": "{{PLURAL:$2|N'ata resoluzione|Ati resoluziune}}: $1.",
        "show-big-image-size": "$1 x $2 pixel",
        "file-info-gif-looped": "ciclico",
        "special-characters-title-minus": "segno meno",
        "mw-widgets-dateinput-no-date": "Nisciuna data scigliuta",
        "mw-widgets-titleinput-description-new-page": "'a pàggene nun esiste ancore",
-       "mw-widgets-titleinput-description-redirect": "redirezionate ncopp' a $1"
+       "mw-widgets-titleinput-description-redirect": "redirezionate ncopp' a $1",
+       "api-error-blacklisted": "Pe' piacere sciglite nu titolo differente e descrittivo."
 }
index fe94033..5deced8 100644 (file)
        "mw-widgets-dateinput-placeholder-day": "ÅÅÅÅ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
        "mw-widgets-titleinput-description-new-page": "side eksisterer ikke enda",
-       "mw-widgets-titleinput-description-redirect": "omdiriger til $1"
+       "mw-widgets-titleinput-description-redirect": "omdiriger til $1",
+       "api-error-blacklisted": "Vennligst velg en annen beskrivende tittel."
 }
index cd97178..0292bf1 100644 (file)
        "special-characters-group-khmer": "Khmer",
        "special-characters-title-endash": "liggend streepjen",
        "special-characters-title-emdash": "gedachtenstreepjen",
-       "special-characters-title-minus": "minteken"
+       "special-characters-title-minus": "minteken",
+       "api-error-blacklisted": "Kies n aandere, beschrievende naam."
 }
index 6e2b45b..8bf7425 100644 (file)
        "createacct-captcha": "सुरक्षा जाँच",
        "createacct-imgcaptcha-ph": "माथि देखिए अनुसारको पाठ भर्नुहोस्",
        "createacct-submit": "तपाईँको खाता सिर्जना गर्नुहोस",
-       "createacct-another-submit": "à¤\85रà¥\8dà¤\95à¥\8b à¤\96ाता à¤¸à¤¿à¤°à¥\8dà¤\9cना à¤\97र्नुहोस्",
+       "createacct-another-submit": "à¤\96ाता à¤\96à¥\8bल्नुहोस्",
        "createacct-benefit-heading": "{{SITENAME}} तपाईँ जस्तै मानिसहरूद्वारा सिर्जना गरिएको हो ।",
        "createacct-benefit-body1": "{{PLURAL:$1|सम्पादन|सम्पादनहरू}}",
        "createacct-benefit-body2": "{{PLURAL:$1|पृष्ठ|पृष्ठहरू}}",
        "passwordreset-emailsent-capture": "पासवर्ड परिवर्तनको लागि इमेल पठाइयो, जुन तल देखाइएकोछ।",
        "passwordreset-emailerror-capture": "पासवर्ड रिसेट इमेल जारि गरिएको छ, जुन तल देखाइएको छ, तर यसलाई {{GENDER:$2|प्रयोगकर्ता}}मा पठाउन विफल भयो: $1",
        "changeemail": "इमेल ठेगाना परिवर्तन गर्नुहोस",
-       "changeemail-text": "आफ्नो इमेल ठेगाना परिवर्तन गर्न यो फारम भर्नुहोस् । यसलाई पुष्टि गर्न तपाईंले आफ्नो पासवर्ड हाल्नु पर्नेछ।",
+       "changeemail-header": "खाताको इमेल ठेगाना परिवर्तन गर्नुहोस",
        "changeemail-no-info": "यस पृष्ठमा सिधै जानको लागि प्रवेश गर्नु पर्ने हुन्छ ।",
        "changeemail-oldemail": "हालको इमेल-ठेगाना:",
        "changeemail-newemail": "नयाँ इमेल-ठेगाना:",
        "columns": "स्तम्भहरु :",
        "searchresultshead": "खोज",
        "stub-threshold": "<a href=\"#\" class=\"stub\">ठूटो</a> को लागि थ्रेसहोल्ड स्वरूपण (बाइट):",
+       "stub-threshold-sample-link": "उदाहरण",
        "stub-threshold-disabled": "निष्क्रिय",
        "recentchangesdays": "हालको परिवर्तनमा देखाउने दिनहरू:",
        "recentchangesdays-max": "अधिकतम $1 {{PLURAL:$1|दिन|दिन}}",
        "upload-too-many-redirects": "यस युआरयलमा धेरै पुननिर्देशनहरू छन्",
        "upload-http-error": "HTTP त्रुटि भयो: $1",
        "upload-copy-upload-invalid-domain": "यस डोमेनबाट अपलोडहरूको प्रतिलिपि गर्न सकिदैन् ।",
+       "upload-dialog-title": "फाइल अपलोड गर्ने",
+       "upload-dialog-button-cancel": "रद्द गर्ने",
+       "upload-dialog-button-done": "सकियो",
+       "upload-dialog-button-save": "सङ्ग्रह गर्ने",
+       "upload-dialog-button-upload": "अपलोड गर्ने",
+       "upload-process-error": "एक त्रुटि भयो ।",
+       "upload-form-label-select-file": "फाइल छान्नुहोस्",
+       "upload-form-label-infoform-title": "विवरणहरू",
+       "upload-form-label-infoform-name": "नाम",
+       "upload-form-label-infoform-description": "वर्णन",
+       "upload-form-label-usage-title": "प्रयोग",
+       "upload-form-label-usage-filename": "फाइल नाम",
+       "foreign-structured-upload-form-label-infoform-categories": "श्रेणीहरू",
+       "foreign-structured-upload-form-label-infoform-date": "मिति",
        "backend-fail-stream": "फाइल ''$1'' प्रवाह गर्न सकिएन ।",
        "backend-fail-backup": "फाइल ''$1'' जगेडा संग्रह गर्न सकिएन ।",
        "backend-fail-notexists": "फाइल $1 पृष्ठ अस्तित्वमा छैन ।",
        "rollback-success": "$1द्वारा उल्टाइएका सम्पादनहरू;\nपछिल्लो संशोधनमा $2द्वारा परिवर्तन गरि पुनः फर्काइएको।",
        "sessionfailure-title": "सत्र त्रुटी",
        "sessionfailure": "यस्तो लागदैछ कि तपाईंको लगइन सत्रसँग कुनै समस्या छ। सत्र अपहरणबाट बचाउन को लागि सावधानीको रूपमा तपाईंको यो क्रियाकलाप रद्द गरिएको छ। कृपया पछाडी जानुहोस र पृष्ठलाई पुनः लोड गर्नुहोस, अनि फेरी प्रयास गर्नुहोला।",
+       "logentry-contentmodel-change-revertlink": "पहिलेको रुपमा फर्काउने",
+       "logentry-contentmodel-change-revert": "पहिलेको रुपमा फर्काउने",
        "protectlogpage": "सुरक्षण लग",
        "protectlogtext": "तल पृष्ठ सुरक्षामा भएको परिवर्तनहरूको सूची हो ।\nवर्तमान सुरक्षित पृष्ठहरूको लागि सुरक्षित [[Special:ProtectedPages|पृष्ठहरूको सूची]] हेर्नुहोस।",
        "protectedarticle": "\"[[$1]]\" लाई सुरक्षित गरियो",
        "version-libraries": "स्थापित पुस्तकालयहरू",
        "version-libraries-library": "पुस्तकालय",
        "version-libraries-version": "संस्करण",
+       "version-libraries-license": "अनुमतिपत्र",
+       "version-libraries-description": "वर्णन",
+       "version-libraries-authors": "लेखकहरू",
        "redirect": "फाइल, प्रयोगकर्ता, वा संशोधन आइडीको आधारमा अनुप्रेषित गर्ने",
        "redirect-legend": "फाइल वा पृष्ठमा रिडाइरेक्ट",
        "redirect-summary": "यस विशेष पृष्ठ (प्रदान गरिएको फाइलनाम), पृष्ठको (पृष्ठ आइडी अथवा अवतरण आइडी), वा (प्रयोगकर्ता आइडी) राख्दा प्रयोगकर्तापृष्ठमा मा सारिनेछ। उदाहरण: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], वा [[{{#Special:Redirect}}/user/101]]।",
        "special-characters-title-emdash": "इएम ड्यास",
        "special-characters-title-minus": "घटाउने चिन्ह",
        "mw-widgets-titleinput-description-new-page": "हालसम्म पृष्ठ उपलब्ध छैन्",
-       "mw-widgets-titleinput-description-redirect": "$1 मा जाने"
+       "mw-widgets-titleinput-description-redirect": "$1 मा जाने",
+       "api-error-blacklisted": "एउटा फरक वर्णनात्मक शीर्षक चयन गर्नुहोस् ।"
 }
index 2a28340..068a16e 100644 (file)
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "pagina bestaat nog niet",
-       "mw-widgets-titleinput-description-redirect": "doorverwijzing naar $1"
+       "mw-widgets-titleinput-description-redirect": "doorverwijzing naar $1",
+       "api-error-blacklisted": "Kies een andere, beschrijvende naam."
 }
index a8b69d5..54a1f20 100644 (file)
        "special-characters-group-sinhala": "Singalesisk",
        "special-characters-group-gujarati": "Gujarati",
        "mw-widgets-dateinput-placeholder-day": "ÅÅÅÅ-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM"
+       "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
+       "api-error-blacklisted": "Vel eit anna namn som er meir skildrande."
 }
index ffb6e1c..61c61ac 100644 (file)
        "pt-login-button": "Kirjuttai",
        "pt-createaccount": "Registriiruiččei",
        "pt-userlogout": "Kirjuttai ullos",
+       "php-mail-error-unknown": "Tundematoi haireh PHP:n mail()-funktsies",
        "user-mail-no-addy": "Opit työndiä sähköpoštan sähköpoštuadressittah.",
+       "user-mail-no-body": "Sähköpoštan syväindön pidäy olla pitkembi.",
        "changepassword": "Vaihta peittosana",
        "resetpass_announce": "Suaja sizähkirjuamine loppuh, sinul pidäy keksie uuzi peittosana.",
        "resetpass_header": "Vaihta tilin peittosana",
        "retypenew": "Kirjuta peittosana uvvessah:",
        "resetpass_submit": "Azeta peittosana da kirjuttai sistiemah:",
        "changepassword-success": "Sinun peittosana on vaihtettu!",
+       "changepassword-throttled": "Olet oppinuh kirjuttuakseh liijan moni kerdua. Ole hyvä, vuota $1 enne ku opit uvvessah.",
        "resetpass_forbidden": "Ei voi vaihtua peittosanua",
        "resetpass-no-info": "Et voi nähtä tädä sivuu kuni et ole kirjutannuhes.",
        "resetpass-submit-loggedin": "Vaihta peittosana",
        "showpreview": "Ezikačo",
        "showdiff": "Luajitut korjavukset",
        "anoneditwarning": "<strong>Varaitus:</strong> Et ole kirjutannuhes. Luadinet muutoksii syväindölöih, sinun Ip-adressu tulou nägövih kaikile. Ku <strong>[$1 kirjutannuttos]</strong> libo <strong>[$2 registriiruičettos]</strong>, sinun syväindömuutokset nävytäh sinun käyttäinimel, toizien eduloin ližäkse.",
+       "summary-preview": "Yhtehvevon ezikačondu:",
+       "subject-preview": "Tiemam ezikačondu:",
+       "previewerrortext": "Rodih haireh oppijes ezikaččuo muutoksii.",
        "blockedtitle": "Käyttäi on estetty",
        "blockednoreason": "ei viärysty annettu",
+       "whitelistedittext": "Sinun pidäy $1 ku edituija sivuloi.",
+       "nosuchsectiontitle": "Nengostu sektua ei ole",
+       "loginreqtitle": "Pidäy kirjautuakseh",
        "loginreqlink": "kirjuttai",
        "loginreqpagetext": "Toizien sivuloin kaččomizekse pidäy $1.",
        "accmailtitle": "Peittosana työtty",
        "editing": "Edituijah sivuu $1",
        "creating": "Luajitah sivuu \"$1\"",
        "editingsection": "Korjuandu $1 (alalugu)",
+       "editingcomment": "Edituijah $1 (uuzi sektu)",
        "yourtext": "Sinun tekstu",
        "yourdiff": "Erot",
        "templatesused": "{{PLURAL:$1|Šablon|Šablonat}} käytetty täl sivul:",
index 2d78f6e..7b33d53 100644 (file)
        "passwordreset-emailsent-capture": "ତଳେ ଦେଖାଯାଉଥିବା ଭଳି, ପାସୱାର୍ଡ଼ ପୁନଃସ୍ଥାପନ ଇମେଲଟିଏ ପଠାଇଦିଆଯାଇଛି ।",
        "passwordreset-emailerror-capture": "ପାସୱାର୍ଡ଼ ବଦଳାଇବା ସୂଚନା ସହ ଇମେଲଟିଏ ତିଆରି ହୋଇଛି, ଯାହା ତଳେ ଦେଖିପାରିବେ । କିନ୍ତୁ ଏହାକୁ {{GENDER:$2|ସଭ୍ୟ}}ଙ୍କୁ ପଠାଇବାରେ ବିଫଳ ହେଲୁ, କାରଣ: $1",
        "changeemail": "ଇ-ମେଲ ଠିକଣା ବଦଳାଇବେ",
-       "changeemail-text": "ଆପଣା ଇ-ମେଲ ଠିକଣା ବଦଳାଇବା ନିମନ୍ତେ ଏହି ଆବେଦନ ପତ୍ରଟି ପୂରଣ କରନ୍ତୁ । ଆପଣଙ୍କୁ ଏହି ବଦଳ ଥୟ କରିବା ପାଇଁ ନିଜର ପାସୱାର୍ଡ଼ ଦେବାକୁ ପଡ଼ିବ ।",
+       "changeemail-header": "ଖାତା ଇ-ମେଲ ଠିକଣା ବଦଳାଇବେ",
        "changeemail-no-info": "ଏହି ପୃଷ୍ଠାଟିକୁ ସିଧା ଖୋଲିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ଲଗ ଇନ କରିବାକୁ ପଡ଼ିବ ।",
        "changeemail-oldemail": "ଏବେର ଇ-ମେଲ ଠିକଣା:",
        "changeemail-newemail": "ନୂଆ ଇ-ମେଲ ଠିକଣା:",
        "special-characters-title-endash": "en ଡ୍ୟାସ",
        "special-characters-title-emdash": "em dash",
        "special-characters-title-minus": "ମେନୁଗୁଡିକର ଚିହ୍ନ",
-       "mw-widgets-titleinput-description-redirect": "$1କୁ ପୁନଃପ୍ରେରଣ କରିବେ"
+       "mw-widgets-titleinput-description-redirect": "$1କୁ ପୁନଃପ୍ରେରଣ କରିବେ",
+       "api-error-blacklisted": "ଦୟାକରି ଏକ ଅଲଗା, ବିବରଣୀ ଶିରୋନାମାରେ ରଖିବେ ।"
 }
index 5c506c0..594e26b 100644 (file)
        "passwordreset-emailsent-capture": "ਇੱਕ ਯਾਦ-ਦਹਾਨੀ ਈ-ਮੇਲ, ਜਿਹੜੀ ਕਿ ਹੇਠਾਂ ਦਿੱਸ ਰਹੀ ਹੈ, ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।",
        "passwordreset-emailerror-capture": "ਪਛਾਣ-ਸ਼ਬਦ ਮੁੜ ਬਣਾਉਣ ਵਾਸਤੇ ਈਮੇਲ ਤਿਆਰ ਹੋ ਗਈ ਸੀ, ਜੋ ਹੇਠਾਂ ਵਿਖਾਈ ਗਈ ਹੈ, ਪਰ ਇਹਨੂੰ {{GENDER:$2|ਵਰਤੋਂਕਾਰ}} ਵੱਲ ਨਹੀਂ ਘੱਲਿਆ ਜਾ ਸਕਿਆ: $1",
        "changeemail": "ਈ-ਮੇਲ ਸਿਰਨਾਵਾਂ ਬਦਲੋ",
-       "changeemail-text": "ਆਪਣਾ ਈ-ਮੇਲ ਪਤਾ ਬਦਲਣ ਲਈ ਇਹ ਫ਼ਾਰਮ ਮੁਕੰਮਲ ਕਰੋ। ਇਸ ਤਬਦੀਲੀ ਨੂੰ ਤਸਦੀਕ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖ਼ਲ ਕਰਨਾ ਪਵੇਗਾ।",
+       "changeemail-header": "ਖਾਤੇ ਵਾਲਾ ਈ-ਮੇਲ ਸਿਰਨਾਵਾਂ ਬਦਲੋ",
        "changeemail-no-info": "ਇਸ ਸਫ਼ੇ ਨੂੰ ਸਿੱਧੇ ਹੀ ਵੇਖਣ ਲਈ ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਕਰਨਾ ਪਵੇਗਾ।",
        "changeemail-oldemail": "ਮੌਜੂਦਾ ਈਮੇਲ ਸਿਰਨਾਵਾਂ:",
        "changeemail-newemail": "ਨਵਾਂ ਈ-ਮੇਲ ਸਿਰਨਾਵਾਂ:",
        "rollbackfailed": "ਰੋਲਬੈਕ ਫੇਲ੍ਹ",
        "editcomment": "ਸੋਧ ਸਾਰ ਸੀ: \"''$1''\"",
        "sessionfailure-title": "ਇਜਲਾਸ ਫੇਲ੍ਹ",
+       "changecontentmodel-title-label": "ਸਫ਼ੇ ਦਾ ਸਿਰਲੇਖ",
+       "changecontentmodel-reason-label": "ਕਾਰਨ:",
        "protectlogpage": "ਸੁਰੱਖਿਆ ਚਿੱਠਾ",
        "protectedarticle": "\"[[$1]]\" ਸੁਰੱਖਿਅਤ ਕੀਤਾ",
        "modifiedarticleprotection": "\"[[$1]]\" ਦੀ ਸੁਰੱਖਿਆ ਬਦਲੀ",
        "movenotallowed": "ਤੁਹਾਡੇ ਕੋਲ਼ ਸਫ਼ੇ ਹਿਲਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "movenotallowedfile": "ਤੁਹਾਨੂੰ ਫ਼ਾਈਲਾਂ ਭੇਜਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "cant-move-user-page": "ਤੁਹਾਨੂੰ ਵਰਤੋਂਕਾਰ ਸਫ਼ਿਆਂ (ਉਪ-ਸਫ਼ਿਆਂ ਤੋਂ ਛੁੱਟ) ਨੂੰ ਭੇਜਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
-       "newtitle": "ਨਵà©\87à¨\82 à¨\9fਾà¨\88à¨\9fਲ à¨²à¨\88:",
+       "newtitle": "ਨਵਾà¨\82 à¨¸à¨¿à¨°à¨²à©\87à¨\96:",
        "move-watch": "ਸਰੋਤ ਤੇ ਟਾਰਗੇਟ ਸਫ਼ੇ ਉੱਤੇ ਨਿਗਰਾਨੀ ਰੱਖੋ",
        "movepagebtn": "ਸਫ਼ਾ ਭੇਜੋ",
        "pagemovedsub": "ਭੇਜਣਾ ਸਫ਼ਲ ਰਿਹਾ",
index 121713b..453c8de 100644 (file)
        "svg-long-error": "Nieprawidłowy plik SVG:$1",
        "show-big-image": "Rozmiar pierwotny",
        "show-big-image-preview": "Rozmiar podglądu – $1.",
+       "show-big-image-preview-differ": "Wielkość pliku podglądu $3 dla pliku $2: $1",
        "show-big-image-other": "{{PLURAL:$2|Inna rozdzielczość|Inne rozdzielczości}}: $1.",
        "show-big-image-size": "$1 x $2 pikseli",
        "file-info-gif-looped": "zapętlony",
        "mw-widgets-dateinput-placeholder-day": "RRRR-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "RRRR-MM",
        "mw-widgets-titleinput-description-new-page": "strona jeszcze nie istnieje",
-       "mw-widgets-titleinput-description-redirect": "przekierowanie do $1"
+       "mw-widgets-titleinput-description-redirect": "przekierowanie do $1",
+       "api-error-blacklisted": "Wybierz inny, opisowy tytuł."
 }
index e8dce60..207f175 100644 (file)
        "passwordreset-emailsent-capture": "Un mëssagi ëd riampostassion ëd la ciav a l'é stàit mandà, e a l'é mostrà sì-sota.",
        "passwordreset-emailerror-capture": "Un mëssagi ëd riampostassion ëd la ciav a l'é stàit generà, e a l'é smonù sì-sota, ma la spedission a {{GENDER:$2|l'utent}} a l'é falìa: $1",
        "changeemail": "Cangé l'adrëssa ëd pòsta eletrònica",
-       "changeemail-text": "Ch'a completa 's formolari për cangé soa adrëssa eletrònica. A dev anserì soa ciav për confirmé costa modìfica.",
+       "changeemail-header": "Cangé l'adrëssa ëd pòsta eletrònica dël cont",
        "changeemail-no-info": "A dev esse intrà ant ël sistema për andé diretament a costa pàgina.",
        "changeemail-oldemail": "Adrëssa ëd pòsta eletrònica atual:",
        "changeemail-newemail": "Adrëssa ëd pòsta eletrònica neuva:",
        "special-characters-title-emdash": "tratin em",
        "special-characters-title-minus": "segn meno",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "AAAA-MM"
+       "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "api-error-blacklisted": "Për piasì sern un tìtol diferent, descritiv."
 }
index b6c17e3..e90a32f 100644 (file)
        "passwordreset-emailsent-capture": "اک یاد کران والی ای-میل پیج دتی گئی اے، جیہڑی تھلے دسی گئی اے۔",
        "passwordreset-emailerror-capture": "اک یادکراؤ ای-میل بنائی گئی اے، جیہڑی کہ تھلے دسی گئی اے، پر ورتن والے تک پیجنا نئیں ہوسکیا:$1",
        "changeemail": "ای-میل پتہ بدلو",
-       "changeemail-text": "اس فارم نوں پورا کر کے ای-میل پتہ بدلو۔ اس کم نوں پورا کرن واسطے توانوں اپنی کنجی لکھنی پۓ گی۔",
+       "changeemail-header": "کھاتے دا ای-میل پتہ بدلو",
        "changeemail-no-info": "تسی لاگ ان ہوکے ای اس صفحے نوں ویکھ سکدے او۔",
        "changeemail-oldemail": "ہلے دا ای-میل پتہ:",
        "changeemail-newemail": "نواں ای-میل پتہ:",
        "special-characters-group-gujarati": "گجراتی",
        "special-characters-group-thai": "تھائی",
        "special-characters-group-lao": "لاؤ",
-       "special-characters-group-khmer": "کھیمر"
+       "special-characters-group-khmer": "کھیمر",
+       "api-error-blacklisted": "مہربانی کرکے وکھری سرخی چنو۔"
 }
index 022a4b0..9711ee9 100644 (file)
        "viewsource": "Ver código-fonte",
        "viewsource-title": "Exibir código-fonte para $1",
        "actionthrottled": "Ação controlada",
-       "actionthrottledtext": "Como medida \"anti-spam\", você se encontra impedido de realizar esta operação muitas vezes em um curto espaço de tempo; você já excedeu esse limite.\nTente novamente em alguns minutos.",
+       "actionthrottledtext": "Como uma medida anti-abuso, você está impedido de realizar esta operação muitas vezes em um curto espaço de tempo, e já excedeu esse limite. Por favor, tente novamente em alguns minutos.",
        "protectedpagetext": "Esta página foi protegida contra novas edições ou ações relacionadas.",
        "viewsourcetext": "Você pode ver e copiar o código desta página.",
        "viewyourtext": "Você pode ver e copiar o código fonte '''das suas edições''' a esta página.",
        "passwordreset-emailtext-ip": "Alguém (provavelmente você, a partir do endereço IP $1)\nsolicitou um lembrete dos seus detalhes de conta para {{SITENAME}} ($4).\n{{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este e-mail:\n\n$2\n\n{{PLURAL:$3|Esta senha temporária vai|Essas senhas temporárias vão}} expirar em {{PLURAL:$5|um dia|$5 dias}}.\nVocê deve efetuar login e escolher uma nova senha agora.\nSe você conseguir lembrar da senha, ignore este e-mail e continue\nusando sua senha anterior. Caso contrário, prossiga com as instruções\ndisponíveis no link.",
        "passwordreset-emailtext-user": "O usuário $1 da {{SITENAME}} pediu a recuperação dos detalhes da sua conta na {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este e-mail:\n\n$2\n\n{{PLURAL:$3|Esta senha temporária irá|Estas senhas temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}. Deve autenticar-se e escolher uma senha nova agora. Se este pedido não foi feito por si, ou se entretanto se recordou da sua senha original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a senha antiga.",
        "passwordreset-emailelement": "Usuário: \n$1\n\nSenha temporária: \n$2",
-       "passwordreset-emailsent": "Foi enviado um e-mail de lembrete.",
+       "passwordreset-emailsent": "Se este é um endereço de e-mail registrado para a sua conta, em seguida, um e-mail de redefinição de senha será enviada.",
        "passwordreset-emailsent-capture": "Foi enviado um e-mail de lembrete, que é mostrado abaixo.",
        "passwordreset-emailerror-capture": "Foi gerado um e-mail de recuperação da senha, conforme mostrado abaixo, mas o envio {{GENDER:$2|ao usuário|à usuária}} falhou. $1",
-       "changeemail": "Alterar o endereço de e-mail",
-       "changeemail-header": "Alterar o endereço de e-mail da conta",
+       "changeemail": "Alterar ou remover endereço de email",
+       "changeemail-header": "Preencha este formulário para alterar seu endereço de e-mail. Se você gostaria de remover a associação de qualquer endereço de e-mail da sua conta, deixe o novo endereço de email em branco quando enviar o formulário.",
+       "changeemail-passwordrequired": "Você terá que digitar sua senha para confirmar esta mudança.",
        "changeemail-no-info": "Para acessar diretamente esta página você tem de estar autenticado.",
        "changeemail-oldemail": "Endereço de e-mail atual:",
        "changeemail-newemail": "Novo endereço de e-mail:",
+       "changeemail-newemail-help": "Este campo deve ser deixado em branco se você quiser remover o seu endereço de e-mail. Você não será capaz de redefinir uma senha esquecida e não receber e-mails a partir desta wiki se o endereço de email é removido.",
        "changeemail-none": "(nenhum)",
        "changeemail-password": "Sua senha para o wiki {{SITENAME}}:",
        "changeemail-submit": "Alterar e-mail",
        "sig_tip": "Sua assinatura, com hora e data",
        "hr_tip": "Linha horizontal (use de forma moderada)",
        "summary": "Sumário:",
-       "subject": "Assunto/cabeçalho:",
+       "subject": "Assunto:",
        "minoredit": "Marcar como edição menor",
        "watchthis": "Vigiar esta página",
        "savearticle": "Salvar página",
        "permissionserrorstext-withaction": "Você não possui permissão para $2, {{PLURAL:$1|pelo seguinte motivo|pelos motivos a seguir}}:",
        "recreate-moveddeleted-warn": "'''Atenção: Você está recriando uma página já eliminada em outra ocasião.'''\n\nConsidere se é realmente adequado continuar editando esta página.\nOs registros de eliminação e de movimentação desta página são exibidos a seguir, para sua comodidade:",
        "moveddeleted-notice": "Esta página foi eliminada.\nOs registros de eliminação e de movimentação para esta página estão disponibilizados abaixo, para referência.",
+       "moveddeleted-notice-recent": "Desculpe, esta página foi excluído recentemente (nos últimos 24 horas). A eliminação e se mover para a página de log são fornecidos abaixo para referência.",
        "log-fulllog": "Ver registro detalhado",
        "edit-hook-aborted": "Edição abortada por ''hook''.\nEle não deu nenhuma explicação.",
        "edit-gone-missing": "Não foi possível atualizar a página.\nEla parece ter sido eliminada.",
        "prefs-watchlist-token": "Senha para a lista de páginas vigiadas:",
        "prefs-misc": "Diversos",
        "prefs-resetpass": "Alterar senha",
-       "prefs-changeemail": "Alterar e-mail",
+       "prefs-changeemail": "Alterar ou remover endereço de email",
        "prefs-setemail": "Definir um endereço de e-mail",
        "prefs-email": "Opções de email",
        "prefs-rendering": "Aparência",
        "group-bot": "Robôs",
        "group-sysop": "Administradores",
        "group-bureaucrat": "Burocratas",
-       "group-suppress": "Oversights",
+       "group-suppress": "Supressores",
        "group-all": "(todos)",
        "group-user-member": "{{GENDER:$1|usuário|usuária}}",
        "group-autoconfirmed-member": "{{GENDER:$1|usuário autoconfirmado|usuária autoconfirmada|usuário(a) autoconfirmado(a)}}",
        "recentchangeslinked-summary": "Esta página lista alterações feitas recentemente em páginas com links a uma em específico (ou de membros de uma categoria especificada).\nPáginas de sua [[Special:Watchlist|lista de páginas vigiadas]] são exibidas em '''negrito'''.",
        "recentchangeslinked-page": "Nome da página:",
        "recentchangeslinked-to": "Visualizar as alterações nas páginas vinculadas à página especificada ao invés disso",
+       "recentchanges-page-added-to-category": "[[:$1]]adicionada à categoria",
        "upload": "Enviar arquivo",
        "uploadbtn": "Enviar arquivo",
        "reuploaddesc": "Cancelar o envio e retornar ao formulário de upload",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "a página ainda não existe",
-       "mw-widgets-titleinput-description-redirect": "redirecionar para $1"
+       "mw-widgets-titleinput-description-redirect": "redirecionar para $1",
+       "api-error-blacklisted": "Por favor, escolha  um título descritivo diferente."
 }
index 99cdc20..17d678c 100644 (file)
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "a página ainda não existe.",
-       "mw-widgets-titleinput-description-redirect": "redirecionar para $1"
+       "mw-widgets-titleinput-description-redirect": "redirecionar para $1",
+       "api-error-blacklisted": "Escolha um título diferente e descritivo, por favor."
 }
index a6e9c22..95bd205 100644 (file)
        "upload-dialog-button-done": "Button to close the dialog once upload is complete\n{{Identical|Done}}",
        "upload-dialog-button-save": "Button to save the file\n{{Identical|Save}}",
        "upload-dialog-button-upload": "Button to initiate upload\n{{Identical|Upload}}",
-       "upload-process-error": "Error message from upload",
-       "upload-process-warning": "Warning message from upload",
        "upload-form-label-select-file": "Label for the select file widget\n{{Identical|Select file}}",
        "upload-form-label-infoform-title": "Title for the information form\n{{Identical|Detail}}",
        "upload-form-label-infoform-name": "Label for the file name input\n{{Identical|Name}}",
        "svg-long-error": "Displayed for invalid SVG file metadata. Parameters:\n* $1 - the error message\nSee also:\n* {{msg-mw|Thumbnail error}}",
        "show-big-image": "Displayed under the file on file description pages, when a reduced-size thumbnail of the original file is being displayed.\n{{Identical|Original file}}",
        "show-big-image-preview": "Message shown under the image description page thumbnail.\n\nCan be followed by {{msg-mw|Show-big-image-other}}.\n\nParameters:\n* $1 - a link which points to the thumbnail. Its text is {{msg-mw|Show-big-image-size}}",
+       "show-big-image-preview-differ": "Like {{msg-mw|show-big-image-preview}}, but used in the case where the thumbnail of the file is in a different format than the original image (e.g. For SVG or DjVu files).\n\n* $1 - a link which points to the thumbnail. Its text is {{msg-mw|Show-big-image-size}}\n* $2 Uppercase normalized extension of original file.\n* $3 Uppercased extension of thumbnail.",
        "show-big-image-other": "Message shown under the image description page thumbnail.\n\nPreceded by {{msg-mw|Show-big-image-preview}}, if the image is in high resolution.\n\nParameters:\n* $1 - list of resolutions (pipe-separated)\n* $2 - number of resolutions",
        "show-big-image-size": "Parameters:\n* $1 - the width of the image(s) in pixels\n* $2 - the height of the image(s) in pixels",
        "file-info-gif-looped": "Part of the information provided about a [[w:Gif|.gif file]] on its file description page. Looped means repeating in the context of an animated gif. It is a sequence of images, each displayed after the other, and the first one displayed after the last, in a never ending loop. For example of message in use see [[:File:Mouse10.gif]].\n{{Identical|Looped}}",
        "mw-widgets-dateinput-placeholder-day": "[[File:DateInputWidget active, empty.png|frame|Screenshot]]\nPlaceholder displayed in a date input field when it's empty, representing a date format with 4 digits for year, 2 digits for month, and 2 digits for day, separated with hyphens. This should be uppercase, if possible, and must not include any additional explanations. If there is no good way to translate it, make this message blank.",
        "mw-widgets-dateinput-placeholder-month": "Placeholder displayed in a date input field when it's empty, representing a date format with 4 digits for year and 2 digits for month, separated with hyphens (without a day). This should be uppercase, if possible, and must not include any additional explanations. If there is no good way to translate it, make this message blank.",
        "mw-widgets-titleinput-description-new-page": "Description label for a new page in the title input widget.",
-       "mw-widgets-titleinput-description-redirect": "Description label for a redirect in the title input widget."
+       "mw-widgets-titleinput-description-redirect": "Description label for a redirect in the title input widget.",
+       "api-error-blacklisted": "Used as error message.\n\nFollowed by the link {{msg-mw|Mwe-upwiz-feedback-blacklist-info-prompt}}."
 }
index a2f6f98..3693e3a 100644 (file)
@@ -32,8 +32,8 @@
                ]
        },
        "tog-underline": "Sublinierea legăturilor:",
-       "tog-hideminor": "Ascunde modificările minore în schimbări recente",
-       "tog-hidepatrolled": "Ascunde modificările patrulate în schimbările recente",
+       "tog-hideminor": "Ascunde modificările minore din schimbările recente",
+       "tog-hidepatrolled": "Ascunde modificările patrulate din schimbările recente",
        "tog-newpageshidepatrolled": "Ascunde paginile patrulate din lista de pagini noi",
        "tog-extendwatchlist": "Extinde lista de articole urmărite pentru a arăta toate schimbările efectuate, nu doar pe cele mai recente",
        "tog-usenewrc": "Grupează modificările după pagină în cadrul schimbărilor recente și listei paginilor urmărite",
        "tog-enotifwatchlistpages": "Trimite-mi un e-mail atunci când o pagină sau un fișier din lista mea de pagini urmărite suferă modificări",
        "tog-enotifusertalkpages": "Trimite-mi un email când pagina mea de discuții este modificată",
        "tog-enotifminoredits": "Trimite-mi, de asemenea, un e-mail în caz de modificări minore asupra paginilor și fișierelor",
-       "tog-enotifrevealaddr": "Descoperă-mi adresa email în mesajele de notificare",
+       "tog-enotifrevealaddr": "Afișează-mi adresa de e-mail în mesajele de notificare",
        "tog-shownumberswatching": "Arată numărul utilizatorilor care urmăresc",
        "tog-oldsig": "Semnătură actuală:",
        "tog-fancysig": "Tratează semnătura ca wikitext (fără o legătură automată)",
        "tog-uselivepreview": "Folosește previzualizarea în timp real",
        "tog-forceeditsummary": "Avertizează-mă când uit să descriu modificările",
-       "tog-watchlisthideown": "Ascunde modificările mele la lista mea de urmărire",
-       "tog-watchlisthidebots": "Ascunde modificările boților la lista mea de urmărire",
+       "tog-watchlisthideown": "Ascunde modificările mele din lista de pagini urmărite",
+       "tog-watchlisthidebots": "Ascunde modificările roboților din lista de pagini urmărite",
        "tog-watchlisthideminor": "Ascunde modificările minore din lista de pagini urmărite",
-       "tog-watchlisthideliu": "Ascunde modificările făcute de utilizatori anonimi din lista de pagini urmărite",
+       "tog-watchlisthideliu": "Ascunde modificările efectuate de utilizatori autentificați din lista de pagini urmărite",
        "tog-watchlisthideanons": "Ascunde modificările făcute de utilizatori anonimi din lista de pagini urmărite",
        "tog-watchlisthidepatrolled": "Ascunde paginile patrulate din lista de pagini urmărite",
-       "tog-ccmeonemails": "Doresc să primesc o copie a mesajelor e-mail pe care le trimit",
+       "tog-ccmeonemails": "Doresc să primesc o copie a mesajelor e-mail pe care le trimit altor utilizatori",
        "tog-diffonly": "Nu arăta conținutul paginii sub dif",
        "tog-showhiddencats": "Arată categoriile ascunse",
        "tog-norollbackdiff": "Nu arăta diferența după efectuarea unei reveniri",
        "category_header": "Pagini din categoria „$1”",
        "subcategories": "Subcategorii",
        "category-media-header": "Fișiere media din categoria „$1”",
-       "category-empty": "''Această categorie nu conține momentan nici o pagină sau fișier media.''",
+       "category-empty": "<em>Această categorie nu conține momentan nicio pagină sau fișier media.</em>",
        "hidden-categories": "{{PLURAL:$1|Categorie ascunsă|Categorii ascunse}}",
        "hidden-category-category": "Categorii ascunse",
        "category-subcat-count": "{{PLURAL:$2|Această categorie conține doar următoarea subcategorie.|Această categorie conține {{PLURAL:$1|următoarea subcategorie|următoarele $1 subcategorii|următoarele $1 de subcategorii}}, dintr-un total de $2.}}",
        "category-subcat-count-limited": "Această categorie conține {{PLURAL:$1|următoarea subcategorie|următoarele $1 subcategorii|următoarele $1 de subcategorii}}.",
-       "category-article-count": "{{PLURAL:$2|Această categorie conține doar următoarea pagină.|{{PLURAL:$1|Următoarea pagină|Următoarele $1 pagini}} se află în această categorie, dintr-un total de $2.}}",
+       "category-article-count": "{{PLURAL:$2|Această categorie conține doar următoarea pagină.|{{PLURAL:$1|Următoarea pagină|Următoarele $1 pagini|Următoarele $1 de pagini}} se află în această categorie, dintr-un total de $2.}}",
        "category-article-count-limited": "{{PLURAL:$1|Următoarea pagină este|Următoarele $1 pagini sunt|Următoarele $1 de pagini sunt}} în categoria curentă.",
        "category-file-count": "{{PLURAL:$2|Această categorie conține doar următorul fișier.|{{PLURAL:$1|Următorul fișier|Următoarele $1 fișiere}} se află în această categorie, dintr-un total de $2.}}",
        "category-file-count-limited": "{{PLURAL:$1|Următorul fișier este|Următoarele $1 fișiere sunt |Următoarele $1 de fișiere sunt}} în categoria curentă.",
        "qbfind": "Găsește",
        "qbbrowse": "Răsfoiește",
        "qbedit": "Modificare",
-       "qbpageoptions": "Opțiuni ale paginii",
+       "qbpageoptions": "Această pagină",
        "qbmyoptions": "Paginile mele",
        "faq": "Întrebări frecvente",
        "faqpage": "Project:Întrebări frecvente",
        "searcharticle": "Du-te",
        "history": "Istoricul paginii",
        "history_short": "Istoric",
-       "updatedmarker": "încărcat de la ultima mea vizită",
+       "updatedmarker": "actualizat de la ultima mea vizită",
        "printableversion": "Versiune de tipărit",
        "permalink": "Legătură permanentă",
        "print": "Tipărire",
        "editthispage": "Modificați pagina",
        "create-this-page": "Creați această pagină",
        "delete": "Ștergere",
-       "deletethispage": "Șterge pagina",
+       "deletethispage": "Șterge această pagină",
        "undeletethispage": "Recuperează această pagină",
        "undelete_short": "Recuperarea {{PLURAL:$1|unei modificări|a $1 modificări|a $1 de modificări}}",
-       "viewdeleted_short": "Vedeți {{PLURAL:$1|o modificare ștearsă|$1 (de) modificări șterse}}",
+       "viewdeleted_short": "Vizualizați {{PLURAL:$1|o modificare ștearsă|$1 modificări șterse|$1 de modificări șterse}}",
        "protect": "Protejare",
        "protect_change": "schimbă protecția",
        "protectthispage": "Protejați această pagină",
        "unprotect": "Modificare protecție",
        "unprotectthispage": "Schimbă nivelul de protejare al acestei pagini",
        "newpage": "Pagină nouă",
-       "talkpage": "Discutați această pagină",
+       "talkpage": "Discutați despre această pagină",
        "talkpagelinktext": "Discuție",
        "specialpage": "Pagină specială",
        "personaltools": "Unelte personale",
-       "articlepage": "Vedeți articolul",
+       "articlepage": "Vizualizați conținutul paginii",
        "talk": "Discuție",
        "views": "Vizualizări",
        "toolbox": "Unelte",
        "redirectedfrom": "(Redirecționat de la $1)",
        "redirectpagesub": "Pagină de redirecționare",
        "redirectto": "Redirecționare către:",
-       "lastmodifiedat": "Ultima modificare efectuată pe $1, la $2.",
-       "viewcount": "Pagina a fost vizitată {{PLURAL:$1|o dată|de $1 ori|de $1 de ori}}.",
+       "lastmodifiedat": "Ultima modificare a paginii efectuată la $1, ora $2.",
+       "viewcount": "Pagina a fost accesată {{PLURAL:$1|o dată|de $1 ori|de $1 de ori}}.",
        "protectedpage": "Pagină protejată",
        "jumpto": "Salt la:",
        "jumptonavigation": "navigare",
        "jumptosearch": "căutare",
-       "view-pool-error": "Ne pare rău, dar serverele sunt supraîncărcare în acest moment.\nPrea mulți utilizatori încearcă să vizualizeze această pagină.\nVă rugăm să așteptați un moment înainte de a reîncerca accesarea paginii.\n\n$1",
+       "view-pool-error": "Ne pare rău, dar serverele sunt supraîncărcate în acest moment.\nPrea mulți utilizatori încearcă să vizualizeze această pagină.\nVă rugăm să așteptați un moment înainte de a reîncerca accesarea paginii.\n\n$1",
        "generic-pool-error": "Ne pare rău, dar serverele sunt supraîncărcate în acest moment.\nPrea mulți utilizatori încearcă să vizualizeze această resursă.\nVă rugăm să așteptați un moment înainte de a reîncerca accesarea acestei resurse.",
        "pool-timeout": "Timpul alocat așteptării pentru blocare a expirat",
-       "pool-queuefull": "Coada de așteptare este plină",
+       "pool-queuefull": "Rezerva este plină",
        "pool-errorunknown": "Eroare necunoscută",
        "pool-servererror": "Serviciul de contorizare a rezervei nu este disponibil ($1).",
        "poolcounter-usage-error": "Eroare de utilizare: $1",
        "privacy": "Politica de confidențialitate",
        "privacypage": "Project:Politica de confidențialitate",
        "badaccess": "Eroare permisiune",
-       "badaccess-group0": "Execuția acțiunii cerute nu este permisă.",
-       "badaccess-groups": "Acțiunea cerută este rezervată utilizatorilor din {{PLURAL:$2|grupul|unul din grupurile}}: $1.",
-       "versionrequired": "Este necesară versiunea $1 MediaWiki",
-       "versionrequiredtext": "Versiunea $1 MediaWiki este necesară pentru a folosi această pagină. Vezi [[Special:Version|versiunea actuală]].",
+       "badaccess-group0": "Executarea acțiunii solicitate nu este permisă.",
+       "badaccess-groups": "Acțiunea solicitată este rezervată utilizatorilor din {{PLURAL:$2|grupul|unul din grupurile}}: $1.",
+       "versionrequired": "Este necesară versiunea $1 MediaWiki",
+       "versionrequiredtext": "Versiunea $1 a MediaWiki este necesară pentru a folosi această pagină. Vedeți [[Special:Version|versiunea actuală]].",
        "ok": "OK",
        "retrievedfrom": "Adus de la „$1”",
-       "youhavenewmessages": "Aveți $1 ($2).",
-       "youhavenewmessagesfromusers": "Aveți $1 de la {{PLURAL:$3|un alt utilizator|$3 utilizatori}} ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Aveți}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Aveți}} $1 de la {{PLURAL:$3|un alt utilizator|$3 utilizatori|$3 de utilizatori}} ($2).",
        "youhavenewmessagesmanyusers": "Aveți $1 de la mai mulți utilizatori ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|un mesaj nou|999=mesaje noi}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|ultima modificare|999=ultimele modificări}}",
        "hidetoc": "ascunde",
        "collapsible-collapse": "Restrânge",
        "collapsible-expand": "Extinde",
-       "confirmable-confirm": "Sunteți sigur{{GENDER:$1||ă}}?",
+       "confirmable-confirm": "Sunteți {{GENDER:$1|sigur|sigură}}?",
        "confirmable-yes": "Da",
        "confirmable-no": "Nu",
        "thisisdeleted": "Vizualizare sau recuperare $1?",
        "restorelink": "{{PLURAL:$1|o modificare ștearsă|$1 modificări șterse|$1 de modificări șterse}}",
        "feedlinks": "Întreținere:",
        "feed-invalid": "Tip de abonament invalid",
-       "feed-unavailable": "Nu sunt disponibile fluxuri web.",
+       "feed-unavailable": "Nu sunt disponibile fluxuri web",
        "site-rss-feed": "$1 Abonare RSS",
        "site-atom-feed": "$1 Abonare Atom",
        "page-rss-feed": "„$1” Abonare RSS",
        "sort-ascending": "Sortare ascendentă",
        "nstab-main": "Pagină",
        "nstab-user": "Pagină de utilizator",
-       "nstab-media": "Pagină Media",
+       "nstab-media": "Pagină media",
        "nstab-special": "Pagină specială",
        "nstab-project": "Proiect",
        "nstab-image": "Fișier",
        "nstab-category": "Categorie",
        "mainpage-nstab": "Pagina principală",
        "nosuchaction": "Această acțiune nu există",
-       "nosuchactiontext": "Acțiunea specificată în URL este invalidă.\nS-ar putea să fi introdus greșit URL-ul, sau să fi urmat o legătură incorectă.\nAceasta s-ar putea să indice și un bug în programul folosit de {{SITENAME}}.",
+       "nosuchactiontext": "Acțiunea specificată în URL este invalidă.\nEste posibil să fi introdus greșit adresa URL sau să fi accesat o legătură incorectă.\nAcest lucru ar putea, de asemenea, indica și o problemă în programul folosit de {{SITENAME}}.",
        "nosuchspecialpage": "Această pagină specială nu există",
-       "nospecialpagetext": "<strong>Ați cerut o [[Special:SpecialPages|pagină specială]] invalidă.</strong>\n\nO listă cu paginile speciale valide se poate găsi la [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nospecialpagetext": "<strong>Ați cerut o [[Special:SpecialPages|pagină specială]] nevalidă.</strong>\n\nO listă cu paginile speciale disponibile se poate găsi la [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Eroare",
        "databaseerror": "Eroare la baza de date",
        "databaseerror-text": "A apărut o eroare la interogarea bazei de date.\nAcest lucru poate însemna o problemă de software.",
        "databaseerror-query": "Interogare: $1",
        "databaseerror-function": "Funcție: $1",
        "databaseerror-error": "Eroare: $1",
-       "laggedslavemode": "Atenție: S-ar putea ca pagina să nu conțină ultimele actualizări.",
+       "laggedslavemode": "<strong>Atenție:</strong> Pagina nu conține ultimele modificări.",
        "readonly": "Baza de date este blocată la scriere",
-       "enterlockreason": "Precizează motivul pentru blocare, incluzând o estimare a termenului de deblocare a bazei de date",
+       "enterlockreason": "Precizează motivul pentru blocare, incluzând o estimare a termenului de deblocare",
        "readonlytext": "Baza de date {{SITENAME}} este momentan blocată la scriere, probabil pentru o operațiune de rutină, după care va fi deblocată și se va reveni la starea normală.\n\nAdministratorul care a blocat-o a oferit această explicație: $1",
        "missing-article": "Baza de date nu găsește textul unei pagini care ar fi trebuit găsită, numită „$1” $2.\n\nÎn mod normal faptul este cauzat de accesarea unei dif neactualizată sau a unei legături din istoric spre o pagină care a fost ștearsă.\n\nDacă nu acesta e motivul, s-ar putea să fi găsit un bug în program.\nVă rugăm să-i semnalați acest aspect unui [[Special:ListUsers/sysop|administrator]], indicându-i adresa URL.",
        "missingarticle-rev": "(versiunea#: $1)",
        "viewsource": "Sursă pagină",
        "viewsource-title": "Vizualizare sursă pentru $1",
        "actionthrottled": "Acțiune limitată",
-       "actionthrottledtext": "Ca o măsură anti-spam, aveți permisiuni limitate în a efectua această acțiune de prea multe ori într-o perioadă scurtă de timp, iar dv. tocmai ați depășit această limită.\nVă rugăm să încercați din nou în câteva minute.",
+       "actionthrottledtext": "Ca o măsură anti-spam, aveți permisiuni limitate în a efectua această acțiune de prea multe ori într-o perioadă scurtă de timp, iar dumneavoastră tocmai ați depășit această limită.\nVă rugăm să încercați din nou în câteva minute.",
        "protectedpagetext": "Această pagină este protejată împotriva modificărilor sau a altor acțiuni.",
        "viewsourcetext": "Puteți vizualiza și copia sursa acestei pagini.",
        "viewyourtext": "Puteți vizualiza și copia conținutul <strong>modificărilor dumneavoastră</strong> efectuate asupra acestei pagini.",
        "passwordreset-emailtext-ip": "Cineva (probabil dumneavoastră, de la adresa IP $1) a solicitat resetarea parolei \npentru {{SITENAME}} ($4). {{PLURAL:$3|Următorul cont este asociat|Următoarele conturi sunt asociate}}\ncu această adresă de e-mail:\n\n$2\n\n{{PLURAL:$3|Această parolă temporară va|Aceste parole temporare vor}} expira {{PLURAL:$5|într-o zi|în $5 zile}}.\nAr trebui să vă autentificați și să schimbați parola acum. Dacă altcineva a făcut această cerere \nsau dacă v-ați reamintit parola inițială și nu mai doriți să o schimbați,\nputeți ignora acest mesaj, continuând să utilizați vechea parolă.",
        "passwordreset-emailtext-user": "Utilizatorul $1 de pe {{SITENAME}} a solicitat o resetare a parolei dumneavoastră pentru {{SITENAME}} ($4). Următorul utilizator are {{PLURAL:$3|contul asociat|conturile asociate}} cu această adresă de e-mail:\n\n$2\n\n{{PLURAL:$3|Această parolă temporară va|Aceste parole temporare vor}} expira {{PLURAL:$5|într-o zi|în $5 zile}}.\nAr trebui să vă autentificați și să alegeți acum o nouă parolă. Dacă altcineva a făcut această solicitare, ori dacă v-ați reamintit parola originală și nu mai doriți modificarea ei, puteți ignora acest mesaj, continuând cu vechea parolă.",
        "passwordreset-emailelement": "Nume de utilizator: \n$1\n\nParolă temporară: \n$2",
-       "passwordreset-emailsent": "A fost trimis un e-mail de resetare a parolei.",
+       "passwordreset-emailsent": "Dacă aceasta este o adresă de e-mail înregistrată pentru contul dumneavoastră, atunci se va trimite un e-mail de resetare a parolei.",
        "passwordreset-emailsent-capture": "Un mesaj de resetare a parolei a fost trimis, fiind afișat mai jos.",
        "passwordreset-emailerror-capture": "Un mesaj de resetare a parolei a fost generat (fiind afișat mai jos), dar trimiterea sa către {{GENDER:$2|utilizator}} a eșuat: $1",
        "changeemail": "Modificare sau înlăturare adresă de e-mail",
-       "changeemail-header": "Modificare adresă de e-mail asociată contului",
+       "changeemail-header": "Completați acest formular pentru a vă schimba adresa de e-mail. Dacă doriți să înlăturați orice asociere a unei adrese de e-mail cu contul dumneavoastră, lăsați necompletat câmpul pentru introducerea unei noi adrese de e-mail atunci când trimiteți formularul.",
+       "changeemail-passwordrequired": "Va trebui să introduceți parola pentru a confirma această schimbare.",
        "changeemail-no-info": "Trebuie să fiți autentificat pentru a accesa această pagină direct.",
        "changeemail-oldemail": "Adresa de e-mail actuală:",
        "changeemail-newemail": "Noua adresă de e-mail:",
+       "changeemail-newemail-help": "Acest câmp nu trebuie completat dacă doriți să vă ștergeți adresa de e-mail. Dacă o ștergeți, nu veți putea reseta parola uitată și nu veți mai primi e-mailuri de la acest wiki.",
        "changeemail-none": "(niciuna)",
        "changeemail-password": "Parola dumneavoastră la {{SITENAME}}:",
        "changeemail-submit": "Modifică adresa de e-mail",
        "image_tip": "Fișier inserat",
        "media_sample": "Exemplu.ogg",
        "media_tip": "Legătură la fișier",
-       "sig_tip": "Semnătura dvs. datată",
+       "sig_tip": "Semnătura dumneavoastră datată",
        "hr_tip": "Linie orizontală (folosiți-o cumpătat)",
        "summary": "Rezumat:",
        "subject": "Subiect / titlu:",
        "missingsummary": "'''Atenție:''' Nu ați completat caseta „descriere modificări”. Dacă apăsați din nou butonul „salvează pagina” modificările vor fi salvate fără descriere.",
        "selfredirect": "<strong>Atenție:</strong> Sunteți pe cale să redirecționați această pagină către ea însăși.\nProbabil ați greșit ținta redirecționării sau ați modificat pagina greșită.\nDacă apăsați din nou pe „{{int:savearticle}}”, redirecționarea va fi creată oricum.",
        "missingcommenttext": "Vă rugăm să introduceți un comentariu.",
-       "missingcommentheader": "'''Atenție,''' nu ați pus titlu sau subiect la acest comentariu.\nDacă dați din nou clic pe „{{int:savearticle}}” modificarea va fi salvată fără titlu.",
+       "missingcommentheader": "<strong>Atenție:</strong> nu ați adăugat niciun titlu sau subiect la acest comentariu.\nDacă dați din nou clic pe „{{int:savearticle}}” modificarea va fi salvată fără titlu.",
        "summary-preview": "Previzualizare descriere:",
        "subject-preview": "Previzualizare subiect/titlu:",
        "previewerrortext": "A survenit o eroare ca urmare a tentativei de previzualizare a modificărilor dumneavoastră.",
        "newarticle": "(Nou)",
        "newarticletext": "Ați încercat să ajungeți la o pagină care nu există. Pentru a o crea, începeți să scrieți în caseta de mai jos (vedeți [$1 pagina de ajutor] pentru mai multe informații). Dacă ați ajuns aici din greșeală, întoarceți-vă folosind controalele navigatorului dumneavoastră.",
        "anontalkpagetext": "---- ''Aceasta este pagina de discuții pentru un utilizator care nu și-a creat un cont încă, sau care nu s-a autentificat.\nDe aceea trebuie să folosim adresă IP pentru a identifica această persoană.\nO adresă IP poate fi folosită în comun de mai mulți utilizatori.\nDacă sunteți un astfel de utilizator și credeți că vă sunt adresate mesaje irelevante, vă rugăm să [[Special:UserLogin/signup|vă creați un cont]] sau să [[Special:UserLogin|vă autentificați]] pentru a evita confuzii cu alți utilizatori anonimi în viitor.''",
-       "noarticletext": "Actualmente, această pagină este lipsită de conținut.\nPuteți [[Special:Search/{{PAGENAME}}|căuta acest titlu]] în alte pagini,\nputeți <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} căuta înregistrări în jurnale] \nsau puteți [{{fullurl:{{FULLPAGENAME}}|action=edit}} crea această pagină]</span>.",
+       "noarticletext": "Actualmente, această pagină este lipsită de conținut.\nPuteți [[Special:Search/{{PAGENAME}}|căuta titlul acestei pagini]] în alte pagini, puteți <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} căuta înregistrări în jurnalele relevante]\nsau puteți [{{fullurl:{{FULLPAGENAME}}|action=edit}} crea această pagină]</span>.",
        "noarticletext-nopermission": "Actualmente, această pagină este lipsită de conținut.\nPuteți [[Special:Search/{{PAGENAME}}|căuta acest titlu]] în alte pagini sau puteți <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} căuta înregistrări în jurnale]</span>; nu aveți însă permisiunea de a crea această pagină.",
        "missing-revision": "Versiunea nr. $1 a paginii „{{FULLPAGENAME}}” nu există.\n\nAcest lucru se întâmplă de obicei atunci când se accesează o legătură expirată către istoricul unei pagini șterse.\nDetalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].",
        "userpage-userdoesnotexist": "Contul de utilizator „<nowiki>$1</nowiki>” nu este înregistrat.\nAsigurați-vă că doriți să creați/modificați această pagină.",
        "templatesusedsection": "{{PLURAL:$1|Format utilizat|Formate utilizate}} în această secțiune:",
        "template-protected": "(protejat)",
        "template-semiprotected": "(semiprotejat)",
-       "hiddencategories": "Această pagină este membră {{PLURAL:$1|a unei categorii ascunse|a $1 categorii ascunse|a $1 de categorii ascunse}}:",
+       "hiddencategories": "Această pagină face parte {{PLURAL:$1|dintr-o categorie ascunsă|din $1 categorii ascunse|din $1 de categorii ascunse}}:",
        "edittools": "<!-- Acest text va apărea după caseta de editare și formularele de trimitere fișier. -->",
        "nocreatetext": "{{SITENAME}} a restricționat abilitatea de a crea pagini noi.\nPuteți edita o pagină deja existentă sau puteți să vă [[Special:UserLogin|autentificați/creați]] un cont de utilizator.",
        "nocreate-loggedin": "Nu ai permisiunea să creezi pagini noi.",
        "sectioneditnotsupported-text": "Modificarea secțiunilor nu este suportată în această pagină.",
        "permissionserrors": "Eroare de permisiune",
        "permissionserrorstext": "Nu aveți permisiune pentru a face acest lucru, din următoarele {{PLURAL:$1|motiv|motive}}:",
-       "permissionserrorstext-withaction": "Nu aveți permisiunea să $2, din {{PLURAL:$1|următorul motivul|următoarele motive}}:",
+       "permissionserrorstext-withaction": "Nu aveți permisiunea să $2, din {{PLURAL:$1|următorul motiv|următoarele motive}}:",
        "recreate-moveddeleted-warn": "'''Atenție: Recreați o pagină care a fost ștearsă anterior.'''\n\nAsigurați-vă că este oportună recrearea acestei pagini.\nJurnalul ștergerilor și al mutărilor pentru această pagină este disponibil:",
        "moveddeleted-notice": "Această pagină a fost ștearsă.\nJurnalul ștergerilor și al redenumirilor este disponibil mai jos.",
        "moveddeleted-notice-recent": "Ne cerem scuze, dar această pagină a fost ștearsă recent (în ultimele 24 de ore).\nJurnalele de ștergere și redenumire ale paginii sunt disponibile mai jos cu scop informativ.",
        "currentrev": "Versiunea curentă",
        "currentrev-asof": "Versiunea curentă din $1",
        "revisionasof": "Versiunea de la data $1",
-       "revision-info": "Versiunea din $1; autor: {{GENDER:$6|$2}}$7",
+       "revision-info": "Versiunea din $1, autor: {{GENDER:$6|$2}}$7",
        "previousrevision": "← Versiunea anterioară",
        "nextrevision": "Versiunea următoare →",
        "currentrevisionlink": "Versiunea curentă",
        "rev-suppressed-unhide-diff": "Una dintre versiunile acestui istoric a fost '''suprimată'''.\nDetalii se pot găsi în [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jurnalul suprimărilor].\nCa administrator puteți [$1 vedea diferența] în continuare, dacă doriți acest lucru.",
        "rev-deleted-diff-view": "Una dintre versiunile acestui istoric a fost '''ștearsă'''.\nCa administrator puteți vedea în continuare această diferență dinte versiuni; detalii puteți găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].",
        "rev-suppressed-diff-view": "Una dintre reviziile acestui istoric a fost '''suprimată'''.\nCa administrator puteți vedea în continuare această diferență dinte versiuni; detalii puteți găsi în [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jurnalul suprimărilor].",
-       "rev-delundel": "șterge/recuperează",
+       "rev-delundel": "schimbă vizibilitatea",
        "rev-showdeleted": "arată",
        "revisiondelete": "Ștergere/recuperare versiuni",
        "revdelete-nooldid-title": "Versiune invalidă",
        "mergehistory-go": "Vezi modificările care pot fi combinate",
        "mergehistory-submit": "Unește versiunile",
        "mergehistory-empty": "Nicio versiune nu poate fi unită.",
-       "mergehistory-done": "$3 {{PLURAL:$3|versiune|versiuni|de versiuni}} ale paginii $1 {{PLURAL:$3|a fost unită|au fost unite|au fost unite}} cu succes în [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versiune a|versiuni ale|de versiuni ale}} paginii $1 {{PLURAL:$3|a fost unită|au fost unite}} cu succes în pagina [[:$2]].",
        "mergehistory-fail": "Nu se poate executa combinarea istoricului, te rog verifică parametrii pagină și timp.",
        "mergehistory-fail-toobig": "Nu s-a putut efectua unirea istoricelor întrucât s-ar fi depășit limita de $1 {{PLURAL:$1|versiune|versiuni|de versiuni}} mutat{{PLURAL:$1|ă|e}}.",
        "mergehistory-no-source": "Pagina sursă $1 nu există.",
        "prevn-title": "{{PLURAL:$1|anteriorul|anterioarele}} $1 {{PLURAL:$1|rezultat|rezultate}}",
        "nextn-title": "{{PLURAL:$1|următorul|următoarele}} $1 {{PLURAL:$1|rezultat|rezultate}}",
        "shown-title": "Arată $1 {{PLURAL:$1|rezultat|rezultate}} pe pagină",
-       "viewprevnext": "Vezi ($1 {{int:pipe-separator}} $2) ($3).",
+       "viewprevnext": "Vezi ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Există o pagină cu titlul „[[:$1]]'” pe acest site.'''",
        "searchmenu-new": "<strong>'''Creați pagina „[[:$1]]” pe acest wiki!'''</strong> {{PLURAL:$2|0=|Vedeți, de asemenea, pagina găsită în urma căutării dumneavoastră.|Vedeți, de asemenea, rezultatele căutării.}}",
        "searchprofile-articles": "Pagini cu conținut",
        "group-bot": "Roboți",
        "group-sysop": "Administratori",
        "group-bureaucrat": "Birocrați",
-       "group-suppress": "Supervizori",
+       "group-suppress": "Suprimători",
        "group-all": "(toți)",
        "group-user-member": "{{GENDER:$1|utilizator|utilizatoare|utilizator}}",
        "group-autoconfirmed-member": "{{GENDER:$1|utilizator autoconfirmat|utilizatoare autoconfirmată|utilizator autoconfirmat}}",
        "group-bot-member": "{{GENDER:$1|robot}}",
        "group-sysop-member": "{{GENDER:$1|administrator}}",
        "group-bureaucrat-member": "{{GENDER:$1|birocrat}}",
-       "group-suppress-member": "{{GENDER:$1|supervizor}}",
+       "group-suppress-member": "{{GENDER:$1|suprimător|suprimătoare}}",
        "grouppage-user": "{{ns:project}}:Utilizatori",
        "grouppage-autoconfirmed": "{{ns:project}}:Utilizator autoconfirmați",
        "grouppage-bot": "{{ns:project}}:Boți",
        "grouppage-sysop": "{{ns:project}}:Administratori",
        "grouppage-bureaucrat": "{{ns:project}}:Birocrați",
-       "grouppage-suppress": "{{ns:project}}:Supervizori",
+       "grouppage-suppress": "{{ns:project}}:Suprimători",
        "right-read": "Citește pagini",
        "right-edit": "Modifică paginile",
        "right-createpage": "Creează pagini (altele decât pagini de discuție)",
        "recentchangeslinked-title": "Modificări legate de „$1”",
        "recentchangeslinked-summary": "Aceasta este o listă a schimbărilor efectuate recent asupra paginilor cu legături de la o anumită pagină (sau asupra membrilor unei anumite categorii).\nPaginile pe care le [[Special:Watchlist|urmăriți]] apar cu <strong>aldine</strong>.",
        "recentchangeslinked-page": "Numele paginii:",
-       "recentchangeslinked-to": "Afișează schimbările în paginile care se leagă de pagina dată",
+       "recentchangeslinked-to": "Arată în schimb modificările asupra paginilor care se leagă de pagina indicată",
        "recentchanges-page-added-to-category": "[[:$1]] a fost adăugată în categorii",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] și încă {{PLURAL:$2|o pagină|$2 pagini|$2 de pagini}} au fost adăugate în categorii",
        "recentchanges-page-removed-from-category": "[[:$1]] eliminată din categorii",
        "upload-options": "Opțiuni de încărcare",
        "watchthisupload": "Urmărește acest fișier",
        "filewasdeleted": "Un fișier cu acest nume a fost anterior încărcat și apoi șters. Ar trebui să verificați $1 înainte să îl încărcați din nou.",
+       "filename-thumb-name": "Acesta arată ca un titlu pentru o miniatură. Vă rugăm să nu încărcați miniaturi înapoi pe același wiki. În caz contrar, vă rugăm să corectați numele fișierului pentru ca acesta să fie mai descriptiv și să nu aibă prefixul de miniatură.",
        "filename-bad-prefix": "Numele fișierului pe care îl încărcați începe cu '''\"$1\"''', care este un nume non-descriptiv alocat automat în general de camerele digitale.\nVă rugăm, alegeți un nume mai descriptiv pentru fișerul dumneavoastră.",
+       "filename-prefix-blacklist": " #<!-- lăsați această linie exact așa cum este --> <pre>\n# Sintaxa după cum urmează:\n# * Tot ceea ce începe cu „#” și până la sfârșitul rândului reprezintă un comentariu\n# * Fiecare rând care nu este gol reprezintă un prefix pentru numele tipice de fișiere atribuite automat de camerele digitale\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # unele telefoane mobile\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # diverse\n#</pre> <!-- lăsați această linie exact așa cum este -->",
        "upload-success-subj": "Fișierul a fost trimis",
        "upload-success-msg": "Încărcarea de la [$2] s-a încheiat cu succes. Rezultatul este disponibil aici: [[:{{ns:file}}:$1]]",
        "upload-failure-subj": "Problemă la trimitere",
        "foreign-structured-upload-form-label-own-work": "Aceasta este propria mea operă",
        "foreign-structured-upload-form-label-infoform-categories": "Categorii",
        "foreign-structured-upload-form-label-infoform-date": "Dată",
+       "foreign-structured-upload-form-label-own-work-message-local": "Confirm că încarc acest fișier în concordanță cu termenii serviciului și politicile de licențiere de la {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Dacă nu puteți încărca acest fișier în conformitate cu politicile de la {{SITENAME}}, închideți această casetă de dialog și încercați altă metodă.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Poate doriți să încercați [[Special:Upload|pagina de încărcare implicită]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Înțeleg că încarc acest fișier într-un depozit partajat. Confirm că fac acest lucru conform termenilor serviciului și politicilor de licențiere de acolo.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Dacă nu puteți încărca acest fișier în conformitate cu politicile depozitului partajat, închideți această casetă de dialog și încercați altă metodă.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Poate doriți să încercați [[Special:Upload|pagina de încărcare de la {{SITENAME}}]], în cazul în care acest fișier poate fi încărcat acolo în conformitate cu politicele lor.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Declar că dețin drepturile de autor asupra acestui fișier, accept să public irevocabil acest fișier la Wikimedia Commons sub licența [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Atribuire și distribuire în condiții identice 4.0] și sunt de acord cu [https://wikimediafoundation.org/wiki/Terms_of_Use Termenii de utilizare].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Dacă nu dețineți drepturile de autor asupra acestui fișier sau doriți să-l publicați sub o altă licență, puteți utiliza [https://commons.wikimedia.org/wiki/Special:UploadWizard Expertul de încărcare de la Commons].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Poate doriți să încercați [[Special:Upload|pagina de încărcare de la {{SITENAME}}]], în cazul în care acest site permite încărcarea acestui fișier în conformitate cu politicele lor.",
        "backend-fail-stream": "Imposibil de citit fișierul $1.",
        "backend-fail-backup": "Imposibil de efectuat o copie de rezervă a fișierului $1.",
        "backend-fail-notexists": "Fișierul $1 nu există.",
        "filehist-filesize": "Mărimea fișierului",
        "filehist-comment": "Comentariu",
        "imagelinks": "Utilizarea fișierului",
-       "linkstoimage": "{{PLURAL:$1|Următoarea pagină trimite spre|Următoarele $1 pagini trimit spre|Următoarele $1 de pagini trimit spre}} această imagine:",
+       "linkstoimage": "{{PLURAL:$1|Următoarea pagină trimite|Următoarele $1 pagini trimit spre|Următoarele $1 de pagini trimit}} către acest fișier:",
        "linkstoimage-more": "Mai mult de $1 {{PLURAL:$1|pagină este legată|pagini sunt legate}} de acest fișier.\nUrmătoarea listă arată {{PLURAL:$1|prima legătură|primele $1 legături}} către acest fișier.\nO [[Special:WhatLinksHere/$2|listă completă]] este disponibilă.",
-       "nolinkstoimage": "Nici o pagină nu utilizează această imagine.",
+       "nolinkstoimage": "Nicio pagină nu utilizează această imagine.",
        "morelinkstoimage": "Vedeți [[Special:WhatLinksHere/$1|mai multe legături]] către acest fișier.",
        "linkstoimage-redirect": "$1 (redirecționare de fișier) $2",
        "duplicatesoffile": "{{PLURAL:$1|Fișierul următor este duplicat|Următoarele $1 fișiere sunt duplicate}} ale acestui fișier ([[Special:FileDuplicateSearch/$2|mai multe detalii]]):",
        "nopagetext": "Pagina destinație specificată nu există.",
        "pager-newer-n": "{{PLURAL:$1|1 mai nou|$1 mai noi}}",
        "pager-older-n": "{{PLURAL:$1|1|$1}} mai vechi",
-       "suppress": "Oversight",
+       "suppress": "Suprimare",
        "querypage-disabled": "Această pagină specială este dezactivată din motive de performanță.",
        "apihelp": "Ajutor API",
        "apihelp-no-such-module": "Modulul „$1” nu a fost găsit.",
        "nocontribs": "Nu a fost găsită nici o modificare care să satisfacă acest criteriu.",
        "uctop": "(actuală)",
        "month": "Din luna (și dinainte):",
-       "year": "Până în anul:",
+       "year": "Din anul (și dinainte):",
        "sp-contributions-newbies": "Arată doar contribuțiile conturilor noi",
        "sp-contributions-newbies-sub": "Pentru începători",
        "sp-contributions-newbies-title": "Contribuțiile utilizatorului pentru conturile noi",
        "move-page-legend": "Redenumire pagină",
        "movepagetext": "Puteți folosi formularul de mai jos pentru a redenumi o pagină, mutându-i tot istoricul sub noul nume.\nPagina veche va deveni o pagină de redirecționare către pagina nouă.\nLegăturile către pagina veche nu vor fi redirecționate către cea nouă;\nnu uitați să verificați dacă nu există redirecționări [[Special:DoubleRedirects|duble]] sau [[Special:BrokenRedirects|invalide]].\n\nVă rugăm să rețineți că sunteți responsabil(ă) pentru a face legăturile vechi să rămână valide.\n\nRețineți că pagina '''nu va fi redenumită''' dacă există deja o pagină cu noul titlu, în afara cazului în care cea din urmă este deja o redirecționare; în plus, aceasta nu trebuie să aibă un istoric de modificări.\nCu alte cuvinte, veți putea redenumi înapoi o pagină pe care ați redenumit-o greșit, dar nu veți putea suprascrie o pagină validă existentă prin redenumirea alteia.\n\n'''ATENȚIE!'''\nAceasta poate fi o schimbare drastică și neașteptată pentru o pagină populară;\nvă rugăm să vă asigurați că înțelegeți toate consecințele înainte de a continua.",
        "movepagetext-noredirectfixer": "Completând formularul de mai jos veți redenumi o pagină, mutând tot istoricul la noul nume.\nVechiul titlu va deveni o pagină de redirecționare către noul titlu.\nFiți sigur că ați verificat lista redirecționărilor [[Special:DoubleRedirects|duble]] sau [[Special:BrokenRedirects|nefuncționale]].\nVă rugăm să rețineți că aveți responsabilitatea de a verifica dacă nu cumva destinația inițială a vechilor legături s-a modificat.\n\nNu uitați că pagina '''nu va fi redenumită''' dacă o pagină cu noul titlul există deja, cu excepția cazurilor în care aceasta este complet goală și nu are istoric de modificări sau este o pagină de redirecționare.\nAcest lucru înseamnă că veți putea redenumi la titlul inițial o pagină greșit redenumită, dar nu veți putea suprascrie o pagină existentă.\n\n'''Atenție!'''\nAceastă acțiune poate determina o schimbare dramatică, neașteptată pentru o pagină cu trafic crescut;\nasigurați-vă că înțelegeți toate consecințele înainte de a continua.",
-       "movepagetalktext": "Pagina de discuții asociată, dacă există, va fi redenumită\nautomat odată cu aceasta în '''afara următoarelor cazuri''':\n* există deja o pagină de discuții cu conținut (care nu este goală) sub noul nume, sau\n* nu bifați căsuța de mai jos.\n\nÎn oricare din cazurile de mai sus va trebui să redenumiți sau să unificați\nmanual paginile de discuții, dacă doriți acest lucru.",
+       "movepagetalktext": "Dacă bifați această căsuță, pagina de discuții asociată, dacă există, va fi redenumită automat la noul titlu doar dacă acolo nu există deja o pagină de discuții completată.\n\nAltfel, va trebui să redenumiți sau să unificați manual paginile de discuții, dacă doriți acest lucru.",
        "moveuserpage-warning": "'''Atenție''': sunteți pe cale să redenumiți o pagină de utilizator. Vă rugăm să rețineți că singura redenumită va fi pagina, nu și utilizatorul.",
        "movecategorypage-warning": "<strong>Atenție:</strong> Sunteți pe cale să redenumiți pagina unei categorii. Rețineți că doar pagina va fi redenumită, iar orice alte pagini conținute în vechea categorie <em>nu</em> vor fi transferate în cea nouă.",
        "movenologintext": "Trebuie să fiți un utilizator înregistrat și [[Special:UserLogin|autentificat]] pentru a redenumi o pagină.",
        "tooltip-pt-createaccount": "Vă încurajăm să vă creați un cont și să vă autentificați; totuși, nu este obligatoriu",
        "tooltip-ca-talk": "Discuții despre această pagină",
        "tooltip-ca-edit": "Modificați această pagină",
-       "tooltip-ca-addsection": "Adaugă o nouă secțiune.",
+       "tooltip-ca-addsection": "Adaugă o secțiune nouă",
        "tooltip-ca-viewsource": "Această pagină este protejată. Puteți vizualiza doar codul sursă",
        "tooltip-ca-history": "Versiunile anterioare ale paginii și autorii lor.",
        "tooltip-ca-protect": "Protejați această pagină.",
        "tooltip-ca-nstab-category": "Vezi categoria",
        "tooltip-minoredit": "Marchează această modificare ca fiind minoră",
        "tooltip-save": "Salvați modificările dumneavoastră",
-       "tooltip-preview": "Vă rugăm să previzualizați modificările înainte de a le salva!",
-       "tooltip-diff": "Arată-mi modificările efectuate asupra textului",
+       "tooltip-preview": "Previzualizați-vă modificările. Vă rugăm să faceți acest lucru înainte de a salva pagina.",
+       "tooltip-diff": "Afișează modificările pe care le-ați efectuat asupra textului",
        "tooltip-compareselectedversions": "Vezi diferențele între cele două versiuni selectate de pe această pagină.",
        "tooltip-watch": "Adaugă această pagină la lista mea de pagini urmărite",
        "tooltip-watchlistedit-normal-submit": "Șterge titluri",
        "tooltip-recreate": "Recreează",
        "tooltip-upload": "Pornește încărcarea",
        "tooltip-rollback": "„Revenire” anulează modificarea(ările) de pe această pagină a(le) ultimului contribuitor printr-o singură apăsare",
-       "tooltip-undo": "„Anulează” revine asupra acestei modificări către versiunea anterioară și deschide formularul de modificare în modul de previzualizare.\nPermite adăugarea unui motiv în descrierea modificărilor.",
+       "tooltip-undo": "„Anulează” șterge această modificare și deschide formularul de modificare în modulul de previzualizare.\nPermite adăugarea unui motiv în descrierea modificărilor.",
        "tooltip-preferences-save": "Salvează preferințele",
        "tooltip-summary": "Descrieți pe scurt modificarea",
        "interlanguage-link-title": "$1 – $2",
        "svg-long-error": "Fișier SVG invalid: $1",
        "show-big-image": "Fișier original",
        "show-big-image-preview": "Mărimea acestei previzualizări: $1.",
+       "show-big-image-preview-differ": "Mărimea acestei previzualizări $3 a acestui fișier $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Altă rezoluție|Alte rezoluții}}: $1.",
        "show-big-image-size": "$1 × $2 pixeli",
        "file-info-gif-looped": "în buclă",
        "ilsubmit": "Caută",
        "bydate": "după dată",
        "sp-newimages-showfrom": "Arată imaginile noi începând cu $1, ora $2",
+       "days-abbrev": "$1 z",
        "seconds": "{{PLURAL:$1|o secundă|$1 secunde|$1 de secunde}}",
        "minutes": "{{PLURAL:$1|un minut|$1 minute|$1 de minute}}",
        "hours": "{{PLURAL:$1|o oră|$1 ore|$1 de ore}}",
        "autoredircomment": "Redirecționat înspre [[$1]]",
        "autosumm-new": "Pagină nouă: $1",
        "autosumm-newblank": "A creat o pagină goală",
+       "size-bytes": "{{PLURAL:$1|un octet|$1 octeți|$1 de octeți}}",
+       "size-pixel": "$1 {{PLURAL:$1|pixel|pixeli|de pixeli}}",
        "lag-warn-normal": "Modificările mai noi de $1 {{PLURAL:$1|secondă|seconde}} pot să nu apară în listă.",
        "lag-warn-high": "Serverul bazei de date este suprasolicitat, astfel încît modificările făcute în ultimele $1 {{PLURAL:$1|secundă|secunde}} pot să nu apară în listă.",
        "watchlistedit-normal-title": "Modificare listă pagini urmărite",
        "version-entrypoints": "URL-uri pentru puncte de intrare",
        "version-entrypoints-header-entrypoint": "Punct de intrare",
        "version-entrypoints-header-url": "URL",
+       "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Calea articolului]",
+       "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Calea scriptului]",
        "version-libraries": "Biblioteci instalate",
        "version-libraries-library": "Bibliotecă",
        "version-libraries-version": "Versiune",
        "mw-widgets-dateinput-placeholder-day": "AAAA-LL-ZZ",
        "mw-widgets-dateinput-placeholder-month": "AAAA-LL",
        "mw-widgets-titleinput-description-new-page": "pagina nu există încă",
-       "mw-widgets-titleinput-description-redirect": "redirecționare către $1"
+       "mw-widgets-titleinput-description-redirect": "redirecționare către $1",
+       "api-error-blacklisted": "Vă rugăm să alegeți un alt titlu, mai descriptiv."
 }
index 50a1f78..a19444d 100644 (file)
        "passwordreset-emailsent": "Ce quiste jè 'n'e-mail pu cunde tune, allore 'na password azzerate ha state mannate addà.",
        "passwordreset-emailsent-capture": "'Na e-mail pe azzeramende d'a passuord ha state mannate, ca jè fatte vedè aqquà sotte.",
        "passwordreset-emailerror-capture": "'Na e-mail de azzeramende d'a passuord ha state generate, ca jè fatte vedè aqquà sotte, ma 'u 'nvie a {{GENDER:$2|l'utende}} ha fallite: $1",
-       "changeemail": "Cange 'u 'ndirizze e-mail",
+       "changeemail": "Cange o live 'u 'ndirizze e-mail",
        "changeemail-header": "Cange 'u 'ndirizze e-mail d'u cunde",
        "changeemail-no-info": "Tu a essere collegate pe accedere a sta pàgene direttamende.",
        "changeemail-oldemail": "Indirizze e-mail de mò:",
        "sig_tip": "'A firma toje cu l'orarie e 'a sciurnete",
        "hr_tip": "Linee orizzondele (ausele picche)",
        "summary": "Riepileghe:",
-       "subject": "Oggette/Testate:",
+       "subject": "Oggette:",
        "minoredit": "Cangiaminde stuèdeche",
        "watchthis": "Condrolle sta pàgene",
        "savearticle": "Registre 'a vôsce",
        "prefs-watchlist-token": "Token de le pàggene condrollate:",
        "prefs-misc": "Misc",
        "prefs-resetpass": "Cange a 'password",
-       "prefs-changeemail": "Cange e-mail",
+       "prefs-changeemail": "Cange o live 'u 'ndirizze e-mail",
        "prefs-setemail": "Mitte 'n'indirizze e-mail",
        "prefs-email": "Opziune de l'e-mail",
        "prefs-rendering": "Aspette",
        "recentchangeslinked-summary": "Queste jè 'a liste de le cangiaminde fatte de recende a le pàggene culleghete da ' na pàgene specifiche (o a le membre de 'na specifiche categorije).\nPàggene sus 'a [[Special:Watchlist|le Pàggene condrollete]] sonde in '''grascette'''.",
        "recentchangeslinked-page": "Nome d'a vôsce:",
        "recentchangeslinked-to": "Fa vedè le cangiaminde de le pàggene colleghete a 'na certa pàgene",
+       "recentchanges-page-added-to-category": "[[:$1]] aggiunde a categorije",
        "upload": "Careche 'u file",
        "uploadbtn": "Careche 'nu fail",
        "reuploaddesc": "Scangille 'u carecamende e tuerne a 'a schermete de le carecaminde",
        "upload-form-label-infoform-description": "Descrizione",
        "upload-form-label-usage-title": "Ause",
        "upload-form-label-usage-filename": "Nome d'u file",
+       "foreign-structured-upload-form-label-infoform-date": "Date",
        "backend-fail-stream": "Non ge pozze trasmettere 'u file $1.",
        "backend-fail-backup": "Non ge pozze cupià 'u file $1.",
        "backend-fail-notexists": "'U file $1 non g'esiste.",
        "svg-long-error": "File SVG invalide: $1",
        "show-big-image": "File origgenale",
        "show-big-image-preview": "Dimenziune de sta andeprime: $1.",
+       "show-big-image-preview-differ": "Dimenzione de quiste $3 andeprime de quiste $2 file: $1.",
        "show-big-image-other": "Otre {{PLURAL:$2|resoluzione|resoluziune}}: $1.",
        "show-big-image-size": "$1 x $2 pixel",
        "file-info-gif-looped": "infinite",
        "special-characters-title-minus": "segne mene",
        "mw-widgets-dateinput-no-date": "Nisciune date scacchiate",
        "mw-widgets-titleinput-description-new-page": "'a pàgene non g'esiste angore",
-       "mw-widgets-titleinput-description-redirect": "redirezionate sus a $1"
+       "mw-widgets-titleinput-description-redirect": "redirezionate sus a $1",
+       "api-error-blacklisted": "Pe piacere scacchie 'nu titole diverse, descrittive."
 }
index 5e84b9d..cd70f92 100644 (file)
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "mw-widgets-titleinput-description-new-page": "страница ещё не существует",
-       "mw-widgets-titleinput-description-redirect": "перенаправление на $1"
+       "mw-widgets-titleinput-description-redirect": "перенаправление на $1",
+       "api-error-blacklisted": "Пожалуйста, выберите другое, более понятное название."
 }
index 6c6f3d2..b9ecfc7 100644 (file)
        "special-characters-group-lao": "Лаоськы",
        "special-characters-group-khmer": "Кгмерськы",
        "mw-widgets-dateinput-placeholder-day": "РРРР-ММ-ДД",
-       "mw-widgets-dateinput-placeholder-month": "РРРР-ММ"
+       "mw-widgets-dateinput-placeholder-month": "РРРР-ММ",
+       "api-error-blacklisted": "Звольте іншу, пописну назву."
 }
index b3b6185..b36de28 100644 (file)
        "passwordreset-emailsent-capture": "परिवर्तितकूटशब्दस्य वि-पत्रं प्रेषितम् अस्ति । तत् अधः द्रष्टुं शक्यते ।",
        "passwordreset-emailerror-capture": "परिवर्तितकूटशब्दस्य वि-पत्रं निर्मितम् अस्ति । तत् अधः द्रष्टुं शक्यते । परन्तु {{GENDER:$2|योजकाय}} प्रेषणकाले तत् निरस्तम् अभवत् : $1",
        "changeemail": "वि-पत्रसङ्केतः परिवर्त्यताम्",
-       "changeemail-text": "स्वस्य वि-पत्रसङ्केतं परिवर्तयितुम् अधः दत्तं प्रपत्रं पूरयतु । एतस्यै प्रक्रियायै कूटशब्दः आवश्यकः ।",
+       "changeemail-header": "प्रयोक्तृनाम्नः ई-पत्रसङ्केतः परिवर्त्यताम्",
        "changeemail-no-info": "एतत् पृष्ठं सम्पादयितुं प्रवेशः अनिवार्यः ।",
        "changeemail-oldemail": "वर्तमानः वि-पत्रसङ्केतः",
        "changeemail-newemail": "नूतनः वि-पत्रसङ्केतः :",
        "special-characters-title-endash": "en dash",
        "special-characters-title-emdash": "em dash",
        "special-characters-title-minus": "minus sign",
-       "mw-widgets-titleinput-description-new-page": "पृष्ठं न विद्यते"
+       "mw-widgets-titleinput-description-new-page": "पृष्ठं न विद्यते",
+       "api-error-blacklisted": "कृपया भिन्नं विवरणपूर्वकं शीर्षकं चीयताम् ।"
 }
index 0b52557..591061c 100644 (file)
        "special-characters-group-khmer": "ඛෙමර්",
        "special-characters-title-endash": "en තේජස",
        "special-characters-title-emdash": "em තේජස",
-       "special-characters-title-minus": "ඍණ ලකුණ"
+       "special-characters-title-minus": "ඍණ ලකුණ",
+       "api-error-blacklisted": "කරුණාකර වෙනස්, විස්තරාත්මක මාතෘකාවක් තෝරන්න."
 }
index 758ad47..10e65c0 100644 (file)
        "special-characters-title-emdash": "dlhá pomlčka",
        "special-characters-title-minus": "mínus",
        "mw-widgets-dateinput-placeholder-day": "RRRR-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "RRRR-MM"
+       "mw-widgets-dateinput-placeholder-month": "RRRR-MM",
+       "api-error-blacklisted": "Prosím, zvoľte iný, opisný názov."
 }
index 3a72554..0b00bdc 100644 (file)
        "sig_tip": "Vaš podpis z datumom",
        "hr_tip": "Vodoravna črta (uporabljajte zmerno)",
        "summary": "Povzetek urejanja:",
-       "subject": "Zadeva/naslov:",
+       "subject": "Zadeva:",
        "minoredit": "manjše urejanje",
        "watchthis": "Opazuj članek",
        "savearticle": "Shrani stran",
        "missingsummary": "'''Opozorilo:''' Niste napisali povzetka urejanja. Ob ponovnem kliku gumba ''Shrani'' se bo vaše urejanje shranilo brez njega.",
        "selfredirect": "<strong>Opozorilo:</strong> Stran preusmerjate na samo nase.\nMorda ste za cilj preusmeritve navedli napačno stran ali pa morda urejate napačno stran.\nČe ponovno kliknete »{{int:savearticle}}«, bomo preusmeritev vseeno ustvarili.",
        "missingcommenttext": "Prosimo, vpišite v spodnje polje komentar.",
-       "missingcommentheader": "'''Opozorilo:''' Niste vnesli zadeve/naslova za ta komentar.\nČe boste ponovno kliknili »{{int:savearticle}}«, bo vaše urejanje shranjeno brez le-tega.",
+       "missingcommentheader": "<strong>Opozorilo:</strong> Niste vnesli zadeve za ta komentar.\nČe boste ponovno kliknili »{{int:savearticle}}«, bo vaše urejanje shranjeno brez nje.",
        "summary-preview": "Predogled povzetka",
-       "subject-preview": "Predogled zadeve/naslova:",
+       "subject-preview": "Predogled zadeve:",
        "previewerrortext": "Med poskusom prikaza predogleda vaših sprememb je prišlo do napake.",
        "blockedtitle": "Uporabnik je blokiran",
        "blockedtext": "'''Urejanje z vašim uporabniškim imenom oziroma IP-naslovom je onemogočeno.'''\n\nBlokiral vas je $1.\nPodani razlog je ''$2''.\n\n* začetek blokade: $8\n* potek blokade: $6\n* blokirani uporabnik: $7\n\nO blokiranju se lahko pogovorite z uporabnikom/-co $1 ali katerim drugim [[{{MediaWiki:Grouppage-sysop}}|administratorjem]].\nVedite, da lahko ukaz »Pošlji uporabniku e-pismo« uporabite le, če ste v [[Special:Preferences|nastavitvah]] vpisali in potrdili svoj elektronski naslov in ta ni blokiran.\nVaš IP-naslov je $3, številka blokade pa #$5.\nProsimo, vključite ju v vse morebitne poizvedbe.",
        "svg-long-error": "Neveljavna datoteka SVG: $1",
        "show-big-image": "Izvirna datoteka",
        "show-big-image-preview": "Velikost predogleda: $1.",
+       "show-big-image-preview-differ": "Velikost predogleda $3 datoteke $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Druga ločljivost|Drugi ločljivosti|Druge ločljivosti}}: $1.",
        "show-big-image-size": "$1 × $2 točk",
        "file-info-gif-looped": "ponavljajoče",
        "mw-widgets-dateinput-placeholder-day": "LLLL-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "LLLL-MM",
        "mw-widgets-titleinput-description-new-page": "stran še ne obstaja",
-       "mw-widgets-titleinput-description-redirect": "preusmeritev na $1"
+       "mw-widgets-titleinput-description-redirect": "preusmeritev na $1",
+       "api-error-blacklisted": "Prosimo, izberite drugačen, opisen naslov."
 }
index e74eabd..874b020 100644 (file)
        "passwordreset-emailsent-capture": "Një email për rivendosjen e fjalëkalimit është dërguar, i cili tregohet më poshtë.",
        "passwordreset-emailerror-capture": "U dërgua një e-mail kujtesë, i cili tregohet më poshtë, por dërgesa për tek përdoruesi qe e pamundur: $1",
        "changeemail": "Ndrysho postën elektronike",
-       "changeemail-text": "Plotësoni këtë formular për të ndryshuar adresën tuaj të postës elektronike. Ju duhet të shkruani fjalëkalimin tuaj për të konfirmuar këtë ndryshim.",
+       "changeemail-header": "Ndrysho llogarinë e adresës së postës elektronike",
        "changeemail-no-info": "Ju duhet të identifikoheni në mënyrë që të keni të drejtë hyrjeje në këtë faqe.",
        "changeemail-oldemail": "Adresa aktuale e emailit:",
        "changeemail-newemail": "Adresa e re e emailit:",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
        "mw-widgets-dateinput-placeholder-day": "VVVV-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "VVVV-MM"
+       "mw-widgets-dateinput-placeholder-month": "VVVV-MM",
+       "api-error-blacklisted": "Ju lutemi zgjidhni një titull të ndryshëm, përshkrues."
 }
index 5d2a658..c34372f 100644 (file)
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "mw-widgets-titleinput-description-new-page": "страница још увек не постоји",
-       "mw-widgets-titleinput-description-redirect": "преусмерава на $1"
+       "mw-widgets-titleinput-description-redirect": "преусмерава на $1",
+       "api-error-blacklisted": "Изаберите другачији, описан назив."
 }
index 5f80973..4ba6ffc 100644 (file)
        "mw-widgets-dateinput-placeholder-day": "GGGG-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "GGGG-MM",
        "mw-widgets-titleinput-description-new-page": "stranica još uvek ne postoji",
-       "mw-widgets-titleinput-description-redirect": "preusmerava na $1"
+       "mw-widgets-titleinput-description-redirect": "preusmerava na $1",
+       "api-error-blacklisted": "Izaberite drugačiji, opisan naziv."
 }
index feb1530..1c631ec 100644 (file)
        "mw-widgets-dateinput-placeholder-day": "ÅÅÅÅ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
        "mw-widgets-titleinput-description-new-page": "sidan existerar inte ännu",
-       "mw-widgets-titleinput-description-redirect": "omdirigerar till $1"
+       "mw-widgets-titleinput-description-redirect": "omdirigerar till $1",
+       "api-error-blacklisted": "Välj en annan beskrivande titel."
 }
index 4ba7df7..8b8ab4e 100644 (file)
        "special-characters-group-thai": "தாய்",
        "special-characters-group-lao": "இலாவோ",
        "special-characters-group-khmer": "கெமெர்",
-       "special-characters-title-minus": "கழித்தல் குறி"
+       "special-characters-title-minus": "கழித்தல் குறி",
+       "api-error-blacklisted": "தயவுகூர்ந்து வேறு, விளக்கமான தலைப்பைத் தேர்ந்தெடுக்கவும்."
 }
index 1c4bae8..3e406c9 100644 (file)
        "special-characters-group-bangla": "บังคลา",
        "special-characters-group-telugu": "เตลูกู",
        "special-characters-group-sinhala": "สิงหล",
-       "special-characters-group-gujarati": "คุชราต"
+       "special-characters-group-gujarati": "คุชราต",
+       "api-error-blacklisted": "โปรดใช้ชื่ออื่นที่สื่อความหมาย"
 }
index 0adb7f2..f7069e7 100644 (file)
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
        "mw-widgets-dateinput-placeholder-day": "TTTT-BB-AA",
-       "mw-widgets-dateinput-placeholder-month": "TTTT-BB"
+       "mw-widgets-dateinput-placeholder-month": "TTTT-BB",
+       "api-error-blacklisted": "Paki pumili ng isang naiibang mapaglarawang pamagat."
 }
index 5c65c34..6676160 100644 (file)
        "mw-widgets-dateinput-placeholder-day": "РРРР-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "РРРР-ММ",
        "mw-widgets-titleinput-description-new-page": "сторінка ще не існує",
-       "mw-widgets-titleinput-description-redirect": "перенаправлення на $1"
+       "mw-widgets-titleinput-description-redirect": "перенаправлення на $1",
+       "api-error-blacklisted": "Будь ласка, виберіть іншу, більш зрозумілу назву."
 }
index 1444970..2c1d958 100644 (file)
        "special-characters-title-minus": "segno meno",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-GG",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
-       "mw-widgets-titleinput-description-redirect": "rimando a $1"
+       "mw-widgets-titleinput-description-redirect": "rimando a $1",
+       "api-error-blacklisted": "Par piaser siełi un titoło difarente e descritivo."
 }
index b34b09d..7ce35cd 100644 (file)
        "mw-widgets-dateinput-placeholder-day": "YYYY-MM-DD (năm-tháng-ngày)",
        "mw-widgets-dateinput-placeholder-month": "YYYY-MM (năm-tháng)",
        "mw-widgets-titleinput-description-new-page": "Trang này chưa tồn tại",
-       "mw-widgets-titleinput-description-redirect": "Đổi hướng đến $1"
+       "mw-widgets-titleinput-description-redirect": "Đổi hướng đến $1",
+       "api-error-blacklisted": "Xin vui lòng chọn một tên khác miêu tả đầy đủ."
 }
index da6494d..de2dad0 100644 (file)
        "passwordreset-email": "Adresse emile:",
        "passwordreset-emailtitle": "Detays do contre so {{SITENAME}}",
        "changeemail": "Candjî l' emile",
-       "changeemail-text": "Rimplixhoz l' formulrece po candjî voste adresse emile. Vos dvroz dner vosse sicret po-z acertiner l' candjmint.",
+       "changeemail-header": "Candjî l' adresse emile do conte",
        "changeemail-no-info": "Vos dvoz esse elodjî po pleur aveur accès a cisse pådje ci.",
        "changeemail-oldemail": "Adresse emile pol moumint:",
        "changeemail-newemail": "Novele adresse emile:",
        "duration-years": "$1 anêye{{PLURAL:$1||s}}",
        "duration-decades": "$1 dijhinne{{PLURAL:$1||s}} d' anêyes",
        "duration-centuries": "$1 sieke{{PLURAL:$1||s}}",
-       "duration-millennia": "$1 meynaire{{PLURAL:$1||s}}"
+       "duration-millennia": "$1 meynaire{{PLURAL:$1||s}}",
+       "api-error-blacklisted": "S' i vs plait, tchoezixhoz èn ôte tite, pus esplicant."
 }
index e6c4e1b..80de25e 100644 (file)
        "spam_reverting": "Loppantib sumb mu mujj mu amul lëkkalekaay buy jëme $1",
        "spam_blanking": "Setal nañ wecc sumb yi amoon lëkkalekaay buy jëme $1",
        "simpleantispam-label": "Caytu lànk-spam.\n<strong>Bu</strong> fi yokk lenn!",
-       "pageinfo-toolboxlink": "Xibaar ci xëtu wi",
+       "pageinfo-toolboxlink": "Xibaar ci xët wi",
        "previousdiff": "← Coppite yi gën a yàgg",
        "nextdiff": "Coppite yi mujj →",
        "file-info": "Réyaayu file bi : $1, type MIME : $2",
index 31a8b6f..ec163d9 100644 (file)
        "changeemail-no-info": "איר דאַרפֿט זיין אַרײַנלאגירט צוצוקומען גלײַך צו דעם דאָזיגן בלאַט.",
        "changeemail-oldemail": "קראַנטער ע-פּאָסט אַדרעס:",
        "changeemail-newemail": "נײַער בליצפּאָסט אַדרעס:",
+       "changeemail-newemail-help": "דאס פעלד זאל מען לאזן ליידיק כדי אראפצומעמען אייער ע־פאסט אדרעס. איר וועט אבער נישט קיין צוריקשטעלן א פארגעסן פאסווארט און וועט נישט באקומען בליצפאסט פון דיר וויקי טאמער מען נעמט אראפ דעם ע־פאסט אדרעס.",
        "changeemail-none": "(קיין)",
        "changeemail-password": "אייער {{SITENAME}} פאסווארט:",
        "changeemail-submit": "ענדערן ע־פאסט אדרעס",
        "upload-form-label-infoform-description": "באַשרײבונג",
        "upload-form-label-usage-title": "באניץ",
        "upload-form-label-usage-filename": "טעקע נאמען",
+       "foreign-structured-upload-form-label-own-work": "דאס איז מיין אייגענע ארבעט.",
        "foreign-structured-upload-form-label-infoform-categories": "קאַטעגאריעס",
        "foreign-structured-upload-form-label-infoform-date": "דאַטע",
        "backend-fail-stream": "קען נישט מאכן שטראמען טעקע $1.",
        "deletepage": "מעק אויס בלאט",
        "confirm": "באַשטעטיגן",
        "excontent": "אינהאלט געווען: \"$1\"",
-       "excontentauthor": "אינהאלט געווען: \"$1\", און דער איינציגסטער באארבעטער איז געווען '[[Special:Contributions/$2|$2]]'",
+       "excontentauthor": "אינהאלט געווען: \"$1\", און דער איינציגסטער באארבעטער איז געווען '[[Special:Contributions/$2|$2]]' ([[User talk|שמועס]])",
        "exbeforeblank": "אינהאַלט בעפֿאַרן אויסליידיגן איז געווען: \"$1\"",
        "delete-confirm": "אויסמעקן $1",
        "delete-legend": "אויסמעקן",
index c3b5824..17c8519 100644 (file)
        "special-characters-title-minus": "减号",
        "mw-widgets-dateinput-no-date": "没有选定日期",
        "mw-widgets-titleinput-description-new-page": "页面不存在",
-       "mw-widgets-titleinput-description-redirect": "重定向至$1"
+       "mw-widgets-titleinput-description-redirect": "重定向至$1",
+       "api-error-blacklisted": "请选择其他描述性的标题。"
 }
index 99e400f..efa51b1 100644 (file)
        "sig_tip": "您的簽名與日期時間",
        "hr_tip": "水平線 (少用)",
        "summary": "摘要:",
-       "subject": "主題/標題:",
+       "subject": "主:",
        "minoredit": "這是一個小修訂",
        "watchthis": "監視此頁面",
        "savearticle": "儲存頁面",
        "missingcommenttext": "請在下方輸入評論。",
        "missingcommentheader": "<strong>提醒:</strong>您未填寫此評論的主旨/標題。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過主旨/標題直接儲存您的評論。",
        "summary-preview": "摘要預覽:",
-       "subject-preview": "主旨/標題預覽:",
+       "subject-preview": "主旨預覽:",
        "previewerrortext": "嘗試預覽您的變更時發生錯誤。",
        "blockedtitle": "使用者已被封鎖",
        "blockedtext": "<strong>您的使用者名稱或 IP 位址以被封鎖。</strong>\n\n您被 $1 封鎖,\n原因爲 <em>$2</em>。\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯絡 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件地址,且尚未被封鎖郵件功能,則您可透過 \"Email 聯絡此使用者\" 的功能來聯絡相關管理員。\n您目前的 IP 位址是 $3,此次封鎖的 ID 為 #$5。\n請您在詢問時附註以上詳細訊息。",
        "delete-warning-toobig": "此頁面含有大量的編輯歷史,超過 $1 次修訂。\n刪除該頁面可能會中斷 {{SITENAME}} 的資料庫運作;\n請小心執行此動作。",
        "deleteprotected": "此頁面已受保護,您無法刪除此頁面。",
        "deleting-backlinks-warning": "<strong>警告:</strong>您正要刪除的頁面有[[Special:WhatLinksHere/{{FULLPAGENAME}}|其他頁面]]連結或引用。",
-       "rollback": "原編輯",
-       "rollbacklink": "原",
+       "rollback": "原編輯",
+       "rollbacklink": "原",
        "rollbacklinkcount": "還原 $1 次編輯",
        "rollbacklinkcount-morethan": "還原超過 $1 次{{PLURAL:$1|編輯}}",
        "rollbackfailed": "還原失敗",
        "undeleterevisions": "已刪除 $1 個修訂",
        "undeletehistory": "若您還原該頁面,所有的修訂歷史也會一併還原。\n若刪除之後已有使用相同名稱建立的新頁面,還原的修訂歷史會出現在此頁面之前的歷史中。",
        "undeleterevdel": "若最新頁面或檔案修訂被部份刪除,將無法執行取消刪除的動作。\n這種情況您必須取選勾選或取消隱藏已刪除的最新修訂。",
-       "undeletehistorynoadmin": "已刪除此頁面。\n以下摘要顯示刪除原因與刪除前所有編輯過此頁面的使用者詳細資料。\n只有管理員可檢視實際被刪除的文字內容。",
-       "undelete-revision": " $3 刪除的 $1 (於 $4 $5) 修訂:",
+       "undeletehistorynoadmin": "已刪除此頁面。\n以下摘要顯示刪除原因與刪除前所有編輯過此頁面的使用者詳細資料。\n這些已刪除的實際文字修訂僅對管理員可用。",
+       "undelete-revision": " $3 刪除的 $1 (於 $4 $5) 修訂:",
        "undeleterevision-missing": "無效或遺失的修訂。\n您可能使用了錯誤的連結,或該修訂已從封存中還原或刪除。",
        "undelete-nodiff": "查無先前的修訂。",
        "undeletebtn": "還原",
        "undeleteviewlink": "檢視",
        "undeleteinvert": "反向選擇",
        "undeletecomment": "原因:",
-       "undeletedrevisions": "已還原 $1 個修訂",
-       "undeletedrevisions-files": "已還原 $1 個修訂和 $2 個檔案",
-       "undeletedfiles": "已還原 $1 個檔案",
+       "undeletedrevisions": "{{PLURAL:$1|$1 個修訂}}已還原",
+       "undeletedrevisions-files": "{{PLURAL:$1|$1 個修訂}}與 {{PLURAL:$2|$2 個檔案}}已還原",
+       "undeletedfiles": "{{PLURAL:$1|$1}} 個檔案已還原",
        "cannotundelete": "取消刪除失敗:\n$1",
-       "undeletedpage": "<strong>已還原 $1</strong>\n\n請參考 [[Special:Log/delete|刪除日誌]] 以查詢最近刪除及還原的記錄。",
+       "undeletedpage": "<strong>$1 已還原</strong>\n\n請參考 [[Special:Log/delete|刪除日誌]] 以查詢最近刪除及還原的記錄。",
        "undelete-header": "請參考 [[Special:Log/delete|刪除日誌]] 查詢最近刪除的頁面。",
        "undelete-search-title": "搜尋已刪除頁面",
        "undelete-search-box": "搜尋已刪除的頁面",
        "blanknamespace": "(主要)",
        "contributions": "{{GENDER:$1|使用者}}貢獻",
        "contributions-title": "$1 的使用者貢獻",
-       "mycontris": "我的貢獻",
+       "mycontris": "貢獻",
        "contribsub2": "{{GENDER:$3|$1}} 的貢獻 ($2)",
        "contributions-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。",
        "nocontribs": "沒有找到符合條件的變更。",
        "uctop": "(目前)",
        "month": "截止月份:",
        "year": "截止年份:",
-       "sp-contributions-newbies": "å\8fª顯示新帳號的貢獻",
+       "sp-contributions-newbies": "å\83\85顯示新帳號的貢獻",
        "sp-contributions-newbies-sub": "新帳號的貢獻",
        "sp-contributions-newbies-title": "新帳號的使用者貢獻",
        "sp-contributions-blocklog": "封鎖記錄",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*常見的封鎖原因\n** 填寫不實資訊\n** 刪除頁面內容\n** 散佈外部廣告連結\n** 在頁面填寫無意義文字\n** 無禮的行為、攻擊/騷擾別人\n** 濫用多個帳號\n** 使用不受歡迎的使用者名稱",
        "ipb-hardblock": "禁止使用此 IP 位址登入的使用者編輯",
-       "ipbcreateaccount": "禁止建立帳號",
+       "ipbcreateaccount": "防止帳號建立",
        "ipbemailban": "禁止使用者傳送電子郵件",
        "ipbenableautoblock": "自動封鎖此使用者最後使用的 IP 位址,以及所有之後嘗試編輯使用的 IP 位址",
        "ipbsubmit": "封鎖此使用者",
        "emailblock": "停用電子郵件",
        "blocklist-nousertalk": "無法編輯自己的對話頁面",
        "ipblocklist-empty": "封鎖清單為空。",
-       "ipblocklist-no-results": "指定的 IP 位址或使用者名稱尚未被封鎖。",
+       "ipblocklist-no-results": "要求的 IP 位址或使用者名稱尚未被封鎖。",
        "blocklink": "封鎖",
        "unblocklink": "解除封鎖",
        "change-blocklink": "變更封鎖",
        "proxyblocker": "代理伺服器封鎖器",
        "proxyblockreason": "因您的 IP 位址是開放代理伺服器,已被封鎖。\n請聯絡您的網路服務供應商或您所在組織的技術支援,告知他們此嚴重的安全性問題。",
        "sorbsreason": "您的 IP 位址在 {{SITENAME}} 使用的 DNSBL 列為開放代理伺服器。",
-       "sorbs_create_account_reason": "您連線到 {{SITENAME}} 的 IP 位址被 DNSBL 列為開放代理伺服器。\n您不能建立帳號。",
+       "sorbs_create_account_reason": "您的 IP 位址在 {{SITENAME}} 使用的 DNSBL 列為開放代理伺服器。\n您不能建立帳號。",
        "xffblockreason": "您的 IP 位址使用 X-Forwarded-For 標頭,您或您使用的代理伺服器已被封鎖。\n封鎖的原因為:$1",
        "cant-see-hidden-user": "您欲封鎖的使用者已經被封鎖並且隱藏。\n您沒有隱藏使用者的權限,您無法檢視或編輯該使用者的封鎖狀態。",
        "ipbblocked": "因您已被封鎖,故無法封鎖或解除封鎖其他使用者。",
        "special-characters-title-minus": "減號",
        "mw-widgets-dateinput-no-date": "未選擇日期",
        "mw-widgets-titleinput-description-new-page": "頁面不存在",
-       "mw-widgets-titleinput-description-redirect": "重新導向至 $1"
+       "mw-widgets-titleinput-description-redirect": "重新導向至 $1",
+       "api-error-blacklisted": "請選擇另一個更具描述性的標題。"
 }
index bb5e9ab..3e25eec 100644 (file)
             "Urhixidur",
             "Wong128hk",
             "Zerng07",
-            "לערי ריינהארט"
+            "לערי ריינהארט",
+            "LNDDYL",
+            "Carrotkit"
         ]
     },
-    "tog-underline": "連結標注底線",
-    "tog-justify": "段落對齊",
-    "tog-hideminor": "近期變動中隱藏細微修改",
-    "tog-usenewrc": "使用強化的近期變動 (需要JavaScript)",
-    "tog-numberheadings": "自動編號標題",
-    "tog-showtoolbar": "顯示編輯工具欄 (需要JavaScript)",
-    "tog-watchcreations": "將我建立的頁面加進我的監視列表",
-    "tog-watchdefault": "將我更改的頁面添加到我的監視列表中",
-    "tog-minordefault": "預設將編輯設定為細微修改",
-    "tog-enotifwatchlistpages": "當我監視的頁面改變時發電子郵件給我",
-    "tog-enotifusertalkpages": "當我的對話頁有更動時發電子郵件通知我",
-    "tog-shownumberswatching": "顯示監視數目",
-    "tog-uselivepreview": "使用即時預覽 (JavaScript) (試驗中)",
-    "tog-watchlisthideminor": "監視列表中隱藏細微修改",
-    "tog-ccmeonemails": "當我寄電子郵件給其他使用者時,也寄一份複本到我的信箱。",
-    "saturday": "星期六",
-    "sun": "日",
-    "mon": "一",
-    "tue": "二",
-    "wed": "三",
-    "thu": "四",
-    "fri": "五",
-    "january": "一月",
-    "february": "二月",
-    "march": "三月",
-    "april": "四月",
-    "may_long": "五月",
-    "june": "六月",
-    "july": "七月",
-    "august": "八月",
-    "september": "九月",
-    "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": "十二月",
-    "jan": "1月",
-    "feb": "2月",
-    "mar": "3月",
-    "apr": "4月",
-    "may": "5月",
-    "jun": "6月",
-    "jul": "7月",
-    "aug": "8月",
-    "sep": "9月",
-    "oct": "10月",
-    "nov": "11月",
-    "dec": "12月",
-    "subcategories": "子分類",
-    "qbfind": "尋找",
-    "vector-action-protect": "保護",
-    "vector-view-create": "建立",
-    "vector-view-view": "閱讀",
-    "help": "使用說明",
-    "search": "搜尋",
-    "searchbutton": "搜尋",
-    "history": "修訂記錄",
-    "history_short": "歷史",
-    "edit": "編輯",
-    "create": "建立",
-    "delete": "刪除",
-    "protect_change": "更改",
-    "postcomment": "新段落",
-    "toolbox": "工具箱",
-    "userpage": "檢視使用者頁面",
     "projectpage": "檢視計畫頁面",
-    "lastmodifiedat": "本頁最後更動時間在 $1 $2。",
-    "jumptosearch": "搜尋",
-    "aboutsite": "關於 {{SITENAME}}",
     "copyright": "本站的文字內容除另有聲明外,全部以 $1 條款授權使用。",
-    "disclaimers": "免責聲明",
-    "edithelp": "編輯說明",
-    "mainpage": "首頁",
-    "portal": "社群入口",
-    "portal-url": "Project:社群入口",
-    "badaccess-groups": "您剛才的請求只有{{PLURAL:$2|這個|這些}}使用者組的使用者才能使用: $1",
-    "editold": "編輯",
-    "editsectionhint": "编辑段落:$1",
-    "showtoc": "顯示",
-    "hidetoc": "隱藏",
-    "thisisdeleted": "檢視或復原$1?",
-    "site-rss-feed": "訂閱 $1 的 RSS 資料來源",
-    "site-atom-feed": "訂閱 $1 的 Atom 資料來源",
-    "page-rss-feed": "訂閱「$1」的 RSS 資料來源",
-    "page-atom-feed": "訂閱「$1」的 Atom 資料來源",
-    "red-link-title": "$1 (頁面不存在)",
-    "nstab-main": "頁面",
-    "nstab-user": "使用者頁面",
-    "nstab-special": "特殊頁面",
     "nstab-project": "計畫頁面",
     "nstab-mediawiki": "介面",
-    "nstab-help": "說明頁面",
-    "nosuchactiontext": "該URL所指定的動作無效。\n您可能打錯URL,或點了錯誤連結。\n這也可能是{{SITENAME}}所使用的軟件出現了錯誤。",
-    "readonlytext": "資料庫目前禁止輸入新內容及更改,\n這很可能是由於資料庫正在維修,之後即可復原。\n管理員有如下解釋:\n<p>$1</p>",
-    "cannotdelete": "無法刪除選定的頁面或圖片(它可能已經被其他人刪除了)。",
-    "actionthrottledtext": "系統因為反垃圾編輯的考量,禁止如此頻繁地修改資料,請數分鐘後再嘗試。",
-    "viewsourcetext": "你可以檢視並複製本頁面的原始碼。",
-    "editinginterface": "'''警告:''' 您正在編輯的頁面是正用在軟體上的介面文字。改變此頁將影響其他用戶的介面外觀。如要翻譯,請考慮使用 [//translatewiki.net/wiki/Main_Page?setlang=zh-hant translatewiki.net],一個用來為MediaWiki軟體本地化的計畫。",
-    "ns-specialprotected": "在{{ns:special}}名字空間中的頁面是不可以編輯的。",
-    "logouttext": "您現在已經登出。\n\n您可以以匿名方式繼續使用{{SITENAME}},或者以相同或不同用戶身份[[Special:UserLogin|登入]]。\n請注意,如果你再次登入,此頁或會繼續顯示,直到您清除瀏覽器快取。",
-    "welcomecreation": "== 歡迎,$1! ==\n您的帳號已經建立。\n請不要忘記設定[[Special:Preferences|{{SITENAME}}的個人參數]]。",
-    "yourname": "您的使用者名:",
-    "yourpassword": "密碼:",
-    "login": "登入",
-    "nav-login-createaccount": "登入/建立新帳號",
-    "userlogin": "登入/建立新帳號",
-    "logout": "登出",
-    "userlogout": "登出",
-    "nologin": "您還沒有帳號嗎?$1。",
-    "nologinlink": "建立新帳號",
-    "createaccount": "建立新帳號",
-    "gotaccount": "已經擁有帳號?$1。",
-    "badretype": "你所輸入的密碼並不相同。",
-    "userexists": "您所輸入的使用者名稱已經存在,請另選一個名稱。",
-    "nocookiesnew": "已成功建立新帳號!偵測到您已關閉 Cookies,請開啟它並登入。",
-    "nocookieslogin": "本站利用 Cookies 進行使用者登入,偵測到您已關閉 Cookies,請開啟它並重新登入。",
-    "noname": "你沒有輸入一個有效的使用者帳號。",
-    "loginsuccess": "你現在以 \"$1\"的身份登入{{SITENAME}}。",
-    "nosuchuser": "找不到使用者 \"$1\"。\n檢查您的拼寫,或者用下面的表格[[Special:UserLogin/signup|建立一個新帳號]]。",
-    "nosuchusershort": "沒有一個名為「$1」的使用者。請檢查您輸入的文字是否有錯誤。",
-    "nouserspecified": "你需要指定一個使用者帳號。",
-    "passwordtooshort": "您的密碼不正確或太短,不能少於$1個字元,而且必須跟使用者名不同。",
-    "passwordremindertitle": "{{SITENAME}}密碼提醒",
-    "passwordremindertext": "有人(來自IP位址$1,可能是您)已請求{{SITENAME}}的新密碼 ($4)。\n用戶\"$2\"現在已設定新臨時密碼\"$3\"。\n如果這個動作是您所指示的,您需要立即登入並選擇一個新的密碼。\n您的臨時密碼會在{{PLURAL:$5|一|$5}}天內過期。\n\n如果是其他人發出了該請求,或者您已經想起了您的密碼而且並不打算換掉,\n您可以忽略此消息並繼續使用您的舊密碼。",
-    "noemail": "使用者\"$1\"沒有登記電子郵件地址。",
-    "passwordsent": "使用者\"$1\"的新密碼已經寄往所登記的電子郵件地址。\n請在收到後再登入。",
-    "blocked-mailpassword": "由於這個使用者被封鎖,我們暫時禁止您請求申請新密碼。造成不便敬請見諒",
-    "eauthentsent": "一封確認信已經發送到所示的地址。在發送其它郵件到此帳號前,您必須首先依照這封信中的指導確認這個電子郵件信箱真實有效。",
-    "acct_creation_throttle_hit": "抱歉,使用您的IP位址拜訪此wiki網站的訪客已經在昨天創建了$1個帳號,達到了該時段的上限,所以目前使用這個IP位址的訪客不能再繼續創建帳號。",
-    "emailauthenticated": "您的電子郵件地址已經於$2 $3確認有效。",
-    "emailnotauthenticated": "您的電子郵件地址<strong>還沒被認證</strong>。以下功能將不會發送任何郵件。",
-    "noemailprefs": "指定一個電子郵件地址以使用此功能",
-    "emailconfirmlink": "確認您的電子郵件地址",
-    "invalidemailaddress": "電子郵件地址格式不正確,請輸入正確的電子郵件位址或清空該輸入框。",
-    "accountcreated": "已建立帳號",
-    "accountcreatedtext": "$1的帳號已經被建立。",
-    "createaccount-title": "在{{SITENAME}}中建立新帳號",
-    "createaccount-text": "有人在{{SITENAME}}中為 $2 建立了一個新帳號($4)。 \"$2\" 的密碼是 \"$3\" 。您應該立即登入並更改密碼。\n\n如果該帳號建立錯誤的話,您可以忽略此訊息。",
-    "resetpass": "更換密碼",
-    "resetpass_announce": "您是透過臨時發送到郵件中的代碼登入的。要完成登入,您必須在這裡設定一個新密碼:",
-    "resetpass_header": "更換帳號密碼",
-    "oldpassword": "舊密碼",
-    "newpassword": "新密碼",
-    "resetpass_success": "您的密碼已經被成功更改﹗現下正為您登入...",
-    "resetpass_forbidden": "無法更改密碼",
-    "image_tip": "嵌入圖片",
-    "media_tip": "媒體檔案連結",
-    "summary": "摘要",
-    "minoredit": "這是一個細微修改",
-    "savearticle": "儲存頁面",
-    "blockedtitle": "使用者被封鎖",
-    "confirmedittext": "在編輯此頁之前您必須確認您的電子郵件地址。請透過[[Special:Preferences|偏好設定]]設定並驗證您的電子郵件地址。",
-    "accmailtext": "'[[User talk:$1|$1]]'的隨機產生密碼已經寄到$2。\n\n這個新帳號的密碼可以在登入後的''[[Special:ChangePassword|更改密碼]]''頁面中更改。",
-    "newarticletext": "您進入了一個尚未建立的頁面。\n要建立該頁面,請在下面的編輯框中輸入內容(詳情參見[[{{MediaWiki:Helppage}}|說明]])。\n如果您是不小心來到此頁面,直接點擊您瀏覽器中的「返回」按鈕返回。",
-    "anontalkpagetext": "---- ''這是一個還未建立帳號的匿名使用者的對話頁。我們因此只能用IP地址來與他/她聯絡。該IP地址可能由幾名使用者共享。如果您是一名匿名使用者並認為本頁上的評語與您無關,請[[Special:UserLogin|建立新帳號或登入]]以避免在未來於其他匿名使用者混淆。''",
-    "noarticletext": "此頁目前沒有內容,您可以在其它頁[[Special:Search/{{PAGENAME}}|搜索此頁標題]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索有關日誌],\n或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 編輯此頁]</span>。",
-    "userpage-userdoesnotexist": "使用者帳號「<nowiki>$1</nowiki>」未曾建立。請在建立/編輯這個頁面前先檢查一下。",
-    "usercsspreview": "'''注意您只是在預覽您的個人 CSS, 還沒有儲存﹗'''",
-    "userjspreview": "'''注意您只是在測試/預覽您的個人 JavaScript,還沒有儲存﹗'''",
-    "previewnote": "'''請記住這只是預覽,內容尚未儲存!'''",
-    "session_fail_preview": "'''很抱歉!由於部份資料遺失,我們無法處理您的編輯。'''\n請再試一次。\n如果仍然失敗,請[[Special:UserLogout|登出]]後重新登入。",
-    "session_fail_preview_html": "'''很抱歉!部份資料已遺失,我們無法處理您的編輯。''''''如果這個編輯過程沒有問題,請再試一次。如果仍然有問題,請登出後再重新登入一次。'''",
-    "token_suffix_mismatch": "'''由於您使用者端中的編輯信符毀損了一些標點符號字元,為防止編輯的文字損壞,您的編輯已經被拒絕。\n這種情況通常出現於使用含有很多臭蟲、以網路為主的匿名代理服務的時候。'''",
-    "editingcomment": "正在編輯$1(新段落)",
-    "storedversion": "已保存版本",
-    "nonunicodebrowser": "'''警告: 您的瀏覽器不相容Unicode編碼。這裡有一個工作區將使您能安全地編輯頁面: 非ASCII字元將以十六進製編碼模式出現在編輯框中。'''",
-    "editingold": "'''警告:你正在編輯的是本頁的舊版本。\n如果你保存它的話,在本版本之後的任何修改都會遺失。'''",
-    "longpageerror": "'''錯誤: 您所提交的文字長度有$1KB,這大於$2KB的最大值。該文字不能被儲存。'''",
-    "protectedpagewarning": "'''警告: 本頁已經被保護,只有擁有管理員許可權的使用者才可修改。'''",
-    "semiprotectedpagewarning": "'''注意:''' 本頁面被鎖定,僅限註冊使用者編輯。",
-    "cascadeprotectedwarning": "警告: 本頁已經被保護,只有擁有管理員權限的使用者才可修改,因為本頁已被以下連鎖保護的{{PLURAL:$1|一個|多個}}頁面所包含:",
-    "nocreatetitle": "建立頁面受限",
-    "nocreatetext": "此網站限制了建立新頁面的功能。你可以返回並編輯已有的頁面,或者[[Special:UserLogin|登錄或建立新帳號]]。",
-    "nocreate-loggedin": "您在這個wiki中並無許可權去建立新頁面。",
-    "recreate-moveddeleted-warn": "'''警告: 你現在重新建立一個先前曾經刪除過的頁面。'''\n\n你應該要考慮一下繼續編輯這一個頁面是否合適。\n為方便起見,這一個頁面的刪除記錄已經在下面提供:",
-    "edit-hook-aborted": "編輯被鉤取消。\n它並無給出解釋。",
-    "post-expand-template-argument-category": "包含著略過模板參數的頁面",
-    "cantcreateaccounttitle": "無法建立帳號",
-    "cantcreateaccount-text": "從這個IP地址 (<b>$1</b>) 建立帳號已經被[[User:$3|$3]]禁止。\n\n當中被$3封鎖的原因是''$2''",
-    "histlegend": "差異選擇:標記要比較版本的單選按鈕並點擊底部的按鈕進行比較。<br />\n說明:(目前) 指與目前版本比較,(先前) 指與前一個修訂版本比較,小 = 細微修改。",
-    "history-feed-title": "修訂沿革",
-    "history-feed-description": "本站上此頁的修訂沿革",
-    "history-feed-empty": "所請求的頁面不存在。它可能已被刪除或重新命名。\n嘗試[[Special:Search|搜尋本站]]獲得相關的新建頁面。",
-    "rev-deleted-comment": "(註釋已除)",
-    "rev-deleted-user": "(使用者名已移除)",
-    "rev-deleted-event": "(日誌已除)",
-    "rev-deleted-text-permission": "該頁面修訂已經被從公共文件中移除。\n在[{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} 刪除日誌]中您可能會檢視到詳細的訊息。",
-    "rev-deleted-text-view": "該頁面修訂已經被從公共文件中移除。作為此網站的管理員,您可以檢視它;\n在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 刪除日誌]中您可能會檢視到詳細的訊息。",
-    "revisiondelete": "刪除/復原刪除修訂",
-    "revdelete-nooldid-title": "沒有目標修訂",
-    "revdelete-nooldid-text": "您沒有指定此操作的目標修訂。",
-    "logdelete-selected": "'''選取的$1個日誌項目:'''",
-    "revdelete-text": "'''刪除的修訂仍將顯示在修訂記錄中, 但它們的文字內容已不能被公眾訪問。'''\n\n在此網站的其他管理員將仍能訪問隱藏的內容並透過與此相同的介面復原刪除,除非網站工作者進行了一些附加的限制。",
-    "revdelete-legend": "設定修訂限制:",
-    "revdelete-hide-user": "隱藏編輯者的使用者名/IP",
-    "revdelete-hide-restricted": "將此限制同樣應用於管理員",
-    "revdelete-suppress": "同時壓制由操作員以及其他使用者的資料",
-    "revdelete-unsuppress": "在已復原的修訂中移除限制",
-    "revdelete-success": "修訂的可見性已經成功設定。",
-    "logdelete-success": "事件的可見性已經成功設定。",
-    "mergehistory": "合併修訂記錄",
-    "mergehistory-header": "這一頁可以講您合併一個來源頁面的歷史到另一個新頁面中。\n請確認這次更改會繼續保留該頁面先前的歷史版本。\n\n'''最少該來源頁面的現時修訂必定會保持。'''",
-    "mergehistory-merge": "以下[[:$1]]的修訂可以合併到[[:$2]]。用該選項按鈕欄去合併只有在指定時間以前所建立的修訂。要留意的是使用導航連結便會重設這一欄。",
-    "mergelogpagetext": "以下是一個最近由一個頁面的修訂沿革合併到另一個頁面的列表。",
-    "history-title": "「$1」的修訂沿革",
-    "compareselectedversions": "比較選定的版本",
-    "searchresults": "搜尋結果",
-    "searchresulttext": "有關搜尋{{SITENAME}}的更多詳情,參見[[{{MediaWiki:Helppage}}|{{int:help}}]]。",
-    "searchsubtitle": "查詢'''[[:$1]]'''([[Special:Prefixindex/$1|所有以 \"$1\" 開頭的頁面]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|所有鏈接到 \"$1\" 的頁面]])",
-    "nonefound": "'''注意''': 只有一些名稱空間是會作為預設搜尋。嘗試''all:''去搜尋全部的頁面(包埋討論頁面、模板等),或可用需要的名稱空間作為前綴。",
-    "powersearch": "搜尋",
-    "searchdisabled": "{{SITENAME}}由於性能方面的原因,全文搜尋已被暫時停用。您可以暫時透過Google搜尋。請留意他們的索引可能會過時。",
-    "preferences": "偏好設定",
-    "mypreferences": "我的偏好設定",
-    "prefsnologintext": "您必須先[[Special:UserLogin|登入]]才能設定個人參數。",
-    "prefs-personal": "使用者資料",
-    "prefs-rc": "近期變動",
-    "prefs-watchlist-days": "監視列表中顯示記錄的最長天數:",
-    "resetprefs": "重設參數",
-    "searchresultshead": "搜尋結果設定",
-    "recentchangesdays": "近期變動中的顯示日數:",
-    "recentchangescount": "近期變動中的編輯數:",
-    "savedprefs": "您的個人偏好設定已經儲存。",
-    "timezonelegend": "時區",
-    "localtime": "當地時間",
-    "timezoneoffset": "時差¹",
-    "servertime": "伺服器時間",
-    "allowemail": "接受來自其他使用者的郵件",
-    "defaultns": "否則在這些名字空間搜尋:",
-    "username": "使用者名:",
-    "uid": "使用者ID:",
-    "yournick": "暱稱:",
-    "badsig": "錯誤的原始簽名;請檢查HTML標籤。",
-    "badsiglength": "你的簽名過長;簽名長度必須在$1個字元以下。",
-    "prefs-help-gender": "可選:用於軟體中的性別指定。此項資料將會被公開。",
-    "prefs-help-realname": "真實姓名是選填的,如果您選擇提供它,那它便用以對您的貢獻署名。",
-    "prefs-help-email": "電子郵件是選填的,但當啟用它後可以在您忘記您的個密碼時需要將新密碼重設寄回給您。而在您未公開自己的使用者身分時也能透過您的用戶頁或用戶討論頁與您聯繫。",
-    "userrights": "使用者權限管理",
-    "userrights-lookup-user": "管理使用者群組",
-    "userrights-user-editname": "輸入使用者帳號:",
-    "editusergroup": "編輯使用者群組",
-    "editinguser": "正在編輯使用者'''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
-    "userrights-editusergroup": "編輯使用者群組",
-    "saveusergroups": "保存使用者群組",
-    "group-autoconfirmed": "自動確認使用者",
-    "group-autoconfirmed-member": "自動確認使用者",
-    "grouppage-autoconfirmed": "{{ns:project}}:自動確認使用者",
-    "rightslog": "使用者權限日誌",
-    "rightslogtext": "以下記錄了使用者權限的更改記錄。",
-    "recentchanges": "近期變動",
-    "recentchanges-feed-description": "追蹤此訂閱在 wiki 上的近期變動。",
-    "rcnotefrom": "下面是自<b>$2</b>(最多顯示<b>$1</b>):",
-    "rcshowhideminor": "$1細微修改",
-    "rcshowhidebots": "$1機器人的編輯",
-    "rcshowhideliu": "$1具名使用者的編輯",
-    "rcshowhideanons": "$1匿名使用者的編輯",
-    "rcshowhidepatr": " $1檢查過的編輯",
-    "number_of_watching_users_pageview": "[$1個關注使用者]",
-    "recentchangeslinked": "相關頁面修訂記錄",
-    "recentchangeslinked-feed": "相關頁面修訂記錄",
-    "recentchangeslinked-toolbox": "相關頁面修訂記錄",
-    "recentchangeslinked-title": "$1 內連結頁面的修訂記錄",
-    "recentchangeslinked-summary": "這一個特殊頁面列示這一頁連出頁面的近期變動。在您監視列表中的頁面會以'''粗體'''表示。",
-    "upload": "上傳檔案",
-    "reuploaddesc": "返回上載表單。",
-    "uploadtext": "使用下面的表單來上傳用在頁面內新的圖片檔案。\n要檢視或搜尋以前上傳的圖片\n可以進入[[Special:FileList|圖片清單]],\n上傳和刪除將在[[Special:Log/upload|上傳日誌]]中記錄。\n\n要在頁面中加入圖片,使用以下形式的連接:\n'''<nowiki>[[</nowiki>{{ns:file}}:file.jpg<nowiki>]]</nowiki>''',\n'''<nowiki>[[</nowiki>{{ns:file}}:file.png|替換文字<nowiki>]]</nowiki>''' 或\n'''<nowiki>[[</nowiki>{{ns:media}}:file.ogg<nowiki>]]</nowiki>'''。",
-    "uploadlogpagetext": "以下是最近上傳的檔案的一覽表。",
-    "ignorewarning": "忽略警告並儲存檔案。",
-    "illegalfilename": "檔案名\"$1\"包含有頁面標題所禁止的字符。請改名後重新上傳。",
-    "badfilename": "檔案名已被改為\"$1\"。",
-    "hookaborted": "您所嘗試的修改被擴展鉤捨棄。",
-    "fileexists-thumbnail-yes": "這個檔案好像是一幅圖片的縮圖版本''(縮圖)''。 [[$1|thumb]]\n請檢查清楚該檔案'''<tt>[[:$1]]</tt>'''。\n如果檢查後的檔案是同原本圖片的大小是一樣的話,就不用再上載多一幅縮圖。",
-    "file-thumbnail-no": "該檔名是以'''<tt>$1</tt>'''開始。它好像一幅圖片的縮圖版本''(縮圖)''。\n如果你有該圖片的完整大小,如不是請再修改檔名。",
-    "fileexists-forbidden": "已存在相同名稱的檔案;請返回並用一個新的名稱來上傳此檔案。[[File:$1|thumb|center|$1]]",
-    "fileexists-shared-forbidden": "在共享檔案庫中已存在此名稱的檔案;請返回並用一個新的名稱來上傳此檔案。[[File:$1|thumb|center|$1]]",
-    "uploaddisabledtext": "檔案上傳在此網站不可用。",
-    "watchthisupload": "監視此頁",
-    "upload-proto-error": "協訂錯誤",
-    "upload-file-error-text": "當試圖在伺服器上建立臨時檔案時發生內部錯誤。請與系統管理員聯繫。",
-    "upload-misc-error-text": "在上傳時發生未知的錯誤. 請驗証使用了正確並可訪問的 URL,然後進行重試。如果問題仍然存在,請與系統管理員聯繫。",
-    "listfiles_search_for": "按圖片名稱搜尋:",
-    "listfiles_user": "使用者",
-    "filehist": "檔案歷史",
-    "filehist-deleteone": "刪除這個",
-    "filehist-revert": "復原",
-    "filehist-datetime": "日期/時間",
-    "filehist-user": "使用者",
-    "imagelinks": "連結",
-    "filerevert": "復原$1",
-    "filerevert-legend": "復原檔案",
-    "filerevert-intro": "<span class=\"plainlinks\">您現正在復原'''[[Media:$1|$1]]'''到[$4 於$2 $3的版本]。</span>",
-    "filerevert-defaultcomment": "已經復原到於$1 $2的版本",
-    "filerevert-submit": "復原",
-    "filerevert-success": "<span class=\"plainlinks\">'''[[Media:$1|$1]]'''已經復原到[$4 於$2 $3的版本]。</span>",
-    "filedelete-intro": "您現正刪除'''[[Media:$1|$1]]'''。",
-    "filedelete-intro-old": "<span class=\"plainlinks\">你現正刪除'''[[Media:$1|$1]]'''於[$4 $2 $3]的版本。</span>",
-    "filedelete-comment": "註解:",
-    "filedelete-nofile": "'''$1'''在這個網站中不存在。",
-    "filedelete-nofile-old": "在已指定屬性的情況下,這裡沒有'''$1'''於 $2 $3 的版本。",
-    "mimesearch": "MIME 搜尋",
-    "unusedtemplatestext": "本頁面列出模板名字空間下所有未被其他頁面使用的頁面。請在刪除這些模板前檢查其他鏈入該模板的頁面。",
-    "randompage-nopages": "在這個名字空間中沒有頁面。",
-    "randomredirect-nopages": "在這個名字空間中沒有重定向頁面。",
-    "statistics-header-users": "使用者統計",
-    "disambiguations": "消歧義",
-    "disambiguations-text": "以下的頁面都有到<b>消歧義頁</b>的鏈接,\n但它們應該是連到適當的標題。<br />\n個頁面會被視為消含糊頁如果它是連自[[MediaWiki:Disambiguationspage]]。",
-    "withoutinterwiki-summary": "以下的頁面是未有語言鏈接到其它語言版本:",
-    "lonelypagestext": "以下頁面尚未被這個wiki中的其它頁面連結。",
-    "uncategorizedimages": "待分類圖片",
-    "unusedimages": "未使用圖片",
-    "mostimages": "最多連結圖片",
-    "prefixindex": "所有頁面之前綴",
-    "deadendpagestext": "以下頁面沒有連結到這個wiki中的其它頁面。",
-    "listusers": "使用者列表",
-    "newpages-username": "使用者帳號:",
-    "move": "移動",
-    "unusedimagestext": "請注意其它網站可能直接透過 URL 連結此圖片,所以這裡列出的圖片有可能依然被使用。",
-    "notargettext": "您還沒有指定一個目標頁面或使用者以進行此項操作。",
-    "specialloguserlabel": "使用者:",
-    "alllogstext": "綜合顯示 {{SITENAME}} 的上傳、刪除、保護、查封以及站務日誌。",
-    "listusersfrom": "給定顯示使用者條件:",
-    "listusers-noresult": "找不到使用者。",
-    "activeusers-hidebots": "隱藏機器人",
-    "mailnologin": "無E-mail地址",
-    "mailnologintext": "您必須先[[Special:UserLogin|登入]]\n並在[[Special:Preferences|偏好設定]]\n中有一個有效的e-mail地址才可以E-mail其他使用者。",
-    "emailuser": "E-mail該使用者",
-    "emailpage": "E-mail使用者",
-    "emailpagetext": "如果該使用者已經在他或她的偏好設定頁中輸入了有效的e-mail地址,以下的表格將寄一個訊息給該使用者。您在您偏好設定中所輸入的e-mail地址將出現在郵件「發件人」一欄中,這樣該使用者就可以回覆您。",
-    "noemailtext": "該使用者還沒有指定一個有效的e-mail地址,\n或者選擇不接受來自其他使用者的e-mail。",
-    "emailfrom": "發件人",
-    "emailto": "收件人",
-    "emailsubject": "主題",
-    "emailmessage": "訊息",
-    "emailccme": "將我的消息的副本發送一份到我的E-mail信箱。",
-    "addedwatchtext": "頁面「[[:$1]]」已經被加入到您的[[Special:Watchlist|監視清單]]中。將來有關此頁面及其討論頁的任何修改將會在那裡列出,而且還會在[[Special:RecentChanges|近期變動]]中以'''粗體'''形式列出以使起更容易識別。",
-    "removedwatchtext": "頁面「[[:$1]]」已經從您的監視頁面中移除。",
-    "watchlist-details": "不包含討論頁,您的監視列表共有 $1 頁。",
-    "enotif_impersonal_salutation": "{{SITENAME}}使用者",
-    "enotif_anon_editor": "匿名使用者$1",
-    "enotif_body": "親愛的 $WATCHINGUSERNAME,\n\n$PAGEEDITOR 已經在 $PAGEEDITDATE $CHANGEDORCREATED{{SITENAME}}的 $PAGETITLE 頁面,請到 $PAGETITLE_URL 檢視目前版本。\n\n$NEWPAGE\n\n編輯摘要: $PAGESUMMARY $PAGEMINOREDIT\n\n聯繫此編輯者:\n\n郵件: $PAGEEDITOR_EMAIL\n\n本站: $PAGEEDITOR_WIKI\n\n在您訪問此頁之前,將來的更改將不會向您發通知。您也可以重設您所有監視頁面的通知標記。\n\n                {{SITENAME}}通知系統\n\n--\n要改變您的監視列表設定,請參閱\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n回饋和進一步的說明:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
-    "confirmdeletetext": "您即將從資料庫中永遠刪除一個頁面或圖片以及其歷史。\n請確定您要進行此項操作,並且了解其後果,同時您的行為符合[[{{MediaWiki:Policy-url}}]]。",
-    "deletedtext": "「$1」已經被刪除。\n最近刪除的紀錄請參見$2。",
-    "dellogpagetext": "以下是最近刪除的紀錄列表。\n所有的時間都是使用伺服器時間。",
-    "reverted": "復原到早期版本",
-    "deletecomment": "原因:",
-    "rollback": "復原",
-    "rollback_short": "復原",
-    "rollbacklink": "復原",
-    "rollbackfailed": "無法復原",
-    "cantrollback": "無法復原編輯;最後的貢獻者是本文的唯一作者。",
-    "alreadyrolled": "無法復原由[[User:$2|$2]] ([[User talk:$2|討論]])進行的[[$1]]的最後編輯;\n其他人已經編輯或是復原了該頁。\n\n最後編輯者: [[User:$3|$3]] ([[User talk:$3|討論]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])。",
-    "editcomment": "編輯說明: \"''$1''\"。",
-    "revertpage": "復原由[[Special:Contributions/$2|$2]] ([[User talk:$2|對話]])的編輯;更改回[[User:$1|$1]]的最後一個版本",
-    "rollback-success": "復原由$1的編輯;更改回$2的最後一個版本。",
-    "protect-title": "更改「$1」的保護等級",
-    "protect-locked-blocked": "您不能在被封鎖時更改保護級別。\n以下是'''$1'''現時的保護級別:",
-    "protect-locked-access": "您的帳號權限不能修改保護級別。\n以下是'''$1'''現時的保護級別:",
-    "protect-cascadeon": "以下的{{PLURAL:$1|一個|多個}}頁面包含著本頁面的同時,啟動了連鎖保護,因此本頁面目前也被保護,未能編輯。您可以設定本頁面的保護級別,但這並不會對連鎖保護有所影響。",
-    "protect-default": "(預設)",
-    "protect-level-autoconfirmed": "禁止未註冊使用者",
-    "protect-expiry-options": "2小時:2 hours,1天:1 day,1周:1 week,2周:2 weeks,1個月:1 month,3個月:3 months,6個月:6 months,1年:1 year,永久:infinite",
-    "maximum-size": "最大大小",
-    "undelete": "復原被刪頁面",
-    "undeletepage": "瀏覽及復原被刪頁面",
-    "undeletepagetext": "以下頁面已經被刪除,但依然在檔案中並可以被復原。\n檔案庫可能被定時清理。",
-    "undeleteextrahelp": "復原整個頁面時,請清除所有複選框後按 '''''復原''''' 。 復原特定版本時,請選擇相應版本前的複選框後按'''''復原''''' 。按 '''''重設''''' 將清除評論內容及所有複選框。",
-    "undeletehistory": "如果您復原了該頁面,所有版本都會被復原到修訂沿革中。\n如果本頁刪除後有一個同名的新頁面建立,被復原的版本將會稱為較新的歷史。",
-    "undeleterevdel": "如果把最新修訂部份刪除,反刪除便無法進行。如果遇到這種情況,您必須反選或反隱藏最新已刪除的修訂。對於您沒有權限去檢視的修訂是無法復原的。",
-    "undeletehistorynoadmin": "這個頁面已經被刪除,刪除原因顯示在下方編輯摘要中。被刪除前的所有修訂版本,連同刪除前貢獻使用者等等細節只有管理員可以看見。",
-    "undelete-revision": "刪除$1時由$3(在$2)所編寫的修訂版本:",
-    "undeleterevision-missing": "此版本的內容不正確或已經遺失。可能連結錯誤、被移除或已經被復原。",
-    "undeletebtn": "復原",
-    "undeletedrevisions": "$1個修訂版本已經復原",
-    "undeletedrevisions-files": "$1 個版本和 $2 個檔案被復原",
-    "undeletedfiles": "$1 個檔案被復原",
-    "cannotundelete": "復原失敗;可能之前已經被其他人復原。",
-    "undeletedpage": "'''$1已經被復原''' 請參考[[Special:Log/delete|刪除日誌]]來查詢刪除及復原記錄。",
-    "undelete-missing-filearchive": "由於檔案存檔 ID $1 不在資料庫中,不能在檔案存檔中復原。它可能已經反刪除了。",
-    "contributions": "使用者編修記錄",
-    "mycontris": "我的編修記錄",
-    "contribsub2": "$1的編修記錄 ($2)",
-    "uctop": "(最新修改)",
-    "sp-contributions-newbies": "只顯示新建立之使用者的編修記錄",
-    "sp-contributions-blocklog": "封鎖記錄",
-    "sp-contributions-userrights": "使用者權限管理",
-    "sp-contributions-username": "IP位址或使用者名稱:",
-    "blockip": "封鎖使用者",
-    "ipadressorusername": "IP地址或使用者名:",
-    "ipbreason-dropdown": "*一般的封鎖理由\n** 屢次增加不實資料\n** 刪除頁面內容\n** 外部連結廣告\n** 在頁面中增加無意義文字\n** 無禮的行為、攻擊/騷擾別人\n** 濫用多個帳號\n** 不能接受的使用者名",
-    "ipbcreateaccount": "阻止建立新帳號",
-    "ipbemailban": "阻止使用者傳送E-mail",
-    "ipbenableautoblock": "自動封鎖此使用者最後所用的IP位址,以及後來試圖編輯所用的所有位址",
-    "ipbsubmit": "封鎖該地址",
-    "ipbhidename": "在封鎖日誌、活躍封鎖列表以及使用者列表中隱藏使用者名/IP",
-    "blockipsuccesssub": "封鎖成功",
-    "blockipsuccesstext": "[[Special:Contributions/$1|$1]]已經被封鎖。\n<br />參看[[Special:BlockList|被封IP地址列表]]以覆審封鎖。",
-    "ipb-edit-dropdown": "編輯封鎖原因",
-    "ipb-unblock-addr": "解除封鎖$1",
-    "ipb-unblock": "解除禁封使用者名或IP地址",
-    "ipb-blocklist": "檢視現有的封鎖",
-    "unblockip": "解除禁封IP地址",
-    "unblockiptext": "用下面的表單來復原先前被禁封的IP地址的書寫權。",
-    "ipusubmit": "解除禁封",
-    "unblocked": "[[User:$1|$1]] 的封鎖已經解除。",
-    "unblocked-id": "封鎖 $1 已經被移除",
-    "ipblocklist-legend": "搜尋一位已經被封鎖的使用者",
-    "anononlyblock": "僅限匿名使用者",
-    "noautoblockblock": "禁用自動封鎖",
-    "createaccountblock": "禁止建立帳號",
-    "ipblocklist-empty": "封鎖列表為空。",
-    "ipblocklist-no-results": "所要求的IP地址/使用者名沒有被封鎖。",
-    "blocklink": "禁封",
-    "blocklogentry": "[[$1]]已被封鎖 $3 ,終止時間為$2",
-    "blocklogtext": "這是關於使用者封鎖和解除封鎖操作的記錄。被自動封鎖的IP地址沒有被列出。請參閱[[Special:BlockList|被封鎖的IP地址和使用者列表]]。",
-    "block-log-flags-anononly": "僅限匿名使用者",
-    "block-log-flags-nocreate": "禁止此IP/使用者建立新帳號",
-    "block-log-flags-noautoblock": "停用自動封鎖",
-    "range_block_disabled": "只有管理員才能建立禁止封鎖的範圍。",
-    "ipb_cant_unblock": "錯誤: 找不到封鎖ID$1。可能已經解除封鎖。",
-    "ipb_blocked_as_range": "錯誤: 該IP $1 無直接封鎖,不可以解除封鎖。但是它是在 $2 的封鎖範圍之內,該段範圍是可以解除封鎖的。",
-    "blockme": "封鎖我",
-    "sorbsreason": "您的IP位址被 DNSBL列為屬於開放代理服務器.",
-    "sorbs_create_account_reason": "由於您的IP位址被 DNSBL列為屬於開放代理服務器,所以您無法建立帳號。",
-    "lockdbtext": "鎖住資料庫將禁止所有使用者進行編輯頁面、更改參數、編輯監視列表以及其他需要更改資料庫的操作。\n請確認您的決定,並且保證您在維護工作結束後會重新開放資料庫。",
-    "unlockdbtext": "開放資料庫將會復原所有使用者進行編輯頁面、修改參數、編輯監視列表以及其他需要更改資料庫的操作。\n請確認您的決定。",
-    "movepagetext": "用下面的表單來重新命名一個頁面,並將其修訂沿革同時移動到新頁面。\n老的頁面將成為新頁面的重定向頁。\n連結到老頁面的連結並不會自動更改;\n請檢查雙重或損壞重定向連結。\n您應當負責確定所有連結依然會連到指定的頁面。\n\n注意如果新頁面已經有內容的話,頁面將'''不會'''被移動,\n除非新頁面無內容或是重定向頁,而且沒有修訂沿革。\n這意味著您再必要時可以在移動到新頁面後再移回老的頁面,\n同時您也無法覆蓋現有頁面。\n\n<b>警告!</b>\n對一個經常被訪問的頁面而言這可能是一個重大與唐突的更改;\n請在行動前先了結其所可能帶來的後果。",
-    "movenologintext": "您必須是一名登記使用者並且[[Special:UserLogin|登入]]\n後才可移動一個頁面。",
-    "movenotallowed": "您在這個wiki中度並沒有許可權去移動頁面。",
-    "movetalk": "如果可能的話,請同時移動對話頁。",
-    "movelogpagetext": "以下是已經移動的頁面清單:",
-    "revertmove": "復原該移動",
-    "exporttext": "您可以將特定頁面或一組頁面的文字以及編輯歷史以 XML 格式匯出;這樣可以將有關頁面透過「[[Special:Import|匯入頁面]]」頁面匯入到另一個執行 MediaWiki 的網站。\n\n要匯出頁面,請在下面的文字框中輸入頁面標題,每行一個標題,\n並選擇你是否需要匯出帶有修訂紀錄的以前的版本,\n或是只選擇匯出帶有最後一次編輯訊息的目前版本。\n\n此外你還可以利用連結匯出檔案,例如你可以使用 [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] 匯出「[[{{MediaWiki:Mainpage}}]]」頁面。",
-    "export-download": "提供一個檔案以供另存",
-    "allmessages": "系統介面",
-    "allmessagestext": "這裡列出所有可定製的系統介面。",
-    "allmessagesnotsupportedDB": "系統介面功能處於關閉狀態 (wgUseDatabaseMessages)。",
-    "thumbnail_error": "建立縮圖錯誤: $1",
-    "import-interwiki-history": "複製此頁的所有歷史版本",
-    "import-interwiki-namespace": "將頁面轉移到名字空間:",
-    "importtext": "請使用 Special:Export 功能從源 wiki 匯出檔案,儲存到您的磁片並上傳到這裡。",
-    "importfailed": "匯入失敗: $1",
-    "importsuccess": "匯入成功﹗",
-    "importhistoryconflict": "存在衝突的修訂沿革(可能在之前已經匯入過此頁面)",
-    "tooltip-pt-userpage": "用戶頁",
-    "tooltip-pt-anonuserpage": "您編輯本站所用IP的對應使用者頁",
-    "tooltip-pt-mytalk": "討論頁",
-    "tooltip-pt-preferences": "我的偏好設定",
-    "tooltip-pt-watchlist": "我的監視列表",
-    "tooltip-pt-mycontris": "編修記錄",
-    "tooltip-ca-addsection": "於本討論頁增加新的討論主題",
-    "tooltip-ca-history": "本頁面的早前版本。",
-    "tooltip-ca-undelete": "將這個頁面復原到被刪除以前的狀態",
-    "tooltip-p-logo": "首頁",
-    "tooltip-n-help": "尋求說明",
-    "tooltip-feed-rss": "訂閱本修訂記錄的RSS資訊",
-    "tooltip-feed-atom": "訂閱本修訂記錄的Atom訊息",
-    "tooltip-t-contributions": "檢視該使用者的編修記錄",
-    "tooltip-t-emailuser": "向該使用者發送電子郵件",
-    "tooltip-t-upload": "上傳圖片或多媒體檔",
-    "tooltip-t-permalink": "這個頁面版本的永久連結",
-    "tooltip-ca-nstab-user": "檢視使用者頁",
-    "tooltip-ca-nstab-image": "查詢圖片頁面",
-    "tooltip-ca-nstab-template": "檢視模板",
-    "tooltip-ca-nstab-help": "檢視說明頁面",
-    "tooltip-ca-nstab-category": "檢視分類頁面",
-    "tooltip-minoredit": "標記為細微修改",
-    "tooltip-compareselectedversions": "檢視本頁被點選的兩個版本間的差異",
-    "tooltip-rollback": "『{{int:rollbacklink}}』可以一按恢復上一位貢獻者對這個頁面的編輯",
-    "tooltip-undo": "『{{int:editundo}}』可以在編輯模式上開啟編輯表格以便復原。它容許在摘要中加入原因。",
-    "anonymous": "{{SITENAME}}的匿名{{PLURAL:$1|使用者|使用者}}",
-    "siteuser": "{{SITENAME}}使用者$1",
-    "anonuser": "{{SITENAME}}匿名使用者$1",
-    "siteusers": "{{SITENAME}}{{PLURAL:$2|使用者|使用者}}$1",
-    "anonusers": "{{SITENAME}}匿名{{PLURAL:$2|使用者|使用者}}$1",
-    "spamprotectiontext": "垃圾過濾器禁止保存您剛才提交的頁面,這可能是由於您所加入的外部網站連結所產生的問題。",
-    "spam_reverting": "復原到不包含連結至$1的最近版本",
-    "markedaspatrolledtext": "選定的版本已被標記為已檢查.",
-    "patrol-log-page": "巡查記錄",
-    "previousdiff": "←上一個",
-    "nextdiff": "下一個→",
-    "imagemaxsize": "在圖片描述頁對圖片大小限制為:",
-    "file-nohires": "無更高解析度可提供。",
-    "show-big-image": "完整解析度",
-    "newimages": "新建圖片畫廊",
-    "imagelisttext": "以下是按$2排列的$1個檔案列表。",
-    "showhidebots": "(機器人$1)",
-    "noimages": "無可檢視圖片。",
-    "bad_image_list": "請根據以下的格式去編寫:\n\n只有列示項目(以 * 開頭的項目)會被考慮。第一個連結一定要連接去壞圖片中。\n然後在同一行的連結會考慮作例外,即是幅圖片可以在哪一個頁面中同時顯示。",
-    "variantname-zh-tw": "台灣繁體",
-    "metadata-help": "此檔案中包含有擴展的訊息。這些訊息可能是由數位相機或掃描器在建立或數位化過程中所增加的。\n\n如果此檔案的源檔案已經被修改,一些訊息在修改後的檔案中將不能完全反映出來。",
-    "exif-bitspersample": "每像素位元數",
-    "exif-photometricinterpretation": "像素合成",
-    "exif-samplesperpixel": "像素數",
-    "exif-xresolution": "水準解析度",
-    "exif-yresolution": "垂直解析度",
-    "exif-stripoffsets": "圖片數據區",
-    "exif-imagedescription": "圖片標題",
-    "exif-compressedbitsperpixel": "圖片壓縮模式",
-    "exif-pixelydimension": "有效圖片寬度",
-    "exif-pixelxdimension": "有效圖片高度",
-    "exif-usercomment": "使用者註釋",
-    "exif-focalplanexresolution": "X軸焦平面解析度",
-    "exif-focalplaneyresolution": "Y軸焦平面解析度",
-    "exif-focalplaneresolutionunit": "焦平面解析度單位",
-    "exif-customrendered": "自定義圖片處理",
-    "exif-imageuniqueid": "唯一圖片ID",
-    "exif-gpsimgdirectionref": "圖片方位參照",
-    "exif-gpsimgdirection": "圖片方位",
-    "exif-lightsource-2": "螢光燈",
-    "exif-lightsource-12": "日光螢光燈(色溫 D 5700    7100K)",
-    "exif-lightsource-13": "日溫白色螢光燈(N 4600    5400K)",
-    "exif-lightsource-14": "冷白色螢光燈(W 3900    4500K)",
-    "exif-lightsource-15": "白色螢光 (WW 3200    3700K)",
-    "edit-externally-help": "請參見[//www.mediawiki.org/wiki/Manual:External_editors 設定步驟]了解詳細資訊。",
-    "confirmemail": "確認電子郵件地址",
-    "confirmemail_noemail": "您沒有在您的[[Special:Preferences|使用者設定]]裡面輸入一個有效的 email 位址。",
-    "confirmemail_text": "此網站要求您在使用郵件功能之前驗證您的電子郵件地址。\n點擊以下按鈕可向您的郵箱發送一封確認郵件。該郵件包含有一行代碼連結;\n請在您的瀏覽器中加載此連結以確認您的電子郵件地址是有效的。",
-    "confirmemail_sendfailed": "不能發送確認郵件,請檢查電子郵件地址是否包含非法字元。\n\n郵件傳送員回應: $1",
-    "confirmemail_needlogin": "您需要$1以確認您的電子郵件地址。",
-    "confirmemail_success": "您的郵箱已經被確認。您現下可以登錄並使用此網站了。",
-    "confirmemail_loggedin": "您的電子郵件地址現下已被確認。",
-    "confirmemail_subject": "{{SITENAME}}電子郵件地址確認",
-    "scarytranscludefailed": "[抱歉,模板$1讀取失敗]",
-    "scarytranscludetoolong": "[抱歉,URL 地址太長]",
-    "confirmrecreate": "在您編輯這個頁面後,使用者[[User:$1|$1]]([[User talk:$1|對話]])以下列原因刪除了這個頁面: $2。請在重新建立頁面前三思。",
-    "autosumm-blank": "移除所有頁面內容",
-    "autosumm-replace": "正在將頁面替換為 '$1'",
-    "autoredircomment": "正在重定向到 [[$1]]",
-    "autosumm-new": "新頁面: $1",
-    "livepreview-failed": "即時預覽失敗! 嘗試標準預覽。",
-    "version-parserhooks": "語法鉤",
-    "version-hooks": "鉤",
-    "version-parser-function-hooks": "語法函數鉤",
-    "version-hook-name": "鉤名",
-    "specialpages": "特殊頁面"
+    "welcomecreation": "== 歡迎,$1! ==\n您的帳號已經建立。\n請勿忘記設定 [[Special:Preferences|{{SITENAME}} 的個人偏好]]。"
 }
index 11a0590..0ed584c 100644 (file)
@@ -699,7 +699,6 @@ class TextPassDumper extends BackupDumper {
                $this->progress( "Spawning database subprocess: $cmd" );
                $this->spawnProc = proc_open( $cmd, $spec, $pipes );
                if ( !$this->spawnProc ) {
-                       // shit
                        $this->progress( "Subprocess spawn failed." );
 
                        return false;
index 6234db4..e0a0f49 100644 (file)
@@ -53,7 +53,7 @@ class CapsCleanup extends TableCleanup {
                        $this->error( "\$wgCapitalLinks is on -- no need for caps links cleanup.", true );
                }
 
-               $this->user = User::newFromName( 'Conversion script' );
+               $this->user = User::newSystemUser( 'Conversion script', array( 'steal' => true ) );
 
                $this->namespace = intval( $this->getOption( 'namespace', 0 ) );
                $this->dryrun = $this->hasOption( 'dry-run' );
index f4a5147..44d5810 100644 (file)
@@ -45,7 +45,7 @@ class CleanupSpam extends Maintenance {
                global $IP, $wgLocalDatabases, $wgUser;
 
                $username = wfMessage( 'spambot_username' )->text();
-               $wgUser = User::newFromName( $username );
+               $wgUser = User::newSystemUser( $username );
                if ( !$wgUser ) {
                        $this->error( "Invalid username specified in 'spambot_username' message: $username", true );
                }
index f6259e9..84e3aee 100644 (file)
@@ -49,11 +49,12 @@ class TableCleanup extends Maintenance {
 
        public function execute() {
                global $wgUser;
-               $wgUser = User::newFromName( 'Conversion script' );
                $this->dryrun = $this->hasOption( 'dry-run' );
                if ( $this->dryrun ) {
+                       $wgUser = User::newFromName( 'Conversion script' );
                        $this->output( "Checking for bad titles...\n" );
                } else {
+                       $wgUser = User::newSystemUser( 'Conversion script', array( 'steal' => true ) );
                        $this->output( "Checking and fixing bad titles...\n" );
                }
                $this->runTable( $this->defaultParams );
index e6321e1..a3b1561 100644 (file)
@@ -55,11 +55,15 @@ class DeleteBatch extends Maintenance {
                chdir( $oldCwd );
 
                # Options processing
-               $username = $this->getOption( 'u', 'Delete page script' );
+               $username = $this->getOption( 'u', false );
                $reason = $this->getOption( 'r', '' );
                $interval = $this->getOption( 'i', 0 );
 
-               $user = User::newFromName( $username );
+               if ( $username === false ) {
+                       $user = User::newSystemUser( 'Delete page script', array( 'steal' => true ) );
+               } else {
+                       $user = User::newFromName( $username );
+               }
                if ( !$user ) {
                        $this->error( "Invalid username", true );
                }
index 478e0d7..de5c5e2 100644 (file)
@@ -162,7 +162,7 @@ class DeleteEqualMessages extends Maintenance {
                        return;
                }
 
-               $user = User::newFromName( 'MediaWiki default' );
+               $user = User::newSystemUser( 'MediaWiki default', array( 'steal' => true ) );
                if ( !$user ) {
                        $this->error( "Invalid username", true );
                }
index 75ec12b..b67a957 100644 (file)
@@ -46,14 +46,18 @@ class EditCLI extends Maintenance {
        public function execute() {
                global $wgUser;
 
-               $userName = $this->getOption( 'user', 'Maintenance script' );
+               $userName = $this->getOption( 'user', false );
                $summary = $this->getOption( 'summary', '' );
                $minor = $this->hasOption( 'minor' );
                $bot = $this->hasOption( 'bot' );
                $autoSummary = $this->hasOption( 'autosummary' );
                $noRC = $this->hasOption( 'no-rc' );
 
-               $wgUser = User::newFromName( $userName );
+               if ( $userName === false ) {
+                       $wgUser = User::newSystemUser( 'Maintenance script', array( 'steal' => true ) );
+               } else {
+                       $wgUser = User::newFromName( $userName );
+               }
                if ( !$wgUser ) {
                        $this->error( "Invalid username", true );
                }
index ad385e5..a040248 100644 (file)
@@ -70,9 +70,9 @@ $files = findFiles( $dir, $extensions, isset( $options['search-recursively'] ) )
 # Initialise the user for this operation
 $user = isset( $options['user'] )
        ? User::newFromName( $options['user'] )
-       : User::newFromName( 'Maintenance script' );
+       : User::newSystemUser( 'Maintenance script', array( 'steal' => true ) );
 if ( !$user instanceof User ) {
-       $user = User::newFromName( 'Maintenance script' );
+       $user = User::newSystemUser( 'Maintenance script', array( 'steal' => true ) );
 }
 $wgUser = $user;
 
index 6566a60..5dfd2a8 100644 (file)
@@ -41,7 +41,12 @@ class ImportSiteScripts extends Maintenance {
        public function execute() {
                global $wgUser;
 
-               $user = User::newFromName( $this->getOption( 'username', 'ScriptImporter' ) );
+               $username = $this->getOption( 'username', false );
+               if ( $username === false ) {
+                       $user = User::newSystemUser( 'ScriptImporter', array( 'steal' => true ) );
+               } else {
+                       $user = User::newFromName( $username );
+               }
                $wgUser = $user;
 
                $baseUrl = $this->getArg( 1 );
index a27a772..5849908 100644 (file)
@@ -61,7 +61,7 @@ class MoveBatch extends Maintenance {
                chdir( $oldCwd );
 
                # Options processing
-               $user = $this->getOption( 'u', 'Move page script' );
+               $user = $this->getOption( 'u', false );
                $reason = $this->getOption( 'r', '' );
                $interval = $this->getOption( 'i', 0 );
                $noredirects = $this->getOption( 'noredirects', false );
@@ -75,7 +75,11 @@ class MoveBatch extends Maintenance {
                if ( !$file ) {
                        $this->error( "Unable to read file, exiting", true );
                }
-               $wgUser = User::newFromName( $user );
+               if ( $user === false ) {
+                       $wgUser = User::newSystemUser( 'Move page script', array( 'steal' => true ) );
+               } else {
+                       $wgUser = User::newFromName( $user );
+               }
                if ( !$wgUser ) {
                        $this->error( "Invalid username", true );
                }
index 088f677..184cba8 100644 (file)
@@ -179,22 +179,22 @@ class NamespaceConflictChecker extends Maintenance {
 
                foreach ( $spaces as $name => $ns ) {
                        if ( $ns != 0 ) {
-                               // Fix up link destinations for non-interwiki links only.
-                               //
-                               // For example if a page has [[Foo:Bar]] and then a Foo namespace
-                               // is introduced, pagelinks needs to be updated to have
-                               // page_namespace = NS_FOO.
-                               //
-                               // If instead an interwiki prefix was introduced called "Foo",
-                               // the link should instead be moved to the iwlinks table. If a new
-                               // language is introduced called "Foo", or if there is a pagelink
-                               // [[fr:Bar]] when interlanguage magic links are turned on, the
-                               // link would have to be moved to the langlinks table. Let's put
-                               // those cases in the too-hard basket for now. The consequences are
-                               // not especially severe.
-                               //
-                               // @fixme Handle interwiki links, and pagelinks to Category:, File:
-                               // which probably need reparsing.
+                               /* Fix up link destinations for non-interwiki links only.
+                                *
+                                * For example if a page has [[Foo:Bar]] and then a Foo namespace
+                                * is introduced, pagelinks needs to be updated to have
+                                * page_namespace = NS_FOO.
+                                *
+                                * If instead an interwiki prefix was introduced called "Foo",
+                                * the link should instead be moved to the iwlinks table. If a new
+                                * language is introduced called "Foo", or if there is a pagelink
+                                * [[fr:Bar]] when interlanguage magic links are turned on, the
+                                * link would have to be moved to the langlinks table. Let's put
+                                * those cases in the too-hard basket for now. The consequences are
+                                * not especially severe.
+                                * @fixme Handle interwiki links, and pagelinks to Category:, File:
+                                * which probably need reparsing.
+                                */
 
                                $this->checkLinkTable( 'pagelinks', 'pl', $ns, $name, $options );
                                $this->checkLinkTable( 'templatelinks', 'tl', $ns, $name, $options );
@@ -592,14 +592,15 @@ class NamespaceConflictChecker extends Maintenance {
 
                $this->db->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
 
-               // Call LinksDeletionUpdate to delete outgoing links from the old title,
-               // and update category counts.
-               //
-               // Calling external code with a fake broken Title is a fairly dubious
-               // idea. It's necessary because it's quite a lot of code to duplicate,
-               // but that also makes it fragile since it would be easy for someone to
-               // accidentally introduce an assumption of title validity to the code we
-               // are calling.
+               /* Call LinksDeletionUpdate to delete outgoing links from the old title,
+                * and update category counts.
+                *
+                * Calling external code with a fake broken Title is a fairly dubious
+                * idea. It's necessary because it's quite a lot of code to duplicate,
+                * but that also makes it fragile since it would be easy for someone to
+                * accidentally introduce an assumption of title validity to the code we
+                * are calling.
+                */
                $update = new LinksDeletionUpdate( $wikiPage );
                $update->doUpdate();
                $this->db->commit( __METHOD__ );
index ec03f93..449a7ad 100644 (file)
@@ -41,7 +41,7 @@ class Protect extends Maintenance {
        }
 
        public function execute() {
-               $userName = $this->getOption( 'u', 'Maintenance script' );
+               $userName = $this->getOption( 'u', false );
                $reason = $this->getOption( 'r', '' );
 
                $cascade = $this->hasOption( 'cascade' );
@@ -53,7 +53,11 @@ class Protect extends Maintenance {
                        $protection = "";
                }
 
-               $user = User::newFromName( $userName );
+               if ( $userName === false ) {
+                       $user = User::newSystemUser( 'Maintenance script', array( 'steal' => true ) );
+               } else {
+                       $user = User::newFromName( $userName );
+               }
                if ( !$user ) {
                        $this->error( "Invalid username", true );
                }
index 967dda8..7be5a1f 100644 (file)
@@ -76,7 +76,7 @@ class RollbackEdits extends Maintenance {
                        return;
                }
 
-               $doer = User::newFromName( 'Maintenance script' );
+               $doer = User::newSystemUser( 'Maintenance script', array( 'steal' => true ) );
 
                foreach ( $titles as $t ) {
                        $page = WikiPage::factory( $t );
index 120ccb6..f7907ad 100644 (file)
@@ -757,13 +757,14 @@ class CgzCopyTransaction {
                        return;
                }
 
-               // Check to see if the target text_ids have been moved already.
-               //
-               // We originally read from the slave, so this can happen when a single
-               // text_id is shared between multiple pages. It's rare, but possible
-               // if a delete/move/undelete cycle splits up a null edit.
-               //
-               // We do a locking read to prevent closer-run race conditions.
+               /* Check to see if the target text_ids have been moved already.
+                *
+                * We originally read from the slave, so this can happen when a single
+                * text_id is shared between multiple pages. It's rare, but possible
+                * if a delete/move/undelete cycle splits up a null edit.
+                *
+                * We do a locking read to prevent closer-run race conditions.
+                */
                $dbw = wfGetDB( DB_MASTER );
                $dbw->begin( __METHOD__ );
                $res = $dbw->select( 'blob_tracking',
index 4b58b60..638b99d 100644 (file)
@@ -130,8 +130,7 @@ CREATE TABLE /*_*/user (
   --
   user_editcount int,
 
-  -- Expiration date for user password. Use $user->expirePassword()
-  -- to force a password reset.
+  -- Expiration date for user password.
   user_password_expires varbinary(14) DEFAULT NULL
 
 ) /*$wgDBTableOptions*/;
index adebd27..71b4de1 100644 (file)
@@ -35,7 +35,7 @@ class Undelete extends Maintenance {
        public function execute() {
                global $wgUser;
 
-               $user = $this->getOption( 'user', 'Command line script' );
+               $user = $this->getOption( 'user', false );
                $reason = $this->getOption( 'reason', '' );
                $pageName = $this->getArg();
 
@@ -43,7 +43,11 @@ class Undelete extends Maintenance {
                if ( !$title ) {
                        $this->error( "Invalid title", true );
                }
-               $wgUser = User::newFromName( $user );
+               if ( $user === false ) {
+                       $wgUser = User::newSystemUser( 'Command line script', array( 'steal' => true ) );
+               } else {
+                       $wgUser = User::newFromName( $user );
+               }
                if ( !$wgUser ) {
                        $this->error( "Invalid username", true );
                }
index 0b56972..0d6a76c 100644 (file)
@@ -44,16 +44,17 @@ print Xml::openElement( 'OpenSearchDescription',
                'xmlns' => 'http://a9.com/-/spec/opensearch/1.1/',
                'xmlns:moz' => 'http://www.mozilla.org/2006/browser/search/' ) );
 
-// The spec says the ShortName must be no longer than 16 characters,
-// but 16 is *realllly* short. In practice, browsers don't appear to care
-// when we give them a longer string, so we're no longer attempting to trim.
-//
-// Note: ShortName and the <link title=""> need to match; they are used as
-// a key for identifying if the search engine has been added already, *and*
-// as the display name presented to the end-user.
-//
-// Behavior seems about the same between Firefox and IE 7/8 here.
-// 'Description' doesn't appear to be used by either.
+/* The spec says the ShortName must be no longer than 16 characters,
+ * but 16 is *realllly* short. In practice, browsers don't appear to care
+ * when we give them a longer string, so we're no longer attempting to trim.
+ *
+ * Note: ShortName and the <link title=""> need to match; they are used as
+ * a key for identifying if the search engine has been added already, *and*
+ * as the display name presented to the end-user.
+ *
+ * Behavior seems about the same between Firefox and IE 7/8 here.
+ * 'Description' doesn't appear to be used by either.
+ */
 $fullName = wfMessage( 'opensearch-desc' )->inContentLanguage()->text();
 print Xml::element( 'ShortName', null, $fullName );
 print Xml::element( 'Description', null, $fullName );
index d48a5e0..3ae7b78 100644 (file)
@@ -8,7 +8,7 @@
   "devDependencies": {
     "grunt": "0.4.5",
     "grunt-cli": "0.1.13",
-    "grunt-banana-checker": "0.3.0",
+    "grunt-banana-checker": "0.4.0",
     "grunt-contrib-copy": "0.8.1",
     "grunt-contrib-jshint": "0.11.3",
     "grunt-contrib-watch": "0.6.1",
index 16d92be..ccc7b42 100644 (file)
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -2,7 +2,6 @@
 <ruleset name="MediaWiki">
        <rule ref="vendor/mediawiki/mediawiki-codesniffer/MediaWiki">
                <!-- Disable failing rules -->
-               <exclude name="Squiz.Classes.ValidClassName.NotCamelCaps"/>
                <exclude name="MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.EmptyComment"/>
        </rule>
        <rule ref="MediaWiki.NamingConventions.PrefixedGlobalFunctions">
index c635f0e..fee1e7c 100644 (file)
@@ -1135,54 +1135,6 @@ return array(
                        'dom-level2-shim',
                        'mediawiki.api.upload',
                ),
-               'messages' => array(
-                       'api-error-badaccess-groups',
-                       'api-error-badtoken',
-                       'api-error-copyuploaddisabled',
-                       'api-error-duplicate',
-                       'api-error-duplicate-archive',
-                       'api-error-empty-file',
-                       'api-error-emptypage',
-                       'api-error-fetchfileerror',
-                       'api-error-fileexists-forbidden',
-                       'api-error-fileexists-shared-forbidden',
-                       'api-error-file-too-large',
-                       'api-error-filename-tooshort',
-                       'api-error-filetype-banned',
-                       'api-error-filetype-banned-type',
-                       'api-error-filetype-missing',
-                       'api-error-hookaborted',
-                       'api-error-http',
-                       'api-error-illegal-filename',
-                       'api-error-internal-error',
-                       'api-error-invalid-file-key',
-                       'api-error-missingparam',
-                       'api-error-missingresult',
-                       'api-error-mustbeloggedin',
-                       'api-error-mustbeposted',
-                       'api-error-noimageinfo',
-                       'api-error-nomodule',
-                       'api-error-ok-but-empty',
-                       'api-error-overwrite',
-                       'api-error-stashfailed',
-                       'api-error-publishfailed',
-                       'api-error-stasherror',
-                       'api-error-stashedfilenotfound',
-                       'api-error-stashpathinvalid',
-                       'api-error-stashfilestorage',
-                       'api-error-stashzerolength',
-                       'api-error-stashnotloggedin',
-                       'api-error-stashwrongowner',
-                       'api-error-stashnosuchfilekey',
-                       'api-error-timeout',
-                       'api-error-unclassified',
-                       'api-error-unknown-code',
-                       'api-error-unknown-error',
-                       'api-error-unknown-warning',
-                       'api-error-unknownerror',
-                       'api-error-uploaddisabled',
-                       'api-error-verification-error',
-               ),
        ),
        'mediawiki.ForeignUpload' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.ForeignUpload.js',
@@ -1223,20 +1175,65 @@ return array(
                        'mediawiki.jqueryMsg',
                ),
                'messages' => array(
-                       'upload-process-error',
-                       'upload-process-warning',
                        'upload-form-label-select-file',
                        'upload-form-label-infoform-title',
                        'upload-form-label-infoform-name',
                        'upload-form-label-infoform-description',
                        'upload-form-label-usage-title',
                        'upload-form-label-usage-filename',
+                       'api-error-unknownerror',
+                       'api-error-unknown-warning',
+                       'api-error-badaccess-groups',
+                       'api-error-badtoken',
+                       'api-error-copyuploaddisabled',
+                       'api-error-duplicate',
+                       'api-error-duplicate-archive',
+                       'api-error-empty-file',
+                       'api-error-emptypage',
+                       'api-error-fetchfileerror',
+                       'api-error-fileexists-forbidden',
+                       'api-error-fileexists-shared-forbidden',
+                       'api-error-file-too-large',
+                       'api-error-filename-tooshort',
+                       'api-error-filetype-banned',
+                       'api-error-filetype-banned-type',
+                       'api-error-filetype-missing',
+                       'api-error-hookaborted',
+                       'api-error-http',
+                       'api-error-illegal-filename',
+                       'api-error-internal-error',
+                       'api-error-invalid-file-key',
+                       'api-error-missingparam',
+                       'api-error-missingresult',
+                       'api-error-mustbeloggedin',
+                       'api-error-mustbeposted',
+                       'api-error-noimageinfo',
+                       'api-error-nomodule',
+                       'api-error-ok-but-empty',
+                       'api-error-overwrite',
+                       'api-error-stashfailed',
+                       'api-error-publishfailed',
+                       'api-error-stasherror',
+                       'api-error-stashedfilenotfound',
+                       'api-error-stashpathinvalid',
+                       'api-error-stashfilestorage',
+                       'api-error-stashzerolength',
+                       'api-error-stashnotloggedin',
+                       'api-error-stashwrongowner',
+                       'api-error-stashnosuchfilekey',
+                       'api-error-timeout',
+                       'api-error-unclassified',
+                       'api-error-unknown-code',
+                       'api-error-unknown-error',
+                       'api-error-uploaddisabled',
+                       'api-error-verification-error',
                        'fileexists',
                        'filepageexists',
                        'filename-bad-prefix',
                        'filename-thumb-name',
                        'badfilename',
                        'api-error-duplicate-archive',
+                       'api-error-blacklisted', // HACK
                ),
        ),
        'mediawiki.ForeignStructuredUpload.BookletLayout' => array(
@@ -1851,8 +1848,6 @@ return array(
        'mediawiki.legacy.commonPrint' => array(
                'position' => 'top',
                'styles' => array(
-                       // @todo: Remove mediawiki.page.gallery when cache has cleared
-                       'resources/src/mediawiki/page/gallery-print.css' => array( 'media' => 'print' ),
                        'resources/src/mediawiki.legacy/commonPrint.css' => array( 'media' => 'print' )
                ),
        ),
@@ -1865,8 +1860,6 @@ return array(
        'mediawiki.legacy.shared' => array(
                'position' => 'top',
                'styles' => array(
-                       // @todo: Remove when mediawiki.page.gallery in cached html.
-                       'resources/src/mediawiki/page/gallery.css',
                        'resources/src/mediawiki.legacy/shared.css' => array( 'media' => 'screen' )
                ),
        ),
index 4efb02a..d3fad8d 100644 (file)
@@ -22,6 +22,8 @@
        "ooui-dialog-process-dismiss": "Lukk",
        "ooui-dialog-process-retry": "Prøv igjen",
        "ooui-dialog-process-continue": "Fortsett",
+       "ooui-selectfile-button-select": "Velg en fil",
        "ooui-selectfile-not-supported": "Filvalg er ikke støttet",
-       "ooui-selectfile-placeholder": "Ingen fil er valgt"
+       "ooui-selectfile-placeholder": "Ingen fil er valgt",
+       "ooui-selectfile-dragdrop-placeholder": "Slipp fil her"
 }
index 0661b3f..a69d76f 100644 (file)
@@ -10,6 +10,7 @@
        },
        "ooui-outline-control-move-down": "ਨੀਚੇ ਲੈਕੇ ਜਾਓ",
        "ooui-outline-control-move-up": "ਉੱਤੇ ਲੈਕੇ ਜਾਓ",
+       "ooui-outline-control-remove": "ਆਈਟਮ ਹਟਾਓ",
        "ooui-toolbar-more": "ਹੋਰ",
        "ooui-toolgroup-expand": "ਹੋਰ",
        "ooui-toolgroup-collapse": "ਥੋੜ੍ਹੇ",
@@ -18,5 +19,9 @@
        "ooui-dialog-process-error": "ਕੁਝ ਗਲਤ ਹੋ ਗਿਆ",
        "ooui-dialog-process-dismiss": "ਰੱਦ ਕਰੋ",
        "ooui-dialog-process-retry": "ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ",
-       "ooui-dialog-process-continue": "ਜਾਰੀ ਰੱਖੋ"
+       "ooui-dialog-process-continue": "ਜਾਰੀ ਰੱਖੋ",
+       "ooui-selectfile-button-select": "ਫ਼ਾਈਲ ਚੁਣੋ",
+       "ooui-selectfile-not-supported": "ਚੁਣੀ ਗਈ ਫ਼ਾਈਲ ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ",
+       "ooui-selectfile-placeholder": "ਕੋਈ ਫ਼ਾਈਲ ਚੁਣੀ ਨਹੀਂ ਗਈ",
+       "ooui-selectfile-dragdrop-placeholder": "ਫ਼ਾਈਲ ਇੱਥੇ ਸਿੱਟੋ"
 }
index 6fb7be6..5012934 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.11
+ * OOjs UI v0.12.12
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-07T20:48:23Z
+ * Date: 2015-10-13T20:38:26Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
        width: 100%;
 }
 .oo-ui-capsuleMultiSelectWidget-handle {
-       background: #ffffff;
+       background-color: #ffffff;
        cursor: text;
        min-height: 2.4em;
        margin-right: 0.5em;
index d0c8e51..dab3c78 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.11
+ * OOjs UI v0.12.12
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-07T20:48:15Z
+ * Date: 2015-10-13T20:38:18Z
  */
 /**
  * @class
index 4b65ad4..a19ebea 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.11
+ * OOjs UI v0.12.12
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-07T20:48:23Z
+ * Date: 2015-10-13T20:38:26Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
        min-width: 1em;
        border-radius: 2px;
        position: relative;
-       -webkit-transition: background 100ms ease, color 100ms ease, box-shadow 100ms ease;
-          -moz-transition: background 100ms ease, color 100ms ease, box-shadow 100ms ease;
-           -ms-transition: background 100ms ease, color 100ms ease, box-shadow 100ms ease;
-            -o-transition: background 100ms ease, color 100ms ease, box-shadow 100ms ease;
-               transition: background 100ms ease, color 100ms ease, box-shadow 100ms ease;
+       -webkit-transition: background 100ms ease, color 100ms ease, border-color 100ms ease, box-shadow 100ms ease;
+          -moz-transition: background 100ms ease, color 100ms ease, border-color 100ms ease, box-shadow 100ms ease;
+           -ms-transition: background 100ms ease, color 100ms ease, border-color 100ms ease, box-shadow 100ms ease;
+            -o-transition: background 100ms ease, color 100ms ease, border-color 100ms ease, box-shadow 100ms ease;
+               transition: background 100ms ease, color 100ms ease, border-color 100ms ease, box-shadow 100ms ease;
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
        opacity: 0;
        z-index: 1;
        position: relative;
+       cursor: pointer;
        margin: 0;
        width: 1.6em;
        height: 1.6em;
        max-width: none;
 }
 .oo-ui-checkboxInputWidget input[type="checkbox"] + span {
-       cursor: pointer;
        -webkit-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
           -moz-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
            -ms-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
        opacity: 0;
        z-index: 1;
        position: relative;
+       cursor: pointer;
        margin: 0;
        width: 1.6em;
        height: 1.6em;
        max-width: none;
 }
 .oo-ui-radioInputWidget input[type="radio"] + span {
-       cursor: pointer;
        -webkit-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
           -moz-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
            -ms-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
        margin-right: 0;
 }
 .oo-ui-dropdownWidget-handle {
-       padding: 0.3em 0;
+       padding: 0.5em 0;
        height: 2.275em;
        border: 1px solid #cccccc;
        border-radius: 0.1em;
        width: 100%;
 }
 .oo-ui-capsuleMultiSelectWidget-handle {
-       background: #ffffff;
+       background-color: #ffffff;
        cursor: text;
        min-height: 2.4em;
        margin-right: 0.5em;
index 60acdd2..e6344f2 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.11
+ * OOjs UI v0.12.12
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-07T20:48:15Z
+ * Date: 2015-10-13T20:38:18Z
  */
 /**
  * @class
@@ -30,7 +30,7 @@ OO.inheritClass( OO.ui.MediaWikiTheme, OO.ui.Theme );
  */
 OO.ui.MediaWikiTheme.prototype.getElementClasses = function ( element ) {
        // Parent method
-       var variant,
+       var variant, isFramed, isActive,
                variants = {
                        warning: false,
                        invert: false,
@@ -39,13 +39,13 @@ OO.ui.MediaWikiTheme.prototype.getElementClasses = function ( element ) {
                        destructive: false
                },
                // Parent method
-               classes = OO.ui.MediaWikiTheme.parent.prototype.getElementClasses.call( this, element ),
-               isFramed;
+               classes = OO.ui.MediaWikiTheme.parent.prototype.getElementClasses.call( this, element );
 
        if ( element.supports( [ 'hasFlag' ] ) ) {
                isFramed = element.supports( [ 'isFramed' ] ) && element.isFramed();
+               isActive = element.supports( [ 'isActive' ] ) && element.isActive();
                if (
-                       ( isFramed && ( element.isDisabled() || element.hasFlag( 'primary' ) ) ) ||
+                       ( isFramed && ( isActive || element.isDisabled() || element.hasFlag( 'primary' ) ) ) ||
                        ( !isFramed && element.hasFlag( 'primary' ) )
                ) {
                        variants.invert = true;
index e433e91..aeff69e 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.11
+ * OOjs UI v0.12.12
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-07T20:48:15Z
+ * Date: 2015-10-13T20:38:18Z
  */
 ( function ( OO ) {
 
@@ -1105,7 +1105,8 @@ OO.ui.ActionSet.prototype.organize = function () {
  * @cfg {Array} [content] An array of content elements to append (after #text).
  *  Strings will be html-escaped; use an OO.ui.HtmlSnippet to append raw HTML.
  *  Instances of OO.ui.Element will have their $element appended.
- * @cfg {jQuery} [$content] Content elements to append (after #text)
+ * @cfg {jQuery} [$content] Content elements to append (after #text).
+ * @cfg {jQuery} [$element] Wrapper element. Defaults to a new element with #getTagName.
  * @cfg {Mixed} [data] Custom data of any type or combination of types (e.g., string, number, array, object).
  *  Data can also be specified with the #setData method.
  */
@@ -4233,7 +4234,7 @@ OO.initClass( OO.ui.Theme );
  * @param {OO.ui.Element} element Element for which to get classes
  * @return {Object.<string,string[]>} Categorized class names with `on` and `off` lists
  */
-OO.ui.Theme.prototype.getElementClasses = function ( /* element */ ) {
+OO.ui.Theme.prototype.getElementClasses = function () {
        return { on: [], off: [] };
 };
 
@@ -4625,20 +4626,30 @@ OO.ui.mixin.ButtonElement.prototype.toggleFramed = function ( framed ) {
 };
 
 /**
- * Set the button to its 'active' state.
+ * Set the button's active state.
  *
  * The active state occurs when a {@link OO.ui.ButtonOptionWidget ButtonOptionWidget} or
  * a {@link OO.ui.ToggleButtonWidget ToggleButtonWidget} is pressed. This method does nothing
  * for other button types.
  *
- * @param {boolean} [value] Make button active
+ * @param {boolean} value Make button active
  * @chainable
  */
 OO.ui.mixin.ButtonElement.prototype.setActive = function ( value ) {
-       this.$element.toggleClass( 'oo-ui-buttonElement-active', !!value );
+       this.active = !!value;
+       this.$element.toggleClass( 'oo-ui-buttonElement-active', this.active );
        return this;
 };
 
+/**
+ * Check if the button is active
+ *
+ * @return {boolean} The button is active
+ */
+OO.ui.mixin.ButtonElement.prototype.isActive = function () {
+       return this.active;
+};
+
 /**
  * Any OOjs UI widget that contains other widgets (such as {@link OO.ui.ButtonWidget buttons} or
  * {@link OO.ui.OptionWidget options}) mixes in GroupElement. Adding, removing, and clearing
@@ -13455,6 +13466,9 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onInputFocus = function () {
  * @param {jQuery.Event} event
  */
 OO.ui.CapsuleMultiSelectWidget.prototype.onInputBlur = function () {
+       if ( this.allowArbitrary && this.$input.val().trim() !== '' ) {
+               this.addItemsFromData( [ this.$input.val() ] );
+       }
        this.clearInput();
 };
 
@@ -14098,6 +14112,18 @@ OO.ui.SelectFileWidget.prototype.setValue = function ( file ) {
        }
 };
 
+/**
+ * Focus the widget.
+ *
+ * Focusses the select file button.
+ *
+ * @chainable
+ */
+OO.ui.SelectFileWidget.prototype.focus = function () {
+       this.selectButton.$button[ 0 ].focus();
+       return this;
+};
+
 /**
  * Update the user interface when a file is selected or unselected
  *
index 41c555b..af5a97d 100644 (file)
@@ -67,7 +67,7 @@
 
                        opts = $.extend( {}, defaults, opts );
 
-                       var $spinner = $( '<div>', { 'class': 'mw-spinner', title: '...' } );
+                       var $spinner = $( '<div>' ).addClass( 'mw-spinner' ).attr( 'title', '...' );
                        if ( opts.id !== undefined ) {
                                $spinner.attr( 'id', 'mw-spinner-' + opts.id );
                        }
index 0eefae6..f8216c9 100644 (file)
 
        function detectParserForColumn( table, rows, column ) {
                var l = parsers.length,
+                       config = $( table ).data( 'tablesorter' ).config,
                        cellIndex,
                        nodeValue,
                        // Start with 1 because 0 is the fallback parser
                        needed = ( rows.length > 4 ) ? 5 : rows.length;
 
                while ( i < l ) {
-                       if ( rows[ rowIndex ] ) {
+                       // if this is a child row, continue to the next row (as buildCache())
+                       if ( rows[ rowIndex ] && !$( rows[ rowIndex ] ).hasClass( config.cssChildRow ) ) {
                                if ( rowIndex !== lastRowIndex ) {
                                        lastRowIndex = rowIndex;
                                        cellIndex = $( rows[ rowIndex ] ).data( 'columnToCell' )[ column ];
                                new RegExp( /(https?|ftp|file):\/\// )
                        ],
                        isoDate: [
-                               new RegExp( /^([-+]?\d{1,4})-([01]\d)-([0-3]\d)([T\s]((([01]\d|2[0-3])(:?[0-5]\d)?|24:?00)?(:?([0-5]\d))?([.,]\d+)?)([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?/ ),
+                               new RegExp( /^([-+]?\d{1,4})-([01]\d)-([0-3]\d)([T\s]((([01]\d|2[0-3])(:?[0-5]\d)?|24:?00)?(:?([0-5]\d|60))?([.,]\d+)?)([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?/ ),
                                new RegExp( /^([-+]?\d{1,4})-([01]\d)-([0-3]\d)/ )
                        ],
                        usLongDate: [
                                        return $.tablesorter.formatFloat( 0 );
                                }
                        } else {
-                               isodate = new Date( $.trim( s ) );
+                               matches = s.match( ts.rgx.isoDate[ 0 ] );
+                               if ( matches ) {
+                                       isodate = new Date( $.trim( matches[ 0 ] ) );
+                               } else {
+                                       return $.tablesorter.formatFloat( 0 );
+                               }
                        }
                        return $.tablesorter.formatFloat( ( isodate !== undefined ) ? isodate.getTime() : 0 );
                },
index 25b5acc..b1a63b0 100644 (file)
                $row = $( '<tr class="mw-metadata-show-hide-extended"></tr>' );
                $col = $( '<td colspan="2"></td>' );
 
-               $link = $( '<a>', {
-                       text: showText,
-                       href: '#'
-               } ).click( function () {
+               $link = $( '<a>' )
+               .text( showText )
+               .attr( 'href', '#' )
+               .click( function () {
                        if ( $table.hasClass( 'collapsed' ) ) {
                                $( this ).text( hideText );
                        } else {
index dd37051..f8143fa 100644 (file)
@@ -309,10 +309,6 @@ p.mw-upload-editlicenses {
        margin-right: 0.2em;
 }
 
-#pagehistory span.minor {
-       font-weight: bold;
-}
-
 #pagehistory li {
        border: 1px solid white;
 }
index e40caaa..89fcc0b 100644 (file)
         *
         *     selector.setSearchType( [ mw.widgets.CategorySelector.SearchType.SubCategories ] );
         *
-        *
         * @class mw.widgets.CategorySelector
         * @uses mw.Api
         * @extends OO.ui.CapsuleMultiSelectWidget
+        * @mixins OO.ui.mixin.PendingElement
         *
         * @constructor
         * @param {Object} [config] Configuration options
                        allowArbitrary: true
                } ) );
 
+               // Mixin constructors
+               OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$handle } ) );
+
                // Event handler to call the autocomplete methods
                this.$input.on( 'change input cut paste', OO.ui.debounce( this.updateMenuItems.bind( this ), 100 ) );
 
                // Initialize
                this.api = new mw.Api();
-
        }
 
        /* Setup */
 
        OO.inheritClass( CategorySelector, OO.ui.CapsuleMultiSelectWidget );
+       OO.mixinClass( CategorySelector, OO.ui.mixin.PendingElement );
        CSP = CategorySelector.prototype;
 
        /* Methods */
                        var existingItems, filteredItems,
                                menu = this.getMenu();
 
+                       // Never show the menu if the input lost focus in the meantime
+                       if ( !this.$input.is( ':focus' ) ) {
+                               return;
+                       }
+
                        // Array of strings of the data of OO.ui.MenuOptionsWidgets
                        existingItems = menu.getItems().map( function ( item ) {
                                return item.data;
                }.bind( this ) );
        };
 
+       /**
+        * @inheritdoc
+        */
+       CSP.clearInput = function () {
+               CategorySelector.parent.prototype.clearInput.call( this );
+               // Abort all pending requests, we won't need their results
+               this.api.abort();
+       };
+
        /**
         * Searches for categories based on the input.
         *
                        promises = [],
                        deferred = new $.Deferred();
 
+               if ( $.trim( input ) === '' ) {
+                       deferred.resolve( [] );
+                       return deferred.promise();
+               }
+
+               // Abort all pending requests, we won't need their results
+               this.api.abort();
                for ( i = 0; i < this.searchTypes.length; i++ ) {
                        promises.push( this.searchCategories( input, this.searchTypes[ i ] ) );
                }
 
+               this.pushPending();
+
                $.when.apply( $, promises ).done( function () {
                        var categories, categoryNames,
                                allData = [],
 
                        deferred.resolve( categoryNames );
 
-               } );
+               } ).always( this.popPending.bind( this ) );
 
                return deferred.promise();
        };
                                } ).done( function ( res ) {
                                        var categories = res[ 1 ];
                                        deferred.resolve( categories );
-                               } );
+                               } ).fail( deferred.reject.bind( deferred ) );
                                break;
 
                        case CategorySelector.SearchType.InternalSearch:
                                                return page.title;
                                        } );
                                        deferred.resolve( categories );
-                               } );
+                               } ).fail( deferred.reject.bind( deferred ) );
                                break;
 
                        case CategorySelector.SearchType.Exists:
                                        }
 
                                        deferred.resolve( categories );
-                               } );
+                               } ).fail( deferred.reject.bind( deferred ) );
                                break;
 
                        case CategorySelector.SearchType.SubCategories:
                                                return category.title;
                                        } );
                                        deferred.resolve( categories );
-                               } );
+                               } ).fail( deferred.reject.bind( deferred ) );
                                break;
 
                        case CategorySelector.SearchType.ParentCategories:
                                        }
 
                                        deferred.resolve( categories );
-                               } );
+                               } ).fail( deferred.reject.bind( deferred ) );
                                break;
 
                        default:
index c37c723..0e2546f 100644 (file)
         * @param {OO.ui.OptionWidget} item Chosen item
         */
        mw.widgets.TitleSearchWidget.prototype.onTitleSearchResultsChoose = function ( item ) {
-               // TOOD: Pressing enter can incorrectly trigger 'choose' with null.
-               // Remove this check when oojs-ui 0.12.10 lands.
-               if ( item ) {
-                       this.getQuery().setValue( item.getData() );
-               }
+               this.getQuery().setValue( item.getData() );
        };
 
        /**
index 43b20b8..79aba77 100644 (file)
                options.ajax = $.extend( {}, defaultOptions.ajax, options.ajax );
 
                this.defaults = options;
+               this.requests = [];
        };
 
        mw.Api.prototype = {
+               /**
+                * Abort all unfinished requests issued by this Api object.
+                *
+                * @method
+                */
+               abort: function () {
+                       $.each( this.requests, function ( index, request ) {
+                               request.abort();
+                       } );
+               },
 
                /**
                 * Perform API get request
                                        }
                                } );
 
+                       this.requests.push( xhr );
                        // Return the Promise
                        return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
                                if ( !( code === 'http' && details && details.textStatus === 'abort' ) ) {
index 4d6b34c..614c001 100644 (file)
                return nonce++;
        }
 
+       /**
+        * @private
+        * Given a non-empty object, return one of its keys.
+        *
+        * @param {Object} obj
+        * @return {string}
+        */
+       function getFirstKey( obj ) {
+               for ( var key in obj ) {
+                       if ( obj.hasOwnProperty( key ) ) {
+                               return key;
+                       }
+               }
+       }
+
        /**
         * @private
         * Get new iframe object for an upload.
                        }
 
                        if ( !file ) {
-                               return $.Deferred().reject( 'No file' );
+                               throw new Error( 'No file' );
                        }
 
                        canUseFormData = formDataAvailable() && file instanceof window.File;
 
                        if ( !isFileInput && !canUseFormData ) {
-                               return $.Deferred().reject( 'Unsupported argument type passed to mw.Api.upload' );
+                               throw new Error( 'Unsupported argument type passed to mw.Api.upload' );
                        }
 
                        if ( canUseFormData ) {
                        $iframe.one( 'load', function () {
                                $iframe.one( 'load', function () {
                                        var result = processIframeResult( iframe );
+                                       deferred.notify( 1 );
 
                                        if ( !result ) {
-                                               deferred.reject( 'No response from API on upload attempt.' );
-                                       } else if ( result.error || result.warnings ) {
-                                               if ( result.error && result.error.code === 'badtoken' ) {
+                                               deferred.reject( 'ok-but-empty', 'No response from API on upload attempt.' );
+                                       } else if ( result.error ) {
+                                               if ( result.error.code === 'badtoken' ) {
                                                        api.badToken( 'edit' );
                                                }
 
-                                               deferred.reject( result.error || result.warnings );
+                                               deferred.reject( result.error.code, result );
+                                       } else if ( result.upload && result.upload.warnings ) {
+                                               deferred.reject( getFirstKey( result.upload.warnings ), result );
                                        } else {
-                                               deferred.notify( 1 );
                                                deferred.resolve( result );
                                        }
                                } );
                        } );
 
                        $iframe.error( function ( error ) {
-                               deferred.reject( 'iframe failed to load: ' + error );
+                               deferred.reject( 'http', error );
                        } );
 
                        $iframe.prop( 'src', 'about:blank' ).hide();
                        } );
 
                        if ( !data.filename && !data.stash ) {
-                               return $.Deferred().reject( 'Filename not included in file data.' );
+                               throw new Error( 'Filename not included in file data.' );
                        }
 
                        if ( this.needToken() ) {
                        data.file = file;
 
                        if ( !data.filename && !data.stash ) {
-                               return $.Deferred().reject( 'Filename not included in file data.' );
+                               throw new Error( 'Filename not included in file data.' );
                        }
 
                        // Use this.postWithEditToken() or this.post()
                                }
                        } )
                                .done( function ( result ) {
-                                       if ( result.error || result.warnings ) {
-                                               deferred.reject( result.error || result.warnings );
+                                       deferred.notify( 1 );
+                                       if ( result.upload && result.upload.warnings ) {
+                                               deferred.reject( getFirstKey( result.upload.warnings ), result );
                                        } else {
-                                               deferred.notify( 1 );
                                                deferred.resolve( result );
                                        }
                                } )
-                               .fail( function ( result ) {
-                                       deferred.reject( result );
+                               .fail( function ( errorCode, result ) {
+                                       deferred.notify( 1 );
+                                       deferred.reject( errorCode, result );
                                } );
 
                        return deferred.promise();
                                api = this;
 
                        if ( !data.filename ) {
-                               return $.Deferred().reject( 'Filename not included in file data.' );
+                               throw new Error( 'Filename not included in file data.' );
                        }
 
                        function finishUpload( moreData ) {
                                data.format = 'json';
 
                                if ( !data.filename ) {
-                                       return $.Deferred().reject( 'Filename not included in file data.' );
+                                       throw new Error( 'Filename not included in file data.' );
                                }
 
                                return api.postWithEditToken( data ).then( function ( result ) {
-                                       if ( result.upload && ( result.upload.error || result.upload.warnings ) ) {
-                                               return $.Deferred().reject( result.upload.error || result.upload.warnings ).promise();
+                                       if ( result.upload && result.upload.warnings ) {
+                                               return $.Deferred().reject( getFirstKey( result.upload.warnings ), result ).promise();
                                        }
                                        return result;
                                } );
                        }
 
-                       return this.upload( file, { stash: true, filename: data.filename } ).then( function ( result ) {
-                               if ( result && result.upload && result.upload.filekey ) {
+                       return this.upload( file, { stash: true, filename: data.filename } ).then(
+                               function ( result ) {
                                        filekey = result.upload.filekey;
-                               } else if ( result && ( result.error || result.warning ) ) {
-                                       return $.Deferred().reject( result );
+                                       return finishUpload;
+                               },
+                               function ( errorCode, result ) {
+                                       if ( result && result.upload && result.upload.filekey ) {
+                                               // Ignore any warnings if 'filekey' was returned, that's all we care about
+                                               filekey = result.upload.filekey;
+                                               return $.Deferred().resolve( finishUpload );
+                                       }
+                                       return $.Deferred().reject( errorCode, result );
                                }
-
-                               return finishUpload;
-                       } );
+                       );
                },
 
                needToken: function () {
index d270916..dd28ddd 100644 (file)
@@ -77,7 +77,7 @@
                        '\n|date=' +
                        this.getDate() +
                        '\n|source=' +
-                       this.getUser() +
+                       this.getSource() +
                        '\n|author=' +
                        this.getUser() +
                        '\n}}\n\n' +
        };
 
        /**
-        * Gets the wikitext for the license of the upload. Abstract for now.
+        * Gets the wikitext for the license of the upload.
         *
         * @private
         * @return {string}
         */
        ForeignStructuredUpload.prototype.getLicense = function () {
-               return '';
+               // Make sure this matches the messages for different targets in
+               // mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm
+               return this.target === 'shared' ? '{{self|cc-by-sa-4.0}}' : '';
+       };
+
+       /**
+        * Get the source. This should be some sort of localised text for "Own work".
+        *
+        * @private
+        * @return {string}
+        */
+       ForeignStructuredUpload.prototype.getSource = function () {
+               return '{{own}}';
        };
 
        /**
index 7b3a751..61fb59f 100644 (file)
                // actual API call methods to wait for the apiPromise to resolve
                // before continuing.
                mw.Upload.call( this, null );
+
+               if ( this.target !== 'local' ) {
+                       // Keep these untranslated. We don't know the content language of the foreign wiki, best to
+                       // stick to English in the text.
+                       this.setComment( 'Cross-wiki upload from ' + location.host );
+               }
        }
 
        OO.inheritClass( ForeignUpload, mw.Upload );
index c4b8c09..7b307ee 100644 (file)
                        deferred.resolve();
                        layout.emit( 'fileUploaded' );
                }, function () {
-                       // These errors will be thrown while the user is on the info page
-                       if ( layout.upload.getState() === mw.Upload.State.ERROR ) {
-                               deferred.reject( new OO.ui.Error( layout.upload.getStateDetails(), {
-                                       recoverable: false
-                               } ) );
-                               return false;
-                       }
-                       if ( layout.upload.getState() === mw.Upload.State.WARNING ) {
-                               deferred.reject( new OO.ui.Error( layout.upload.getStateDetails(), {
-                                       recoverable: false
-                               } ) );
-                               return false;
-                       }
+                       // These errors will be thrown while the user is on the info page.
+                       // Pretty sure it's impossible to get a warning other than 'stashfailed' here, which should
+                       // really be an error...
+                       var errorMessage = layout.getErrorMessageForStateDetails();
+                       deferred.reject( errorMessage );
                } );
 
                // If there is an error in uploading, come back to the upload page
                                deferred.resolve();
                                layout.emit( 'fileSaved' );
                        }, function () {
-                               var stateDetails = layout.upload.getStateDetails();
-
-                               if ( layout.upload.getState() === mw.Upload.State.ERROR ) {
-                                       deferred.reject( new OO.ui.Error( stateDetails, {
-                                               recoverable: false
-                                       } ) );
-                                       return false;
-                               }
-
-                               if ( layout.upload.getState() === mw.Upload.State.WARNING ) {
-                                       // We could get more than one of these errors, these are in order
-                                       // of importance. For example fixing the thumbnail like file name
-                                       // won't help the fact that the file already exists.
-                                       if ( stateDetails.exists !== undefined ) {
-                                               deferred.reject( new OO.ui.Error(
-                                                       $( '<p>' ).html(
-                                                               mw.message( 'filepageexists', stateDetails.exists ).parse()
-                                                       ),
-                                                       { recoverable: false }
-                                               ) );
-                                       } else if ( stateDetails.duplicate !== undefined ) {
-                                               deferred.reject( new OO.ui.Error(
-                                                       $( '<p>' ).html(
-                                                               mw.message( 'fileexists', stateDetails.duplicate[ 0 ] ).parse()
-                                                       ),
-                                                       { recoverable: false }
-                                               ) );
-                                       } else if ( stateDetails[ 'thumb-name' ] !== undefined ) {
-                                               deferred.reject( new OO.ui.Error(
-                                                       $( '<p>' ).html(
-                                                               mw.message( 'filename-thumb-name' ).parse()
-                                                       ),
-                                                       { recoverable: false }
-                                               ) );
-                                       } else if ( stateDetails[ 'bad-prefix' ] !== undefined ) {
-                                               deferred.reject( new OO.ui.Error(
-                                                       $( '<p>' ).html(
-                                                               mw.message( 'filename-bad-prefix', stateDetails[ 'bad-prefix' ] ).parse()
-                                                       ),
-                                                       { recoverable: false }
-                                               ) );
-                                       } else if ( stateDetails[ 'duplicate-archive' ] !== undefined ) {
-                                               deferred.reject( new OO.ui.Error(
-                                                       $( '<p>' ).html(
-                                                               mw.message( 'api-error-duplicate-archive', stateDetails[ 'duplicate-archive' ] ).parse()
-                                                       ),
-                                                       { recoverable: false }
-                                               ) );
-                                       } else if ( stateDetails.badfilename !== undefined ) {
-                                               // Change the name if the current name isn't acceptable
-                                               layout.filenameWidget.setValue( stateDetails.badfilename );
-                                               deferred.reject( new OO.ui.Error(
-                                                       $( '<p>' ).html(
-                                                               mw.message( 'badfilename', stateDetails.badfilename ).parse()
-                                                       )
-                                               ) );
-                                       } else {
-                                               deferred.reject( new OO.ui.Error(
-                                                       $( '<p>' ).html(
-                                                               // Let's get all the help we can if we can't pin point the error
-                                                               mw.message( 'api-error-unknown-warning', JSON.stringify( stateDetails ) ).parse()
-                                                       ),
-                                                       { recoverable: false }
-                                               ) );
-                                       }
-
-                                       return false;
-                               }
+                               var errorMessage = layout.getErrorMessageForStateDetails();
+                               deferred.reject( errorMessage );
                        } );
                } );
 
                return deferred.promise();
        };
 
+       /**
+        * Get an error message (as OO.ui.Error object) that should be displayed to the user for current
+        * state and state details.
+        *
+        * @protected
+        * @returns {OO.ui.Error} Error to display for given state and details.
+        */
+       mw.Upload.BookletLayout.prototype.getErrorMessageForStateDetails = function () {
+               var message,
+                       state = this.upload.getState(),
+                       stateDetails = this.upload.getStateDetails(),
+                       error = stateDetails.error,
+                       warnings = stateDetails.upload && stateDetails.upload.warnings;
+
+               if ( state === mw.Upload.State.ERROR ) {
+                       // HACK We should either have a hook here to allow TitleBlacklist to handle this, or just have
+                       // TitleBlacklist produce sane error messages that can be displayed without arcane knowledge
+                       if ( error.info === 'TitleBlacklist prevents this title from being created' ) {
+                               // HACK Apparently the only reliable way to determine whether TitleBlacklist was involved
+                               return new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               // HACK TitleBlacklist doesn't have a sensible message, this one is from UploadWizard
+                                               mw.message( 'api-error-blacklisted' ).parse()
+                                       ),
+                                       { recoverable: false }
+                               );
+                       }
+
+                       message = mw.message( 'api-error-' + error.code );
+                       if ( !message.exists() ) {
+                               message = mw.message( 'api-error-unknownerror', JSON.stringify( stateDetails ) );
+                       }
+                       return new OO.ui.Error(
+                               $( '<p>' ).html(
+                                       message.parse()
+                               ),
+                               { recoverable: false }
+                       );
+               }
+
+               if ( state === mw.Upload.State.WARNING ) {
+                       // We could get more than one of these errors, these are in order
+                       // of importance. For example fixing the thumbnail like file name
+                       // won't help the fact that the file already exists.
+                       if ( warnings.stashfailed !== undefined ) {
+                               return new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               mw.message( 'api-error-stashfailed' ).parse()
+                                       ),
+                                       { recoverable: false }
+                               );
+                       } else if ( warnings.exists !== undefined ) {
+                               return new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               mw.message( 'fileexists', 'File:' + warnings.exists ).parse()
+                                       ),
+                                       { recoverable: false }
+                               );
+                       } else if ( warnings[ 'page-exists' ] !== undefined ) {
+                               return new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               mw.message( 'filepageexists', 'File:' + warnings[ 'page-exists' ] ).parse()
+                                       ),
+                                       { recoverable: false }
+                               );
+                       } else if ( warnings.duplicate !== undefined ) {
+                               return new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               mw.message( 'api-error-duplicate', warnings.duplicate.length ).parse()
+                                       ),
+                                       { recoverable: false }
+                               );
+                       } else if ( warnings[ 'thumb-name' ] !== undefined ) {
+                               return new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               mw.message( 'filename-thumb-name' ).parse()
+                                       ),
+                                       { recoverable: false }
+                               );
+                       } else if ( warnings[ 'bad-prefix' ] !== undefined ) {
+                               return new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               mw.message( 'filename-bad-prefix', warnings[ 'bad-prefix' ] ).parse()
+                                       ),
+                                       { recoverable: false }
+                               );
+                       } else if ( warnings[ 'duplicate-archive' ] !== undefined ) {
+                               return new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               mw.message( 'api-error-duplicate-archive', 1 ).parse()
+                                       ),
+                                       { recoverable: false }
+                               );
+                       } else if ( warnings.badfilename !== undefined ) {
+                               // Change the name if the current name isn't acceptable
+                               // TODO This might not really be the best place to do this
+                               this.filenameWidget.setValue( warnings.badfilename );
+                               return new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               mw.message( 'badfilename', warnings.badfilename ).parse()
+                                       )
+                               );
+                       } else {
+                               return new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               // Let's get all the help we can if we can't pin point the error
+                                               mw.message( 'api-error-unknown-warning', JSON.stringify( stateDetails ) ).parse()
+                                       ),
+                                       { recoverable: false }
+                               );
+                       }
+               }
+       };
+
        /* Form renderers */
 
        /**
index 007c855..1432912 100644 (file)
         * Sets the state and state details (if any) of the upload.
         *
         * @param {mw.Upload.State} state
-        * @param {string|Object} stateDetails
+        * @param {Object} stateDetails
         */
        UP.setState = function ( state, stateDetails ) {
                this.state = state;
                        upload.setState( Upload.State.UPLOADED );
                        upload.imageinfo = result.upload.imageinfo;
                        return result;
-               }, function () {
-                       upload.setState( Upload.State.ERROR );
+               }, function ( errorCode, result ) {
+                       if ( result && result.upload && result.upload.warnings ) {
+                               upload.setState( Upload.State.WARNING, result );
+                       } else {
+                               upload.setState( Upload.State.ERROR, result );
+                       }
+                       return $.Deferred().reject( errorCode, result );
                } );
        };
 
                } ).then( function ( finishStash ) {
                        upload.setState( Upload.State.STASHED );
                        return finishStash;
-               }, function ( result ) {
-                       upload.setState( Upload.State.ERROR, mw.message( 'api-error-' + result ) );
+               }, function ( errorCode, result ) {
+                       if ( result && result.upload && result.upload.warnings ) {
+                               upload.setState( Upload.State.WARNING, result );
+                       } else {
+                               upload.setState( Upload.State.ERROR, result );
+                       }
+                       return $.Deferred().reject( errorCode, result );
                } );
 
                return this.stashPromise;
                                upload.setState( Upload.State.UPLOADED );
                                upload.imageinfo = result.upload.imageinfo;
                                return result;
-                       }, function ( result ) {
-                               // Errors are strings that can be used to get error message
-                               if ( typeof result === 'string' ) {
-                                       upload.setState( Upload.State.ERROR, mw.message( 'api-error-' + result ) );
-                                       return;
-                               }
-
-                               // Warnings come in the form of objects
-                               if ( $.isPlainObject( result ) ) {
+                       }, function ( errorCode, result ) {
+                               if ( result && result.upload && result.upload.warnings ) {
                                        upload.setState( Upload.State.WARNING, result );
-                                       return;
+                               } else {
+                                       upload.setState( Upload.State.ERROR, result );
                                }
-
-                               // Throw an empty error if we can't figure it out
-                               upload.setState( Upload.State.ERROR );
+                               return $.Deferred().reject( errorCode, result );
                        } );
                } );
        };
index 8957430..de63a18 100644 (file)
                        return mw.jqueryMsg.getMessageFunction()( msg.charAt( 0 ).toLowerCase() + msg.slice( 1 ) );
                },
 
+               /**
+                * Get localized namespace name from canonical name or namespace number.
+                * Invoked by putting `{{ns:foo}}` into a message
+                *
+                * @param {Array} nodes List of nodes
+                * @return {string} Localized namespace name
+                */
+               ns: function ( nodes ) {
+                       var ns = $.trim( textify( nodes[ 0 ] ) );
+                       if ( !/^\d+$/.test( ns ) ) {
+                               ns = mw.config.get( 'wgNamespaceIds' )[ ns.replace( / /g, '_' ).toLowerCase() ];
+                       }
+                       ns = mw.config.get( 'wgFormattedNamespaces' )[ ns ];
+                       return ns || '';
+               },
+
                /**
                 * Takes an unformatted number (arab, no group separators and . as decimal separator)
                 * and outputs it in the localized digit script and formatted with decimal
index 20deb21..3c80bbb 100644 (file)
@@ -1,6 +1,6 @@
 /* Galleries */
 /* These display attributes look nonsensical, but are needed to support IE and FF2 */
-/* Don't forget to update mediawiki.page.gallery.print.css */
+/* Don't forget to update gallery-print.css */
 li.gallerybox {
        vertical-align: top;
        display: -moz-inline-box;
index 9bbbf9f..8af1428 100644 (file)
@@ -181,7 +181,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                $fileName = $this->getNewTempFile();
 
                // Converting the temporary /file/ to a /directory/
-               //
                // The following is not atomic, but at least we now have a single place,
                // where temporary directory creation is bundled and can be improved
                unlink( $fileName );
@@ -493,13 +492,13 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                if ( $user->idForName() == 0 ) {
                        $user->addToDatabase();
-                       $user->setPassword( 'UTSysopPassword' );
-
-                       $user->addGroup( 'sysop' );
-                       $user->addGroup( 'bureaucrat' );
-                       $user->saveSettings();
+                       TestUser::setPasswordForUser( $user, 'UTSysopPassword' );
                }
 
+               // Always set groups, because $this->resetDB() wipes them out
+               $user->addGroup( 'sysop' );
+               $user->addGroup( 'bureaucrat' );
+
                // Make 1 page with 1 revision
                $page = WikiPage::factory( Title::newFromText( 'UTPage' ) );
                if ( $page->getId() == 0 ) {
index 7b0de86..e69fa20 100644 (file)
@@ -26,7 +26,7 @@ class BlockTest extends MediaWikiLangTestCase {
                $user = User::newFromName( 'UTBlockee' );
                if ( $user->getID() == 0 ) {
                        $user->addToDatabase();
-                       $user->setPassword( 'UTBlockeePassword' );
+                       TestUser::setPasswordForUser( $user, 'UTBlockeePassword' );
 
                        $user->saveSettings();
                }
@@ -136,9 +136,9 @@ class BlockTest extends MediaWikiLangTestCase {
        public function testBlockedUserCanNotCreateAccount() {
                $username = 'BlockedUserToCreateAccountWith';
                $u = User::newFromName( $username );
-               $u->setPassword( 'NotRandomPass' );
                $u->setId( 14146 );
                $u->addToDatabase();
+               TestUser::setPasswordForUser( $u, 'NotRandomPass' );
                unset( $u );
 
                // Sanity check
@@ -374,8 +374,8 @@ class BlockTest extends MediaWikiLangTestCase {
                # Set up the target
                $u = User::newFromName( $username );
                if ( $u->getID() == 0 ) {
-                       $u->setPassword( 'TotallyObvious' );
                        $u->addToDatabase();
+                       TestUser::setPasswordForUser( $u, 'TotallyObvious' );
                }
                unset( $u );
 
index cb334d2..010f617 100644 (file)
@@ -4,7 +4,7 @@
  * @group GlobalFunctions
  * @covers ::wfEscapeShellArg
  */
-class wfEscapeShellArgTest extends MediaWikiTestCase {
+class WfEscapeShellArgTest extends MediaWikiTestCase {
        public function testSingleInput() {
                if ( wfIsWindows() ) {
                        $expected = '"blah"';
index f011f47..9093564 100644 (file)
@@ -125,21 +125,16 @@ class LinkFilterTest extends MediaWikiLangTestCase {
                        array( '', 'gopher://*.test.com/', 'gopher://gopher.test.com/0/v2/vstat' ),
                        array( 'telnet://', '*.test.com', 'telnet://shell.test.com/~home/' ),
 
-                       //
                        // The following only work in PHP >= 5.3.7, due to a bug in parse_url which eats
                        // the path from the url (https://bugs.php.net/bug.php?id=54180)
-                       //
                        // array( '', 'http://test.com', 'http://test.com/index?arg=1' ),
                        // array( 'http://', '*.test.com', 'http://www.test.com/index?arg=1' ),
                        // array( '' ,
                        //    'http://xx23124:__ffdfdef__@www.test.com:12345/dir' ,
                        //    'http://name:pass@www.test.com:12345/dir/dir/file.xyz.php#__se__?arg1=_&arg2[]=4rtg'
                        // ),
-                       //
 
-                       //
                        // Tests for false positives
-                       //
                        array( 'http://', 'test.com', 'http://www.test.com', false ),
                        array( 'http://', 'www1.test.com', 'http://www.test.com', false ),
                        array( 'http://', '*.test.com', 'http://www.test.t.com', false ),
@@ -166,10 +161,8 @@ class LinkFilterTest extends MediaWikiLangTestCase {
                        array( '', 'http://test.com:8080/dir/', 'http://test.com:808/dir/', false ),
                        array( '', 'http://test.com/dir/index.html', 'http://test.com/dir/index.php', false ),
 
-                       //
                        // These are false positives too and ideally shouldn't match, but that
                        // would require using regexes and RLIKE instead of LIKE
-                       //
                        // array( null, 'http://*.test.com', 'http://www.test.com:80', false ),
                        // array( '', 'https://*.wikimedia.org/r/#/q/status:open,n,z',
                        //      'https://gerrit.wikimedia.org/XXX/r/#/q/status:open,n,z', false ),
index 96b2251..6887ed1 100644 (file)
@@ -65,8 +65,8 @@ class TestUser {
                }
 
                // Update the user to use the password and other details
-               $change = $this->setPassword( $this->password ) ||
-                       $this->setEmail( $email ) ||
+               $this->setPassword( $this->password );
+               $change = $this->setEmail( $email ) ||
                        $this->setRealName( $realname );
 
                // Adjust groups by adding any missing ones and removing any extras
@@ -110,26 +110,36 @@ class TestUser {
 
        /**
         * @param string $password
-        * @return bool
         */
        private function setPassword( $password ) {
-               $passwordFactory = $this->user->getPasswordFactory();
-               $oldDefaultType = $passwordFactory->getDefaultType();
-
-               // A is unsalted MD5 (thus fast) ... we don't care about security here, this is test only
-               $passwordFactory->setDefaultType( 'A' );
-               $newPassword = $passwordFactory->newFromPlaintext( $password, $this->user->getPassword() );
+               self::setPasswordForUser( $this->user, $password );
+       }
 
-               $change = false;
-               if ( !$this->user->getPassword()->equals( $newPassword ) ) {
-                       // Password changed
-                       $this->user->setPassword( $password );
-                       $change = true;
+       /**
+        * Set the password on a testing user
+        *
+        * This assumes we're still using the generic AuthManager config from
+        * PHPUnitMaintClass::finalSetup(), and just sets the password in the
+        * database directly.
+        * @param User $user
+        * @param string $password
+        */
+       public static function setPasswordForUser( User $user, $password ) {
+               if ( !$user->getId() ) {
+                       throw new MWException( "Passed User has not been added to the database yet!" );
                }
 
-               $passwordFactory->setDefaultType( $oldDefaultType );
-
-               return $change;
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               // A is unsalted MD5 (thus fast) ... we don't care about security here, this is test only
+               $passwordFactory->setDefaultType( 'A' );
+               $pwhash = $passwordFactory->newFromPlaintext( $password );
+               wfGetDB( DB_MASTER )->update(
+                       'user',
+                       array( 'user_password' => $pwhash->toString() ),
+                       array( 'user_id' => $user->getId() ),
+                       __METHOD__
+               );
        }
 
        /**
index 17c1b8e..4c6f083 100644 (file)
@@ -276,26 +276,6 @@ class UserTest extends MediaWikiTestCase {
                $this->assertEquals( 'test', $this->user->getOption( 'userjs-someoption' ) );
        }
 
-       /**
-        * Test password expiration.
-        * @covers User::getPasswordExpired()
-        */
-       public function testPasswordExpire() {
-               $this->setMwGlobals( 'wgPasswordExpireGrace', 3600 * 24 * 7 ); // 7 days
-
-               $user = User::newFromName( 'UnitTestUser' );
-               $user->loadDefaults( 'UnitTestUser' );
-               $this->assertEquals( false, $user->getPasswordExpired() );
-
-               $ts = time() - ( 3600 * 24 * 1 ); // 1 day ago
-               $user->expirePassword( $ts );
-               $this->assertEquals( 'soft', $user->getPasswordExpired() );
-
-               $ts = time() - ( 3600 * 24 * 10 ); // 10 days ago
-               $user->expirePassword( $ts );
-               $this->assertEquals( 'hard', $user->getPasswordExpired() );
-       }
-
        /**
         * Test password validity checks. There are 3 checks in core,
         *      - ensure the password meets the minimal length
index e0488b7..ffd2f5e 100644 (file)
@@ -22,7 +22,7 @@ class ApiBlockTest extends ApiTestCase {
 
                if ( $user->getId() == 0 ) {
                        $user->addToDatabase();
-                       $user->setPassword( 'UTApiBlockeePassword' );
+                       TestUser::setPasswordForUser( $user, 'UTApiBlockeePassword' );
 
                        $user->saveSettings();
                }
index 8d134f7..3945102 100644 (file)
@@ -29,7 +29,7 @@ class ApiCreateAccountTest extends ApiTestCase {
                        $this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
                }
 
-               $password = User::randomPassword();
+               $password = PasswordFactory::generateRandomPasswordString();
 
                $ret = $this->doApiRequest( array(
                        'action' => 'createaccount',
index f8da0ff..d187fed 100644 (file)
@@ -15,7 +15,7 @@ class UserWrapper {
                                "email" => "test@example.com",
                                "real_name" => "Test User" ) );
                }
-               $this->user->setPassword( $this->password );
+               TestUser::setPasswordForUser( $this->user, $this->password );
 
                if ( $group !== '' ) {
                        $this->user->addGroup( $group );
index 6b22000..d931b39 100644 (file)
@@ -13,7 +13,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
                $user = User::newFromName( 'UTMale' );
                if ( $user->getID() == 0 ) {
                        $user->addToDatabase();
-                       $user->setPassword( 'UTMalePassword' );
+                       TestUser::setPasswordForUser( $user, 'UTMalePassword' );
                }
                // ensure the right gender
                $user->setOption( 'gender', 'male' );
@@ -22,7 +22,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
                $user = User::newFromName( 'UTFemale' );
                if ( $user->getID() == 0 ) {
                        $user->addToDatabase();
-                       $user->setPassword( 'UTFemalePassword' );
+                       TestUser::setPasswordForUser( $user, 'UTFemalePassword' );
                }
                // ensure the right gender
                $user->setOption( 'gender', 'female' );
@@ -31,7 +31,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
                $user = User::newFromName( 'UTDefaultGender' );
                if ( $user->getID() == 0 ) {
                        $user->addToDatabase();
-                       $user->setPassword( 'UTDefaultGenderPassword' );
+                       TestUser::setPasswordForUser( $user, 'UTDefaultGenderPassword' );
                }
                // ensure the default gender
                $user->setOption( 'gender', null );
index e9577f1..6e4c589 100644 (file)
@@ -25,7 +25,7 @@ class RightsLogFormatterTest extends LogFormatterTestCase {
                                        ),
                                ),
                                array(
-                                       'text' => 'Sysop changed group membership for User:User from (none) to '
+                                       'text' => 'Sysop changed group membership for User from (none) to '
                                                . 'administrator and bureaucrat',
                                        'api' => array(
                                                'oldgroups' => array(),
@@ -51,7 +51,7 @@ class RightsLogFormatterTest extends LogFormatterTestCase {
                                ),
                                array(
                                        'legacy' => true,
-                                       'text' => 'Sysop changed group membership for User:User from (none) to '
+                                       'text' => 'Sysop changed group membership for User from (none) to '
                                                . 'administrator and bureaucrat',
                                        'api' => array(
                                                'oldgroups' => array(),
@@ -74,7 +74,7 @@ class RightsLogFormatterTest extends LogFormatterTestCase {
                                ),
                                array(
                                        'legacy' => true,
-                                       'text' => 'Sysop changed group membership for User:User',
+                                       'text' => 'Sysop changed group membership for User',
                                        'api' => array(),
                                ),
                        ),
index 4195216..8981f2f 100644 (file)
@@ -105,11 +105,11 @@ class WANObjectCacheTest extends MediaWikiTestCase {
 
                $wasSet = 0;
                $v = $cache->getWithSetCallback( $key, $func, 30, array(), array( 'lockTSE' => 5 ) );
-               $this->assertEquals( $v, $value );
+               $this->assertEquals( $value, $v, "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value regenerated" );
 
                $curTTL = null;
-               $v = $cache->get( $key, $curTTL );
+               $cache->get( $key, $curTTL );
                $this->assertLessThanOrEqual( 20, $curTTL, 'Current TTL between 19-20 (overriden)' );
                $this->assertGreaterThanOrEqual( 19, $curTTL, 'Current TTL between 19-20 (overriden)' );
 
@@ -118,14 +118,14 @@ class WANObjectCacheTest extends MediaWikiTestCase {
                        'lowTTL' => 0,
                        'lockTSE' => 5,
                ) );
-               $this->assertEquals( $v, $value );
+               $this->assertEquals( $value, $v, "Value returned" );
                $this->assertEquals( 0, $wasSet, "Value not regenerated" );
 
                $priorTime = microtime( true );
                usleep( 1 );
                $wasSet = 0;
                $v = $cache->getWithSetCallback( $key, $func, 30, array( $cKey1, $cKey2 ) );
-               $this->assertEquals( $v, $value );
+               $this->assertEquals( $value, $v, "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value regenerated due to check keys" );
                $t1 = $cache->getCheckKeyTime( $cKey1 );
                $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check keys generated on miss' );
@@ -135,7 +135,7 @@ class WANObjectCacheTest extends MediaWikiTestCase {
                $priorTime = microtime( true );
                $wasSet = 0;
                $v = $cache->getWithSetCallback( $key, $func, 30, array( $cKey1, $cKey2 ) );
-               $this->assertEquals( $v, $value );
+               $this->assertEquals( $value, $v, "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value regenerated due to still-recent check keys" );
                $t1 = $cache->getCheckKeyTime( $cKey1 );
                $this->assertLessThanOrEqual( $priorTime, $t1, 'Check keys did not change again' );
@@ -144,8 +144,17 @@ class WANObjectCacheTest extends MediaWikiTestCase {
 
                $curTTL = null;
                $v = $cache->get( $key, $curTTL, array( $cKey1, $cKey2 ) );
-               $this->assertEquals( $v, $value );
+               $this->assertEquals( $value, $v, "Value returned" );
                $this->assertLessThanOrEqual( 0, $curTTL, "Value has current TTL < 0 due to check keys" );
+
+               $wasSet = 0;
+               $key = wfRandomString();
+               $v = $cache->getWithSetCallback( $key, $func, 30, array(), array( 'pcTTL' => 5 ) );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $cache->delete( $key );
+               $v = $cache->getWithSetCallback( $key, $func, 30, array(), array( 'pcTTL' => 5 ) );
+               $this->assertEquals( $value, $v, "Value still returned after deleted" );
+               $this->assertEquals( 1, $wasSet, "Value process cached while deleted" );
        }
 
        /**
index 5ad8aca..e8a4d5c 100644 (file)
@@ -25,14 +25,16 @@ class PasswordTest extends MediaWikiTestCase {
         * @covers InvalidPassword::equals
         */
        public function testInvalidUnequalInvalid() {
-               $invalid1 = User::getPasswordFactory()->newFromCiphertext( null );
-               $invalid2 = User::getPasswordFactory()->newFromCiphertext( null );
+               $passwordFactory = new PasswordFactory();
+               $invalid1 = $passwordFactory->newFromCiphertext( null );
+               $invalid2 = $passwordFactory->newFromCiphertext( null );
 
                $this->assertFalse( $invalid1->equals( $invalid2 ) );
        }
 
        public function testInvalidPlaintext() {
-               $invalid = User::getPasswordFactory()->newFromPlaintext( null );
+               $passwordFactory = new PasswordFactory();
+               $invalid = $passwordFactory->newFromPlaintext( null );
 
                $this->assertInstanceOf( 'InvalidPassword', $invalid );
        }
index 8c76397..c846c06 100644 (file)
@@ -102,7 +102,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                // expectOutput[...] functions. However, the PHPUnit shipped prediactes
                // do not allow to check /each/ line of the output using /readable/ REs.
                // So we ...
-               //
+
                // 1. ... add a dummy output checking to make PHPUnit not complain
                //    about unchecked test output
                $this->expectOutputRegex( '//' );
index 454e9c1..5c6a6cd 100644 (file)
@@ -4,7 +4,6 @@
 // instead of the MaintenanceFixup hack below. However, we cannot do
 // without changing the visibility and without working around hacks in
 // Maintenance.php
-//
 // For the same reason, we cannot just use FakeMaintenance.
 
 /**
index c216864..f5dd98b 100644 (file)
@@ -301,7 +301,6 @@ class TextPassDumperDatabaseTest extends DumpTestCase {
 
                // The dump (hopefully) did take long enough to produce more than one
                // checkpoint file.
-               //
                // We now check all the checkpoint files for validity.
 
                $files = scandir( $nameOutputDir );
index cab4080..11ceeea 100644 (file)
        parserTest( 'Y Dates', 'date', YDates );
 
        ISODates = [
-               [ '2000',               false, 946684800000, 'Plain 4-digit year' ],
-               [ '2000-01',            false, 946684800000, 'Year with month' ],
+               [ '2000',               false, 0, 'Plain 4-digit year' ],
+               [ '2000-01',            false, 0, 'Year with month' ],
                [ '2000-01-01', true, 946684800000, 'Year with month and day' ],
                [ '2000-13-01', true, 0, 'Non existant month' ],
                [ '2000-01-32', true, 0, 'Non existant day' ],
                [ '2000-01-01T12:30:30Z',       true, 946729830000, 'Date with a UTC+0 time' ],
                [ '2000-01-01T24:30:30Z',       true, 0, 'Date with invalid hours' ],
                [ '2000-01-01T12:60:30Z',       true, 0, 'Date with invalid minutes' ],
-               [ '2000-01-01T12:30:61Z',       true, 0, 'Date with invalid amount of seconds' ],
+               [ '2000-01-01T12:30:61Z',       true, 946729800000, 'Date with invalid amount of seconds, drops seconds' ],
                [ '2000-01-01T23:59:59Z',       true, 946771199000, 'Edges of time' ],
                [ '2000-01-01T12:30:30.111Z',   true, 946729830111, 'Date with milliseconds' ],
                [ '2000-01-01T12:30:30.11111Z', true, 946729830111, 'Date with too high precision' ],
                [ '2000-01-01T12:30:30+01:30',  true, 946724430000, 'Date time in UTC+1:30' ],
                [ '2000-01-01T12:30:30-01:00',  true, 946733430000, 'Date time in UTC-1' ],
                [ '2000-01-01T12:30:30-01:30',  true, 946735230000, 'Date time in UTC-1:30' ],
-               [ '2000-01-01T12:30:30.111+01:00', true, 946726230111, 'Date time and milliseconds in UTC+1 ' ]
+               [ '2000-01-01T12:30:30.111+01:00', true, 946726230111, 'Date time and milliseconds in UTC+1 ' ],
+               [ '2000-01-01Postfix', true, 946684800000, 'Date with appended postfix' ],
+               [ '2000-01-01 Postfix', true, 946684800000, 'Date with separate postfix' ]
                /* Disable testcases, because behavior is browser dependant */
                /*
                [ '2000-11-31', true, 0, '31 days in 30 day month' ],
index 6805eab..b09bb28 100644 (file)
                        0,
                        'empty cell is sorted as number 0'
                );
+       } );
 
+       QUnit.test( 'bug T114721 - use of expand-child class', 2, function ( assert ) {
+               var $table, parsers;
+               $table = $(
+                       '<table class="sortable">' +
+                               '<tr><th>A</th><th>B</th></tr>' +
+                               '<tr><td>b</td><td>4</td></tr>' +
+                               '<tr class="expand-child"><td colspan="2">some text follow b</td></tr>' +
+                               '<tr><td>a</td><td>2</td></tr>' +
+                               '<tr class="expand-child"><td colspan="2">some text follow a</td></tr>' +
+                               '<tr class="expand-child"><td colspan="2">more text</td></tr>' +
+                               '</table>'
+               );
+               $table.tablesorter();
+               $table.find( '.headerSort:eq(0)' ).click();
+
+               assert.deepEqual(
+                       tableExtract( $table ),
+                       [
+                               [ 'a', '2' ],
+                               [ 'some text follow a' ],
+                               [ 'more text' ],
+                               [ 'b', '4' ],
+                               [ 'some text follow b' ]
+                       ],
+                       'row with expand-child class follow above row'
+               );
+
+               parsers = $table.data( 'tablesorter' ).config.parsers;
+               assert.equal(
+                       parsers[ 1 ].id,
+                       'number',
+                       'detectParserForColumn() detect parser.id "number" for second column'
+               );
        } );
+
 }( jQuery, mediaWiki ) );
index 8033458..56a346f 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function ( mw, $ ) {
        QUnit.module( 'mediawiki.api', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
                                assert.deepEqual( data, { example: { value: 'B' } } );
                        } );
        } );
-}( mediaWiki ) );
+
+       QUnit.module( 'mediawiki.api (2)', {
+               setup: function () {
+                       var self = this,
+                               requests = this.requests = [];
+                       this.api = new mw.Api();
+                       this.sandbox.stub( jQuery, 'ajax', function () {
+                               var request = $.extend( {
+                                       abort: self.sandbox.spy()
+                               }, $.Deferred() );
+                               requests.push( request );
+                               return request;
+                       } );
+               }
+       } );
+
+       QUnit.test( '#abort', 3, function ( assert ) {
+               this.api.get( {
+                       a: 1
+               } );
+               this.api.post( {
+                       b: 2
+               } );
+               this.api.abort();
+               assert.ok( this.requests.length === 2, 'Check both requests triggered' );
+               $.each( this.requests, function ( i, request ) {
+                       assert.ok( request.abort.calledOnce, 'abort request number ' + i );
+               } );
+       } );
+}( mediaWiki, jQuery ) );
index 030e703..10fcd5d 100644 (file)
@@ -5,8 +5,9 @@
                QUnit.expect( 2 );
                var api = new mw.Api();
                assert.ok( api.upload );
-               // The below will return a rejected deferred, but that's OK.
-               assert.ok( api.upload() );
+               assert.throws( function () {
+                       api.upload();
+               } );
        } );
 
        QUnit.test( 'Set up iframe upload', function ( assert ) {
index 1d44cc1..4f273bc 100644 (file)
                        mw.language = this.originalMwLanguage;
                },
                config: {
-                       wgArticlePath: '/wiki/$1'
+                       wgArticlePath: '/wiki/$1',
+                       // jscs:disable requireCamelCaseOrUpperCaseIdentifiers
+                       wgNamespaceIds: {
+                               template: 10,
+                               template_talk: 11,
+                               // Localised
+                               szablon: 10,
+                               dyskusja_szablonu: 11
+                       },
+                       // jscs:enable requireCamelCaseOrUpperCaseIdentifiers
+                       wgFormattedNamespaces: {
+                               // Localised
+                               10: 'Szablon',
+                               11: 'Dyskusja szablonu'
+                       }
                },
                // Messages that are reused in multiple tests
                messages: {
                );
        } );
 
+       QUnit.test( 'Ns', 4, function ( assert ) {
+               mw.messages.set( 'ns-template-talk', '{{ns:Template talk}}' );
+               assert.equal(
+                       formatParse( 'ns-template-talk' ),
+                       'Dyskusja szablonu',
+                       'ns: returns localised namespace when used with a canonical namespace name'
+               );
+
+               mw.messages.set( 'ns-10', '{{ns:10}}' );
+               assert.equal(
+                       formatParse( 'ns-10' ),
+                       'Szablon',
+                       'ns: returns localised namespace when used with a namespace number'
+               );
+
+               mw.messages.set( 'ns-unknown', '{{ns:doesnt-exist}}' );
+               assert.equal(
+                       formatParse( 'ns-unknown' ),
+                       '',
+                       'ns: returns empty string for unknown namespace name'
+               );
+
+               mw.messages.set( 'ns-in-a-link', '[[{{ns:template}}:Foo]]' );
+               assert.equal(
+                       formatParse( 'ns-in-a-link' ),
+                       '<a title="Szablon:Foo" href="/wiki/Szablon:Foo">Szablon:Foo</a>',
+                       'ns: works when used inside a wikilink'
+               );
+       } );
+
        // Tests that getMessageFunction is used for non-plain messages with curly braces or
        // square brackets, but not otherwise.
        QUnit.test( 'mw.Message.prototype.parser monkey-patch', 22, function ( assert ) {