Merge "Vector: New beta module with new typography styles"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 15 Oct 2013 16:34:44 +0000 (16:34 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 15 Oct 2013 16:34:44 +0000 (16:34 +0000)
64 files changed:
RELEASE-NOTES-1.22
docs/hooks.txt
includes/Exception.php
includes/FormOptions.php
includes/HTMLForm.php
includes/IP.php
includes/api/ApiOptions.php
includes/api/ApiQuerySiteinfo.php
includes/cache/SquidUpdate.php
includes/installer/Installer.i18n.php
includes/json/FormatJson.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialPreferences.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialTags.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUploadStash.php
includes/specials/SpecialWatchlist.php
languages/messages/MessagesCa.php
languages/messages/MessagesCe.php
languages/messages/MessagesDa.php
languages/messages/MessagesEn.php
languages/messages/MessagesEs.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesGu.php
languages/messages/MessagesHe.php
languages/messages/MessagesHi.php
languages/messages/MessagesHr.php
languages/messages/MessagesJa.php
languages/messages/MessagesKa.php
languages/messages/MessagesKo.php
languages/messages/MessagesLb.php
languages/messages/MessagesMl.php
languages/messages/MessagesNn.php
languages/messages/MessagesPms.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesSco.php
languages/messages/MessagesSk.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesTe.php
languages/messages/MessagesTh.php
languages/messages/MessagesVi.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
maintenance/createAndPromote.php
maintenance/purgeChangedFiles.php [new file with mode: 0644]
maintenance/purgeChangedPages.php
maintenance/purgeDeletedFiles.php [deleted file]
resources/Resources.php
resources/mediawiki.page/mediawiki.page.gallery.js
resources/mediawiki/mediawiki.inspect.js
resources/startup.js
skins/vector/screen.less
tests/qunit/suites/resources/startup.test.js

index a365da6..2c3a589 100644 (file)
@@ -240,6 +240,8 @@ production.
 * ResourceLoader supports hashes as module cache invalidation trigger (instead
   of or in addition to timestamps).
 * Added $wgExtensionEntryPointListFiles for use in mergeMessageFileList.php.
+* Added a hook, APIQuerySiteInfoStatisticsInfo, to allow extensions to modify
+  the output of the API query meta=siteinfo&siprop=statistics
 
 === Bug fixes in 1.22 ===
 * Disable Special:PasswordReset when $wgEnableEmail is false. Previously one
@@ -489,6 +491,8 @@ changes to languages because of Bugzilla reports.
   of media handler overriding MediaHandler::parseParamString.
 * (bug 46512) The collapsibleNav feature from the Vector extension has been moved
   to the Vector skin in core.
+* SpecialRecentChanges::addRecentChangesJS() function has been renamed
+  to addModules() and made protected.
 
 == Compatibility ==
 
index 2d1001b..53993de 100644 (file)
@@ -432,6 +432,10 @@ sites general information.
 $module: the current ApiQuerySiteInfo module
 &$results: array of results, add things here
 
+'APIQuerySiteInfoStatisticsInfo': Use this hook to add extra information to the
+sites statistics information.
+&$results: array of results, add things here
+
 'APIQueryUsersTokens': Use this hook to add custom token to list=users. Every
 token has an action, which will be used in the ustoken parameter and in the
 output (actiontoken="..."), and a callback function which should return the
index 39fe6f4..fba857f 100644 (file)
@@ -30,7 +30,6 @@
  * @ingroup Exception
  */
 class MWException extends Exception {
-       var $logId;
 
        /**
         * Should the exception use $wgOut to output the error?
@@ -131,7 +130,7 @@ class MWException extends Exception {
                                "</p>\n";
                } else {
                        return "<div class=\"errorbox\">" .
-                               '[' . $this->getLogId() . '] ' .
+                               '[' . MWExceptionHandler::getLogId( $this ) . '] ' .
                                gmdate( 'Y-m-d H:i:s' ) .
                                ": Fatal exception of type " . get_class( $this ) . "</div>\n" .
                                "<!-- Set \$wgShowExceptionDetails = true; " .
@@ -169,43 +168,28 @@ class MWException extends Exception {
        }
 
        /**
-        * Get a random ID for this error.
-        * This allows to link the exception to its corresponding log entry when
-        * $wgShowExceptionDetails is set to false.
+        * Get a the ID for this error.
         *
+        * @since 1.20
+        * @deprecated since 1.22 Use MWExceptionHandler::getLogId instead.
         * @return string
         */
        function getLogId() {
-               if ( $this->logId === null ) {
-                       $this->logId = wfRandomString( 8 );
-               }
-               return $this->logId;
+               wfDeprecated( __METHOD__, '1.22' );
+               return MWExceptionHandler::getLogId( $this );
        }
 
        /**
         * Return the requested URL and point to file and line number from which the
         * exception occurred
         *
+        * @since 1.8
+        * @deprecated since 1.22 Use MWExceptionHandler::getLogMessage instead.
         * @return string
         */
        function getLogMessage() {
-               global $wgRequest;
-
-               $id = $this->getLogId();
-               $file = $this->getFile();
-               $line = $this->getLine();
-               $message = $this->getMessage();
-
-               if ( isset( $wgRequest ) && !$wgRequest instanceof FauxRequest ) {
-                       $url = $wgRequest->getRequestURL();
-                       if ( !$url ) {
-                               $url = '[no URL]';
-                       }
-               } else {
-                       $url = '[no req]';
-               }
-
-               return "[$id] $url   Exception from line $line of $file: $message";
+               wfDeprecated( __METHOD__, '1.22' );
+               return MWExceptionHandler::getLogMessage( $this );
        }
 
        /**
@@ -249,7 +233,7 @@ class MWException extends Exception {
        function report() {
                global $wgMimeType;
 
-               $this->logException();
+               MWExceptionHandler::logException( $this );
 
                if ( defined( 'MW_API' ) ) {
                        // Unhandled API exception, we can't be sure that format printer is alive
@@ -266,22 +250,6 @@ class MWException extends Exception {
                }
        }
 
-       /**
-        * Log the error message to the exception log (if enabled)
-        */
-       function logException() {
-               global $wgLogExceptionBacktrace;
-
-               $log = $this->getLogMessage();
-               if ( $log ) {
-                       if ( $wgLogExceptionBacktrace ) {
-                               wfDebugLog( 'exception', $log . "\n" . MWExceptionHandler::formatRedactedTrace( $this ) . "\n" );
-                       } else {
-                               wfDebugLog( 'exception', $log );
-                       }
-               }
-       }
-
        /**
         * Check whether we are in command line mode or not to report the exception
         * in the correct format.
@@ -737,24 +705,103 @@ class MWExceptionHandler {
                                }
                        }
 
-                       $finalExceptionText .= "#{$i} {$call['file']}({$call['line']}): ";
+                       if ( isset( $call['file'] ) && isset( $call['line'] ) ) {
+                               $finalExceptionText .= "#{$i} {$call['file']}({$call['line']}): ";
+                       } else {
+                               // 'file' and 'line' are unset for calls via call_user_func (bug 55634)
+                               // This matches behaviour of Exception::getTraceAsString to instead
+                               // display "[internal function]".
+                               $finalExceptionText .= "#{$i} [internal function]: ";
+                       }
+
                        if ( isset( $call['class'] ) ) {
                                $finalExceptionText .= $call['class'] . $call['type'] . $call['function'];
                        } else {
                                $finalExceptionText .= $call['function'];
                        }
                        $args = array();
-                       foreach ( $call['args'] as $arg ) {
-                               if ( is_object( $arg ) ) {
-                                       $args[] = 'Object(' . get_class( $arg ) . ')';
-                               } elseif( is_array( $arg ) ) {
-                                       $args[] = 'Array';
-                               } else {
-                                       $args[] = var_export( $arg, true );
+                       if ( isset( $call['args'] ) ) {
+                               foreach ( $call['args'] as $arg ) {
+                                       if ( is_object( $arg ) ) {
+                                               $args[] = 'Object(' . get_class( $arg ) . ')';
+                                       } elseif( is_array( $arg ) ) {
+                                               $args[] = 'Array';
+                                       } else {
+                                               $args[] = var_export( $arg, true );
+                                       }
                                }
                        }
                        $finalExceptionText .=  '(' . implode( ', ', $args ) . ")\n";
                }
                return $finalExceptionText . '#' . ( $i + 1 ) . ' {main}';
        }
+
+
+       /**
+        * Get the ID for this error.
+        *
+        * The ID is saved so that one can match the one output to the user (when
+        * $wgShowExceptionDetails is set to false), to the entry in the debug log.
+        *
+        * @since 1.22
+        * @param Exception $e
+        * @return string
+        */
+       public static function getLogId( Exception $e ) {
+               if ( !isset( $e->_mwLogId ) ) {
+                       $e->_mwLogId = wfRandomString( 8 );
+               }
+               return $e->_mwLogId;
+       }
+
+       /**
+        * Return the requested URL and point to file and line number from which the
+        * exception occurred.
+        *
+        * @since 1.22
+        * @param Exception $e
+        * @return string
+        */
+       public static function getLogMessage( Exception $e ) {
+               global $wgRequest;
+
+               $id = self::getLogId( $e );
+               $file = $e->getFile();
+               $line = $e->getLine();
+               $message = $e->getMessage();
+
+               if ( isset( $wgRequest ) && !$wgRequest instanceof FauxRequest ) {
+                       $url = $wgRequest->getRequestURL();
+                       if ( !$url ) {
+                               $url = '[no URL]';
+                       }
+               } else {
+                       $url = '[no req]';
+               }
+
+               return "[$id] $url   Exception from line $line of $file: $message";
+       }
+
+       /**
+        * Log an exception to the exception log (if enabled).
+        *
+        * This method must not assume the exception is an MWException,
+        * it is also used to handle PHP errors or errors from other libraries.
+        *
+        * @since 1.22
+        * @param Exception $e
+        */
+       public static function logException( Exception $e ) {
+               global $wgLogExceptionBacktrace;
+
+               $log = self::getLogMessage( $e );
+               if ( $log ) {
+                       if ( $wgLogExceptionBacktrace ) {
+                               wfDebugLog( 'exception', $log . "\n" . self::formatRedactedTrace( $e ) . "\n" );
+                       } else {
+                               wfDebugLog( 'exception', $log );
+                       }
+               }
+       }
+
 }
index 530b094..eff1756 100644 (file)
@@ -28,7 +28,8 @@
 /**
  * Helper class to keep track of options when mixing links and form elements.
  *
- * @todo This badly need some examples and tests :-)
+ * @todo This badly needs some examples and tests :) The usage in SpecialRecentchanges class is a
+ *     good ersatz in the meantime.
  */
 class FormOptions implements ArrayAccess {
        /** @name Type constants
@@ -50,12 +51,26 @@ class FormOptions implements ArrayAccess {
        /* @} */
 
        /**
-        * @todo Document!
+        * Map of known option names to information about them.
+        *
+        * Each value is an array with the following keys:
+        * - 'default' - the default value as passed to add()
+        * - 'value' - current value, start with null, can be set by various functions
+        * - 'consumed' - true/false, whether the option was consumed using
+        *   consumeValue() or consumeValues()
+        * - 'type' - one of the type constants (but never AUTO)
         */
        protected $options = array();
 
        # Setting up
 
+       /**
+        * Add an option to be handled by this FormOptions instance.
+        *
+        * @param string $name Request parameter name
+        * @param mixed $default Default value when the request parameter is not present
+        * @param int $type One of the type constants (optional, defaults to AUTO)
+        */
        public function add( $name, $default, $type = self::AUTO ) {
                $option = array();
                $option['default'] = $default;
@@ -71,20 +86,25 @@ class FormOptions implements ArrayAccess {
                $this->options[$name] = $option;
        }
 
+       /**
+        * Remove an option being handled by this FormOptions instance. This is the inverse of add().
+        *
+        * @param string $name Request parameter name
+        */
        public function delete( $name ) {
                $this->validateName( $name, true );
                unset( $this->options[$name] );
        }
 
        /**
-        * Used to find out which type the data is.
-        * All types are defined in the 'Type constants' section of this class
-        * Please note we do not support detection of INTNULL MediaWiki type
-        * which will be assumed as INT if the data is an integer.
+        * Used to find out which type the data is. All types are defined in the 'Type constants' section
+        * of this class.
         *
-        * @param $data Mixed: value to guess type for
-        * @throws MWException
-        * @exception MWException Unsupported datatype
+        * Detection of the INTNULL type is not supported; INT will be assumed if the data is an integer,
+        * MWException will be thrown if it's null.
+        *
+        * @param mixed $data Value to guess the type for
+        * @throws MWException If unable to guess the type
         * @return int Type constant
         */
        public static function guessType( $data ) {
@@ -102,12 +122,12 @@ class FormOptions implements ArrayAccess {
        # Handling values
 
        /**
-        * Verify the given option name exist.
+        * Verify that the given option name exists.
         *
-        * @param string $name option name
-        * @param $strict Boolean: throw an exception when the option does not exist (default false)
+        * @param string $name Option name
+        * @param bool $strict Throw an exception when the option doesn't exist instead of returning false
         * @throws MWException
-        * @return Boolean: true if option exist, false otherwise
+        * @return bool True if the option exists, false otherwise
         */
        public function validateName( $name, $strict = false ) {
                if ( !isset( $this->options[$name] ) ) {
@@ -117,6 +137,7 @@ class FormOptions implements ArrayAccess {
                                return false;
                        }
                }
+
                return true;
        }
 
@@ -124,9 +145,9 @@ class FormOptions implements ArrayAccess {
         * Use to set the value of an option.
         *
         * @param string $name option name
-        * @param $value Mixed: value for the option
-        * @param $force Boolean: whether to set the value when it is equivalent to the default value for this option (default false).
-        * @return null
+        * @param mixed $value value for the option
+        * @param bool $force Whether to set the value when it is equivalent to
+        * the default value for this option (default false).
         */
        public function setValue( $name, $value, $force = false ) {
                $this->validateName( $name, true );
@@ -144,7 +165,7 @@ class FormOptions implements ArrayAccess {
         * Internally use getValueReal()
         *
         * @param string $name option name
-        * @return Mixed
+        * @return mixed
         */
        public function getValue( $name ) {
                $this->validateName( $name, true );
@@ -155,7 +176,7 @@ class FormOptions implements ArrayAccess {
        /**
         * @todo Document
         * @param array $option array structure describing the option
-        * @return Mixed. Value or the default value if it is null
+        * @return mixed Value or the default value if it is null
         */
        protected function getValueReal( $option ) {
                if ( $option['value'] !== null ) {
@@ -167,9 +188,8 @@ class FormOptions implements ArrayAccess {
 
        /**
         * Delete the option value.
-        * This will make future calls to getValue()  return the default value.
-        * @param string $name option name
-        * @return null
+        * This will make future calls to getValue() return the default value.
+        * @param string $name Option name
         */
        public function reset( $name ) {
                $this->validateName( $name, true );
@@ -177,10 +197,13 @@ class FormOptions implements ArrayAccess {
        }
 
        /**
-        * @todo Document
+        * Get the value of given option and mark it as 'consumed'. Consumed options are not returned
+        * by getUnconsumedValues().
+        *
+        * @see consumeValues()
+        * @throws MWException If the option does not exist
         * @param string $name Option name
-        * @throws MWException If option does not exist.
-        * @return mixed Value or the default value if it is null.
+        * @return mixed Value, or the default value if it is null
         */
        public function consumeValue( $name ) {
                $this->validateName( $name, true );
@@ -190,11 +213,15 @@ class FormOptions implements ArrayAccess {
        }
 
        /**
-        * @todo Document
-        * @param array $names array of option names
-        * @return null
+        * Get the values of given options and mark them as 'consumed'. Consumed options are not returned
+        * by getUnconsumedValues().
+        *
+        * @see consumeValue()
+        * @throws MWException If any option does not exist
+        * @param array $names Array of option names as strings
+        * @return array Array of option values, or the default values if they are null
         */
-       public function consumeValues( /*Array*/ $names ) {
+       public function consumeValues( $names ) {
                $out = array();
 
                foreach ( $names as $name ) {
@@ -213,9 +240,7 @@ class FormOptions implements ArrayAccess {
         * @param string $name option name
         * @param int $min minimum value
         * @param int $max maximum value
-        * @throws MWException
-        * @exception MWException Option is not of type int
-        * @return null
+        * @throws MWException If option is not of type INT
         */
        public function validateIntBounds( $name, $min, $max ) {
                $this->validateName( $name, true );
@@ -231,9 +256,10 @@ class FormOptions implements ArrayAccess {
        }
 
        /**
-        * Getting the data out for use
-        * @param $all Boolean: whether to include unchanged options (default: false)
-        * @return Array
+        * Get all remaining values which have not been consumed by consumeValue() or consumeValues().
+        *
+        * @param bool $all Whether to include unchanged options (default: false)
+        * @return array
         */
        public function getUnconsumedValues( $all = false ) {
                $values = array();
@@ -251,7 +277,7 @@ class FormOptions implements ArrayAccess {
 
        /**
         * Return options modified as an array ( name => value )
-        * @return Array
+        * @return array
         */
        public function getChangedValues() {
                $values = array();
@@ -266,8 +292,8 @@ class FormOptions implements ArrayAccess {
        }
 
        /**
-        * Format options to an array ( name => value)
-        * @return Array
+        * Format options to an array ( name => value )
+        * @return array
         */
        public function getAllValues() {
                $values = array();
@@ -281,12 +307,22 @@ class FormOptions implements ArrayAccess {
 
        # Reading values
 
-       public function fetchValuesFromRequest( WebRequest $r, $values = false ) {
-               if ( !$values ) {
-                       $values = array_keys( $this->options );
+       /**
+        * Fetch values for all options (or selected options) from the given WebRequest, making them
+        * available for accessing with getValue() or consumeValue() etc.
+        *
+        * @param WebRequest $r The request to fetch values from
+        * @param array $optionKeys Which options to fetch the values for (default:
+        *     all of them). Note that passing an empty array will also result in
+        *     values for all keys being fetched.
+        * @throws MWException If the type of any option is invalid
+        */
+       public function fetchValuesFromRequest( WebRequest $r, $optionKeys = null ) {
+               if ( !$optionKeys ) {
+                       $optionKeys = array_keys( $this->options );
                }
 
-               foreach ( $values as $name ) {
+               foreach ( $optionKeys as $name ) {
                        $default = $this->options[$name]['default'];
                        $type = $this->options[$name]['type'];
 
@@ -314,29 +350,26 @@ class FormOptions implements ArrayAccess {
        }
 
        /** @name ArrayAccess functions
-        * Those function implements PHP ArrayAccess interface
+        * These functions implement the ArrayAccess PHP interface.
         * @see http://php.net/manual/en/class.arrayaccess.php
         */
        /* @{ */
-       /**
-        * Whether option exist
-        * @return bool
-        */
+       /** Whether the option exists. */
        public function offsetExists( $name ) {
                return isset( $this->options[$name] );
        }
-       /**
-        * Retrieve an option value
-        * @return Mixed
-        */
+
+       /** Retrieve an option value. */
        public function offsetGet( $name ) {
                return $this->getValue( $name );
        }
-       /**     Set an option to given value */
+
+       /** Set an option to given value. */
        public function offsetSet( $name, $value ) {
                $this->setValue( $name, $value );
        }
-       /**     Delete the option */
+
+       /** Delete the option. */
        public function offsetUnset( $name ) {
                $this->delete( $name );
        }
index 5de34d6..70dc7c7 100644 (file)
@@ -94,7 +94,7 @@
 class HTMLForm extends ContextSource {
 
        // A mapping of 'type' inputs onto standard HTMLFormField subclasses
-       private static $typeMappings = array(
+       public static $typeMappings = array(
                'api' => 'HTMLApiField',
                'text' => 'HTMLTextField',
                'textarea' => 'HTMLTextAreaField',
index fc76310..73834a5 100644 (file)
@@ -39,18 +39,11 @@ define( 'RE_IPV6_ADD',
                ':(?::|(?::' . RE_IPV6_WORD . '){1,7})' .
        '|' . // ends with "::" (except "::")
                RE_IPV6_WORD . '(?::' . RE_IPV6_WORD . '){0,6}::' .
-       '|' . // contains one "::" in the middle, ending in "::WORD"
-               RE_IPV6_WORD . '(?::' . RE_IPV6_WORD . '){0,5}' . '::' . RE_IPV6_WORD .
-       '|' . // contains one "::" in the middle, not ending in "::WORD" (regex for PCRE 4.0+)
-               RE_IPV6_WORD . '(?::(?P<abn>:(?P<iabn>))?' . RE_IPV6_WORD . '(?!:(?P=abn))){1,5}' .
-                       ':' . RE_IPV6_WORD . '(?P=iabn)' .
-               // NOTE: (?!(?P=abn)) fails iff "::" used twice; (?P=iabn) passes iff a "::" was found.
+       '|' . // contains one "::" in the middle (the ^ makes the test fail if none found)
+               RE_IPV6_WORD . '(?::((?(-1)|:))?' . RE_IPV6_WORD . '){1,6}(?(-2)|^)' .
        '|' . // contains no "::"
                RE_IPV6_WORD . '(?::' . RE_IPV6_WORD . '){7}' .
        ')'
-       // NOTE: With PCRE 7.2+, we can combine the two '"::" in the middle' cases into:
-       //              RE_IPV6_WORD . '(?::((?(-1)|:))?' . RE_IPV6_WORD . '){1,6}(?(-2)|^)'
-       // This also improves regex concatenation by using relative references.
 );
 // An IPv6 block is an IP address and a prefix (d1 to d128)
 define( 'RE_IPV6_BLOCK', RE_IPV6_ADD . '\/' . RE_IPV6_PREFIX );
index b5aec77..7256066 100644 (file)
@@ -54,7 +54,7 @@ class ApiOptions extends ApiBase {
                }
 
                if ( $params['reset'] ) {
-                       $user->resetOptions( $params['resetkinds'] );
+                       $user->resetOptions( $params['resetkinds'], $this->getContext() );
                        $changed = true;
                }
 
index 6aa311e..a776706 100644 (file)
@@ -421,6 +421,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['activeusers'] = intval( SiteStats::activeUsers() );
                $data['admins'] = intval( SiteStats::numberingroup( 'sysop' ) );
                $data['jobs'] = intval( SiteStats::jobs() );
+
+               wfRunHooks( 'APIQuerySiteInfoStatisticsInfo', array( &$data ) );
+
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
index d060d4b..71afeba 100644 (file)
  * @ingroup Cache
  */
 class SquidUpdate {
-       var $urlArr, $mMaxTitles;
 
        /**
-        * @param $urlArr array
-        * @param $maxTitles bool|int
+        * Collection of URLs to purge.
+        * @var array
         */
-       function __construct( $urlArr = array(), $maxTitles = false ) {
+       protected $urlArr;
+
+       /**
+        * @param array $urlArr Collection of URLs to purge
+        * @param bool|int $maxTitles Maximum number of unique URLs to purge
+        */
+       public function __construct( $urlArr = array(), $maxTitles = false ) {
                global $wgMaxSquidPurgeTitles;
                if ( $maxTitles === false ) {
-                       $this->mMaxTitles = $wgMaxSquidPurgeTitles;
-               } else {
-                       $this->mMaxTitles = $maxTitles;
+                       $maxTitles = $wgMaxSquidPurgeTitles;
                }
-               $urlArr = array_unique( $urlArr ); // Remove duplicates
-               if ( count( $urlArr ) > $this->mMaxTitles ) {
-                       $urlArr = array_slice( $urlArr, 0, $this->mMaxTitles );
+
+               // Remove duplicate URLs from list
+               $urlArr = array_unique( $urlArr );
+               if ( count( $urlArr ) > $maxTitles ) {
+                       // Truncate to desired maximum URL count
+                       $urlArr = array_slice( $urlArr, 0, $maxTitles );
                }
                $this->urlArr = $urlArr;
        }
 
        /**
-        * @param $title Title
+        * Create a SquidUpdate from the given Title object.
+        *
+        * The resulting SquidUpdate will purge the given Title's URLs as well as
+        * the pages that link to it. Capped at $wgMaxSquidPurgeTitles total URLs.
         *
+        * @param Title $title
         * @return SquidUpdate
         */
-       static function newFromLinksTo( &$title ) {
+       public static function newFromLinksTo( Title $title ) {
                global $wgMaxSquidPurgeTitles;
                wfProfileIn( __METHOD__ );
 
@@ -79,12 +89,11 @@ class SquidUpdate {
        /**
         * Create a SquidUpdate from an array of Title objects, or a TitleArray object
         *
-        * @param $titles array
-        * @param $urlArr array
-        *
+        * @param array $titles
+        * @param array $urlArr
         * @return SquidUpdate
         */
-       static function newFromTitles( $titles, $urlArr = array() ) {
+       public static function newFromTitles( $titles, $urlArr = array() ) {
                global $wgMaxSquidPurgeTitles;
                $i = 0;
                foreach ( $titles as $title ) {
@@ -97,20 +106,19 @@ class SquidUpdate {
        }
 
        /**
-        * @param $title Title
-        *
+        * @param Title $title
         * @return SquidUpdate
         */
-       static function newSimplePurge( &$title ) {
+       public static function newSimplePurge( Title $title ) {
                $urlArr = $title->getSquidURLs();
                return new SquidUpdate( $urlArr );
        }
 
        /**
-        * Purges the list of URLs passed to the constructor
+        * Purges the list of URLs passed to the constructor.
         */
-       function doUpdate() {
-               SquidUpdate::purge( $this->urlArr );
+       public function doUpdate() {
+               self::purge( $this->urlArr );
        }
 
        /**
@@ -119,10 +127,9 @@ class SquidUpdate {
         * (example: $urlArr[] = 'http://my.host/something')
         * XXX report broken Squids per mail or log
         *
-        * @param $urlArr array
-        * @return void
+        * @param array $urlArr List of full URLs to purge
         */
-       static function purge( $urlArr ) {
+       public static function purge( $urlArr ) {
                global $wgSquidServers, $wgHTCPRouting;
 
                if ( !$urlArr ) {
@@ -132,14 +139,18 @@ class SquidUpdate {
                wfDebugLog( 'squid', __METHOD__ . ': ' . implode( ' ', $urlArr ) . "\n" );
 
                if ( $wgHTCPRouting ) {
-                       SquidUpdate::HTCPPurge( $urlArr );
+                       self::HTCPPurge( $urlArr );
                }
 
                wfProfileIn( __METHOD__ );
 
-               $urlArr = array_unique( $urlArr ); // Remove duplicates
-               $maxSocketsPerSquid = 8; //  socket cap per Squid
-               $urlsPerSocket = 400; // 400 seems to be a good tradeoff, opening a socket takes a while
+               // Remove duplicate URLs
+               $urlArr = array_unique( $urlArr );
+               // Maximum number of parallel connections per squid
+               $maxSocketsPerSquid = 8;
+               // Number of requests to send per socket
+               // 400 seems to be a good tradeoff, opening a socket takes a while
+               $urlsPerSocket = 400;
                $socketsPerSquid = ceil( count( $urlArr ) / $urlsPerSocket );
                if ( $socketsPerSquid > $maxSocketsPerSquid ) {
                        $socketsPerSquid = $maxSocketsPerSquid;
@@ -162,14 +173,17 @@ class SquidUpdate {
        }
 
        /**
+        * Send Hyper Text Caching Protocol (HTCP) CLR requests.
+        *
         * @throws MWException
-        * @param $urlArr array
+        * @param array $urlArr Collection of URLs to purge
         */
-       static function HTCPPurge( $urlArr ) {
+       public static function HTCPPurge( $urlArr ) {
                global $wgHTCPRouting, $wgHTCPMulticastTTL;
                wfProfileIn( __METHOD__ );
 
-               $htcpOpCLR = 4; // HTCP CLR
+               // HTCP CLR operation
+               $htcpOpCLR = 4;
 
                // @todo FIXME: PHP doesn't support these socket constants (include/linux/in.h)
                if ( !defined( "IPPROTO_IP" ) ) {
@@ -191,21 +205,23 @@ class SquidUpdate {
                // Set socket options
                socket_set_option( $conn, IPPROTO_IP, IP_MULTICAST_LOOP, 0 );
                if ( $wgHTCPMulticastTTL != 1 ) {
+                       // Set multicast time to live (hop count) option on socket
                        socket_set_option( $conn, IPPROTO_IP, IP_MULTICAST_TTL,
                                $wgHTCPMulticastTTL );
                }
 
-               $urlArr = array_unique( $urlArr ); // Remove duplicates
+               // Remove duplicate URLs from collection
+               $urlArr = array_unique( $urlArr );
                foreach ( $urlArr as $url ) {
                        if ( !is_string( $url ) ) {
                                wfProfileOut( __METHOD__ );
                                throw new MWException( 'Bad purge URL' );
                        }
-                       $url = SquidUpdate::expand( $url );
+                       $url = self::expand( $url );
                        $conf = self::getRuleForURL( $url, $wgHTCPRouting );
                        if ( !$conf ) {
                                wfDebugLog( 'squid', __METHOD__ .
-                                       "No HTCP rule configured for URL $url , skipping\n" );
+                                       "No HTCP rule configured for URL {$url} , skipping\n" );
                                continue;
                        }
 
@@ -260,11 +276,10 @@ class SquidUpdate {
         *
         * Client functions should not need to call this.
         *
-        * @param $url string
-        *
+        * @param string $url
         * @return string
         */
-       static function expand( $url ) {
+       public static function expand( $url ) {
                return wfExpandUrl( $url, PROTO_INTERNAL );
        }
 
@@ -274,7 +289,7 @@ class SquidUpdate {
         * @param array $rules Array of rules, see $wgHTCPRouting for format and behavior
         * @return mixed Element of $rules that matched, or false if nothing matched
         */
-       static function getRuleForURL( $url, $rules ) {
+       private static function getRuleForURL( $url, $rules ) {
                foreach ( $rules as $regex => $routing ) {
                        if ( $regex === '' || preg_match( $regex, $url ) ) {
                                return $routing;
index 7d1c109..b3cd019 100644 (file)
@@ -6712,7 +6712,11 @@ MediaWiki necesita soporte UTF-8 para funcionar correctamente.",
        'config-memory-bad' => "'''Atención:''' O parámetro <code>memory_limit</code> do PHP é $1.
 Probablemente é un valor baixo de máis.
 A instalación pode fallar!",
-       'config-ctype' => "'''Fatal:''' O PHP debe compilarse co soporte para a [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].",
+       'config-ctype' => "'''Erro fatal:''' O PHP debe compilarse co soporte para a [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].",
+       'config-json' => "'''Erro fatal:''' O PHP compilouse sen o soporte de JSON.
+Debe instalar ben a extensión JSON do PHP ou a extensión [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar MediaWiki.
+* A extensión do PHP está incluída en Red Hat Enterprise Linux (CentOS) 5 e 6, mais debe activarse <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.
+* Algunhas distribucións do Linux lanzadas despois de maio de 2013 omiten a extensión do PHP, pero inclúen a extensión PECL como <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] está instalado',
        'config-apc' => '[http://www.php.net/apc APC] está instalado',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado',
@@ -17553,6 +17557,10 @@ MediaWiki требует поддержки UTF-8 для корректной р
 Вероятно, этого слишком мало.
 Установка может потерпеть неудачу!",
        'config-ctype' => "'''Фатальная ошибка:''' PHP должен быть скомпилирован с поддержкой [http://www.php.net/manual/ru/ctype.installation.php расширения Ctype].",
+       'config-json' => "'''Фатальная ошибка:''' PHP был скомпилирован без поддержка JSON.
+Вам необходимо установить либо расширение PHP JSON, либо расширение [http://pecl.php.net/package/jsonc PECL jsonc] перед установкой MediaWiki.
+* PHP-расширение входит в состав Red Hat Enterprise Linux (CentOS) 5 и 6, хотя должна быть включено в <code>/etc/php.ini</code> или <code>/etc/php.d/json.ini</code>.
+* Некоторые дистрибутивы Linux, выпущенные после мая 2013 года, не включают расширение PHP, вместо того, чтобы упаковывать расширение PECL как <code>php5-json</code> или <code>php-pecl-jsonc</code>.",
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] установлен',
        'config-apc' => '[http://www.php.net/apc APC] установлен',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] установлен',
@@ -17753,6 +17761,12 @@ chmod a+w $3</pre>',
 
 Если ваша установка MySQL поддерживает InnoDB, настоятельно рекомендуется выбрать этот механизм.
 Если ваша установка MySQL не поддерживает InnoDB, возможно, настало время обновиться.",
+       'config-mysql-only-myisam-dep' => "'''Предупреждение:''' MyISAM является единственной доступной системой хранения данных для MySQL, которая, однако, не рекомендуется для использования с MediaWiki, потому что:
+ * он слабо поддерживает параллелизм из-за блокировки таблиц
+ * она больше других систем подвержена повреждению
+ * кодовая база MediaWiki не всегда обрабатывает MyISAM так, как следует
+
+Ваша MySQL не поддерживает InnoDB, так что, возможно, настало время для обновления.",
        'config-mysql-engine-help' => "'''InnoDB''' почти всегда предпочтительнее, так как он лучше справляется с параллельным доступом.
 
 '''MyISAM''' может оказаться быстрее для вики с одним пользователем или с минимальным количеством поступающих правок, однако базы данных на нём портятся чаще, чем на InnoDB.",
index 91e1e87..bc2fff1 100644 (file)
@@ -90,10 +90,10 @@ class FormatJson {
         * @return string|bool: String if successful; false upon failure
         */
        public static function encode( $value, $pretty = false, $escaping = 0 ) {
-               if ( version_compare( PHP_VERSION, '5.4.0', '<' ) ) {
-                       return self::encode53( $value, $pretty, $escaping );
+               if ( defined( 'JSON_UNESCAPED_UNICODE' ) ) {
+                       return self::encode54( $value, $pretty, $escaping );
                }
-               return self::encode54( $value, $pretty, $escaping );
+               return self::encode53( $value, $pretty, $escaping );
        }
 
        /**
@@ -103,9 +103,8 @@ class FormatJson {
         * @param bool $assoc When true, returned objects will be converted into associative arrays.
         *
         * @return mixed: the value encoded in JSON in appropriate PHP type.
-        * Values `"true"`, `"false"`, and `"null"` (case-insensitive) are returned as `true`, `false`
-        * and `null` respectively. `null` is returned if the JSON cannot be
-        * decoded or if the encoded data is deeper than the recursion limit.
+        * `null` is returned if the JSON cannot be decoded or if the encoded data is deeper than
+        * the recursion limit.
         */
        public static function decode( $value, $assoc = false ) {
                return json_decode( $value, $assoc );
@@ -121,8 +120,8 @@ class FormatJson {
         */
        private static function encode54( $value, $pretty, $escaping ) {
                // PHP escapes '/' to prevent breaking out of inline script blocks using '</script>',
-               // which is hardly useful when '<' and '>' are escaped, and such escaping negatively
-               // impacts the human readability of URLs and similar strings.
+               // which is hardly useful when '<' and '>' are escaped (and inadequate), and such
+               // escaping negatively impacts the human readability of URLs and similar strings.
                $options = JSON_UNESCAPED_SLASHES;
                $options |= $pretty ? JSON_PRETTY_PRINT : 0;
                $options |= ( $escaping & self::UTF8_OK ) ? JSON_UNESCAPED_UNICODE : 0;
@@ -152,7 +151,11 @@ class FormatJson {
                if ( $json === false ) {
                        return false;
                }
-               $json = str_replace( '\\/', '/', $json ); // emulate JSON_UNESCAPED_SLASHES
+
+               // Emulate JSON_UNESCAPED_SLASHES. Because the JSON contains no unescaped slashes
+               // (only escaped slashes), a simple string replacement works fine.
+               $json = str_replace( '\/', '/', $json );
+
                if ( $escaping & self::UTF8_OK ) {
                        // JSON hex escape sequences follow the format \uDDDD, where DDDD is four hex digits
                        // indicating the equivalent UTF-16 code unit's value. To most efficiently unescape
@@ -166,7 +169,11 @@ class FormatJson {
                        $json = json_decode( preg_replace( "/\\\\\\\\u(?!00[0-7])/", "\\\\u", "\"$json\"" ) );
                        $json = str_replace( self::$badChars, self::$badCharsEscaped, $json );
                }
-               return $pretty ? self::prettyPrint( $json ) : $json;
+
+               if ( $pretty ) {
+                       return self::prettyPrint( $json );
+               }
+               return $json;
        }
 
        /**
@@ -188,14 +195,14 @@ class FormatJson {
                                        break;
                                case '[':
                                case '{':
-                                       $indent++; // falls through
+                                       ++$indent;
+                                       // falls through
                                case ',':
                                        $buf .= $json[$i] . "\n" . str_repeat( '    ', $indent );
                                        break;
                                case ']':
                                case '}':
-                                       $indent--;
-                                       $buf .= "\n" . str_repeat( '    ', $indent ) . $json[$i];
+                                       $buf .= "\n" . str_repeat( '    ', --$indent ) . $json[$i];
                                        break;
                                case '"':
                                        $skip = strcspn( $json, '"', $i + 1 ) + 2;
index 81390dc..19d019d 100644 (file)
@@ -178,12 +178,12 @@ class ResourceLoader {
 
                        // Save filtered text to Memcached
                        $cache->set( $key, $result );
-               } catch ( Exception $exception ) {
-                       $exception->logException();
-                       wfDebugLog( 'resourceloader', __METHOD__ . ": minification failed: $exception" );
+               } catch ( Exception $e ) {
+                       MWExceptionHandler::logException( $e );
+                       wfDebugLog( 'resourceloader', __METHOD__ . ": minification failed: $e" );
                        $this->hasErrors = true;
                        // Return exception as a comment
-                       $result = self::formatException( $exception );
+                       $result = self::formatException( $e );
                }
 
                wfProfileOut( __METHOD__ );
@@ -477,7 +477,7 @@ class ResourceLoader {
                try {
                        $this->preloadModuleInfo( array_keys( $modules ), $context );
                } catch ( Exception $e ) {
-                       $e->logException();
+                       MWExceptionHandler::logException( $e );
                        wfDebugLog( 'resourceloader', __METHOD__ . ": preloading module info failed: $e" );
                        $this->hasErrors = true;
                        // Add exception to the output as a comment
@@ -497,7 +497,7 @@ class ResourceLoader {
                                // Calculate maximum modified time
                                $mtime = max( $mtime, $module->getModifiedTime( $context ) );
                        } catch ( Exception $e ) {
-                               $e->logException();
+                               MWExceptionHandler::logException( $e );
                                wfDebugLog( 'resourceloader', __METHOD__ . ": calculating maximum modified time failed: $e" );
                                $this->hasErrors = true;
                                // Add exception to the output as a comment
@@ -724,7 +724,7 @@ class ResourceLoader {
                        try {
                                $blobs = MessageBlobStore::get( $this, $modules, $context->getLanguage() );
                        } catch ( Exception $e ) {
-                               $e->logException();
+                               MWExceptionHandler::logException( $e );
                                wfDebugLog( 'resourceloader', __METHOD__ . ": pre-fetching blobs from MessageBlobStore failed: $e" );
                                $this->hasErrors = true;
                                // Add exception to the output as a comment
@@ -832,7 +832,7 @@ class ResourceLoader {
                                                break;
                                }
                        } catch ( Exception $e ) {
-                               $e->logException();
+                               MWExceptionHandler::logException( $e );
                                wfDebugLog( 'resourceloader', __METHOD__ . ": generating module package failed: $e" );
                                $this->hasErrors = true;
                                // Add exception to the output as a comment
index c9c7e4e..9ed181e 100644 (file)
@@ -722,21 +722,17 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Generate a cache key for a LESS file.
         *
-        * The cache key varies on the file name, the names and values of global
-        * LESS variables, and the value of $wgShowExceptionDetails. Varying on
-        * $wgShowExceptionDetails ensures the CSS comment indicating compilation
-        * failure shows the right level of detail.
+        * The cache key varies on the file name and the names and values of global
+        * LESS variables.
         *
         * @since 1.22
         * @param string $fileName File name of root LESS file.
         * @return string: Cache key
         */
        protected static function getLESSCacheKey( $fileName ) {
-               global $wgShowExceptionDetails;
-
                $vars = json_encode( ResourceLoader::getLESSVars() );
                $hash = md5( $fileName . $vars );
-               return wfMemcKey( 'resourceloader', 'less', (string)$wgShowExceptionDetails, $hash );
+               return wfMemcKey( 'resourceloader', 'less', $hash );
        }
 
        /**
@@ -753,8 +749,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @return string: CSS source
         */
        protected function compileLESSFile( $fileName ) {
-               global $wgShowExceptionDetails;
-
                $key = self::getLESSCacheKey( $fileName );
                $cache = wfGetCache( CACHE_ANYTHING );
 
@@ -767,34 +761,16 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                }
 
                $compiler = ResourceLoader::getLessCompiler();
-               $expire = 0;
-               try {
-                       $result = $compiler->cachedCompile( $source );
-                       if ( !is_array( $result ) ) {
-                               throw new Exception( 'LESS compiler result has type ' . gettype( $result ) . '; array expected.' );
-                       }
-               } catch ( Exception $e ) {
-                       // The exception might have been caused by an imported file rather
-                       // than the root node. But we don't know which files were imported,
-                       // because compilation failed; we thus cannot rely on file mtime to
-                       // know when to reattempt compilation. Expire in 5 mins. instead.
-                       $expire = 300;
-                       wfDebugLog( 'resourceloader', __METHOD__ . ": $e" );
-                       $result = array();
-                       $result['root'] = $fileName;
-
-                       if ( $wgShowExceptionDetails ) {
-                               $result['compiled'] = ResourceLoader::makeComment( 'LESS error: ' . $e->getMessage() );
-                       } else {
-                               $result['compiled'] = ResourceLoader::makeComment( 'LESS stylesheet compilation failed. ' .
-                                       'Set "$wgShowExceptionDetails = true;" to show detailed debugging information.' );
-                       }
+               $result = null;
 
-                       $result['files'] = array( $fileName => self::safeFilemtime( $fileName ) );
-                       $result['updated'] = time();
+               $result = $compiler->cachedCompile( $source );
+
+               if ( !is_array( $result ) ) {
+                       throw new MWException( 'LESS compiler result has type ' . gettype( $result ) . '; array expected.' );
                }
+
                $this->localFileRefs += array_keys( $result['files'] );
-               $cache->set( $key, $result, $expire );
+               $cache->set( $key, $result );
                return $result['compiled'];
        }
 }
index 784ad04..f1992c0 100644 (file)
@@ -96,8 +96,9 @@ class SpecialBlockList extends SpecialPage {
                                'default' => 50,
                        ),
                );
-               $form = new HTMLForm( $fields, $this->getContext() );
-               $form->setTitle( $this->getTitle() ); // Remove subpage
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getTitle() ); // Remove subpage
+               $form = new HTMLForm( $fields, $context );
                $form->setMethod( 'get' );
                $form->setWrapperLegendMsg( 'ipblocklist-legend' );
                $form->setSubmitTextMsg( 'ipblocklist-submit' );
index b6005de..501552e 100644 (file)
@@ -547,8 +547,9 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        $this->toc = false;
                }
 
-               $form = new EditWatchlistNormalHTMLForm( $fields, $this->getContext() );
-               $form->setTitle( $this->getTitle() );
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getTitle() ); // Remove subpage
+               $form = new EditWatchlistNormalHTMLForm( $fields, $context );
                $form->setSubmitTextMsg( 'watchlistedit-normal-submit' );
                # Used message keys: 'accesskey-watchlistedit-normal-submit', 'tooltip-watchlistedit-normal-submit'
                $form->setSubmitTooltip( 'watchlistedit-normal-submit' );
@@ -610,8 +611,9 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                                'default' => $titles,
                        ),
                );
-               $form = new HTMLForm( $fields, $this->getContext() );
-               $form->setTitle( $this->getTitle( 'raw' ) );
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getTitle( 'raw' ) ); // Reset subpage
+               $form = new HTMLForm( $fields, $context );
                $form->setSubmitTextMsg( 'watchlistedit-raw-submit' );
                # Used message keys: 'accesskey-watchlistedit-raw-submit', 'tooltip-watchlistedit-raw-submit'
                $form->setSubmitTooltip( 'watchlistedit-raw-submit' );
index 27188c3..2e90d99 100644 (file)
@@ -148,11 +148,12 @@ class SpecialEmailUser extends UnlistedSpecialPage {
 
                $this->mTargetObj = $ret;
 
-               $form = new HTMLForm( $this->getFormFields(), $this->getContext() );
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getTitle() ); // Remove subpage
+               $form = new HTMLForm( $this->getFormFields(), $context );
                // By now we are supposed to be sure that $this->mTarget is a user name
                $form->addPreText( $this->msg( 'emailpagetext', $this->mTarget )->parse() );
                $form->setSubmitTextMsg( 'emailsend' );
-               $form->setTitle( $this->getTitle() );
                $form->setSubmitCallback( array( __CLASS__, 'uiSubmit' ) );
                $form->setWrapperLegendMsg( 'email-legend' );
                $form->loadData();
index 814e213..37d2973 100644 (file)
@@ -181,8 +181,9 @@ class NewFilesPager extends ReverseChronologicalPager {
                        unset( $fields['like'] );
                }
 
-               $form = new HTMLForm( $fields, $this->getContext() );
-               $form->setTitle( $this->getTitle() );
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getTitle() ); // Remove subpage
+               $form = new HTMLForm( $fields, $context );
                $form->setSubmitTextMsg( 'ilsubmit' );
                $form->setMethod( 'get' );
                $form->setWrapperLegendMsg( 'newimages-legend' );
index fe91ada..ce7a45b 100644 (file)
@@ -75,10 +75,11 @@ class SpecialPreferences extends SpecialPage {
 
                $this->getOutput()->addWikiMsg( 'prefs-reset-intro' );
 
-               $htmlForm = new HTMLForm( array(), $this->getContext(), 'prefs-restore' );
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getTitle( 'reset' ) ); // Reset subpage
+               $htmlForm = new HTMLForm( array(), $context, 'prefs-restore' );
 
                $htmlForm->setSubmitTextMsg( 'restoreprefs' );
-               $htmlForm->setTitle( $this->getTitle( 'reset' ) );
                $htmlForm->setSubmitCallback( array( $this, 'submitReset' ) );
                $htmlForm->suppressReset();
 
@@ -91,7 +92,7 @@ class SpecialPreferences extends SpecialPage {
                }
 
                $user = $this->getUser();
-               $user->resetOptions( 'all' );
+               $user->resetOptions( 'all', $this->getContext() );
                $user->saveSettings();
 
                $url = $this->getTitle()->getFullURL( 'success' );
index 60cdb0e..a42a217 100644 (file)
@@ -41,16 +41,17 @@ class SpecialRecentChanges extends IncludableSpecialPage {
         */
        public function getDefaultOptions() {
                $opts = new FormOptions();
+               $user = $this->getUser();
 
-               $opts->add( 'days', $this->getUser()->getIntOption( 'rcdays' ) );
-               $opts->add( 'limit', $this->getUser()->getIntOption( 'rclimit' ) );
+               $opts->add( 'days', $user->getIntOption( 'rcdays' ) );
+               $opts->add( 'limit', $user->getIntOption( 'rclimit' ) );
                $opts->add( 'from', '' );
 
-               $opts->add( 'hideminor', $this->getUser()->getBoolOption( 'hideminor' ) );
+               $opts->add( 'hideminor', $user->getBoolOption( 'hideminor' ) );
                $opts->add( 'hidebots', true );
                $opts->add( 'hideanons', false );
                $opts->add( 'hideliu', false );
-               $opts->add( 'hidepatrolled', $this->getUser()->getBoolOption( 'hidepatrolled' ) );
+               $opts->add( 'hidepatrolled', $user->getBoolOption( 'hidepatrolled' ) );
                $opts->add( 'hidemyself', false );
 
                $opts->add( 'namespace', '', FormOptions::INTNULL );
@@ -154,7 +155,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $opts = $this->getOptions();
                $this->setHeaders();
                $this->outputHeader();
-               $this->addRecentChangesJS();
+               $this->addModules();
 
                // Fetch results, prepare a batch link existence check query
                $conds = $this->buildMainQueryConds( $opts );
@@ -911,9 +912,9 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        }
 
        /**
-        * Add JavaScript to the page
+        * Add page-specific modules.
         */
-       function addRecentChangesJS() {
+       protected function addModules() {
                $this->getOutput()->addModules( array(
                        'mediawiki.special.recentchanges',
                ) );
index 7e34e98..077e7cb 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialTags extends SpecialPage {
+       /**
+        * @var array List of defined tags
+        */
+       public $definedTags;
 
        function __construct() {
                parent::__construct( 'Tags' );
@@ -55,7 +59,11 @@ class SpecialTags extends SpecialPage {
                        $html .= $this->doTagRow( $tag, $hitcount );
                }
 
-               $out->addHTML( Xml::tags( 'table', array( 'class' => 'wikitable sortable mw-tags-table' ), $html ) );
+               $out->addHTML( Xml::tags(
+                       'table',
+                       array( 'class' => 'wikitable sortable mw-tags-table' ),
+                       $html
+               ) );
        }
 
        function doTagRow( $tag, $hitcount ) {
@@ -66,7 +74,10 @@ class SpecialTags extends SpecialPage {
                $disp = ChangeTags::tagDescription( $tag );
                if ( $user->isAllowed( 'editinterface' ) ) {
                        $disp .= ' ';
-                       $editLink = Linker::link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag" ), $this->msg( 'tags-edit' )->escaped() );
+                       $editLink = Linker::link(
+                               Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag" ),
+                               $this->msg( 'tags-edit' )->escaped()
+                       );
                        $disp .= $this->msg( 'parentheses' )->rawParams( $editLink )->escaped();
                }
                $newRow .= Xml::tags( 'td', null, $disp );
@@ -75,16 +86,26 @@ class SpecialTags extends SpecialPage {
                $desc = !$msg->exists() ? '' : $msg->parse();
                if ( $user->isAllowed( 'editinterface' ) ) {
                        $desc .= ' ';
-                       $editDescLink = Linker::link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag-description" ), $this->msg( 'tags-edit' )->escaped() );
+                       $editDescLink = Linker::link(
+                               Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag-description" ),
+                               $this->msg( 'tags-edit' )->escaped()
+                       );
                        $desc .= $this->msg( 'parentheses' )->rawParams( $editDescLink )->escaped();
                }
                $newRow .= Xml::tags( 'td', null, $desc );
 
-               $active = $this->msg( isset( $this->definedTags[$tag] ) ? 'tags-active-yes' : 'tags-active-no' )->escaped();
+               $active = isset( $this->definedTags[$tag] ) ? 'tags-active-yes' : 'tags-active-no';
+               $active = $this->msg( $active )->escaped();
                $newRow .= Xml::tags( 'td', null, $active );
 
                $hitcountLabel = $this->msg( 'tags-hitcount' )->numParams( $hitcount )->escaped();
-               $hitcountLink = Linker::link( SpecialPage::getTitleFor( 'Recentchanges' ), $hitcountLabel, array(), array( 'tagfilter' => $tag ) );
+               $hitcountLink = Linker::link(
+                       SpecialPage::getTitleFor( 'Recentchanges' ),
+                       $hitcountLabel,
+                       array(),
+                       array( 'tagfilter' => $tag )
+               );
+
                // add raw $hitcount for sorting, because tags-hitcount contains numbers and letters
                $newRow .= Xml::tags( 'td', array( 'data-sort-value' => $hitcount ), $hitcountLink );
 
index 51a0a86..09facf4 100644 (file)
@@ -221,6 +221,8 @@ class SpecialUpload extends SpecialPage {
         */
        protected function getUploadForm( $message = '', $sessionKey = '', $hideIgnoreWarning = false ) {
                # Initialize form
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getTitle() ); // Remove subpage
                $form = new UploadForm( array(
                        'watch' => $this->getWatchCheck(),
                        'forreupload' => $this->mForReUpload,
@@ -232,8 +234,7 @@ class SpecialUpload extends SpecialPage {
                        'texttop' => $this->uploadFormTextTop,
                        'textaftersummary' => $this->uploadFormTextAfterSummary,
                        'destfile' => $this->mDesiredDestName,
-               ), $this->getContext() );
-               $form->setTitle( $this->getTitle() );
+               ), $context );
 
                # Check the token, but only if necessary
                if (
index 002e949..87b6442 100644 (file)
@@ -343,15 +343,16 @@ class SpecialUploadStash extends UnlistedSpecialPage {
                // create the form, which will also be used to execute a callback to process incoming form data
                // this design is extremely dubious, but supposedly HTMLForm is our standard now?
 
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getTitle() ); // Remove subpage
                $form = new HTMLForm( array(
                        'Clear' => array(
                                'type' => 'hidden',
                                'default' => true,
                                'name' => 'clear',
                        )
-               ), $this->getContext(), 'clearStashedUploads' );
+               ), $context, 'clearStashedUploads' );
                $form->setSubmitCallback( array( __CLASS__, 'tryClearStashedUploads' ) );
-               $form->setTitle( $this->getTitle() );
                $form->setSubmitTextMsg( 'uploadstash-clear' );
 
                $form->prepareForm();
index 59f0dfe..11632a3 100644 (file)
@@ -100,7 +100,7 @@ class SpecialWatchlist extends SpecialPage {
 
                // @todo use FormOptions!
                $defaults = array(
-               /* float */ 'days' => floatval( $user->getOption( 'watchlistdays' ) ), /* 3.0 or 0.5, watch further below */
+               /* float */ 'days' => floatval( $user->getOption( 'watchlistdays' ) ),
                /* bool  */ 'hideMinor' => (int)$user->getBoolOption( 'watchlisthideminor' ),
                /* bool  */ 'hideBots' => (int)$user->getBoolOption( 'watchlisthidebots' ),
                /* bool  */ 'hideAnons' => (int)$user->getBoolOption( 'watchlisthideanons' ),
@@ -121,7 +121,7 @@ class SpecialWatchlist extends SpecialPage {
                # Extract variables from the request, falling back to user preferences or
                # other default values if these don't exist
                $values = array();
-               $values['days'] = $request->getVal( 'days', $defaults['days'] );
+               $values['days'] = floatval( $request->getVal( 'days', $defaults['days'] ) );
                $values['hideMinor'] = (int)$request->getBool( 'hideMinor', $defaults['hideMinor'] );
                $values['hideBots'] = (int)$request->getBool( 'hideBots', $defaults['hideBots'] );
                $values['hideAnons'] = (int)$request->getBool( 'hideAnons', $defaults['hideAnons'] );
@@ -158,18 +158,6 @@ class SpecialWatchlist extends SpecialPage {
                $values['invert'] = $invert;
                $values['associated'] = $associated;
 
-               if ( is_null( $values['days'] ) || !is_numeric( $values['days'] ) ) {
-                       $big = 1000; /* The magical big */
-                       if ( $nitems > $big ) {
-                               # Set default cutoff shorter
-                               $values['days'] = $defaults['days'] = ( 12.0 / 24.0 ); # 12 hours...
-                       } else {
-                               $values['days'] = $defaults['days']; # default cutoff for shortlisters
-                       }
-               } else {
-                       $values['days'] = floatval( $values['days'] );
-               }
-
                // Dump everything here
                $nondefaults = array();
                foreach ( $defaults as $name => $defValue ) {
@@ -191,14 +179,6 @@ class SpecialWatchlist extends SpecialPage {
                        $conds[] = 'rc_timestamp > ' . $dbr->addQuotes( $dbr->timestamp( time() - intval( $values['days'] * 86400 ) ) );
                }
 
-               # If the watchlist is relatively short, it's simplest to zip
-               # down its entirety and then sort the results.
-
-               # If it's relatively long, it may be worth our while to zip
-               # through the time-sorted page list checking for watched items.
-
-               # Up estimate of watched items by 15% to compensate for talk pages...
-
                # Toggles
                if ( $values['hideOwn'] ) {
                        $conds[] = 'rc_user != ' . $user->getId();
index 088e6a8..78c9bdc 100644 (file)
@@ -658,6 +658,9 @@ No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITEN
 'userlogin-resetpassword-link' => 'Reinicia la contrasenya',
 'helplogin-url' => 'Help:Registrar-se',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda]]',
+'userlogin-loggedin' => 'Heu iniciat una sessió com {{GENDER:$1|$1}}.
+Feu servir el formulari de sota per iniciar la sessió com un altre usuari.',
+'userlogin-createanother' => 'Crea un altre compte',
 'createacct-join' => 'Introduïu les vostres dades.',
 'createacct-another-join' => 'Introdueix la informació del nou compte a continuació:',
 'createacct-emailrequired' => 'Adreça de correu electrònic',
@@ -1450,6 +1453,8 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'userrights-notallowed' => "No teniu autorització per concedir o retirar permisos d'usuari.",
 'userrights-changeable-col' => 'Grups que podeu canviar',
 'userrights-unchangeable-col' => 'Grups que no podeu canviar',
+'userrights-conflict' => "Conflicte de canvis dels permisos d'usuari. Reviseu i confirmeu els canvis.",
+'userrights-removed-self' => 'Heu suprimit els propis permisos correctament. Per tant, ja no podreu tornar a accedir a aquesta pàgina.',
 
 # Groups
 'group' => 'Grup:',
@@ -1516,11 +1521,17 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'right-unblockself' => 'Desblocar-se a si mateixos',
 'right-protect' => 'Canviar el nivell de protecció i modificar pàgines protegides',
 'right-editprotected' => 'Modificar pàgines protegides (sense protecció de cascada)',
+'right-editsemiprotected' => 'Edita les pàgines protegides com «{{int:protect-level-autoconfirmed}}»',
 'right-editinterface' => "Editar la interfície d'usuari",
 'right-editusercssjs' => "Editar els fitxers de configuració CSS i JS d'altres usuaris",
 'right-editusercss' => "Editar els fitxers de configuració CSS d'altres usuaris",
 'right-edituserjs' => "Editar els fitxers de configuració JS d'altres usuaris",
+'right-editmyusercss' => 'Editeu els fitxers CSS propis',
+'right-editmyuserjs' => 'Editeu els propis fitxers de JavaScript',
 'right-viewmywatchlist' => 'Mostra la llista de seguiment pròpia',
+'right-editmywatchlist' => 'Edita la llista de seguiment pròpia. Tingueu en compte que algunes accions encara afegiran pàgina fins i tot sense aquest permís.',
+'right-viewmyprivateinfo' => 'Mostra les dades privades (p. ex., adreça electrònica o nom real)',
+'right-editmyprivateinfo' => 'Modifica les dades privades  (p. ex., adreça electrònica o nom real)',
 'right-editmyoptions' => 'Edita les pròpies preferències',
 'right-rollback' => "Revertir ràpidament l'últim editor d'una pàgina particular",
 'right-markbotedits' => 'Marcar les reversions com a edicions de bot',
@@ -1573,8 +1584,8 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'action-block' => 'blocar aquest usuari per a què no pugui editar',
 'action-protect' => "canviar els nivells de protecció d'aquesta pàgina",
 'action-rollback' => "desfer ràpidament les modificacions de l'últim usuari que va editar una determinada pàgina",
-'action-import' => "importar aquesta pàgina des d'un altre wiki",
-'action-importupload' => "importar aquesta pàgina mitjançant la càrrega des d'un fitxer",
+'action-import' => "importa pàgines des d'un altre wiki",
+'action-importupload' => "importa pàgines mitjançant la càrrega d'un fitxer",
 'action-patrol' => 'marcar les edicions dels altres com a supervisades',
 'action-autopatrol' => 'marcar les vostres edicions com a supervisades',
 'action-unwatchedpages' => 'visualitzar la llista de pàgines no vigilades',
@@ -2011,6 +2022,8 @@ Potser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].
 'pageswithprop-text' => 'Aquesta pàgina llista les pàgines que utilitzen una propietat de pàgina en particular.',
 'pageswithprop-prop' => 'Nom de la propietat:',
 'pageswithprop-submit' => 'Vés',
+'pageswithprop-prophidden-long' => 'valor de propietat text llarg ocult ($1)',
+'pageswithprop-prophidden-binary' => 'valor de propietat binària oculta ($1)',
 
 'doubleredirects' => 'Redireccions dobles',
 'doubleredirectstext' => 'Aquesta pàgina llista les pàgines que redirigeixen a altres pàgines de redirecció.
@@ -2068,6 +2081,7 @@ Les entrades <del>ratllades</del> s\'han resolt.',
 'mostrevisions' => 'Pàgines més modificades',
 'prefixindex' => 'Totes les pàgines per prefix',
 'prefixindex-namespace' => 'Totes les pàgines amb prefix (espai de noms $1)',
+'prefixindex-strip' => 'Suprimeix el prefix a la llista',
 'shortpages' => 'Pàgines curtes',
 'longpages' => 'Pàgines llargues',
 'deadendpages' => 'Pàgines atzucac',
@@ -2083,6 +2097,7 @@ Les entrades <del>ratllades</del> s\'han resolt.',
 'listusers' => "Llista d'usuaris",
 'listusers-editsonly' => 'Mostra només usuaris amb edicions',
 'listusers-creationsort' => 'Ordena per data de creació',
+'listusers-desc' => 'Ordena en ordre descendent',
 'usereditcount' => '$1 {{PLURAL:$1|modificació|modificacions}}',
 'usercreated' => '{{GENDER:$3|Creat}}: $1 a les $2',
 'newpages' => 'Pàgines noves',
@@ -2367,7 +2382,7 @@ de l'usuari [[User:$2|$2]] ([[User talk:$2|Discussió]]{{int:pipe-separator}}[[S
 La darrera modificació ha estat feta per l'usuari [[User:$3|$3]] ([[User talk:$3|Discussió]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
 'editcomment' => "El resum d'edició ha estat: «$1».",
 'revertpage' => "Revertides les edicions de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussió]]) a l'última versió de [[User:$1|$1]]",
-'revertpage-nouser' => "Les edicions realitzades per un usuari ocult s'han eliminat fins a l'última revisió de [[User:$1|$1]]",
+'revertpage-nouser' => "Edicions revertides per un usuari ocult a l'última revisió de {{GENDER:$1|[[User:$1|$1]]}}",
 'rollback-success' => "Edicions revertides de $1; s'ha canviat a la darrera versió de $2.",
 
 # Edit tokens
@@ -2507,7 +2522,7 @@ $1",
 'contributions' => "Contribucions de {{GENDER:$1|l'usuari|la usuària}}",
 'contributions-title' => "Contribucions de l'usuari $1",
 'mycontris' => 'Contribucions',
-'contribsub2' => 'Per $1 ($2)',
+'contribsub2' => 'Per a {{GENDER:$3|$1}} ($2)',
 'nocontribs' => "No s'ha trobat canvis que encaixessin amb aquests criteris.",
 'uctop' => '(actual)',
 'month' => 'Mes (i anteriors):',
@@ -3791,6 +3806,7 @@ Amb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còp
 # Special:Redirect
 'redirect' => 'Redirigeix per fitxer, usuari o ID de la revisió',
 'redirect-legend' => 'Redirigeix a un fitxer o a una pàgina',
+'redirect-summary' => "Aquesta pàgina especial redirigeix a un fitxer (donat el nom del fitxer), una pàgina (donada un ID de la revisió), o a una pàgina d'usuari (donat un ID numèric d'usuari).",
 'redirect-submit' => 'Vés-hi',
 'redirect-lookup' => 'Consulta:',
 'redirect-value' => 'Valor:',
@@ -3853,7 +3869,9 @@ Amb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còp
 'tags-tag' => "Nom de l'etiqueta",
 'tags-display-header' => 'Aparença de la llista de canvis',
 'tags-description-header' => 'Descripció completa del significat',
+'tags-active-header' => 'Actiu?',
 'tags-hitcount-header' => 'Canvis etiquetats',
+'tags-active-yes' => 'Sí',
 'tags-edit' => 'modifica',
 'tags-hitcount' => '$1 {{PLURAL:$1|canvi|canvis}}',
 
@@ -4019,9 +4037,9 @@ Altrament, podeu fer servir un senzill formulari a continuació. El vostre comen
 'limitreport-ppvisitednodes' => 'Nombre de nodes visitats pel preprocessador',
 'limitreport-ppgeneratednodes' => 'Nombre de nodes generats pel preprocessador',
 'limitreport-postexpandincludesize' => "Mida d'inclusió post-expansió",
-'limitreport-postexpandincludesize-value' => '$1/$2 bytes',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
 'limitreport-templateargumentsize' => "Mida de l'argument de plantilla",
-'limitreport-templateargumentsize-value' => '$1/$2 bytes',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
 'limitreport-expansiondepth' => "Profunditat màxima d'expansió",
 'limitreport-expensivefunctioncount' => "Número de funcions d'anàlisi dispendioses",
 
index 8fcdb81..a85c937 100644 (file)
@@ -1521,13 +1521,13 @@ PICT # тайп тайпан
 'logempty' => 'Тептарш чохь хӀокху агӀона дӀаяздарш дац.',
 
 # Special:AllPages
-'allpages' => 'Массо агlонаш',
+'allpages' => 'Массо агӀонаш',
 'alphaindexline' => 'оцу $1 кху $2',
 'nextpage' => 'Тlаьхьа йогlу агlо ($1)',
 'prevpage' => 'Хьалхалера агlо ($1)',
 'allpagesfrom' => 'Гучé яха агlонаш, йуьлалуш йолу оцу:',
 'allpagesto' => 'Арайахар сацадé оцу:',
-'allarticles' => 'Массо агlонаш',
+'allarticles' => 'Массо агӀонаш',
 'allinnamespace' => 'Массо агlонаш оцу цlери анахь «$1»',
 'allpagesnext' => 'Тlаьхьайогlурш',
 'allpagessubmit' => 'Кхочушдé',
@@ -1702,6 +1702,7 @@ PICT # тайп тайпан
 # Restrictions (nouns)
 'restriction-edit' => 'Тадар',
 'restriction-move' => 'ЦӀе хийцар',
+'restriction-create' => 'Кхоллар',
 'restriction-upload' => 'Чуйолуш',
 
 # Restriction levels
@@ -2368,8 +2369,10 @@ PICT # тайп тайпан
 'limitreport-ppvisitednodes' => 'Препроцессор хьаьжна шадин дукхалла',
 'limitreport-ppgeneratednodes' => 'Препроцессорс сгенерировать бина шадин дукхалла',
 'limitreport-postexpandincludesize' => 'Схьаяьстина юккъерчаран барам',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|байт|байташ}}',
 'limitreport-templateargumentsize' => 'Кепан аргументан барам',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|байт|байташ}}',
 'limitreport-expansiondepth' => 'Шордаларан уггар йокха кӀоргалла',
-'limitreport-expensivefunctioncount' => 'Ð\90гÓ\80она Ñ\85Ó\80оÑ\82Ñ\82ам ÐºÑ\8aаÑ\81Ñ\82оÑ\80ан Â«Ð¸за» функцеш',
+'limitreport-expensivefunctioncount' => 'Ð\90гÓ\80она Ñ\85Ó\80оÑ\82Ñ\82ам ÐºÑ\8aаÑ\81Ñ\82оÑ\80ан Â«Ðµза» функцеш',
 
 );
index d68ce61..04e3d8e 100644 (file)
@@ -200,12 +200,12 @@ $messages = array(
 'tog-hidepatrolled' => 'Skjul patruljerede redigeringer i seneste ændringer',
 'tog-newpageshidepatrolled' => 'Skjul patruljerede sider på listen over nye sider',
 'tog-extendwatchlist' => 'Udvid overvågningslisten til at vise alle ændringer og ikke kun den nyeste',
-'tog-usenewrc' => 'Gruppér ændringerne per side i listen over seneste ændringer og overvågningslisten (kræver JavaScript)',
+'tog-usenewrc' => 'Gruppér ændringerne per side i listen over seneste ændringer og i overvågningslisten',
 'tog-numberheadings' => 'Automatisk nummerering af overskrifter',
-'tog-showtoolbar' => 'Vis værktøjslinje til redigering (JavaScript)',
-'tog-editondblclick' => 'Redigér sider med dobbeltklik (JavaScript)',
+'tog-showtoolbar' => 'Vis værktøjslinje til redigering',
+'tog-editondblclick' => 'Redigér sider med dobbeltklik',
 'tog-editsection' => 'Redigér afsnit ved hjælp af [redigér]-henvisninger',
-'tog-editsectiononrightclick' => 'Redigér afsnit ved at højreklikke på deres titler (JavaScript)',
+'tog-editsectiononrightclick' => 'Redigér afsnit ved at højreklikke på deres titler',
 'tog-showtoc' => 'Vis indholdsfortegnelse (på sider med mere end tre afsnit)',
 'tog-rememberpassword' => 'Husk mit login i denne browser (højst $1 {{PLURAL:$1|dag|dage}})',
 'tog-watchcreations' => 'Tilføj sider, jeg opretter, og filer, jeg lægger op, til min overvågningsliste',
@@ -223,7 +223,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Vis antal brugere, der overvåger',
 'tog-oldsig' => 'Nuværende signatur:',
 'tog-fancysig' => 'Behandl signatur som wikitekst uden automatisk henvisning',
-'tog-uselivepreview' => 'Brug automatisk forhåndsvisning (kræver JavaScript og er på forsøgsstadiet)',
+'tog-uselivepreview' => 'Brug automatisk forhåndsvisning (er på forsøgsstadiet)',
 'tog-forceeditsummary' => 'Advar mig hvis jeg ikke udfylder beskrivelsesfeltet',
 'tog-watchlisthideown' => 'Skjul egne ændringer i overvågningslisten',
 'tog-watchlisthidebots' => 'Skjul ændringer fra bots i overvågningslisten',
@@ -338,7 +338,7 @@ $messages = array(
 'newwindow' => '(åbner i et nyt vindue)',
 'cancel' => 'Afbryd',
 'moredotdotdot' => 'Mere...',
-'morenotlisted' => 'Mere ikke angivet...',
+'morenotlisted' => 'Denne liste er ikke komplet.',
 'mypage' => 'Side',
 'mytalk' => 'Diskussion',
 'anontalk' => 'Diskussionsside for denne IP-adresse',
@@ -441,7 +441,7 @@ $1',
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Om {{SITENAME}}',
 'aboutpage' => 'Project:Om',
-'copyright' => 'Indholdet er udgivet under $1.',
+'copyright' => 'Indholdet er udgivet under $1 medmindre andet er angivet.',
 'copyrightpage' => '{{ns:project}}:Ophavsret',
 'currentevents' => 'Aktuelle begivenheder',
 'currentevents-url' => 'Project:Aktuelle begivenheder',
@@ -476,7 +476,7 @@ $1',
 'youhavenewmessagesmulti' => 'Du har nye beskeder på $1',
 'editsection' => 'redigér',
 'editold' => 'redigér',
-'viewsourceold' => 'vis kildekode',
+'viewsourceold' => 'vis wikikode',
 'editlink' => 'redigér',
 'viewsourcelink' => 'vis kildetekst',
 'editsectionhint' => 'Rediger afsnit: $1',
@@ -523,6 +523,12 @@ En liste over gyldige specialsider findes på [[Special:SpecialPages|{{int:speci
 # General errors
 'error' => 'Fejl',
 'databaseerror' => 'Databasefejl',
+'databaseerror-text' => 'Der opstod fejl i en forespørgsel til databasen.
+Dette kan indikere en fejl i softwaren.',
+'databaseerror-textcl' => 'Der opstod fejl i en forespørgsel til databasen.',
+'databaseerror-query' => 'Forespørgsel: $1',
+'databaseerror-function' => 'Funktion: $1',
+'databaseerror-error' => 'Fejl: $1',
 'laggedslavemode' => "'''Bemærk:''' Den viste side indeholder muligvis ikke de nyeste ændringer.",
 'readonly' => 'Databasen er skrivebeskyttet',
 'enterlockreason' => 'Skriv en begrundelse for skrivebeskyttelsen, med samt en vurdering af, hvornår skrivebeskyttelsen ophæves igen',
@@ -644,6 +650,9 @@ Glem ikke at ændre dine [[Special:Preferences|{{SITENAME}} indstillinger]].',
 'userlogin-resetpassword-link' => 'Nulstil din adgangskode',
 'helplogin-url' => 'Help:Logge på',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjælp til at logge på]]',
+'userlogin-loggedin' => 'Du er allerede logget på som {{GENDER:$1|$1}}.
+Brug formularen nedenfor til at logge på som en anden bruger.',
+'userlogin-createanother' => 'Opret en anden konto',
 'createacct-join' => 'Indtast dine oplysninger nedenfor.',
 'createacct-another-join' => 'Angiv den nye kontos oplysninger nedenfor.',
 'createacct-emailrequired' => 'Mailadresse',
@@ -730,6 +739,8 @@ Vent venligst $1, før du prøver igen.',
 'login-abort-generic' => 'Det lykkedes dig ikke at logge på - afbrudt',
 'loginlanguagelabel' => 'Sprog: $1',
 'suspicious-userlogout' => 'Din anmodning om at logge ud blev nægtet, fordi det ser ud som den blev sendt af en ødelagt browser eller caching proxy.',
+'createacct-another-realname-tip' => 'Angivelse af rigtigt navn er valgfrit.
+Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit arbejde.',
 
 # Email sending
 'php-mail-error-unknown' => "Ukendt fejl i PHP's mail()-funtion",
@@ -799,7 +810,17 @@ Midlertidig adgangskode: $2',
 'changeemail-cancel' => 'Afbryd',
 
 # Special:ResetTokens
+'resettokens' => 'Nulstil nøgler',
+'resettokens-text' => 'Du kan nulstille nøgler, som giver adgang til visse private data i forbindelse med din konto her.
+
+Du bør gøre det, hvis du ved et uheld deler dem med nogen, eller hvis din konto er blevet kompromitteret.',
+'resettokens-no-tokens' => 'Der er ingen nøgler at nulstille.',
+'resettokens-legend' => 'Nulstil nøgler',
+'resettokens-tokens' => 'Nøgler:',
 'resettokens-token-label' => '$1(aktuel værdi: $2)',
+'resettokens-watchlist-token' => 'Nøgle for web-feed (Atom/RSS) af [[Special:Watchlist|ændringer af sider på din overvågningsliste]]',
+'resettokens-done' => 'Nøgler er nulstillet.',
+'resettokens-resetbutton' => 'Nulstil valgte nøgler',
 
 # Edit page toolbar
 'bold_sample' => 'Fed tekst',
@@ -1316,7 +1337,7 @@ Du kan prøve at bruge \"all:\" som præfiks for at søge i alt indhold (inkl. d
 'prefs-rendering' => 'Udseende',
 'saveprefs' => 'Gem indstillinger',
 'resetprefs' => 'Gendan indstillinger',
-'restoreprefs' => 'Gendan alle standardindstillinger',
+'restoreprefs' => 'Gendan alle standardindstillinger (i alle sektioner)',
 'prefs-editing' => 'Redigering',
 'rows' => 'Rækker',
 'columns' => 'Kolonner',
@@ -1404,6 +1425,7 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 'prefs-displaywatchlist' => 'Visningsmuligheder',
 'prefs-tokenwatchlist' => 'Mærke',
 'prefs-diffs' => 'Forskelle',
+'prefs-help-prefershttps' => 'Denne indstilling træder i kraft næste gang du logger på.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-mailadressen ser ud til at være gyldig',
@@ -1562,8 +1584,8 @@ Vær venlig at gennemse og bekræft dine ændringer.',
 'action-block' => 'blokere denne bruger fra at redigere',
 'action-protect' => 'ændre på beskyttelsen af denne side',
 'action-rollback' => 'hurtigt gendanne alle redigeringerne foretaget af den bruger, som senest redigerede en bestemt side,',
-'action-import' => 'importere denne side fra en anden wiki',
-'action-importupload' => 'importere denne side fra en filoplægning',
+'action-import' => 'importere sider fra en anden wiki',
+'action-importupload' => 'importere sider fra en filoplægning',
 'action-patrol' => 'patruljere andres redigeringer',
 'action-autopatrol' => 'patruljere din redigering',
 'action-unwatchedpages' => 'se listen over uovervågede sider',
@@ -1579,6 +1601,8 @@ Vær venlig at gennemse og bekræft dine ændringer.',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|ændring|ændringer}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|siden sidste besøg}}',
+'enhancedrc-history' => 'historik',
 'recentchanges' => 'Seneste ændringer',
 'recentchanges-legend' => 'Indstillinger for seneste ændringer',
 'recentchanges-summary' => "På denne side kan du følge de seneste ændringer på '''{{SITENAME}}'''.",
@@ -1870,8 +1894,7 @@ For optimal sikkerhed er img_auth.php deaktiveret.",
 'upload_source_file' => ' (en fil på din computer)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Denne specialside viser alle oplagte filer.
-Når der filtreres efter bruger, vil kun filer, hvor den pågældende bruger lagde den seneste version af filen op, blive vist.',
+'listfiles-summary' => 'Denne specialside viser alle oplagte filer.',
 'listfiles_search_for' => 'Søge efter fil:',
 'imgfile' => 'Fil',
 'listfiles' => 'Filliste',
@@ -1882,6 +1905,10 @@ Når der filtreres efter bruger, vil kun filer, hvor den pågældende bruger lag
 'listfiles_size' => 'Størrelse (Byte)',
 'listfiles_description' => 'Beskrivelse',
 'listfiles_count' => 'Versioner',
+'listfiles-show-all' => 'Vis også gamle versioner af billeder',
+'listfiles-latestversion' => 'Nuværende version',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nej',
 
 # File description page
 'file-anchor-link' => 'Fil',
@@ -2015,8 +2042,8 @@ Husk at kontrollere for andre henvisninger til skabelonerne før de slettes.',
 'pageswithprop-text' => 'Denne side viser en liste over sider, der har en bestemt sideegenskab.',
 'pageswithprop-prop' => 'Egenskabsnavn:',
 'pageswithprop-submit' => 'Vis',
-'pageswithprop-prophidden-long' => 'lang tekst egenskabsværdien skjult ($1 KB)',
-'pageswithprop-prophidden-binary' => 'binære egenskabsværdien skjult ($1 KB)',
+'pageswithprop-prophidden-long' => 'lang tekst værdi for egenskaben skjult ($1)',
+'pageswithprop-prophidden-binary' => 'binær værdi for egenskaben skjult ($1)',
 
 'doubleredirects' => 'Dobbelte omdirigeringer',
 'doubleredirectstext' => 'Dette er en liste over sider som omdirigerer til andre omdirigeringssider.
@@ -2090,6 +2117,7 @@ Hver linje indeholder henvisninger til den første og den anden omdirigering, s
 'listusers' => 'Brugerliste',
 'listusers-editsonly' => 'Vis kun brugere med redigeringer',
 'listusers-creationsort' => 'Sorter efter oprettelsesdato',
+'listusers-desc' => 'Sortér i faldende rækkefølge',
 'usereditcount' => '{{PLURAL:$1|én redigering|$1 redigeringer}}',
 'usercreated' => '{{GENDER:$3|Oprettet}} den $1 $2',
 'newpages' => 'Nyeste sider',
@@ -2373,7 +2401,7 @@ en anden har allerede redigeret siden eller fjernet redigeringen.
 Den seneste redigering er foretaget af [[User:$3|$3]] ([[User talk:$3|diskussion]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "Redigeringsbeskrivelsen var: \"''\$1''\".",
 'revertpage' => 'Gendannet til seneste version af [[User:$1|$1]], fjerner ændringer fra [[Special:Contributions/$2|$2]] ([[User talk:$2|diskussion]])',
-'revertpage-nouser' => 'Gendannet til seneste version af [[User:$1|$1]], fjerner ændringer fra en skjult bruger',
+'revertpage-nouser' => 'Gendannet til seneste version af {{GENDER:$1|[[User:$1|$1]]}}, fjerner ændringer fra en skjult bruger',
 'rollback-success' => 'Ændringerne fra $1 er fjernet,
 og den seneste version af $2 er gendannet.',
 
@@ -3837,7 +3865,10 @@ Du skulle have modtaget [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopi af GNU General
 'tags-tag' => 'Tagnavn',
 'tags-display-header' => 'Udseende på ændringslister',
 'tags-description-header' => 'Beskrivelse af betydning',
+'tags-active-header' => 'Aktivt?',
 'tags-hitcount-header' => 'Taggede ændringer',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nej',
 'tags-edit' => 'Redigér',
 'tags-hitcount' => '{{PLURAL:$1|en ændring|$1 ændringer}}',
 
@@ -3858,6 +3889,7 @@ Du skulle have modtaget [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopi af GNU General
 'dberr-problems' => 'Undskyld! Siden har tekniske problemer.',
 'dberr-again' => 'Prøv at vente et par minutter og opdater så siden igen.',
 'dberr-info' => '(Kan ikke komme i kontakt med databaseserveren: $1)',
+'dberr-info-hidden' => '(Kan ikke komme i kontakt med databaseserveren)',
 'dberr-usegoogle' => 'Du kan prøve at søge med Google imens.',
 'dberr-outofdate' => 'Bemærk at deres indeks over vores sider kan være forældet.',
 'dberr-cachederror' => 'Det følgende er en mellemlagret kopi af den forespurgte side. Den kan være forældet.',
@@ -3994,9 +4026,16 @@ Ellers kan du bruge den enkle formular nedenfor. Din kommentar vil blive tilføj
 'rotate-comment' => 'Billedet roteres med $1 {{PLURAL:$1| grad|grader}} med uret',
 
 # Limit report
+'limitreport-title' => 'Profildata for parser:',
 'limitreport-cputime' => 'Brugt CPU-tid',
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekund|sekunder}}',
 'limitreport-walltime' => 'Brugt reel tid',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekund|sekunder}}',
+'limitreport-ppvisitednodes' => 'Antal nodebesøg for preprocessor',
+'limitreport-ppgeneratednodes' => 'Antal noder genereret af preprocessor',
+'limitreport-postexpandincludesize' => 'Inkluderet størrelse efter udvidelse',
+'limitreport-templateargumentsize' => 'Skabelon argumentstørrelse',
+'limitreport-expansiondepth' => 'Største udvidelsesdybde',
+'limitreport-expensivefunctioncount' => 'Antal dyre parserfunktioner',
 
 );
index faaccd2..8d6557f 100644 (file)
@@ -3056,10 +3056,12 @@ See $2 for a record of recent deletions.',
 'deletecomment'          => 'Reason:',
 'deleteotherreason'      => 'Other/additional reason:',
 'deletereasonotherlist'  => 'Other reason',
-'deletereason-dropdown'  => '*Common delete reasons
-** Author request
+'deletereason-dropdown'  => '* Common delete reasons
+** Spam
+** Vandalism
 ** Copyright violation
-** Vandalism',
+** Author request
+** Broken redirect',
 'delete-edit-reasonlist' => 'Edit deletion reasons',
 'delete-toobig'          => 'This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.
 Deletion of such pages has been restricted to prevent accidental disruption of {{SITENAME}}.',
index 681ab4a..814f04b 100644 (file)
@@ -831,6 +831,8 @@ No olvides personalizar tus [[Special:Preferences|preferencias de {{SITENAME}}]]
 'userlogin-resetpassword-link' => 'Restablecer la contraseña',
 'helplogin-url' => 'Help:Inicio de sesión',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ayuda]]',
+'userlogin-loggedin' => 'Ya estás conectado como {{GENDER:$1|$1}}.
+Usa el formulario de abajo para iniciar sesión como otro usuario.',
 'userlogin-createanother' => 'Crear otra cuenta',
 'createacct-join' => 'Introduce tus datos debajo.',
 'createacct-another-join' => 'Introduzca la información de la nueva cuenta a continuación.',
@@ -2734,7 +2736,7 @@ $1',
 'contributions' => 'Contribuciones {{GENDER:$1|del usuario|de la usuaria}}',
 'contributions-title' => 'Contribuciones {{GENDER:$1|del usuario|de la usuaria}} $1',
 'mycontris' => 'Contribuciones',
-'contribsub2' => '$1 ($2)',
+'contribsub2' => 'Para {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'No se encontraron cambios que cumplieran estos criterios.',
 'uctop' => '(edición actual)',
 'month' => 'Desde el mes (y anteriores):',
@@ -4268,5 +4270,6 @@ En otro caso, puedes usar el siguiente formulario. Tu comentario será añadido
 'limitreport-templateargumentsize' => 'Argumento del tamaño de la plantilla',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
 'limitreport-expansiondepth' => 'Profundidad máxima de expansión',
+'limitreport-expensivefunctioncount' => 'Cuenta de la funcion expansiva del analizador',
 
 );
index 94842dc..712463b 100644 (file)
@@ -774,6 +774,8 @@ $1',
 'databaseerror' => 'خطای پایگاه داده',
 'databaseerror-text' => 'مشکلی در پایگاه داده ها رخ داده است. 
 این ممکن است نشان دهنده یک مشکل در نرم افزار باشد.',
+'databaseerror-textcl' => 'خطای پایگاه داده پرس و جو رخ داده است.',
+'databaseerror-query' => 'پرس و جو:$1',
 'databaseerror-function' => 'تابع: $1',
 'databaseerror-error' => 'خطا: $1',
 'laggedslavemode' => "'''هشدار:''' صفحه ممکن است به‌روزرسانی‌های اخیر را شامل نشود.",
@@ -1697,6 +1699,7 @@ $1",
 'prefs-displayrc' => 'گزینه‌های نمایش',
 'prefs-displaysearchoptions' => 'گزینه‌های نمایش',
 'prefs-displaywatchlist' => 'گزینه‌های نمایش',
+'prefs-tokenwatchlist' => 'نشانه',
 'prefs-diffs' => 'تفاوت‌ها',
 'prefs-help-prefershttps' => 'تاثیر این ترجیح بعد از ورود بعدی شما اعمال خواهد شد.',
 
@@ -2319,6 +2322,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'pageswithprop-text' => 'این صفحه فهرستی است از صفحه‌هایی که از یک خاصیت صفحهٔ خاص استفاده می‌کنند.',
 'pageswithprop-prop' => 'نام خاصیت:',
 'pageswithprop-submit' => 'برو',
+'pageswithprop-prophidden-long' => 'جزییات مخفی متن طولانی ($1)',
+'pageswithprop-prophidden-binary' => 'جزییات مقدار مخفی باینری ($1)',
 
 'doubleredirects' => 'تغییرمسیرهای دوتایی',
 'doubleredirectstext' => 'این صفحه فهرستی از صفحه‌های تغییرمسیری را ارائه می‌کند که به صفحهٔ تغییرمسیر دیگری اشاره می‌کنند.
@@ -2376,6 +2381,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'mostrevisions' => 'صفحه‌های دارای بیشترین نسخه',
 'prefixindex' => 'تمام صفحه‌ها با پیشوند',
 'prefixindex-namespace' => 'همهٔ صفحه‌های دارای پیشوند (فضای‌نام $1)',
+'prefixindex-strip' => ' حذف پیشوند در فهرست',
 'shortpages' => 'صفحه‌های کوتاه',
 'longpages' => 'صفحه‌های بلند',
 'deadendpages' => 'صفحه‌های بن‌بست',
@@ -2678,7 +2684,7 @@ $PAGEINTRO $NEWPAGE
 آخرین ویرایش توسط [[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]] انجام داده بود واگردانده شد',
-'revertpage-nouser' => 'ویرایش‌های انجام‌شده توسط (کاربری پنهان شده) به آخرین ویرایش [[User:$1|$1]] واگردانی شد.',
+'revertpage-nouser' => 'ویرایش‌های انجام‌شده توسط (نام کاربری حذف شده) به آخرین ویرایش [[User:$1|$1]] واگردانی شد.',
 'rollback-success' => 'ویرایش‌های $1 واگردانی شد؛
 صفحه به آخرین ویرایش $2 برگردانده شد.',
 
@@ -4399,9 +4405,17 @@ $5
 
 # Limit report
 'limitreport-title' => 'داده‌های رخ‌نمانگاری تجزیه‌کننده:',
+'limitreport-cputime' => 'زمان مصرف سی پی یو',
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|ثانیه|ثانیه}}',
+'limitreport-walltime' => 'استفاده زمان واقعی',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|ثانیه|ثانیه}}',
+'limitreport-ppvisitednodes' => 'شمارش گره پیش پردازنده مشاهده شده',
+'limitreport-ppgeneratednodes' => 'شمارش گره پیش پردازنده تولید شده',
+'limitreport-postexpandincludesize' => 'شامل اندازه پس گسترش',
 'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|بایت|بایت}}',
+'limitreport-templateargumentsize' => 'اندازه عملگر الگو',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|بایت|بایت}}',
+'limitreport-expansiondepth' => 'بیشترین عمق گسترش',
+'limitreport-expensivefunctioncount' => 'تعداد تابع تجزیه گر پرمصرف',
 
 );
index 7c42ff4..dfeff0d 100644 (file)
@@ -869,7 +869,7 @@ Jos kuitenkin kerrot sen, nimeä käytetään jotta voidaan kertoa kuka sisält
 'resetpass_header' => 'Muuta tunnuksen salasana',
 'oldpassword' => 'Vanha salasana:',
 'newpassword' => 'Uusi salasana:',
-'retypenew' => 'Uusi salasana uudelleen',
+'retypenew' => 'Uusi salasana uudelleen:',
 'resetpass_submit' => 'Aseta salasana ja kirjaudu sisään',
 'changepassword-success' => 'Salasanasi vaihtaminen onnistui.',
 'resetpass_forbidden' => 'Salasanoja ei voi vaihtaa.',
@@ -982,7 +982,7 @@ IP-osoitteesi kirjataan tämän sivun muutoshistoriaan.",
 'missingcommentheader' => 'Et ole antanut otsikkoa kommentillesi. Napsauta ”{{int:savearticle}}”, jos et halua antaa otsikkoa.',
 'summary-preview' => 'Yhteenvedon esikatselu:',
 'subject-preview' => 'Otsikon esikatselu:',
-'blockedtitle' => 'Pääsy estetty',
+'blockedtitle' => 'Käyttäjä on estetty',
 'blockedtext' => "'''Käyttäjätunnuksesi tai IP-osoitteesi on estetty.'''
 
 Eston on asettanut $1.
@@ -1033,11 +1033,12 @@ Voit [[Special:Search/{{PAGENAME}}|etsiä sivun nimellä]] muilta sivuilta,
 tai [{{fullurl:{{FULLPAGENAME}}|action=edit}} muokata tätä sivua]</span>.',
 'noarticletext-nopermission' => 'Tällä hetkellä tällä sivulla ei ole tekstiä.
 Voit [[Special:Search/{{PAGENAME}}|etsiä sivun nimellä]] muilta sivuilta tai <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hakea aiheeseen liittyviä lokeja]</span>, mutta sinulla ei ole oikeutta luoda tätä sivua.',
-'missing-revision' => 'Sivusta {{PAGENAME}} ei ole olemassa versiota $1.
+'missing-revision' => 'Sivusta "{{PAGENAME}}" ei ole olemassa versiota $1.
 
-Useimmiten tämä johtuu vanhentuneesta historialinkistä poistettuun sivuun.
-Lisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].',
-'userpage-userdoesnotexist' => 'Käyttäjätunnusta <nowiki>$1</nowiki> ei ole rekisteröity. Varmista haluatko muokata tätä sivua.',
+Yleensä tämä johtuu vanhentuneesta historialinkistä sivulle, joka on poistettu.
+Tarkempia tietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].',
+'userpage-userdoesnotexist' => 'Käyttäjätunnusta "$1" ei ole rekisteröity. 
+Varmista, haluatko luoda tämän sivun tai muokata sitä.',
 'userpage-userdoesnotexist-view' => 'Käyttäjätunnusta ”$1” ei ole rekisteröity.',
 'blocked-notice-logextract' => 'Tämä käyttäjä on tällä hetkellä estetty.
 Alla on viimeisin estolokin tapahtuma:',
@@ -1110,11 +1111,12 @@ Alla on viimeisin lokitapahtuma:",
 'sectioneditnotsupported-title' => 'Osioiden muokkaamista ei tueta.',
 'sectioneditnotsupported-text' => 'Osioiden muokkaamista ei tueta tällä sivulla.',
 'permissionserrors' => 'Puutteelliset oikeudet',
-'permissionserrorstext' => 'Sinulla ei ole oikeutta suorittaa toimintoa {{PLURAL:$1|seuraavasta syystä|seuraavista syistä}} johtuen:',
-'permissionserrorstext-withaction' => 'Sinulla ei ole lupaa {{lcfirst:$2}} {{PLURAL:$1|seuraavasta syystä|seuraavista syistä}} johtuen:',
-'recreate-moveddeleted-warn' => "'''Olet luomassa sivua, joka on aikaisemmin poistettu.'''
+'permissionserrorstext' => 'Sinulla ei ole oikeutta suorittaa toimintoa {{PLURAL:$1|seuraavasta syystä|seuraavista syistä}}:',
+'permissionserrorstext-withaction' => 'Sinulla ei ole oikeutta {{lcfirst:$2}} {{PLURAL:$1|seuraavasta syystä|seuraavista syistä}}:',
+'recreate-moveddeleted-warn' => "'''Varoitus: Olet luomassa sellaista sivua, joka on aikaisemmin poistettu.'''
 
-Harkitse, kannattaako sivua luoda uudelleen. Alla on tämän sivun poisto- ja siirtohistoria:",
+Harkitse, kannattaako tätä sivua luoda uudelleen. 
+Alla on tämän sivun poisto- ja siirtohistoria:",
 'moveddeleted-notice' => 'Tämä sivu on poistettu. Alla on tämän sivun poisto- ja siirtohistoria.',
 'log-fulllog' => 'Näytä loki kokonaan',
 'edit-hook-aborted' => 'Laajennuskoodi esti muokkauksen antamatta syytä.',
@@ -1130,7 +1132,7 @@ Se on jo olemassa.',
 'invalid-content-data' => 'Virheellinen sisältö',
 'content-not-allowed-here' => 'Sivun [[$2]] sisältö ei voi olla tyyppiä $1.',
 'editwarning-warning' => 'Tältä sivulta poistuminen saattaa aiheuttaa kaikkien tekemiesi muutosten katoamisen.
-Jos olet kirjautuneena sisään, voit poistaa tämän varoituksen käytöstä asetuksissa osiossa »Muokkaus».',
+Jos olet kirjautuneena sisään, voit poistaa tämän varoituksen käytöstä asetuksissa osiossa "Muokkaus".',
 
 # Content models
 'content-model-wikitext' => 'wikiteksti',
@@ -1160,15 +1162,16 @@ Nämä muuttujat on jätetty käsittelemättä.",
 'converter-manual-rule-error' => 'Kielivarianttisäännössä on virhe',
 
 # "Undo" feature
-'undo-success' => 'Kumoaminen onnistui. Valitse <em>tallenna</em> toteuttaaksesi muutokset.',
-'undo-failure' => 'Muokkausta ei voitu kumota välissä olevien ristiriitaisten muutosten vuoksi. Kumoa muutokset käsin.',
-'undo-norev' => 'Muokkausta ei voitu perua, koska sitä ei ole olemassa tai se on poistettu.',
+'undo-success' => 'Kumoaminen voidaan suorittaa.
+Varmista alla olevasta vertailusta, että haluat saada aikaan tämän lopputuloksen, ja sen jälkeen tallenna alla näkyvät muutokset.',
+'undo-failure' => 'Muokkausta ei voi kumota välissä olevien ristiriitaisten muutosten vuoksi.',
+'undo-norev' => 'Muokkausta ei voida kumota, koska sitä ei ole olemassa tai se on poistettu.',
 'undo-summary' => 'Kumottu muokkaus $1, jonka teki [[Special:Contributions/$2|$2]] ([[User talk:$2|keskustelu]])',
-'undo-summary-username-hidden' => 'Kumoa muutos $1, jonka on tehnyt piilotettu käyttäjä',
+'undo-summary-username-hidden' => 'Kumottu muokkaus $1, jonka on tehnyt piilotettu käyttäjä',
 
 # Account creation failure
-'cantcreateaccounttitle' => 'Tunnuksen luominen epäonnistui',
-'cantcreateaccount-text' => "Käyttäjä [[User:$3|$3]] on estänyt käyttäjätunnusten luomisen tästä IP-osoitteesta ($1).
+'cantcreateaccounttitle' => 'Tunnusta ei voida luoda',
+'cantcreateaccount-text' => "Tunnusten luonti tästä IP-osoitteesta ('''$1''') on estetty. Estäjänä on [[User:$3|$3]].
 
 Käyttäjän $3 antama syy on ''$2''",
 
@@ -1233,7 +1236,7 @@ Voit silti [$1 nähdä tämän muutoksen], jos haluat jatkaa.",
 Voit silti nähdä tämän muutoksen. Lisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].",
 'rev-suppressed-diff-view' => "Yksi tämän muutosvertailun versioista on '''häivytetty'''.
 Voit silti nähdä tämän muutoksen. Lisätietoja löytyy [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} häivytyslokista].",
-'rev-delundel' => 'näytä tai piilota',
+'rev-delundel' => 'muuta näkyvyyttä',
 'rev-showdeleted' => 'näytä',
 'revisiondelete' => 'Poista tai palauta versioita',
 'revdelete-nooldid-title' => 'Ei kohdeversiota',
@@ -1265,10 +1268,10 @@ Muut ylläpitäjät {{GRAMMAR:inessive|{{SITENAME}}}} voivat silti tarkastella p
 'revdelete-radio-unset' => 'Ei',
 'revdelete-suppress' => 'Häivytä tiedot myös ylläpitäjien näkyviltä samalla kun piilotat ne muilta käyttäjiltä',
 'revdelete-unsuppress' => 'Poista rajoitukset palautetuilta versioilta',
-'revdelete-log' => 'Syy',
+'revdelete-log' => 'Syy:',
 'revdelete-submit' => 'Toteuta {{PLURAL:$1|valittuun versioon|valittuihin versioihin}}',
 'revdelete-success' => "'''Version näkyvyys päivitetty.'''",
-'revdelete-failure' => "'''Version näkyvyyttä ei voitu päivittää:'''
+'revdelete-failure' => "'''Version näkyvyyden muuttaminen ei onnistunut:'''
 $1",
 'logdelete-success' => "'''Lokitapahtuman näkyvyyttä on muutettu.'''",
 'logdelete-failure' => "'''Lokin näkyvyyttä ei voitu asettaa:'''
@@ -1291,10 +1294,10 @@ Sinulla ei ole oikeutta siihen.',
 ** Sopimattomat henkilötiedot
 ** Sopimaton käyttäjätunnus
 ** Mahdollinen kunnianloukkaus',
-'revdelete-otherreason' => 'Muu syy tai tarkennus',
+'revdelete-otherreason' => 'Muu syy tai tarkennus:',
 'revdelete-reasonotherlist' => 'Muu syy',
 'revdelete-edit-reasonlist' => 'Muokkaa poistosyitä',
-'revdelete-offender' => 'Version tekijä',
+'revdelete-offender' => 'Version tekijä:',
 
 # Suppression log
 'suppressionlog' => 'Häivytysloki',
@@ -1302,7 +1305,7 @@ Sinulla ei ole oikeutta siihen.',
 [[Special:BlockList|Estolistassa]] on lueteltu voimassa olevat muokkauskiellot ja muokkausestot.',
 
 # History merging
-'mergehistory' => 'Yhdistä muutoshistoriat',
+'mergehistory' => 'Yhdistä sivujen muutoshistoriat',
 'mergehistory-header' => 'Tämä sivu mahdollistaa sivun muutoshistorian yhdistämisen uudemman sivun muutoshistoriaan.
 Uuden ja vanhan sivun muutoksien pitää muodostaa jatkumo – ne eivät saa mennä ristikkäin.',
 'mergehistory-box' => 'Yhdistä kahden sivun muutoshistoria',
@@ -1429,7 +1432,7 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
 'prefs-personal' => 'Käyttäjätiedot',
 'prefs-rc' => 'Tuoreet muutokset',
 'prefs-watchlist' => 'Tarkkailulista',
-'prefs-watchlist-days' => 'Näytettävien päivien määrä tarkkailulistalla:',
+'prefs-watchlist-days' => 'Näytettävien päivien määrä tarkkailulistalla',
 'prefs-watchlist-days-max' => 'Enintään $1 {{PLURAL:$1|päivä|päivää}}',
 'prefs-watchlist-edits' => 'Tarkkailulistalla näytettävien muokkausten määrä',
 'prefs-watchlist-edits-max' => 'Enintään 1000',
@@ -1450,7 +1453,7 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
 'resultsperpage' => 'Tuloksia sivua kohti',
 'stub-threshold' => '<a href="#" class="stub">Tynkäsivun</a> osoituskynnys',
 'stub-threshold-disabled' => 'Ei käytössä',
-'recentchangesdays' => 'Näytettävien päivien määrä tuoreissa muutoksissa',
+'recentchangesdays' => 'Näytettävien päivien määrä tuoreissa&nbsp;muutoksissa',
 'recentchangesdays-max' => 'Enintään $1 {{PLURAL:$1|päivä|päivää}}',
 'recentchangescount' => 'Näytettävien muutoksien määrä oletuksena',
 'prefs-help-recentchangescount' => 'Tämä sisältää tuoreet muutokset, muutoshistoriat ja lokit.',
@@ -1525,7 +1528,7 @@ Tämä tieto on julkinen.',
 'prefs-displaysearchoptions' => 'Näyttöasetukset',
 'prefs-displaywatchlist' => 'Näyttöasetukset',
 'prefs-tokenwatchlist' => 'Avain',
-'prefs-diffs' => 'Erot',
+'prefs-diffs' => 'Eroavaisuudet',
 'prefs-help-prefershttps' => 'Tämä asetus tulee voimaan seuraavan sisäänkirjautumisesi yhteydessä.',
 
 # User preference: email validation using jQuery
@@ -1534,27 +1537,27 @@ Tämä tieto on julkinen.',
 
 # User rights
 'userrights' => 'Käyttöoikeuksien hallinta',
-'userrights-lookup-user' => 'Käyttöoikeuksien hallinta',
+'userrights-lookup-user' => 'Hallinnoi käyttäjän ryhmiä',
 'userrights-user-editname' => 'Käyttäjätunnus',
 'editusergroup' => 'Muokkaa käyttäjän ryhmiä',
-'editinguser' => "Käyttäjän '''[[User:$1|$1]]''' oikeudet $2",
-'userrights-editusergroup' => 'Käyttäjän ryhmät',
-'saveusergroups' => 'Tallenna',
+'editinguser' => "Muutetaan käyttäjän '''[[User:$1|$1]]''' $2 oikeuksia",
+'userrights-editusergroup' => 'Muuta käyttäjän ryhmiä',
+'saveusergroups' => 'Tallenna nämä käyttäjäryhmät',
 'userrights-groupsmember' => 'Jäsenenä ryhmissä:',
-'userrights-groupsmember-auto' => 'Virtuaaliset ryhmät:',
-'userrights-groups-help' => 'Voit muuttaa ryhmiä, joissa tämä käyttäjä on.
+'userrights-groupsmember-auto' => 'Automaattisesti jäsenenä ryhmissä:',
+'userrights-groups-help' => 'Voit muuttaa ryhmiä, joissa tämä käyttäjä on:
 * Merkattu valintaruutu tarkoittaa, että käyttäjä on kyseisessä ryhmässä.
 * Merkkaamaton valintaruutu tarkoittaa, että käyttäjä ei ole kyseisessä ryhmässä.
-* <nowiki>*</nowiki> tarkoittaa, että et pysty kumoamaan kyseistä operaatiota.',
+* <nowiki>*</nowiki> tarkoittaa, että et pysty poistamaan käyttäjää tästä ryhmästä kun olet hänet siihen lisännyt tai päinvastoin',
 'userrights-reason' => 'Syy:',
-'userrights-no-interwiki' => 'Sinulla ei ole lupaa muokata käyttöoikeuksia muissa wikeissä.',
+'userrights-no-interwiki' => 'Sinulla ei ole oikeutta muokata käyttöoikeuksia muissa wikeissä.',
 'userrights-nodatabase' => 'Tietokantaa $1 ei ole tai se ei ole paikallinen.',
 'userrights-nologin' => 'Sinun täytyy [[Special:UserLogin|kirjautua sisään]] ylläpitäjän tunnuksella, jotta voisit muuttaa käyttöoikeuksia.',
-'userrights-notallowed' => 'Sinulla ei ole lupaa lisätä tai poistaa käyttöoikeuksia.',
+'userrights-notallowed' => 'Sinulla ei ole oikeutta lisätä tai poistaa käyttäjien oikeuksia.',
 'userrights-changeable-col' => 'Ryhmät, joita voit muuttaa',
 'userrights-unchangeable-col' => 'Ryhmät, joita et voi muuttaa',
 'userrights-conflict' => 'Päällekkäinen käyttöoikeuksien muutos! Tarkista tekemäsi muutokset ja vahvista ne.',
-'userrights-removed-self' => 'Poistit onnistuneesti omat oikeutesi. Tämän myötä sinulla ei ole enää oikeutta käyttää tätä sivua.',
+'userrights-removed-self' => 'Poistit onnistuneesti omat oikeutesi. Tämän jälkeen et enää pääse tälle sivulle.',
 
 # Groups
 'group' => 'Ryhmä',
@@ -2716,7 +2719,7 @@ Voimassa olevat estot näkyvät [[Special:BlockList|estolistasta]].',
 'blocklist-userblocks' => 'Piilota tunnusten estot',
 'blocklist-tempblocks' => 'Piilota väliaikaiset estot',
 'blocklist-addressblocks' => 'Piilota yksittäiset IP-estot',
-'blocklist-rangeblocks' => 'Piilota ryhmäestot',
+'blocklist-rangeblocks' => 'Piilota avaruusestot',
 'blocklist-timestamp' => 'Päiväys',
 'blocklist-target' => 'Kohde',
 'blocklist-expiry' => 'Vanhentuu',
@@ -2765,7 +2768,7 @@ Alla on ote häivytyslokista.',
 'ipb_already_blocked' => '”$1” on jo estetty.',
 'ipb-needreblock' => '$1 on jo estetty. Haluatko muuttaa eston asetuksia?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Muu esto|Muut estot}}',
-'unblock-hideuser' => 'Et voi poistaa estoa tältä käyttäjältä, kun käyttäjänimi on piilotettuna.',
+'unblock-hideuser' => 'Et voi poistaa estoa tältä käyttäjältä, koska hänen käyttäjätunnuksensa on piilotettu.',
 'ipb_cant_unblock' => 'Estoa ”$1” ei löytynyt. Se on saatettu poistaa.',
 'ipb_blocked_as_range' => 'IP-osoite $1 on estetty välillisesti ja sen estoa ei voi poistaa. Se on estetty osana verkkoaluetta $2, jonka eston voi poistaa',
 'ip_range_invalid' => 'Virheellinen IP-alue.',
@@ -2775,30 +2778,33 @@ Alla on ote häivytyslokista.',
 'proxyblocker-disabled' => 'Tämä toiminto ei ole käytössä.',
 'proxyblockreason' => 'IP-osoitteestasi on estetty muokkaukset, koska se on avoin välityspalvelin. Ota yhteyttä Internet-palveluntarjoajaasi tai tekniseen tukeen ja kerro heille tästä tietoturvaongelmasta.',
 'proxyblocksuccess' => 'Valmis.',
-'sorbsreason' => 'IP-osoitteesi on listattu avoimena välityspalvelimena DNSBLin mustalla listalla.',
-'sorbs_create_account_reason' => 'IP-osoitteesi on listattu avoimena välityspalvelimena DNSBLin mustalla listalla. Et voi luoda käyttäjätunnusta.',
+'sorbsreason' => 'IP-osoitteesi on listattu avoimena välityspalvelimena DNSBL:n mustalla listalla sivustolla {{SITENAME}}.',
+'sorbs_create_account_reason' => 'IP-osoitteesi on listattu avoimena välityspalvelimena DNSBL:n mustalla listalla sivustolla {{SITENAME}}. 
+Et voi luoda käyttäjätunnusta.',
 'xffblockreason' => 'Yhteydet IP-osoitteesta, joka löytyy sinun tai käyttämäsi välipalvelimen X-Forwarded-For-otsakkeesta, on estetty. Alkuperäinen estämisen syy oli: $1',
-'cant-block-while-blocked' => 'Et voi estää muita käyttäjiä ollessasi estetty.',
+'cant-block-while-blocked' => 'Et voi estää muita käyttäjiä kun olet itse estetty.',
 'cant-see-hidden-user' => 'Käyttäjä, jota yrität estää on jo estetty ja piilotettu. Koska sinulla ei ole hideuser-oikeutta, et voi nähdä tai muokata käyttäjän estoa.',
 'ipbblocked' => 'Et voi estää tai poistaa estoja muilta käyttäjiltä, koska itse olet estettynä',
 'ipbnounblockself' => 'Et ole oikeutettu poistamaan estoa itseltäsi',
 
 # Developer tools
 'lockdb' => 'Lukitse tietokanta',
-'unlockdb' => 'Vapauta tietokanta',
-'lockdbtext' => 'Tietokannan lukitseminen estää käyttäjiä muokkaamasta sivuja, vaihtamasta asetuksia, muokkaamasta tarkkailulistoja ja tekemästä muita tietokannan muuttamista vaativia toimia. Ole hyvä ja vahvista, että tämä on tarkoituksesi, ja että vapautat tietokannan kun olet suorittanut ylläpitotehtävät.',
-'unlockdbtext' => 'Tietokannan vapauttaminen antaa käyttäjille mahdollisuuden muokata sivuja, vaihtaa asetuksia, muokata tarkkailulistoja ja tehdä muita tietokannan muuttamista vaativia toimia. Ole hyvä ja vahvista, että tämä on tarkoituksesi.',
+'unlockdb' => 'Poista tietokannan lukitus',
+'lockdbtext' => 'Tietokannan lukitseminen estää kaikkia käyttäjiä muokkaamasta sivuja, vaihtamasta asetuksia, muokkaamasta tarkkailulistoja ja tekemästä muita toimia, jotka vaativat tietokannan muuttamista. Ole hyvä ja vahvista, että tämä on tarkoituksesi ja että poistat tietokannan lukituksen kun olet suorittanut huoltotehtävät.',
+'unlockdbtext' => 'Tietokannan lukituksen poistaminen antaa käyttäjille mahdollisuuden muokata sivuja, vaihtaa asetuksia, muokata tarkkailulistoja ja tehdä muita tietokannan muuttamista vaativia toimia. 
+Ole hyvä ja vahvista, että tämä on tarkoituksesi.',
 'lockconfirm' => 'Kyllä, haluan varmasti lukita tietokannan.',
-'unlockconfirm' => 'Kyllä, haluan varmasti vapauttaa tietokannan.',
+'unlockconfirm' => 'Kyllä, haluan varmasti poistaa tietokannan lukituksen.',
 'lockbtn' => 'Lukitse tietokanta',
-'unlockbtn' => 'Vapauta tietokanta',
-'locknoconfirm' => 'Et merkinnyt vahvistuslaatikkoa.',
+'unlockbtn' => 'Poista tietokannan lukitus',
+'locknoconfirm' => 'Et vahvistanut toimenpidettä.',
 'lockdbsuccesssub' => 'Tietokannan lukitseminen onnistui',
-'unlockdbsuccesssub' => 'Tietokannan vapauttaminen onnistui',
-'lockdbsuccesstext' => 'Tietokanta on lukittu.<br />Muista vapauttaa tietokanta ylläpitotoimenpiteiden jälkeen.',
-'unlockdbsuccesstext' => 'Tietokanta on vapautettu.',
+'unlockdbsuccesssub' => 'Tietokannan lukitus on poistettu',
+'lockdbsuccesstext' => 'Tietokanta on lukittu.<br />
+Muista [[Special:UnlockDB|poistaa tietokannan lukitus]] kun huolto on tehty.',
+'unlockdbsuccesstext' => 'Tietokannan lukitus on poistettu.',
 'lockfilenotwritable' => 'Tietokannan lukitustiedostoa ei voi kirjoittaa. Tarkista oikeudet.',
-'databasenotlocked' => 'Tietokanta ei ole lukittu.',
+'databasenotlocked' => 'Tietokantaa ei ole lukittu.',
 'lockedbyandtime' => '(lukinnut {{GENDER:$1|$1}} $2 kello $3)',
 
 # Move page
@@ -2822,21 +2828,20 @@ Huomaa, että sivua '''ei''' siirretä mikäli uusi otsikko on olemassa olevan s
 Tämä tarkoittaa sitä, että voit siirtää sivun takaisin vanhalle nimelleen mikäli teit virheen, mutta et voi kirjoittaa olemassa olevan sivun päälle.
 
 Tämä saattaa olla suuri ja odottamaton muutos suositulle sivulle. Varmista, että tiedät seuraukset ennen kuin siirrät sivun.",
-'movepagetalktext' => "Sivuun mahdollisesti kytketty keskustelusivu siirretään automaattisesti, '''paitsi jos''':
-*Siirrät sivua nimiavaruudesta toiseen
-*Kohdesivulla on olemassa keskustelusivu, joka ei ole tyhjä, tai
-*Kumoat alla olevan ruudun asetuksen.
+'movepagetalktext' => "Sivuun mahdollisesti liittyvä keskustelusivu siirtyy automaattisesti mukana, '''paitsi:'''
+*jos siirron kohdesivulla on olemassa keskustelusivu, joka ei ole tyhjä, tai
+*jos otat pois rastin alla olevasta ruudusta.
 
-Näissä tapauksissa sivut täytyy siirtää tai yhdistää käsin.",
-'movearticle' => 'Siirrettävä sivu',
+Näissä tapauksissa sivu täytyy siirtää tai yhdistää käsin, jos se on tarpeen.",
+'movearticle' => 'Siirrettävä sivu:',
 'moveuserpage-warning' => "'''Varoitus:''' Olet siirtämässä käyttäjäsivua. Huomaa, että vain sivu siirretään ja käyttäjää ''ei'' nimetä uudelleen.",
 'movenologin' => 'Et ole kirjautunut sisään',
 'movenologintext' => 'Sinun pitää olla rekisteröitynyt käyttäjä ja [[Special:UserLogin|kirjautua sisään]], jotta voisit siirtää sivun.',
-'movenotallowed' => 'Sinulla ei ole oikeuksia siirtää sivuja.',
-'movenotallowedfile' => 'Sinulla ei ole oikeuksia siirtää tiedostoja.',
-'cant-move-user-page' => 'Sinulla ei ole lupaa siirtää käyttäjäsivuja (lukuun ottamatta alasivuja).',
-'cant-move-to-user-page' => 'Sinulla ei ole lupaa siirtää sivuja käyttäjäsivuiksi (paitsi alasivuiksi).',
-'newtitle' => 'Uusi nimi sivulle',
+'movenotallowed' => 'Sinulla ei ole oikeutta siirtää sivuja.',
+'movenotallowedfile' => 'Sinulla ei ole oikeutta siirtää tiedostoja.',
+'cant-move-user-page' => 'Sinulla ei ole oikeutta siirtää käyttäjäsivuja (lukuun ottamatta alasivuja).',
+'cant-move-to-user-page' => 'Sinulla ei ole oikeutta siirtää sivua käyttäjäsivuksi (paitsi käyttäjän alasivuksi).',
+'newtitle' => 'Uusi nimi sivulle:',
 'move-watch' => 'Tarkkaile tätä sivua',
 'movepagebtn' => 'Siirrä sivu',
 'pagemovedsub' => 'Siirto onnistui',
@@ -2846,7 +2851,7 @@ Näissä tapauksissa sivut täytyy siirtää tai yhdistää käsin.",
 'articleexists' => 'Kohdesivu on jo olemassa, tai valittu nimi ei ole sopiva. Ole hyvä ja valitse uusi nimi.',
 'cantmove-titleprotected' => 'Sivua ei voi siirtää tälle nimelle, koska tämän nimisen sivun luonti on estetty.',
 'talkexists' => 'Sivun siirto onnistui, mutta keskustelusivua ei voitu siirtää, koska uuden otsikon alla on jo keskustelusivu. Keskustelusivujen sisältö täytyy yhdistää käsin.',
-'movedto' => 'Siirretty uudelle otsikolle',
+'movedto' => 'Siirretty uudelle nimelle',
 'movetalk' => 'Siirrä myös keskustelusivu',
 'move-subpages' => 'Siirrä kaikki alasivut (enintään $1)',
 'move-talk-subpages' => 'Siirrä kaikki keskustelusivun alasivut (enintään $1)',
@@ -2860,11 +2865,13 @@ $1 {{PLURAL:$1|sivu|sivua}} siirrettiin.',
 'movesubpage' => '{{PLURAL:$1|Alasivu|Alasivut}}',
 'movesubpagetext' => 'Tällä sivulla on $1 {{PLURAL:$1|alasivu|alasivua}}, jotka näkyvät alla.',
 'movenosubpage' => 'Tällä sivulla ei ole alasivuja.',
-'movereason' => 'Syy',
-'revertmove' => 'kumoa',
+'movereason' => 'Syy:',
+'revertmove' => 'kumoa siirto',
 'delete_and_move' => 'Poista kohdesivu ja siirrä',
-'delete_and_move_text' => 'Kohdesivu [[:$1]] on jo olemassa. Haluatko poistaa sen, jotta nykyinen sivu voitaisiin siirtää?',
-'delete_and_move_confirm' => 'Poista sivu',
+'delete_and_move_text' => '==Poistamista edellyttävä siirto==
+Kohdesivu [[:$1]] on jo olemassa. 
+Haluatko poistaa sen, jotta nykyinen sivu voitaisiin siirtää?',
+'delete_and_move_confirm' => 'Kyllä, poista kohdesivu',
 'delete_and_move_reason' => 'Sivu on sivun [[$1]] siirron tiellä.',
 'selfmove' => 'Lähde- ja kohdenimi ovat samat.',
 'immobile-source-namespace' => 'Sivuja ei voi siirtää nimiavaruudessa ”$1”',
@@ -2877,7 +2884,7 @@ $1 {{PLURAL:$1|sivu|sivua}} siirrettiin.',
 'nonfile-cannot-move-to-file' => 'Sivuja ei voi siirtää tiedostonimiavaruuteen.',
 'imagetypemismatch' => 'Uusi tiedostopääte ei vastaa tiedoston tyyppiä',
 'imageinvalidfilename' => 'Kohdenimi on virheellinen',
-'fix-double-redirects' => 'Päivitä kaikki tänne viittaavat ohjaukset ohjaamaan uudelle nimelle',
+'fix-double-redirects' => 'Päivitä kaikki vanhalle nimelle viittaavat ohjaukset ohjaamaan uudelle nimelle',
 'move-leave-redirect' => 'Jätä paikalle ohjaus',
 'protectedpagemovewarning' => "'''Varoitus:''' Tämä sivu on lukittu siten, että vain ylläpitäjät voivat siirtää sitä.
 Alla on viimeisin lokitapahtuma:",
index 1398614..100e2ad 100644 (file)
@@ -782,6 +782,7 @@ $2
 
 # Special:ResetTokens
 'resettokens' => 'નિશાનીઓ ફરી ગોઠવો',
+'resettokens-no-tokens' => 'અહીં ફરી ગોઠવવા માટેનાં કોઇ ટોકન નથી',
 'resettokens-legend' => 'નિશાનીઓ ફરી ગોઠવો',
 'resettokens-tokens' => 'નિશાનીઓ:',
 'resettokens-token-label' => '$1 (હાલની કિંમત: $2)',
@@ -1406,6 +1407,7 @@ HTML નાકું ચકાસો',
 'saveusergroups' => 'સભ્ય સમુહો સાચવો',
 'userrights-groupsmember' => 'સભ્યપદ:',
 'userrights-groupsmember-auto' => 'આનો અભિપ્રેત સભ્ય:',
+'userrights-groupsmember-type' => ' $1',
 'userrights-groups-help' => 'અ સ્ભ્ય જેનો સભ્ય છે તે સમ્હૂહને બદલી શકો છો:
 * અંકિત કરેલું ખાનું બતાવે છે સભ્ય તેનો સમૂહમાં શામિલ છે.
 * જો ખાનું અંકિત ન હોય તો સભ્ય તે સમૂહમાં શામિલ નથી.
index 4d9a9c5..f0b16ca 100644 (file)
@@ -3199,7 +3199,7 @@ $2',
 'tooltip-ca-nstab-main' => 'צפייה בדף התוכן',
 'tooltip-ca-nstab-user' => 'צפייה בדף המשתמש',
 'tooltip-ca-nstab-media' => 'צפייה בפריט המדיה',
-'tooltip-ca-nstab-special' => '×\96×\94×\95 ×\93×£ ×\9e×\99×\95×\97×\93, ×\90×\99 ×\90פשר לערוך אותו',
+'tooltip-ca-nstab-special' => '×\96×\94×\95 ×\93×£ ×\9e×\99×\95×\97×\93, ×\9c×\90 × ×\99ת×\9f לערוך אותו',
 'tooltip-ca-nstab-project' => 'צפייה בדף המיזם',
 'tooltip-ca-nstab-image' => 'צפייה בדף הקובץ',
 'tooltip-ca-nstab-mediawiki' => 'צפייה בהודעת המערכת',
index caab916..16904d7 100644 (file)
@@ -192,8 +192,8 @@ $messages = array(
 'tog-underline' => 'कड़ियाँ अधोरेखन:',
 'tog-justify' => 'परिच्छेद समान करें',
 'tog-hideminor' => 'हाल में हुए बदलावों में छोटे बदलाव छिपाएँ',
-'tog-hidepatrolled' => 'हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤¬à¤¦à¤²à¤¾à¤µà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤\9cाà¤\81à¤\9aà¥\87 à¤¹à¥\81à¤\8f बदलाव छिपाएँ',
-'tog-newpageshidepatrolled' => 'नà¤\8f à¤ªà¥\83षà¥\8dठà¥\8bà¤\82 à¤\95à¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¸à¥\87 à¤\9cाà¤\81à¤\9aà¥\87 à¤¹à¥\81à¤\8f à¤ªà¥\83षà¥\8dठà¥\8bà¤\82 à¤\95à¥\8b छिपाएँ',
+'tog-hidepatrolled' => 'हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤¬à¤¦à¤²à¤¾à¤µà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤ªà¤°à¥\80à¤\95à¥\8dषित बदलाव छिपाएँ',
+'tog-newpageshidepatrolled' => 'नà¤\8f à¤ªà¥\83षà¥\8dठà¥\8bà¤\82 à¤\95à¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤ªà¤°à¥\80à¤\95à¥\8dषित à¤ªà¥\83षà¥\8dठ छिपाएँ',
 'tog-extendwatchlist' => 'केवल हालिया ही नहीं, बल्कि सभी परिवर्तनों को दिखाने के लिए ध्यानसूची को विस्तारित करें',
 'tog-usenewrc' => 'हाल में हुए परिवर्तनों में और ध्यानसूची में परिवर्तनों को पृष्ठ अनुसार समूहों में बाँटें',
 'tog-numberheadings' => 'शीर्षक स्व-क्रमांकित करें',
@@ -225,7 +225,7 @@ $messages = array(
 'tog-watchlisthideminor' => 'मेरी ध्यानसूची से छोटे परिवर्तन छिपाएँ',
 'tog-watchlisthideliu' => 'मेरी ध्यानसूची में सत्रारम्भित सदस्यों के सम्पादन न दिखाएँ',
 'tog-watchlisthideanons' => 'आइ॰पी सदस्यों द्वारा किए सम्पादनों को मेरी ध्यानसूची में न दिखाएँ',
-'tog-watchlisthidepatrolled' => 'à¤\9cाà¤\81à¤\9aà¥\87 à¤\97à¤\8f à¤¸à¤®à¥\8dपादनà¥\8bà¤\82 à¤\95à¥\8b à¤®à¥\87रà¥\80 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¨ à¤¦à¤¿à¤\96ाएँ',
+'tog-watchlisthidepatrolled' => 'परà¥\80à¤\95à¥\8dषित à¤¸à¤®à¥\8dपादन à¤®à¥\87रà¥\80 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9bà¥\81पाएँ',
 'tog-ccmeonemails' => 'मेरे द्वारा अन्य सदस्यों को भेजे ई-मेलों की प्रतियाँ मुझे भी भेजें',
 'tog-diffonly' => 'अवतरणों में अन्तर दर्शाते समय पुराने अवतरण न दिखाएँ',
 'tog-showhiddencats' => 'छिपाई हुई श्रेणियाँ दिखाएँ',
@@ -1559,9 +1559,9 @@ HTML टैग की जाँच करें।',
 'right-noratelimit' => 'रेट लिमिट्स से बेअसर हों',
 'right-import' => 'अन्य विकियों से पृष्ठ आयात करें',
 'right-importupload' => 'फ़ाइल अपलोड द्वारा पृष्ठ आयात करें',
-'right-patrol' => 'à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\87 à¤¸à¤®à¥\8dपादन à¤\9cाà¤\81à¤\9aà¥\87 à¤¹à¥\81à¤\8f चिन्हित करें',
-'right-autopatrol' => 'à¤\85पनà¥\87 à¤¸à¤®à¥\8dपादन à¤¸à¥\8dवà¤\9aालित à¤°à¥\82प à¤¸à¥\87 à¤\9cाà¤\81à¤\9aà¥\87 à¤¹à¥\81à¤\8f चिन्हित करें',
-'right-patrolmarks' => 'हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤¬à¤¦à¤²à¤¾à¤µà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤\9cाà¤\81à¤\9a चिन्ह देखें',
+'right-patrol' => 'à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\87 à¤¸à¤®à¥\8dपादन à¤ªà¤°à¥\80à¤\95à¥\8dषित चिन्हित करें',
+'right-autopatrol' => 'à¤\85पनà¥\87 à¤¸à¤®à¥\8dपादन à¤¸à¥\8dवà¤\9aालित à¤°à¥\82प à¤¸à¥\87 à¤ªà¤°à¥\80à¤\95à¥\8dषित चिन्हित करें',
+'right-patrolmarks' => 'हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤¬à¤¦à¤²à¤¾à¤µà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤ªà¤°à¥\80à¤\95à¥\8dषण चिन्ह देखें',
 'right-unwatchedpages' => 'ऐसे पृष्ठों की सूची देखें जो किसी की ध्यानसूची में नहीं हैं',
 'right-mergehistory' => 'पृष्ठ इतिहास एकत्रित करें',
 'right-userrights' => 'सभी सदस्य अधिकार बदलें',
@@ -1607,8 +1607,8 @@ HTML टैग की जाँच करें।',
 'action-rollback' => 'किसी पृष्ठ का अंतिम सम्पादन करने वाले सदस्य के सम्पादन वापिस लेने',
 'action-import' => 'किसी और विकि से यह पृष्ठ आयात करने',
 'action-importupload' => 'फ़ाइल अपलोड द्वारा यह पृष्ठ आयात करे',
-'action-patrol' => 'à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\87 à¤¸à¤®à¥\8dपादन à¤\9cाà¤\81à¤\9aà¥\87 à¤¹à¥\81à¤\8f à¤\9aिनà¥\8dहित करने',
-'action-autopatrol' => 'à¤\85पनà¥\87 à¤¸à¤®à¥\8dपादन à¤¸à¥\8dवà¤\9aालित à¤°à¥\82प à¤¸à¥\87 à¤\9cाà¤\81à¤\9aà¥\87 à¤¹à¥\81à¤\8f à¤\9aिनà¥\8dहित करने',
+'action-patrol' => 'à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\87 à¤¸à¤®à¥\8dपादन à¤ªà¤°à¥\80à¤\95à¥\8dषित करने',
+'action-autopatrol' => 'à¤\85पनà¥\87 à¤¸à¤®à¥\8dपादन à¤¸à¥\8dवà¤\9aालित à¤°à¥\82प à¤¸à¥\87 à¤ªà¤°à¥\80à¤\95à¥\8dषित करने',
 'action-unwatchedpages' => 'ऐसे पृष्ठ जो किसी की ध्यानसूची में नहीं हैं की सूची देखने',
 'action-mergehistory' => 'इस पृष्ठ का इतिहास एकत्रित करने',
 'action-userrights' => 'सभी सदस्य अधिकार बदलने',
@@ -1627,7 +1627,7 @@ HTML टैग की जाँच करें।',
 'recentchanges' => 'हाल में हुए बदलाव',
 'recentchanges-legend' => 'हाल के परिवर्तन संबंधी विकल्प',
 'recentchanges-summary' => 'इस विकि पर हाल में हुए बदलाव इस पन्ने पर देखे जा सकते हैं।',
-'recentchanges-noresult' => 'à¤\95à¥\8bà¤\88 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¨à¤¹à¥\80à¤\82 à¤\95िà¤\8f à¤\97à¤\8f à¤\87न à¤®à¤¾à¤ªà¤¦à¤\82डà¥\8bà¤\82 à¤¸à¥\87 à¤®à¥\87ल à¤\96ातà¥\87 à¤\88स à¤\85वधि à¤\95à¥\87 à¤¦à¥\8cरान।',
+'recentchanges-noresult' => 'à¤\87स à¤\85वधि à¤\95à¥\87 à¤¦à¥\8cरान à¤\87न à¤®à¤¾à¤ªà¤¦à¤\82डà¥\8bà¤\82 à¤\95à¥\8b à¤ªà¥\82रà¥\8dण à¤\95रतà¥\87 à¤\95à¥\8bà¤\88 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¨à¤¹à¥\80à¤\82 à¤\95िà¤\8f à¤\97à¤\8f à¤¹à¥\88à¤\82।',
 'recentchanges-feed-description' => 'इस विकि पर हाल में हुए बदलाव इस फ़ीड में देखे जा सकते हैं।',
 'recentchanges-label-newpage' => 'इस संपादन से नया पृष्ठ बना',
 'recentchanges-label-minor' => 'यह एक छोटा सम्पादन है',
@@ -1640,7 +1640,7 @@ HTML टैग की जाँच करें।',
 'rcshowhidebots' => 'बॉट $1',
 'rcshowhideliu' => 'लॉग्ड इन सदस्यों के बदलाव $1',
 'rcshowhideanons' => 'आइ॰पी सदस्यों के बदलाव $1',
-'rcshowhidepatr' => 'à¤\9cाà¤\81à¤\9aà¥\87 à¤¹à¥\81à¤\8f सम्पादन $1',
+'rcshowhidepatr' => 'परà¥\80à¤\95à¥\8dषित सम्पादन $1',
 'rcshowhidemine' => 'मेरे बदलाव $1',
 'rclinks' => 'पिछले $2 दिनों में हुए $1 बदलाव दिखाएँ<br />$3',
 'diff' => 'अंतर',
@@ -2574,7 +2574,7 @@ $1',
 'contributions' => '{{GENDER:$1|सदस्य}} योगदान',
 'contributions-title' => '$1 के योगदान',
 'mycontris' => 'योगदान',
-'contribsub2' => '$1 के लिये ($2)',
+'contribsub2' => '{{GENDER:$3|$1}} ($2) के लिये',
 'nocontribs' => 'इन कसौटियों से मिलनेवाले बदलाव मिले नहीं।',
 'uctop' => '(मौजूदा)',
 'month' => 'इस महिनेसे (और पुरानें):',
@@ -3134,22 +3134,22 @@ $1 को बाध्य करने का कारण है: "$2"',
 'pageinfo-category-files' => 'फ़ाइलों की संख्या',
 
 # Patrolling
-'markaspatrolleddiff' => 'दà¥\87à¤\96 à¤²à¤¿à¤¯à¤¾ à¤\90सा à¤®à¤¾à¤°à¥\8dà¤\95 करें',
-'markaspatrolledtext' => 'à¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤¦à¥\87à¤\96 à¤²à¤¿à¤¯à¤¾ à¤\90सा à¤®à¤¾à¤°à¥\8dà¤\95 करें',
-'markedaspatrolled' => 'दà¥\87à¤\96 à¤²à¤¿à¤¯à¤¾ à¤\90सा à¤®à¤¾à¤°à¥\8dà¤\95 à¤\95रà¥\87à¤\82',
+'markaspatrolleddiff' => 'à¤\9cाà¤\81à¤\9aा à¤¹à¥\81à¤\86 à¤\9aिनà¥\8dहित करें',
+'markaspatrolledtext' => 'à¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤\9cाà¤\81à¤\9aा à¤¹à¥\81à¤\86 à¤\9aिनà¥\8dहित करें',
+'markedaspatrolled' => 'à¤\9cाà¤\81à¤\9aा à¤¹à¥\81à¤\86 à¤\9aिनà¥\8dहित à¤\95िया',
 'markedaspatrolledtext' => '[[:$1]] का चयनित अवतरण जाँचा हुआ चिन्हित किया गया।',
-'rcpatroldisabled' => 'हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤¬à¤¦à¤²à¤¾à¤µà¥\8bà¤\82 à¤ªà¤° à¤¨à¤\9cर à¤°à¤\96ना à¤¬à¤\82द à¤\95र à¤¦à¤¿à¤¯à¤¾ à¤¹à¥\88à¤\82',
-'rcpatroldisabledtext' => 'हाल में हुए बदलावोंपर नजर रखने की सुविधा बंद कर दी ग‍ईं हैं।',
-'markedaspatrollederror' => 'दà¥\87à¤\96 à¤²à¤¿à¤¯à¤¾ à¤\90सा à¤®à¤¾à¤°à¥\8dà¤\95 à¤¨à¤¹à¥\80à¤\82 à¤\95र à¤ªà¤¾à¤¯à¥\87à¤\82',
-'markedaspatrollederrortext' => 'नà¤\9cर à¤°à¤\96नà¥\87 à¤\95à¥\87 à¤²à¤¿à¤¯à¥\87 à¤\86पà¤\95à¥\8b à¤\8fà¤\95 à¤\85वतरणà¤\95à¥\8b चुनना होगा।',
-'markedaspatrollederror-noautopatrol' => 'आप खुद अपने बदलावोंपर नजर नहीं रख सकतें हैं।',
+'rcpatroldisabled' => 'हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤¬à¤¦à¤²à¤¾à¤µà¥\8bà¤\82 à¤\95ा à¤ªà¤°à¥\80à¤\95à¥\8dषण à¤\85à¤\95à¥\8dषम à¤¹à¥\88',
+'rcpatroldisabledtext' => 'हाल में हुए बदलावों के परीक्षण की सुविधा अभी अक्षम है।',
+'markedaspatrollederror' => 'à¤\9cाà¤\81à¤\9aा à¤¹à¥\81à¤\86 à¤\9aिनà¥\8dहित à¤¨à¤¹à¥\80à¤\82 à¤\95र à¤ªà¤¾à¤\8f',
+'markedaspatrollederrortext' => 'à¤\9cाà¤\81à¤\9aा à¤¹à¥\81à¤\86 à¤\9aिनà¥\8dहित à¤\95रनà¥\87 à¤\95à¥\87 à¤²à¤¿à¤¯à¥\87 à¤\86पà¤\95à¥\8b à¤\8fà¤\95 à¤\85वतरण चुनना होगा।',
+'markedaspatrollederror-noautopatrol' => 'आपको अपने बदलाव परीक्षित करने की अनुमति नहीं है।',
 'markedaspatrollednotify' => '$1 पृष्ठ में किया गया ये बदलाव जाँचा हुआ चिन्हित कर दिया गया है।',
 'markedaspatrollederrornotify' => 'जाँचा हुआ चिन्हित करना असफल रहा।',
 
 # Patrol log
-'patrol-log-page' => 'नà¤\9cर à¤°à¤\96नà¥\87à¤\95à¥\80 à¤¸à¥\82à¤\9aà¥\80',
-'patrol-log-header' => 'यह à¤¨à¤¿à¤\97रानà¥\80 à¤®à¥\87à¤\82 à¤¬à¤¨à¥\87 à¤¸à¤\82सà¥\8dà¤\95रणà¥\8bà¤\82 à¤\95ा à¤\9aिà¤\9fà¥\8dठा है।',
-'log-show-hide-patrol' => 'à¤\97शà¥\8dतà¥\80 à¤\85भिलà¥\87à¤\96 $1',
+'patrol-log-page' => 'परà¥\80à¤\95à¥\8dषण à¤²à¥\89à¤\97',
+'patrol-log-header' => 'यह à¤ªà¤°à¥\80à¤\95à¥\8dषित à¤\85वतरणà¥\8bà¤\82 à¤\95à¥\80 à¤²à¥\89à¤\97 है।',
+'log-show-hide-patrol' => 'परà¥\80à¤\95à¥\8dषण à¤²à¥\89à¤\97 $1',
 
 # Image deletion
 'deletedrevision' => 'पुराना अवतरण $1 हटा दिया',
@@ -4011,8 +4011,8 @@ $5
 'logentry-move-move-noredirect' => '$1 ने $3 पर पुनर्निर्देश छोड़े बिना उसे $4 पर {{GENDER:$2|स्थानांतरित}} किया',
 'logentry-move-move_redir' => '$1 ने $4 से पुनर्निर्देश हटाकर $3 को उसपर {{GENDER:$2|स्थानांतरित}} किया',
 'logentry-move-move_redir-noredirect' => '$1 ने $4 से पुनार्निर्देश हटाकर $3 पर पुनर्निर्देश छोड़े बिना $3 को $4 पर {{GENDER:$2|स्थानांतरित}} किया',
-'logentry-patrol-patrol' => '$1 à¤¨à¥\87 $3 à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 $4 à¤\85वतरण à¤\95à¥\8b à¤¦à¥\87à¤\96ा à¤¹à¥\81à¤\86 {{GENDER:$2|चिन्हित}} किया',
-'logentry-patrol-patrol-auto' => '$1 à¤¨à¥\87 $3 à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 $4 à¤\85वतरण à¤\95à¥\8b à¤¸à¥\8dवà¤\9aालित à¤°à¥\82प à¤¸à¥\87 à¤¦à¥\87à¤\96ा à¤¹à¥\81à¤\86 {{GENDER:$2|चिन्हित}} किया',
+'logentry-patrol-patrol' => '$1 à¤¨à¥\87 $3 à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 $4 à¤\85वतरण à¤\95à¥\8b à¤ªà¤°à¥\80à¤\95à¥\8dषित {{GENDER:$2|चिन्हित}} किया',
+'logentry-patrol-patrol-auto' => '$1 à¤¨à¥\87 $3 à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 $4 à¤\85वतरण à¤\95à¥\8b à¤¸à¥\8dवà¤\9aालित à¤°à¥\82प à¤¸à¥\87 à¤ªà¤°à¥\80à¤\95à¥\8dषित {{GENDER:$2|चिन्हित}} किया',
 'logentry-newusers-newusers' => 'सदस्य खाता $1 {{GENDER:$2|बनाया}} गया',
 'logentry-newusers-create' => 'सदस्य खाता $1 {{GENDER:$2|बनाया}} गया',
 'logentry-newusers-create2' => 'सदस्य खाता $3 $1 द्वारा {{GENDER:$2|बनाया}} गया था',
index f2b3727..4214829 100644 (file)
@@ -320,11 +320,11 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Podcrtane poveznice',
 'tog-justify' => 'Poravnaj odlomke i zdesna',
-'tog-hideminor' => 'Sakrij manje izmjene na stranici Nedavnih promjena',
+'tog-hideminor' => 'Sakrij manje izmjene u nedavnim promjenama',
 'tog-hidepatrolled' => 'Sakrij pregledane izmjene u nedavnim promjenama',
 'tog-newpageshidepatrolled' => 'Sakrij pregledane stranice iz popisa novih stranica',
 'tog-extendwatchlist' => 'Proširi popis praćenih stranica tako da prikaže sve promjene, ne samo najnovije',
-'tog-usenewrc' => 'Rabi poboljšan izgled nedavnih promjena (zahtijeva JavaScript)',
+'tog-usenewrc' => 'Grupne promjene po stranici u popisu nedavnih izmjena i popisu praćenih stranica (zahtijeva JavaScript)',
 'tog-numberheadings' => 'Automatski označi naslove brojevima',
 'tog-showtoolbar' => 'Prikaži traku s alatima za uređivanje (zahtijeva JavaScript)',
 'tog-editondblclick' => 'Dvoklik otvara uređivanje stranice (JavaScript)',
@@ -347,7 +347,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Prikaži broj suradnika koji prate stranicu (u nedavnim izmjenama, popisu praćenja i samim člancima)',
 'tog-oldsig' => 'Pregled postojećeg potpisa:',
 'tog-fancysig' => 'Običan potpis kao wikitekst (bez automatske poveznice)',
-'tog-uselivepreview' => 'Uključi trenutačni pretpregled (JavaScript) (eksperimentalno)',
+'tog-uselivepreview' => 'Uključi trenutačni pretpregled (zahtijeva JavaScript) (eksperimentalno)',
 'tog-forceeditsummary' => 'Podsjeti me ako sažetak uređivanja ostavljam praznim',
 'tog-watchlisthideown' => 'Sakrij moja uređivanja s popisa praćenja',
 'tog-watchlisthidebots' => 'Sakrij uređivanja botova s popisa praćenja',
@@ -852,6 +852,7 @@ Molimo Vas pričekajte $1 prije nego što pokušate ponovno.',
 # Email sending
 'php-mail-error-unknown' => 'Nepoznata pogrješka u funkciji PHP-poruke()',
 'user-mail-no-addy' => 'Pokušaj slanja e-maila bez e-mail adrese.',
+'user-mail-no-body' => 'Pokušali ste poslati e-mail bez sadržaja ili s prekratkim sadržajem.',
 
 # Change password dialog
 'resetpass' => 'Promijeni lozinku',
@@ -1328,6 +1329,7 @@ Primijetite da uporaba navigacijskih poveznica resetira Vaše izbore u stupcu.',
 'compareselectedversions' => 'Usporedi odabrane inačice',
 'showhideselectedversions' => 'Otkrij/sakrij odabrane izmjene',
 'editundo' => 'ukloni ovu izmjenu',
+'diff-empty' => 'Nema razlike inačica',
 'diff-multi' => '({{PLURAL:$1|Nije prikazana jedna međuinačica|Nisu prikazane $1 međuinačice|Nije prikazano $1 međuinačica}} {{PLURAL:$2|jednog|$2|$2}} suradnika)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Nije prikazana jedna međuinačica|Nisu prikazane $1 međuinačice|Nije prikazano $1 međuinačica}} više od {{PLURAL:$2|jednog|$2|$2}} suradnika)',
 'difference-missing-revision' => '{{PLURAL:$2|Uređivanje|$2 uređivanja}} sljedeće šifre ($1) ne {{PLURAL:$2|postoji|postoje}}.
@@ -1485,7 +1487,7 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
 'gender-unknown' => 'Neodređeni',
 'gender-male' => 'Muški',
 'gender-female' => 'Ženski',
-'prefs-help-gender' => 'Mogućnost: softver koristi za ispravno oslovljavanje razlikujući spol. Ovaj podatak bit će javan.',
+'prefs-help-gender' => 'Mogućnost softvera da ispravno oslovljava razlikujući spol. Ovaj podatak bit će javan.',
 'email' => 'Adresa elektroničke pošte *',
 'prefs-help-realname' => 'Pravo ime nije obvezno. Ako ga navedete, bit će korišteno za pravnu atribuciju Vaših doprinosa.',
 'prefs-help-email' => 'E-mail adresa nije obvezna, ali je potrebna za obnovu lozinke u slučaju da ju zaboravite.',
@@ -1499,14 +1501,15 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
 'prefs-advancedediting' => 'Napredne mogućnosti',
 'prefs-editor' => 'Uređivač',
 'prefs-preview' => 'Prikaži kako će izgledati',
-'prefs-advancedrc' => 'Napredne opcije',
+'prefs-advancedrc' => 'Napredne mogućnosti',
 'prefs-advancedrendering' => 'Napredne opcije',
 'prefs-advancedsearchoptions' => 'Napredne opcije',
 'prefs-advancedwatchlist' => 'Napredne opcije',
 'prefs-displayrc' => 'Prikaži opcije',
-'prefs-displaysearchoptions' => 'Opcije prikaza',
-'prefs-displaywatchlist' => 'Opcije prikaza',
+'prefs-displaysearchoptions' => 'Mogućnosti prikaza',
+'prefs-displaywatchlist' => 'Mogućnosti prikaza',
 'prefs-diffs' => 'razl',
+'prefs-help-prefershttps' => 'Ova mogućnost će stupiti na snagu kod sljedeće prijave.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Adresa e-pošte pokazuje se ispravnom',
@@ -1950,8 +1953,8 @@ Za optimalnu sigurnost, img_auth.php je onemogućena.',
 'upload_source_file' => '(datoteka na Vašem računalu)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Ova posebna stranica pokazuje sve postavljene datoteke.
-Kad je filtriran po korisniku, popis prikazuje samo one datoteke čiju posljednju inačicu je postavio taj korisnik.',
+'listfiles-summary' => 'Ova stranica pokazuje sve postavljene datoteke.
+Kad je filtriran po suradniku, popis prikazuje samo one datoteke čije je posljednje inačice postavio taj suradnik.',
 'listfiles_search_for' => 'Traži ime slike:',
 'imgfile' => 'datoteka',
 'listfiles' => 'Popis slika',
@@ -2080,6 +2083,7 @@ Možda želite urediti njen opis na [$2 stranici opisa datoteke].',
 'statistics-users-active-desc' => 'Suradnici koji su napravili neku od radnji u posljednjih {{PLURAL:$1|dan|$1 dana}}',
 'statistics-mostpopular' => 'Najposjećenije stranice',
 
+'pageswithprop-prop' => 'Ime osobine:',
 'pageswithprop-submit' => 'Idi',
 
 'doubleredirects' => 'Dvostruka preusmjeravanja',
@@ -2458,6 +2462,7 @@ Pogledajte [[Special:ProtectedPages|zaštićene stranice]] za popis trenutačno
 'prot_1movedto2' => '$1 premješteno na $2',
 'protect-badnamespace-title' => 'Nezaštitljiv imenski prostor',
 'protect-badnamespace-text' => 'Stranice u ovom imenskom prostoru ne mogu se zaštititi.',
+'protect-norestrictiontypes-title' => 'Stranicu nije moguće zaštititi',
 'protect-legend' => 'Potvrda zaštite',
 'protectcomment' => 'Razlog:',
 'protectexpiry' => 'Trajanje zaštite:',
@@ -3120,6 +3125,7 @@ Razlog je vjerojatno vanjska poveznica koja se nalazi na crnom popisu.',
 'pageinfo-protect-cascading' => 'Prenosiva zaštita počinje od ove stranice',
 'pageinfo-protect-cascading-yes' => 'Da',
 'pageinfo-protect-cascading-from' => 'Prenosiva zaštita počinje od',
+'pageinfo-category-info' => 'Informacije o kategoriji',
 'pageinfo-category-pages' => 'Broj stranica',
 'pageinfo-category-subcats' => 'Broj podkategorija',
 'pageinfo-category-files' => 'Broj datoteka',
index 09f45bf..c31763d 100644 (file)
@@ -742,8 +742,8 @@ URL を間違って入力したか、正しくないリンクをたどった可
 理由は不明です。',
 'no-null-revision' => 'ページ「$1」に新しい空編集の版を作成できませんでした。',
 'badtitle' => '正しくないページ名',
-'badtitletext' => '要求されたページ名は、無効、空、正しくない言語間リンク/ウィキ間リンクのページ名、のいずれかです。
-ページ名に使用できない文字が1つ以上含まれている可能性があります。',
+'badtitletext' => '無効または空のページ名が指定されたか、言語間/ウィキ間リンクの方法に誤りがあります。
+ページ名に使用できない文字が含まれている可能性があります。',
 'perfcached' => '以下のデータはキャッシュされており、最新ではない可能性があります。最大 $1 {{PLURAL:$1|件の結果}}がキャッシュされます。',
 'perfcachedts' => '以下のデータはキャッシュされており、最終更新日時は $1 です。最大 $4 {{PLURAL:$4|件の結果}}がキャッシュされます。',
 'querypage-no-updates' => 'ページの更新は無効になっています。
@@ -1345,7 +1345,7 @@ $3が示した理由: ''$2''",
 この差分を閲覧できます。[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]に詳細情報があるかもしれません。",
 'rev-suppressed-diff-view' => "この差分の一方の版は'''秘匿されています'''。
 この差分を閲覧できます。[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 秘匿記録]に詳細情報があるかもしれません。",
-'rev-delundel' => '表示/非表示を切り替え',
+'rev-delundel' => '表示/非表示',
 'rev-showdeleted' => '表示',
 'revisiondelete' => '版の削除と復元',
 'revdelete-nooldid-title' => '無効な対象版',
@@ -1455,7 +1455,7 @@ $1",
 'difference-multipage' => '(ページ間の差分)',
 'lineno' => '$1行:',
 'compareselectedversions' => '選択した版同士を比較',
-'showhideselectedversions' => 'é\81¸æ\8a\9eã\81\97ã\81\9fç\89\88ã\81®è¡¨ç¤º/é\9d\9e表示ã\82\92å\88\87ã\82\8aæ\9b¿ã\81\88',
+'showhideselectedversions' => 'é\81¸æ\8a\9eã\81\97ã\81\9fç\89\88ã\82\92表示/é\9d\9e表示',
 'editundo' => '取り消し',
 'diff-empty' => '(相違点なし)',
 'diff-multi' => '({{PLURAL:$2|$2人の利用者}}による、{{PLURAL:$1|間の$1版}}が非表示)',
@@ -2407,7 +2407,7 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 記録の種類、実行した利用者 (大文字小文字は区別)、影響を受けたページ (大文字小文字は区別) による絞り込みができます。',
 'logempty' => '該当する記録はありません。',
 'log-title-wildcard' => 'この文字列で始まるページ名を検索',
-'showhideselectedlogentries' => 'é\81¸æ\8a\9eã\81\97ã\81\9fè¨\98é\8c²é \85ç\9b®ã\81®è¡¨ç¤º/é\9d\9e表示ã\82\92å\88\87ã\82\8aæ\9b¿ã\81\88',
+'showhideselectedlogentries' => 'é\81¸æ\8a\9eã\81\97ã\81\9fè¨\98é\8c²é \85ç\9b®ã\82\92表示/é\9d\9e表示',
 
 # Special:AllPages
 'allpages' => '全ページ',
index a6c8d0f..b43f299 100644 (file)
@@ -991,8 +991,7 @@ $2
 
 გთხოვთ დაფიქრდეთ, მისაღები არის თუ არა ამ გვერდის რედაქტირების გაგრძელება.
 ინფორმაციისთვის ქვემოთ მოყვანილია ამ გვერდის წაშლის ისტორია:",
-'moveddeleted-notice' => 'ეს გვერდი წაიშალა
-ინფორმაციის მისაღებად ქვემოთ წარმდგენილია შესაბამისი ჩანაწერები წაშლისა და გადაქრმევის ჟურნალებიდან.',
+'moveddeleted-notice' => 'ეს გვერდი წაიშალა. ინფორმაციის მისაღებად ქვემოთ წარმდგენილია შესაბამისი ჩანაწერები წაშლისა და გადაქრმევის ჟურნალებიდან.',
 'log-fulllog' => 'ყველა ჟურნალის ხილვა',
 'edit-hook-aborted' => 'შესწორება გაუქმებულია გადამჭერით.
 დამატებითი ახსნა არ ჩაწერილა.',
@@ -1715,7 +1714,7 @@ $1",
 'uploadwarning' => 'გადატვირთვის შეხსენება',
 'uploadwarning-text' => 'გთხოვთ ჩაასწოროთ ფაილის აღწერა ქვევით და ხელმეორედ სცადოთ.',
 'savefile' => 'ფაილის შენახვა',
-'uploadedimage' => 'á\83\93á\83\90á\83\9bá\83\90á\83¢á\83\94á\83\91á\83\90 "[[$1]]"',
+'uploadedimage' => 'á\83\90á\83\98á\83¢á\83\95á\83\98á\83 á\83\97á\83\90 â\80\9e[[$1]]â\80\9c',
 'overwroteimage' => 'ატვირთულია „[[$1]]-ის“ ახალი ვერსია',
 'uploaddisabled' => 'ატვირთვა შეუძლებელია',
 'copyuploaddisabled' => 'URL ატვირთვა გაღიშულია',
@@ -3933,7 +3932,7 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'tag-filter' => '[[Special:Tags|მონიშვნათა]] ფილტრი',
 'tag-filter-submit' => 'გაფილტვრა',
 'tags-title' => 'მონიშვნები',
-'tags-intro' => 'á\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93á\83\96á\83\94 á\83¬á\83\90á\83 á\83\9bá\83\9dá\83\93á\83\92á\83\94á\83\9cá\83\98á\83\9aá\83\98á\83\90 á\83\98á\83\9b á\83\9bá\83\9dá\83\9cá\83\98á\83¨á\83\95á\83\9cá\83\90á\83\97á\83\90 á\83¡á\83\98á\83\90, á\83 á\83\9dá\83\9bá\83\9aá\83\98á\83\97á\83\90á\83ª á\83\9eá\83 á\83\9dá\83\92á\83 á\83\90á\83\9bá\83£á\83\9aá\83\98 á\83£á\83\96á\83 á\83£á\83\9cá\83\95á\83\94á\83\9aá\83§á\83\9dá\83¤á\83\90 á\83\9bá\83\9dá\83\9cá\83\98á\83¨á\83\9cá\83\90á\83\95á\83¡ á\83¨á\83\94á\83¡á\83¬á\83\9dá\83 á\83\94á\83\91á\83\94á\83\91á\83¡ á\83\93á\83\90 á\83\90á\83¡á\83\94á\83\95á\83\94 á\83\90á\83\9b á\83\9bá\83\9dá\83\9cá\83\98á\83¨á\83\95á\83\9cá\83\90á\83\97á\83\90 á\83\9bá\83\9cá\83\98á\83¨á\83\95á\83\9cá\83\94á\83\9aá\83\9dá\83\91á\83\94á\83\91á\83¡.',
+'tags-intro' => 'á\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93á\83\96á\83\94 á\83¬á\83\90á\83 á\83\9bá\83\9dá\83\93á\83\92á\83\94á\83\9cá\83\98á\83\9aá\83\98á\83\90 á\83\9bá\83\9dá\83\9cá\83\98á\83¨á\83\95á\83\9cá\83\90á\83\97á\83\90 á\83¡á\83\98á\83\90, á\83 á\83\9dá\83\9bá\83\9aá\83\98á\83\97á\83\90á\83ª á\83\9eá\83 á\83\9dá\83\92á\83 á\83\90á\83\9bá\83£á\83\9aá\83\98 á\83£á\83\96á\83 á\83£á\83\9cá\83\95á\83\94á\83\9aá\83§á\83\9dá\83¤á\83\90 á\83\9bá\83\9dá\83\9cá\83\98á\83¨á\83\9cá\83\90á\83\95á\83¡ á\83¨á\83\94á\83¡á\83¬á\83\9dá\83 á\83\94á\83\91á\83\94á\83\91á\83¡, á\83\90á\83¡á\83\94á\83\95á\83\94 á\83\90á\83\9b á\83\9bá\83\9dá\83\9cá\83\98á\83¨á\83\95á\83\9cá\83\90á\83\97á\83\90 á\83\9bá\83\9cá\83\98á\83¨á\83\95á\83\9cá\83\94á\83\9aá\83\9dá\83\91á\83\90.',
 'tags-tag' => 'ტეგის სახელი',
 'tags-display-header' => 'რედაქტირებების სიაში ცვლილებების წარმოდგენა',
 'tags-description-header' => 'მნიშვნელობის სრული აღწერა',
index d3c7270..d23ba98 100644 (file)
@@ -813,6 +813,8 @@ $2',
 'userlogin-resetpassword-link' => '내 비밀번호 재설정',
 'helplogin-url' => 'Help:로그인',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|로그인에 관한 도움말]]',
+'userlogin-loggedin' => '이미 $1로 로그인되어 있습니다. 아래의 양식으로 다른 계정으로 로그인하세요.',
+'userlogin-createanother' => '다른 계정 만들기',
 'createacct-join' => '아래에 정보를 입력하세요.',
 'createacct-another-join' => '아래에 새 계정의 정보를 입력하세요.',
 'createacct-emailrequired' => '이메일 주소',
index 1cf830a..d003476 100644 (file)
@@ -2962,7 +2962,7 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
 'tooltip-n-mainpage' => "Besicht d'Haaptsäit",
 'tooltip-n-mainpage-description' => "Besicht d'Haaptsäit",
 'tooltip-n-portal' => 'Iwwer de Portal, wat Dir maache kënnt, wou wat ze fannen ass',
-'tooltip-n-currentevents' => "D'Aktualitéit a wat derhannert ass",
+'tooltip-n-currentevents' => "D'Aktualitéit a wat derhanner ass",
 'tooltip-n-recentchanges' => 'Lëscht vun de rezenten Ännerungen op {{SITENAME}}.',
 'tooltip-n-randompage' => 'Zoufälleg Säit',
 'tooltip-n-help' => 'Hëllefsäiten weisen.',
index b5f4b1b..6da9f87 100644 (file)
@@ -799,6 +799,9 @@ $2',
 'userlogin-resetpassword-link' => 'താങ്കളുടെ രഹസ്യവാക്ക് പുനഃസജ്ജീകരിക്കുക',
 'helplogin-url' => 'Help:പ്രവേശനം',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|പ്രവേശന സഹായം]]',
+'userlogin-loggedin' => 'താങ്കൾ ഇപ്പോൾ തന്നെ {{GENDER:$1|$1}} ആയി പ്രവേശിച്ചിരിക്കുന്നു.
+താഴെ ഉള്ള ഫോം ഉപയോഗിച്ച് മറ്റൊരു ഉപയോക്താവായി പ്രവേശിക്കാവുന്നതാണ്.',
+'userlogin-createanother' => 'മറ്റൊരു അംഗത്വമെടുക്കുക',
 'createacct-join' => 'താങ്കളെപ്പറ്റിയുള്ള വിവരങ്ങൾ താഴെ നൽകുക.',
 'createacct-another-join' => 'പുതിയ അംഗത്വത്തിന്റെ വിവരങ്ങൾ താഴെ നൽകുക.',
 'createacct-emailrequired' => 'ഇമെയിൽ വിലാസം',
@@ -2665,7 +2668,7 @@ $1',
 'contributions' => '{{GENDER:$1|ഉപയോക്താവിന്റെ}} സംഭാവനകൾ',
 'contributions-title' => '$1 എന്ന ഉപയോക്താവിന്റെ സംഭാവനകൾ',
 'mycontris' => 'സംഭാവനകൾ',
-'contribsub2' => '{{GENDER:$3|$1} എന്ന ഉപയോക്താവിന്റെ $2.',
+'contribsub2' => 'ഉപയോക്താവ് {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'ഈ മാനദണ്ഡങ്ങളുമായി യോജിക്കുന്ന മാറ്റങ്ങൾ ഒന്നും കണ്ടില്ല.',
 'uctop' => '(നിലവിലുള്ളത്)',
 'month' => 'മാസം:',
index 64d0725..74eddc5 100644 (file)
@@ -3889,7 +3889,10 @@ Du skal ha motteke [{{SERVER}}{{SCRIPTPATH}}/COPYING ein kopi av GNU General Pub
 'tags-tag' => 'Merkenamn',
 'tags-display-header' => 'Utsjånad på endringslister',
 'tags-description-header' => 'Tyding',
+'tags-active-header' => 'Verksamt?',
 'tags-hitcount-header' => 'Merkte endringar',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nei',
 'tags-edit' => 'endra',
 'tags-hitcount' => '{{PLURAL:$1|éi endring|$1 endringar}}',
 
index ba3b133..a81aea6 100644 (file)
@@ -774,21 +774,20 @@ Sòn a l'é normalment causà da l'andèje dapress a na vej liura stòrica a na
 'blocked-notice-logextract' => "S'utent a l'é al moment blocà.
 'Me arferiment, sì-sota a-i é la dariera anotassion da l'argistr dij blocagi:",
 'clearyourcache' => "'''Nòta:''' na vira che a l'ha salvà, a peul esse che a-j fasa da manca ëd passé via la memorisassion ëd sò programa ëd navigassion për podèj ës-ciairé le modìfiche.
-* '''Firefox / Safari:''' Che a ten-a sgnacà ''Majùscole'' antramentre che a sgnaca col rat ansima a ''Agiorné'', ò pura che a sgnaca tut ansema ''Ctrl-F5'' o ''Cmd-R'' (''*'' ansima ai Mac);
-* '''Google Chrome:''' Che a sgnaca ''Ctrl-Shift-R'' (''*-Majùscole-R'' ansima ai Mac);
-* '''Internet Explorer:''' Che a ten-a sgnacà ''Ctrl'' antramentre che a sgnaca col rat ansima a ''Agiorné'', ò pura che a sgnaca tut ansema ''Ctrl-F5'';
-* '''Konqueror:''': A basta mach sgnaché ël boton ''Agiorné'', ò pura sgnaché ''F5'';
-*'''Opera''' J'utent a peulo avèj da manca ëd dësvujdé 'd continuo soa memorisassion andrinta a ''Utiss → Gust''.",
-'usercssyoucanpreview' => "'''Drita:''' che a deuvra ël boton \"{{int:showpreview}}\" për controlé l'efet ëd sò còdes CSS dnans ëd salvelo.",
-'userjsyoucanpreview' => "'''Drita:''' che a deuvra ël boton «{{int:showpreview}}» për controlé l'efet ëd sò còdes JS dnans ëd salvelo.",
-'usercsspreview' => "'''Che a varda che lòn che a s-ciàira a l'é nomach na preuva ëd sò CSS.'''
+* '''Firefox / Safari:''' Che a ten-a sgnacà ''Majùscole'' antramentre che a sgnaca col rat ansima a ''Agiorné'', ò pura che a sgnaca ''Ctrl-F5'' o ''Cmd-R'' (''⌘-R'' ansima ai Mac)
+* '''Google Chrome:''' Che a sgnaca ''Ctrl-Majùscole-R'' (''⌘-Majùscole-R'' ansima ai Mac)
+* '''Internet Explorer:''' Che a ten-a sgnacà ''Ctrl'' antramentre che a sgnaca col rat ansima a ''Agiorné'', ò pura che a sgnaca tut ansema ''Ctrl-F5''
+*'''Opera''' Ch'a dësveuida soa memorisassion andrinta a ''Utiss → Gust''",
+'usercssyoucanpreview' => "'''Drita:''' che a deuvra ël boton «{{int:showpreview}}» për controlé l'efet ëd sò neuv còdes CSS dnans ëd salvelo.",
+'userjsyoucanpreview' => "'''Drita:''' che a deuvra ël boton «{{int:showpreview}}» për controlé l'efet ëd sò neuv còdes JavaScript dnans ëd salvelo.",
+'usercsspreview' => "'''Che a varda che lòn che a s-ciàira a l'é nomach na preuva ëd sò feuj CSS.'''
 '''A l'é ancó nen stàit salvà!'''",
-'userjspreview' => "'''Che as visa che a l'é mach antramentr che as fa na preuva ëd sò Javascript, che a l'é ancó pa stàit salvà!'''",
-'sitecsspreview' => "'''Che a varda che a l'é mach an mente ch'a preuva sto CSS.'''
-'''A l'é ancó pa stàit salvà!'''",
-'sitejspreview' => "'''Che a varda che a l'é mach an mente ch'a preuva sto còdes JavaScript.'''
-'''A l'é ancó pa stàit salvà!'''",
-'userinvalidcssjstitle' => "'''Avis:''' A-i é pa gnun-a pel \"\$1\". Che as visa che le pàgine .css e .js che un as fa daspërchiel a deuvro tute minùscole për tìtol, pr'esempi {{ns:user}}:Scaramacaj/vector.css nopà che {{ns:user}}:Scaramacaj/Vector.css.",
+'userjspreview' => "'''Che as visa che a l'é mach antramentre che as fa na preuva ëd sò còdes Javascript e che a l'é ancó pa stàit salvà!'''",
+'sitecsspreview' => "'''Che a varda che a l'é mach an camin ch'a preuva cost CSS.'''
+'''A l'é pa ancora stàit salvà!'''",
+'sitejspreview' => "'''Che a varda che a l'é mach an camin ch'a preuva cost còdes JavaScript.'''
+'''A l'é pa ancora stàit salvà!'''",
+'userinvalidcssjstitle' => "'''Atension:''' A-i é gnun-a pel «$1». Che as visa che le pàgine .css e .js che un as fa daspërchiel a deuvro tute minùscole për tìtol, pr'esempi {{ns:user}}:Scaramacaj/vector.css nopà che {{ns:user}}:Scaramacaj/Vector.css.",
 'updated' => '(Agiornà)',
 'note' => "'''NÒTA:'''",
 'previewnote' => "'''Che a ten-a present che costa-sì a l'é mach na preuva.'''
@@ -3056,7 +3055,7 @@ An fasend-lo marcé ansima a sò ordinator chiel a podrìa porteje ëd dann a s
 
 # Human-readable timestamps
 'minutes-ago' => '$1 {{PLURAL:$1|minuta|minute}} fa',
-'seconds-ago' => '$1 {{PLURAL:$1|second|second}} fa',
+'seconds-ago' => '$1 {{PLURAL:$1second}} fa',
 'monday-at' => 'Lùn-es a $1',
 'tuesday-at' => 'Màrtes a $1',
 'wednesday-at' => 'Merco a $1',
@@ -3820,23 +3819,26 @@ A dovrìa avèj arseivù [{{SERVER}}{{SCRIPTPATH}}/COPYING na còpia dla Licensa
 'htmlform-submit' => 'Mandé',
 'htmlform-reset' => 'Gavé le modìfiche',
 'htmlform-selectorother-other' => 'Àutr',
+'htmlform-no' => 'Nò',
+'htmlform-yes' => 'É',
+'htmlform-chosen-placeholder' => "Serne n'opsion",
 
 # SQLite database support
 'sqlite-has-fts' => '$1 con arserca an test pien mantnùa',
 'sqlite-no-fts' => '$1 sensa arserca an test pien mantnùa',
 
 # New logging system
-'logentry-delete-delete' => "$1 a l'ha scancelà la pàgina $3",
-'logentry-delete-restore' => "$1 a l'ha ripristinà la pàgina $3",
-'logentry-delete-event' => "$1 a l'ha modificà la visibilità ëd {{PLURAL:$5|n'event dël registr|$5 event dël registr}} dzora $3: $4",
-'logentry-delete-revision' => "$1 a l'ha modificà la visibilità ëd {{PLURAL:$5|na revision|$5 revision}} dzora la pàgina $3: $4",
-'logentry-delete-event-legacy' => "$1 a l'ha modificà la visibilità dj'eveniment dël registr dzora $3",
-'logentry-delete-revision-legacy' => "$1 a l'ha modificà la visibilità dle revision dzora la pàgina $3",
-'logentry-suppress-delete' => "$1 a l'ha eliminà la pàgina $3",
-'logentry-suppress-event' => "$1 a l'ha modificà segretament la visibilità ëd {{PLURAL:$5|n'eveniment dël registr|$5 eveniment dël registr}} dzora $3: $4",
-'logentry-suppress-revision' => "$1 a l'ha modificà segretament la visibilità ëd {{PLURAL:$5|na revision|$5 revision}} dzora la pàgina $3: $4",
-'logentry-suppress-event-legacy' => "$1 l'ha modificà segretament la visibilità dj'evenimentt dël registr dzora $3",
-'logentry-suppress-revision-legacy' => "$1 a l'ha modificà segretament la visibilità dle revision dzora la pàgina $3",
+'logentry-delete-delete' => "$1 a l'ha {{GENDER:$2|scancelà}} la pàgina $3",
+'logentry-delete-restore' => "$1 {{GENDER:$2|a l'ha ripristinà}} la pàgina $3",
+'logentry-delete-event' => "$1 {{GENDER:$2|a l'ha modificà}} la visibilità ëd {{PLURAL:$5|n'event dël registr|$5 event dël registr}} dzora $3: $4",
+'logentry-delete-revision' => "$1 {{GENDER:$2|a l'ha modificà}} la visibilità ëd {{PLURAL:$5|na revision|$5 revision}} dzora la pàgina $3: $4",
+'logentry-delete-event-legacy' => "$1 {{GENDER:$2|a l'ha modificà}} la visibilità dj'eveniment dël registr dzora $3",
+'logentry-delete-revision-legacy' => "$1 {{GENDER:$2|a l'ha modificà}} la visibilità dle revision dzora la pàgina $3",
+'logentry-suppress-delete' => "$1 {{GENDER:$2|a l'ha eliminà}} la pàgina $3",
+'logentry-suppress-event' => "$1 {{GENDER:$2|a l'ha modificà}} da stërmà la visibilità ëd {{PLURAL:$5|n'eveniment dël registr|$5 eveniment dël registr}} dzora $3: $4",
+'logentry-suppress-revision' => "$1 {{GENDER:$2|a l'ha modificà}} da stërmà la visibilità ëd {{PLURAL:$5|na revision|$5 revision}} dzora la pàgina $3: $4",
+'logentry-suppress-event-legacy' => "$1 {{GENDER:$2|a l'ha modificà}} da stërmà la visibilità dj'eveniment dël registr dzora $3",
+'logentry-suppress-revision-legacy' => "$1 {{GENDER:$2|a l'ha modificà}} da stërmà la visibilità dle revision dzora la pàgina $3",
 'revdelete-content-hid' => 'contnù stërmà',
 'revdelete-summary-hid' => 'resumé dle modìfiche stërmà',
 'revdelete-uname-hid' => 'stranòm stërmà',
@@ -3845,19 +3847,20 @@ A dovrìa avèj arseivù [{{SERVER}}{{SCRIPTPATH}}/COPYING na còpia dla Licensa
 'revdelete-uname-unhid' => 'stranòm dëscoatà',
 'revdelete-restricted' => "restrission aplicà a j'aministrator",
 'revdelete-unrestricted' => "restrission për j'aministrator gavà",
-'logentry-move-move' => "$1 a l'ha tramudà la pàgina $3 a $4",
-'logentry-move-move-noredirect' => "$1 a l'ha tramudà la pàgina $3 a $4 sensa lassé na ridiression",
-'logentry-move-move_redir' => "$1 a l'ha tramudà la pàgina $3 a $4 ansima a na ridiression",
-'logentry-move-move_redir-noredirect' => "$1 a l'ha tramudà la pàgina $3 a $4 ansima a na ridiression sensa lassé na ridiression",
-'logentry-patrol-patrol' => "$1 a l'ha marcà la revision $4 dla pàgina $3 'me controlà",
-'logentry-patrol-patrol-auto' => "$1 a l'ha marcà automaticament la revision $4 dla pàgina $3 'me controlà",
-'logentry-newusers-newusers' => "Ël cont utent $1 a l'é stàit creà",
-'logentry-newusers-create' => "Ël cont utent $1 a l'é stàit creà",
-'logentry-newusers-create2' => "Ël cont utent $3 a l'é stàit creà da $1",
-'logentry-newusers-autocreate' => "Ël cont $1 a l'é stàit creà an automàtich",
-'logentry-rights-rights' => "$1 a l'ha tramudà l'apartenesa a la partìa për $3 da $4 a $5",
-'logentry-rights-rights-legacy' => "$1 a l'ha tramudà l'apartenensa a la partìa për $3",
-'logentry-rights-autopromote' => "$1 a l'é stàit automaticament promovù da $4 a $5",
+'logentry-move-move' => "$1 {{GENDER:$2|a l'ha tramudà}} la pàgina $3 a $4",
+'logentry-move-move-noredirect' => "$1 {{GENDER:$2|a l'ha tramudà}} la pàgina $3 a $4 sensa lassé na ridiression",
+'logentry-move-move_redir' => "$1 {{GENDER:$2|a l'ha tramudà}} la pàgina $3 a $4 ansima a na ridiression",
+'logentry-move-move_redir-noredirect' => "$1 {{GENDER:$2|a l'ha tramudà}} la pàgina $3 a $4 ansima a na ridiression sensa lassé na ridiression",
+'logentry-patrol-patrol' => "$1 {{GENDER:$2|a l'ha marcà}} la revision $4 dla pàgina $3 'me controlà",
+'logentry-patrol-patrol-auto' => "$1 {{GENDER:$2|a l'ha marcà}} an automàtich la revision $4 dla pàgina $3 'me controlà",
+'logentry-newusers-newusers' => "Ël cont utent $1 {{GENDER:$2|a l'é stàit creà}}",
+'logentry-newusers-create' => "Ël cont utent $1 {{GENDER:$2|a l'é stàit creà}}",
+'logentry-newusers-create2' => "Ël cont utent $3 {{GENDER:$2|a l'é stàit creà}} da $1",
+'logentry-newusers-byemail' => "Ël cont utent $3 a l'é {{GENDER:$2|stàit creà}} da $1 e la ciav a l'é stàita mandà për pòsta eletrònica",
+'logentry-newusers-autocreate' => "Ël cont $1 a l'é {{GENDER:$2|stàit creà}} an automàtich",
+'logentry-rights-rights' => "$1 {{GENDER:$2|a l'ha modificà}} l'apartenensa a la partìa për $3 da $4 a $5",
+'logentry-rights-rights-legacy' => "$1 {{GENDER:$2|a l'ha modificà}} l'apartenensa a la partìa për $3",
+'logentry-rights-autopromote' => "$1 a l'é {{GENDER:$2|stàit promovù}} an automàtich da $4 a $5",
 'rightsnone' => '(gnun)',
 
 # Feedback
@@ -3912,6 +3915,7 @@ Dësnò, a peul dovré ël formolari semplificà sì-sota. Sò coment a sarà gi
 'api-error-ok-but-empty' => 'Eror antern: Gnun-a rispòsta dal servent.',
 'api-error-overwrite' => "Dzorascrive ansima a n'archivi esistent a l'é nen përmëttù.",
 'api-error-stashfailed' => "Eror antern: ël servent a l'ha pa podù memorisé l'archivi a temp.",
+'api-error-publishfailed' => "Eror antern: Ël servent a l'ha pa podù publiché l'archivi provisòri.",
 'api-error-timeout' => "Ël servent a l'ha pa rëspondù ant ël temp ëspetà.",
 'api-error-unclassified' => "A l'é capitaje n'eror nen conossù.",
 'api-error-unknown-code' => 'Eror sconossù: «$1».',
@@ -3932,4 +3936,22 @@ Dësnò, a peul dovré ël formolari semplificà sì-sota. Sò coment a sarà gi
 'duration-centuries' => '$1 {{PLURAL:$1|sécol|sécoj}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milenari|milenari}}',
 
+# Image rotation
+'rotate-comment' => 'Plancià virà ëd $1 {{PLURAL:$1|gre}} an sens orari',
+
+# Limit report
+'limitreport-title' => "Dàit d'otimisassion ëd l'analisator:",
+'limitreport-cputime' => "Temp CPU d'utilisassion",
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|second}}',
+'limitreport-walltime' => "Temp real d'utilisassion",
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|second}}',
+'limitreport-ppvisitednodes' => 'Cont dij neu ëd prepocessor visità',
+'limitreport-ppgeneratednodes' => 'Cont dij neu ëd preprocessor generà',
+'limitreport-postexpandincludesize' => "Taja d'anclusion dòp espansion",
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => "Taja dl'argoment ëd lë stamp",
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => "Pi granda përfondità d'espansion",
+'limitreport-expensivefunctioncount' => "Cont ëd le fonsion d'anàlisi care",
+
 );
index e790e10..cd94099 100644 (file)
@@ -165,7 +165,7 @@ $messages = array(
 'tog-hidepatrolled' => 'په وروستيو بدلونونو کې څارل شوې سمونونه پټول',
 'tog-newpageshidepatrolled' => 'د نوؤ مخونو په لړليک کې کتل شوي مخونه پټول',
 'tog-extendwatchlist' => 'يوازې د وروستني بدلونونو د ښکاره کولو لپاره نه بلکه د ټولو بدلونونو د ښکاره کولو لپاره کتنلړ غځول',
-'tog-usenewrc' => 'په کتنلړ او وروستي بدلونو مخ باندې ډله ايز بدلونونه (جاوا سکرېپټ ته اړتيا ده)',
+'tog-usenewrc' => 'په کتنلړ او وروستي بدلونو مخ باندې ډله ايز بدلونونه',
 'tog-numberheadings' => 'د سرليکونو خپلکاره شمېرايښودنه',
 'tog-showtoolbar' => 'د سمون اوزارپټه ښکاره کول',
 'tog-editondblclick' => 'په دوه کلېک سره د مخونو سمون',
@@ -201,6 +201,7 @@ $messages = array(
 'tog-showhiddencats' => 'پټې وېشنيزې ښکاره کول',
 'tog-norollbackdiff' => 'پرشاتمبولو وروسته توپيرونه نه ښودل',
 'tog-useeditwarning' => 'کله چې يو سمون مخ څخه د بدلونونو د خوندي کولو پرته وځم خبر دې شم',
+'tog-prefershttps' => 'د ننوتلو پر مهال تل يوه خوندي اړيکتيا کارول',
 
 'underline-always' => 'تل',
 'underline-never' => 'هېڅکله',
@@ -976,6 +977,7 @@ $1',
 'compareselectedversions' => 'ټاکلې بڼې سره پرتلل',
 'showhideselectedversions' => 'ټاکلې بڼې ښکاره کول/پټول',
 'editundo' => 'ناکړ',
+'diff-empty' => '(بې توپيره)',
 'diff-multi' => ' د ({{PLURAL:$2| يو کارن|$2 کارنانو}} لخوا {{PLURAL:$1|يوه منځګړې بڼه|$1 منځګړې بڼې}}د  نه ده ښکاره شوې)',
 
 # Search results
index 74d7cc0..214a5d8 100644 (file)
@@ -328,10 +328,10 @@ $messages = array(
 'tog-extendwatchlist' => 'Listagem expandida de todas as mudanças às páginas vigiadas, não apenas das mais recentes',
 'tog-usenewrc' => 'Agrupar alterações por página nas mudanças recentes e páginas vigiadas',
 'tog-numberheadings' => 'Auto-numerar cabeçalhos',
-'tog-showtoolbar' => 'Mostrar barra de edição (JavaScript)',
-'tog-editondblclick' => 'Editar páginas quando houver um clique duplo (JavaScript)',
+'tog-showtoolbar' => 'Mostrar barra de edição',
+'tog-editondblclick' => 'Editar páginas quando houver um clique duplo',
 'tog-editsection' => 'Possibilitar a edição de seções com links [editar]',
-'tog-editsectiononrightclick' => 'Possibilitar a edição de seções por clique com o botão direito no título da seção (JavaScript)',
+'tog-editsectiononrightclick' => 'Possibilitar a edição de seções por clique com o botão direito no título da seção',
 'tog-showtoc' => 'Mostrar índice (para páginas com mais de três seções)',
 'tog-rememberpassword' => 'Recordar os meus dados neste browser (no máximo, durante $1 {{PLURAL:$1|dia|dias}})',
 'tog-watchcreations' => 'Adicionar as páginas e ficheiros que eu criar às minhas páginas vigiadas',
@@ -349,7 +349,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Mostrar o número de utilizadores a vigiar',
 'tog-oldsig' => 'Assinatura existente:',
 'tog-fancysig' => 'Tratar assinatura como texto wiki (sem link automático)',
-'tog-uselivepreview' => 'Usar a antevisão ao vivo (requer JavaScript; é experimental)',
+'tog-uselivepreview' => 'Usar a antevisão ao vivo (experimental)',
 'tog-forceeditsummary' => 'Avisar-me se deixar o resumo da edição vazio',
 'tog-watchlisthideown' => 'Esconder as minhas edições ao listar mudanças às páginas vigiadas',
 'tog-watchlisthidebots' => 'Esconder edições de robôs ao listar mudanças às páginas vigiadas',
@@ -445,15 +445,15 @@ $messages = array(
 'category_header' => 'Páginas na categoria "$1"',
 'subcategories' => 'Subcategorias',
 'category-media-header' => 'Multimédia na categoria "$1"',
-'category-empty' => "''Esta categoria não contém atualmente nenhuma página ou ficheiro multimídia.''",
+'category-empty' => "''Esta categoria não contém atualmente nenhuma página ou ficheiro multimédia.''",
 'hidden-categories' => '{{PLURAL:$1|Categoria oculta|Categorias ocultas}}',
 'hidden-category-category' => 'Categorias ocultas',
 'category-subcat-count' => '{{PLURAL:$2|Esta categoria só contém a seguinte subcategoria.|Esta categoria contém {{PLURAL:$1|a seguinte subcategoria|as seguintes $1 subcategorias}} (de um total de $2).}}',
 'category-subcat-count-limited' => 'Esta categoria tem {{PLURAL:$1|a seguinte subcategoria|as seguintes $1 subcategorias}}.',
 'category-article-count' => '{{PLURAL:$2|Esta categoria só contém a seguinte página.|Esta categoria contém {{PLURAL:$1|a seguinte página|as seguintes $1 páginas}} (de um total de $2).}}',
-'category-article-count-limited' => 'Há, nesta categoria, {{PLURAL:$1|a página a seguir|as $1 páginas a seguir}}.',
-'category-file-count' => '{{PLURAL:$2|Esta categoria só contém o seguinte arquivo.|Esta categoria contém {{PLURAL:$1|o seguinte arquivo|os seguintes $1 arquivos}} (de um total de $2).}}',
-'category-file-count-limited' => 'Nesta categoria há {{PLURAL:$1|um arquivo|$1 arquivos}}.',
+'category-article-count-limited' => 'Nesta categoria há {{PLURAL:$1|uma página|$1 páginas}}.',
+'category-file-count' => '{{PLURAL:$2|Esta categoria só contém o seguinte ficheiro.|Esta categoria contém {{PLURAL:$1|o seguinte ficheiro|os seguintes $1 ficheiros}} (de um total de $2).}}',
+'category-file-count-limited' => 'Nesta categoria há {{PLURAL:$1|um ficheiro|$1 ficheiros}}.',
 'listingcontinuesabbrev' => 'cont.',
 'index-category' => 'Páginas indexadas',
 'noindex-category' => 'Páginas não indexadas',
@@ -476,9 +476,9 @@ $messages = array(
 'qbbrowse' => 'Navegar',
 'qbedit' => 'Editar',
 'qbpageoptions' => 'Esta página',
-'qbmyoptions' => 'Minhas páginas',
+'qbmyoptions' => 'As minhas páginas',
 'qbspecialpages' => 'Páginas especiais',
-'faq' => 'FAQ',
+'faq' => 'Perguntas frequentes',
 'faqpage' => 'Project:FAQ',
 
 # Vector skin
@@ -488,7 +488,7 @@ $messages = array(
 'vector-action-protect' => 'Proteger',
 'vector-action-undelete' => 'Restaurar',
 'vector-action-unprotect' => 'Alterar proteção',
-'vector-simplesearch-preference' => 'Ativar barra de buscas simplificada (apenas no tema Vector)',
+'vector-simplesearch-preference' => 'Ativar barra de pesquisa simplificada (apenas no tema Vector)',
 'vector-view-create' => 'Criar',
 'vector-view-edit' => 'Editar',
 'vector-view-history' => 'Ver histórico',
@@ -517,7 +517,7 @@ $messages = array(
 'edit' => 'Editar',
 'create' => 'Criar',
 'editthispage' => 'Editar esta página',
-'create-this-page' => 'Criar/iniciar esta página',
+'create-this-page' => 'Criar esta página',
 'delete' => 'Eliminar',
 'deletethispage' => 'Eliminar esta página',
 'undeletethispage' => 'Restaurar esta página',
@@ -528,12 +528,12 @@ $messages = array(
 'protectthispage' => 'Proteger esta página',
 'unprotect' => 'Alterar proteção',
 'unprotectthispage' => 'Alterar a proteção desta página',
-'newpage' => 'Nova página',
+'newpage' => 'Página nova',
 'talkpage' => 'Discutir esta página',
 'talkpagelinktext' => 'discussão',
 'specialpage' => 'Página especial',
 'personaltools' => 'Ferramentas pessoais',
-'postcomment' => 'Nova seção',
+'postcomment' => 'Seção nova',
 'articlepage' => 'Ver página de conteúdo',
 'talk' => 'Discussão',
 'views' => 'Vistas',
@@ -541,10 +541,10 @@ $messages = array(
 'userpage' => 'Ver página de utilizador',
 'projectpage' => 'Ver página de projeto',
 'imagepage' => 'Ver página de ficheiro',
-'mediawikipage' => 'Ver página de mensagens',
-'templatepage' => 'Ver página de predefinições',
+'mediawikipage' => 'Ver página da mensagem',
+'templatepage' => 'Ver página da predefinição',
 'viewhelppage' => 'Ver página de ajuda',
-'categorypage' => 'Ver página de categorias',
+'categorypage' => 'Ver página da categoria',
 'viewtalkpage' => 'Ver discussão',
 'otherlanguages' => 'Noutras línguas',
 'redirectedfrom' => '(Redireccionado de $1)',
@@ -567,7 +567,7 @@ $1',
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Sobre a {{SITENAME}}',
 'aboutpage' => 'Project:Sobre',
-'copyright' => 'Conteúdo disponibilizado nos termos da $1.',
+'copyright' => 'Conteúdo disponibilizado nos termos da $1, salvo indicação em contrário.',
 'copyrightpage' => '{{ns:project}}:Direitos_de_autor',
 'currentevents' => 'Notícias',
 'currentevents-url' => 'Project:Notícias',
@@ -596,16 +596,16 @@ Consulte a página da [[Special:Version|versão do sistema]].',
 'youhavenewmessages' => 'Tem $1 ($2).',
 'newmessageslink' => 'mensagens novas',
 'newmessagesdifflink' => 'comparar com a penúltima revisão',
-'youhavenewmessagesfromusers' => 'Você tem $1 de {{PLURAL:$3|outro utilizador|$3 utilizadores}} ($2).',
-'youhavenewmessagesmanyusers' => 'Você tem $1 de muitos utilizadores ($2).',
+'youhavenewmessagesfromusers' => 'Tem $1 de {{PLURAL:$3|outro utilizador|$3 utilizadores}} ($2).',
+'youhavenewmessagesmanyusers' => 'Tem $1 de muitos utilizadores ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|uma mensagem nova|mensagens novas}}',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|última alteração|últimas alterações}}',
 'youhavenewmessagesmulti' => 'Tem mensagens novas em $1',
 'editsection' => 'editar',
 'editold' => 'editar',
-'viewsourceold' => 'ver código',
+'viewsourceold' => 'ver código-fonte',
 'editlink' => 'editar',
-'viewsourcelink' => 'ver fonte',
+'viewsourcelink' => 'ver código-fonte',
 'editsectionhint' => 'Editar seção: $1',
 'toc' => 'Índice',
 'showtoc' => 'mostrar',
@@ -617,7 +617,7 @@ Consulte a página da [[Special:Version|versão do sistema]].',
 'restorelink' => '{{PLURAL:$1|uma edição eliminada|$1 edições eliminadas}}',
 'feedlinks' => "''Feed'':",
 'feed-invalid' => "Tipo de subscrição de ''feed'' inválido.",
-'feed-unavailable' => 'Os "feeds" não se encontram disponíveis',
+'feed-unavailable' => 'Não há "feeds" disponíveis',
 'site-rss-feed' => "''Feed'' RSS $1",
 'site-atom-feed' => "''Feed'' Atom $1",
 'page-rss-feed' => "''Feed'' RSS de \"\$1\"",
@@ -632,7 +632,7 @@ Consulte a página da [[Special:Version|versão do sistema]].',
 'nstab-media' => 'Multimédia',
 'nstab-special' => 'Página especial',
 'nstab-project' => 'Página do projeto',
-'nstab-image' => 'Arquivo',
+'nstab-image' => 'Ficheiro',
 'nstab-mediawiki' => 'Mensagem',
 'nstab-template' => 'Predefinição',
 'nstab-help' => 'Ajuda',
@@ -651,6 +651,9 @@ Encontra uma lista das páginas especiais válidas em [[Special:SpecialPages|{{i
 # General errors
 'error' => 'Erro',
 'databaseerror' => 'Erro na base de dados',
+'databaseerror-text' => 'Ocorreu um erro na consulta à base de dados.
+Isto pode indicar um defeito no programa.',
+'databaseerror-textcl' => 'Ocorreu um erro na consulta à base de dados.',
 'databaseerror-error' => 'Erro: $1',
 'laggedslavemode' => "'''Aviso:''' A página pode não conter as atualizações mais recentes.",
 'readonly' => 'Base de dados bloqueada (limitada a leituras)',
@@ -752,7 +755,7 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências]].'
 'userlogin-remembermypassword' => 'Manter-me autenticado',
 'userlogin-signwithsecure' => 'Use uma ligação segura',
 'yourdomainname' => 'O seu domínio:',
-'password-change-forbidden' => 'Não podes alterar senhas nesta wiki.',
+'password-change-forbidden' => 'Não pode alterar senhas nesta wiki.',
 'externaldberror' => 'Ocorreu um erro externo à base de dados durante a autenticação ou não lhe é permitido atualizar a sua conta externa.',
 'login' => 'Autenticação',
 'nav-login-createaccount' => 'Entrar / criar conta',
@@ -773,6 +776,9 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências]].'
 'userlogin-resetpassword-link' => 'Recuperar palavra-chave',
 'helplogin-url' => 'Help:Autenticação',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda a fazer login]]',
+'userlogin-loggedin' => 'Já está {{GENDER:$1|autenticado|autenticada|autenticado}} com o nome $1.
+Use o formulário abaixo para iniciar uma sessão com outro nome.',
+'userlogin-createanother' => 'Criar outra conta',
 'createacct-join' => 'Insira a sua informação abaixo.',
 'createacct-another-join' => 'Digite a informação da nova conta abaixo.',
 'createacct-emailrequired' => 'Endereço de email',
@@ -863,8 +869,8 @@ Aguarde $1 antes de tentar novamente, por favor.',
 'login-abort-generic' => 'A sua autenticação não teve êxito - Cancelada',
 'loginlanguagelabel' => 'Língua: $1',
 'suspicious-userlogout' => 'O seu pedido para sair foi negado porque parece ter sido enviado por um browser danificado ou por um proxy com cache.',
-'createacct-another-realname-tip' => 'O nome real é opcional.
-Se você optar por fornecê-lo, este será utilizado para dar ao usuário a atribuição de seu trabalho.',
+'createacct-another-realname-tip' => 'O fornecimento do nome verdadeiro é opcional.
+Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu trabalho.',
 
 # Email sending
 'php-mail-error-unknown' => 'Erro desconhecido na função mail() do PHP',
@@ -889,7 +895,7 @@ Para prosseguir, será necessário definir uma nova palavra-chave.',
 'resetpass-wrong-oldpass' => 'Palavra-chave temporária ou atual inválida.
 Pode ter já alterado com sucesso a sua palavra-chave ou solicitado uma nova palavra-chave temporária.',
 'resetpass-temp-password' => 'Palavra-chave temporária:',
-'resetpass-abort-generic' => 'Alteração de senha foi cancelada por uma extensão.',
+'resetpass-abort-generic' => 'A alteração da senha foi cancelada por uma extensão.',
 
 # Special:PasswordReset
 'passwordreset' => 'Repor palavra-chave',
@@ -901,7 +907,7 @@ Pode ter já alterado com sucesso a sua palavra-chave ou solicitado uma nova pal
 'passwordreset-username' => 'Nome de utilizador:',
 'passwordreset-domain' => 'Domínio:',
 'passwordreset-capture' => 'Ver o email resultante?',
-'passwordreset-capture-help' => 'Se marcar esta caixa, o e-mail (com a senha temporária) será-lhe mostrado, além de ser enviado para o utilizador.',
+'passwordreset-capture-help' => 'Se marcar esta caixa, poderá ver a mensagem (com a senha temporária) que será enviada ao utilizador.',
 'passwordreset-email' => 'Correio electrónico:',
 'passwordreset-emailtitle' => 'Detalhes da conta na {{SITENAME}}',
 'passwordreset-emailtext-ip' => 'Alguém (provavelmente você, a partir do endereço IP $1) pediu a recuperação da palavra-passe no projeto {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de utilizador está associada|As seguintes contas de utilizador estão associadas}} a este correio eletrónico:
@@ -930,36 +936,40 @@ Palavra-chave temporária: $2',
 'changeemail-oldemail' => 'Correio electrónico actual:',
 'changeemail-newemail' => 'Correio electrónico novo:',
 'changeemail-none' => '(nenhum)',
-'changeemail-password' => 'A sua senha {{SITENAME}}:',
+'changeemail-password' => 'A sua senha na wiki {{SITENAME}}:',
 'changeemail-submit' => 'Alterar correio electrónico',
 'changeemail-cancel' => 'Cancelar',
 
 # Special:ResetTokens
-'resettokens' => 'Redefinir os tokens',
-'resettokens-text' => 'Você pode redefinir tokens que permitem o acesso a certos dados privados associados à sua conta aqui.
+'resettokens' => 'Redefinir chaves',
+'resettokens-text' => 'Pode redefinir as chaves de acesso a certos dados privados associados à sua conta aqui.
 
-Você deve fazê-lo se acidentalmente compartilhá-los com alguém ou se sua conta estiver comprometida.',
-'resettokens-no-tokens' => 'Não existem tokens para redefinir.',
-'resettokens-legend' => 'Redefinir tokens',
+Deve fazê-lo se as divulgou acidentalmente a alguém ou se a sua conta tiver sido comprometida.',
+'resettokens-no-tokens' => 'Não há chaves para redefinir.',
+'resettokens-legend' => 'Redefinir chaves',
+'resettokens-tokens' => 'Chaves:',
 'resettokens-token-label' => '$1 (valor actual: $2)',
+'resettokens-watchlist-token' => "Chave para o ''feed'' Atom/RSS de [[Special:Watchlist|mudanças às páginas vigiadas]]",
+'resettokens-done' => 'As chaves foram redefinidas.',
+'resettokens-resetbutton' => 'Redefinir chaves selecionadas',
 
 # Edit page toolbar
 'bold_sample' => 'Texto a negrito',
 'bold_tip' => 'Texto a negrito',
 'italic_sample' => 'Texto em itálico',
 'italic_tip' => 'Texto em itálico',
-'link_sample' => 'Título da ligação',
-'link_tip' => 'Ligação interna',
-'extlink_sample' => 'http://www.example.com título da ligação',
-'extlink_tip' => 'Ligação externo (lembre-se do prefixo http://)',
+'link_sample' => 'Título do link',
+'link_tip' => 'Link interno',
+'extlink_sample' => 'http://www.example.com link externo',
+'extlink_tip' => 'Link externo (lembre-se do prefixo http://)',
 'headline_sample' => 'Texto do cabeçalho',
 'headline_tip' => 'Seção de nível 2',
 'nowiki_sample' => 'Inserir texto não-formatado aqui',
 'nowiki_tip' => 'Ignorar formatação wiki',
 'image_sample' => 'Exemplo.jpg',
-'image_tip' => 'Arquivo incorporado',
+'image_tip' => 'Ficheiro incorporado',
 'media_sample' => 'Exemplo.ogg',
-'media_tip' => 'Ligação para ficheiro',
+'media_tip' => 'Link para ficheiro',
 'sig_tip' => 'A sua assinatura, com hora e data',
 'hr_tip' => 'Linha horizontal (utilize moderadamente)',
 
@@ -1029,7 +1039,7 @@ Ela pode ter sido movida ou removida enquanto estava a ver a página.',
 
 Ela pode ser alterada na página [[Special:ChangePassword|de alteração da palavra-chave]] após autenticação.',
 'newarticle' => '(Nova)',
-'newarticletext' => "Seguiu uma ligação para uma página que ainda não existe.
+'newarticletext' => "Seguiu um link para uma página que ainda não existe.
 Para criá-la, escreva o seu conteúdo na caixa abaixo (consulte a [[{{MediaWiki:Helppage}}|página de ajuda]] para mais detalhes).
 Se chegou aqui por engano, clique o botão '''voltar''' (ou ''back'') do seu browser.",
 'anontalkpagetext' => "----''Esta é a página de discussão de um utilizador anónimo que ainda não criou uma conta ou não a utiliza, pelo que temos de utilizar o endereço IP para identificá-lo(a).
@@ -1472,14 +1482,14 @@ Note, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode es
 'prefs-watchlist-days-max' => 'Máximo: $1 {{PLURAL:$1|dia|dias}}',
 'prefs-watchlist-edits' => 'Número de edições a mostrar na listagem expandida:',
 'prefs-watchlist-edits-max' => 'Máximo: 1000',
-'prefs-watchlist-token' => 'Senha secreta da lista de {{lc:{{int:watchlist}}}}:',
+'prefs-watchlist-token' => 'Chave secreta da lista de páginas vigiadas:',
 'prefs-misc' => 'Diversos',
 'prefs-resetpass' => 'Alterar palavra-chave',
 'prefs-changeemail' => 'Alterar correio electrónico',
 'prefs-setemail' => 'Definir um endereço de correio electrónico',
 'prefs-email' => 'Opções do correio electrónico',
 'prefs-rendering' => 'Aparência',
-'saveprefs' => 'Salvar',
+'saveprefs' => 'Gravar',
 'resetprefs' => 'Eliminar as alterações que não foram gravadas',
 'restoreprefs' => 'Repor todas as configurações padrão (em todas as secções)',
 'prefs-editing' => 'Edição',
@@ -1493,6 +1503,9 @@ Note, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode es
 'recentchangesdays-max' => 'Máximo: $1 {{PLURAL:$1|dia|dias}}',
 'recentchangescount' => 'Número de edições a apresentar por omissão:',
 'prefs-help-recentchangescount' => 'Inclui mudanças recentes, histórico de páginas e registos.',
+'prefs-help-watchlist-token2' => "Esta é a chave secreta para o ''feed'' RSS da sua lista de páginas vigiadas.
+Qualquer pessoa que conheça a chave será capaz de ler a sua lista de páginas vigiadas, por isso não a divulgue.
+[[Special:ResetTokens|Clique aqui para redefini-la]].",
 'savedprefs' => 'As suas preferências foram gravadas.',
 'timezonelegend' => 'Fuso horário:',
 'localtime' => 'Hora local:',
@@ -1516,7 +1529,7 @@ Note, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode es
 'prefs-namespaces' => 'Espaços nominais',
 'defaultns' => 'Por omissão, pesquisar nestes espaços nominais:',
 'default' => 'padrão',
-'prefs-files' => 'Arquivos',
+'prefs-files' => 'Ficheiros',
 'prefs-custom-css' => 'CSS personalizada',
 'prefs-custom-js' => 'JS personalizado',
 'prefs-common-css-js' => 'CSS/JS partilhado por todos os temas:',
@@ -1545,7 +1558,8 @@ Não deverá conter mais de $1 {{PLURAL:$1|carácter|caracteres}}.',
 'prefs-help-gender' => 'Opcional: usado pelo programa para ajuste das mensagens ao género do utilizador.
 Esta informação será pública.',
 'email' => 'Correio electrónico',
-'prefs-help-realname' => 'Opcional: se optar por revelar o seu nome verdadeiro, este será utilizado para atribuir-lhe crédito pelo seu trabalho.',
+'prefs-help-realname' => 'O fornecimento do nome verdadeiro é opcional.
+Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu trabalho.',
 'prefs-help-email' => 'Opcional: o endereço de correio electrónico é opcional, mas será necessário para reiniciar a palavra-chave caso esqueça a antiga.',
 'prefs-help-email-others' => 'Também pode optar por permitir que outros entrem em contacto consigo por correio electrónico, através de um link nas suas páginas de utilizador ou de discussão, sem revelar o seu endereço de correio electrónico.',
 'prefs-help-email-required' => 'É necessário o endereço de correio electrónico.',
@@ -1555,6 +1569,7 @@ Esta informação será pública.',
 'prefs-dateformat' => 'Formato de data',
 'prefs-timeoffset' => 'Desvio horário',
 'prefs-advancedediting' => 'Opções gerais',
+'prefs-preview' => 'Antevisão',
 'prefs-advancedrc' => 'Opções avançadas',
 'prefs-advancedrendering' => 'Opções avançadas',
 'prefs-advancedsearchoptions' => 'Opções avançadas',
@@ -1562,6 +1577,7 @@ Esta informação será pública.',
 'prefs-displayrc' => 'Opções de visionamento',
 'prefs-displaysearchoptions' => 'Opções de apresentação',
 'prefs-displaywatchlist' => 'Opções de apresentação',
+'prefs-tokenwatchlist' => 'Chave',
 'prefs-diffs' => 'Diferenças',
 
 # User preference: email validation using jQuery
@@ -1793,9 +1809,9 @@ Para utilizar um ficheiro numa página, depois de ter feito o upload, insira um
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.jpg]]</nowiki></code>''' para mostrar uma imagem nas suas dimensões originais;
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.png|200px|thumb|left|texto]]</nowiki></code>''' para mostrar uma imagem com a dimensão horizontal de 200 pixels, dentro de uma caixa, na margem esquerda, contendo 'texto' como descrição (pode usar subconjuntos destas características);
 * '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:ficheiro.ogg]]</nowiki></code>''' para apresentar um link direto para o ficheiro em vez de mostrá-lo, quer este tenha por conteúdo uma imagem ou outros dados.",
-'upload-permitted' => 'Tipos de ficheiros permitidos: $1.',
-'upload-preferred' => 'Tipos de ficheiros preferidos: $1.',
-'upload-prohibited' => 'Tipos de arquivo proibidos: $1.',
+'upload-permitted' => 'Tipos de ficheiro permitidos: $1.',
+'upload-preferred' => 'Tipos de ficheiro preferidos: $1.',
+'upload-prohibited' => 'Tipos de ficheiro proibidos: $1.',
 'uploadlog' => 'registo de carregamento',
 'uploadlogpage' => 'Registo de carregamento',
 'uploadlogpagetext' => 'Segue-se uma lista dos carregamentos mais recentes.
@@ -1817,10 +1833,10 @@ Altere o nome do ficheiro e tente enviá-lo novamente, por favor.',
 'filetype-mime-mismatch' => 'A extensão ".$1" não corresponde ao tipo MIME do ficheiro ($2).',
 'filetype-badmime' => 'Não é permitido carregar ficheiros do tipo MIME "$1".',
 'filetype-bad-ie-mime' => 'Não é possível carregar este ficheiro porque o Internet Explorer o detectaria como "$1", que é um tipo de ficheiro não permitido e potencialmente perigoso.',
-'filetype-unwanted-type' => "'''\".\$1\"''' não é um tipo de arquivo desejado.
+'filetype-unwanted-type' => "'''\".\$1\"''' não é um tipo de ficheiro desejado.
 {{PLURAL:\$3|O tipo preferido é|Os tipos preferidos são}} \$2.",
-'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|não é um tipo de arquivo permitido|não são tipos de arquivo permitidos}}.
-{{PLURAL:$3|O tipo de arquivo permitido é|Os tipos de arquivo permitidos são}} $2.',
+'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|não é um tipo de ficheiro permitido|não são tipos de ficheiro permitidos}}.
+{{PLURAL:$3|O tipo de ficheiro permitido é|Os tipos de ficheiro permitidos são}} $2.',
 'filetype-missing' => 'O ficheiro não possui uma extensão (como, por exemplo, ".jpg").',
 'empty-file' => 'O ficheiro que enviou estava vazio.',
 'file-too-large' => 'O ficheiro que enviou era demasiado grande.',
@@ -1828,11 +1844,11 @@ Altere o nome do ficheiro e tente enviá-lo novamente, por favor.',
 'filetype-banned' => 'Este tipo de ficheiro é proibido.',
 'verification-error' => 'O ficheiro não passou a verificação de ficheiros.',
 'hookaborted' => 'A modificação que pretendia foi abortada pelo hook de uma extensão.',
-'illegal-filename' => 'O nome do arquivo não é permitido.',
-'overwrite' => 'Não é permitido sobrescrever um arquivo existente.',
+'illegal-filename' => 'O nome do ficheiro não é permitido.',
+'overwrite' => 'Não é permitido sobrescrever um ficheiro existente.',
 'unknown-error' => 'Ocorreu um erro desconhecido.',
-'tmp-create-error' => 'Não foi possível criar o arquivo temporário.',
-'tmp-write-error' => 'Erro na escrita do arquivo temporário.',
+'tmp-create-error' => 'Não foi possível criar o ficheiro temporário.',
+'tmp-write-error' => 'Erro na escrita do ficheiro temporário.',
 'large-file' => 'É recomendável que os ficheiros não sejam maiores que $1;
 este tem $2.',
 'largefileserver' => 'O tamanho deste ficheiro é superior ao permitido pela configuração do servidor.',
@@ -1883,7 +1899,7 @@ Não é permitido o upload de ficheiros Java, porque estes podem contornar as re
 'sourcefilename' => 'Nome do ficheiro de origem:',
 'sourceurl' => 'URL fonte:',
 'destfilename' => 'Nome do ficheiro de destino:',
-'upload-maxfilesize' => 'Tamanho máximo do arquivo: $1',
+'upload-maxfilesize' => 'Tamanho máximo do ficheiro: $1',
 'upload-description' => 'Descrição do ficheiro',
 'upload-options' => 'Opções de carregamento',
 'watchthisupload' => 'Vigiar este ficheiro',
@@ -2033,7 +2049,7 @@ Verifique se o endereço está correto e o site disponível, por favor.',
 # Special:ListFiles
 'listfiles-summary' => 'Esta página especial mostra todos os ficheiros carregados.',
 'listfiles_search_for' => 'Pesquisar por nome de imagem:',
-'imgfile' => 'arquivo',
+'imgfile' => 'ficheiro',
 'listfiles' => 'Ficheiros',
 'listfiles_thumb' => 'Miniatura',
 'listfiles_date' => 'Data',
@@ -2044,7 +2060,7 @@ Verifique se o endereço está correto e o site disponível, por favor.',
 'listfiles_count' => 'Versões',
 
 # File description page
-'file-anchor-link' => 'Arquivo',
+'file-anchor-link' => 'Ficheiro',
 'filehist' => 'Histórico do ficheiro',
 'filehist-help' => 'Clique numa data/hora para ver o ficheiro tal como se encontrava nesse momento.',
 'filehist-deleteall' => 'eliminar todas',
@@ -2098,7 +2114,7 @@ Talvez queira editar a descrição na [$2 página original de descrição do fic
 # File deletion
 'filedelete' => 'Eliminar $1',
 'filedelete-legend' => 'Eliminar ficheiro',
-'filedelete-intro' => "Está prestes a eliminar o arquivo '''[[Media:$1|$1]]''' e todo o seu histórico.",
+'filedelete-intro' => "Está prestes a eliminar o ficheiro '''[[Media:$1|$1]]''' e todo o seu histórico.",
 'filedelete-intro-old' => "Está prestes a eliminar a versão de '''[[Media:$1|$1]]''' tal como se encontrava em [$4 $3, $2].",
 'filedelete-comment' => 'Motivo:',
 'filedelete-submit' => 'Eliminar',
@@ -2531,8 +2547,8 @@ alguém editou ou já reverteu a página.
 
 A última edição foi de [[User:$3|$3]] ([[User talk:$3|discussão]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "O resumo da edição era: \"''\$1''\".",
-'revertpage' => 'Foram revertidas as edições de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc]]) para a última versão por [[User:$1|$1]]',
-'revertpage-nouser' => 'Revertidas as edições de um usuário ocultado para a última revisão {{GENDER:$1|pelo|pela|por}} [[User:$1|$1]]',
+'revertpage' => 'Foram revertidas as edições de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc]]) para a última revisão de [[User:$1|$1]]',
+'revertpage-nouser' => 'Foram revertidas as edições de um utilizador oculto para a última revisão de {{GENDER:$1|[[User:$1|$1]]}}',
 'rollback-success' => 'Foram revertidas as edições de $1, com o conteúdo passando a estar como na última edição de $2.',
 
 # Edit tokens
@@ -2673,7 +2689,7 @@ $1',
 'contributions' => 'Contribuições {{GENDER:$1|do utilizador|da utilizadora}}',
 'contributions-title' => 'Contribuições {{GENDER:$1|do utilizador|da utilizadora}} $1',
 'mycontris' => 'Contribuições',
-'contribsub2' => 'Para $1 ($2)',
+'contribsub2' => 'Para {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Não foram encontradas alterações com este critério.',
 'uctop' => '(atual)',
 'month' => 'Até o mês:',
@@ -3130,10 +3146,10 @@ Utilize o botão "Antever resultado" antes de gravar, por favor.',
 'tooltip-t-permalink' => 'Link permanente para esta versão desta página',
 'tooltip-ca-nstab-main' => 'Ver a página de conteúdo',
 'tooltip-ca-nstab-user' => 'Ver a página de utilizador',
-'tooltip-ca-nstab-media' => 'Ver a página de media',
+'tooltip-ca-nstab-media' => 'Ver a página de multimédia',
 'tooltip-ca-nstab-special' => 'Esta é uma página especial, não pode ser editada.',
 'tooltip-ca-nstab-project' => 'Ver a página de projeto',
-'tooltip-ca-nstab-image' => 'Ver a página do arquivo',
+'tooltip-ca-nstab-image' => 'Ver a página do ficheiro',
 'tooltip-ca-nstab-mediawiki' => 'Ver a mensagem de sistema',
 'tooltip-ca-nstab-template' => 'Ver a predefinição',
 'tooltip-ca-nstab-help' => 'Ver a página de ajuda',
@@ -3886,7 +3902,7 @@ Confirme que deseja realmente recriar esta página, por favor.",
 'autosumm-blank' => 'Limpou toda a página',
 'autosumm-replace' => "Página substituída por '$1'",
 'autoredircomment' => 'Redirecionamento para [[$1]]',
-'autosumm-new' => "Criou nova página com '$1'",
+'autosumm-new' => "Criou página com: '$1'",
 
 # Live preview
 'livepreview-loading' => 'A carregar…',
@@ -3983,11 +3999,11 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN
 'fileduplicatesearch' => 'Ficheiros duplicados',
 'fileduplicatesearch-summary' => "Procure ficheiros duplicados tendo por base o seu resumo criptográfico ''(hash value)''.",
 'fileduplicatesearch-legend' => 'Procurar duplicados',
-'fileduplicatesearch-filename' => 'Nome do arquivo:',
+'fileduplicatesearch-filename' => 'Ficheiro:',
 'fileduplicatesearch-submit' => 'Pesquisar',
 'fileduplicatesearch-info' => '$1 × $2 pixels<br />Tamanho: $3<br />tipo MIME: $4',
-'fileduplicatesearch-result-1' => 'O arquivo "$1" não possui cópias idênticas.',
-'fileduplicatesearch-result-n' => 'O arquivo "$1" possui {{PLURAL:$2|uma cópia idêntica|$2 cópias idênticas}}.',
+'fileduplicatesearch-result-1' => 'O ficheiro "$1" não possui cópias idênticas.',
+'fileduplicatesearch-result-n' => 'O ficheiro "$1" possui {{PLURAL:$2|uma cópia idêntica|$2 cópias idênticas}}.',
 'fileduplicatesearch-noresults' => 'Não foi encontrado nenhum ficheiro com o nome "$1".',
 
 # Special:SpecialPages
@@ -4105,10 +4121,10 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN
 'logentry-newusers-newusers' => 'A conta de utilizador $1 foi {{GENDER:$2|criada}}',
 'logentry-newusers-create' => 'A conta de utilizador $1 foi criada',
 'logentry-newusers-create2' => 'A conta de utilizador $3 foi criada por $1',
-'logentry-newusers-byemail' => 'Conta de utilizador $3 foi {{GENDER:$2|criada}} por $1 e a senha foi enviada por e-mail',
+'logentry-newusers-byemail' => 'A conta de utilizador $3 foi criada por $1 e a senha foi enviada por e-mail',
 'logentry-newusers-autocreate' => 'A conta de utilizador $1 foi criada automaticamente',
 'logentry-rights-rights' => '$1 modificou os privilégios do utilizador $3 de $4 para $5',
-'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|mudou}} as permissões de $3',
+'logentry-rights-rights-legacy' => '$1 alterou os grupos de $3',
 'logentry-rights-autopromote' => '$1 foi automaticamente {{GENDER:$2|promovido|promovida}} de $4 a $5',
 'rightsnone' => '(nenhum)',
 
index 1a72451..108a817 100644 (file)
@@ -1307,7 +1307,7 @@ Outros administradores no {{SITENAME}} continuarão podendo acessar ao conteúdo
 'revdelete-unsuppress' => 'Remover restrições das edições restauradas',
 'revdelete-log' => 'Motivo:',
 'revdelete-submit' => 'Aplicar {{PLURAL:$1|à revisão selecionada|às revisões selecionadas}}',
-'revdelete-success' => "'''A visibilidade da revisão foi definida com sucesso.'''",
+'revdelete-success' => "'''A visibilidade da revisão foi atualizada.'''",
 'revdelete-failure' => "'''A visibilidade da revisão não foi atualizada:'''
 $1",
 'logdelete-success' => "'''Visibilidade de evento definida com sucesso.'''",
index 381dbab..74d13ac 100644 (file)
  * @author Prometheus.pyrphoros
  * @author Psubhashish
  * @author Purodha
+ * @author Pxos
  * @author Rancher
  * @author Raymond
  * @author Reedy
@@ -2348,7 +2349,7 @@ See [{{canonicalurl:x|feed=atom&action=history}} example].',
 'rev-suppressed-text-unhide' => 'Parameters:
 * $1 - a HTML link to the revision
 {{Related|Rev-deleted-text}}',
-'rev-deleted-text-view' => 'I believe this is an error message which appears if a user tries to view a past revision of a page, where the revision has been hidden from view, although later revisions of the page still exist.',
+'rev-deleted-text-view' => 'This is an error message which appears if a user tries to view a past revision of a page, where the revision has been hidden from view, although later revisions of the page still exist.',
 'rev-suppressed-text-view' => '{{Related|Rev-deleted-text}}',
 'rev-deleted-no-diff' => 'See also:
 * {{msg-mw|Rev-suppressed-no-diff}}',
index 79d3704..a0e2972 100644 (file)
@@ -14,6 +14,7 @@
  * @author OchAyeTheNoo
  * @author Omnipaedista
  * @author Purodha
+ * @author Shirayuki
  * @author The Evil IP address
  * @author Urhixidur
  * @author Ushanka
index 703abf7..eb8b9e4 100644 (file)
@@ -293,10 +293,10 @@ $messages = array(
 'tog-extendwatchlist' => 'Rozšíriť zoznam sledovaných stránok, aby zobrazoval všetky zmeny, nie len posledné',
 'tog-usenewrc' => 'Zoskupiť v posledných úpravách a na zozname sledovaných stránok podľa stránky (vyžaduje JavaScript)',
 'tog-numberheadings' => 'Automaticky číslovať nadpisy',
-'tog-showtoolbar' => 'Zobraziť panel nástrojov úprav (vyžaduje JavaSkript)',
-'tog-editondblclick' => 'Upravovať stránky po dvojitom kliknutí (vyžaduje JavaScript)',
+'tog-showtoolbar' => 'Zobraziť panel nástrojov úprav',
+'tog-editondblclick' => 'Upravovať stránky po dvojitom kliknutí',
 'tog-editsection' => 'Umožniť upravovanie sekcie prostredníctvom odkazov [upraviť]',
-'tog-editsectiononrightclick' => 'Umožniť upravovanie sekcie pravým kliknutím na nadpisy sekcií (vyžaduje JavaScript)',
+'tog-editsectiononrightclick' => 'Umožniť upravovanie sekcie pravým kliknutím na nadpisy sekcií',
 'tog-showtoc' => 'Zobrazovať tabuľku s obsahom (pre stránky s viac ako 3 nadpismi)',
 'tog-rememberpassword' => 'Zapamätať si prihlásenie na tomto počítači (najviac $1 {{PLURAL:$1|deň|dni|dní}})',
 'tog-watchcreations' => 'Pridávať stránky, ktoré vytvorím a súbory, ktoré nahrám medzi sledované',
@@ -314,7 +314,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Zobraziť počet používateľov sledujúcich stránku',
 'tog-oldsig' => 'Súčasný podpis:',
 'tog-fancysig' => 'Považovať podpisy za wikitext (bez automatických odkazov)',
-'tog-uselivepreview' => 'Používať živý náhľad (JavaScript) (experimentálna funkcia)',
+'tog-uselivepreview' => 'Používať živý náhľad(experimentálna funkcia)',
 'tog-forceeditsummary' => 'Upozoriť ma, keď nevyplním zhrnutie úprav',
 'tog-watchlisthideown' => 'Skryť moje úpravy zo zoznamu sledovaných',
 'tog-watchlisthidebots' => 'Skryť úpravy botov zo zoznamu sledovaných',
@@ -328,6 +328,7 @@ $messages = array(
 'tog-noconvertlink' => 'Vypnúť konverziu názvov odkazov',
 'tog-norollbackdiff' => 'Vynechať rozdiel po vykonaní rollbacku',
 'tog-useeditwarning' => 'Upozorniť ma, keď opúšťam upravovaciu stránku s neuloženými zmenami',
+'tog-prefershttps' => 'Po prihlásení používať vždy zabezpečené pripojenie',
 
 'underline-always' => 'Vždy',
 'underline-never' => 'Nikdy',
@@ -428,7 +429,7 @@ $messages = array(
 'newwindow' => '(otvorí v novom okne)',
 'cancel' => 'Zrušiť',
 'moredotdotdot' => 'Viac...',
-'morenotlisted' => 'Ďalšie neuvedené...',
+'morenotlisted' => 'Tento zoznam nie je úplný.',
 'mypage' => 'Stránka',
 'mytalk' => 'Diskusia',
 'anontalk' => 'Diskusia k tejto IP adrese',
@@ -531,7 +532,7 @@ $1',
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'O {{GRAMMAR:lokál|{{SITENAME}}}}',
 'aboutpage' => 'Project:Úvod',
-'copyright' => 'Obsah je k dispozícii za licenčných podmienok $1.',
+'copyright' => 'Obsah je dostupný pod $1, pokiaľ nie je uvedené inak.',
 'copyrightpage' => '{{ns:project}}:Autorské práva',
 'currentevents' => 'Aktuality',
 'currentevents-url' => 'Project:Aktuality',
@@ -614,6 +615,11 @@ Zoznam platných špeciálnych stránok nájdete na [[Special:SpecialPages|{{int
 # General errors
 'error' => 'Chyba',
 'databaseerror' => 'Chyba v databáze',
+'databaseerror-text' => 'Došlo k chybe pri otázke do databázy.
+Môže to byť spôsobené chybou v softvéri.',
+'databaseerror-query' => 'Otázka: $1',
+'databaseerror-function' => 'Funkcia: $1',
+'databaseerror-error' => 'Chyba: $1',
 'laggedslavemode' => 'Upozornenie: Je možné, že stránka neobsahuje posledné aktualizácie.',
 'readonly' => 'Databáza je zamknutá',
 'enterlockreason' => 'Zadajte dôvod požadovaného zamknutia vrátane odhadu, kedy očakávate odomknutie',
@@ -647,6 +653,7 @@ Možno ju už zmazal nieto iný.',
 'cannotdelete-title' => 'Nemôžete zmazať stránku „$1“',
 'delete-hook-aborted' => 'Zmazanie zrušila prídavná funkcia (prípojný bod syntaktického analyzátora).
 Neudala vysvetlenie.',
+'no-null-revision' => 'Nepodarilo sa vytvoriť novú prázdnu revíziu stránky „$1“',
 'badtitle' => 'Neplatný nadpis',
 'badtitletext' => 'Požadovaný nadpis bol neplatný, nezadaný, alebo nesprávne odkazovaný z inej jazykovej verzie {{GRAMMAR:genitív|{{SITENAME}}}}. Mohol tiež obsahovať jeden alebo viac znakov, ktoré nie je možné použiť v nadpisoch.',
 'perfcached' => 'Nasledujúce údaje pochádzajú z vyrovnávacej pamäte a nemusia byť úplne aktuálne. Vo vyrovnávacej pamäti {{PLURAL:$1|je dostupný|sú dostupné|je dostupných}} najviac {{PLURAL:$1|jeden výsledok|$1 výsledky|$1 výsledkov}}.',
@@ -695,7 +702,6 @@ Správca, ktorý ho zamkol ponúkol toto vysvetlenie: „$3“.',
 # Login and logout pages
 'logouttext' => "'''Práve ste sa odhlásili.'''
 
-Odteraz môžete používať {{GRAMMAR:akuzatív|{{SITENAME}}}} ako anonymný používateľ alebo sa môžete opäť <span class='plainlinks'>[$1 prihlásiť]</span> pod rovnakým alebo odlišným používateľským menom.
 Uvedomte si, že niektoré stránky sa môžu naďalej zobrazovať ako keby ste boli prihlásený, až kým nevymažete vyrovnávaciu pamäť vášho prehliadača.",
 'welcomeuser' => 'Vitajte,  $1 !',
 'welcomecreation-msg' => 'Váš účet bol vytvorený.
@@ -736,13 +742,16 @@ Nezabudnite zmeniť svoje [[Special:Preferences|Predvoľby {{GRAMMAR:genitív|{{
 'userlogin-resetpassword-link' => 'Obnoviť heslo',
 'helplogin-url' => 'Help:Prihlasovanie',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoc s prihlásením]]',
+'userlogin-loggedin' => 'Ste už {{GENDER:$1|prihĺasený|prihlásená}} ako $1.
+Pomocou formulára nižšie sa môžete prihlásiť ako iný redaktor.',
+'userlogin-createanother' => 'Vytvoriť ďalší účet',
 'createacct-join' => 'Vyplňte svoje údaje.',
 'createacct-another-join' => 'Vyplňte údaje nového účtu.',
 'createacct-emailrequired' => 'E-mailová adresa',
 'createacct-emailoptional' => 'E-mailová adresa (nepovinné)',
 'createacct-email-ph' => 'Zadajte vašu e-mailovú adresu',
 'createacct-another-email-ph' => 'Zadajte vašu e-mailovú adresu',
-'createaccountmail' => 'Použiť dočasné náhodné heslo a poslať ho na nižšie uvedenú emailovú adresu',
+'createaccountmail' => 'Použiť dočasné náhodné heslo a poslať ho na uvedenú emailovú adresu',
 'createacct-realname' => 'Skutočné meno (nepovinné)',
 'createaccountreason' => 'Dôvod:',
 'createacct-reason' => 'Dôvod',
@@ -810,15 +819,15 @@ Z tohto dôvodu nemôžu návštevníci z tejto IP adresy momentálne vytvoriť
 'cannotchangeemail' => 'Na tejto wiki nie je možné meniť e-mailové adresy používateľského účtu.',
 'emaildisabled' => 'Táto lokalita nedokáže posielať emaily.',
 'accountcreated' => 'Účet vytvorený',
-'accountcreatedtext' => 'Používateľský účet $1 bol vytvorený.',
+'accountcreatedtext' => 'Používateľský účet [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskusia]]) bol vytvorený.',
 'createaccount-title' => 'Vytvorenie účtu na {{GRAMMAR:lokál|{{SITENAME}}}}',
 'createaccount-text' => 'Niekto vytvoril účet pre vašu emailovú adresu na {{GRAMMAR:lokál|{{SITENAME}}}}
 ($4) s názvom „$2“, s heslom „$3“. Mali by ste sa prihlásiť a svoje heslo teraz zmeniť.
 
 Ak bol účet vytvorený omylom, túto správu môžete ignorovať.',
 'usernamehasherror' => 'Používateľské meno nemôže obsahovať znak mriežky.',
-'login-throttled' => 'Nedávno ste uskutočnili príliš mnoho neúspešných pokusov o prihlásenie.
-Prosím, počkajte predtým, než to skúsite znova.',
+'login-throttled' => 'Uskutočnili ste príliš mnoho neúspešných pokusov o prihlásenie.
+Prosím, počkajte $1 predtým, než to skúsite znova.',
 'login-abort-generic' => 'Vaše prihlásenie nebolo úspešné - zrušené',
 'loginlanguagelabel' => 'Jazyk: $1',
 'suspicious-userlogout' => 'Vaša požiadavka odhlásiť sa bola zamietnutá, pretože to vyzerá, že ju poslal pokazený prehliadač alebo proxy server.',
@@ -1666,9 +1675,11 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|zmena|zmeny|zmien}}',
+'enhancedrc-history' => 'história',
 'recentchanges' => 'Posledné úpravy',
 'recentchanges-legend' => 'Možnosti posledných zmien',
 'recentchanges-summary' => 'Pomocou tejto stránky sledujete posledné úpravy wiki.',
+'recentchanges-noresult' => 'V danom období nie sú zmeny spĺňajúce tieto kritériá.',
 'recentchanges-feed-description' => 'Sledovať posledné úpravy tejto wiki týmto kanálom.',
 'recentchanges-label-newpage' => 'Táto úprava vytvorila novú stránku.',
 'recentchanges-label-minor' => 'Toto je drobná úprava',
@@ -1959,8 +1970,7 @@ Aby bolo zabezpečenie optimálne, img_auth.php je vypnutý.',
 'upload_source_file' => ' (súbor na vašom počítači)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Táto špeciálna stránka zobrazuje všetky nahrané súbory.
-Pri filtrovaní podľa používateľa sa zobrazia iba súbory, ktorých najnovšiu verziu nahral dotyčný používateľ.',
+'listfiles-summary' => 'Táto špeciálna stránka zobrazuje všetky nahrané súbory.',
 'listfiles_search_for' => 'Hľadať názov súboru:',
 'imgfile' => 'súbor',
 'listfiles' => 'Zoznam obrázkov',
@@ -1971,6 +1981,10 @@ Pri filtrovaní podľa používateľa sa zobrazia iba súbory, ktorých najnovš
 'listfiles_size' => 'Veľkosť (v bajtoch)',
 'listfiles_description' => 'Popis',
 'listfiles_count' => 'Verzie',
+'listfiles-show-all' => 'Vrátane starších verzií obrázkov',
+'listfiles-latestversion' => 'Aktuálna verzia',
+'listfiles-latestversion-yes' => 'Áno',
+'listfiles-latestversion-no' => 'Nie',
 
 # File description page
 'file-anchor-link' => 'Súbor',
@@ -2063,6 +2077,13 @@ Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
 'randompage' => 'Náhodná stránka',
 'randompage-nopages' => '{{PLURAL:$2|V mennom priestore „$1“ nie sú žiadne stránky.|V nasledovných menných priestoroch nie sú žiadne stránky: $1}}',
 
+# Random page in category
+'randomincategory' => 'Náhodná stránka v kategórii',
+'randomincategory-invalidcategory' => '"$1" nie je platný názov kategórie.',
+'randomincategory-nopages' => 'V [[:Category:$1|kategórii $1]] nie sú žiadne stránky.',
+'randomincategory-selectcategory' => 'Získať náhodnú stránku z kategórie: $1 $2',
+'randomincategory-selectcategory-submit' => 'Ísť na',
+
 # Random redirect
 'randomredirect' => 'Náhodná presmerovacia stránka',
 'randomredirect-nopages' => 'V mennom „$1“ priestore nie sú žiadne presmerovania.',
@@ -3959,6 +3980,8 @@ Spolu s týmto programom by ste obdržať [{{SERVER}}{{SCRIPTPATH}}/COPYING kóp
 'tags-display-header' => 'Vzhľad v zoznamoch úprav',
 'tags-description-header' => 'Úplný popis významu',
 'tags-hitcount-header' => 'Označené úpravy',
+'tags-active-yes' => 'Áno',
+'tags-active-no' => 'Nie',
 'tags-edit' => 'upraviť',
 'tags-hitcount' => '$1 {{PLURAL:$1|zmena|zmeny|zmien}}',
 
@@ -3979,6 +4002,7 @@ Spolu s týmto programom by ste obdržať [{{SERVER}}{{SCRIPTPATH}}/COPYING kóp
 'dberr-problems' => 'Prepáčte! Táto stránka má práve technické problémy.',
 'dberr-again' => 'Skúste niekoľko minút počkať a potom opäť načítať stránku.',
 'dberr-info' => '(Spojenie s databázovým serverom neúspešné: $1)',
+'dberr-info-hidden' => '(Nie je možné kontaktovať databázový server)',
 'dberr-usegoogle' => 'Zatiaľ môžete skúsiť hľadať pomocou Google.',
 'dberr-outofdate' => 'Pamätajte, že ich indexy nemusia byť aktuálne.',
 'dberr-cachederror' => 'Toto je kópia požadovanej stránky z vyrovnávacej pamäte a nemusí byť aktuálna.',
@@ -4010,10 +4034,10 @@ Spolu s týmto programom by ste obdržať [{{SERVER}}{{SCRIPTPATH}}/COPYING kóp
 'logentry-delete-event-legacy' => '$1 {{GENDER:$2|zmenil|zmenila}} viditeľnosť záznamov udalostí k stránke $3',
 'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|zmenil|zmenila}} viditeľnosť revízií na stránke $3',
 'logentry-suppress-delete' => '$1 {{GENDER:$2|utajil|utajila}} stránku $3',
-'logentry-suppress-event' => '$1 utajene zmenil viditeľnosť {{PLURAL:$5|záznamu udalostí|$5 záznamov udalostí}} k stránke $3: $4',
+'logentry-suppress-event' => '$1 utajene {{GENDER:$2|zmenil|zmenila}} viditeľnosť {{PLURAL:$5|záznamu udalostí|$5 záznamov udalostí}} k stránke $3: $4',
 'logentry-suppress-revision' => '$1 utajene zmenil viditeľnosť {{PLURAL:$5|revízie|$5 revízií}} na stránke $3: $4',
-'logentry-suppress-event-legacy' => '$1 utajene zmenil viditeľnosť záznamov udalostí k stránke $3',
-'logentry-suppress-revision-legacy' => '$1 utajene zmenil viditeľnosť revízií na stránke $3',
+'logentry-suppress-event-legacy' => '$1 utajene {{GENDER:$2|zmenil|zmenila}} viditeľnosť záznamov udalostí k stránke $3',
+'logentry-suppress-revision-legacy' => '$1 utajene {{GENDER:$2|zmenil|zmenila}} viditeľnosť revízií na stránke $3',
 'revdelete-content-hid' => 'obsah skrytý',
 'revdelete-summary-hid' => 'zhrnutie editácie skryté',
 'revdelete-uname-hid' => 'používateľské meno skryté',
@@ -4026,13 +4050,13 @@ Spolu s týmto programom by ste obdržať [{{SERVER}}{{SCRIPTPATH}}/COPYING kóp
 'logentry-move-move-noredirect' => '$1 premiestnil stránku $3 na $4, ale neponechal presmerovanie',
 'logentry-move-move_redir' => '$1 premiestnil stránku $3 na $4 prostredníctvom presmerovania',
 'logentry-move-move_redir-noredirect' => '$1 premiestnil stránku $3 na $4 prostredníctvom presmerovania, ale neponechal presmerovanie',
-'logentry-patrol-patrol' => '$1 označil revíziu $4 stránky $3 ako stráženú',
-'logentry-patrol-patrol-auto' => '$1 automaticky označil revíziu $4 stránky $3 ako stráženú',
-'logentry-newusers-newusers' => 'Bol vytvorený používateľský účet $1',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|označil|označila}} revíziu $4 stránky $3 ako overenú',
+'logentry-patrol-patrol-auto' => '$1 automaticky {{GENDER:$2|označil|označila}} revíziu $4 stránky $3 ako overenú',
+'logentry-newusers-newusers' => 'Bol {{GENDER:$2|vytvorený}} používateľský účet $1',
 'logentry-newusers-create' => 'Bol vytvorený používateľský účet $1',
 'logentry-newusers-create2' => '$1 vytvoril používateľský účet $3',
 'logentry-newusers-byemail' => '$1 vytvoril používateľský účet $3 a heslo bolo poslané emailom',
-'logentry-newusers-autocreate' => 'Používateľský účet $1 bol vytvorený automaticky',
+'logentry-newusers-autocreate' => 'Používateľský účet $1 bol {{GENDER:$2|vytvorený}} automaticky',
 'logentry-rights-rights' => '$1 zmenil členstvo $3 v skupinách z $4 na $5',
 'logentry-rights-rights-legacy' => '$1 zmenil členstvo $3 v skupinách',
 'logentry-rights-autopromote' => '$1 bol automaticky povýšený z $4 na $5',
@@ -4114,4 +4138,11 @@ V opačnom prípade môžete použiť zjednodušený formulár nižšie. Váš k
 # Image rotation
 'rotate-comment' => 'Obrázok otočený o $1 {{PLURAL:$1|stupeň|stupne|stupňov}} v smere hodinových ručičiek',
 
+# Limit report
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bajt|bajty|bajtov}}',
+'limitreport-templateargumentsize' => 'Veľkosť argumentov šablón',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bajt|bajty|bajtov}}',
+'limitreport-expansiondepth' => 'Najväčšia hĺbka expanzie',
+'limitreport-expensivefunctioncount' => 'Počet náročných funkcií parseru',
+
 );
index c088025..b36c9c4 100644 (file)
@@ -2676,7 +2676,7 @@ $UNWATCHURL
 'protect-summary-cascade' => 'преносива заштита',
 'protect-expiring' => 'истиче $1 (UTC)',
 'protect-expiring-local' => 'истиче $1',
-'protect-expiry-indefinite' => 'никада',
+'protect-expiry-indefinite' => 'неодÑ\80еÑ\92ено',
 'protect-cascade' => 'Заштити све странице које су укључене у ову (преносива заштита)',
 'protect-cantedit' => 'Не можете мењати степене заштите ове странице јер немате овлашћења за уређивање.',
 'protect-othertime' => 'Друго време:',
@@ -2690,7 +2690,7 @@ $UNWATCHURL
 ** Непродуктивни рат измена
 ** Страница великог промета',
 'protect-edit-reasonlist' => 'Уреди разлоге заштићивања',
-'protect-expiry-options' => '1 сат:1 hour,1 дан:1 day,1 недеља:1 week,2 недеље:2 weeks,1 месец:1 month,3 месеца:3 months,6 месеци:6 months,1 година:1 year,бесконачно:infinite',
+'protect-expiry-options' => '1 сат:1 hour,1 дан:1 day,1 недеља:1 week,2 недеље:2 weeks,1 месец:1 month,3 месеца:3 months,6 месеци:6 months,1 година:1 year,трајно:infinite',
 'restriction-type' => 'Дозвола:',
 'restriction-level' => 'Степен ограничења:',
 'minimum-size' => 'Најмања величина',
@@ -2845,7 +2845,7 @@ $1',
 'ipbenableautoblock' => 'Аутоматски блокирај последњу ИП адресу овог корисника и све даљње адресе с којих покуша да уређује',
 'ipbsubmit' => 'Блокирај овог корисника',
 'ipbother' => 'Друго време:',
-'ipboptions' => '2 сата:2 hours,1 дан:1 day,3 дана:3 days,1 недеља:1 week,2 недеље:2 weeks,1 месец:1 month,3 месеца:3 months,6 месеци:6 months,1 година:1 year,бесконачно:infinite',
+'ipboptions' => '2 сата:2 hours,1 дан:1 day,3 дана:3 days,1 недеља:1 week,2 недеље:2 weeks,1 месец:1 month,3 месеца:3 months,6 месеци:6 months,1 година:1 year,трајно:infinite',
 'ipbotheroption' => 'друго',
 'ipbotherreason' => 'Други/додатни разлог:',
 'ipbhidename' => 'Сакриј корисничко име са измена и спискова',
index c4148a1..f1ea384 100644 (file)
@@ -2530,7 +2530,7 @@ Možete da promenite stepen zaštite, ali to neće uticati na prenosivu zaštitu
 'protect-summary-cascade' => 'prenosiva zaštita',
 'protect-expiring' => 'ističe $1 (UTC)',
 'protect-expiring-local' => 'ističe $1',
-'protect-expiry-indefinite' => 'nikada',
+'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 menjati stepene zaštite ove stranice jer nemate ovlašćenja za uređivanje.',
 'protect-othertime' => 'Drugo vreme:',
@@ -2544,7 +2544,7 @@ Možete da promenite stepen zaštite, ali to neće uticati na prenosivu zaštitu
 ** Neproduktivni rat izmena
 ** Stranica velikog prometa',
 'protect-edit-reasonlist' => 'Uredi razloge zaštićivanja',
-'protect-expiry-options' => '1 sat:1 hour,1 dan:1 day,1 nedelja:1 week,2 nedelje:2 weeks,1 mesec:1 month,3 meseca:3 months,6 meseci:6 months,1 godina:1 year,beskonačno:infinite',
+'protect-expiry-options' => '1 sat:1 hour,1 dan:1 day,1 nedelja:1 week,2 nedelje:2 weeks,1 mesec:1 month,3 meseca:3 months,6 meseci:6 months,1 godina:1 year,trajno:infinite',
 'restriction-type' => 'Dozvola:',
 'restriction-level' => 'Stepen ograničenja:',
 'minimum-size' => 'Najmanja veličina',
@@ -2699,7 +2699,7 @@ Izaberite konkretan razlog ispod (primer: navođenje konkretnih stranica koje su
 'ipbenableautoblock' => 'Automatski blokiraj poslednju IP adresu ovog korisnika i sve daljnje adrese s kojih pokuša da uređuje',
 'ipbsubmit' => 'Blokiraj ovog korisnika',
 'ipbother' => 'Drugo vreme:',
-'ipboptions' => '2 sata:2 hours,1 dan:1 day,3 dana:3 days,1 nedelja:1 week,2 nedelje:2 weeks,1 mesec:1 month,3 meseca:3 months,6 meseci:6 months,1 godina:1 year,beskonačno:infinite',
+'ipboptions' => '2 sata:2 hours,1 dan:1 day,3 dana:3 days,1 nedelja:1 week,2 nedelje:2 weeks,1 mesec:1 month,3 meseca:3 months,6 meseci:6 months,1 godina:1 year,trajno:infinite',
 'ipbotheroption' => 'drugo',
 'ipbotherreason' => 'Drugi/dodatni razlog:',
 'ipbhidename' => 'Sakrij korisničko ime sa izmena i spiskova',
index 53f8a71..2f40eb2 100644 (file)
@@ -1450,6 +1450,7 @@ $1",
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|ఒక మార్పు|$1 మార్పులు}}',
+'enhancedrc-history' => 'చరితం',
 'recentchanges' => 'ఇటీవలి మార్పులు',
 'recentchanges-legend' => 'ఇటీవలి మార్పుల ఎంపికలు',
 'recentchanges-summary' => 'వికీలో ఇటీవలే జరిగిన మార్పులను ఈ పేజీలో గమనించవచ్చు.',
index 83bd7d2..c955c06 100644 (file)
@@ -445,7 +445,7 @@ $1',
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'เกี่ยวกับ{{SITENAME}}',
 'aboutpage' => 'Project:เกี่ยวกับ',
-'copyright' => 'เนื้อหาอนุญาตให้เผยแพร่ภายใต้ $1',
+'copyright' => 'เนื้อหาอนุญาตให้เผยแพร่ภายใต้ $1 เว้นแต่ระบุไว้เป็นอย่างอื่น',
 'copyrightpage' => '{{ns:project}}:ลิขสิทธิ์',
 'currentevents' => 'เหตุการณ์ปัจจุบัน',
 'currentevents-url' => 'Project:เหตุการณ์ปัจจุบัน',
@@ -647,6 +647,7 @@ $1',
 'userlogin-resetpassword-link' => 'ตั้งรหัสผ่านใหม่',
 'helplogin-url' => 'Help:การล็อกอิน',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|คำอธิบายเรื่องการล็อกอิน]]',
+'userlogin-createanother' => 'สร้างอีกบัญชี',
 'createacct-join' => 'กรอกสารสนเทศของคุณด้านล่าง',
 'createacct-another-join' => 'กรอกข้อมูลของบัญชีใหม่ด้านล่าง',
 'createacct-emailrequired' => 'ที่อยู่อีเมล',
@@ -1557,8 +1558,8 @@ $1",
 'action-block' => 'บล็อกผู้ใช้รายนี้มิให้แก้ไข',
 'action-protect' => 'เปลี่ยนระดับการล็อกสำหรับหน้านี้',
 'action-rollback' => 'ย้อนการแก้ไขของผู้ใช้ล่าสุดที่แก้ไขหน้าเฉพาะอย่างรวดเร็ว',
-'action-import' => 'à¸\99ำà¹\80à¸\82à¹\89าหà¸\99à¹\89าà¸\99ีà¹\89à¸\88าà¸\81วิà¸\81ิอืà¹\88à¸\99',
-'action-importupload' => 'à¸\99ำà¹\80à¸\82à¹\89าหà¸\99à¹\89าà¸\99ีà¹\89à¸\88าà¸\81à¸\81ารอัà¸\9bà¹\82หลà¸\94à¹\84à¸\9fลà¹\8c',
+'action-import' => 'นำเข้าหน้าจากวิกิอื่น',
+'action-importupload' => 'นำเข้าหน้าจากการอัปโหลดไฟล์',
 'action-patrol' => 'ทำเครื่องหมายการแก้ไขของผู้ใช้อื่นว่าตรวจสอบแล้ว',
 'action-autopatrol' => 'ทำเครื่องหมายการแก้ไขของคุณว่าตรวจสอบแล้ว',
 'action-unwatchedpages' => 'ดูรายการหน้าที่ไม่มีผู้เฝ้าดู',
index c4e716c..bc4ff3e 100644 (file)
@@ -2731,12 +2731,12 @@ $1',
 'ipbreasonotherlist' => 'Lý do khác',
 'ipbreason-dropdown' => '*Một số lý do cấm thường gặp
 ** Phá hoại
-** Thêm thông tin sai lệch
-** Xóa nội dung trang
-** Gửi liên kết spam đến trang web bên ngoài
+** Thêm thông tin nội dung sai lệch
+** Tẩy trống nội dung trang
+** Quảng cáo vớ vẩn
+** Đăng liên kết thư rác đến trang web bên ngoài
 ** Cho thông tin rác vào trang
 ** Có thái độ dọa dẫm/quấy rối
-** Dùng nhiều tài khoản
 ** Tên thành viên không được chấp nhận
 ** Tạo nhiều trang mới vi phạm bản quyền, bỏ qua thảo luận và cảnh báo
 ** Truyền nhiều hình ảnh thiếu nguồn gốc hoặc bản quyền
index 3dc962d..db1ce0d 100644 (file)
@@ -1041,7 +1041,7 @@ $2
 'loginreqlink' => '登录',
 'loginreqpagetext' => '您必须$1才能查看其它页面。',
 'accmailtitle' => '密码已寄出',
-'accmailtext' => "为[[User talk:$1|$1]]随机生成的密码已送至$2。登后可以在''[[Special:ChangePassword|更改密码]]''页面中修改。",
+'accmailtext' => "为[[User talk:$1|$1]]随机生成的密码已送至$2。登后可以在''[[Special:ChangePassword|更改密码]]''页面中修改。",
 'newarticle' => '(新页面)',
 'newarticletext' => '您进入了一个尚未创建的页面。
 要创建该页面,请在下面的编辑框中输入内容(详情参见[[{{MediaWiki:Helppage}}|帮助页]])。
index ae384e9..3bc7673 100644 (file)
@@ -33,6 +33,7 @@
  * @author Liangent
  * @author Liflon
  * @author Littletung
+ * @author Liuxinyu970226
  * @author Mark85296341
  * @author Oapbtommy
  * @author Openerror
@@ -287,22 +288,22 @@ $messages = array(
 'tog-previewontop' => '在編輯框上方顯示預覽',
 'tog-previewonfirst' => '第一次編輯時顯示預覽',
 'tog-nocache' => '停用瀏覽器的頁面快取',
-'tog-enotifwatchlistpages' => '當我監視列表中的頁面或檔案有更動時發電子郵件給我',
-'tog-enotifusertalkpages' => '我的對話頁有更動時發電子郵件給我',
+'tog-enotifwatchlistpages' => '當我監視列表中的頁面或檔案有變更時,發送電子郵件通知我',
+'tog-enotifusertalkpages' => '我的對話頁有變更時,發送電子郵件通知我',
 'tog-enotifminoredits' => '頁面和檔案的小修改也發電子郵件給我',
-'tog-enotifrevealaddr' => '在通知電子郵件中顯示我的電子郵件位址',
+'tog-enotifrevealaddr' => '在通知件中顯示我的電子郵件位址',
 'tog-shownumberswatching' => '顯示正在監視的使用者數目',
 'tog-oldsig' => '原有簽名:',
-'tog-fancysig' => '將簽名視為維基文字(不會自動產生連結)',
+'tog-fancysig' => '將簽名視為圍記文字(Wikitext)(不會自動產生連結)',
 'tog-uselivepreview' => '使用即時預覽(實驗性)',
 'tog-forceeditsummary' => '未輸入編輯摘要時提醒我',
 'tog-watchlisthideown' => '監視列表中隱藏我的編輯',
 'tog-watchlisthidebots' => '監視列表中隱藏機器人的編輯',
 'tog-watchlisthideminor' => '監視列表中隱藏小修改',
-'tog-watchlisthideliu' => '監視列表中隱藏登入用戶的編輯',
-'tog-watchlisthideanons' => '監視列表中隱藏匿名用戶的編輯',
+'tog-watchlisthideliu' => '監視列表中隱藏已登入使用者的編輯',
+'tog-watchlisthideanons' => '監視列表中隱藏匿名使用者的編輯',
 'tog-watchlisthidepatrolled' => '監視清單中隱藏已巡查的編輯',
-'tog-ccmeonemails' => '當我寄電子郵件給其他用戶時,也寄一份副本到我的信箱',
+'tog-ccmeonemails' => '當我寄電子郵件給其他使用者時,也寄一份副本到我的信箱',
 'tog-diffonly' => '比對版本差異時下面不顯示頁面內容',
 'tog-showhiddencats' => '顯示隱藏分類',
 'tog-noconvertlink' => '不轉換連結標題',
@@ -531,18 +532,18 @@ $1',
 'badaccess-groups' => '您請求的操作只有{{PLURAL:$2|這個|這些}}用戶群組的用戶能使用:$1',
 
 'versionrequired' => '需要 MediaWiki $1 版',
-'versionrequiredtext' => '需要版本$1的 MediaWiki 才能使用此頁
-見[[Special:Version|版本頁]]。',
+'versionrequiredtext' => '需要版本 $1 的 MediaWiki 才能使用此頁面
+詳情請見[[Special:Version|版本頁]]。',
 
 'ok' => '確定',
 'retrievedfrom' => '取自「$1」',
 'youhavenewmessages' => '您有$1($2)。',
 'newmessageslink' => '新訊息',
-'newmessagesdifflink' => '最後更改',
-'youhavenewmessagesfromusers' => '你有來自{{PLURAL:$3|另一位用戶|$3位用戶}}的$1($2)。',
-'youhavenewmessagesmanyusers' => '你有來自多位用戶的$1( $2 )。',
+'newmessagesdifflink' => '最新變更',
+'youhavenewmessagesfromusers' => '你有來自{{PLURAL:$3|另一位使用者|$3 位使用者}}的$1($2)。',
+'youhavenewmessagesmanyusers' => '你有來自多位使用者的$1( $2 )。',
 'newmessageslinkplural' => '{{PLURAL:$1|一項新訊息|新訊息}}',
-'newmessagesdifflinkplural' => '最新{{PLURAL:$1|更改}}',
+'newmessagesdifflinkplural' => '最新{{PLURAL:$1|變更}}',
 'youhavenewmessagesmulti' => '您在 $1 有新訊息',
 'editsection' => '編輯',
 'editold' => '編輯',
@@ -645,7 +646,7 @@ $1',
 函數:$1<br />
 查詢:$2',
 'viewsource' => '檢視原始碼',
-'viewsource-title' => 'æ\9f¥ç\9c\8b$1ç\9a\84æº\90代碼',
+'viewsource-title' => '檢è¦\96 $1 ç\9a\84å\8e\9få§\8b碼',
 'actionthrottled' => '動作已壓制',
 'actionthrottledtext' => '基於反垃圾的考量,您現在於這段短時間之中限制去作這一個動作,而您已經超過這個上限。
 請在數分鐘後再嘗試。',
@@ -685,15 +686,15 @@ $2',
 
 請注意,如果你再次登入,此頁或會繼續顯示,直到您清除瀏覽器緩存。',
 'welcomeuser' => '歡迎,$1!',
-'welcomecreation-msg' => '您的賬號已經建立。
-ä¸\8dè¦\81å¿\98è¨\98設置[[Special:Preferences|{{SITENAME}}ç\9a\84å\80\8b人å\8f\83æ\95¸]]。',
-'yourname' => '用戶名:',
-'userlogin-yourname' => '用戶名',
-'userlogin-yourname-ph' => '輸入你的用戶名',
-'createacct-another-username-ph' => '輸入帳名稱',
+'welcomecreation-msg' => '您的帳號已建立。
+ä¸\8dè¦\81å¿\98è¨\98è®\8aæ\9b´æ\82¨ç\9a\84[[Special:Preferences| {{SITENAME}} ç\9a\84å\81\8f好設å®\9a]]。',
+'yourname' => '使用者名稱:',
+'userlogin-yourname' => '使用者名稱:',
+'userlogin-yourname-ph' => '輸入您的使用者名稱',
+'createacct-another-username-ph' => '輸入帳名稱',
 'yourpassword' => '您的密碼:',
 'userlogin-yourpassword' => '密碼',
-'userlogin-yourpassword-ph' => '輸入密碼',
+'userlogin-yourpassword-ph' => '輸入您的密碼',
 'createacct-yourpassword-ph' => '輸入密碼',
 'yourpasswordagain' => '再次輸入密碼:',
 'createacct-yourpasswordagain' => '確認密碼',
@@ -702,8 +703,8 @@ $2',
 'userlogin-remembermypassword' => '保持我的登入狀態',
 'userlogin-signwithsecure' => '使用安全連線',
 'yourdomainname' => '您的網域:',
-'password-change-forbidden' => '您不可更改此wiki上的密碼。',
-'externaldberror' => '這可能是由於驗證資料庫錯誤或您被禁止更新您的外部賬號。',
+'password-change-forbidden' => '您不可變更此圍記(Wiki)上的密碼。',
+'externaldberror' => '這可能是由於驗證資料庫錯誤,或是您被禁止更新您的外部帳號。',
 'login' => '登入',
 'nav-login-createaccount' => '登入/建立新帳號',
 'loginprompt' => '您必須允許瀏覽器紀錄 Cookie 才能成功登入 {{SITENAME}}。',
@@ -712,48 +713,51 @@ $2',
 'logout' => '登出',
 'userlogout' => '登出',
 'notloggedin' => '未登入',
-'userlogin-noaccount' => '沒有帳嗎?',
+'userlogin-noaccount' => '沒有帳嗎?',
 'userlogin-joinproject' => '參與 {{SITENAME}}',
 'nologin' => '您還沒有帳號嗎?$1。',
-'nologinlink' => '建立帳',
-'createaccount' => '建立帳',
+'nologinlink' => '建立帳',
+'createaccount' => '建立帳',
 'gotaccount' => '已經擁有帳號?$1。',
 'gotaccountlink' => '登入',
-'userlogin-resetlink' => '忘記了你的登錄信息?',
+'userlogin-resetlink' => '忘記了您的登入細節?',
 'userlogin-resetpassword-link' => '重設密碼',
 'helplogin-url' => 'Help:登入',
-'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登入説明]]',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登入幫助]]',
+'userlogin-loggedin' => '您已作為{{GENDER:$1|$1}}登錄。
+利用以下表單以作為另一賬戶登錄。',
+'userlogin-createanother' => '建立另一賬戶',
 'createacct-join' => '輸入您的基本資料:',
-'createacct-another-join' => '在下面輸入新帳戶的資訊。',
+'createacct-another-join' => '在下方輸入新帳號的資訊。',
 'createacct-emailrequired' => '電子郵件',
 'createacct-emailoptional' => '電子郵件(可選)',
-'createacct-email-ph' => '設置電郵地址',
-'createacct-another-email-ph' => '輸入電郵地址',
+'createacct-email-ph' => '設定信件位址',
+'createacct-another-email-ph' => '輸入信件位址',
 'createaccountmail' => '使用一個臨時的隨機密碼,並將它發送到指定的電子郵件地址',
 'createacct-realname' => '真實姓名(可選)',
 'createaccountreason' => '理由:',
 'createacct-reason' => '原因',
-'createacct-reason-ph' => '您為甚麼要創建另一個帳號',
+'createacct-reason-ph' => '您為什麼要建立另一個帳號',
 'createacct-captcha' => '安全驗證',
-'createacct-imgcaptcha-ph' => '輸入您在上面看到的字符',
-'createacct-submit' => '建立帳',
+'createacct-imgcaptcha-ph' => '輸入您在上方看到的文字',
+'createacct-submit' => '建立帳',
 'createacct-another-submit' => '建立另一個使用者帳號',
 'createacct-benefit-heading' => '{{SITENAME}}是由像您一樣的人建立。',
 'createacct-benefit-body1' => '{{PLURAL:$1|次編輯}}',
-'createacct-benefit-body2' => '{{PLURAL:$1|頁面}}',
-'createacct-benefit-body3' => '位最近{{PLURAL:$1|貢獻者}}',
-'badretype' => 'æ\82¨æ\89\80輸å\85¥ç\9a\84å¯\86碼並ä¸\8dç\9b¸å\90\8c。',
-'userexists' => '!您所輸入的用戶名稱已經存在,請另選一個名稱。',
+'createacct-benefit-body2' => '{{PLURAL:$1|頁面}}',
+'createacct-benefit-body3' => '位近期{{PLURAL:$1|貢獻者}}',
+'badretype' => 'æ\82¨æ\89\80輸å\85¥ç\9a\84å¯\86碼並ä¸\8d符å\90\88。',
+'userexists' => '您所輸入的使用者名稱已存在,請另選一個名稱。',
 'loginerror' => '登入錯誤',
-'createacct-error' => '帳戶創建錯誤',
+'createacct-error' => '帳號建立錯誤',
 'createaccounterror' => '無法建立帳號:$1',
 'nocookiesnew' => '已成功建立新帳號!偵測到您已關閉 Cookies,請開啟它並登入。',
-'nocookieslogin' => '本站利用 Cookies 進行用戶登入,偵測到您已關閉 Cookies,請開啟它並重新登入。',
-'nocookiesfornew' => '這位用戶的賬戶未建立,我們不能確認它的來源。
-請肯定您已經開啟 cookies,重新載入後再試。',
-'noname' => '{{GENDER:|你|妳|你}}沒有輸入一個有效的用戶名。',
+'nocookieslogin' => '本站利用 Cookies 進行使用者登入,偵測到您已關閉 Cookies,請開啟它並重新登入。',
+'nocookiesfornew' => '這個使用者的帳號未建立,我們不能確認它的來源。
+請確認您已開啟 Cookie,重新載入後再試。',
+'noname' => '{{GENDER:|你|妳|你}}沒有輸入一個有效的使用者名稱。',
 'loginsuccesstitle' => '登入成功',
-'loginsuccess' => '{{GENDER:|你|妳|你}}正在以"$1"的身份在{{SITENAME}}登入。',
+'loginsuccess' => '{{GENDER:|你|妳|你}}正在以「$1」的身份在 {{SITENAME}} 登入。',
 'nosuchuser' => '找不到用戶 "$1"。
 用戶名稱是有大小寫區分的。
 檢查您的拼寫,或者用下面的表格[[Special:UserLogin/signup|建立一個新賬號]]。',
@@ -785,14 +789,14 @@ $2',
 'mailerror' => '發送郵件錯誤: $1',
 'acct_creation_throttle_hit' => '在這個wiki上的訪客利用您的IP地址在昨天創建了$1個賬戶,是在這段時間中的上限。
 結果利用這個IP地址的訪客在這段時間中不能創建更多的賬戶。',
-'emailauthenticated' => '您的電子郵件地址已經於$2 $3確認有效。',
+'emailauthenticated' => '您的電子郵件位址已於 $2 $3 確認有效。',
 'emailnotauthenticated' => '您的郵箱位址<strong>還沒被認証</strong>。以下功能將不會發送任何郵件。',
 'noemailprefs' => '在您的參數設置中指定一個電子郵件地址以使用此功能。',
-'emailconfirmlink' => '確èª\8dæ\82¨ç\9a\84é\83µç®±å\9c°址',
+'emailconfirmlink' => '確èª\8dæ\82¨ç\9a\84é\9b»å­\90é\83µä»¶ä½\8d址',
 'invalidemailaddress' => '郵箱地址格式不正確,請輸入正確的郵箱位址或清空該輸入框。',
-'cannotchangeemail' => 'æ\9c¬wikiä¸\8då\85\81許å°\8d賬æ\88¶ç\9a\84é\9b»é\83µå\9c°å\9d\80é\80²è¡\8cæ\9b´æ\94¹。',
+'cannotchangeemail' => 'æ­¤å\9c\8dè¨\98ï¼\88Wikiï¼\89ä¸\8då\85\81許å°\8d帳è\99\9fç\9a\84é\9b»å­\90é\83µä»¶ä½\8då\9d\80é\80²è¡\8cè®\8aæ\9b´。',
 'emaildisabled' => '此網站不能發送電子郵件。',
-'accountcreated' => '已建立賬戶',
+'accountcreated' => '已建立帳號',
 'accountcreatedtext' => '[[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|討論]])的賬戶已經被建立。',
 'createaccount-title' => '在{{SITENAME}}中建立新賬戶',
 'createaccount-text' => '有人在{{SITENAME}}中利用您的電郵創建了一個名為 "$2" 的新賬戶($4),密碼是 "$3" 。您應該立即登入並更改密碼。
@@ -813,22 +817,22 @@ $2',
 'user-mail-no-body' => '試圖發送空的或主體不合理短的電子郵件。',
 
 # Change password dialog
-'resetpass' => '更改密碼',
+'resetpass' => '變更密碼',
 'resetpass_announce' => '您是透過一個臨時的發送到郵件中的代碼登入的。要完成登入,您必須在這裡設定一個新密碼:',
 'resetpass_text' => '<!-- 在此處加入文字 -->',
-'resetpass_header' => '更改賬戶密碼',
-'oldpassword' => '舊密碼:',
-'newpassword' => '新密碼:',
-'retypenew' => '確認密碼:',
+'resetpass_header' => '變更帳號密碼',
+'oldpassword' => '舊密碼',
+'newpassword' => '新密碼',
+'retypenew' => '確認密碼',
 'resetpass_submit' => '設定密碼並登入',
-'changepassword-success' => '您的密碼已經被成功更改!',
-'resetpass_forbidden' => '無法更改密碼',
+'changepassword-success' => '您的密碼已成功變更!',
+'resetpass_forbidden' => '無法變更密碼',
 'resetpass-no-info' => '您必須登入後直接進入這個頁面。',
-'resetpass-submit-loggedin' => '更改密碼',
+'resetpass-submit-loggedin' => '變更密碼',
 'resetpass-submit-cancel' => '取消',
 'resetpass-wrong-oldpass' => '無效的臨時或現有的密碼。
 您可能已成功地更改了您的密碼,或者已經請求一個新的臨時密碼。',
-'resetpass-temp-password' => '臨時密碼:',
+'resetpass-temp-password' => '臨時密碼',
 'resetpass-abort-generic' => '擴充元件已中止了更改密碼操作。',
 
 # Special:PasswordReset
@@ -836,14 +840,14 @@ $2',
 'passwordreset-text-one' => '完成此表格以重新設定您的密碼。',
 'passwordreset-text-many' => '{{PLURAL:$1|輸入其中一項以重新設定您的密碼。}}',
 'passwordreset-legend' => '重設密碼',
-'passwordreset-disabled' => '此維基上已禁止了重設密碼。',
-'passwordreset-emaildisabled' => '電子郵件功能在此 wiki 上已禁用。',
-'passwordreset-username' => '用戶名:',
+'passwordreset-disabled' => '此圍記(Wiki)已禁用重設密碼。',
+'passwordreset-emaildisabled' => '此圍記(Wiki)已禁用電子郵件功能。',
+'passwordreset-username' => '使用者名稱:',
 'passwordreset-domain' => '域名:',
-'passwordreset-capture' => 'æ\9f¥ç\9c\8bç\94\9fæ\88\90的電子郵件嗎?',
+'passwordreset-capture' => '檢è¦\96ç\94¢ç\94\9f的電子郵件嗎?',
 'passwordreset-capture-help' => '如果您選中此框,電子郵件(包括臨時密碼)將顯示,並發送給用戶。',
-'passwordreset-email' => '電郵地址:',
-'passwordreset-emailtitle' => '在{{SITENAME}}上的詳細息',
+'passwordreset-email' => '電子郵件位址:',
+'passwordreset-emailtitle' => '在{{SITENAME}}上的詳細息',
 'passwordreset-emailtext-ip' => '有人(可能是你,來自$1這個IP)要求重置{{SITENAME}}($4)的密碼。該用戶{{PLURAL:$3|是}}與以下電郵地址有關:
 
 $2
@@ -859,22 +863,22 @@ $2
 {{PLURAL:$3|這個臨時密碼|這些臨時密碼}}會在{{PLURAL:$5|一天|$5天}}到期。
 你應該現在登入並選擇一個新的密碼。如果不是你作出這個請求,又或你已經記
 起你原來的密碼,你可以忽略本信息並使用你原來的密碼。',
-'passwordreset-emailelement' => '用戶名:$1
+'passwordreset-emailelement' => '使用者名稱:$1
 臨時密碼:$2',
-'passwordreset-emailsent' => '已發送重置密碼電郵。',
-'passwordreset-emailsent-capture' => '重置密碼電子郵件已發送,並在下面顯示。',
-'passwordreset-emailerror-capture' => 'ç\94\9fæ\88\90ç\9a\84é\87\8dç½®å¯\86碼é\9b»å­\90é\83µä»¶å¦\82ä¸\8bæ\89\80示ï¼\8cä½\86ç\99¼é\80\81給{{GENDER:$2|ç\94¨æ\88}}失敗:$1',
+'passwordreset-emailsent' => '已發送重設密碼的電子郵件。',
+'passwordreset-emailsent-capture' => '已發送重設密碼的電子郵件,並在下面顯示。',
+'passwordreset-emailerror-capture' => 'ç\94¢ç\94\9fç\9a\84é\87\8d設å¯\86碼ç\9a\84é\9b»å­\90é\83µä»¶å¦\82ä¸\8bæ\89\80示ï¼\8cä½\86ç\99¼é\80\81給{{GENDER:$2|使ç\94¨è\80\85}}失敗:$1',
 
 # Special:ChangeEmail
-'changeemail' => '更改電郵地址',
-'changeemail-header' => '更改帳號電郵地址',
-'changeemail-text' => '填寫表格以修改您的電郵地址。您需要輸入您的密碼以確認此更改。',
-'changeemail-no-info' => '您必須登方可直接訪問此頁面。',
-'changeemail-oldemail' => 'ç\95¶å\89\8dé\9b»é\83µå\9c°址:',
-'changeemail-newemail' => '新電郵地址:',
+'changeemail' => '變更電子郵件位址',
+'changeemail-header' => '變更帳號的電子郵件位址',
+'changeemail-text' => '填寫表格以修改您的信件位址。您需要輸入密碼以確認此次變更。',
+'changeemail-no-info' => '您必須登方可直接訪問此頁面。',
+'changeemail-oldemail' => 'ç\9b®å\89\8dç\9a\84é\9b»å­\90é\83µä»¶ä½\8d址:',
+'changeemail-newemail' => '新的電子郵件位址:',
 'changeemail-none' => '(無)',
 'changeemail-password' => '您的{{SITENAME}}密碼:',
-'changeemail-submit' => '更改電郵',
+'changeemail-submit' => '變更電子郵件',
 'changeemail-cancel' => '取消',
 
 # Special:ResetTokens
@@ -997,9 +1001,9 @@ $2
 'userinvalidcssjstitle' => "'''警告:''' 不存在面板「$1」。
 注意自訂的 .css 和 .js 頁要使用小寫標題,例如,{{ns:user}}:Foo/vector.css 不同於 {{ns:user}}:Foo/Vector.css。",
 'updated' => '(已更新)',
-'note' => "'''注意:'''",
+'note' => "'''注意'''",
 'previewnote' => "'''請記住這只是預覽。'''
-您的更改尚未儲存!",
+您的變更尚未儲存!",
 'continue-editing' => '往編輯框',
 'previewconflict' => '這個預覽顯示了上面文字編輯區中的內容。它將在{{GENDER:|你|妳|你}}選擇保存後出現。',
 'session_fail_preview' => "'''很抱歉!由於部份資料遺失,我們無法處理您的編輯。'''
@@ -1014,7 +1018,7 @@ $2
 這種情況通常出現於使用含有很多臭蟲、以網絡為主的匿名代理服務的時候。",
 'edit_form_incomplete' => '編輯表單的某些部分沒有到達伺服器 ;請檢查您的編輯內容是否完整並再試一次。',
 'editing' => '編輯「$1」',
-'creating' => 'å\89µå»º$1',
+'creating' => '建ç«\8bã\80\8c$1ã\80\8d',
 'editingsection' => '編輯「$1」(段落)',
 'editingcomment' => '編輯「$1」(新段落)',
 'editconflict' => '編輯衝突:$1',
@@ -1024,7 +1028,7 @@ $2
 {{GENDER:|你|妳|你}}應當將{{GENDER:|你|妳|你}}所做的修改加入現有的內容中。
 '''只有'''在上面文字框中的內容會在{{GENDER:|你|妳|你}}點擊「{{int:savearticle}}」後被保存。",
 'yourtext' => '您的文字',
-'storedversion' => '已存修訂版本',
+'storedversion' => '已存修訂版本',
 'nonunicodebrowser' => "'''警告: 您的瀏覽器不兼容Unicode編碼。'''這裡有一個工作區將使您能安全地編輯頁面: 非ASCII字元將以十六進製編碼模式出現在編輯框中。",
 'editingold' => "'''警告:{{GENDER:|你|妳|你}}正在編輯的是本頁的舊版本。'''
 如果{{GENDER:|你|妳|你}}保存它的話,在本版本之後的任何修改都會遺失。",
@@ -1088,7 +1092,7 @@ $2
 'editwarning-warning' => '離開這個頁面可能會令您失去之前作出的所有更改。若您已經登入,您可在偏好設定的「編輯」部份裡關閉此警告。',
 
 # Content models
-'content-model-wikitext' => 'wiki語法',
+'content-model-wikitext' => '圍記文字(Wikitext)',
 'content-model-text' => '純文字',
 'content-model-javascript' => 'JavaScript',
 'content-model-css' => 'CSS',
@@ -1328,7 +1332,7 @@ $1",
 'search-section' => '(段落 $1)',
 'search-suggest' => '{{GENDER:|你|妳|你}}是不是要找:$1',
 'search-interwiki-caption' => '姊妹計劃',
-'search-interwiki-default' => '$1項結果:',
+'search-interwiki-default' => '$1 項結果:',
 'search-interwiki-more' => '(更多)',
 'search-relatedarticle' => '相關',
 'mwsuggest-disable' => '停用搜尋建議',
@@ -1348,7 +1352,7 @@ $1",
 'powersearch-togglelabel' => '核取:',
 'powersearch-toggleall' => '所有',
 'powersearch-togglenone' => '無',
-'search-external' => '外部搜',
+'search-external' => '外部搜',
 'searchdisabled' => '{{SITENAME}}由於性能方面的原因,全文搜索已被暫時停用。您可以暫時透過Google搜索。請留意他們的索引可能會過時。',
 'search-error' => '搜尋時發生錯誤:$1',
 
@@ -1358,31 +1362,31 @@ $1",
 'prefs-edits' => '編輯次數:',
 'prefsnologin' => '還未登入',
 'prefsnologintext' => '您必須先<span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} 登入]</span>才能設置個人參數。',
-'changepassword' => '更改密碼',
+'changepassword' => '變更密碼',
 'prefs-skin' => '外觀',
 'skin-preview' => '預覽',
 'datedefault' => '預設值',
-'prefs-beta' => 'Beta 特性',
+'prefs-beta' => 'Beta 功能',
 'prefs-datetime' => '日期和時間',
 'prefs-labs' => '實驗中的功能',
-'prefs-user-pages' => '用戶頁面',
-'prefs-personal' => '用戶資料',
-'prefs-rc' => '最近更改',
+'prefs-user-pages' => '使用者頁面',
+'prefs-personal' => '使用者概況表',
+'prefs-rc' => '近期變更',
 'prefs-watchlist' => '監視列表',
 'prefs-watchlist-days' => '監視列表中顯示的天數:',
 'prefs-watchlist-days-max' => '最多$1{{PLURAL:$1|天}}',
-'prefs-watchlist-edits' => 'æ\93´å±\95ç\9b£è¦\96å\88\97表中顯示æ\9b´æ\94¹æ¬¡æ\95¸上限:',
+'prefs-watchlist-edits' => 'æ\93´å\85\85ç\9b£è¦\96å\88\97表中顯示è®\8aæ\9b´æ¬¡æ\95¸ç\9a\84上限:',
 'prefs-watchlist-edits-max' => '最大數量:1000',
 'prefs-watchlist-token' => '監視列表密鑰:',
 'prefs-misc' => '雜項',
-'prefs-resetpass' => '更改密碼',
-'prefs-changeemail' => '更改電郵',
-'prefs-setemail' => '設置電郵地址',
-'prefs-email' => '電選項',
+'prefs-resetpass' => '變更密碼',
+'prefs-changeemail' => '變更電子郵件',
+'prefs-setemail' => '設定電子郵件位址',
+'prefs-email' => '電子郵件選項',
 'prefs-rendering' => '外觀',
 'saveprefs' => '儲存',
-'resetprefs' => '清除未保存的更改',
-'restoreprefs' => '恢復所有預設設定(所有部分)',
+'resetprefs' => '清除未儲存的變更',
+'restoreprefs' => '還原所有預設設定(所有部分)',
 'prefs-editing' => '編輯',
 'rows' => '行:',
 'columns' => '列:',
@@ -1390,13 +1394,13 @@ $1",
 'resultsperpage' => '每頁顯示連結數:',
 'stub-threshold' => '<a href="#" class="stub">短頁面連結</a>格式門檻值 (位元組):',
 'stub-threshold-disabled' => '已停用',
-'recentchangesdays' => '最近更改中的顯示日數:',
+'recentchangesdays' => '近期變更的顯示日數:',
 'recentchangesdays-max' => '最多$1{{PLURAL:$1|天}}',
 'recentchangescount' => '預設顯示的編輯數:',
 'prefs-help-recentchangescount' => '這個包括最近更改、頁面歷史以及日誌。',
 'prefs-help-watchlist-token2' => '這是一個秘密的密鑰,用於訂源您的監視列表。
 知道它的人將能夠讀取您的監視列表,所以您不應該分享它。[[Special:ResetTokens|如有需要重設此密鑰,請點擊這裡]]。',
-'savedprefs' => 'æ\82¨ç\9a\84å\80\8b人å\81\8f好設å®\9aå·²ç¶\93儲存。',
+'savedprefs' => 'æ\82¨ç\9a\84å\81\8f好設å®\9aå·²儲存。',
 'timezonelegend' => '時區:',
 'localtime' => '當地時間:',
 'timezoneuseserverdefault' => '使用預設($1)',
@@ -1414,7 +1418,7 @@ $1",
 'timezoneregion-europe' => '歐洲',
 'timezoneregion-indian' => '印度洋',
 'timezoneregion-pacific' => '太平洋',
-'allowemail' => '接受來自其他用戶的郵件',
+'allowemail' => '接受來自其他使用者的信件',
 'prefs-searchoptions' => '搜尋',
 'prefs-namespaces' => '頁面名稱空間',
 'defaultns' => '否則在這些名字空間搜尋:',
@@ -1426,8 +1430,8 @@ $1",
 'prefs-reset-intro' => '您可以利用這個頁面去重設您的參數設置到網站預設值。這個動作無法復原。',
 'prefs-emailconfirm-label' => '電子郵件確認:',
 'youremail' => '電子郵件:',
-'username' => '{{GENDER:$1|用戶名}}:',
-'uid' => '{{GENDER:$1|用戶ID}}:',
+'username' => '{{GENDER:$1|使用者名稱}}:',
+'uid' => '{{GENDER:$1|使用者 ID}}:',
 'prefs-memberingroups' => '{{PLURAL:$1|群組}}{{GENDER:$2|成員}}:',
 'prefs-registration' => '註冊時間:',
 'yourrealname' => '真實姓名:',
@@ -1472,17 +1476,17 @@ $1",
 'prefs-help-prefershttps' => '此選項將於您下次登入時生效。',
 
 # User preference: email validation using jQuery
-'email-address-validity-valid' => '電子郵件址有效',
-'email-address-validity-invalid' => '請提供一個有效的電子郵件址',
+'email-address-validity-valid' => '電子郵件址有效',
+'email-address-validity-invalid' => '請提供一個有效的電子郵件址',
 
 # User rights
-'userrights' => '用戶權限管理',
-'userrights-lookup-user' => '管理用戶群組',
-'userrights-user-editname' => '輸入用戶名:',
+'userrights' => '使用者權限管理',
+'userrights-lookup-user' => '管理使用者群組',
+'userrights-user-editname' => '輸入使用者名稱:',
 'editusergroup' => '編輯用戶群組',
-'editinguser' => "更改用戶'''[[User:$1|$1]]''' 的用戶權限 $2",
-'userrights-editusergroup' => '編輯用戶群組',
-'saveusergroups' => '保存用戶群組',
+'editinguser' => "變更使用者 '''[[User:$1|$1]]''' 的使用者權限 $2",
+'userrights-editusergroup' => '編輯使用者群組',
+'saveusergroups' => '儲存使用者群組',
 'userrights-groupsmember' => '屬於:',
 'userrights-groupsmember-auto' => '固有屬於:',
 'userrights-groups-help' => '您可以改動這位用戶所屬的群組:
@@ -1493,7 +1497,7 @@ $1",
 'userrights-no-interwiki' => '您並沒有權限去編輯在其它wiki上的用戶權限。',
 'userrights-nodatabase' => '資料庫$1不存在或並非為本地的。',
 'userrights-nologin' => '您必須要以操作員賬戶[[Special:UserLogin|登入]]之後才可以指定用戶權限。',
-'userrights-notallowed' => '你無權添加或刪除用戶權限。',
+'userrights-notallowed' => '你無權加入或刪除使用者權限。',
 'userrights-changeable-col' => '您可以更改的群組',
 'userrights-unchangeable-col' => '您不可以更改的群組',
 'userrights-conflict' => '使用者權限更改發生衝突!請檢視並確認你的更改。',
@@ -1501,23 +1505,23 @@ $1",
 
 # Groups
 'group' => '群組:',
-'group-user' => '用戶',
-'group-autoconfirmed' => '自動確認用戶',
+'group-user' => '使用者',
+'group-autoconfirmed' => '自動確認使用者',
 'group-bot' => '機器人',
 'group-sysop' => '管理員',
 'group-bureaucrat' => '行政員',
 'group-suppress' => '監督',
 'group-all' => '(全部)',
 
-'group-user-member' => '{{GENDER:$1|用戶}}',
-'group-autoconfirmed-member' => '自動確認用戶',
+'group-user-member' => '{{GENDER:$1|使用者}}',
+'group-autoconfirmed-member' => '自動確認使用者',
 'group-bot-member' => '機器人',
 'group-sysop-member' => '{{GENDER:$1|管理員}}',
 'group-bureaucrat-member' => '行政員',
 'group-suppress-member' => '監督員',
 
-'grouppage-user' => '{{ns:project}}:用戶',
-'grouppage-autoconfirmed' => '{{ns:project}}:自動確認用戶',
+'grouppage-user' => '{{ns:project}}:使用者',
+'grouppage-autoconfirmed' => '{{ns:project}}:自動確認使用者',
 'grouppage-bot' => '{{ns:project}}:機器人',
 'grouppage-sysop' => '{{ns:project}}:管理員',
 'grouppage-bureaucrat' => '{{ns:project}}:行政員',
@@ -1528,11 +1532,11 @@ $1",
 'right-edit' => '編輯頁面',
 'right-createpage' => '建立頁面(不含討論頁面)',
 'right-createtalk' => '建立討論頁面',
-'right-createaccount' => 'å\89µå»ºæ\96°ç\94¨æ\88¶è³¬æ\88',
-'right-minoredit' => '標示小編輯',
+'right-createaccount' => '建ç«\8bæ\96°ç\9a\84使ç\94¨è\80\85帳è\99\9f',
+'right-minoredit' => '標示小編輯',
 'right-move' => '移動頁面',
-'right-move-subpages' => '移å\8b\95é \81é\9d¢è·\9få®\83ç\9a\84子頁面',
-'right-move-rootuserpages' => '移動根用戶頁面',
+'right-move-subpages' => '移å\8b\95é \81é\9d¢è\88\87å\85子頁面',
+'right-move-rootuserpages' => '移動根使用者頁面',
 'right-movefile' => '移動檔案',
 'right-suppressredirect' => '當移動頁面時不建立來源頁面之重定向',
 'right-upload' => '上傳檔案',
@@ -1571,7 +1575,7 @@ $1",
 'right-edituserjs' => '編輯其他用戶的JavaScript檔案',
 'right-editmyusercss' => '編輯你自己的用戶CSS檔',
 'right-editmyuserjs' => '編輯你自己的用戶JavaScript檔',
-'right-viewmywatchlist' => 'æ\9f¥ç\9c\8b您的監視列表',
+'right-viewmywatchlist' => '檢è¦\96您的監視列表',
 'right-editmywatchlist' => '編輯您的監視列表。請注意即使沒有這種權利,某些操作仍將添加頁面。',
 'right-viewmyprivateinfo' => '檢視自己的私隱資料(如電郵地址及真實姓名)',
 'right-editmyprivateinfo' => '編輯自己的私隱資料(如電郵地址及真實姓名)',
@@ -1594,11 +1598,11 @@ $1",
 'right-passwordreset' => '查看重置密碼郵件',
 
 # Special:Log/newusers
-'newuserlogpage' => '新進用戶名冊',
+'newuserlogpage' => '使用者建立日誌',
 'newuserlogpagetext' => '這是一個最近被創建用戶的新日誌',
 
 # User rights log
-'rightslog' => '用戶權限日誌',
+'rightslog' => '使用者權限日誌',
 'rightslogtext' => '以下記錄了用戶權限的更改記錄。',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1647,17 +1651,17 @@ $1",
 'enhancedrc-since-last-visit' => '自上次訪問已有$1',
 'enhancedrc-history' => '歷史',
 'recentchanges' => '最近變更',
-'recentchanges-legend' => '最近更改選項',
-'recentchanges-summary' => 'è·\9f蹤此維å\9fºä¸\8aç\9a\84æ\9c\80è¿\91æ\9b´æ\94¹。',
+'recentchanges-legend' => '近期變更選項',
+'recentchanges-summary' => '追蹤該å\9c\8dè¨\98ï¼\88Wikiï¼\89ç\9a\84è¿\91æ\9c\9fè®\8aæ\9b´。',
 'recentchanges-noresult' => '在所選擇的時間裡沒有任何更改與所給條件吻合。',
-'recentchanges-feed-description' => '訂閱此維基上的最近更改。',
+'recentchanges-feed-description' => '訂閱該圍記(Wiki)的近期變更。',
 'recentchanges-label-newpage' => '這次編輯建立了一個新頁面',
 'recentchanges-label-minor' => '這是一個小編輯',
 'recentchanges-label-bot' => '這次編輯是由機器人進行',
 'recentchanges-label-unpatrolled' => '這次編輯尚未巡查過',
 'rcnote' => "以下是在$4 $5,最近 '''$2''' 天內的 '''$1''' 次最近更改記錄。",
 'rcnotefrom' => "下面是自'''$2'''(最多顯示'''$1'''):",
-'rclistfrom' => '顯示自$1以來的新更改',
+'rclistfrom' => '顯示自 $1 以來的新變更',
 'rcshowhideminor' => '$1小編輯',
 'rcshowhidebots' => '$1機器人的編輯',
 'rcshowhideliu' => '$1已登入用戶的編輯',
@@ -1672,7 +1676,7 @@ $1",
 'minoreditletter' => '小',
 'newpageletter' => '新',
 'boteditletter' => '機',
-'number_of_watching_users_pageview' => '[$1位用戶在監視]',
+'number_of_watching_users_pageview' => '[$1 位使用者在監視]',
 'rc_categories' => '分類界限(以"|"分割)',
 'rc_categories_any' => '任意',
 'rc-change-size-new' => '更改後$1字節',
@@ -1682,10 +1686,10 @@ $1",
 'rc-old-title' => '最初建立為「$1」',
 
 # Recent changes linked
-'recentchangeslinked' => '相關更改',
-'recentchangeslinked-feed' => '相關更改',
+'recentchangeslinked' => '相關變更',
+'recentchangeslinked-feed' => '相關變更',
 'recentchangeslinked-toolbox' => '相關變更',
-'recentchangeslinked-title' => '與「$1」有關的更改',
+'recentchangeslinked-title' => '與「$1」有關的變更',
 'recentchangeslinked-summary' => "這一個特殊頁面列示''由''所給出的一個頁面之連結到頁面的最近更改(或者是對於指定分類的成員)。
 在[[Special:Watchlist|您的監視列表]]中的頁面會以'''粗體'''顯示。",
 'recentchangeslinked-page' => '頁面名稱:',
@@ -1700,7 +1704,7 @@ $1",
 'uploadnologintext' => '您必須先$1才能上載檔案。',
 'upload_directory_missing' => '上傳目錄($1)遺失,不能由網頁伺服器建立。',
 'upload_directory_read_only' => '上傳目錄($1)不存在或無寫權限。',
-'uploaderror' => '上錯誤',
+'uploaderror' => '上錯誤',
 'upload-recreate-warning' => "'''警告:一個相同名字的檔案曾經被刪除或者移動至別處。'''
 
 這個頁面的刪除和移動日誌在這裏提供以便參考:",
@@ -1714,14 +1718,14 @@ $1",
 'upload-permitted' => '准許的檔案類型:$1。',
 'upload-preferred' => '建議的檔案類型:$1。',
 'upload-prohibited' => '禁止的檔案類型:$1。',
-'uploadlog' => '上載紀錄',
-'uploadlogpage' => '上載紀錄',
+'uploadlog' => '上傳日誌',
+'uploadlogpage' => '上傳日誌',
 'uploadlogpagetext' => '以下是最近上載的檔案的一覽表。
 檢視[[Special:NewFiles|新檔案畫廊]]去看更富圖片的總覽。',
-'filename' => '檔案名',
-'filedesc' => 'æª\94æ¡\88æ\8f\8fè¿°',
-'fileuploadsummary' => 'æª\94æ¡\88æ\8f\8fè¿°:',
-'filereuploadsummary' => '檔案更改說明:',
+'filename' => '檔案名',
+'filedesc' => 'æª\94æ¡\88æ\91\98è¦\81',
+'fileuploadsummary' => 'æª\94æ¡\88æ\91\98è¦\81:',
+'filereuploadsummary' => '檔案變更:',
 'filestatus' => '版權狀態:',
 'filesource' => '來源:',
 'uploadedfiles' => '已上載檔案',
@@ -1773,7 +1777,7 @@ $1",
 'file-deleted-duplicate' => '一個相同名稱的檔案 ([[:$1]]) 在先前刪除過。您應該在重新上傳之前檢查一下該檔案之刪除紀錄。',
 'uploadwarning' => '上載警告',
 'uploadwarning-text' => '請修改以下的檔案描述並重試。',
-'savefile' => '存檔案',
+'savefile' => '存檔案',
 'uploadedimage' => '已上載「[[$1]]」',
 'overwroteimage' => '已經上傳「[[$1]]」的新版本',
 'uploaddisabled' => '上傳己停用。',
@@ -1926,12 +1930,12 @@ $1',
 'listfiles_thumb' => '縮圖',
 'listfiles_date' => '日期',
 'listfiles_name' => '名稱',
-'listfiles_user' => '用戶',
+'listfiles_user' => '使用者',
 'listfiles_size' => '大小',
 'listfiles_description' => '描述',
 'listfiles_count' => '版本',
 'listfiles-show-all' => '包括圖片的舊版本',
-'listfiles-latestversion' => 'ç\95前版本',
+'listfiles-latestversion' => 'ç\9b®前版本',
 'listfiles-latestversion-yes' => '是',
 'listfiles-latestversion-no' => '否',
 
@@ -1947,7 +1951,7 @@ $1',
 'filehist-thumb' => '縮圖',
 'filehist-thumbtext' => '於$1的縮圖版本',
 'filehist-nothumb' => '沒有縮圖',
-'filehist-user' => '用戶',
+'filehist-user' => '使用者',
 'filehist-dimensions' => '維度',
 'filehist-filesize' => '檔案大小',
 'filehist-comment' => '註解',
@@ -2046,19 +2050,19 @@ $1',
 'statistics-header-pages' => '頁面統計',
 'statistics-header-edits' => '編輯統計',
 'statistics-header-views' => '檢視統計',
-'statistics-header-users' => '用戶統計',
+'statistics-header-users' => '使用者統計',
 'statistics-header-hooks' => '其它統計',
 'statistics-articles' => '內容頁面',
 'statistics-pages' => '頁面',
-'statistics-pages-desc' => '在wiki上的所有頁面,包括對話頁面、重新定向等',
+'statistics-pages-desc' => '在圍記(Wiki)上的所有頁面,包括討論頁、重新導向等。',
 'statistics-files' => '已經上傳的檔案',
 'statistics-edits' => '自從{{SITENAME}}設定的頁面編輯數',
 'statistics-edits-average' => '每一頁面的平均編輯數',
 'statistics-views-total' => '檢視總數',
 'statistics-views-total-desc' => '不存在頁面和特殊頁面的查看數未計入',
 'statistics-views-peredit' => '每次編輯檢視數',
-'statistics-users' => '已註冊[[Special:ListUsers|用戶]]',
-'statistics-users-active' => '活躍用戶',
+'statistics-users' => '已註冊[[Special:ListUsers|使用者]]',
+'statistics-users-active' => '活躍使用者',
 'statistics-users-active-desc' => '在前$1天中操作過的用戶',
 'statistics-mostpopular' => '被查閱次數最多的頁面',
 
@@ -2070,15 +2074,15 @@ $1',
 'pageswithprop-prophidden-long' => '長文本屬性值已被隱藏($1)',
 'pageswithprop-prophidden-binary' => '已隱藏二進位屬性值($1)',
 
-'doubleredirects' => '雙重重定向',
+'doubleredirects' => '雙重的重新導向',
 'doubleredirectstext' => '這一頁列出所有重定向頁面重定向到另一個重定向頁的頁面。每一行都包含到第一和第二個重定向頁面的連結,以及第二個重定向頁面的目標,通常顯示的都會是"真正"的目標頁面,也就是第一個重定向頁面應該指向的頁面。
 <del>已劃去</del>的為已經解決之項目。',
 'double-redirect-fixed-move' => '[[$1]]已經完成移動,它現在重新定向到[[$2]]。',
 'double-redirect-fixed-maintenance' => '修復從[[$1]]到[[$2]]的雙重重定向。',
-'double-redirect-fixer' => 'é\87\8dæ\96°å®\9a向修正器',
+'double-redirect-fixer' => 'é\87\8dæ\96°å°\8e向修正器',
 
-'brokenredirects' => '受損重定向',
-'brokenredirectstext' => '以下的重定向頁指向的是不存在的頁面:',
+'brokenredirects' => '中斷的重新導向',
+'brokenredirectstext' => '以下的重新導向頁面連結到不存在的頁面:',
 'brokenredirects-edit' => '編輯',
 'brokenredirects-delete' => '刪除',
 
@@ -2090,7 +2094,7 @@ $1',
 'fewestrevisions' => '最少修訂的頁面',
 
 # Miscellaneous special pages
-'nbytes' => '$1位元組',
+'nbytes' => '$1 個位元組',
 'ncategories' => '$1 個分類',
 'ninterwikis' => '$1 個跨維基',
 'nlinks' => '$1個連結',
@@ -2142,10 +2146,10 @@ $1',
 'listusers-editsonly' => '只顯示有編輯的用戶',
 'listusers-creationsort' => '按建立日期排序',
 'listusers-desc' => '使用降冪排序',
-'usereditcount' => '$1 次編輯',
+'usereditcount' => '$1 次{{PLURAL:$1|編輯}}',
 'usercreated' => '$1 $2{{GENDER:$3|創建}}',
 'newpages' => '最新頁面',
-'newpages-username' => '用戶名:',
+'newpages-username' => '使用者名稱:',
 'ancientpages' => '最舊頁面',
 'move' => '移動',
 'movethispage' => '移動本頁',
@@ -2253,7 +2257,7 @@ $1',
 'listgrouprights-members' => '(成員清單)',
 'listgrouprights-addgroup' => '加入的{{PLURAL:$2|一個|多個}}群組: $1',
 'listgrouprights-removegroup' => '移除的{{PLURAL:$2|一個|多個}}群組: $1',
-'listgrouprights-addgroup-all' => '入所有群組',
+'listgrouprights-addgroup-all' => 'å\8a å\85¥æ\89\80æ\9c\89群çµ\84',
 'listgrouprights-removegroup-all' => '移除所有群組',
 'listgrouprights-addgroup-self' => '在自己的賬戶中加入的{{PLURAL:$2|一個|多個}}群組: $1',
 'listgrouprights-removegroup-self' => '在自己的賬戶中移除的{{PLURAL:$2|一個|多個}}群組: $1',
@@ -2410,21 +2414,21 @@ $UNWATCHURL
 'delete-warning-toobig' => '這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除它可能會擾亂{{SITENAME}}的資料庫操作;在繼續此動作前請小心。',
 
 # Rollback
-'rollback' => '恢復編輯',
-'rollback_short' => '恢復',
+'rollback' => '回退編輯',
+'rollback_short' => '回退',
 'rollbacklink' => '復原',
-'rollbacklinkcount' => '恢復 $1 次編輯',
-'rollbacklinkcount-morethan' => '恢復多過 $1 次編輯',
-'rollbackfailed' => '無法恢復',
-'cantrollback' => '無法恢復編輯;最後的貢獻者是本æ\96\87ç\9a\84å\94¯ä¸\80ä½\9cè\80\85ã\80\82',
+'rollbacklinkcount' => '回退 $1 次編輯',
+'rollbacklinkcount-morethan' => '回退多過 $1 次{{PLURAL:$1|編輯}}',
+'rollbackfailed' => '無法回退',
+'cantrollback' => '無法恢復編輯;最後的貢獻者是本ç¯\87ç\9a\84å\94¯ä¸\80ä½\9cè\80\85ã\80\82',
 'alreadyrolled' => '無法回退由[[User:$2|$2]]([[User talk:$2|討論]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]在[[:$1]]上的編輯;其他人已經編輯或者回退了該頁。
 
 該頁最後的編輯者是[[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]]的最後一個修訂版本',
-'revertpage-nouser' => '已由隱藏的使用者還原編輯至上個 {{GENDER:$1|[[使用者:$1|$1]]}} 修訂的版本',
-'rollback-success' => '已恢復$1的編輯;
-更改回$2的最後修訂版本。',
+'revertpage-nouser' => '已由隱藏的使用者恢復編輯到上個{{GENDER:$1|[[User:$1|$1]]}}的修訂版本',
+'rollback-success' => '已恢復 $1 的編輯;
+更變更回 $2 的最後修訂版本。',
 
 # Edit tokens
 'sessionfailure-title' => '登入資訊失敗',
@@ -2436,12 +2440,12 @@ $UNWATCHURL
 'protectlogpage' => '保護日誌',
 'protectlogtext' => '下面是頁面保護修改列表。
 請參考[[Special:ProtectedPages|保護頁面清單]]以檢視目前進行的頁面保護。',
-'protectedarticle' => '已保護"[[$1]]"',
-'modifiedarticleprotection' => '已經更改「[[$1]]」的保護等級',
-'unprotectedarticle' => '已解除"[[$1]]"保護',
+'protectedarticle' => '已保護「[[$1]]」',
+'modifiedarticleprotection' => '已變更「[[$1]]」的保護等級',
+'unprotectedarticle' => '已解除「[[$1]]」的保護',
 'movedarticleprotection' => '已將「[[$2]]」的保護設定移動至「[[$1]]」',
-'protect-title' => '更改「$1」的保護等級',
-'protect-title-notallowed' => 'æ\9f¥ç\9c\8b「$1」的保護等級',
+'protect-title' => '變更「$1」的保護等級',
+'protect-title-notallowed' => '檢è¦\96「$1」的保護等級',
 'prot_1movedto2' => '[[$1]]移動到[[$2]]',
 'protect-badnamespace-title' => '不可被保護的名字空間',
 'protect-badnamespace-text' => '這個名字空間內的頁面無法被保護。',
@@ -2503,12 +2507,12 @@ $UNWATCHURL
 
 # Undelete
 'undelete' => '恢復被刪頁面',
-'undeletepage' => '瀏覽及恢復被刪頁面',
+'undeletepage' => '檢視與還原已刪除的頁面',
 'undeletepagetitle' => "'''以下包含[[:$1]]的已刪除之修訂版本'''。",
-'viewdeletedpage' => '檢視刪除的頁面',
+'viewdeletedpage' => '檢視刪除的頁面',
 'undeletepagetext' => '以下的$1個頁面已經被刪除,但依然在檔案中並可以被恢復。
 檔案庫可能被定時清理。',
-'undelete-fieldset-title' => '恢復修訂',
+'undelete-fieldset-title' => '還原修訂',
 'undeleteextrahelp' => "恢復整個頁面時,請清除所有複選框後按 '''''{{int:undeletebtn}}''''' 。
 恢復特定版本時,請選擇相應版本前的複選框後按'''''{{int:undeletebtn}}''''' 。
 按 '''''{{int:undeletereset}}''''' 將清除評論內容及所有複選框。",
@@ -2520,7 +2524,7 @@ $UNWATCHURL
 'undelete-revision' => '$1由$3(在$4 $5)所編寫的已刪除修訂版本:',
 'undeleterevision-missing' => '此版本的內容不正確或已經遺失。可能連結錯誤、被移除或已經被恢復。',
 'undelete-nodiff' => '找不到先前的修訂版本。',
-'undeletebtn' => '恢復',
+'undeletebtn' => '還原',
 'undeletelink' => '檢視/還原',
 'undeleteviewlink' => '檢視',
 'undeletereset' => '重設',
@@ -2559,9 +2563,9 @@ $1',
 
 # Contributions
 'contributions' => '{{GENDER:$1|用戶}}貢獻',
-'contributions-title' => '$1的用戶貢獻',
+'contributions-title' => '$1 的使用者貢獻',
 'mycontris' => '我的貢獻',
-'contribsub2' => '$1的貢獻 ($2)',
+'contribsub2' => '{{GENDER:$3|$1}} 的貢獻 ($2)',
 'nocontribs' => '沒有找到符合特徵的更改。',
 'uctop' => '(最新修改)',
 'month' => '從該月份 (或更早):',
@@ -2592,7 +2596,7 @@ $1',
 'linkshere' => '以下頁面連結到[[:$1]]:',
 'nolinkshere' => '沒有頁面連結到[[:$1]]。',
 'nolinkshere-ns' => '在所選的名字空間內沒有頁面連結到[[:$1]]。',
-'isredirect' => '重向頁面',
+'isredirect' => '重新導向頁面',
 'istemplate' => '包含',
 'isimage' => '檔案連結',
 'whatlinkshere-prev' => '前$1個',
@@ -2606,11 +2610,11 @@ $1',
 
 # Block/unblock
 'autoblockid' => '自動查封 #$1',
-'block' => '封禁用戶',
-'unblock' => '解封用戶',
-'blockip' => '封禁用戶',
-'blockip-title' => '封禁用戶',
-'blockip-legend' => '查封用戶',
+'block' => '封禁使用者',
+'unblock' => '解封使用者',
+'blockip' => '封禁使用者',
+'blockip-title' => '封禁使用者',
+'blockip-legend' => '封禁使用者',
 'blockiptext' => '用下面的表單來禁止來自某一特定IP地址的修改許可權。
 只有在為防止破壞,及符合[[{{MediaWiki:Policy-url}}|守則]]的情況下才可採取此行動。
 請在下面輸入一個具體的理由(例如引述一個被破壞的頁面)。',
@@ -2677,7 +2681,7 @@ $1',
 'expiringblock' => '$1 $2 到期',
 'anononlyblock' => '僅限匿名用戶',
 'noautoblockblock' => '禁用自動查封',
-'createaccountblock' => 'ç¦\81æ­¢å\89µå»ºè³¬æ\88',
+'createaccountblock' => 'ç¦\81止建ç«\8b帳è\99\9f',
 'emailblock' => '禁止電子郵件',
 'blocklist-nousertalk' => '禁止編輯自己的用戶討論頁',
 'ipblocklist-empty' => '查封列表為空。',
@@ -3933,6 +3937,7 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'tags-tag' => '標籤名稱',
 'tags-display-header' => '在更改清單中的出現方式',
 'tags-description-header' => '解釋完整描述',
+'tags-active-header' => '存檔?',
 'tags-hitcount-header' => '已加上標籤的更改',
 'tags-edit' => '編輯',
 'tags-hitcount' => '$1次更改',
@@ -4098,9 +4103,9 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'limitreport-ppvisitednodes' => '預處理器訪問節點計數',
 'limitreport-ppgeneratednodes' => '預處理器生成節點計數',
 'limitreport-postexpandincludesize' => '展開後大小',
-'limitreport-postexpandincludesize-value' => '$1/$2位元組',
+'limitreport-postexpandincludesize-value' => '$1/$2 個{{PLURAL:$2|位元組}}',
 'limitreport-templateargumentsize' => '模板參數大小',
-'limitreport-templateargumentsize-value' => '$1/$2位元組',
+'limitreport-templateargumentsize-value' => '$1/$2 個{{PLURAL:$2|位元組}}',
 'limitreport-expansiondepth' => '最高展開深度',
 'limitreport-expensivefunctioncount' => '昂貴分析器函數計數',
 
index 03e6904..aa25ee6 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Creates an account and grant it administrator rights.
+ * Creates an account and grants it rights.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 require_once __DIR__ . '/Maintenance.php';
 
 /**
- * Maintenance script to create an account and grant it administrator rights.
+ * Maintenance script to create an account and grant it rights.
  *
  * @ingroup Maintenance
  */
 class CreateAndPromote extends Maintenance {
 
-       static $permitRoles = array( 'sysop', 'bureaucrat' );
+       static $permitRoles = array( 'sysop', 'bureaucrat', 'bot' );
 
        public function __construct() {
                parent::__construct();
diff --git a/maintenance/purgeChangedFiles.php b/maintenance/purgeChangedFiles.php
new file mode 100644 (file)
index 0000000..9f83ee7
--- /dev/null
@@ -0,0 +1,255 @@
+<?php
+/**
+ * Scan the logging table and purge affected files within a timeframe.
+ *
+ * @section LICENSE
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script that scans the deletion log and purges affected files
+ * within a timeframe.
+ *
+ * @ingroup Maintenance
+ */
+class PurgeChangedFiles extends Maintenance {
+       /**
+        * Mapping from type option to log type and actions.
+        * @var array
+        */
+       private static $typeMappings = array(
+               'created' => array(
+                       'upload' => array( 'upload' ),
+                       'import' => array( 'upload', 'interwiki' ),
+               ),
+               'deleted' => array(
+                       'delete' => array( 'delete', 'revision' ),
+                       'suppress' => array( 'delete', 'revision' ),
+               ),
+               'modified' => array(
+                       'upload' => array( 'overwrite', 'revert' ),
+                       'move' => array( 'move', 'move_redir' ),
+               ),
+       );
+
+       /**
+        * @var string
+        */
+       private $startTimestamp;
+
+       /**
+        * @var string
+        */
+       private $endTimestamp;
+
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Scan the logging table and purge files and thumbnails.";
+               $this->addOption( 'starttime', 'Starting timestamp', true, true );
+               $this->addOption( 'endtime', 'Ending timestamp', true, true );
+               $this->addOption( 'type', 'Comma-separated list of types of changes to send purges for (' .
+                       implode( ',', array_keys( self::$typeMappings ) ) . ',all)', false, true );
+               $this->addOption( 'htcp-dest', 'HTCP announcement destination (IP:port)', false, true );
+               $this->addOption( 'dry-run', 'Do not send purge requests' );
+               $this->addOption( 'verbose', 'Show more output', false, false, 'v' );
+       }
+
+       public function execute() {
+               global $wgHTCPRouting;
+
+               if ( $this->hasOption( 'htcp-dest' ) ) {
+                       $parts = explode( ':', $this->getOption( 'htcp-dest' ) );
+                       if ( count( $parts ) < 2 ) {
+                               // Add default htcp port
+                               $parts[] = '4827';
+                       }
+
+                       // Route all HTCP messages to provided host:port
+                       $wgHTCPRouting = array(
+                               '' => array( 'host' => $parts[0], 'port' => $parts[1] ),
+                       );
+                       $this->verbose( "HTCP broadcasts to {$parts[0]}:{$parts[1]}\n" );
+               }
+
+               // Find out which actions we should be concerned with
+               $typeOpt = $this->getOption( 'type', 'all' );
+               $validTypes = array_keys( self::$typeMappings );
+               if ( $typeOpt === 'all' ) {
+                       // Convert 'all' to all registered types
+                       $typeOpt = implode( ',', $validTypes );
+               }
+               $typeList = explode( ',', $typeOpt );
+               foreach ( $typeList as $type ) {
+                       if ( !in_array( $type, $validTypes ) ) {
+                               $this->error( "\nERROR: Unknown type: {$type}\n" );
+                               $this->maybeHelp( true );
+                       }
+               }
+
+               // Validate the timestamps
+               $dbr = $this->getDB( DB_SLAVE );
+               $this->startTimestamp = $dbr->timestamp( $this->getOption( 'starttime' ) );
+               $this->endTimestamp = $dbr->timestamp( $this->getOption( 'endtime' ) );
+
+               if ( $this->startTimestamp > $this->endTimestamp ) {
+                       $this->error( "\nERROR: starttime after endtime\n" );
+                       $this->maybeHelp( true );
+               }
+
+               // Turn on verbose when dry-run is enabled
+               if ( $this->hasOption( 'dry-run' ) ) {
+                       $this->mOptions['verbose'] = 1;
+               }
+
+               $this->verbose( 'Purging files that were: ' . implode( ', ', $typeList ) . "\n");
+               foreach ( $typeList as $type ) {
+                       $this->verbose( "Checking for {$type} files...\n" );
+                       $this->purgeFromLogType( $type );
+                       if ( !$this->hasOption( 'dry-run' ) ) {
+                               $this->verbose( "...{$type} files purged.\n\n" );
+                       }
+               }
+       }
+
+       /**
+        * Purge cache and thumbnails for changes of the given type.
+        *
+        * @param string $type Type of change to find
+        */
+       protected function purgeFromLogType( $type ) {
+               $repo = RepoGroup::singleton()->getLocalRepo();
+               $dbr = $this->getDB( DB_SLAVE );
+
+               foreach ( self::$typeMappings[$type] as $logType => $logActions ) {
+                       $this->verbose( "Scanning for {$logType}/" . implode( ',', $logActions ) . "\n" );
+
+                       $res = $dbr->select(
+                               'logging',
+                               array( 'log_title', 'log_timestamp', 'log_params' ),
+                               array(
+                                       'log_namespace' => NS_FILE,
+                                       'log_type' => $logType,
+                                       'log_action' => $logActions,
+                                       'log_timestamp >= ' . $dbr->addQuotes( $this->startTimestamp ),
+                                       'log_timestamp <= ' . $dbr->addQuotes( $this->endTimestamp ),
+                               ),
+                               __METHOD__
+                       );
+
+                       foreach ( $res as $row ) {
+                               $file = $repo->newFile( Title::makeTitle( NS_FILE, $row->log_title ) );
+
+                               if ( $this->hasOption( 'dry-run' ) ) {
+                                       $this->verbose( "{$type}[{$row->log_timestamp}]: {$row->log_title}\n" );
+                                       continue;
+                               }
+
+                               // Purge current version and any versions in oldimage table
+                               $file->purgeCache();
+                               $file->purgeHistory();
+
+                               if ( $logType === 'delete' ) {
+                                       // If there is an orphaned storage file... delete it
+                                       if ( !$file->exists() && $repo->fileExists( $file->getPath() ) ) {
+                                               $dpath = $this->getDeletedPath( $repo, $file );
+                                               if ( $repo->fileExists( $dpath ) ) {
+                                                       // Sanity check to avoid data loss
+                                                       $repo->getBackend()->delete( array( 'src' => $file->getPath() ) );
+                                                       $this->verbose( "Deleted orphan file: {$file->getPath()}.\n" );
+
+                                               } else {
+                                                       $this->error( "File was not deleted: {$file->getPath()}.\n" );
+                                               }
+                                       }
+
+                                       // Purge items from fileachive table (rows are likely here)
+                                       $this->purgeFromArchiveTable( $repo, $file );
+
+                               } else if ( $logType === 'move' ) {
+                                       // Purge the target file as well
+
+                                       $params = unserialize( $row->log_params );
+                                       if ( isset( $params['4::target'] ) ) {
+                                               $target = $params['4::target'];
+                                               $targetFile = $repo->newFile( Title::makeTitle( NS_FILE, $target ) );
+                                               $targetFile->purgeCache();
+                                               $targetFile->purgeHistory();
+                                               $this->verbose( "Purged file {$target}; move target @{$row->log_timestamp}.\n" );
+                                       }
+                               }
+
+                               $this->verbose( "Purged file {$row->log_title}; {$type} @{$row->log_timestamp}.\n" );
+                       }
+               }
+       }
+
+       protected function purgeFromArchiveTable( LocalRepo $repo, LocalFile $file ) {
+               $dbr = $repo->getSlaveDB();
+               $res = $dbr->select(
+                       'filearchive',
+                       array( 'fa_archive_name' ),
+                       array( 'fa_name' => $file->getName() ),
+                       __METHOD__
+               );
+
+               foreach ( $res as $row ) {
+                       if ( $row->fa_archive_name === null ) {
+                               // Was not an old version (current version names checked already)
+                               continue;
+                       }
+                       $ofile = $repo->newFromArchiveName( $file->getTitle(), $row->fa_archive_name );
+                       // If there is an orphaned storage file still there...delete it
+                       if ( !$file->exists() && $repo->fileExists( $ofile->getPath() ) ) {
+                               $dpath = $this->getDeletedPath( $repo, $ofile );
+                               if ( $repo->fileExists( $dpath ) ) {
+                                       // Sanity check to avoid data loss
+                                       $repo->getBackend()->delete( array( 'src' => $ofile->getPath() ) );
+                                       $this->output( "Deleted orphan file: {$ofile->getPath()}.\n" );
+
+                               } else {
+                                       $this->error( "File was not deleted: {$ofile->getPath()}.\n" );
+                               }
+                       }
+                       $file->purgeOldThumbnails( $row->fa_archive_name );
+               }
+       }
+
+       protected function getDeletedPath( LocalRepo $repo, LocalFile $file ) {
+               $hash = $repo->getFileSha1( $file->getPath() );
+               $key = "{$hash}.{$file->getExtension()}";
+               return $repo->getDeletedHashPath( $key ) . $key;
+       }
+
+       /**
+        * Send an output message iff the 'verbose' option has been provided.
+        *
+        * @param string $msg Message to output
+        */
+       protected function verbose( $msg ) {
+               if ( $this->hasOption( 'verbose' ) ) {
+                       $this->output( $msg );
+               }
+       }
+
+}
+
+$maintClass = "PurgeChangedFiles";
+require_once RUN_MAINTENANCE_IF_MAIN;
index e1c6ab6..071ac09 100644 (file)
@@ -41,6 +41,7 @@ class PurgeChangedPages extends Maintenance {
                $this->addOption( 'starttime', 'Starting timestamp', true, true );
                $this->addOption( 'endtime', 'Ending timestamp', true, true );
                $this->addOption( 'htcp-dest', 'HTCP announcement destination (IP:port)', false, true );
+               $this->addOption( 'sleep-per-batch', 'Milliseconds to sleep between batches', false, true );
                $this->addOption( 'dry-run', 'Do not send purge requests' );
                $this->addOption( 'verbose', 'Show more output', false, false, 'v' );
                $this->setBatchSize( 100 );
@@ -135,8 +136,13 @@ class PurgeChangedPages extends Maintenance {
                        }
 
                        // Send batch of purge requests out to squids
-                       $squid = new SquidUpdate( $urls );
+                       $squid = new SquidUpdate( $urls, count( $urls ) );
                        $squid->doUpdate();
+
+                       if ( $this->hasOption( 'sleep-per-batch' ) ) {
+                               // sleep-per-batch is milliseconds, usleep wants micro seconds.
+                               usleep( 1000 * (int)$this->getOption( 'sleep-per-batch' ) );
+                       }
                }
 
                $this->output( "Done!\n" );
diff --git a/maintenance/purgeDeletedFiles.php b/maintenance/purgeDeletedFiles.php
deleted file mode 100644 (file)
index 9f2af33..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-<?php
-/**
- * Scan the deletion log and purges affected files within a timeframe.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-
-require_once __DIR__ . '/Maintenance.php';
-
-/**
- * Maintenance script that scans the deletion log and purges affected files
- * within a timeframe.
- *
- * @ingroup Maintenance
- */
-class PurgeDeletedFiles extends Maintenance {
-       public function __construct() {
-               parent::__construct();
-               $this->mDescription = "Scan the logging table and purge files that where deleted.";
-               $this->addOption( 'starttime', 'Starting timestamp', false, true );
-               $this->addOption( 'endtime', 'Ending timestamp', false, true );
-       }
-
-       public function execute() {
-               $this->output( "Purging cache and thumbnails for deleted files...\n" );
-               $this->purgeFromLogType( 'delete' );
-               $this->output( "...deleted files purged.\n\n" );
-
-               $this->output( "Purging cache and thumbnails for suppressed files...\n" );
-               $this->purgeFromLogType( 'suppress' );
-               $this->output( "...suppressed files purged.\n" );
-       }
-
-       protected function purgeFromLogType( $logType ) {
-               $repo = RepoGroup::singleton()->getLocalRepo();
-               $db = $repo->getSlaveDB();
-
-               $conds = array(
-                       'log_namespace' => NS_FILE,
-                       'log_type' => $logType,
-                       'log_action' => array( 'delete', 'revision' )
-               );
-               $start = $this->getOption( 'starttime' );
-               if ( $start ) {
-                       $conds[] = 'log_timestamp >= ' . $db->addQuotes( $db->timestamp( $start ) );
-               }
-               $end = $this->getOption( 'endtime' );
-               if ( $end ) {
-                       $conds[] = 'log_timestamp <= ' . $db->addQuotes( $db->timestamp( $end ) );
-               }
-
-               $res = $db->select( 'logging', array( 'log_title', 'log_timestamp' ), $conds, __METHOD__ );
-               foreach ( $res as $row ) {
-                       $file = $repo->newFile( Title::makeTitle( NS_FILE, $row->log_title ) );
-                       // If there is an orphaned storage file still there...delete it
-                       if ( !$file->exists() && $repo->fileExists( $file->getPath() ) ) {
-                               $dpath = $this->getDeletedPath( $repo, $file );
-                               if ( $repo->fileExists( $dpath ) ) { // sanity check to avoid data loss
-                                       $repo->getBackend()->delete( array( 'src' => $file->getPath() ) );
-                                       $this->output( "Deleted orphan file: {$file->getPath()}.\n" );
-                               } else {
-                                       $this->error( "File was not deleted: {$file->getPath()}.\n" );
-                               }
-                       }
-                       // Purge current version and any versions in oldimage table
-                       $file->purgeCache();
-                       $file->purgeHistory();
-                       // Purge items from fileachive table (rows are likely here)
-                       $this->purgeFromArchiveTable( $repo, $file );
-
-                       $this->output( "Purged file {$row->log_title}; deleted on {$row->log_timestamp}.\n" );
-               }
-       }
-
-       protected function purgeFromArchiveTable( LocalRepo $repo, LocalFile $file ) {
-               $db = $repo->getSlaveDB();
-               $res = $db->select( 'filearchive',
-                       array( 'fa_archive_name' ),
-                       array( 'fa_name' => $file->getName() ),
-                       __METHOD__
-               );
-               foreach ( $res as $row ) {
-                       if ( $row->fa_archive_name === null ) {
-                               continue; // was not an old version (current version names checked already)
-                       }
-                       $ofile = $repo->newFromArchiveName( $file->getTitle(), $row->fa_archive_name );
-                       // If there is an orphaned storage file still there...delete it
-                       if ( !$file->exists() && $repo->fileExists( $ofile->getPath() ) ) {
-                               $dpath = $this->getDeletedPath( $repo, $ofile );
-                               if ( $repo->fileExists( $dpath ) ) { // sanity check to avoid data loss
-                                       $repo->getBackend()->delete( array( 'src' => $ofile->getPath() ) );
-                                       $this->output( "Deleted orphan file: {$ofile->getPath()}.\n" );
-                               } else {
-                                       $this->error( "File was not deleted: {$ofile->getPath()}.\n" );
-                               }
-                       }
-                       $file->purgeOldThumbnails( $row->fa_archive_name );
-               }
-       }
-
-       protected function getDeletedPath( LocalRepo $repo, LocalFile $file ) {
-               $hash = $repo->getFileSha1( $file->getPath() );
-               $key = "{$hash}.{$file->getExtension()}";
-               return $repo->getDeletedHashPath( $key ) . $key;
-       }
-}
-
-$maintClass = "PurgeDeletedFiles";
-require_once RUN_MAINTENANCE_IF_MAIN;
index ff933f6..c033647 100644 (file)
@@ -166,6 +166,7 @@ return array(
        ),
        'jquery.byteLength' => array(
                'scripts' => 'resources/jquery/jquery.byteLength.js',
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.byteLimit' => array(
                'scripts' => 'resources/jquery/jquery.byteLimit.js',
@@ -655,6 +656,7 @@ return array(
        'mediawiki.inspect' => array(
                'scripts' => 'resources/mediawiki/mediawiki.inspect.js',
                'dependencies' => 'jquery.byteLength',
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.feedback' => array(
                'scripts' => 'resources/mediawiki/mediawiki.feedback.js',
index ddf63a8..147a869 100644 (file)
                                                        $innerDiv: $innerDiv,
                                                        $imageDiv: $imageDiv,
                                                        $outerDiv: $outerDiv,
-                                                       resolved: false  /* Did the hook take action */
+                                                       // Whether the hook took action
+                                                       resolved: false
                                                };
-                                               // Allow other media handlers to hook in.
-                                               // If your hook resizes an image, it is expected it will
-                                               // set resolved to true. Additionally you should load
-                                               // your module in position top to ensure it is registered
-                                               // before this runs (FIXME: there must be a better way?)
-                                               // See TimedMediaHandler for an example.
+
+                                               /**
+                                                * Gallery resize.
+                                                *
+                                                * If your handler resizes an image, it should also set the resolved
+                                                * property to true. Additionally, because this module only exposes this
+                                                * logic temporarily, you should load your module in position top to
+                                                * ensure it is registered before this runs (FIXME: Don't use mw.hook)
+                                                *
+                                                * See TimedMediaHandler for an example.
+                                                *
+                                                * @event mediawiki_page_gallery_resize
+                                                * @member mw.hook
+                                                * @param {Object} hookInfo
+                                                */
                                                mw.hook( 'mediawiki.page.gallery.resize' ).fire( hookInfo );
 
                                                if ( !hookInfo.resolved ) {
index c4766ff..5cecc16 100644 (file)
                }
        };
 
+       if ( mw.config.get( 'debug' ) ) {
+               inspect.getModuleSize = function () { return null; };
+               mw.log( 'mw.inspect: Module sizes are not available in debug mode.' );
+       }
+
        mw.inspect = inspect;
 
 }( mediaWiki, jQuery ) );
index 6fa8b3c..b6a27d2 100644 (file)
@@ -39,7 +39,9 @@ function isCompatible( ua ) {
                // Any NetFront based browser
                ua.match( /NetFront/ ) ||
                // Opera Mini, all versions
-               ua.match( /Opera Mini/ )
+               ua.match( /Opera Mini/ ) ||
+               // Nokia's Ovi Browser
+               ua.match( /S40OviBrowser/ )
        );
 }
 
index f919bda..bfcc35c 100644 (file)
@@ -1,16 +1,15 @@
 /*
  * Any rules which should not be flipped automatically in right-to-left situations should be
- * prepended with @noflip in a comment block. Images that should be embedded as base64 data-URLs
- * should be prepended with @embed in a comment block.
+ * prepended with @noflip in a comment block.
  *
- * This style-sheet employs a few CSS trick to accomplish compatibility with a wide range of web
+ * This stylesheet employs a few CSS trick to accomplish compatibility with a wide range of web
  * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
  * a rule that makes things work in IE6, and then following it with a rule that begins with
  * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
  * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
  * "IGNORED BY IE6" comments.
  */
-@import "mediawiki.mixins.less";
+@import "mediawiki.mixins";
 
 /* Framework */
 html {
@@ -780,21 +779,26 @@ body.vector-animateLayout {
        div#content,
        div#footer,
        #left-navigation {
-               .transition( margin-left 250ms, padding 250ms; );
+               .transition(margin-left 250ms, padding 250ms;);
        }
+
        #p-logo {
-               .transition( left 250ms );
+               .transition(left 250ms);
        }
+
        #mw-panel {
-               .transition( padding-right 250ms );
+               .transition(padding-right 250ms);
        }
+
        #p-search {
-               .transition( margin-right 250ms );
+               .transition(margin-right 250ms);
        }
+
        #p-personal {
-               .transition( right 250ms );
+               .transition(right 250ms);
        }
+
        #mw-head-base {
-               .transition( margin-left 250ms );
+               .transition(margin-left 250ms);
        }
 }
index 57825c5..76f32f7 100644 (file)
                        'Opera/9.80 (J2ME/MIDP; Opera Mini/3.1.10423/22.387; U; en) Presto/2.5.25 Version/10.54',
                        'Opera/9.50 (J2ME/MIDP; Opera Mini/4.0.10031/298; U; en)',
                        'Opera/9.80 (J2ME/MIDP; Opera Mini/6.24093/26.1305; U; en) Presto/2.8.119 Version/10.54',
-                       'Opera/9.80 (Android; Opera Mini/7.29530/27.1407; U; en) Presto/2.8.119 Version/11.10'
+                       'Opera/9.80 (Android; Opera Mini/7.29530/27.1407; U; en) Presto/2.8.119 Version/11.10',
+                       // Ovi Browser
+                       'Mozilla/5.0 (Series40; NokiaX3-02/05.60; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/3.2.0.0.6',
+                       'Mozilla/5.0 (Series40; Nokia305/05.92; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/3.7.0.0.11'
                ],
                // No explicit support for or against these browsers, they're
                // given a shot at Grade A at their own risk.